diff --git a/Assets/Art/Level/1/image/2606.png b/Assets/Art/Level/1/image/2606.png index 0911b842..526a8373 100644 Binary files a/Assets/Art/Level/1/image/2606.png and b/Assets/Art/Level/1/image/2606.png differ diff --git a/Assets/Art/Level/1/image/2616.png b/Assets/Art/Level/1/image/2616.png index b53d8952..45d85761 100644 Binary files a/Assets/Art/Level/1/image/2616.png and b/Assets/Art/Level/1/image/2616.png differ diff --git a/Assets/Art/Level/1/image/2619.png b/Assets/Art/Level/1/image/2619.png index d46b118c..2b95fb4c 100644 Binary files a/Assets/Art/Level/1/image/2619.png and b/Assets/Art/Level/1/image/2619.png differ diff --git a/Assets/Art/Level/1/image/2622.png b/Assets/Art/Level/1/image/2622.png index bf0a5504..cfb5e70f 100644 Binary files a/Assets/Art/Level/1/image/2622.png and b/Assets/Art/Level/1/image/2622.png differ diff --git a/Assets/Art/Level/1/image/2626.png b/Assets/Art/Level/1/image/2626.png index a9654a76..3e695b2a 100644 Binary files a/Assets/Art/Level/1/image/2626.png and b/Assets/Art/Level/1/image/2626.png differ diff --git a/Assets/Art/Level/1/image/2629.png b/Assets/Art/Level/1/image/2629.png index 0ee5da21..19065919 100644 Binary files a/Assets/Art/Level/1/image/2629.png and b/Assets/Art/Level/1/image/2629.png differ diff --git a/Assets/Art/Level/1/image/2634.png b/Assets/Art/Level/1/image/2634.png index dca22f80..6e3cde3f 100644 Binary files a/Assets/Art/Level/1/image/2634.png and b/Assets/Art/Level/1/image/2634.png differ diff --git a/Assets/Art/Level/1/image/2636.png b/Assets/Art/Level/1/image/2636.png index ba0dc322..9c81f4a5 100644 Binary files a/Assets/Art/Level/1/image/2636.png and b/Assets/Art/Level/1/image/2636.png differ diff --git a/Assets/Art/Level/1/image/2644.png b/Assets/Art/Level/1/image/2644.png index 862a90b4..bad32f9d 100644 Binary files a/Assets/Art/Level/1/image/2644.png and b/Assets/Art/Level/1/image/2644.png differ diff --git a/Assets/Art/Level/1/image/2647.png b/Assets/Art/Level/1/image/2647.png index 21b8f358..05eb5e69 100644 Binary files a/Assets/Art/Level/1/image/2647.png and b/Assets/Art/Level/1/image/2647.png differ diff --git a/Assets/Art/Level/1/image/2650.png b/Assets/Art/Level/1/image/2650.png index ea75b9c0..a0be937e 100644 Binary files a/Assets/Art/Level/1/image/2650.png and b/Assets/Art/Level/1/image/2650.png differ diff --git a/Assets/Art/Level/1/image/2657.png b/Assets/Art/Level/1/image/2657.png index 3dc1552f..96c8c0a4 100644 Binary files a/Assets/Art/Level/1/image/2657.png and b/Assets/Art/Level/1/image/2657.png differ diff --git a/Assets/Art/Level/1/image/2660.png b/Assets/Art/Level/1/image/2660.png index a5b0ba75..abc63d3f 100644 Binary files a/Assets/Art/Level/1/image/2660.png and b/Assets/Art/Level/1/image/2660.png differ diff --git a/Assets/Art/Level/1/image/2664.png b/Assets/Art/Level/1/image/2664.png index 1f9b1250..d0d6fbca 100644 Binary files a/Assets/Art/Level/1/image/2664.png and b/Assets/Art/Level/1/image/2664.png differ diff --git a/Assets/Art/Level/1/image/2667.png b/Assets/Art/Level/1/image/2667.png index 4f2252a2..89246d4f 100644 Binary files a/Assets/Art/Level/1/image/2667.png and b/Assets/Art/Level/1/image/2667.png differ diff --git a/Assets/Art/Level/1/image/2671_IMG_ITEM_JIRIRIRI.png b/Assets/Art/Level/1/image/2671_IMG_ITEM_JIRIRIRI.png index 271bdb01..4c42b08a 100644 Binary files a/Assets/Art/Level/1/image/2671_IMG_ITEM_JIRIRIRI.png and b/Assets/Art/Level/1/image/2671_IMG_ITEM_JIRIRIRI.png differ diff --git a/Assets/Art/Level/1/image/2674_IMG_ITEM_KACHILTU.png b/Assets/Art/Level/1/image/2674_IMG_ITEM_KACHILTU.png index 27391aae..359289e8 100644 Binary files a/Assets/Art/Level/1/image/2674_IMG_ITEM_KACHILTU.png and b/Assets/Art/Level/1/image/2674_IMG_ITEM_KACHILTU.png differ diff --git a/Assets/Art/Level/1/image/2677_IMG_ITEM_FASALTU.png b/Assets/Art/Level/1/image/2677_IMG_ITEM_FASALTU.png index 927fbf6d..a9055f4b 100644 Binary files a/Assets/Art/Level/1/image/2677_IMG_ITEM_FASALTU.png and b/Assets/Art/Level/1/image/2677_IMG_ITEM_FASALTU.png differ diff --git a/Assets/Art/Level/1/zzz.mat b/Assets/Art/Level/1/zzz.mat index 30d95bea..92537cd6 100644 --- a/Assets/Art/Level/1/zzz.mat +++ b/Assets/Art/Level/1/zzz.mat @@ -2,14 +2,16 @@ %TAG !u! tag:unity3d.com,2011: --- !u!21 &2100000 Material: - serializedVersion: 6 + serializedVersion: 8 m_ObjectHideFlags: 0 m_CorrespondingSourceObject: {fileID: 0} m_PrefabInstance: {fileID: 0} m_PrefabAsset: {fileID: 0} m_Name: zzz m_Shader: {fileID: 211, guid: 0000000000000000f000000000000000, type: 0} - m_ShaderKeywords: _ALPHABLEND_ON + m_ValidKeywords: + - _ALPHABLEND_ON + m_InvalidKeywords: [] m_LightmapFlags: 0 m_EnableInstancingVariants: 0 m_DoubleSidedGI: 0 @@ -17,7 +19,7 @@ Material: stringTagMap: RenderType: Transparent disabledShaderPasses: - - ALWAYS + - GRABPASS m_SavedProperties: serializedVersion: 3 m_TexEnvs: @@ -57,6 +59,7 @@ Material: m_Texture: {fileID: 0} m_Scale: {x: 1, y: 1} m_Offset: {x: 0, y: 0} + m_Ints: [] m_Floats: - _BlendOp: 0 - _BumpScale: 1 @@ -96,3 +99,4 @@ Material: - _ColorAddSubDiff: {r: 0, g: 0, b: 0, a: 0} - _EmissionColor: {r: 0, g: 0, b: 0, a: 1} - _SoftParticleFadeParams: {r: 0, g: 0, b: 0, a: 0} + m_BuildTextureStacks: [] diff --git a/Assets/Art/Level/10/image/859.png b/Assets/Art/Level/10/image/859.png index d06fc21b..037ae53c 100644 Binary files a/Assets/Art/Level/10/image/859.png and b/Assets/Art/Level/10/image/859.png differ diff --git a/Assets/Art/Level/10/image/861.png b/Assets/Art/Level/10/image/861.png index 2d8f825e..29232469 100644 Binary files a/Assets/Art/Level/10/image/861.png and b/Assets/Art/Level/10/image/861.png differ diff --git a/Assets/Art/Level/10/image/863.png b/Assets/Art/Level/10/image/863.png index 9c41fa5a..448227e5 100644 Binary files a/Assets/Art/Level/10/image/863.png and b/Assets/Art/Level/10/image/863.png differ diff --git a/Assets/Art/Level/10/image/865.png b/Assets/Art/Level/10/image/865.png index d80ff858..6d574735 100644 Binary files a/Assets/Art/Level/10/image/865.png and b/Assets/Art/Level/10/image/865.png differ diff --git a/Assets/Art/Level/10/image/868.png b/Assets/Art/Level/10/image/868.png index 08bcf2d1..d4316cda 100644 Binary files a/Assets/Art/Level/10/image/868.png and b/Assets/Art/Level/10/image/868.png differ diff --git a/Assets/Art/Level/10/image/870.png b/Assets/Art/Level/10/image/870.png index d353219d..80b2870c 100644 Binary files a/Assets/Art/Level/10/image/870.png and b/Assets/Art/Level/10/image/870.png differ diff --git a/Assets/Art/Level/10/image/873.png b/Assets/Art/Level/10/image/873.png index d8dd8a91..5ae92eb4 100644 Binary files a/Assets/Art/Level/10/image/873.png and b/Assets/Art/Level/10/image/873.png differ diff --git a/Assets/Art/Level/10/image/876.png b/Assets/Art/Level/10/image/876.png index 88d24a6d..60fa31af 100644 Binary files a/Assets/Art/Level/10/image/876.png and b/Assets/Art/Level/10/image/876.png differ diff --git a/Assets/Art/Level/10/image/879.png b/Assets/Art/Level/10/image/879.png index b3cbf8b8..5c06af8f 100644 Binary files a/Assets/Art/Level/10/image/879.png and b/Assets/Art/Level/10/image/879.png differ diff --git a/Assets/Art/Level/10/image/882.png b/Assets/Art/Level/10/image/882.png index 50fc70ac..694d0e27 100644 Binary files a/Assets/Art/Level/10/image/882.png and b/Assets/Art/Level/10/image/882.png differ diff --git a/Assets/Art/Level/10/image/884.png b/Assets/Art/Level/10/image/884.png index a26c0820..150cd974 100644 Binary files a/Assets/Art/Level/10/image/884.png and b/Assets/Art/Level/10/image/884.png differ diff --git a/Assets/Art/Level/10/image/887.png b/Assets/Art/Level/10/image/887.png index 61c7c6cd..bb91e519 100644 Binary files a/Assets/Art/Level/10/image/887.png and b/Assets/Art/Level/10/image/887.png differ diff --git a/Assets/Art/Level/10/image/890.png b/Assets/Art/Level/10/image/890.png index 3f916ecf..036b98cc 100644 Binary files a/Assets/Art/Level/10/image/890.png and b/Assets/Art/Level/10/image/890.png differ diff --git a/Assets/Art/Level/10/image/893.png b/Assets/Art/Level/10/image/893.png index 4356b765..db85e608 100644 Binary files a/Assets/Art/Level/10/image/893.png and b/Assets/Art/Level/10/image/893.png differ diff --git a/Assets/Art/Level/10/image/896.png b/Assets/Art/Level/10/image/896.png index e06d65ee..6774caeb 100644 Binary files a/Assets/Art/Level/10/image/896.png and b/Assets/Art/Level/10/image/896.png differ diff --git a/Assets/Art/Level/10/image/899.png b/Assets/Art/Level/10/image/899.png index 8702d481..367ec432 100644 Binary files a/Assets/Art/Level/10/image/899.png and b/Assets/Art/Level/10/image/899.png differ diff --git a/Assets/Art/Level/10/image/901.png b/Assets/Art/Level/10/image/901.png index cab28883..c5ab5327 100644 Binary files a/Assets/Art/Level/10/image/901.png and b/Assets/Art/Level/10/image/901.png differ diff --git a/Assets/Art/Level/10/image/907.png b/Assets/Art/Level/10/image/907.png index fe81fbfe..effb37d8 100644 Binary files a/Assets/Art/Level/10/image/907.png and b/Assets/Art/Level/10/image/907.png differ diff --git a/Assets/Art/Level/10/image/912.png b/Assets/Art/Level/10/image/912.png index d1551bc6..1be1736a 100644 Binary files a/Assets/Art/Level/10/image/912.png and b/Assets/Art/Level/10/image/912.png differ diff --git a/Assets/Art/Level/10/image/916.png b/Assets/Art/Level/10/image/916.png index 5b8f80fa..418ab5e7 100644 Binary files a/Assets/Art/Level/10/image/916.png and b/Assets/Art/Level/10/image/916.png differ diff --git a/Assets/Art/Level/10/image/918.png b/Assets/Art/Level/10/image/918.png index e4bda35c..dc9b73d0 100644 Binary files a/Assets/Art/Level/10/image/918.png and b/Assets/Art/Level/10/image/918.png differ diff --git a/Assets/Art/Level/10/image/920.png b/Assets/Art/Level/10/image/920.png index 1ff28e96..685f4fb2 100644 Binary files a/Assets/Art/Level/10/image/920.png and b/Assets/Art/Level/10/image/920.png differ diff --git a/Assets/Art/Level/10/image/923.png b/Assets/Art/Level/10/image/923.png index 770675a8..73d63e0c 100644 Binary files a/Assets/Art/Level/10/image/923.png and b/Assets/Art/Level/10/image/923.png differ diff --git a/Assets/Art/Level/10/image/925.png b/Assets/Art/Level/10/image/925.png index dec76a16..154b3089 100644 Binary files a/Assets/Art/Level/10/image/925.png and b/Assets/Art/Level/10/image/925.png differ diff --git a/Assets/Art/Level/10/image/928.png b/Assets/Art/Level/10/image/928.png index ca0b3531..94993bad 100644 Binary files a/Assets/Art/Level/10/image/928.png and b/Assets/Art/Level/10/image/928.png differ diff --git a/Assets/Art/Level/10/image/930.png b/Assets/Art/Level/10/image/930.png index 276a563a..d40d35a7 100644 Binary files a/Assets/Art/Level/10/image/930.png and b/Assets/Art/Level/10/image/930.png differ diff --git a/Assets/Art/Level/10/image/932.png b/Assets/Art/Level/10/image/932.png index 44c0343b..e757747a 100644 Binary files a/Assets/Art/Level/10/image/932.png and b/Assets/Art/Level/10/image/932.png differ diff --git a/Assets/Art/Level/10/image/934.png b/Assets/Art/Level/10/image/934.png index 6bcda609..884cd434 100644 Binary files a/Assets/Art/Level/10/image/934.png and b/Assets/Art/Level/10/image/934.png differ diff --git a/Assets/Art/Level/10/image/937_IMG_ITEM_CHARI_NN.png b/Assets/Art/Level/10/image/937_IMG_ITEM_CHARI_NN.png index bf0c112e..55b429c0 100644 Binary files a/Assets/Art/Level/10/image/937_IMG_ITEM_CHARI_NN.png and b/Assets/Art/Level/10/image/937_IMG_ITEM_CHARI_NN.png differ diff --git a/Assets/Art/Level/10/image/940_IMG_ITEM_MOGUMOGU.png b/Assets/Art/Level/10/image/940_IMG_ITEM_MOGUMOGU.png index c8590f2f..84abee41 100644 Binary files a/Assets/Art/Level/10/image/940_IMG_ITEM_MOGUMOGU.png and b/Assets/Art/Level/10/image/940_IMG_ITEM_MOGUMOGU.png differ diff --git a/Assets/Art/Level/10/image/943_IMG_ITEM_PILTU.png b/Assets/Art/Level/10/image/943_IMG_ITEM_PILTU.png index 7a60d16f..06eeae91 100644 Binary files a/Assets/Art/Level/10/image/943_IMG_ITEM_PILTU.png and b/Assets/Art/Level/10/image/943_IMG_ITEM_PILTU.png differ diff --git a/Assets/Art/Level/11/image/1924.png b/Assets/Art/Level/11/image/1924.png index 918a85b6..a7327326 100644 Binary files a/Assets/Art/Level/11/image/1924.png and b/Assets/Art/Level/11/image/1924.png differ diff --git a/Assets/Art/Level/11/image/1928.png b/Assets/Art/Level/11/image/1928.png index 8807a156..04493212 100644 Binary files a/Assets/Art/Level/11/image/1928.png and b/Assets/Art/Level/11/image/1928.png differ diff --git a/Assets/Art/Level/11/image/1932.png b/Assets/Art/Level/11/image/1932.png index 0ed72241..a47013ea 100644 Binary files a/Assets/Art/Level/11/image/1932.png and b/Assets/Art/Level/11/image/1932.png differ diff --git a/Assets/Art/Level/11/image/1934.png b/Assets/Art/Level/11/image/1934.png index abe2d06f..49a374bb 100644 Binary files a/Assets/Art/Level/11/image/1934.png and b/Assets/Art/Level/11/image/1934.png differ diff --git a/Assets/Art/Level/11/image/1937.png b/Assets/Art/Level/11/image/1937.png index 350aad9d..3457e91f 100644 Binary files a/Assets/Art/Level/11/image/1937.png and b/Assets/Art/Level/11/image/1937.png differ diff --git a/Assets/Art/Level/11/image/1939.png b/Assets/Art/Level/11/image/1939.png index 7b9751a4..0c323deb 100644 Binary files a/Assets/Art/Level/11/image/1939.png and b/Assets/Art/Level/11/image/1939.png differ diff --git a/Assets/Art/Level/11/image/1941.png b/Assets/Art/Level/11/image/1941.png index 3dd6542d..05f7e062 100644 Binary files a/Assets/Art/Level/11/image/1941.png and b/Assets/Art/Level/11/image/1941.png differ diff --git a/Assets/Art/Level/11/image/1945.png b/Assets/Art/Level/11/image/1945.png index 10fda68b..d105de31 100644 Binary files a/Assets/Art/Level/11/image/1945.png and b/Assets/Art/Level/11/image/1945.png differ diff --git a/Assets/Art/Level/11/image/1948.png b/Assets/Art/Level/11/image/1948.png index 0fedb980..ab7a856a 100644 Binary files a/Assets/Art/Level/11/image/1948.png and b/Assets/Art/Level/11/image/1948.png differ diff --git a/Assets/Art/Level/11/image/1950.png b/Assets/Art/Level/11/image/1950.png index ea9e12d7..77c4b50a 100644 Binary files a/Assets/Art/Level/11/image/1950.png and b/Assets/Art/Level/11/image/1950.png differ diff --git a/Assets/Art/Level/11/image/1953.png b/Assets/Art/Level/11/image/1953.png index f55358d5..98e30791 100644 Binary files a/Assets/Art/Level/11/image/1953.png and b/Assets/Art/Level/11/image/1953.png differ diff --git a/Assets/Art/Level/11/image/1955.png b/Assets/Art/Level/11/image/1955.png index ec9bf9d1..79eebaaf 100644 Binary files a/Assets/Art/Level/11/image/1955.png and b/Assets/Art/Level/11/image/1955.png differ diff --git a/Assets/Art/Level/11/image/1960.png b/Assets/Art/Level/11/image/1960.png index 940d5adc..41995703 100644 Binary files a/Assets/Art/Level/11/image/1960.png and b/Assets/Art/Level/11/image/1960.png differ diff --git a/Assets/Art/Level/11/image/1962.png b/Assets/Art/Level/11/image/1962.png index d0898cba..59c5de8a 100644 Binary files a/Assets/Art/Level/11/image/1962.png and b/Assets/Art/Level/11/image/1962.png differ diff --git a/Assets/Art/Level/11/image/1968.png b/Assets/Art/Level/11/image/1968.png index d8efe152..b3c66414 100644 Binary files a/Assets/Art/Level/11/image/1968.png and b/Assets/Art/Level/11/image/1968.png differ diff --git a/Assets/Art/Level/11/image/1971.png b/Assets/Art/Level/11/image/1971.png index b8ef7592..9854f886 100644 Binary files a/Assets/Art/Level/11/image/1971.png and b/Assets/Art/Level/11/image/1971.png differ diff --git a/Assets/Art/Level/11/image/1975_IMG_ITEM_BASHILTU.png b/Assets/Art/Level/11/image/1975_IMG_ITEM_BASHILTU.png index 8b0f0442..77d7d47f 100644 Binary files a/Assets/Art/Level/11/image/1975_IMG_ITEM_BASHILTU.png and b/Assets/Art/Level/11/image/1975_IMG_ITEM_BASHILTU.png differ diff --git a/Assets/Art/Level/11/image/1978_IMG_ITEM_PU_NN.png b/Assets/Art/Level/11/image/1978_IMG_ITEM_PU_NN.png index 2953fa4f..8ab97b62 100644 Binary files a/Assets/Art/Level/11/image/1978_IMG_ITEM_PU_NN.png and b/Assets/Art/Level/11/image/1978_IMG_ITEM_PU_NN.png differ diff --git a/Assets/Art/Level/11/image/1981_IMG_ITEM_CHU_.png b/Assets/Art/Level/11/image/1981_IMG_ITEM_CHU_.png index f0f762c7..13b11ca4 100644 Binary files a/Assets/Art/Level/11/image/1981_IMG_ITEM_CHU_.png and b/Assets/Art/Level/11/image/1981_IMG_ITEM_CHU_.png differ diff --git a/Assets/Art/Level/12/image/1749.png b/Assets/Art/Level/12/image/1749.png index 55afb8f5..e5252475 100644 Binary files a/Assets/Art/Level/12/image/1749.png and b/Assets/Art/Level/12/image/1749.png differ diff --git a/Assets/Art/Level/12/image/1750.png b/Assets/Art/Level/12/image/1750.png index 2d86824b..7350e943 100644 Binary files a/Assets/Art/Level/12/image/1750.png and b/Assets/Art/Level/12/image/1750.png differ diff --git a/Assets/Art/Level/12/image/1752.png b/Assets/Art/Level/12/image/1752.png index e3e5f3b6..c6a93282 100644 Binary files a/Assets/Art/Level/12/image/1752.png and b/Assets/Art/Level/12/image/1752.png differ diff --git a/Assets/Art/Level/12/image/1756.png b/Assets/Art/Level/12/image/1756.png index dd309cf7..3b339c76 100644 Binary files a/Assets/Art/Level/12/image/1756.png and b/Assets/Art/Level/12/image/1756.png differ diff --git a/Assets/Art/Level/12/image/1760.png b/Assets/Art/Level/12/image/1760.png index c2f3ba79..5f352ee8 100644 Binary files a/Assets/Art/Level/12/image/1760.png and b/Assets/Art/Level/12/image/1760.png differ diff --git a/Assets/Art/Level/12/image/1763.png b/Assets/Art/Level/12/image/1763.png index ce162cb2..d11e747b 100644 Binary files a/Assets/Art/Level/12/image/1763.png and b/Assets/Art/Level/12/image/1763.png differ diff --git a/Assets/Art/Level/12/image/1769.png b/Assets/Art/Level/12/image/1769.png index 6ed6d7cd..3d30aa04 100644 Binary files a/Assets/Art/Level/12/image/1769.png and b/Assets/Art/Level/12/image/1769.png differ diff --git a/Assets/Art/Level/12/image/1770.png b/Assets/Art/Level/12/image/1770.png index 9efa1564..e4a4a54f 100644 Binary files a/Assets/Art/Level/12/image/1770.png and b/Assets/Art/Level/12/image/1770.png differ diff --git a/Assets/Art/Level/12/image/1776_IMG_ITEM_PAKALTU.png b/Assets/Art/Level/12/image/1776_IMG_ITEM_PAKALTU.png index d2600723..adba90a0 100644 Binary files a/Assets/Art/Level/12/image/1776_IMG_ITEM_PAKALTU.png and b/Assets/Art/Level/12/image/1776_IMG_ITEM_PAKALTU.png differ diff --git a/Assets/Art/Level/12/image/1779_IMG_ITEM_KOKELTU2.png b/Assets/Art/Level/12/image/1779_IMG_ITEM_KOKELTU2.png index 6a8b8825..a39021c1 100644 Binary files a/Assets/Art/Level/12/image/1779_IMG_ITEM_KOKELTU2.png and b/Assets/Art/Level/12/image/1779_IMG_ITEM_KOKELTU2.png differ diff --git a/Assets/Art/Level/12/image/1782_IMG_ITEM_POPPO_.png b/Assets/Art/Level/12/image/1782_IMG_ITEM_POPPO_.png index 3fe62bff..b90da0f0 100644 Binary files a/Assets/Art/Level/12/image/1782_IMG_ITEM_POPPO_.png and b/Assets/Art/Level/12/image/1782_IMG_ITEM_POPPO_.png differ diff --git a/Assets/Art/Level/13/image/1007.png b/Assets/Art/Level/13/image/1007.png index 10394de2..06b95796 100644 Binary files a/Assets/Art/Level/13/image/1007.png and b/Assets/Art/Level/13/image/1007.png differ diff --git a/Assets/Art/Level/13/image/1009.png b/Assets/Art/Level/13/image/1009.png index 91334756..e56ff325 100644 Binary files a/Assets/Art/Level/13/image/1009.png and b/Assets/Art/Level/13/image/1009.png differ diff --git a/Assets/Art/Level/13/image/1011.png b/Assets/Art/Level/13/image/1011.png index 75e4bb3a..7918955e 100644 Binary files a/Assets/Art/Level/13/image/1011.png and b/Assets/Art/Level/13/image/1011.png differ diff --git a/Assets/Art/Level/13/image/1015_IMG_ITEM_NYA_.png b/Assets/Art/Level/13/image/1015_IMG_ITEM_NYA_.png index bacc5065..999209b9 100644 Binary files a/Assets/Art/Level/13/image/1015_IMG_ITEM_NYA_.png and b/Assets/Art/Level/13/image/1015_IMG_ITEM_NYA_.png differ diff --git a/Assets/Art/Level/13/image/1018_IMG_ITEM_CHILTUCHILTU.png b/Assets/Art/Level/13/image/1018_IMG_ITEM_CHILTUCHILTU.png index dae3d795..5940ae27 100644 Binary files a/Assets/Art/Level/13/image/1018_IMG_ITEM_CHILTUCHILTU.png and b/Assets/Art/Level/13/image/1018_IMG_ITEM_CHILTUCHILTU.png differ diff --git a/Assets/Art/Level/13/image/1021_IMG_ITEM_KARIKARI.png b/Assets/Art/Level/13/image/1021_IMG_ITEM_KARIKARI.png index 00fa7cb3..d8bb244c 100644 Binary files a/Assets/Art/Level/13/image/1021_IMG_ITEM_KARIKARI.png and b/Assets/Art/Level/13/image/1021_IMG_ITEM_KARIKARI.png differ diff --git a/Assets/Art/Level/13/image/114_IMG_COVER_24.png b/Assets/Art/Level/13/image/114_IMG_COVER_24.png index a99907cb..b2be0577 100644 Binary files a/Assets/Art/Level/13/image/114_IMG_COVER_24.png and b/Assets/Art/Level/13/image/114_IMG_COVER_24.png differ diff --git a/Assets/Art/Level/13/image/152_IMG_SITUATION_ICON_24.png b/Assets/Art/Level/13/image/152_IMG_SITUATION_ICON_24.png index 00b7cce6..03223fbf 100644 Binary files a/Assets/Art/Level/13/image/152_IMG_SITUATION_ICON_24.png and b/Assets/Art/Level/13/image/152_IMG_SITUATION_ICON_24.png differ diff --git a/Assets/Art/Level/13/image/183_IMG_SITUATION_LOGO_24.png b/Assets/Art/Level/13/image/183_IMG_SITUATION_LOGO_24.png index 4c2c85bc..8615ef28 100644 Binary files a/Assets/Art/Level/13/image/183_IMG_SITUATION_LOGO_24.png and b/Assets/Art/Level/13/image/183_IMG_SITUATION_LOGO_24.png differ diff --git a/Assets/Art/Level/13/image/947.png b/Assets/Art/Level/13/image/947.png index 7ec6d1f5..4e61c91e 100644 Binary files a/Assets/Art/Level/13/image/947.png and b/Assets/Art/Level/13/image/947.png differ diff --git a/Assets/Art/Level/13/image/949.png b/Assets/Art/Level/13/image/949.png index 29209146..c332b016 100644 Binary files a/Assets/Art/Level/13/image/949.png and b/Assets/Art/Level/13/image/949.png differ diff --git a/Assets/Art/Level/13/image/950.png b/Assets/Art/Level/13/image/950.png index 90e0bfe9..b4a1c990 100644 Binary files a/Assets/Art/Level/13/image/950.png and b/Assets/Art/Level/13/image/950.png differ diff --git a/Assets/Art/Level/13/image/953.png b/Assets/Art/Level/13/image/953.png index 8a5e74f3..ae2fb9ad 100644 Binary files a/Assets/Art/Level/13/image/953.png and b/Assets/Art/Level/13/image/953.png differ diff --git a/Assets/Art/Level/13/image/956.png b/Assets/Art/Level/13/image/956.png index f99996e5..1ef30622 100644 Binary files a/Assets/Art/Level/13/image/956.png and b/Assets/Art/Level/13/image/956.png differ diff --git a/Assets/Art/Level/13/image/960.png b/Assets/Art/Level/13/image/960.png index eae0bed1..8b35a7c9 100644 Binary files a/Assets/Art/Level/13/image/960.png and b/Assets/Art/Level/13/image/960.png differ diff --git a/Assets/Art/Level/13/image/963.png b/Assets/Art/Level/13/image/963.png index 536c7e95..6eb13f90 100644 Binary files a/Assets/Art/Level/13/image/963.png and b/Assets/Art/Level/13/image/963.png differ diff --git a/Assets/Art/Level/13/image/965.png b/Assets/Art/Level/13/image/965.png index 7decdfd0..32c3f762 100644 Binary files a/Assets/Art/Level/13/image/965.png and b/Assets/Art/Level/13/image/965.png differ diff --git a/Assets/Art/Level/13/image/968.png b/Assets/Art/Level/13/image/968.png index a83f8d3a..7c88e1af 100644 Binary files a/Assets/Art/Level/13/image/968.png and b/Assets/Art/Level/13/image/968.png differ diff --git a/Assets/Art/Level/13/image/970.png b/Assets/Art/Level/13/image/970.png index f2cbdc1c..48a6e05c 100644 Binary files a/Assets/Art/Level/13/image/970.png and b/Assets/Art/Level/13/image/970.png differ diff --git a/Assets/Art/Level/13/image/973.png b/Assets/Art/Level/13/image/973.png index 62a12a7b..bdcd2bb7 100644 Binary files a/Assets/Art/Level/13/image/973.png and b/Assets/Art/Level/13/image/973.png differ diff --git a/Assets/Art/Level/13/image/976.png b/Assets/Art/Level/13/image/976.png index c08627f8..7dc94c92 100644 Binary files a/Assets/Art/Level/13/image/976.png and b/Assets/Art/Level/13/image/976.png differ diff --git a/Assets/Art/Level/13/image/978.png b/Assets/Art/Level/13/image/978.png index 9ee9b330..87412758 100644 Binary files a/Assets/Art/Level/13/image/978.png and b/Assets/Art/Level/13/image/978.png differ diff --git a/Assets/Art/Level/13/image/981.png b/Assets/Art/Level/13/image/981.png index ba59355b..d70b0f4e 100644 Binary files a/Assets/Art/Level/13/image/981.png and b/Assets/Art/Level/13/image/981.png differ diff --git a/Assets/Art/Level/13/image/985.png b/Assets/Art/Level/13/image/985.png index a00a4348..4d4b2e6e 100644 Binary files a/Assets/Art/Level/13/image/985.png and b/Assets/Art/Level/13/image/985.png differ diff --git a/Assets/Art/Level/13/image/987.png b/Assets/Art/Level/13/image/987.png index b3867594..14547209 100644 Binary files a/Assets/Art/Level/13/image/987.png and b/Assets/Art/Level/13/image/987.png differ diff --git a/Assets/Art/Level/13/image/990.png b/Assets/Art/Level/13/image/990.png index 8c779c5b..431a950c 100644 Binary files a/Assets/Art/Level/13/image/990.png and b/Assets/Art/Level/13/image/990.png differ diff --git a/Assets/Art/Level/13/image/991.png b/Assets/Art/Level/13/image/991.png index 9e019e88..fa5f1323 100644 Binary files a/Assets/Art/Level/13/image/991.png and b/Assets/Art/Level/13/image/991.png differ diff --git a/Assets/Art/Level/13/image/992.png b/Assets/Art/Level/13/image/992.png index 6021d89b..d99eb495 100644 Binary files a/Assets/Art/Level/13/image/992.png and b/Assets/Art/Level/13/image/992.png differ diff --git a/Assets/Art/Level/13/image/995.png b/Assets/Art/Level/13/image/995.png index b7412726..a2443429 100644 Binary files a/Assets/Art/Level/13/image/995.png and b/Assets/Art/Level/13/image/995.png differ diff --git a/Assets/Art/Level/13/image/998.png b/Assets/Art/Level/13/image/998.png index b708e600..96a3d4f7 100644 Binary files a/Assets/Art/Level/13/image/998.png and b/Assets/Art/Level/13/image/998.png differ diff --git a/Assets/Art/Level/13/image/999.png b/Assets/Art/Level/13/image/999.png index b22ab0b3..ffccc2b4 100644 Binary files a/Assets/Art/Level/13/image/999.png and b/Assets/Art/Level/13/image/999.png differ diff --git a/Assets/Art/Level/14/image/121_IMG_COVER_17.png b/Assets/Art/Level/14/image/121_IMG_COVER_17.png index 6b91b05b..10c186f9 100644 Binary files a/Assets/Art/Level/14/image/121_IMG_COVER_17.png and b/Assets/Art/Level/14/image/121_IMG_COVER_17.png differ diff --git a/Assets/Art/Level/14/image/159_IMG_SITUATION_ICON_17.png b/Assets/Art/Level/14/image/159_IMG_SITUATION_ICON_17.png index dea52616..2c5c58aa 100644 Binary files a/Assets/Art/Level/14/image/159_IMG_SITUATION_ICON_17.png and b/Assets/Art/Level/14/image/159_IMG_SITUATION_ICON_17.png differ diff --git a/Assets/Art/Level/14/image/1650.png b/Assets/Art/Level/14/image/1650.png index 9ab02653..9620653d 100644 Binary files a/Assets/Art/Level/14/image/1650.png and b/Assets/Art/Level/14/image/1650.png differ diff --git a/Assets/Art/Level/14/image/1652.png b/Assets/Art/Level/14/image/1652.png index 6d6b9e6f..a2cdd97c 100644 Binary files a/Assets/Art/Level/14/image/1652.png and b/Assets/Art/Level/14/image/1652.png differ diff --git a/Assets/Art/Level/14/image/1656.png b/Assets/Art/Level/14/image/1656.png index 228017a1..ed004a4f 100644 Binary files a/Assets/Art/Level/14/image/1656.png and b/Assets/Art/Level/14/image/1656.png differ diff --git a/Assets/Art/Level/14/image/1658.png b/Assets/Art/Level/14/image/1658.png index 127d4f23..49e2416b 100644 Binary files a/Assets/Art/Level/14/image/1658.png and b/Assets/Art/Level/14/image/1658.png differ diff --git a/Assets/Art/Level/14/image/1661.png b/Assets/Art/Level/14/image/1661.png index 4e7fcbd9..b9d8ea33 100644 Binary files a/Assets/Art/Level/14/image/1661.png and b/Assets/Art/Level/14/image/1661.png differ diff --git a/Assets/Art/Level/14/image/1663.png b/Assets/Art/Level/14/image/1663.png index 82e0cc36..422cd846 100644 Binary files a/Assets/Art/Level/14/image/1663.png and b/Assets/Art/Level/14/image/1663.png differ diff --git a/Assets/Art/Level/14/image/1666.png b/Assets/Art/Level/14/image/1666.png index 1777dc76..86152159 100644 Binary files a/Assets/Art/Level/14/image/1666.png and b/Assets/Art/Level/14/image/1666.png differ diff --git a/Assets/Art/Level/14/image/1668.png b/Assets/Art/Level/14/image/1668.png index ff5d8420..debf190e 100644 Binary files a/Assets/Art/Level/14/image/1668.png and b/Assets/Art/Level/14/image/1668.png differ diff --git a/Assets/Art/Level/14/image/1671.png b/Assets/Art/Level/14/image/1671.png index 5be72905..7f4495fd 100644 Binary files a/Assets/Art/Level/14/image/1671.png and b/Assets/Art/Level/14/image/1671.png differ diff --git a/Assets/Art/Level/14/image/1673.png b/Assets/Art/Level/14/image/1673.png index 66b4e506..27aa08e1 100644 Binary files a/Assets/Art/Level/14/image/1673.png and b/Assets/Art/Level/14/image/1673.png differ diff --git a/Assets/Art/Level/14/image/1676.png b/Assets/Art/Level/14/image/1676.png index b4c2f1ba..79569225 100644 Binary files a/Assets/Art/Level/14/image/1676.png and b/Assets/Art/Level/14/image/1676.png differ diff --git a/Assets/Art/Level/14/image/1683.png b/Assets/Art/Level/14/image/1683.png index 90712276..a483b3e4 100644 Binary files a/Assets/Art/Level/14/image/1683.png and b/Assets/Art/Level/14/image/1683.png differ diff --git a/Assets/Art/Level/14/image/1685.png b/Assets/Art/Level/14/image/1685.png index 706d4d70..de67e321 100644 Binary files a/Assets/Art/Level/14/image/1685.png and b/Assets/Art/Level/14/image/1685.png differ diff --git a/Assets/Art/Level/14/image/1687.png b/Assets/Art/Level/14/image/1687.png index 0bf8dde0..de886b2e 100644 Binary files a/Assets/Art/Level/14/image/1687.png and b/Assets/Art/Level/14/image/1687.png differ diff --git a/Assets/Art/Level/14/image/1691.png b/Assets/Art/Level/14/image/1691.png index 132870bf..7c28a5ab 100644 Binary files a/Assets/Art/Level/14/image/1691.png and b/Assets/Art/Level/14/image/1691.png differ diff --git a/Assets/Art/Level/14/image/1694.png b/Assets/Art/Level/14/image/1694.png index d5fa2216..9bf08a3f 100644 Binary files a/Assets/Art/Level/14/image/1694.png and b/Assets/Art/Level/14/image/1694.png differ diff --git a/Assets/Art/Level/14/image/1696.png b/Assets/Art/Level/14/image/1696.png index 0f6c6b3f..fc4f4ecb 100644 Binary files a/Assets/Art/Level/14/image/1696.png and b/Assets/Art/Level/14/image/1696.png differ diff --git a/Assets/Art/Level/14/image/1699.png b/Assets/Art/Level/14/image/1699.png index 4dd0848c..5b5b45bd 100644 Binary files a/Assets/Art/Level/14/image/1699.png and b/Assets/Art/Level/14/image/1699.png differ diff --git a/Assets/Art/Level/14/image/1701.png b/Assets/Art/Level/14/image/1701.png index fec44475..0d8c0c24 100644 Binary files a/Assets/Art/Level/14/image/1701.png and b/Assets/Art/Level/14/image/1701.png differ diff --git a/Assets/Art/Level/14/image/1704.png b/Assets/Art/Level/14/image/1704.png index 15407aca..7b1ee6a0 100644 Binary files a/Assets/Art/Level/14/image/1704.png and b/Assets/Art/Level/14/image/1704.png differ diff --git a/Assets/Art/Level/14/image/1707.png b/Assets/Art/Level/14/image/1707.png index c671314d..9fed8d1f 100644 Binary files a/Assets/Art/Level/14/image/1707.png and b/Assets/Art/Level/14/image/1707.png differ diff --git a/Assets/Art/Level/14/image/1708.png b/Assets/Art/Level/14/image/1708.png index f2323b67..ade33576 100644 Binary files a/Assets/Art/Level/14/image/1708.png and b/Assets/Art/Level/14/image/1708.png differ diff --git a/Assets/Art/Level/14/image/1711.png b/Assets/Art/Level/14/image/1711.png index 9747459e..dd2df02e 100644 Binary files a/Assets/Art/Level/14/image/1711.png and b/Assets/Art/Level/14/image/1711.png differ diff --git a/Assets/Art/Level/14/image/1714.png b/Assets/Art/Level/14/image/1714.png index 7af2f763..830cb3a4 100644 Binary files a/Assets/Art/Level/14/image/1714.png and b/Assets/Art/Level/14/image/1714.png differ diff --git a/Assets/Art/Level/14/image/1718.png b/Assets/Art/Level/14/image/1718.png index 1378f232..58d5d5a1 100644 Binary files a/Assets/Art/Level/14/image/1718.png and b/Assets/Art/Level/14/image/1718.png differ diff --git a/Assets/Art/Level/14/image/1721.png b/Assets/Art/Level/14/image/1721.png index b798dcd3..a8d1e014 100644 Binary files a/Assets/Art/Level/14/image/1721.png and b/Assets/Art/Level/14/image/1721.png differ diff --git a/Assets/Art/Level/14/image/1725.png b/Assets/Art/Level/14/image/1725.png index ec0d18c2..faab0be2 100644 Binary files a/Assets/Art/Level/14/image/1725.png and b/Assets/Art/Level/14/image/1725.png differ diff --git a/Assets/Art/Level/14/image/1727.png b/Assets/Art/Level/14/image/1727.png index 383dd170..a193c364 100644 Binary files a/Assets/Art/Level/14/image/1727.png and b/Assets/Art/Level/14/image/1727.png differ diff --git a/Assets/Art/Level/14/image/1730.png b/Assets/Art/Level/14/image/1730.png index 127afc17..6c91c167 100644 Binary files a/Assets/Art/Level/14/image/1730.png and b/Assets/Art/Level/14/image/1730.png differ diff --git a/Assets/Art/Level/14/image/1732.png b/Assets/Art/Level/14/image/1732.png index 1611b7fe..d0814acd 100644 Binary files a/Assets/Art/Level/14/image/1732.png and b/Assets/Art/Level/14/image/1732.png differ diff --git a/Assets/Art/Level/14/image/1735.png b/Assets/Art/Level/14/image/1735.png index dec1e0f8..982579a2 100644 Binary files a/Assets/Art/Level/14/image/1735.png and b/Assets/Art/Level/14/image/1735.png differ diff --git a/Assets/Art/Level/14/image/1739_IMG_ITEM_SULTU.png b/Assets/Art/Level/14/image/1739_IMG_ITEM_SULTU.png index 0328fdcb..63ec3445 100644 Binary files a/Assets/Art/Level/14/image/1739_IMG_ITEM_SULTU.png and b/Assets/Art/Level/14/image/1739_IMG_ITEM_SULTU.png differ diff --git a/Assets/Art/Level/14/image/1742_IMG_ITEM_KAN.png b/Assets/Art/Level/14/image/1742_IMG_ITEM_KAN.png index 2e8cd5a0..78064838 100644 Binary files a/Assets/Art/Level/14/image/1742_IMG_ITEM_KAN.png and b/Assets/Art/Level/14/image/1742_IMG_ITEM_KAN.png differ diff --git a/Assets/Art/Level/14/image/1745_IMG_ITEM_BOSULTU.png b/Assets/Art/Level/14/image/1745_IMG_ITEM_BOSULTU.png index 130c3aa1..df00773a 100644 Binary files a/Assets/Art/Level/14/image/1745_IMG_ITEM_BOSULTU.png and b/Assets/Art/Level/14/image/1745_IMG_ITEM_BOSULTU.png differ diff --git a/Assets/Art/Level/14/image/190_IMG_SITUATION_LOGO_17.png b/Assets/Art/Level/14/image/190_IMG_SITUATION_LOGO_17.png index da6ed32f..c96ab685 100644 Binary files a/Assets/Art/Level/14/image/190_IMG_SITUATION_LOGO_17.png and b/Assets/Art/Level/14/image/190_IMG_SITUATION_LOGO_17.png differ diff --git a/Assets/Art/Level/15/image/123_IMG_COVER_15.png b/Assets/Art/Level/15/image/123_IMG_COVER_15.png index b3f3dd1e..765720ff 100644 Binary files a/Assets/Art/Level/15/image/123_IMG_COVER_15.png and b/Assets/Art/Level/15/image/123_IMG_COVER_15.png differ diff --git a/Assets/Art/Level/15/image/161_IMG_SITUATION_ICON_15.png b/Assets/Art/Level/15/image/161_IMG_SITUATION_ICON_15.png index b2104414..1a0b998d 100644 Binary files a/Assets/Art/Level/15/image/161_IMG_SITUATION_ICON_15.png and b/Assets/Art/Level/15/image/161_IMG_SITUATION_ICON_15.png differ diff --git a/Assets/Art/Level/15/image/1787.png b/Assets/Art/Level/15/image/1787.png index 124222a0..3fbc3036 100644 Binary files a/Assets/Art/Level/15/image/1787.png and b/Assets/Art/Level/15/image/1787.png differ diff --git a/Assets/Art/Level/15/image/1788.png b/Assets/Art/Level/15/image/1788.png index 354a4c3e..22cc8018 100644 Binary files a/Assets/Art/Level/15/image/1788.png and b/Assets/Art/Level/15/image/1788.png differ diff --git a/Assets/Art/Level/15/image/1790.png b/Assets/Art/Level/15/image/1790.png index 36ccebe5..81ff4566 100644 Binary files a/Assets/Art/Level/15/image/1790.png and b/Assets/Art/Level/15/image/1790.png differ diff --git a/Assets/Art/Level/15/image/1792.png b/Assets/Art/Level/15/image/1792.png index 73c6b9d9..52619761 100644 Binary files a/Assets/Art/Level/15/image/1792.png and b/Assets/Art/Level/15/image/1792.png differ diff --git a/Assets/Art/Level/15/image/1795.png b/Assets/Art/Level/15/image/1795.png index d8d5bc85..2a9b9991 100644 Binary files a/Assets/Art/Level/15/image/1795.png and b/Assets/Art/Level/15/image/1795.png differ diff --git a/Assets/Art/Level/15/image/1797.png b/Assets/Art/Level/15/image/1797.png index 9600e7b2..1da4ce6d 100644 Binary files a/Assets/Art/Level/15/image/1797.png and b/Assets/Art/Level/15/image/1797.png differ diff --git a/Assets/Art/Level/15/image/1799.png b/Assets/Art/Level/15/image/1799.png index a3c921b5..1b833754 100644 Binary files a/Assets/Art/Level/15/image/1799.png and b/Assets/Art/Level/15/image/1799.png differ diff --git a/Assets/Art/Level/15/image/1802.png b/Assets/Art/Level/15/image/1802.png index 21c03cbf..a015d873 100644 Binary files a/Assets/Art/Level/15/image/1802.png and b/Assets/Art/Level/15/image/1802.png differ diff --git a/Assets/Art/Level/15/image/1804.png b/Assets/Art/Level/15/image/1804.png index cb5a656a..5e6e6179 100644 Binary files a/Assets/Art/Level/15/image/1804.png and b/Assets/Art/Level/15/image/1804.png differ diff --git a/Assets/Art/Level/15/image/1807.png b/Assets/Art/Level/15/image/1807.png index bcc9372d..2ee3dc8f 100644 Binary files a/Assets/Art/Level/15/image/1807.png and b/Assets/Art/Level/15/image/1807.png differ diff --git a/Assets/Art/Level/15/image/1810.png b/Assets/Art/Level/15/image/1810.png index c16d7942..93706f04 100644 Binary files a/Assets/Art/Level/15/image/1810.png and b/Assets/Art/Level/15/image/1810.png differ diff --git a/Assets/Art/Level/15/image/1812.png b/Assets/Art/Level/15/image/1812.png index 1674850b..853c2205 100644 Binary files a/Assets/Art/Level/15/image/1812.png and b/Assets/Art/Level/15/image/1812.png differ diff --git a/Assets/Art/Level/15/image/1815.png b/Assets/Art/Level/15/image/1815.png index 8615b352..50654e19 100644 Binary files a/Assets/Art/Level/15/image/1815.png and b/Assets/Art/Level/15/image/1815.png differ diff --git a/Assets/Art/Level/15/image/1818.png b/Assets/Art/Level/15/image/1818.png index b11ddbcd..6cd69543 100644 Binary files a/Assets/Art/Level/15/image/1818.png and b/Assets/Art/Level/15/image/1818.png differ diff --git a/Assets/Art/Level/15/image/1821.png b/Assets/Art/Level/15/image/1821.png index 45e170b1..a128372a 100644 Binary files a/Assets/Art/Level/15/image/1821.png and b/Assets/Art/Level/15/image/1821.png differ diff --git a/Assets/Art/Level/15/image/1824.png b/Assets/Art/Level/15/image/1824.png index a643547f..1d426109 100644 Binary files a/Assets/Art/Level/15/image/1824.png and b/Assets/Art/Level/15/image/1824.png differ diff --git a/Assets/Art/Level/15/image/1828.png b/Assets/Art/Level/15/image/1828.png index 4a025111..7210c44e 100644 Binary files a/Assets/Art/Level/15/image/1828.png and b/Assets/Art/Level/15/image/1828.png differ diff --git a/Assets/Art/Level/15/image/1830.png b/Assets/Art/Level/15/image/1830.png index c6116074..edffd24e 100644 Binary files a/Assets/Art/Level/15/image/1830.png and b/Assets/Art/Level/15/image/1830.png differ diff --git a/Assets/Art/Level/15/image/1832.png b/Assets/Art/Level/15/image/1832.png index 659b9033..ccab31c5 100644 Binary files a/Assets/Art/Level/15/image/1832.png and b/Assets/Art/Level/15/image/1832.png differ diff --git a/Assets/Art/Level/15/image/1835_IMG_ITEM_SHAKASHAKA.png b/Assets/Art/Level/15/image/1835_IMG_ITEM_SHAKASHAKA.png index 8574d846..2bf99e84 100644 Binary files a/Assets/Art/Level/15/image/1835_IMG_ITEM_SHAKASHAKA.png and b/Assets/Art/Level/15/image/1835_IMG_ITEM_SHAKASHAKA.png differ diff --git a/Assets/Art/Level/15/image/1838_IMG_ITEM_PELTU.png b/Assets/Art/Level/15/image/1838_IMG_ITEM_PELTU.png index 7d159bb9..b3cb5c28 100644 Binary files a/Assets/Art/Level/15/image/1838_IMG_ITEM_PELTU.png and b/Assets/Art/Level/15/image/1838_IMG_ITEM_PELTU.png differ diff --git a/Assets/Art/Level/15/image/1841_IMG_ITEM_GUJUGUJU.png b/Assets/Art/Level/15/image/1841_IMG_ITEM_GUJUGUJU.png index 6d1b224a..603f075c 100644 Binary files a/Assets/Art/Level/15/image/1841_IMG_ITEM_GUJUGUJU.png and b/Assets/Art/Level/15/image/1841_IMG_ITEM_GUJUGUJU.png differ diff --git a/Assets/Art/Level/15/image/192_IMG_SITUATION_LOGO_15.png b/Assets/Art/Level/15/image/192_IMG_SITUATION_LOGO_15.png index bc55286f..0251f6d9 100644 Binary files a/Assets/Art/Level/15/image/192_IMG_SITUATION_LOGO_15.png and b/Assets/Art/Level/15/image/192_IMG_SITUATION_LOGO_15.png differ diff --git a/Assets/Art/Level/16/image/1520.png b/Assets/Art/Level/16/image/1520.png index 675d0f4a..7734abe3 100644 Binary files a/Assets/Art/Level/16/image/1520.png and b/Assets/Art/Level/16/image/1520.png differ diff --git a/Assets/Art/Level/16/image/1522.png b/Assets/Art/Level/16/image/1522.png index 827109a0..53f0922d 100644 Binary files a/Assets/Art/Level/16/image/1522.png and b/Assets/Art/Level/16/image/1522.png differ diff --git a/Assets/Art/Level/16/image/1524.png b/Assets/Art/Level/16/image/1524.png index 8e9d75b7..25f00913 100644 Binary files a/Assets/Art/Level/16/image/1524.png and b/Assets/Art/Level/16/image/1524.png differ diff --git a/Assets/Art/Level/16/image/1526.png b/Assets/Art/Level/16/image/1526.png index 4904cb1c..266fa6ed 100644 Binary files a/Assets/Art/Level/16/image/1526.png and b/Assets/Art/Level/16/image/1526.png differ diff --git a/Assets/Art/Level/16/image/1531.png b/Assets/Art/Level/16/image/1531.png index af95a629..959b3f11 100644 Binary files a/Assets/Art/Level/16/image/1531.png and b/Assets/Art/Level/16/image/1531.png differ diff --git a/Assets/Art/Level/16/image/1535.png b/Assets/Art/Level/16/image/1535.png index fe3089f5..e0a8f89a 100644 Binary files a/Assets/Art/Level/16/image/1535.png and b/Assets/Art/Level/16/image/1535.png differ diff --git a/Assets/Art/Level/16/image/1539.png b/Assets/Art/Level/16/image/1539.png index 9833719d..bb9d7a27 100644 Binary files a/Assets/Art/Level/16/image/1539.png and b/Assets/Art/Level/16/image/1539.png differ diff --git a/Assets/Art/Level/16/image/1541.png b/Assets/Art/Level/16/image/1541.png index 75008649..ac7babe6 100644 Binary files a/Assets/Art/Level/16/image/1541.png and b/Assets/Art/Level/16/image/1541.png differ diff --git a/Assets/Art/Level/16/image/1543.png b/Assets/Art/Level/16/image/1543.png index d4575813..eb611cdf 100644 Binary files a/Assets/Art/Level/16/image/1543.png and b/Assets/Art/Level/16/image/1543.png differ diff --git a/Assets/Art/Level/16/image/1549.png b/Assets/Art/Level/16/image/1549.png index f09804ce..5da9bd62 100644 Binary files a/Assets/Art/Level/16/image/1549.png and b/Assets/Art/Level/16/image/1549.png differ diff --git a/Assets/Art/Level/16/image/1551.png b/Assets/Art/Level/16/image/1551.png index e21af83f..a3f37fe3 100644 Binary files a/Assets/Art/Level/16/image/1551.png and b/Assets/Art/Level/16/image/1551.png differ diff --git a/Assets/Art/Level/16/image/1553.png b/Assets/Art/Level/16/image/1553.png index a81acf8d..a007b457 100644 Binary files a/Assets/Art/Level/16/image/1553.png and b/Assets/Art/Level/16/image/1553.png differ diff --git a/Assets/Art/Level/16/image/1559.png b/Assets/Art/Level/16/image/1559.png index 5a453a35..9107f700 100644 Binary files a/Assets/Art/Level/16/image/1559.png and b/Assets/Art/Level/16/image/1559.png differ diff --git a/Assets/Art/Level/16/image/1563.png b/Assets/Art/Level/16/image/1563.png index 1ba65dcf..85e13717 100644 Binary files a/Assets/Art/Level/16/image/1563.png and b/Assets/Art/Level/16/image/1563.png differ diff --git a/Assets/Art/Level/16/image/1565.png b/Assets/Art/Level/16/image/1565.png index a61bd8c2..895283b4 100644 Binary files a/Assets/Art/Level/16/image/1565.png and b/Assets/Art/Level/16/image/1565.png differ diff --git a/Assets/Art/Level/16/image/1567.png b/Assets/Art/Level/16/image/1567.png index 8b77d1cb..6c106a94 100644 Binary files a/Assets/Art/Level/16/image/1567.png and b/Assets/Art/Level/16/image/1567.png differ diff --git a/Assets/Art/Level/16/image/1571.png b/Assets/Art/Level/16/image/1571.png index 500ccb58..992a0280 100644 Binary files a/Assets/Art/Level/16/image/1571.png and b/Assets/Art/Level/16/image/1571.png differ diff --git a/Assets/Art/Level/16/image/1573.png b/Assets/Art/Level/16/image/1573.png index 1b55c4eb..ae6523b2 100644 Binary files a/Assets/Art/Level/16/image/1573.png and b/Assets/Art/Level/16/image/1573.png differ diff --git a/Assets/Art/Level/16/image/1575.png b/Assets/Art/Level/16/image/1575.png index 6cdd683d..443d6ca9 100644 Binary files a/Assets/Art/Level/16/image/1575.png and b/Assets/Art/Level/16/image/1575.png differ diff --git a/Assets/Art/Level/16/image/1579.png b/Assets/Art/Level/16/image/1579.png index 2b4a7886..223071ef 100644 Binary files a/Assets/Art/Level/16/image/1579.png and b/Assets/Art/Level/16/image/1579.png differ diff --git a/Assets/Art/Level/16/image/1581.png b/Assets/Art/Level/16/image/1581.png index 8b21f09b..3af36df2 100644 Binary files a/Assets/Art/Level/16/image/1581.png and b/Assets/Art/Level/16/image/1581.png differ diff --git a/Assets/Art/Level/16/image/1583.png b/Assets/Art/Level/16/image/1583.png index f947907f..c5aa22a4 100644 Binary files a/Assets/Art/Level/16/image/1583.png and b/Assets/Art/Level/16/image/1583.png differ diff --git a/Assets/Art/Level/16/image/1586.png b/Assets/Art/Level/16/image/1586.png index dd526bed..bed0d854 100644 Binary files a/Assets/Art/Level/16/image/1586.png and b/Assets/Art/Level/16/image/1586.png differ diff --git a/Assets/Art/Level/16/image/1588.png b/Assets/Art/Level/16/image/1588.png index bf010ef9..9cbdd0a2 100644 Binary files a/Assets/Art/Level/16/image/1588.png and b/Assets/Art/Level/16/image/1588.png differ diff --git a/Assets/Art/Level/16/image/1590.png b/Assets/Art/Level/16/image/1590.png index ec3da192..9863f7cb 100644 Binary files a/Assets/Art/Level/16/image/1590.png and b/Assets/Art/Level/16/image/1590.png differ diff --git a/Assets/Art/Level/16/image/1591.png b/Assets/Art/Level/16/image/1591.png index cc0298fd..cd01860e 100644 Binary files a/Assets/Art/Level/16/image/1591.png and b/Assets/Art/Level/16/image/1591.png differ diff --git a/Assets/Art/Level/16/image/1592.png b/Assets/Art/Level/16/image/1592.png index 7685464d..611b2936 100644 Binary files a/Assets/Art/Level/16/image/1592.png and b/Assets/Art/Level/16/image/1592.png differ diff --git a/Assets/Art/Level/16/image/1593.png b/Assets/Art/Level/16/image/1593.png index 823be439..869baaa1 100644 Binary files a/Assets/Art/Level/16/image/1593.png and b/Assets/Art/Level/16/image/1593.png differ diff --git a/Assets/Art/Level/16/image/1594.png b/Assets/Art/Level/16/image/1594.png index 3f45ea24..fd040994 100644 Binary files a/Assets/Art/Level/16/image/1594.png and b/Assets/Art/Level/16/image/1594.png differ diff --git a/Assets/Art/Level/16/image/1595.png b/Assets/Art/Level/16/image/1595.png index 6842bbd0..4582218a 100644 Binary files a/Assets/Art/Level/16/image/1595.png and b/Assets/Art/Level/16/image/1595.png differ diff --git a/Assets/Art/Level/16/image/1596.png b/Assets/Art/Level/16/image/1596.png index 2f76b488..ac9f7923 100644 Binary files a/Assets/Art/Level/16/image/1596.png and b/Assets/Art/Level/16/image/1596.png differ diff --git a/Assets/Art/Level/16/image/1600.png b/Assets/Art/Level/16/image/1600.png index 9e787fb2..ffd6475f 100644 Binary files a/Assets/Art/Level/16/image/1600.png and b/Assets/Art/Level/16/image/1600.png differ diff --git a/Assets/Art/Level/16/image/1604.png b/Assets/Art/Level/16/image/1604.png index fc02da84..7b1384fe 100644 Binary files a/Assets/Art/Level/16/image/1604.png and b/Assets/Art/Level/16/image/1604.png differ diff --git a/Assets/Art/Level/16/image/1608.png b/Assets/Art/Level/16/image/1608.png index 14b848f8..acdbf87a 100644 Binary files a/Assets/Art/Level/16/image/1608.png and b/Assets/Art/Level/16/image/1608.png differ diff --git a/Assets/Art/Level/16/image/1612.png b/Assets/Art/Level/16/image/1612.png index 833c46d8..d4b6cc1a 100644 Binary files a/Assets/Art/Level/16/image/1612.png and b/Assets/Art/Level/16/image/1612.png differ diff --git a/Assets/Art/Level/16/image/1616.png b/Assets/Art/Level/16/image/1616.png index a41ad4cf..7e7309e4 100644 Binary files a/Assets/Art/Level/16/image/1616.png and b/Assets/Art/Level/16/image/1616.png differ diff --git a/Assets/Art/Level/16/image/1619.png b/Assets/Art/Level/16/image/1619.png index 5afd295c..bd403ee6 100644 Binary files a/Assets/Art/Level/16/image/1619.png and b/Assets/Art/Level/16/image/1619.png differ diff --git a/Assets/Art/Level/16/image/1622.png b/Assets/Art/Level/16/image/1622.png index 70152f91..694b24c5 100644 Binary files a/Assets/Art/Level/16/image/1622.png and b/Assets/Art/Level/16/image/1622.png differ diff --git a/Assets/Art/Level/16/image/1625.png b/Assets/Art/Level/16/image/1625.png index 3a58f2a3..266c9002 100644 Binary files a/Assets/Art/Level/16/image/1625.png and b/Assets/Art/Level/16/image/1625.png differ diff --git a/Assets/Art/Level/16/image/1628.png b/Assets/Art/Level/16/image/1628.png index bcf73eef..af77d819 100644 Binary files a/Assets/Art/Level/16/image/1628.png and b/Assets/Art/Level/16/image/1628.png differ diff --git a/Assets/Art/Level/16/image/1631.png b/Assets/Art/Level/16/image/1631.png index d03ca825..936fdb76 100644 Binary files a/Assets/Art/Level/16/image/1631.png and b/Assets/Art/Level/16/image/1631.png differ diff --git a/Assets/Art/Level/16/image/1635.png b/Assets/Art/Level/16/image/1635.png index 34cb96a5..9614dd4b 100644 Binary files a/Assets/Art/Level/16/image/1635.png and b/Assets/Art/Level/16/image/1635.png differ diff --git a/Assets/Art/Level/16/image/1640_IMG_ITEM_JU_.png b/Assets/Art/Level/16/image/1640_IMG_ITEM_JU_.png index 596eb6dc..ca2d9b10 100644 Binary files a/Assets/Art/Level/16/image/1640_IMG_ITEM_JU_.png and b/Assets/Art/Level/16/image/1640_IMG_ITEM_JU_.png differ diff --git a/Assets/Art/Level/16/image/1643_IMG_ITEM_TONTON.png b/Assets/Art/Level/16/image/1643_IMG_ITEM_TONTON.png index 5baa8356..2d52dee1 100644 Binary files a/Assets/Art/Level/16/image/1643_IMG_ITEM_TONTON.png and b/Assets/Art/Level/16/image/1643_IMG_ITEM_TONTON.png differ diff --git a/Assets/Art/Level/16/image/1646_IMG_ITEM_KOTOKOTO.png b/Assets/Art/Level/16/image/1646_IMG_ITEM_KOTOKOTO.png index 3b7f8203..58e37ebe 100644 Binary files a/Assets/Art/Level/16/image/1646_IMG_ITEM_KOTOKOTO.png and b/Assets/Art/Level/16/image/1646_IMG_ITEM_KOTOKOTO.png differ diff --git a/Assets/Art/Level/17/image/1420.png b/Assets/Art/Level/17/image/1420.png index dedb15d3..97dfeb97 100644 Binary files a/Assets/Art/Level/17/image/1420.png and b/Assets/Art/Level/17/image/1420.png differ diff --git a/Assets/Art/Level/17/image/1423.png b/Assets/Art/Level/17/image/1423.png index f5d890ea..6c29fb7e 100644 Binary files a/Assets/Art/Level/17/image/1423.png and b/Assets/Art/Level/17/image/1423.png differ diff --git a/Assets/Art/Level/17/image/1428.png b/Assets/Art/Level/17/image/1428.png index 383db679..737ccf97 100644 Binary files a/Assets/Art/Level/17/image/1428.png and b/Assets/Art/Level/17/image/1428.png differ diff --git a/Assets/Art/Level/17/image/1431.png b/Assets/Art/Level/17/image/1431.png index cf264796..3eb670ee 100644 Binary files a/Assets/Art/Level/17/image/1431.png and b/Assets/Art/Level/17/image/1431.png differ diff --git a/Assets/Art/Level/17/image/1454.png b/Assets/Art/Level/17/image/1454.png index 6ee74f26..b1da23bc 100644 Binary files a/Assets/Art/Level/17/image/1454.png and b/Assets/Art/Level/17/image/1454.png differ diff --git a/Assets/Art/Level/17/image/1455.png b/Assets/Art/Level/17/image/1455.png index d44932fa..6e2512ec 100644 Binary files a/Assets/Art/Level/17/image/1455.png and b/Assets/Art/Level/17/image/1455.png differ diff --git a/Assets/Art/Level/17/image/1457.png b/Assets/Art/Level/17/image/1457.png index 8731c1f2..474345c7 100644 Binary files a/Assets/Art/Level/17/image/1457.png and b/Assets/Art/Level/17/image/1457.png differ diff --git a/Assets/Art/Level/17/image/1459.png b/Assets/Art/Level/17/image/1459.png index c5e26962..4c952560 100644 Binary files a/Assets/Art/Level/17/image/1459.png and b/Assets/Art/Level/17/image/1459.png differ diff --git a/Assets/Art/Level/17/image/1462.png b/Assets/Art/Level/17/image/1462.png index e2a62e7c..106dd523 100644 Binary files a/Assets/Art/Level/17/image/1462.png and b/Assets/Art/Level/17/image/1462.png differ diff --git a/Assets/Art/Level/17/image/1464.png b/Assets/Art/Level/17/image/1464.png index 98f9cd20..063c31fc 100644 Binary files a/Assets/Art/Level/17/image/1464.png and b/Assets/Art/Level/17/image/1464.png differ diff --git a/Assets/Art/Level/17/image/1467.png b/Assets/Art/Level/17/image/1467.png index c2f1bd4a..96942949 100644 Binary files a/Assets/Art/Level/17/image/1467.png and b/Assets/Art/Level/17/image/1467.png differ diff --git a/Assets/Art/Level/17/image/1471.png b/Assets/Art/Level/17/image/1471.png index 8c405dec..c4554b38 100644 Binary files a/Assets/Art/Level/17/image/1471.png and b/Assets/Art/Level/17/image/1471.png differ diff --git a/Assets/Art/Level/17/image/1473.png b/Assets/Art/Level/17/image/1473.png index 8589cd17..5dff4b52 100644 Binary files a/Assets/Art/Level/17/image/1473.png and b/Assets/Art/Level/17/image/1473.png differ diff --git a/Assets/Art/Level/17/image/1476.png b/Assets/Art/Level/17/image/1476.png index 3207d573..fe262a96 100644 Binary files a/Assets/Art/Level/17/image/1476.png and b/Assets/Art/Level/17/image/1476.png differ diff --git a/Assets/Art/Level/17/image/1479.png b/Assets/Art/Level/17/image/1479.png index d1f7d148..ee95ce2d 100644 Binary files a/Assets/Art/Level/17/image/1479.png and b/Assets/Art/Level/17/image/1479.png differ diff --git a/Assets/Art/Level/17/image/1483.png b/Assets/Art/Level/17/image/1483.png index 424d7317..ce7f4a15 100644 Binary files a/Assets/Art/Level/17/image/1483.png and b/Assets/Art/Level/17/image/1483.png differ diff --git a/Assets/Art/Level/17/image/1485.png b/Assets/Art/Level/17/image/1485.png index eb232d48..f5bf4d37 100644 Binary files a/Assets/Art/Level/17/image/1485.png and b/Assets/Art/Level/17/image/1485.png differ diff --git a/Assets/Art/Level/17/image/1488.png b/Assets/Art/Level/17/image/1488.png index 8da5a6e2..df2bb185 100644 Binary files a/Assets/Art/Level/17/image/1488.png and b/Assets/Art/Level/17/image/1488.png differ diff --git a/Assets/Art/Level/17/image/1491.png b/Assets/Art/Level/17/image/1491.png index d70e5e2e..72c9c89c 100644 Binary files a/Assets/Art/Level/17/image/1491.png and b/Assets/Art/Level/17/image/1491.png differ diff --git a/Assets/Art/Level/17/image/1498.png b/Assets/Art/Level/17/image/1498.png index 1ed9c9bc..af43718a 100644 Binary files a/Assets/Art/Level/17/image/1498.png and b/Assets/Art/Level/17/image/1498.png differ diff --git a/Assets/Art/Level/17/image/1502.png b/Assets/Art/Level/17/image/1502.png index 25c40d20..bbba365b 100644 Binary files a/Assets/Art/Level/17/image/1502.png and b/Assets/Art/Level/17/image/1502.png differ diff --git a/Assets/Art/Level/17/image/1505.png b/Assets/Art/Level/17/image/1505.png index 048d5ceb..6fcd6198 100644 Binary files a/Assets/Art/Level/17/image/1505.png and b/Assets/Art/Level/17/image/1505.png differ diff --git a/Assets/Art/Level/17/image/1509_IMG_ITEM_PECHOLTU.png b/Assets/Art/Level/17/image/1509_IMG_ITEM_PECHOLTU.png index 39f67c4b..5b74f58f 100644 Binary files a/Assets/Art/Level/17/image/1509_IMG_ITEM_PECHOLTU.png and b/Assets/Art/Level/17/image/1509_IMG_ITEM_PECHOLTU.png differ diff --git a/Assets/Art/Level/17/image/1512_IMG_ITEM_ZASHU.png b/Assets/Art/Level/17/image/1512_IMG_ITEM_ZASHU.png index 698e689a..0f949809 100644 Binary files a/Assets/Art/Level/17/image/1512_IMG_ITEM_ZASHU.png and b/Assets/Art/Level/17/image/1512_IMG_ITEM_ZASHU.png differ diff --git a/Assets/Art/Level/17/image/1515_IMG_ITEM_POKOLTU.png b/Assets/Art/Level/17/image/1515_IMG_ITEM_POKOLTU.png index 99fba64b..c2aaf6fb 100644 Binary files a/Assets/Art/Level/17/image/1515_IMG_ITEM_POKOLTU.png and b/Assets/Art/Level/17/image/1515_IMG_ITEM_POKOLTU.png differ diff --git a/Assets/Art/Level/18/image/2174.png b/Assets/Art/Level/18/image/2174.png index 025ccf8d..a98e5d6f 100644 Binary files a/Assets/Art/Level/18/image/2174.png and b/Assets/Art/Level/18/image/2174.png differ diff --git a/Assets/Art/Level/18/image/2175.png b/Assets/Art/Level/18/image/2175.png index 6a79d686..53c1bdaf 100644 Binary files a/Assets/Art/Level/18/image/2175.png and b/Assets/Art/Level/18/image/2175.png differ diff --git a/Assets/Art/Level/18/image/2177.png b/Assets/Art/Level/18/image/2177.png index cbcea513..7a085518 100644 Binary files a/Assets/Art/Level/18/image/2177.png and b/Assets/Art/Level/18/image/2177.png differ diff --git a/Assets/Art/Level/18/image/2180.png b/Assets/Art/Level/18/image/2180.png index 9b9cba70..8de5e3ab 100644 Binary files a/Assets/Art/Level/18/image/2180.png and b/Assets/Art/Level/18/image/2180.png differ diff --git a/Assets/Art/Level/18/image/2183.png b/Assets/Art/Level/18/image/2183.png index d9c0d3f2..f35bd19e 100644 Binary files a/Assets/Art/Level/18/image/2183.png and b/Assets/Art/Level/18/image/2183.png differ diff --git a/Assets/Art/Level/18/image/2189.png b/Assets/Art/Level/18/image/2189.png index 83be4451..1116bf4b 100644 Binary files a/Assets/Art/Level/18/image/2189.png and b/Assets/Art/Level/18/image/2189.png differ diff --git a/Assets/Art/Level/18/image/2191.png b/Assets/Art/Level/18/image/2191.png index 689dfe3b..317cb315 100644 Binary files a/Assets/Art/Level/18/image/2191.png and b/Assets/Art/Level/18/image/2191.png differ diff --git a/Assets/Art/Level/18/image/2195.png b/Assets/Art/Level/18/image/2195.png index 94ea773c..e200c46a 100644 Binary files a/Assets/Art/Level/18/image/2195.png and b/Assets/Art/Level/18/image/2195.png differ diff --git a/Assets/Art/Level/18/image/2197.png b/Assets/Art/Level/18/image/2197.png index a887e56f..a9cfff11 100644 Binary files a/Assets/Art/Level/18/image/2197.png and b/Assets/Art/Level/18/image/2197.png differ diff --git a/Assets/Art/Level/18/image/2199.png b/Assets/Art/Level/18/image/2199.png index 4cc0eec7..de73818f 100644 Binary files a/Assets/Art/Level/18/image/2199.png and b/Assets/Art/Level/18/image/2199.png differ diff --git a/Assets/Art/Level/18/image/2204.png b/Assets/Art/Level/18/image/2204.png index ac38f1bd..d5a86c93 100644 Binary files a/Assets/Art/Level/18/image/2204.png and b/Assets/Art/Level/18/image/2204.png differ diff --git a/Assets/Art/Level/18/image/2206.png b/Assets/Art/Level/18/image/2206.png index 96c0726c..9a4e32f4 100644 Binary files a/Assets/Art/Level/18/image/2206.png and b/Assets/Art/Level/18/image/2206.png differ diff --git a/Assets/Art/Level/18/image/2208.png b/Assets/Art/Level/18/image/2208.png index 5ebd233e..2ffe9979 100644 Binary files a/Assets/Art/Level/18/image/2208.png and b/Assets/Art/Level/18/image/2208.png differ diff --git a/Assets/Art/Level/18/image/2212.png b/Assets/Art/Level/18/image/2212.png index 4ff666a3..8b48195a 100644 Binary files a/Assets/Art/Level/18/image/2212.png and b/Assets/Art/Level/18/image/2212.png differ diff --git a/Assets/Art/Level/18/image/2214.png b/Assets/Art/Level/18/image/2214.png index 4684cb73..0c00975e 100644 Binary files a/Assets/Art/Level/18/image/2214.png and b/Assets/Art/Level/18/image/2214.png differ diff --git a/Assets/Art/Level/18/image/2216.png b/Assets/Art/Level/18/image/2216.png index 888c22d5..f284f084 100644 Binary files a/Assets/Art/Level/18/image/2216.png and b/Assets/Art/Level/18/image/2216.png differ diff --git a/Assets/Art/Level/18/image/2221.png b/Assets/Art/Level/18/image/2221.png index f64edaab..4fb31f5c 100644 Binary files a/Assets/Art/Level/18/image/2221.png and b/Assets/Art/Level/18/image/2221.png differ diff --git a/Assets/Art/Level/18/image/2225.png b/Assets/Art/Level/18/image/2225.png index 607cc9dd..18f18d3b 100644 Binary files a/Assets/Art/Level/18/image/2225.png and b/Assets/Art/Level/18/image/2225.png differ diff --git a/Assets/Art/Level/18/image/2228.png b/Assets/Art/Level/18/image/2228.png index ad1aa0c4..a59733b7 100644 Binary files a/Assets/Art/Level/18/image/2228.png and b/Assets/Art/Level/18/image/2228.png differ diff --git a/Assets/Art/Level/18/image/2231_IMG_ITEM_BIBIBI.png b/Assets/Art/Level/18/image/2231_IMG_ITEM_BIBIBI.png index 58d6cc94..03cdf8a7 100644 Binary files a/Assets/Art/Level/18/image/2231_IMG_ITEM_BIBIBI.png and b/Assets/Art/Level/18/image/2231_IMG_ITEM_BIBIBI.png differ diff --git a/Assets/Art/Level/18/image/2234_IMG_ITEM_PALA.png b/Assets/Art/Level/18/image/2234_IMG_ITEM_PALA.png index b8a3554e..281287cd 100644 Binary files a/Assets/Art/Level/18/image/2234_IMG_ITEM_PALA.png and b/Assets/Art/Level/18/image/2234_IMG_ITEM_PALA.png differ diff --git a/Assets/Art/Level/18/image/2237_IMG_ITEM_FUYOFUYO.png b/Assets/Art/Level/18/image/2237_IMG_ITEM_FUYOFUYO.png index 5abf6b1f..d95727bc 100644 Binary files a/Assets/Art/Level/18/image/2237_IMG_ITEM_FUYOFUYO.png and b/Assets/Art/Level/18/image/2237_IMG_ITEM_FUYOFUYO.png differ diff --git a/Assets/Art/Level/19/image/1130.png b/Assets/Art/Level/19/image/1130.png index 551fb32f..8d4cc730 100644 Binary files a/Assets/Art/Level/19/image/1130.png and b/Assets/Art/Level/19/image/1130.png differ diff --git a/Assets/Art/Level/19/image/1131.png b/Assets/Art/Level/19/image/1131.png index 4d093a50..9dcd7d03 100644 Binary files a/Assets/Art/Level/19/image/1131.png and b/Assets/Art/Level/19/image/1131.png differ diff --git a/Assets/Art/Level/19/image/1133.png b/Assets/Art/Level/19/image/1133.png index d3649ad4..51ac1004 100644 Binary files a/Assets/Art/Level/19/image/1133.png and b/Assets/Art/Level/19/image/1133.png differ diff --git a/Assets/Art/Level/19/image/1136.png b/Assets/Art/Level/19/image/1136.png index cf204c6e..98fcfa98 100644 Binary files a/Assets/Art/Level/19/image/1136.png and b/Assets/Art/Level/19/image/1136.png differ diff --git a/Assets/Art/Level/19/image/1137.png b/Assets/Art/Level/19/image/1137.png index b311d471..f8e226ca 100644 Binary files a/Assets/Art/Level/19/image/1137.png and b/Assets/Art/Level/19/image/1137.png differ diff --git a/Assets/Art/Level/19/image/1140.png b/Assets/Art/Level/19/image/1140.png index aa7fa37e..d625b633 100644 Binary files a/Assets/Art/Level/19/image/1140.png and b/Assets/Art/Level/19/image/1140.png differ diff --git a/Assets/Art/Level/19/image/1146.png b/Assets/Art/Level/19/image/1146.png index 26940470..b71b7ab3 100644 Binary files a/Assets/Art/Level/19/image/1146.png and b/Assets/Art/Level/19/image/1146.png differ diff --git a/Assets/Art/Level/19/image/1151.png b/Assets/Art/Level/19/image/1151.png index 2463aa82..275b4cbc 100644 Binary files a/Assets/Art/Level/19/image/1151.png and b/Assets/Art/Level/19/image/1151.png differ diff --git a/Assets/Art/Level/19/image/1153.png b/Assets/Art/Level/19/image/1153.png index 3f977248..c2c8606d 100644 Binary files a/Assets/Art/Level/19/image/1153.png and b/Assets/Art/Level/19/image/1153.png differ diff --git a/Assets/Art/Level/19/image/1155.png b/Assets/Art/Level/19/image/1155.png index 2e82b687..a05ea3b9 100644 Binary files a/Assets/Art/Level/19/image/1155.png and b/Assets/Art/Level/19/image/1155.png differ diff --git a/Assets/Art/Level/19/image/1157.png b/Assets/Art/Level/19/image/1157.png index c87968b3..1672669f 100644 Binary files a/Assets/Art/Level/19/image/1157.png and b/Assets/Art/Level/19/image/1157.png differ diff --git a/Assets/Art/Level/19/image/1159.png b/Assets/Art/Level/19/image/1159.png index d286a5d2..c90ef65c 100644 Binary files a/Assets/Art/Level/19/image/1159.png and b/Assets/Art/Level/19/image/1159.png differ diff --git a/Assets/Art/Level/19/image/1161.png b/Assets/Art/Level/19/image/1161.png index 35bb8aae..f9206ea3 100644 Binary files a/Assets/Art/Level/19/image/1161.png and b/Assets/Art/Level/19/image/1161.png differ diff --git a/Assets/Art/Level/19/image/1165.png b/Assets/Art/Level/19/image/1165.png index 0974c98c..8cabea53 100644 Binary files a/Assets/Art/Level/19/image/1165.png and b/Assets/Art/Level/19/image/1165.png differ diff --git a/Assets/Art/Level/19/image/1167.png b/Assets/Art/Level/19/image/1167.png index a893047a..7adc784e 100644 Binary files a/Assets/Art/Level/19/image/1167.png and b/Assets/Art/Level/19/image/1167.png differ diff --git a/Assets/Art/Level/19/image/1169.png b/Assets/Art/Level/19/image/1169.png index 3552da2e..617e150d 100644 Binary files a/Assets/Art/Level/19/image/1169.png and b/Assets/Art/Level/19/image/1169.png differ diff --git a/Assets/Art/Level/19/image/1171.png b/Assets/Art/Level/19/image/1171.png index 82bd7967..5b3f9980 100644 Binary files a/Assets/Art/Level/19/image/1171.png and b/Assets/Art/Level/19/image/1171.png differ diff --git a/Assets/Art/Level/19/image/1173.png b/Assets/Art/Level/19/image/1173.png index 6287832b..d1db44d2 100644 Binary files a/Assets/Art/Level/19/image/1173.png and b/Assets/Art/Level/19/image/1173.png differ diff --git a/Assets/Art/Level/19/image/1175.png b/Assets/Art/Level/19/image/1175.png index 77d049ab..dad3a520 100644 Binary files a/Assets/Art/Level/19/image/1175.png and b/Assets/Art/Level/19/image/1175.png differ diff --git a/Assets/Art/Level/19/image/1177.png b/Assets/Art/Level/19/image/1177.png index f935f477..798eaa55 100644 Binary files a/Assets/Art/Level/19/image/1177.png and b/Assets/Art/Level/19/image/1177.png differ diff --git a/Assets/Art/Level/19/image/1179.png b/Assets/Art/Level/19/image/1179.png index 1ad0a29b..40d7ce49 100644 Binary files a/Assets/Art/Level/19/image/1179.png and b/Assets/Art/Level/19/image/1179.png differ diff --git a/Assets/Art/Level/19/image/1181.png b/Assets/Art/Level/19/image/1181.png index ff50b300..58dba461 100644 Binary files a/Assets/Art/Level/19/image/1181.png and b/Assets/Art/Level/19/image/1181.png differ diff --git a/Assets/Art/Level/19/image/1185.png b/Assets/Art/Level/19/image/1185.png index 7bd49e2e..e9c9e402 100644 Binary files a/Assets/Art/Level/19/image/1185.png and b/Assets/Art/Level/19/image/1185.png differ diff --git a/Assets/Art/Level/19/image/1187.png b/Assets/Art/Level/19/image/1187.png index 14b0fe28..f8b6dc4e 100644 Binary files a/Assets/Art/Level/19/image/1187.png and b/Assets/Art/Level/19/image/1187.png differ diff --git a/Assets/Art/Level/19/image/1189.png b/Assets/Art/Level/19/image/1189.png index bce78329..75284031 100644 Binary files a/Assets/Art/Level/19/image/1189.png and b/Assets/Art/Level/19/image/1189.png differ diff --git a/Assets/Art/Level/19/image/1191.png b/Assets/Art/Level/19/image/1191.png index 834a7d0c..24dc7f6a 100644 Binary files a/Assets/Art/Level/19/image/1191.png and b/Assets/Art/Level/19/image/1191.png differ diff --git a/Assets/Art/Level/19/image/1193.png b/Assets/Art/Level/19/image/1193.png index 09ac22b1..517fff6e 100644 Binary files a/Assets/Art/Level/19/image/1193.png and b/Assets/Art/Level/19/image/1193.png differ diff --git a/Assets/Art/Level/19/image/1195.png b/Assets/Art/Level/19/image/1195.png index 5c665f7f..1bc94703 100644 Binary files a/Assets/Art/Level/19/image/1195.png and b/Assets/Art/Level/19/image/1195.png differ diff --git a/Assets/Art/Level/19/image/1197.png b/Assets/Art/Level/19/image/1197.png index c5c86174..52875bd8 100644 Binary files a/Assets/Art/Level/19/image/1197.png and b/Assets/Art/Level/19/image/1197.png differ diff --git a/Assets/Art/Level/19/image/1199.png b/Assets/Art/Level/19/image/1199.png index 3a6e6daf..0684dab8 100644 Binary files a/Assets/Art/Level/19/image/1199.png and b/Assets/Art/Level/19/image/1199.png differ diff --git a/Assets/Art/Level/19/image/1201.png b/Assets/Art/Level/19/image/1201.png index 754ad434..cb6894df 100644 Binary files a/Assets/Art/Level/19/image/1201.png and b/Assets/Art/Level/19/image/1201.png differ diff --git a/Assets/Art/Level/19/image/1203.png b/Assets/Art/Level/19/image/1203.png index 6c4cd8b2..48fc8732 100644 Binary files a/Assets/Art/Level/19/image/1203.png and b/Assets/Art/Level/19/image/1203.png differ diff --git a/Assets/Art/Level/19/image/1208.png b/Assets/Art/Level/19/image/1208.png index ed107a0a..5f6bc673 100644 Binary files a/Assets/Art/Level/19/image/1208.png and b/Assets/Art/Level/19/image/1208.png differ diff --git a/Assets/Art/Level/19/image/1211.png b/Assets/Art/Level/19/image/1211.png index 3053f42f..26f37273 100644 Binary files a/Assets/Art/Level/19/image/1211.png and b/Assets/Art/Level/19/image/1211.png differ diff --git a/Assets/Art/Level/19/image/1214.png b/Assets/Art/Level/19/image/1214.png index aca68afe..d6883ac9 100644 Binary files a/Assets/Art/Level/19/image/1214.png and b/Assets/Art/Level/19/image/1214.png differ diff --git a/Assets/Art/Level/19/image/1220_IMG_ITEM_JU_2.png b/Assets/Art/Level/19/image/1220_IMG_ITEM_JU_2.png index 3d538a58..83e6f8fe 100644 Binary files a/Assets/Art/Level/19/image/1220_IMG_ITEM_JU_2.png and b/Assets/Art/Level/19/image/1220_IMG_ITEM_JU_2.png differ diff --git a/Assets/Art/Level/19/image/1223_IMG_ITEM_BUCHA.png b/Assets/Art/Level/19/image/1223_IMG_ITEM_BUCHA.png index 9c80b23a..ce266c27 100644 Binary files a/Assets/Art/Level/19/image/1223_IMG_ITEM_BUCHA.png and b/Assets/Art/Level/19/image/1223_IMG_ITEM_BUCHA.png differ diff --git a/Assets/Art/Level/19/image/1226_IMG_ITEM_SHAKILTU.png b/Assets/Art/Level/19/image/1226_IMG_ITEM_SHAKILTU.png index d010c504..5bf259b3 100644 Binary files a/Assets/Art/Level/19/image/1226_IMG_ITEM_SHAKILTU.png and b/Assets/Art/Level/19/image/1226_IMG_ITEM_SHAKILTU.png differ diff --git a/Assets/Art/Level/19/image/232.png b/Assets/Art/Level/19/image/232.png index ed1ef604..1ecfa65f 100644 Binary files a/Assets/Art/Level/19/image/232.png and b/Assets/Art/Level/19/image/232.png differ diff --git a/Assets/Art/Level/19/image/235.png b/Assets/Art/Level/19/image/235.png index a56abd55..086d2d59 100644 Binary files a/Assets/Art/Level/19/image/235.png and b/Assets/Art/Level/19/image/235.png differ diff --git a/Assets/Art/Level/19/image/241.png b/Assets/Art/Level/19/image/241.png index 9db7b72f..4acf4e06 100644 Binary files a/Assets/Art/Level/19/image/241.png and b/Assets/Art/Level/19/image/241.png differ diff --git a/Assets/Art/Level/19/image/245.png b/Assets/Art/Level/19/image/245.png index 7c5255b5..5497ff10 100644 Binary files a/Assets/Art/Level/19/image/245.png and b/Assets/Art/Level/19/image/245.png differ diff --git a/Assets/Art/Level/19/image/248.png b/Assets/Art/Level/19/image/248.png index cd639936..e62ceb1e 100644 Binary files a/Assets/Art/Level/19/image/248.png and b/Assets/Art/Level/19/image/248.png differ diff --git a/Assets/Art/Level/2/2279.png b/Assets/Art/Level/2/2279.png index 779ec796..bafc40d8 100644 Binary files a/Assets/Art/Level/2/2279.png and b/Assets/Art/Level/2/2279.png differ diff --git a/Assets/Art/Level/2/image/2241.png b/Assets/Art/Level/2/image/2241.png index da42bb4b..b2291393 100644 Binary files a/Assets/Art/Level/2/image/2241.png and b/Assets/Art/Level/2/image/2241.png differ diff --git a/Assets/Art/Level/2/image/2243.png b/Assets/Art/Level/2/image/2243.png index 5830edc3..541032a7 100644 Binary files a/Assets/Art/Level/2/image/2243.png and b/Assets/Art/Level/2/image/2243.png differ diff --git a/Assets/Art/Level/2/image/2246.png b/Assets/Art/Level/2/image/2246.png index 8eeab502..ed9d2826 100644 Binary files a/Assets/Art/Level/2/image/2246.png and b/Assets/Art/Level/2/image/2246.png differ diff --git a/Assets/Art/Level/2/image/2249.png b/Assets/Art/Level/2/image/2249.png index 82821f0b..75da9335 100644 Binary files a/Assets/Art/Level/2/image/2249.png and b/Assets/Art/Level/2/image/2249.png differ diff --git a/Assets/Art/Level/2/image/2252.png b/Assets/Art/Level/2/image/2252.png index c54ad209..97e0a814 100644 Binary files a/Assets/Art/Level/2/image/2252.png and b/Assets/Art/Level/2/image/2252.png differ diff --git a/Assets/Art/Level/2/image/2255.png b/Assets/Art/Level/2/image/2255.png index 99705ef5..ca7fc526 100644 Binary files a/Assets/Art/Level/2/image/2255.png and b/Assets/Art/Level/2/image/2255.png differ diff --git a/Assets/Art/Level/2/image/2258.png b/Assets/Art/Level/2/image/2258.png index bf9987b0..246d67e7 100644 Binary files a/Assets/Art/Level/2/image/2258.png and b/Assets/Art/Level/2/image/2258.png differ diff --git a/Assets/Art/Level/2/image/2260.png b/Assets/Art/Level/2/image/2260.png index 931e80a2..56da8c82 100644 Binary files a/Assets/Art/Level/2/image/2260.png and b/Assets/Art/Level/2/image/2260.png differ diff --git a/Assets/Art/Level/2/image/2264.png b/Assets/Art/Level/2/image/2264.png index f4d1f555..ce89beed 100644 Binary files a/Assets/Art/Level/2/image/2264.png and b/Assets/Art/Level/2/image/2264.png differ diff --git a/Assets/Art/Level/2/image/2274.png b/Assets/Art/Level/2/image/2274.png index 378e08aa..06c3f8a4 100644 Binary files a/Assets/Art/Level/2/image/2274.png and b/Assets/Art/Level/2/image/2274.png differ diff --git a/Assets/Art/Level/2/image/2286.png b/Assets/Art/Level/2/image/2286.png index 28ad1055..1d3e3891 100644 Binary files a/Assets/Art/Level/2/image/2286.png and b/Assets/Art/Level/2/image/2286.png differ diff --git a/Assets/Art/Level/2/image/2288.png b/Assets/Art/Level/2/image/2288.png index 1497a669..0e2c9cf8 100644 Binary files a/Assets/Art/Level/2/image/2288.png and b/Assets/Art/Level/2/image/2288.png differ diff --git a/Assets/Art/Level/2/image/2291.png b/Assets/Art/Level/2/image/2291.png index 1ae4a99a..e283da4b 100644 Binary files a/Assets/Art/Level/2/image/2291.png and b/Assets/Art/Level/2/image/2291.png differ diff --git a/Assets/Art/Level/2/image/2293.png b/Assets/Art/Level/2/image/2293.png index 14051793..d1376551 100644 Binary files a/Assets/Art/Level/2/image/2293.png and b/Assets/Art/Level/2/image/2293.png differ diff --git a/Assets/Art/Level/2/image/2296.png b/Assets/Art/Level/2/image/2296.png index bb5d6123..0bc42dc2 100644 Binary files a/Assets/Art/Level/2/image/2296.png and b/Assets/Art/Level/2/image/2296.png differ diff --git a/Assets/Art/Level/2/image/2300.png b/Assets/Art/Level/2/image/2300.png index 97e2a78c..f5e0bfbc 100644 Binary files a/Assets/Art/Level/2/image/2300.png and b/Assets/Art/Level/2/image/2300.png differ diff --git a/Assets/Art/Level/2/image/2302.png b/Assets/Art/Level/2/image/2302.png index e25ef184..c380f48b 100644 Binary files a/Assets/Art/Level/2/image/2302.png and b/Assets/Art/Level/2/image/2302.png differ diff --git a/Assets/Art/Level/2/image/2306.png b/Assets/Art/Level/2/image/2306.png index ab580b7d..f4f64d3f 100644 Binary files a/Assets/Art/Level/2/image/2306.png and b/Assets/Art/Level/2/image/2306.png differ diff --git a/Assets/Art/Level/2/image/2308_IMG_ITEM_PAKILTU.png b/Assets/Art/Level/2/image/2308_IMG_ITEM_PAKILTU.png index 077d1e11..6429225b 100644 Binary files a/Assets/Art/Level/2/image/2308_IMG_ITEM_PAKILTU.png and b/Assets/Art/Level/2/image/2308_IMG_ITEM_PAKILTU.png differ diff --git a/Assets/Art/Level/2/image/2311_IMG_ITEM_GI_LTU.png b/Assets/Art/Level/2/image/2311_IMG_ITEM_GI_LTU.png index fbc403c3..8edda653 100644 Binary files a/Assets/Art/Level/2/image/2311_IMG_ITEM_GI_LTU.png and b/Assets/Art/Level/2/image/2311_IMG_ITEM_GI_LTU.png differ diff --git a/Assets/Art/Level/2/image/2314_IMG_ITEM_KALTU.png b/Assets/Art/Level/2/image/2314_IMG_ITEM_KALTU.png index 6cc76336..b6be3b2c 100644 Binary files a/Assets/Art/Level/2/image/2314_IMG_ITEM_KALTU.png and b/Assets/Art/Level/2/image/2314_IMG_ITEM_KALTU.png differ diff --git a/Assets/Art/Level/20/image/383.png b/Assets/Art/Level/20/image/383.png index 3ed93e3c..886e4487 100644 Binary files a/Assets/Art/Level/20/image/383.png and b/Assets/Art/Level/20/image/383.png differ diff --git a/Assets/Art/Level/20/image/384.png b/Assets/Art/Level/20/image/384.png index 37661b19..4d4a071a 100644 Binary files a/Assets/Art/Level/20/image/384.png and b/Assets/Art/Level/20/image/384.png differ diff --git a/Assets/Art/Level/20/image/385.png b/Assets/Art/Level/20/image/385.png index 4f303ed4..9ec2586e 100644 Binary files a/Assets/Art/Level/20/image/385.png and b/Assets/Art/Level/20/image/385.png differ diff --git a/Assets/Art/Level/20/image/386.png b/Assets/Art/Level/20/image/386.png index c90b3b1e..5f522e9a 100644 Binary files a/Assets/Art/Level/20/image/386.png and b/Assets/Art/Level/20/image/386.png differ diff --git a/Assets/Art/Level/20/image/388.png b/Assets/Art/Level/20/image/388.png index c8601f69..2943bd5c 100644 Binary files a/Assets/Art/Level/20/image/388.png and b/Assets/Art/Level/20/image/388.png differ diff --git a/Assets/Art/Level/20/image/390.png b/Assets/Art/Level/20/image/390.png index fcf68b1d..43049971 100644 Binary files a/Assets/Art/Level/20/image/390.png and b/Assets/Art/Level/20/image/390.png differ diff --git a/Assets/Art/Level/20/image/394.png b/Assets/Art/Level/20/image/394.png index 9f24c704..2bc3d846 100644 Binary files a/Assets/Art/Level/20/image/394.png and b/Assets/Art/Level/20/image/394.png differ diff --git a/Assets/Art/Level/20/image/397.png b/Assets/Art/Level/20/image/397.png index ad549081..67e580b9 100644 Binary files a/Assets/Art/Level/20/image/397.png and b/Assets/Art/Level/20/image/397.png differ diff --git a/Assets/Art/Level/20/image/397_1.png b/Assets/Art/Level/20/image/397_1.png index 95c7984c..93c681e8 100644 Binary files a/Assets/Art/Level/20/image/397_1.png and b/Assets/Art/Level/20/image/397_1.png differ diff --git a/Assets/Art/Level/20/image/400.png b/Assets/Art/Level/20/image/400.png index d9ff5171..a31aa154 100644 Binary files a/Assets/Art/Level/20/image/400.png and b/Assets/Art/Level/20/image/400.png differ diff --git a/Assets/Art/Level/20/image/400_1.png b/Assets/Art/Level/20/image/400_1.png index 8de0c64d..3ece4854 100644 Binary files a/Assets/Art/Level/20/image/400_1.png and b/Assets/Art/Level/20/image/400_1.png differ diff --git a/Assets/Art/Level/20/image/403.png b/Assets/Art/Level/20/image/403.png index 768bc3b5..3ad166a0 100644 Binary files a/Assets/Art/Level/20/image/403.png and b/Assets/Art/Level/20/image/403.png differ diff --git a/Assets/Art/Level/20/image/403_1.png b/Assets/Art/Level/20/image/403_1.png index 45314b5b..4e105a17 100644 Binary files a/Assets/Art/Level/20/image/403_1.png and b/Assets/Art/Level/20/image/403_1.png differ diff --git a/Assets/Art/Level/20/image/412_IMG_ITEM_A_.png b/Assets/Art/Level/20/image/412_IMG_ITEM_A_.png index dd5b3e4d..f723062d 100644 Binary files a/Assets/Art/Level/20/image/412_IMG_ITEM_A_.png and b/Assets/Art/Level/20/image/412_IMG_ITEM_A_.png differ diff --git a/Assets/Art/Level/20/image/415_IMG_ITEM_KE_LTU.png b/Assets/Art/Level/20/image/415_IMG_ITEM_KE_LTU.png index 4a670d17..d83cd087 100644 Binary files a/Assets/Art/Level/20/image/415_IMG_ITEM_KE_LTU.png and b/Assets/Art/Level/20/image/415_IMG_ITEM_KE_LTU.png differ diff --git a/Assets/Art/Level/20/image/418_IMG_ITEM_PIYO.png b/Assets/Art/Level/20/image/418_IMG_ITEM_PIYO.png index 6f2bf7e9..d91d032e 100644 Binary files a/Assets/Art/Level/20/image/418_IMG_ITEM_PIYO.png and b/Assets/Art/Level/20/image/418_IMG_ITEM_PIYO.png differ diff --git a/Assets/Art/Level/20/image/circle.psd b/Assets/Art/Level/20/image/circle.psd index 2a85a0ce..f0795227 100644 Binary files a/Assets/Art/Level/20/image/circle.psd and b/Assets/Art/Level/20/image/circle.psd differ diff --git a/Assets/Art/Level/21/image/1987.png b/Assets/Art/Level/21/image/1987.png index a88448be..90d9c2e1 100644 Binary files a/Assets/Art/Level/21/image/1987.png and b/Assets/Art/Level/21/image/1987.png differ diff --git a/Assets/Art/Level/21/image/1988.png b/Assets/Art/Level/21/image/1988.png index ae9bda37..c85ffc01 100644 Binary files a/Assets/Art/Level/21/image/1988.png and b/Assets/Art/Level/21/image/1988.png differ diff --git a/Assets/Art/Level/21/image/1990.png b/Assets/Art/Level/21/image/1990.png index 74f813f9..60db258d 100644 Binary files a/Assets/Art/Level/21/image/1990.png and b/Assets/Art/Level/21/image/1990.png differ diff --git a/Assets/Art/Level/21/image/1995.png b/Assets/Art/Level/21/image/1995.png index 6c05e539..955cb1bf 100644 Binary files a/Assets/Art/Level/21/image/1995.png and b/Assets/Art/Level/21/image/1995.png differ diff --git a/Assets/Art/Level/21/image/1999.png b/Assets/Art/Level/21/image/1999.png index a881f6be..d055ad1f 100644 Binary files a/Assets/Art/Level/21/image/1999.png and b/Assets/Art/Level/21/image/1999.png differ diff --git a/Assets/Art/Level/21/image/2006.png b/Assets/Art/Level/21/image/2006.png index 5e02d190..fb3e404b 100644 Binary files a/Assets/Art/Level/21/image/2006.png and b/Assets/Art/Level/21/image/2006.png differ diff --git a/Assets/Art/Level/21/image/2010.png b/Assets/Art/Level/21/image/2010.png index f9ee54c6..5d884d2c 100644 Binary files a/Assets/Art/Level/21/image/2010.png and b/Assets/Art/Level/21/image/2010.png differ diff --git a/Assets/Art/Level/21/image/2013.png b/Assets/Art/Level/21/image/2013.png index 64ef6e6c..0b7b5f32 100644 Binary files a/Assets/Art/Level/21/image/2013.png and b/Assets/Art/Level/21/image/2013.png differ diff --git a/Assets/Art/Level/21/image/2015.png b/Assets/Art/Level/21/image/2015.png index 08517d82..23665b4e 100644 Binary files a/Assets/Art/Level/21/image/2015.png and b/Assets/Art/Level/21/image/2015.png differ diff --git a/Assets/Art/Level/21/image/2018.png b/Assets/Art/Level/21/image/2018.png index f6ae3f46..03454c1b 100644 Binary files a/Assets/Art/Level/21/image/2018.png and b/Assets/Art/Level/21/image/2018.png differ diff --git a/Assets/Art/Level/21/image/2021.png b/Assets/Art/Level/21/image/2021.png index edcca171..bef3b006 100644 Binary files a/Assets/Art/Level/21/image/2021.png and b/Assets/Art/Level/21/image/2021.png differ diff --git a/Assets/Art/Level/21/image/2026.png b/Assets/Art/Level/21/image/2026.png index 6ce43e2e..32b84048 100644 Binary files a/Assets/Art/Level/21/image/2026.png and b/Assets/Art/Level/21/image/2026.png differ diff --git a/Assets/Art/Level/21/image/2029.png b/Assets/Art/Level/21/image/2029.png index 4cb290d3..6aec2110 100644 Binary files a/Assets/Art/Level/21/image/2029.png and b/Assets/Art/Level/21/image/2029.png differ diff --git a/Assets/Art/Level/21/image/2032.png b/Assets/Art/Level/21/image/2032.png index 46bcb037..3eb4667e 100644 Binary files a/Assets/Art/Level/21/image/2032.png and b/Assets/Art/Level/21/image/2032.png differ diff --git a/Assets/Art/Level/21/image/2036.png b/Assets/Art/Level/21/image/2036.png index 8ed6d34e..84fe74cc 100644 Binary files a/Assets/Art/Level/21/image/2036.png and b/Assets/Art/Level/21/image/2036.png differ diff --git a/Assets/Art/Level/21/image/2043.png b/Assets/Art/Level/21/image/2043.png index 212e5ffa..697c392e 100644 Binary files a/Assets/Art/Level/21/image/2043.png and b/Assets/Art/Level/21/image/2043.png differ diff --git a/Assets/Art/Level/21/image/2051_IMG_ITEM_PERON.png b/Assets/Art/Level/21/image/2051_IMG_ITEM_PERON.png index be02aafd..713a5df1 100644 Binary files a/Assets/Art/Level/21/image/2051_IMG_ITEM_PERON.png and b/Assets/Art/Level/21/image/2051_IMG_ITEM_PERON.png differ diff --git a/Assets/Art/Level/21/image/2054_IMG_ITEM_PAKULTU.png b/Assets/Art/Level/21/image/2054_IMG_ITEM_PAKULTU.png index c2ddbb09..b3a7405a 100644 Binary files a/Assets/Art/Level/21/image/2054_IMG_ITEM_PAKULTU.png and b/Assets/Art/Level/21/image/2054_IMG_ITEM_PAKULTU.png differ diff --git a/Assets/Art/Level/21/image/2057_IMG_ITEM_SUULU.png b/Assets/Art/Level/21/image/2057_IMG_ITEM_SUULU.png index 775983ab..24f5b6a6 100644 Binary files a/Assets/Art/Level/21/image/2057_IMG_ITEM_SUULU.png and b/Assets/Art/Level/21/image/2057_IMG_ITEM_SUULU.png differ diff --git a/Assets/Art/Level/21/image/2453.png b/Assets/Art/Level/21/image/2453.png index c8154536..eb2d5b98 100644 Binary files a/Assets/Art/Level/21/image/2453.png and b/Assets/Art/Level/21/image/2453.png differ diff --git a/Assets/Art/Level/21/image/2455.png b/Assets/Art/Level/21/image/2455.png index 1d539b1f..a623f89c 100644 Binary files a/Assets/Art/Level/21/image/2455.png and b/Assets/Art/Level/21/image/2455.png differ diff --git a/Assets/Art/Level/21/image/2458.png b/Assets/Art/Level/21/image/2458.png index 67ca24a6..d32afc41 100644 Binary files a/Assets/Art/Level/21/image/2458.png and b/Assets/Art/Level/21/image/2458.png differ diff --git a/Assets/Art/Level/21/image/2460.png b/Assets/Art/Level/21/image/2460.png index 8c2b416f..708be954 100644 Binary files a/Assets/Art/Level/21/image/2460.png and b/Assets/Art/Level/21/image/2460.png differ diff --git a/Assets/Art/Level/21/image/2467.png b/Assets/Art/Level/21/image/2467.png index 75236421..f1998ef9 100644 Binary files a/Assets/Art/Level/21/image/2467.png and b/Assets/Art/Level/21/image/2467.png differ diff --git a/Assets/Art/Level/22/image/537.png b/Assets/Art/Level/22/image/537.png index 356e1933..6ec5d047 100644 Binary files a/Assets/Art/Level/22/image/537.png and b/Assets/Art/Level/22/image/537.png differ diff --git a/Assets/Art/Level/22/image/539.png b/Assets/Art/Level/22/image/539.png index 78e49f7f..0ab5c666 100644 Binary files a/Assets/Art/Level/22/image/539.png and b/Assets/Art/Level/22/image/539.png differ diff --git a/Assets/Art/Level/22/image/543.png b/Assets/Art/Level/22/image/543.png index 45b55b1f..63e8b095 100644 Binary files a/Assets/Art/Level/22/image/543.png and b/Assets/Art/Level/22/image/543.png differ diff --git a/Assets/Art/Level/22/image/546.png b/Assets/Art/Level/22/image/546.png index a0c26b50..54d02036 100644 Binary files a/Assets/Art/Level/22/image/546.png and b/Assets/Art/Level/22/image/546.png differ diff --git a/Assets/Art/Level/22/image/549.png b/Assets/Art/Level/22/image/549.png index 2bfefcb7..a6a86945 100644 Binary files a/Assets/Art/Level/22/image/549.png and b/Assets/Art/Level/22/image/549.png differ diff --git a/Assets/Art/Level/22/image/551.png b/Assets/Art/Level/22/image/551.png index a425aaf0..b21d8199 100644 Binary files a/Assets/Art/Level/22/image/551.png and b/Assets/Art/Level/22/image/551.png differ diff --git a/Assets/Art/Level/22/image/554.png b/Assets/Art/Level/22/image/554.png index cf8a130b..6cdba196 100644 Binary files a/Assets/Art/Level/22/image/554.png and b/Assets/Art/Level/22/image/554.png differ diff --git a/Assets/Art/Level/22/image/556.png b/Assets/Art/Level/22/image/556.png index 5ad623fb..a8ba5179 100644 Binary files a/Assets/Art/Level/22/image/556.png and b/Assets/Art/Level/22/image/556.png differ diff --git a/Assets/Art/Level/22/image/559.png b/Assets/Art/Level/22/image/559.png index 12e83dfc..e7a9c118 100644 Binary files a/Assets/Art/Level/22/image/559.png and b/Assets/Art/Level/22/image/559.png differ diff --git a/Assets/Art/Level/22/image/561.png b/Assets/Art/Level/22/image/561.png index e93a65cf..ea3f58b6 100644 Binary files a/Assets/Art/Level/22/image/561.png and b/Assets/Art/Level/22/image/561.png differ diff --git a/Assets/Art/Level/22/image/564.png b/Assets/Art/Level/22/image/564.png index 8b5e2ff2..10bb76f0 100644 Binary files a/Assets/Art/Level/22/image/564.png and b/Assets/Art/Level/22/image/564.png differ diff --git a/Assets/Art/Level/22/image/566.png b/Assets/Art/Level/22/image/566.png index 469bc3f7..e103b6c1 100644 Binary files a/Assets/Art/Level/22/image/566.png and b/Assets/Art/Level/22/image/566.png differ diff --git a/Assets/Art/Level/22/image/569.png b/Assets/Art/Level/22/image/569.png index 3291d725..4c1a5a6d 100644 Binary files a/Assets/Art/Level/22/image/569.png and b/Assets/Art/Level/22/image/569.png differ diff --git a/Assets/Art/Level/22/image/571.png b/Assets/Art/Level/22/image/571.png index 3e9c5a31..3a736d9d 100644 Binary files a/Assets/Art/Level/22/image/571.png and b/Assets/Art/Level/22/image/571.png differ diff --git a/Assets/Art/Level/22/image/573.png b/Assets/Art/Level/22/image/573.png index cc70feec..f278a72b 100644 Binary files a/Assets/Art/Level/22/image/573.png and b/Assets/Art/Level/22/image/573.png differ diff --git a/Assets/Art/Level/22/image/576.png b/Assets/Art/Level/22/image/576.png index 4d59c782..e6ac6149 100644 Binary files a/Assets/Art/Level/22/image/576.png and b/Assets/Art/Level/22/image/576.png differ diff --git a/Assets/Art/Level/22/image/579.png b/Assets/Art/Level/22/image/579.png index 8ff5ccb8..2bea5481 100644 Binary files a/Assets/Art/Level/22/image/579.png and b/Assets/Art/Level/22/image/579.png differ diff --git a/Assets/Art/Level/22/image/582.png b/Assets/Art/Level/22/image/582.png index 6e38c9c8..6ee6253f 100644 Binary files a/Assets/Art/Level/22/image/582.png and b/Assets/Art/Level/22/image/582.png differ diff --git a/Assets/Art/Level/22/image/585.png b/Assets/Art/Level/22/image/585.png index d1802b4d..c3af877c 100644 Binary files a/Assets/Art/Level/22/image/585.png and b/Assets/Art/Level/22/image/585.png differ diff --git a/Assets/Art/Level/22/image/587.png b/Assets/Art/Level/22/image/587.png index da542e92..2eeea328 100644 Binary files a/Assets/Art/Level/22/image/587.png and b/Assets/Art/Level/22/image/587.png differ diff --git a/Assets/Art/Level/22/image/590.png b/Assets/Art/Level/22/image/590.png index 0bbafa86..eca1163f 100644 Binary files a/Assets/Art/Level/22/image/590.png and b/Assets/Art/Level/22/image/590.png differ diff --git a/Assets/Art/Level/22/image/592.png b/Assets/Art/Level/22/image/592.png index 18745372..502ccff6 100644 Binary files a/Assets/Art/Level/22/image/592.png and b/Assets/Art/Level/22/image/592.png differ diff --git a/Assets/Art/Level/22/image/595.png b/Assets/Art/Level/22/image/595.png index 0b0eb6d1..cf641ebd 100644 Binary files a/Assets/Art/Level/22/image/595.png and b/Assets/Art/Level/22/image/595.png differ diff --git a/Assets/Art/Level/22/image/597.png b/Assets/Art/Level/22/image/597.png index ade20135..45aa68ee 100644 Binary files a/Assets/Art/Level/22/image/597.png and b/Assets/Art/Level/22/image/597.png differ diff --git a/Assets/Art/Level/22/image/600.png b/Assets/Art/Level/22/image/600.png index a2ae3daf..8be4b609 100644 Binary files a/Assets/Art/Level/22/image/600.png and b/Assets/Art/Level/22/image/600.png differ diff --git a/Assets/Art/Level/22/image/603.png b/Assets/Art/Level/22/image/603.png index 4ccfe139..cf2eceed 100644 Binary files a/Assets/Art/Level/22/image/603.png and b/Assets/Art/Level/22/image/603.png differ diff --git a/Assets/Art/Level/22/image/606.png b/Assets/Art/Level/22/image/606.png index 3461538c..faadb3a1 100644 Binary files a/Assets/Art/Level/22/image/606.png and b/Assets/Art/Level/22/image/606.png differ diff --git a/Assets/Art/Level/22/image/608.png b/Assets/Art/Level/22/image/608.png index 92842b2e..5d7f8c5a 100644 Binary files a/Assets/Art/Level/22/image/608.png and b/Assets/Art/Level/22/image/608.png differ diff --git a/Assets/Art/Level/22/image/611.png b/Assets/Art/Level/22/image/611.png index 8e324929..590affea 100644 Binary files a/Assets/Art/Level/22/image/611.png and b/Assets/Art/Level/22/image/611.png differ diff --git a/Assets/Art/Level/22/image/613.png b/Assets/Art/Level/22/image/613.png index 8060061a..f41576c1 100644 Binary files a/Assets/Art/Level/22/image/613.png and b/Assets/Art/Level/22/image/613.png differ diff --git a/Assets/Art/Level/22/image/616.png b/Assets/Art/Level/22/image/616.png index 821fde2b..53afdb4b 100644 Binary files a/Assets/Art/Level/22/image/616.png and b/Assets/Art/Level/22/image/616.png differ diff --git a/Assets/Art/Level/22/image/619.png b/Assets/Art/Level/22/image/619.png index c27112e0..50a378aa 100644 Binary files a/Assets/Art/Level/22/image/619.png and b/Assets/Art/Level/22/image/619.png differ diff --git a/Assets/Art/Level/22/image/622.png b/Assets/Art/Level/22/image/622.png index bb166094..fe092f77 100644 Binary files a/Assets/Art/Level/22/image/622.png and b/Assets/Art/Level/22/image/622.png differ diff --git a/Assets/Art/Level/22/image/625.png b/Assets/Art/Level/22/image/625.png index d8ed0bd4..8e10592b 100644 Binary files a/Assets/Art/Level/22/image/625.png and b/Assets/Art/Level/22/image/625.png differ diff --git a/Assets/Art/Level/22/image/628.png b/Assets/Art/Level/22/image/628.png index f5d1e277..bb70edf7 100644 Binary files a/Assets/Art/Level/22/image/628.png and b/Assets/Art/Level/22/image/628.png differ diff --git a/Assets/Art/Level/22/image/631.png b/Assets/Art/Level/22/image/631.png index 21ea9e5c..072da0f6 100644 Binary files a/Assets/Art/Level/22/image/631.png and b/Assets/Art/Level/22/image/631.png differ diff --git a/Assets/Art/Level/22/image/634.png b/Assets/Art/Level/22/image/634.png index b8c23333..d0f5e95b 100644 Binary files a/Assets/Art/Level/22/image/634.png and b/Assets/Art/Level/22/image/634.png differ diff --git a/Assets/Art/Level/22/image/637.png b/Assets/Art/Level/22/image/637.png index 39b2e57c..9949935d 100644 Binary files a/Assets/Art/Level/22/image/637.png and b/Assets/Art/Level/22/image/637.png differ diff --git a/Assets/Art/Level/22/image/640.png b/Assets/Art/Level/22/image/640.png index 74f4f2eb..769d2154 100644 Binary files a/Assets/Art/Level/22/image/640.png and b/Assets/Art/Level/22/image/640.png differ diff --git a/Assets/Art/Level/22/image/643.png b/Assets/Art/Level/22/image/643.png index 596d5b99..4144ae0a 100644 Binary files a/Assets/Art/Level/22/image/643.png and b/Assets/Art/Level/22/image/643.png differ diff --git a/Assets/Art/Level/22/image/646.png b/Assets/Art/Level/22/image/646.png index 90df36bb..992e3994 100644 Binary files a/Assets/Art/Level/22/image/646.png and b/Assets/Art/Level/22/image/646.png differ diff --git a/Assets/Art/Level/22/image/649.png b/Assets/Art/Level/22/image/649.png index a338f9c8..c21163fa 100644 Binary files a/Assets/Art/Level/22/image/649.png and b/Assets/Art/Level/22/image/649.png differ diff --git a/Assets/Art/Level/22/image/652.png b/Assets/Art/Level/22/image/652.png index 0e08edef..5aad111b 100644 Binary files a/Assets/Art/Level/22/image/652.png and b/Assets/Art/Level/22/image/652.png differ diff --git a/Assets/Art/Level/22/image/655.png b/Assets/Art/Level/22/image/655.png index 945faec8..a6e3991c 100644 Binary files a/Assets/Art/Level/22/image/655.png and b/Assets/Art/Level/22/image/655.png differ diff --git a/Assets/Art/Level/22/image/657.png b/Assets/Art/Level/22/image/657.png index 27457224..d6b4dc9f 100644 Binary files a/Assets/Art/Level/22/image/657.png and b/Assets/Art/Level/22/image/657.png differ diff --git a/Assets/Art/Level/22/image/659.png b/Assets/Art/Level/22/image/659.png index 3d4dcc64..5b48d65a 100644 Binary files a/Assets/Art/Level/22/image/659.png and b/Assets/Art/Level/22/image/659.png differ diff --git a/Assets/Art/Level/22/image/662.png b/Assets/Art/Level/22/image/662.png index 230c4efb..08084fc7 100644 Binary files a/Assets/Art/Level/22/image/662.png and b/Assets/Art/Level/22/image/662.png differ diff --git a/Assets/Art/Level/22/image/664.png b/Assets/Art/Level/22/image/664.png index 16f437ce..7b77d96a 100644 Binary files a/Assets/Art/Level/22/image/664.png and b/Assets/Art/Level/22/image/664.png differ diff --git a/Assets/Art/Level/22/image/667.png b/Assets/Art/Level/22/image/667.png index 30727e05..266881f7 100644 Binary files a/Assets/Art/Level/22/image/667.png and b/Assets/Art/Level/22/image/667.png differ diff --git a/Assets/Art/Level/22/image/669.png b/Assets/Art/Level/22/image/669.png index 0a72bd56..7871e36b 100644 Binary files a/Assets/Art/Level/22/image/669.png and b/Assets/Art/Level/22/image/669.png differ diff --git a/Assets/Art/Level/22/image/672.png b/Assets/Art/Level/22/image/672.png index 9c021284..aa6c1715 100644 Binary files a/Assets/Art/Level/22/image/672.png and b/Assets/Art/Level/22/image/672.png differ diff --git a/Assets/Art/Level/22/image/674.png b/Assets/Art/Level/22/image/674.png index 6dfe7812..6d02eaf7 100644 Binary files a/Assets/Art/Level/22/image/674.png and b/Assets/Art/Level/22/image/674.png differ diff --git a/Assets/Art/Level/22/image/677.png b/Assets/Art/Level/22/image/677.png index c43d56e8..60c4f0ea 100644 Binary files a/Assets/Art/Level/22/image/677.png and b/Assets/Art/Level/22/image/677.png differ diff --git a/Assets/Art/Level/22/image/679.png b/Assets/Art/Level/22/image/679.png index a824a221..1f633226 100644 Binary files a/Assets/Art/Level/22/image/679.png and b/Assets/Art/Level/22/image/679.png differ diff --git a/Assets/Art/Level/22/image/681.png b/Assets/Art/Level/22/image/681.png index fe167208..9a17cac8 100644 Binary files a/Assets/Art/Level/22/image/681.png and b/Assets/Art/Level/22/image/681.png differ diff --git a/Assets/Art/Level/22/image/684_IMG_ITEM_KOPOPO.png b/Assets/Art/Level/22/image/684_IMG_ITEM_KOPOPO.png index c2f6720a..b243b992 100644 Binary files a/Assets/Art/Level/22/image/684_IMG_ITEM_KOPOPO.png and b/Assets/Art/Level/22/image/684_IMG_ITEM_KOPOPO.png differ diff --git a/Assets/Art/Level/22/image/687_IMG_ITEM_PUSHU.png b/Assets/Art/Level/22/image/687_IMG_ITEM_PUSHU.png index 65c44b4e..aec651d1 100644 Binary files a/Assets/Art/Level/22/image/687_IMG_ITEM_PUSHU.png and b/Assets/Art/Level/22/image/687_IMG_ITEM_PUSHU.png differ diff --git a/Assets/Art/Level/22/image/690_IMG_ITEM_GOKULTU.png b/Assets/Art/Level/22/image/690_IMG_ITEM_GOKULTU.png index 5c4f63f2..b4f41aab 100644 Binary files a/Assets/Art/Level/22/image/690_IMG_ITEM_GOKULTU.png and b/Assets/Art/Level/22/image/690_IMG_ITEM_GOKULTU.png differ diff --git a/Assets/Art/Level/23/image/2318.png b/Assets/Art/Level/23/image/2318.png index aa8a1fa5..fb932f4b 100644 Binary files a/Assets/Art/Level/23/image/2318.png and b/Assets/Art/Level/23/image/2318.png differ diff --git a/Assets/Art/Level/23/image/2320.png b/Assets/Art/Level/23/image/2320.png index 3045586f..ddfdc993 100644 Binary files a/Assets/Art/Level/23/image/2320.png and b/Assets/Art/Level/23/image/2320.png differ diff --git a/Assets/Art/Level/23/image/2322.png b/Assets/Art/Level/23/image/2322.png index 9655f7c7..f5a47e62 100644 Binary files a/Assets/Art/Level/23/image/2322.png and b/Assets/Art/Level/23/image/2322.png differ diff --git a/Assets/Art/Level/23/image/2325.png b/Assets/Art/Level/23/image/2325.png index f8268a1a..2da28ea5 100644 Binary files a/Assets/Art/Level/23/image/2325.png and b/Assets/Art/Level/23/image/2325.png differ diff --git a/Assets/Art/Level/23/image/2326.png b/Assets/Art/Level/23/image/2326.png index 34be6fa7..8f4b3272 100644 Binary files a/Assets/Art/Level/23/image/2326.png and b/Assets/Art/Level/23/image/2326.png differ diff --git a/Assets/Art/Level/23/image/2327.png b/Assets/Art/Level/23/image/2327.png index 0c447961..4d4f0829 100644 Binary files a/Assets/Art/Level/23/image/2327.png and b/Assets/Art/Level/23/image/2327.png differ diff --git a/Assets/Art/Level/23/image/2331.png b/Assets/Art/Level/23/image/2331.png index ee43dc4a..e721143a 100644 Binary files a/Assets/Art/Level/23/image/2331.png and b/Assets/Art/Level/23/image/2331.png differ diff --git a/Assets/Art/Level/23/image/2333.png b/Assets/Art/Level/23/image/2333.png index 030b230c..6fb90912 100644 Binary files a/Assets/Art/Level/23/image/2333.png and b/Assets/Art/Level/23/image/2333.png differ diff --git a/Assets/Art/Level/23/image/2336.png b/Assets/Art/Level/23/image/2336.png index f7069950..a396797f 100644 Binary files a/Assets/Art/Level/23/image/2336.png and b/Assets/Art/Level/23/image/2336.png differ diff --git a/Assets/Art/Level/23/image/2341.png b/Assets/Art/Level/23/image/2341.png index 7b1d46aa..eb811254 100644 Binary files a/Assets/Art/Level/23/image/2341.png and b/Assets/Art/Level/23/image/2341.png differ diff --git a/Assets/Art/Level/23/image/2342.png b/Assets/Art/Level/23/image/2342.png index bba65342..3c71be82 100644 Binary files a/Assets/Art/Level/23/image/2342.png and b/Assets/Art/Level/23/image/2342.png differ diff --git a/Assets/Art/Level/23/image/2343.png b/Assets/Art/Level/23/image/2343.png index 7b1d46aa..3310e741 100644 Binary files a/Assets/Art/Level/23/image/2343.png and b/Assets/Art/Level/23/image/2343.png differ diff --git a/Assets/Art/Level/23/image/2347.png b/Assets/Art/Level/23/image/2347.png index f6ba14f1..2914c536 100644 Binary files a/Assets/Art/Level/23/image/2347.png and b/Assets/Art/Level/23/image/2347.png differ diff --git a/Assets/Art/Level/23/image/2352.png b/Assets/Art/Level/23/image/2352.png index 894dc9d3..5697769c 100644 Binary files a/Assets/Art/Level/23/image/2352.png and b/Assets/Art/Level/23/image/2352.png differ diff --git a/Assets/Art/Level/23/image/2353.png b/Assets/Art/Level/23/image/2353.png index 12c24d31..44b5518b 100644 Binary files a/Assets/Art/Level/23/image/2353.png and b/Assets/Art/Level/23/image/2353.png differ diff --git a/Assets/Art/Level/23/image/2358.png b/Assets/Art/Level/23/image/2358.png index b91c4d37..80403bcc 100644 Binary files a/Assets/Art/Level/23/image/2358.png and b/Assets/Art/Level/23/image/2358.png differ diff --git a/Assets/Art/Level/23/image/2362.png b/Assets/Art/Level/23/image/2362.png index 0463cca1..c7820813 100644 Binary files a/Assets/Art/Level/23/image/2362.png and b/Assets/Art/Level/23/image/2362.png differ diff --git a/Assets/Art/Level/23/image/2368.png b/Assets/Art/Level/23/image/2368.png index 1f07460a..c6b52b59 100644 Binary files a/Assets/Art/Level/23/image/2368.png and b/Assets/Art/Level/23/image/2368.png differ diff --git a/Assets/Art/Level/23/image/2371.png b/Assets/Art/Level/23/image/2371.png index adeab183..563fee89 100644 Binary files a/Assets/Art/Level/23/image/2371.png and b/Assets/Art/Level/23/image/2371.png differ diff --git a/Assets/Art/Level/23/image/2374_IMG_ITEM_GARAGARA.png b/Assets/Art/Level/23/image/2374_IMG_ITEM_GARAGARA.png index 8b86263e..793a7f2f 100644 Binary files a/Assets/Art/Level/23/image/2374_IMG_ITEM_GARAGARA.png and b/Assets/Art/Level/23/image/2374_IMG_ITEM_GARAGARA.png differ diff --git a/Assets/Art/Level/23/image/2377_IMG_ITEM_WIN.png b/Assets/Art/Level/23/image/2377_IMG_ITEM_WIN.png index 7a58374e..7aae9f44 100644 Binary files a/Assets/Art/Level/23/image/2377_IMG_ITEM_WIN.png and b/Assets/Art/Level/23/image/2377_IMG_ITEM_WIN.png differ diff --git a/Assets/Art/Level/23/image/2380_IMG_ITEM_ZA_.png b/Assets/Art/Level/23/image/2380_IMG_ITEM_ZA_.png index b741e3b8..9ed938a1 100644 Binary files a/Assets/Art/Level/23/image/2380_IMG_ITEM_ZA_.png and b/Assets/Art/Level/23/image/2380_IMG_ITEM_ZA_.png differ diff --git a/Assets/Art/Level/24/image/774.png b/Assets/Art/Level/24/image/774.png index 32aa6a91..320f05b1 100644 Binary files a/Assets/Art/Level/24/image/774.png and b/Assets/Art/Level/24/image/774.png differ diff --git a/Assets/Art/Level/24/image/774_1.png b/Assets/Art/Level/24/image/774_1.png index af1156b1..47563f89 100644 Binary files a/Assets/Art/Level/24/image/774_1.png and b/Assets/Art/Level/24/image/774_1.png differ diff --git a/Assets/Art/Level/24/image/776.png b/Assets/Art/Level/24/image/776.png index bca4cb6b..50fd8ff7 100644 Binary files a/Assets/Art/Level/24/image/776.png and b/Assets/Art/Level/24/image/776.png differ diff --git a/Assets/Art/Level/24/image/781.png b/Assets/Art/Level/24/image/781.png index 9c1d90c5..a2a799da 100644 Binary files a/Assets/Art/Level/24/image/781.png and b/Assets/Art/Level/24/image/781.png differ diff --git a/Assets/Art/Level/24/image/785.png b/Assets/Art/Level/24/image/785.png index 26b0bda7..79db1bd2 100644 Binary files a/Assets/Art/Level/24/image/785.png and b/Assets/Art/Level/24/image/785.png differ diff --git a/Assets/Art/Level/24/image/789.png b/Assets/Art/Level/24/image/789.png index d7a5e67b..04cafecb 100644 Binary files a/Assets/Art/Level/24/image/789.png and b/Assets/Art/Level/24/image/789.png differ diff --git a/Assets/Art/Level/24/image/793.png b/Assets/Art/Level/24/image/793.png index bc6c7cbd..fa9e6892 100644 Binary files a/Assets/Art/Level/24/image/793.png and b/Assets/Art/Level/24/image/793.png differ diff --git a/Assets/Art/Level/24/image/795.png b/Assets/Art/Level/24/image/795.png index bdcb3631..ff2db1e2 100644 Binary files a/Assets/Art/Level/24/image/795.png and b/Assets/Art/Level/24/image/795.png differ diff --git a/Assets/Art/Level/24/image/797.png b/Assets/Art/Level/24/image/797.png index b2714767..9f5b5efc 100644 Binary files a/Assets/Art/Level/24/image/797.png and b/Assets/Art/Level/24/image/797.png differ diff --git a/Assets/Art/Level/24/image/800.png b/Assets/Art/Level/24/image/800.png index 6a23471b..b649ce87 100644 Binary files a/Assets/Art/Level/24/image/800.png and b/Assets/Art/Level/24/image/800.png differ diff --git a/Assets/Art/Level/24/image/803.png b/Assets/Art/Level/24/image/803.png index 24007195..b7962d18 100644 Binary files a/Assets/Art/Level/24/image/803.png and b/Assets/Art/Level/24/image/803.png differ diff --git a/Assets/Art/Level/24/image/810.png b/Assets/Art/Level/24/image/810.png index 28b3bcf7..b9b256db 100644 Binary files a/Assets/Art/Level/24/image/810.png and b/Assets/Art/Level/24/image/810.png differ diff --git a/Assets/Art/Level/24/image/820.png b/Assets/Art/Level/24/image/820.png index 729ee0f8..48e4bdc5 100644 Binary files a/Assets/Art/Level/24/image/820.png and b/Assets/Art/Level/24/image/820.png differ diff --git a/Assets/Art/Level/24/image/833.png b/Assets/Art/Level/24/image/833.png index 9703fb7d..e4156416 100644 Binary files a/Assets/Art/Level/24/image/833.png and b/Assets/Art/Level/24/image/833.png differ diff --git a/Assets/Art/Level/24/image/837.png b/Assets/Art/Level/24/image/837.png index e8a898f6..ed2da4ce 100644 Binary files a/Assets/Art/Level/24/image/837.png and b/Assets/Art/Level/24/image/837.png differ diff --git a/Assets/Art/Level/24/image/845.png b/Assets/Art/Level/24/image/845.png index 1e2203bf..f49734af 100644 Binary files a/Assets/Art/Level/24/image/845.png and b/Assets/Art/Level/24/image/845.png differ diff --git a/Assets/Art/Level/24/image/849_IMG_ITEM_CHARIN2.png b/Assets/Art/Level/24/image/849_IMG_ITEM_CHARIN2.png index 886ae9b2..e881d963 100644 Binary files a/Assets/Art/Level/24/image/849_IMG_ITEM_CHARIN2.png and b/Assets/Art/Level/24/image/849_IMG_ITEM_CHARIN2.png differ diff --git a/Assets/Art/Level/24/image/852_IMG_ITEM_PYON.png b/Assets/Art/Level/24/image/852_IMG_ITEM_PYON.png index b834dda8..1abef993 100644 Binary files a/Assets/Art/Level/24/image/852_IMG_ITEM_PYON.png and b/Assets/Art/Level/24/image/852_IMG_ITEM_PYON.png differ diff --git a/Assets/Art/Level/24/image/855_IMG_ITEM_PILTU2.png b/Assets/Art/Level/24/image/855_IMG_ITEM_PILTU2.png index 7130aa07..aa13dbac 100644 Binary files a/Assets/Art/Level/24/image/855_IMG_ITEM_PILTU2.png and b/Assets/Art/Level/24/image/855_IMG_ITEM_PILTU2.png differ diff --git a/Assets/Art/Level/25/image/1990.png b/Assets/Art/Level/25/image/1990.png index 74f813f9..42b16b97 100644 Binary files a/Assets/Art/Level/25/image/1990.png and b/Assets/Art/Level/25/image/1990.png differ diff --git a/Assets/Art/Level/25/image/1995.png b/Assets/Art/Level/25/image/1995.png index 6c05e539..f8c2ab12 100644 Binary files a/Assets/Art/Level/25/image/1995.png and b/Assets/Art/Level/25/image/1995.png differ diff --git a/Assets/Art/Level/25/image/1999.png b/Assets/Art/Level/25/image/1999.png index a881f6be..aa728575 100644 Binary files a/Assets/Art/Level/25/image/1999.png and b/Assets/Art/Level/25/image/1999.png differ diff --git a/Assets/Art/Level/25/image/2006.png b/Assets/Art/Level/25/image/2006.png index 5e02d190..d4119c7b 100644 Binary files a/Assets/Art/Level/25/image/2006.png and b/Assets/Art/Level/25/image/2006.png differ diff --git a/Assets/Art/Level/25/image/2010.png b/Assets/Art/Level/25/image/2010.png index f9ee54c6..a6019aee 100644 Binary files a/Assets/Art/Level/25/image/2010.png and b/Assets/Art/Level/25/image/2010.png differ diff --git a/Assets/Art/Level/25/image/2015.png b/Assets/Art/Level/25/image/2015.png index 08517d82..2fe59788 100644 Binary files a/Assets/Art/Level/25/image/2015.png and b/Assets/Art/Level/25/image/2015.png differ diff --git a/Assets/Art/Level/25/image/2021.png b/Assets/Art/Level/25/image/2021.png index edcca171..152ce3f5 100644 Binary files a/Assets/Art/Level/25/image/2021.png and b/Assets/Art/Level/25/image/2021.png differ diff --git a/Assets/Art/Level/25/image/2032.png b/Assets/Art/Level/25/image/2032.png index 46bcb037..88ff1631 100644 Binary files a/Assets/Art/Level/25/image/2032.png and b/Assets/Art/Level/25/image/2032.png differ diff --git a/Assets/Art/Level/25/image/2036.png b/Assets/Art/Level/25/image/2036.png index 8ed6d34e..6ae00101 100644 Binary files a/Assets/Art/Level/25/image/2036.png and b/Assets/Art/Level/25/image/2036.png differ diff --git a/Assets/Art/Level/25/image/2043.png b/Assets/Art/Level/25/image/2043.png index 212e5ffa..d93f187e 100644 Binary files a/Assets/Art/Level/25/image/2043.png and b/Assets/Art/Level/25/image/2043.png differ diff --git a/Assets/Art/Level/25/image/2051_IMG_ITEM_PERON.png b/Assets/Art/Level/25/image/2051_IMG_ITEM_PERON.png index be02aafd..bab17754 100644 Binary files a/Assets/Art/Level/25/image/2051_IMG_ITEM_PERON.png and b/Assets/Art/Level/25/image/2051_IMG_ITEM_PERON.png differ diff --git a/Assets/Art/Level/26/image/694.png b/Assets/Art/Level/26/image/694.png index f636c29b..13c0187b 100644 Binary files a/Assets/Art/Level/26/image/694.png and b/Assets/Art/Level/26/image/694.png differ diff --git a/Assets/Art/Level/26/image/696.png b/Assets/Art/Level/26/image/696.png index 94f95553..494e2c0f 100644 Binary files a/Assets/Art/Level/26/image/696.png and b/Assets/Art/Level/26/image/696.png differ diff --git a/Assets/Art/Level/26/image/699.png b/Assets/Art/Level/26/image/699.png index 4b54d6ed..a05ddde0 100644 Binary files a/Assets/Art/Level/26/image/699.png and b/Assets/Art/Level/26/image/699.png differ diff --git a/Assets/Art/Level/26/image/701.png b/Assets/Art/Level/26/image/701.png index bdc91591..0422abfc 100644 Binary files a/Assets/Art/Level/26/image/701.png and b/Assets/Art/Level/26/image/701.png differ diff --git a/Assets/Art/Level/26/image/704.png b/Assets/Art/Level/26/image/704.png index 5bfdbb61..aa88a23e 100644 Binary files a/Assets/Art/Level/26/image/704.png and b/Assets/Art/Level/26/image/704.png differ diff --git a/Assets/Art/Level/26/image/706.png b/Assets/Art/Level/26/image/706.png index 3e52c78f..1a3afc29 100644 Binary files a/Assets/Art/Level/26/image/706.png and b/Assets/Art/Level/26/image/706.png differ diff --git a/Assets/Art/Level/26/image/709.png b/Assets/Art/Level/26/image/709.png index 8aa66662..73094f06 100644 Binary files a/Assets/Art/Level/26/image/709.png and b/Assets/Art/Level/26/image/709.png differ diff --git a/Assets/Art/Level/26/image/712.png b/Assets/Art/Level/26/image/712.png index e8c80816..d62f281b 100644 Binary files a/Assets/Art/Level/26/image/712.png and b/Assets/Art/Level/26/image/712.png differ diff --git a/Assets/Art/Level/26/image/714.png b/Assets/Art/Level/26/image/714.png index b09a0223..8c3df0ab 100644 Binary files a/Assets/Art/Level/26/image/714.png and b/Assets/Art/Level/26/image/714.png differ diff --git a/Assets/Art/Level/26/image/716.png b/Assets/Art/Level/26/image/716.png index cc27c178..7c535f24 100644 Binary files a/Assets/Art/Level/26/image/716.png and b/Assets/Art/Level/26/image/716.png differ diff --git a/Assets/Art/Level/26/image/718.png b/Assets/Art/Level/26/image/718.png index b2b61e4e..dbf8024b 100644 Binary files a/Assets/Art/Level/26/image/718.png and b/Assets/Art/Level/26/image/718.png differ diff --git a/Assets/Art/Level/26/image/720.png b/Assets/Art/Level/26/image/720.png index fe28289f..c43a390d 100644 Binary files a/Assets/Art/Level/26/image/720.png and b/Assets/Art/Level/26/image/720.png differ diff --git a/Assets/Art/Level/26/image/722.png b/Assets/Art/Level/26/image/722.png index 870380ec..9994cfaf 100644 Binary files a/Assets/Art/Level/26/image/722.png and b/Assets/Art/Level/26/image/722.png differ diff --git a/Assets/Art/Level/26/image/724.png b/Assets/Art/Level/26/image/724.png index e062420e..69104871 100644 Binary files a/Assets/Art/Level/26/image/724.png and b/Assets/Art/Level/26/image/724.png differ diff --git a/Assets/Art/Level/26/image/726.png b/Assets/Art/Level/26/image/726.png index 46620787..20316e75 100644 Binary files a/Assets/Art/Level/26/image/726.png and b/Assets/Art/Level/26/image/726.png differ diff --git a/Assets/Art/Level/26/image/728.png b/Assets/Art/Level/26/image/728.png index f5fee9eb..4c98fc98 100644 Binary files a/Assets/Art/Level/26/image/728.png and b/Assets/Art/Level/26/image/728.png differ diff --git a/Assets/Art/Level/26/image/730.png b/Assets/Art/Level/26/image/730.png index 0dde3333..f33d47ff 100644 Binary files a/Assets/Art/Level/26/image/730.png and b/Assets/Art/Level/26/image/730.png differ diff --git a/Assets/Art/Level/26/image/732.png b/Assets/Art/Level/26/image/732.png index 2287c167..aa4fef6a 100644 Binary files a/Assets/Art/Level/26/image/732.png and b/Assets/Art/Level/26/image/732.png differ diff --git a/Assets/Art/Level/26/image/734.png b/Assets/Art/Level/26/image/734.png index 23765881..f803ce72 100644 Binary files a/Assets/Art/Level/26/image/734.png and b/Assets/Art/Level/26/image/734.png differ diff --git a/Assets/Art/Level/26/image/736.png b/Assets/Art/Level/26/image/736.png index d2179bd4..59e23b07 100644 Binary files a/Assets/Art/Level/26/image/736.png and b/Assets/Art/Level/26/image/736.png differ diff --git a/Assets/Art/Level/26/image/739.png b/Assets/Art/Level/26/image/739.png index 53d4a81e..89e73ce4 100644 Binary files a/Assets/Art/Level/26/image/739.png and b/Assets/Art/Level/26/image/739.png differ diff --git a/Assets/Art/Level/26/image/742.png b/Assets/Art/Level/26/image/742.png index 9ac578f4..7437d803 100644 Binary files a/Assets/Art/Level/26/image/742.png and b/Assets/Art/Level/26/image/742.png differ diff --git a/Assets/Art/Level/26/image/745.png b/Assets/Art/Level/26/image/745.png index ce29fbbf..7157faa2 100644 Binary files a/Assets/Art/Level/26/image/745.png and b/Assets/Art/Level/26/image/745.png differ diff --git a/Assets/Art/Level/26/image/748.png b/Assets/Art/Level/26/image/748.png index 4bad6ea4..1f03b38f 100644 Binary files a/Assets/Art/Level/26/image/748.png and b/Assets/Art/Level/26/image/748.png differ diff --git a/Assets/Art/Level/26/image/752.png b/Assets/Art/Level/26/image/752.png index 6a3a1de4..914b31b2 100644 Binary files a/Assets/Art/Level/26/image/752.png and b/Assets/Art/Level/26/image/752.png differ diff --git a/Assets/Art/Level/26/image/758.png b/Assets/Art/Level/26/image/758.png index 1289015d..7a4d3113 100644 Binary files a/Assets/Art/Level/26/image/758.png and b/Assets/Art/Level/26/image/758.png differ diff --git a/Assets/Art/Level/26/image/763_IMG_ITEM_BULILILI.png b/Assets/Art/Level/26/image/763_IMG_ITEM_BULILILI.png index f3445380..3c84fc3f 100644 Binary files a/Assets/Art/Level/26/image/763_IMG_ITEM_BULILILI.png and b/Assets/Art/Level/26/image/763_IMG_ITEM_BULILILI.png differ diff --git a/Assets/Art/Level/26/image/766_IMG_ITEM_SULTU2.png b/Assets/Art/Level/26/image/766_IMG_ITEM_SULTU2.png index b2c9a06a..abf3c18f 100644 Binary files a/Assets/Art/Level/26/image/766_IMG_ITEM_SULTU2.png and b/Assets/Art/Level/26/image/766_IMG_ITEM_SULTU2.png differ diff --git a/Assets/Art/Level/26/image/769_IMG_ITEM_SHORI.png b/Assets/Art/Level/26/image/769_IMG_ITEM_SHORI.png index ad0b6593..9c2c0b6d 100644 Binary files a/Assets/Art/Level/26/image/769_IMG_ITEM_SHORI.png and b/Assets/Art/Level/26/image/769_IMG_ITEM_SHORI.png differ diff --git a/Assets/Art/Level/27/image/2481.png b/Assets/Art/Level/27/image/2481.png index d73c205b..73dc52a0 100644 Binary files a/Assets/Art/Level/27/image/2481.png and b/Assets/Art/Level/27/image/2481.png differ diff --git a/Assets/Art/Level/27/image/2485.png b/Assets/Art/Level/27/image/2485.png index 0292f65c..00ab535d 100644 Binary files a/Assets/Art/Level/27/image/2485.png and b/Assets/Art/Level/27/image/2485.png differ diff --git a/Assets/Art/Level/27/image/2490.png b/Assets/Art/Level/27/image/2490.png index eb2caea0..ba31b017 100644 Binary files a/Assets/Art/Level/27/image/2490.png and b/Assets/Art/Level/27/image/2490.png differ diff --git a/Assets/Art/Level/27/image/2495.png b/Assets/Art/Level/27/image/2495.png index 26a84a04..f71bd7f4 100644 Binary files a/Assets/Art/Level/27/image/2495.png and b/Assets/Art/Level/27/image/2495.png differ diff --git a/Assets/Art/Level/27/image/2500.png b/Assets/Art/Level/27/image/2500.png index 14e81e5d..8382a43a 100644 Binary files a/Assets/Art/Level/27/image/2500.png and b/Assets/Art/Level/27/image/2500.png differ diff --git a/Assets/Art/Level/27/image/2502.png b/Assets/Art/Level/27/image/2502.png index 44f030bb..ee49a053 100644 Binary files a/Assets/Art/Level/27/image/2502.png and b/Assets/Art/Level/27/image/2502.png differ diff --git a/Assets/Art/Level/27/image/2508.png b/Assets/Art/Level/27/image/2508.png index b7769577..7ffee76b 100644 Binary files a/Assets/Art/Level/27/image/2508.png and b/Assets/Art/Level/27/image/2508.png differ diff --git a/Assets/Art/Level/27/image/2512.png b/Assets/Art/Level/27/image/2512.png index c74ba1fa..8156a661 100644 Binary files a/Assets/Art/Level/27/image/2512.png and b/Assets/Art/Level/27/image/2512.png differ diff --git a/Assets/Art/Level/27/image/2516_IMG_ITEM_U_.png b/Assets/Art/Level/27/image/2516_IMG_ITEM_U_.png index a1a7e0c6..705727b7 100644 Binary files a/Assets/Art/Level/27/image/2516_IMG_ITEM_U_.png and b/Assets/Art/Level/27/image/2516_IMG_ITEM_U_.png differ diff --git a/Assets/Art/Level/27/image/2519_IMG_ITEM_PI_PO_.png b/Assets/Art/Level/27/image/2519_IMG_ITEM_PI_PO_.png index d4b72adf..bd1c21ef 100644 Binary files a/Assets/Art/Level/27/image/2519_IMG_ITEM_PI_PO_.png and b/Assets/Art/Level/27/image/2519_IMG_ITEM_PI_PO_.png differ diff --git a/Assets/Art/Level/27/image/2522_IMG_ITEM_CHARIN.png b/Assets/Art/Level/27/image/2522_IMG_ITEM_CHARIN.png index cd72a1f3..9def6597 100644 Binary files a/Assets/Art/Level/27/image/2522_IMG_ITEM_CHARIN.png and b/Assets/Art/Level/27/image/2522_IMG_ITEM_CHARIN.png differ diff --git a/Assets/Art/Level/28/image/1309.png b/Assets/Art/Level/28/image/1309.png index a0414228..4e6e56b0 100644 Binary files a/Assets/Art/Level/28/image/1309.png and b/Assets/Art/Level/28/image/1309.png differ diff --git a/Assets/Art/Level/28/image/1311.png b/Assets/Art/Level/28/image/1311.png index c5fd1829..78171ca9 100644 Binary files a/Assets/Art/Level/28/image/1311.png and b/Assets/Art/Level/28/image/1311.png differ diff --git a/Assets/Art/Level/28/image/1313.png b/Assets/Art/Level/28/image/1313.png index 60ead8a9..0866b0dc 100644 Binary files a/Assets/Art/Level/28/image/1313.png and b/Assets/Art/Level/28/image/1313.png differ diff --git a/Assets/Art/Level/28/image/1319.png b/Assets/Art/Level/28/image/1319.png index 3f5dea47..ffad3d86 100644 Binary files a/Assets/Art/Level/28/image/1319.png and b/Assets/Art/Level/28/image/1319.png differ diff --git a/Assets/Art/Level/28/image/1322.png b/Assets/Art/Level/28/image/1322.png index 28780c8c..d3211f8b 100644 Binary files a/Assets/Art/Level/28/image/1322.png and b/Assets/Art/Level/28/image/1322.png differ diff --git a/Assets/Art/Level/28/image/1325.png b/Assets/Art/Level/28/image/1325.png index 9cea1b2c..bc43a95a 100644 Binary files a/Assets/Art/Level/28/image/1325.png and b/Assets/Art/Level/28/image/1325.png differ diff --git a/Assets/Art/Level/28/image/1327.png b/Assets/Art/Level/28/image/1327.png index bb81d58f..3f22a373 100644 Binary files a/Assets/Art/Level/28/image/1327.png and b/Assets/Art/Level/28/image/1327.png differ diff --git a/Assets/Art/Level/28/image/1330.png b/Assets/Art/Level/28/image/1330.png index ac0ccd26..a4478a35 100644 Binary files a/Assets/Art/Level/28/image/1330.png and b/Assets/Art/Level/28/image/1330.png differ diff --git a/Assets/Art/Level/28/image/1334.png b/Assets/Art/Level/28/image/1334.png index 1deee078..47443900 100644 Binary files a/Assets/Art/Level/28/image/1334.png and b/Assets/Art/Level/28/image/1334.png differ diff --git a/Assets/Art/Level/28/image/1336.png b/Assets/Art/Level/28/image/1336.png index ac5d60e6..5ef65fe9 100644 Binary files a/Assets/Art/Level/28/image/1336.png and b/Assets/Art/Level/28/image/1336.png differ diff --git a/Assets/Art/Level/28/image/1339.png b/Assets/Art/Level/28/image/1339.png index 83226426..67966781 100644 Binary files a/Assets/Art/Level/28/image/1339.png and b/Assets/Art/Level/28/image/1339.png differ diff --git a/Assets/Art/Level/28/image/1341.png b/Assets/Art/Level/28/image/1341.png index a7016888..6509a336 100644 Binary files a/Assets/Art/Level/28/image/1341.png and b/Assets/Art/Level/28/image/1341.png differ diff --git a/Assets/Art/Level/28/image/1344.png b/Assets/Art/Level/28/image/1344.png index 58991eab..f27e18d7 100644 Binary files a/Assets/Art/Level/28/image/1344.png and b/Assets/Art/Level/28/image/1344.png differ diff --git a/Assets/Art/Level/28/image/1346.png b/Assets/Art/Level/28/image/1346.png index 617a944a..c39e42cd 100644 Binary files a/Assets/Art/Level/28/image/1346.png and b/Assets/Art/Level/28/image/1346.png differ diff --git a/Assets/Art/Level/28/image/1350.png b/Assets/Art/Level/28/image/1350.png index d41faf4e..9bf59de2 100644 Binary files a/Assets/Art/Level/28/image/1350.png and b/Assets/Art/Level/28/image/1350.png differ diff --git a/Assets/Art/Level/28/image/1353.png b/Assets/Art/Level/28/image/1353.png index 87d129ad..240bb408 100644 Binary files a/Assets/Art/Level/28/image/1353.png and b/Assets/Art/Level/28/image/1353.png differ diff --git a/Assets/Art/Level/28/image/1356.png b/Assets/Art/Level/28/image/1356.png index 3e7d0fd2..1c582017 100644 Binary files a/Assets/Art/Level/28/image/1356.png and b/Assets/Art/Level/28/image/1356.png differ diff --git a/Assets/Art/Level/28/image/1362.png b/Assets/Art/Level/28/image/1362.png index 159cedd5..0828b0a7 100644 Binary files a/Assets/Art/Level/28/image/1362.png and b/Assets/Art/Level/28/image/1362.png differ diff --git a/Assets/Art/Level/28/image/1365.png b/Assets/Art/Level/28/image/1365.png index 2dfe9c1d..87c3da6a 100644 Binary files a/Assets/Art/Level/28/image/1365.png and b/Assets/Art/Level/28/image/1365.png differ diff --git a/Assets/Art/Level/28/image/1367.png b/Assets/Art/Level/28/image/1367.png index bf14e4c6..aa3ec059 100644 Binary files a/Assets/Art/Level/28/image/1367.png and b/Assets/Art/Level/28/image/1367.png differ diff --git a/Assets/Art/Level/28/image/1371.png b/Assets/Art/Level/28/image/1371.png index c3beddfb..27181ad5 100644 Binary files a/Assets/Art/Level/28/image/1371.png and b/Assets/Art/Level/28/image/1371.png differ diff --git a/Assets/Art/Level/28/image/1376.png b/Assets/Art/Level/28/image/1376.png index 04025f17..4a2034d5 100644 Binary files a/Assets/Art/Level/28/image/1376.png and b/Assets/Art/Level/28/image/1376.png differ diff --git a/Assets/Art/Level/28/image/1377.png b/Assets/Art/Level/28/image/1377.png index a309529d..630b2843 100644 Binary files a/Assets/Art/Level/28/image/1377.png and b/Assets/Art/Level/28/image/1377.png differ diff --git a/Assets/Art/Level/28/image/1378.png b/Assets/Art/Level/28/image/1378.png index 4be0e0ad..ba508fb3 100644 Binary files a/Assets/Art/Level/28/image/1378.png and b/Assets/Art/Level/28/image/1378.png differ diff --git a/Assets/Art/Level/28/image/1379.png b/Assets/Art/Level/28/image/1379.png index 8fcf7cef..cc6289d6 100644 Binary files a/Assets/Art/Level/28/image/1379.png and b/Assets/Art/Level/28/image/1379.png differ diff --git a/Assets/Art/Level/28/image/1383.png b/Assets/Art/Level/28/image/1383.png index 6912a467..21042cd3 100644 Binary files a/Assets/Art/Level/28/image/1383.png and b/Assets/Art/Level/28/image/1383.png differ diff --git a/Assets/Art/Level/28/image/1384.png b/Assets/Art/Level/28/image/1384.png index cbe6ad82..d7d3c21c 100644 Binary files a/Assets/Art/Level/28/image/1384.png and b/Assets/Art/Level/28/image/1384.png differ diff --git a/Assets/Art/Level/28/image/1386.png b/Assets/Art/Level/28/image/1386.png index 99eaa408..abbf6a12 100644 Binary files a/Assets/Art/Level/28/image/1386.png and b/Assets/Art/Level/28/image/1386.png differ diff --git a/Assets/Art/Level/28/image/1392.png b/Assets/Art/Level/28/image/1392.png index cda38fde..aeda97f3 100644 Binary files a/Assets/Art/Level/28/image/1392.png and b/Assets/Art/Level/28/image/1392.png differ diff --git a/Assets/Art/Level/28/image/1396.png b/Assets/Art/Level/28/image/1396.png index 5d2f2824..041f3118 100644 Binary files a/Assets/Art/Level/28/image/1396.png and b/Assets/Art/Level/28/image/1396.png differ diff --git a/Assets/Art/Level/28/image/1399.png b/Assets/Art/Level/28/image/1399.png index 0407cc88..10bcf751 100644 Binary files a/Assets/Art/Level/28/image/1399.png and b/Assets/Art/Level/28/image/1399.png differ diff --git a/Assets/Art/Level/28/image/1401.png b/Assets/Art/Level/28/image/1401.png index d96c2186..a271c116 100644 Binary files a/Assets/Art/Level/28/image/1401.png and b/Assets/Art/Level/28/image/1401.png differ diff --git a/Assets/Art/Level/28/image/1404.png b/Assets/Art/Level/28/image/1404.png index c452489a..2da5e2d3 100644 Binary files a/Assets/Art/Level/28/image/1404.png and b/Assets/Art/Level/28/image/1404.png differ diff --git a/Assets/Art/Level/28/image/1406.png b/Assets/Art/Level/28/image/1406.png index 70dc81bc..d0162545 100644 Binary files a/Assets/Art/Level/28/image/1406.png and b/Assets/Art/Level/28/image/1406.png differ diff --git a/Assets/Art/Level/28/image/1409.png b/Assets/Art/Level/28/image/1409.png index 8a574cdd..f37128d4 100644 Binary files a/Assets/Art/Level/28/image/1409.png and b/Assets/Art/Level/28/image/1409.png differ diff --git a/Assets/Art/Level/28/image/1412.png b/Assets/Art/Level/28/image/1412.png index 5bd68fdd..f446bced 100644 Binary files a/Assets/Art/Level/28/image/1412.png and b/Assets/Art/Level/28/image/1412.png differ diff --git a/Assets/Art/Level/28/image/1415.png b/Assets/Art/Level/28/image/1415.png index e8ca7b02..c76c2710 100644 Binary files a/Assets/Art/Level/28/image/1415.png and b/Assets/Art/Level/28/image/1415.png differ diff --git a/Assets/Art/Level/28/image/1418.png b/Assets/Art/Level/28/image/1418.png index 0072f4e0..90d1dd38 100644 Binary files a/Assets/Art/Level/28/image/1418.png and b/Assets/Art/Level/28/image/1418.png differ diff --git a/Assets/Art/Level/28/image/1420.png b/Assets/Art/Level/28/image/1420.png index dedb15d3..a43427cc 100644 Binary files a/Assets/Art/Level/28/image/1420.png and b/Assets/Art/Level/28/image/1420.png differ diff --git a/Assets/Art/Level/28/image/1428.png b/Assets/Art/Level/28/image/1428.png index 2e26e4c8..37596f39 100644 Binary files a/Assets/Art/Level/28/image/1428.png and b/Assets/Art/Level/28/image/1428.png differ diff --git a/Assets/Art/Level/28/image/1431.png b/Assets/Art/Level/28/image/1431.png index cf264796..0c2ca15f 100644 Binary files a/Assets/Art/Level/28/image/1431.png and b/Assets/Art/Level/28/image/1431.png differ diff --git a/Assets/Art/Level/28/image/1435.png b/Assets/Art/Level/28/image/1435.png index 36dc74a6..a67c7492 100644 Binary files a/Assets/Art/Level/28/image/1435.png and b/Assets/Art/Level/28/image/1435.png differ diff --git a/Assets/Art/Level/28/image/1444_IMG_ITEM_KYUIN.png b/Assets/Art/Level/28/image/1444_IMG_ITEM_KYUIN.png index 9a1f0e41..e9871a01 100644 Binary files a/Assets/Art/Level/28/image/1444_IMG_ITEM_KYUIN.png and b/Assets/Art/Level/28/image/1444_IMG_ITEM_KYUIN.png differ diff --git a/Assets/Art/Level/28/image/1447_IMG_ITEM_ZASHU2.png b/Assets/Art/Level/28/image/1447_IMG_ITEM_ZASHU2.png index b7c70304..9463cdc4 100644 Binary files a/Assets/Art/Level/28/image/1447_IMG_ITEM_ZASHU2.png and b/Assets/Art/Level/28/image/1447_IMG_ITEM_ZASHU2.png differ diff --git a/Assets/Art/Level/28/image/1450_IMG_ITEM_PALALA.png b/Assets/Art/Level/28/image/1450_IMG_ITEM_PALALA.png index 145621bc..537aa2d7 100644 Binary files a/Assets/Art/Level/28/image/1450_IMG_ITEM_PALALA.png and b/Assets/Art/Level/28/image/1450_IMG_ITEM_PALALA.png differ diff --git a/Assets/Art/Level/29/image/1739_IMG_ITEM_SULTU.png b/Assets/Art/Level/29/image/1739_IMG_ITEM_SULTU.png index 0328fdcb..e6f4d95e 100644 Binary files a/Assets/Art/Level/29/image/1739_IMG_ITEM_SULTU.png and b/Assets/Art/Level/29/image/1739_IMG_ITEM_SULTU.png differ diff --git a/Assets/Art/Level/29/image/2117.png b/Assets/Art/Level/29/image/2117.png index d8a6c87b..db7f3636 100644 Binary files a/Assets/Art/Level/29/image/2117.png and b/Assets/Art/Level/29/image/2117.png differ diff --git a/Assets/Art/Level/29/image/2118.png b/Assets/Art/Level/29/image/2118.png index 616eaca3..2a3b8220 100644 Binary files a/Assets/Art/Level/29/image/2118.png and b/Assets/Art/Level/29/image/2118.png differ diff --git a/Assets/Art/Level/29/image/2120.png b/Assets/Art/Level/29/image/2120.png index 5a29f6cb..7e4a3ef1 100644 Binary files a/Assets/Art/Level/29/image/2120.png and b/Assets/Art/Level/29/image/2120.png differ diff --git a/Assets/Art/Level/29/image/2130.png b/Assets/Art/Level/29/image/2130.png index ab8db5ce..b847cfbb 100644 Binary files a/Assets/Art/Level/29/image/2130.png and b/Assets/Art/Level/29/image/2130.png differ diff --git a/Assets/Art/Level/29/image/2141.png b/Assets/Art/Level/29/image/2141.png index df00a6a9..aa190008 100644 Binary files a/Assets/Art/Level/29/image/2141.png and b/Assets/Art/Level/29/image/2141.png differ diff --git a/Assets/Art/Level/29/image/2144.png b/Assets/Art/Level/29/image/2144.png index 4d41ba94..4a1d2e14 100644 Binary files a/Assets/Art/Level/29/image/2144.png and b/Assets/Art/Level/29/image/2144.png differ diff --git a/Assets/Art/Level/29/image/2147.png b/Assets/Art/Level/29/image/2147.png index 3e3745e1..32043cd4 100644 Binary files a/Assets/Art/Level/29/image/2147.png and b/Assets/Art/Level/29/image/2147.png differ diff --git a/Assets/Art/Level/29/image/2151.png b/Assets/Art/Level/29/image/2151.png index 2a8415a0..70901888 100644 Binary files a/Assets/Art/Level/29/image/2151.png and b/Assets/Art/Level/29/image/2151.png differ diff --git a/Assets/Art/Level/29/image/2155.png b/Assets/Art/Level/29/image/2155.png index 153e5561..c49301d3 100644 Binary files a/Assets/Art/Level/29/image/2155.png and b/Assets/Art/Level/29/image/2155.png differ diff --git a/Assets/Art/Level/29/image/2162.png b/Assets/Art/Level/29/image/2162.png index 31c85244..cc11f8f1 100644 Binary files a/Assets/Art/Level/29/image/2162.png and b/Assets/Art/Level/29/image/2162.png differ diff --git a/Assets/Art/Level/29/image/2167_IMG_ITEM_KOKELTU.png b/Assets/Art/Level/29/image/2167_IMG_ITEM_KOKELTU.png index cc2e165e..e38426ea 100644 Binary files a/Assets/Art/Level/29/image/2167_IMG_ITEM_KOKELTU.png and b/Assets/Art/Level/29/image/2167_IMG_ITEM_KOKELTU.png differ diff --git a/Assets/Art/Level/29/image/2170_IMG_ITEM_PURILTU.png b/Assets/Art/Level/29/image/2170_IMG_ITEM_PURILTU.png index f2a47706..d68972d3 100644 Binary files a/Assets/Art/Level/29/image/2170_IMG_ITEM_PURILTU.png and b/Assets/Art/Level/29/image/2170_IMG_ITEM_PURILTU.png differ diff --git a/Assets/Art/Level/3/image/2384.png b/Assets/Art/Level/3/image/2384.png index 4c57f5f0..94488e64 100644 Binary files a/Assets/Art/Level/3/image/2384.png and b/Assets/Art/Level/3/image/2384.png differ diff --git a/Assets/Art/Level/3/image/2385.png b/Assets/Art/Level/3/image/2385.png index a1a7baee..4801d739 100644 Binary files a/Assets/Art/Level/3/image/2385.png and b/Assets/Art/Level/3/image/2385.png differ diff --git a/Assets/Art/Level/3/image/2386.png b/Assets/Art/Level/3/image/2386.png index 40cf8bc2..91534390 100644 Binary files a/Assets/Art/Level/3/image/2386.png and b/Assets/Art/Level/3/image/2386.png differ diff --git a/Assets/Art/Level/3/image/2390.png b/Assets/Art/Level/3/image/2390.png index 2fe30eed..0f7fd169 100644 Binary files a/Assets/Art/Level/3/image/2390.png and b/Assets/Art/Level/3/image/2390.png differ diff --git a/Assets/Art/Level/3/image/2396.png b/Assets/Art/Level/3/image/2396.png index 118b698f..699c950d 100644 Binary files a/Assets/Art/Level/3/image/2396.png and b/Assets/Art/Level/3/image/2396.png differ diff --git a/Assets/Art/Level/3/image/2400.png b/Assets/Art/Level/3/image/2400.png index 5d0e9d16..81ff39f0 100644 Binary files a/Assets/Art/Level/3/image/2400.png and b/Assets/Art/Level/3/image/2400.png differ diff --git a/Assets/Art/Level/3/image/2404.png b/Assets/Art/Level/3/image/2404.png index 1ec0ffea..bf42d566 100644 Binary files a/Assets/Art/Level/3/image/2404.png and b/Assets/Art/Level/3/image/2404.png differ diff --git a/Assets/Art/Level/3/image/2407.png b/Assets/Art/Level/3/image/2407.png index f032e487..d6d60720 100644 Binary files a/Assets/Art/Level/3/image/2407.png and b/Assets/Art/Level/3/image/2407.png differ diff --git a/Assets/Art/Level/3/image/2408.png b/Assets/Art/Level/3/image/2408.png index 1fc7da6e..b5df905b 100644 Binary files a/Assets/Art/Level/3/image/2408.png and b/Assets/Art/Level/3/image/2408.png differ diff --git a/Assets/Art/Level/3/image/2410.png b/Assets/Art/Level/3/image/2410.png index 62fcf023..787cfa9f 100644 Binary files a/Assets/Art/Level/3/image/2410.png and b/Assets/Art/Level/3/image/2410.png differ diff --git a/Assets/Art/Level/3/image/2421.png b/Assets/Art/Level/3/image/2421.png index d58995a5..3099bed7 100644 Binary files a/Assets/Art/Level/3/image/2421.png and b/Assets/Art/Level/3/image/2421.png differ diff --git a/Assets/Art/Level/3/image/2430.png b/Assets/Art/Level/3/image/2430.png index 5b2e0212..c4f793c7 100644 Binary files a/Assets/Art/Level/3/image/2430.png and b/Assets/Art/Level/3/image/2430.png differ diff --git a/Assets/Art/Level/3/image/2437_IMG_ITEM_PUTU.png b/Assets/Art/Level/3/image/2437_IMG_ITEM_PUTU.png index 84a4b289..c5dafae6 100644 Binary files a/Assets/Art/Level/3/image/2437_IMG_ITEM_PUTU.png and b/Assets/Art/Level/3/image/2437_IMG_ITEM_PUTU.png differ diff --git a/Assets/Art/Level/3/image/2440_IMG_ITEM_PERILTU.png b/Assets/Art/Level/3/image/2440_IMG_ITEM_PERILTU.png index 51d33675..7049c1bc 100644 Binary files a/Assets/Art/Level/3/image/2440_IMG_ITEM_PERILTU.png and b/Assets/Art/Level/3/image/2440_IMG_ITEM_PERILTU.png differ diff --git a/Assets/Art/Level/3/image/2443_IMG_ITEM_MOSALTU.png b/Assets/Art/Level/3/image/2443_IMG_ITEM_MOSALTU.png index 964761e3..ddebe360 100644 Binary files a/Assets/Art/Level/3/image/2443_IMG_ITEM_MOSALTU.png and b/Assets/Art/Level/3/image/2443_IMG_ITEM_MOSALTU.png differ diff --git a/Assets/Art/Level/3/image/2446.png b/Assets/Art/Level/3/image/2446.png index 7664bec9..ab253df3 100644 Binary files a/Assets/Art/Level/3/image/2446.png and b/Assets/Art/Level/3/image/2446.png differ diff --git a/Assets/Art/Level/3/image/2448.png b/Assets/Art/Level/3/image/2448.png index 367d778c..40ae3ed1 100644 Binary files a/Assets/Art/Level/3/image/2448.png and b/Assets/Art/Level/3/image/2448.png differ diff --git a/Assets/Art/Level/30/image/2681.png b/Assets/Art/Level/30/image/2681.png index c199a1ef..df544348 100644 Binary files a/Assets/Art/Level/30/image/2681.png and b/Assets/Art/Level/30/image/2681.png differ diff --git a/Assets/Art/Level/30/image/2683.png b/Assets/Art/Level/30/image/2683.png index d5c9dcf3..988beae9 100644 Binary files a/Assets/Art/Level/30/image/2683.png and b/Assets/Art/Level/30/image/2683.png differ diff --git a/Assets/Art/Level/30/image/2686.png b/Assets/Art/Level/30/image/2686.png index c4911978..8aecd808 100644 Binary files a/Assets/Art/Level/30/image/2686.png and b/Assets/Art/Level/30/image/2686.png differ diff --git a/Assets/Art/Level/30/image/2690-1.png b/Assets/Art/Level/30/image/2690-1.png index 4cb91d89..085a1d3a 100644 Binary files a/Assets/Art/Level/30/image/2690-1.png and b/Assets/Art/Level/30/image/2690-1.png differ diff --git a/Assets/Art/Level/30/image/2690.png b/Assets/Art/Level/30/image/2690.png index fae4294a..554deb31 100644 Binary files a/Assets/Art/Level/30/image/2690.png and b/Assets/Art/Level/30/image/2690.png differ diff --git a/Assets/Art/Level/30/image/2694.png b/Assets/Art/Level/30/image/2694.png index f961b119..f124e5c8 100644 Binary files a/Assets/Art/Level/30/image/2694.png and b/Assets/Art/Level/30/image/2694.png differ diff --git a/Assets/Art/Level/30/image/2698.png b/Assets/Art/Level/30/image/2698.png index 3261d163..918147ca 100644 Binary files a/Assets/Art/Level/30/image/2698.png and b/Assets/Art/Level/30/image/2698.png differ diff --git a/Assets/Art/Level/30/image/2701.png b/Assets/Art/Level/30/image/2701.png index 9d727610..bd6e60fb 100644 Binary files a/Assets/Art/Level/30/image/2701.png and b/Assets/Art/Level/30/image/2701.png differ diff --git a/Assets/Art/Level/30/image/2708.png b/Assets/Art/Level/30/image/2708.png index 9e589c83..6d59c982 100644 Binary files a/Assets/Art/Level/30/image/2708.png and b/Assets/Art/Level/30/image/2708.png differ diff --git a/Assets/Art/Level/30/image/2713.png b/Assets/Art/Level/30/image/2713.png index 39f408f1..7a0c1977 100644 Binary files a/Assets/Art/Level/30/image/2713.png and b/Assets/Art/Level/30/image/2713.png differ diff --git a/Assets/Art/Level/30/image/2715.png b/Assets/Art/Level/30/image/2715.png index b91dc120..ffceb205 100644 Binary files a/Assets/Art/Level/30/image/2715.png and b/Assets/Art/Level/30/image/2715.png differ diff --git a/Assets/Art/Level/30/image/2719.png b/Assets/Art/Level/30/image/2719.png index 1fb2b6ba..e39e3b1e 100644 Binary files a/Assets/Art/Level/30/image/2719.png and b/Assets/Art/Level/30/image/2719.png differ diff --git a/Assets/Art/Level/30/image/2723-1.png b/Assets/Art/Level/30/image/2723-1.png index 42ae38f2..f66ea309 100644 Binary files a/Assets/Art/Level/30/image/2723-1.png and b/Assets/Art/Level/30/image/2723-1.png differ diff --git a/Assets/Art/Level/30/image/2723.png b/Assets/Art/Level/30/image/2723.png index 1790a051..b7b0aa53 100644 Binary files a/Assets/Art/Level/30/image/2723.png and b/Assets/Art/Level/30/image/2723.png differ diff --git a/Assets/Art/Level/30/image/2727.png b/Assets/Art/Level/30/image/2727.png index 565aec10..1323dd6d 100644 Binary files a/Assets/Art/Level/30/image/2727.png and b/Assets/Art/Level/30/image/2727.png differ diff --git a/Assets/Art/Level/30/image/2730.png b/Assets/Art/Level/30/image/2730.png index c1edfad2..a032d1b7 100644 Binary files a/Assets/Art/Level/30/image/2730.png and b/Assets/Art/Level/30/image/2730.png differ diff --git a/Assets/Art/Level/30/image/2733.png b/Assets/Art/Level/30/image/2733.png index 84ec810b..85587c5d 100644 Binary files a/Assets/Art/Level/30/image/2733.png and b/Assets/Art/Level/30/image/2733.png differ diff --git a/Assets/Art/Level/30/image/2738.png b/Assets/Art/Level/30/image/2738.png index 1393052b..8fd6baad 100644 Binary files a/Assets/Art/Level/30/image/2738.png and b/Assets/Art/Level/30/image/2738.png differ diff --git a/Assets/Art/Level/30/image/2742.png b/Assets/Art/Level/30/image/2742.png index 5b48108f..e098fc46 100644 Binary files a/Assets/Art/Level/30/image/2742.png and b/Assets/Art/Level/30/image/2742.png differ diff --git a/Assets/Art/Level/30/image/2746_IMG_ITEM_CHULTU.png b/Assets/Art/Level/30/image/2746_IMG_ITEM_CHULTU.png index 1334bafd..ffa5bb41 100644 Binary files a/Assets/Art/Level/30/image/2746_IMG_ITEM_CHULTU.png and b/Assets/Art/Level/30/image/2746_IMG_ITEM_CHULTU.png differ diff --git a/Assets/Art/Level/30/image/2749_IMG_ITEM_BUSHULTU.png b/Assets/Art/Level/30/image/2749_IMG_ITEM_BUSHULTU.png index 0520df6f..89cb14a1 100644 Binary files a/Assets/Art/Level/30/image/2749_IMG_ITEM_BUSHULTU.png and b/Assets/Art/Level/30/image/2749_IMG_ITEM_BUSHULTU.png differ diff --git a/Assets/Art/Level/30/image/2752_IMG_ITEM_KIN.png b/Assets/Art/Level/30/image/2752_IMG_ITEM_KIN.png index 35c04688..6afdfe50 100644 Binary files a/Assets/Art/Level/30/image/2752_IMG_ITEM_KIN.png and b/Assets/Art/Level/30/image/2752_IMG_ITEM_KIN.png differ diff --git a/Assets/Art/Level/31/image/004_3.png b/Assets/Art/Level/31/image/004_3.png index 615f4243..3e40a20d 100644 Binary files a/Assets/Art/Level/31/image/004_3.png and b/Assets/Art/Level/31/image/004_3.png differ diff --git a/Assets/Art/Level/31/image/008_3.png b/Assets/Art/Level/31/image/008_3.png index 344d449d..af55d6a8 100644 Binary files a/Assets/Art/Level/31/image/008_3.png and b/Assets/Art/Level/31/image/008_3.png differ diff --git a/Assets/Art/Level/31/image/1.png b/Assets/Art/Level/31/image/1.png index 056c02e8..576bc92a 100644 Binary files a/Assets/Art/Level/31/image/1.png and b/Assets/Art/Level/31/image/1.png differ diff --git a/Assets/Art/Level/31/image/1522.png b/Assets/Art/Level/31/image/1522.png index 827109a0..86023bc5 100644 Binary files a/Assets/Art/Level/31/image/1522.png and b/Assets/Art/Level/31/image/1522.png differ diff --git a/Assets/Art/Level/31/image/1524.png b/Assets/Art/Level/31/image/1524.png index 8e9d75b7..04fd7b9a 100644 Binary files a/Assets/Art/Level/31/image/1524.png and b/Assets/Art/Level/31/image/1524.png differ diff --git a/Assets/Art/Level/31/image/1526.png b/Assets/Art/Level/31/image/1526.png index 4904cb1c..e7531c01 100644 Binary files a/Assets/Art/Level/31/image/1526.png and b/Assets/Art/Level/31/image/1526.png differ diff --git a/Assets/Art/Level/31/image/2.png b/Assets/Art/Level/31/image/2.png index 174156c6..6f60bb38 100644 Binary files a/Assets/Art/Level/31/image/2.png and b/Assets/Art/Level/31/image/2.png differ diff --git a/Assets/Art/Level/31/image/2448.png b/Assets/Art/Level/31/image/2448.png index 367d778c..87e983f3 100644 Binary files a/Assets/Art/Level/31/image/2448.png and b/Assets/Art/Level/31/image/2448.png differ diff --git a/Assets/Art/Level/31/image/Born_fries.png b/Assets/Art/Level/31/image/Born_fries.png index d634340e..e583a7a2 100644 Binary files a/Assets/Art/Level/31/image/Born_fries.png and b/Assets/Art/Level/31/image/Born_fries.png differ diff --git a/Assets/Art/Level/31/image/Born_fries_mask.png b/Assets/Art/Level/31/image/Born_fries_mask.png index 5f86998c..87c12f75 100644 Binary files a/Assets/Art/Level/31/image/Born_fries_mask.png and b/Assets/Art/Level/31/image/Born_fries_mask.png differ diff --git a/Assets/Art/Level/31/image/UI.png b/Assets/Art/Level/31/image/UI.png index 3d4054a4..81515655 100644 Binary files a/Assets/Art/Level/31/image/UI.png and b/Assets/Art/Level/31/image/UI.png differ diff --git a/Assets/Art/Level/31/image/bowl.png b/Assets/Art/Level/31/image/bowl.png index fb0a69fc..4d2350f1 100644 Binary files a/Assets/Art/Level/31/image/bowl.png and b/Assets/Art/Level/31/image/bowl.png differ diff --git a/Assets/Art/Level/31/image/bowl1.png b/Assets/Art/Level/31/image/bowl1.png index 3d346609..baaffad1 100644 Binary files a/Assets/Art/Level/31/image/bowl1.png and b/Assets/Art/Level/31/image/bowl1.png differ diff --git a/Assets/Art/Level/31/image/bowl2.png b/Assets/Art/Level/31/image/bowl2.png index c368444c..3aef6dc4 100644 Binary files a/Assets/Art/Level/31/image/bowl2.png and b/Assets/Art/Level/31/image/bowl2.png differ diff --git a/Assets/Art/Level/31/image/chip-mask.png b/Assets/Art/Level/31/image/chip-mask.png index f11cdca9..1e7ad318 100644 Binary files a/Assets/Art/Level/31/image/chip-mask.png and b/Assets/Art/Level/31/image/chip-mask.png differ diff --git a/Assets/Art/Level/31/image/chip.png b/Assets/Art/Level/31/image/chip.png index 7234c835..1b383703 100644 Binary files a/Assets/Art/Level/31/image/chip.png and b/Assets/Art/Level/31/image/chip.png differ diff --git a/Assets/Art/Level/31/image/chip1.png b/Assets/Art/Level/31/image/chip1.png index 7329d09e..e9f58346 100644 Binary files a/Assets/Art/Level/31/image/chip1.png and b/Assets/Art/Level/31/image/chip1.png differ diff --git a/Assets/Art/Level/31/image/faucet.png b/Assets/Art/Level/31/image/faucet.png index 316cc32b..765d4f56 100644 Binary files a/Assets/Art/Level/31/image/faucet.png and b/Assets/Art/Level/31/image/faucet.png differ diff --git a/Assets/Art/Level/31/image/french_fires.png b/Assets/Art/Level/31/image/french_fires.png index f3dd5774..832d3b82 100644 Binary files a/Assets/Art/Level/31/image/french_fires.png and b/Assets/Art/Level/31/image/french_fires.png differ diff --git a/Assets/Art/Level/31/image/french_fires_mask.png b/Assets/Art/Level/31/image/french_fires_mask.png index 74ab1679..30f6bf56 100644 Binary files a/Assets/Art/Level/31/image/french_fires_mask.png and b/Assets/Art/Level/31/image/french_fires_mask.png differ diff --git a/Assets/Art/Level/31/image/knife.png b/Assets/Art/Level/31/image/knife.png index 5a33aa59..9fc81f5b 100644 Binary files a/Assets/Art/Level/31/image/knife.png and b/Assets/Art/Level/31/image/knife.png differ diff --git a/Assets/Art/Level/31/image/mash.png b/Assets/Art/Level/31/image/mash.png index 23946853..ace8ca2d 100644 Binary files a/Assets/Art/Level/31/image/mash.png and b/Assets/Art/Level/31/image/mash.png differ diff --git a/Assets/Art/Level/31/image/mash_hu.png b/Assets/Art/Level/31/image/mash_hu.png index 136452ef..ff243bf2 100644 Binary files a/Assets/Art/Level/31/image/mash_hu.png and b/Assets/Art/Level/31/image/mash_hu.png differ diff --git a/Assets/Art/Level/31/image/mash_mask.png b/Assets/Art/Level/31/image/mash_mask.png index 532ac5c0..cfdb69a5 100644 Binary files a/Assets/Art/Level/31/image/mash_mask.png and b/Assets/Art/Level/31/image/mash_mask.png differ diff --git a/Assets/Art/Level/31/image/oil1.png b/Assets/Art/Level/31/image/oil1.png index 89d00da8..a8946444 100644 Binary files a/Assets/Art/Level/31/image/oil1.png and b/Assets/Art/Level/31/image/oil1.png differ diff --git a/Assets/Art/Level/31/image/oil2.png b/Assets/Art/Level/31/image/oil2.png index 172eb87a..adc7c06e 100644 Binary files a/Assets/Art/Level/31/image/oil2.png and b/Assets/Art/Level/31/image/oil2.png differ diff --git a/Assets/Art/Level/31/image/plate.png b/Assets/Art/Level/31/image/plate.png index abcbe135..6a382007 100644 Binary files a/Assets/Art/Level/31/image/plate.png and b/Assets/Art/Level/31/image/plate.png differ diff --git a/Assets/Art/Level/31/image/potato.png b/Assets/Art/Level/31/image/potato.png index 000276d9..cd15ca2b 100644 Binary files a/Assets/Art/Level/31/image/potato.png and b/Assets/Art/Level/31/image/potato.png differ diff --git a/Assets/Art/Level/31/image/potato1.png b/Assets/Art/Level/31/image/potato1.png index a27f7767..7737ca34 100644 Binary files a/Assets/Art/Level/31/image/potato1.png and b/Assets/Art/Level/31/image/potato1.png differ diff --git a/Assets/Art/Level/31/image/potato2.png b/Assets/Art/Level/31/image/potato2.png index 3b79528f..07c0fe92 100644 Binary files a/Assets/Art/Level/31/image/potato2.png and b/Assets/Art/Level/31/image/potato2.png differ diff --git a/Assets/Art/Level/31/image/potato3.png b/Assets/Art/Level/31/image/potato3.png index 604f65e2..da0671e1 100644 Binary files a/Assets/Art/Level/31/image/potato3.png and b/Assets/Art/Level/31/image/potato3.png differ diff --git a/Assets/Art/Level/31/image/potato4.png b/Assets/Art/Level/31/image/potato4.png index 503dfbb7..b81f9f28 100644 Binary files a/Assets/Art/Level/31/image/potato4.png and b/Assets/Art/Level/31/image/potato4.png differ diff --git a/Assets/Art/Level/31/image/potato5.png b/Assets/Art/Level/31/image/potato5.png index a8c62414..00339845 100644 Binary files a/Assets/Art/Level/31/image/potato5.png and b/Assets/Art/Level/31/image/potato5.png differ diff --git a/Assets/Art/Level/31/image/potato6.png b/Assets/Art/Level/31/image/potato6.png index 7d264f77..418fb025 100644 Binary files a/Assets/Art/Level/31/image/potato6.png and b/Assets/Art/Level/31/image/potato6.png differ diff --git a/Assets/Art/Level/31/image/potato7.png b/Assets/Art/Level/31/image/potato7.png index 8cff903c..f76d2970 100644 Binary files a/Assets/Art/Level/31/image/potato7.png and b/Assets/Art/Level/31/image/potato7.png differ diff --git a/Assets/Art/Level/31/image/potato8.png b/Assets/Art/Level/31/image/potato8.png index 70596ab1..15e612a7 100644 Binary files a/Assets/Art/Level/31/image/potato8.png and b/Assets/Art/Level/31/image/potato8.png differ diff --git a/Assets/Art/Level/31/image/potato9.png b/Assets/Art/Level/31/image/potato9.png index cb31ebf2..45485e62 100644 Binary files a/Assets/Art/Level/31/image/potato9.png and b/Assets/Art/Level/31/image/potato9.png differ diff --git a/Assets/Art/Level/31/image/potato_chip.png b/Assets/Art/Level/31/image/potato_chip.png index 12a7d76e..6d5feaf9 100644 Binary files a/Assets/Art/Level/31/image/potato_chip.png and b/Assets/Art/Level/31/image/potato_chip.png differ diff --git a/Assets/Art/Level/31/image/potato_chip_mask.png b/Assets/Art/Level/31/image/potato_chip_mask.png index 20ced4cf..87a7f70d 100644 Binary files a/Assets/Art/Level/31/image/potato_chip_mask.png and b/Assets/Art/Level/31/image/potato_chip_mask.png differ diff --git a/Assets/Art/Level/31/image/potato_chips.png b/Assets/Art/Level/31/image/potato_chips.png index 0f611d78..8a0b7c82 100644 Binary files a/Assets/Art/Level/31/image/potato_chips.png and b/Assets/Art/Level/31/image/potato_chips.png differ diff --git a/Assets/Art/Level/31/image/potato_chips1.png b/Assets/Art/Level/31/image/potato_chips1.png index 6cbbb7ea..36c16961 100644 Binary files a/Assets/Art/Level/31/image/potato_chips1.png and b/Assets/Art/Level/31/image/potato_chips1.png differ diff --git a/Assets/Art/Level/31/image/potato_chips1_mask.png b/Assets/Art/Level/31/image/potato_chips1_mask.png index bae6e844..7416353e 100644 Binary files a/Assets/Art/Level/31/image/potato_chips1_mask.png and b/Assets/Art/Level/31/image/potato_chips1_mask.png differ diff --git a/Assets/Art/Level/31/image/potato_chips_mask.png b/Assets/Art/Level/31/image/potato_chips_mask.png index 70fe46d5..8734650a 100644 Binary files a/Assets/Art/Level/31/image/potato_chips_mask.png and b/Assets/Art/Level/31/image/potato_chips_mask.png differ diff --git a/Assets/Art/Level/31/image/potato_mask.png b/Assets/Art/Level/31/image/potato_mask.png index 4166d3a1..59deddb6 100644 Binary files a/Assets/Art/Level/31/image/potato_mask.png and b/Assets/Art/Level/31/image/potato_mask.png differ diff --git a/Assets/Art/Level/31/image/reqi.png b/Assets/Art/Level/31/image/reqi.png index 34cb96a5..101697a8 100644 Binary files a/Assets/Art/Level/31/image/reqi.png and b/Assets/Art/Level/31/image/reqi.png differ diff --git a/Assets/Art/Level/31/image/star1.png b/Assets/Art/Level/31/image/star1.png index 7fa5b995..23e72d45 100644 Binary files a/Assets/Art/Level/31/image/star1.png and b/Assets/Art/Level/31/image/star1.png differ diff --git a/Assets/Art/Level/31/image/star2.png b/Assets/Art/Level/31/image/star2.png index fca157e9..035eabe3 100644 Binary files a/Assets/Art/Level/31/image/star2.png and b/Assets/Art/Level/31/image/star2.png differ diff --git a/Assets/Art/Level/31/image/water1.png b/Assets/Art/Level/31/image/water1.png index 1cd1705e..9e092bc7 100644 Binary files a/Assets/Art/Level/31/image/water1.png and b/Assets/Art/Level/31/image/water1.png differ diff --git a/Assets/Art/Level/31/image/water2.png b/Assets/Art/Level/31/image/water2.png index 4ee51a0f..937d8e67 100644 Binary files a/Assets/Art/Level/31/image/water2.png and b/Assets/Art/Level/31/image/water2.png differ diff --git a/Assets/Art/Level/31/image/zizi.png b/Assets/Art/Level/31/image/zizi.png index db7adc77..00845615 100644 Binary files a/Assets/Art/Level/31/image/zizi.png and b/Assets/Art/Level/31/image/zizi.png differ diff --git a/Assets/Art/Level/33/image/2377_IMG_ITEM_WIN 1.png b/Assets/Art/Level/33/image/2377_IMG_ITEM_WIN 1.png index 41837515..f48771dd 100644 Binary files a/Assets/Art/Level/33/image/2377_IMG_ITEM_WIN 1.png and b/Assets/Art/Level/33/image/2377_IMG_ITEM_WIN 1.png differ diff --git a/Assets/Art/Level/33/image/852_IMG_ITEM_PYON 1.png b/Assets/Art/Level/33/image/852_IMG_ITEM_PYON 1.png index f44f6d9d..f8ad9497 100644 Binary files a/Assets/Art/Level/33/image/852_IMG_ITEM_PYON 1.png and b/Assets/Art/Level/33/image/852_IMG_ITEM_PYON 1.png differ diff --git a/Assets/Art/Level/33/image/boy-v.png b/Assets/Art/Level/33/image/boy-v.png index 3014ca7f..4bfe1c56 100644 Binary files a/Assets/Art/Level/33/image/boy-v.png and b/Assets/Art/Level/33/image/boy-v.png differ diff --git a/Assets/Art/Level/33/image/boy.png b/Assets/Art/Level/33/image/boy.png index e67367fb..1b29b83f 100644 Binary files a/Assets/Art/Level/33/image/boy.png and b/Assets/Art/Level/33/image/boy.png differ diff --git a/Assets/Art/Level/33/image/boyface-angry1.png b/Assets/Art/Level/33/image/boyface-angry1.png index 011c24bf..e8f51652 100644 Binary files a/Assets/Art/Level/33/image/boyface-angry1.png and b/Assets/Art/Level/33/image/boyface-angry1.png differ diff --git a/Assets/Art/Level/33/image/boyface-angry2.png b/Assets/Art/Level/33/image/boyface-angry2.png index 03e0a8ad..b811d327 100644 Binary files a/Assets/Art/Level/33/image/boyface-angry2.png and b/Assets/Art/Level/33/image/boyface-angry2.png differ diff --git a/Assets/Art/Level/33/image/boyface-pia.png b/Assets/Art/Level/33/image/boyface-pia.png index 7082a552..cbd86c24 100644 Binary files a/Assets/Art/Level/33/image/boyface-pia.png and b/Assets/Art/Level/33/image/boyface-pia.png differ diff --git a/Assets/Art/Level/33/image/boyhand -pia-down.png b/Assets/Art/Level/33/image/boyhand -pia-down.png index cf24e92e..92f4c58c 100644 Binary files a/Assets/Art/Level/33/image/boyhand -pia-down.png and b/Assets/Art/Level/33/image/boyhand -pia-down.png differ diff --git a/Assets/Art/Level/33/image/boyhand -pia-up.png b/Assets/Art/Level/33/image/boyhand -pia-up.png index fcdfe816..4ca7e925 100644 Binary files a/Assets/Art/Level/33/image/boyhand -pia-up.png and b/Assets/Art/Level/33/image/boyhand -pia-up.png differ diff --git a/Assets/Art/Level/33/image/boyhand -up.png b/Assets/Art/Level/33/image/boyhand -up.png index 3317692f..3e34044e 100644 Binary files a/Assets/Art/Level/33/image/boyhand -up.png and b/Assets/Art/Level/33/image/boyhand -up.png differ diff --git a/Assets/Art/Level/33/image/boyhand-disperse1.png b/Assets/Art/Level/33/image/boyhand-disperse1.png index 93712a88..d96be6ee 100644 Binary files a/Assets/Art/Level/33/image/boyhand-disperse1.png and b/Assets/Art/Level/33/image/boyhand-disperse1.png differ diff --git a/Assets/Art/Level/33/image/boyhand-disperse2.png b/Assets/Art/Level/33/image/boyhand-disperse2.png index 8b560d1f..00523b25 100644 Binary files a/Assets/Art/Level/33/image/boyhand-disperse2.png and b/Assets/Art/Level/33/image/boyhand-disperse2.png differ diff --git a/Assets/Art/Level/33/image/boyhand.png b/Assets/Art/Level/33/image/boyhand.png index 633b3146..73d73de4 100644 Binary files a/Assets/Art/Level/33/image/boyhand.png and b/Assets/Art/Level/33/image/boyhand.png differ diff --git a/Assets/Art/Level/33/image/fly-dead.png b/Assets/Art/Level/33/image/fly-dead.png index 6d4ff2e9..3713922a 100644 Binary files a/Assets/Art/Level/33/image/fly-dead.png and b/Assets/Art/Level/33/image/fly-dead.png differ diff --git a/Assets/Art/Level/33/image/fly-deadG1.png b/Assets/Art/Level/33/image/fly-deadG1.png index b46427ab..ada9fb0c 100644 Binary files a/Assets/Art/Level/33/image/fly-deadG1.png and b/Assets/Art/Level/33/image/fly-deadG1.png differ diff --git a/Assets/Art/Level/33/image/fly-deadG2.png b/Assets/Art/Level/33/image/fly-deadG2.png index b6990ca6..75043713 100644 Binary files a/Assets/Art/Level/33/image/fly-deadG2.png and b/Assets/Art/Level/33/image/fly-deadG2.png differ diff --git a/Assets/Art/Level/33/image/girl-infly.png b/Assets/Art/Level/33/image/girl-infly.png index 522c7967..f33d0e3f 100644 Binary files a/Assets/Art/Level/33/image/girl-infly.png and b/Assets/Art/Level/33/image/girl-infly.png differ diff --git a/Assets/Art/Level/33/image/girl-lose-1.png b/Assets/Art/Level/33/image/girl-lose-1.png index 3a0d7aa1..0e6a0e0f 100644 Binary files a/Assets/Art/Level/33/image/girl-lose-1.png and b/Assets/Art/Level/33/image/girl-lose-1.png differ diff --git a/Assets/Art/Level/33/image/girl-lose-2.png b/Assets/Art/Level/33/image/girl-lose-2.png index 554f8b4b..5949afdc 100644 Binary files a/Assets/Art/Level/33/image/girl-lose-2.png and b/Assets/Art/Level/33/image/girl-lose-2.png differ diff --git a/Assets/Art/Level/33/image/girl-v0.png b/Assets/Art/Level/33/image/girl-v0.png index a87837d1..a417a061 100644 Binary files a/Assets/Art/Level/33/image/girl-v0.png and b/Assets/Art/Level/33/image/girl-v0.png differ diff --git a/Assets/Art/Level/33/image/girl.png b/Assets/Art/Level/33/image/girl.png index 94b6ec81..4c2646d3 100644 Binary files a/Assets/Art/Level/33/image/girl.png and b/Assets/Art/Level/33/image/girl.png differ diff --git a/Assets/Art/Level/33/image/paizi.png b/Assets/Art/Level/33/image/paizi.png index b9bf91f3..a21c8afa 100644 Binary files a/Assets/Art/Level/33/image/paizi.png and b/Assets/Art/Level/33/image/paizi.png differ diff --git a/Assets/Art/Level/34/image/0.png b/Assets/Art/Level/34/image/0.png index 4c1e89f6..3325b688 100644 Binary files a/Assets/Art/Level/34/image/0.png and b/Assets/Art/Level/34/image/0.png differ diff --git a/Assets/Art/Level/34/image/1.png b/Assets/Art/Level/34/image/1.png index 6d8b5afa..df09908c 100644 Binary files a/Assets/Art/Level/34/image/1.png and b/Assets/Art/Level/34/image/1.png differ diff --git a/Assets/Art/Level/34/image/10.png b/Assets/Art/Level/34/image/10.png index 502bcfe6..8f190054 100644 Binary files a/Assets/Art/Level/34/image/10.png and b/Assets/Art/Level/34/image/10.png differ diff --git a/Assets/Art/Level/34/image/11.png b/Assets/Art/Level/34/image/11.png index 1918a5d3..4e77838b 100644 Binary files a/Assets/Art/Level/34/image/11.png and b/Assets/Art/Level/34/image/11.png differ diff --git a/Assets/Art/Level/34/image/12.png b/Assets/Art/Level/34/image/12.png index ba547069..1b7b62de 100644 Binary files a/Assets/Art/Level/34/image/12.png and b/Assets/Art/Level/34/image/12.png differ diff --git a/Assets/Art/Level/34/image/13.png b/Assets/Art/Level/34/image/13.png index 74c086af..585c8c10 100644 Binary files a/Assets/Art/Level/34/image/13.png and b/Assets/Art/Level/34/image/13.png differ diff --git a/Assets/Art/Level/34/image/14.png b/Assets/Art/Level/34/image/14.png index 771d80d8..1d9ec90f 100644 Binary files a/Assets/Art/Level/34/image/14.png and b/Assets/Art/Level/34/image/14.png differ diff --git a/Assets/Art/Level/34/image/15.png b/Assets/Art/Level/34/image/15.png index 5047be3c..77012175 100644 Binary files a/Assets/Art/Level/34/image/15.png and b/Assets/Art/Level/34/image/15.png differ diff --git a/Assets/Art/Level/34/image/16.png b/Assets/Art/Level/34/image/16.png index 47f81f17..25233106 100644 Binary files a/Assets/Art/Level/34/image/16.png and b/Assets/Art/Level/34/image/16.png differ diff --git a/Assets/Art/Level/34/image/17.png b/Assets/Art/Level/34/image/17.png index b9f2cfde..16e68648 100644 Binary files a/Assets/Art/Level/34/image/17.png and b/Assets/Art/Level/34/image/17.png differ diff --git a/Assets/Art/Level/34/image/18.png b/Assets/Art/Level/34/image/18.png index 7d064656..b16aaf66 100644 Binary files a/Assets/Art/Level/34/image/18.png and b/Assets/Art/Level/34/image/18.png differ diff --git a/Assets/Art/Level/34/image/19.png b/Assets/Art/Level/34/image/19.png index fd11c92c..2a993c08 100644 Binary files a/Assets/Art/Level/34/image/19.png and b/Assets/Art/Level/34/image/19.png differ diff --git a/Assets/Art/Level/34/image/1_1.png b/Assets/Art/Level/34/image/1_1.png index 056c02e8..ff16fcab 100644 Binary files a/Assets/Art/Level/34/image/1_1.png and b/Assets/Art/Level/34/image/1_1.png differ diff --git a/Assets/Art/Level/34/image/2.png b/Assets/Art/Level/34/image/2.png index f272e7a1..5f806f83 100644 Binary files a/Assets/Art/Level/34/image/2.png and b/Assets/Art/Level/34/image/2.png differ diff --git a/Assets/Art/Level/34/image/20.png b/Assets/Art/Level/34/image/20.png index f9fae63b..9a0bde7e 100644 Binary files a/Assets/Art/Level/34/image/20.png and b/Assets/Art/Level/34/image/20.png differ diff --git a/Assets/Art/Level/34/image/21.png b/Assets/Art/Level/34/image/21.png index 0de10e5f..75774ad6 100644 Binary files a/Assets/Art/Level/34/image/21.png and b/Assets/Art/Level/34/image/21.png differ diff --git a/Assets/Art/Level/34/image/22.png b/Assets/Art/Level/34/image/22.png index cf1cd647..92174106 100644 Binary files a/Assets/Art/Level/34/image/22.png and b/Assets/Art/Level/34/image/22.png differ diff --git a/Assets/Art/Level/34/image/23.png b/Assets/Art/Level/34/image/23.png index 5fbef2c6..69555d14 100644 Binary files a/Assets/Art/Level/34/image/23.png and b/Assets/Art/Level/34/image/23.png differ diff --git a/Assets/Art/Level/34/image/24.png b/Assets/Art/Level/34/image/24.png index fbbdf904..3fa4d6a9 100644 Binary files a/Assets/Art/Level/34/image/24.png and b/Assets/Art/Level/34/image/24.png differ diff --git a/Assets/Art/Level/34/image/25.png b/Assets/Art/Level/34/image/25.png index a7de8103..f9c34435 100644 Binary files a/Assets/Art/Level/34/image/25.png and b/Assets/Art/Level/34/image/25.png differ diff --git a/Assets/Art/Level/34/image/26.png b/Assets/Art/Level/34/image/26.png index 90a588de..ca1b1299 100644 Binary files a/Assets/Art/Level/34/image/26.png and b/Assets/Art/Level/34/image/26.png differ diff --git a/Assets/Art/Level/34/image/27.png b/Assets/Art/Level/34/image/27.png index 7a2319b5..7db717f6 100644 Binary files a/Assets/Art/Level/34/image/27.png and b/Assets/Art/Level/34/image/27.png differ diff --git a/Assets/Art/Level/34/image/28.png b/Assets/Art/Level/34/image/28.png index 8e5912f5..208523d6 100644 Binary files a/Assets/Art/Level/34/image/28.png and b/Assets/Art/Level/34/image/28.png differ diff --git a/Assets/Art/Level/34/image/29.png b/Assets/Art/Level/34/image/29.png index 028b2546..e47f2052 100644 Binary files a/Assets/Art/Level/34/image/29.png and b/Assets/Art/Level/34/image/29.png differ diff --git a/Assets/Art/Level/34/image/2_2.png b/Assets/Art/Level/34/image/2_2.png index 174156c6..9877318d 100644 Binary files a/Assets/Art/Level/34/image/2_2.png and b/Assets/Art/Level/34/image/2_2.png differ diff --git a/Assets/Art/Level/34/image/3.png b/Assets/Art/Level/34/image/3.png index 2d12b80a..fc50199e 100644 Binary files a/Assets/Art/Level/34/image/3.png and b/Assets/Art/Level/34/image/3.png differ diff --git a/Assets/Art/Level/34/image/30.png b/Assets/Art/Level/34/image/30.png index dc052057..e640a9fa 100644 Binary files a/Assets/Art/Level/34/image/30.png and b/Assets/Art/Level/34/image/30.png differ diff --git a/Assets/Art/Level/34/image/31.png b/Assets/Art/Level/34/image/31.png index 094bbe11..b4c39a00 100644 Binary files a/Assets/Art/Level/34/image/31.png and b/Assets/Art/Level/34/image/31.png differ diff --git a/Assets/Art/Level/34/image/4.png b/Assets/Art/Level/34/image/4.png index 59da0931..7196e217 100644 Binary files a/Assets/Art/Level/34/image/4.png and b/Assets/Art/Level/34/image/4.png differ diff --git a/Assets/Art/Level/34/image/5.png b/Assets/Art/Level/34/image/5.png index da207ce1..d25390be 100644 Binary files a/Assets/Art/Level/34/image/5.png and b/Assets/Art/Level/34/image/5.png differ diff --git a/Assets/Art/Level/34/image/6.png b/Assets/Art/Level/34/image/6.png index 60acbbae..b00a7c87 100644 Binary files a/Assets/Art/Level/34/image/6.png and b/Assets/Art/Level/34/image/6.png differ diff --git a/Assets/Art/Level/34/image/7.png b/Assets/Art/Level/34/image/7.png index bea1200f..7491f89d 100644 Binary files a/Assets/Art/Level/34/image/7.png and b/Assets/Art/Level/34/image/7.png differ diff --git a/Assets/Art/Level/34/image/8.png b/Assets/Art/Level/34/image/8.png index e739bde1..b3bbada8 100644 Binary files a/Assets/Art/Level/34/image/8.png and b/Assets/Art/Level/34/image/8.png differ diff --git a/Assets/Art/Level/34/image/9.png b/Assets/Art/Level/34/image/9.png index 2907cb43..b2bb726a 100644 Binary files a/Assets/Art/Level/34/image/9.png and b/Assets/Art/Level/34/image/9.png differ diff --git a/Assets/Art/Level/34/image/voice1.png b/Assets/Art/Level/34/image/voice1.png index 7b52361c..32e3a3e2 100644 Binary files a/Assets/Art/Level/34/image/voice1.png and b/Assets/Art/Level/34/image/voice1.png differ diff --git a/Assets/Art/Level/34/image/voice2.png b/Assets/Art/Level/34/image/voice2.png index 2e780edb..d3c7fadf 100644 Binary files a/Assets/Art/Level/34/image/voice2.png and b/Assets/Art/Level/34/image/voice2.png differ diff --git a/Assets/Art/Level/34/image/voice3.png b/Assets/Art/Level/34/image/voice3.png index 0a55fefa..1ed5a8df 100644 Binary files a/Assets/Art/Level/34/image/voice3.png and b/Assets/Art/Level/34/image/voice3.png differ diff --git a/Assets/Art/Level/35/image/0.png b/Assets/Art/Level/35/image/0.png index 578365bb..9722b7da 100644 Binary files a/Assets/Art/Level/35/image/0.png and b/Assets/Art/Level/35/image/0.png differ diff --git a/Assets/Art/Level/35/image/2.png b/Assets/Art/Level/35/image/2.png index a96faa05..549516c4 100644 Binary files a/Assets/Art/Level/35/image/2.png and b/Assets/Art/Level/35/image/2.png differ diff --git a/Assets/Art/Level/35/image/3.png b/Assets/Art/Level/35/image/3.png index c8c21086..72ab7fe6 100644 Binary files a/Assets/Art/Level/35/image/3.png and b/Assets/Art/Level/35/image/3.png differ diff --git a/Assets/Art/Level/35/image/5.png b/Assets/Art/Level/35/image/5.png index b934d314..de5a6fce 100644 Binary files a/Assets/Art/Level/35/image/5.png and b/Assets/Art/Level/35/image/5.png differ diff --git a/Assets/Art/Level/35/image/bg.png b/Assets/Art/Level/35/image/bg.png index 8ac53894..bf9ebc41 100644 Binary files a/Assets/Art/Level/35/image/bg.png and b/Assets/Art/Level/35/image/bg.png differ diff --git a/Assets/Art/Level/35/image/blackboard.png b/Assets/Art/Level/35/image/blackboard.png index f246e9c7..4d70503b 100644 Binary files a/Assets/Art/Level/35/image/blackboard.png and b/Assets/Art/Level/35/image/blackboard.png differ diff --git a/Assets/Art/Level/35/image/boy-cry-2.png b/Assets/Art/Level/35/image/boy-cry-2.png index cb1d2be0..9a404871 100644 Binary files a/Assets/Art/Level/35/image/boy-cry-2.png and b/Assets/Art/Level/35/image/boy-cry-2.png differ diff --git a/Assets/Art/Level/35/image/boy-cry.png b/Assets/Art/Level/35/image/boy-cry.png index 5d3fe0dc..eefe42b6 100644 Binary files a/Assets/Art/Level/35/image/boy-cry.png and b/Assets/Art/Level/35/image/boy-cry.png differ diff --git a/Assets/Art/Level/35/image/boy-happy-2.png b/Assets/Art/Level/35/image/boy-happy-2.png index a75d0b6e..ea977385 100644 Binary files a/Assets/Art/Level/35/image/boy-happy-2.png and b/Assets/Art/Level/35/image/boy-happy-2.png differ diff --git a/Assets/Art/Level/35/image/boy-happy.png b/Assets/Art/Level/35/image/boy-happy.png index f0d5a5b5..1cc82494 100644 Binary files a/Assets/Art/Level/35/image/boy-happy.png and b/Assets/Art/Level/35/image/boy-happy.png differ diff --git a/Assets/Art/Level/35/image/boy-sad.png b/Assets/Art/Level/35/image/boy-sad.png index a3c8b30c..d22754c3 100644 Binary files a/Assets/Art/Level/35/image/boy-sad.png and b/Assets/Art/Level/35/image/boy-sad.png differ diff --git a/Assets/Art/Level/35/image/boy-stupid.png b/Assets/Art/Level/35/image/boy-stupid.png index 92213349..b9120a22 100644 Binary files a/Assets/Art/Level/35/image/boy-stupid.png and b/Assets/Art/Level/35/image/boy-stupid.png differ diff --git a/Assets/Art/Level/35/image/hand-1.png b/Assets/Art/Level/35/image/hand-1.png index b205c392..7bd60aa8 100644 Binary files a/Assets/Art/Level/35/image/hand-1.png and b/Assets/Art/Level/35/image/hand-1.png differ diff --git a/Assets/Art/Level/35/image/hand-2.png b/Assets/Art/Level/35/image/hand-2.png index 8609ccdd..e6375ac5 100644 Binary files a/Assets/Art/Level/35/image/hand-2.png and b/Assets/Art/Level/35/image/hand-2.png differ diff --git a/Assets/Art/Level/35/image/hand-3-3.png b/Assets/Art/Level/35/image/hand-3-3.png index 64d8335e..6cf7218c 100644 Binary files a/Assets/Art/Level/35/image/hand-3-3.png and b/Assets/Art/Level/35/image/hand-3-3.png differ diff --git a/Assets/Art/Level/35/image/point-0.png b/Assets/Art/Level/35/image/point-0.png index 063a676f..ca03ea3a 100644 Binary files a/Assets/Art/Level/35/image/point-0.png and b/Assets/Art/Level/35/image/point-0.png differ diff --git a/Assets/Art/Level/35/image/point-100.png b/Assets/Art/Level/35/image/point-100.png index 98bd3155..06eb3bc0 100644 Binary files a/Assets/Art/Level/35/image/point-100.png and b/Assets/Art/Level/35/image/point-100.png differ diff --git a/Assets/Art/Level/35/image/pop.png b/Assets/Art/Level/35/image/pop.png index 65e8ba44..8271de13 100644 Binary files a/Assets/Art/Level/35/image/pop.png and b/Assets/Art/Level/35/image/pop.png differ diff --git a/Assets/Art/Level/35/image/preview35.png b/Assets/Art/Level/35/image/preview35.png index 23b3fd8b..2a75e779 100644 Binary files a/Assets/Art/Level/35/image/preview35.png and b/Assets/Art/Level/35/image/preview35.png differ diff --git a/Assets/Art/Level/35/image/rubber.png b/Assets/Art/Level/35/image/rubber.png index da6afa17..932e24e0 100644 Binary files a/Assets/Art/Level/35/image/rubber.png and b/Assets/Art/Level/35/image/rubber.png differ diff --git a/Assets/Art/Level/35/image/select35.png b/Assets/Art/Level/35/image/select35.png index 3b5f7935..95a9c49a 100644 Binary files a/Assets/Art/Level/35/image/select35.png and b/Assets/Art/Level/35/image/select35.png differ diff --git a/Assets/Art/Level/35/image/testpaper-1-1.png b/Assets/Art/Level/35/image/testpaper-1-1.png index a2b8e874..0d3a29b1 100644 Binary files a/Assets/Art/Level/35/image/testpaper-1-1.png and b/Assets/Art/Level/35/image/testpaper-1-1.png differ diff --git a/Assets/Art/Level/35/image/testpaper-3(1).png b/Assets/Art/Level/35/image/testpaper-3(1).png index da2fb01a..a6dd92fc 100644 Binary files a/Assets/Art/Level/35/image/testpaper-3(1).png and b/Assets/Art/Level/35/image/testpaper-3(1).png differ diff --git a/Assets/Art/Level/35/image/testpaper-3-3(1).png b/Assets/Art/Level/35/image/testpaper-3-3(1).png index f24058e2..c68f3210 100644 Binary files a/Assets/Art/Level/35/image/testpaper-3-3(1).png and b/Assets/Art/Level/35/image/testpaper-3-3(1).png differ diff --git a/Assets/Art/Level/35/image/testpaper-3-3.png b/Assets/Art/Level/35/image/testpaper-3-3.png index 8fce1792..70b50db5 100644 Binary files a/Assets/Art/Level/35/image/testpaper-3-3.png and b/Assets/Art/Level/35/image/testpaper-3-3.png differ diff --git a/Assets/Art/Level/35/image/testpaper-3.png b/Assets/Art/Level/35/image/testpaper-3.png index 1aa9a230..a456a15a 100644 Binary files a/Assets/Art/Level/35/image/testpaper-3.png and b/Assets/Art/Level/35/image/testpaper-3.png differ diff --git a/Assets/Art/Level/35/image/testpaper.png b/Assets/Art/Level/35/image/testpaper.png index 4700e9c4..a783ce8c 100644 Binary files a/Assets/Art/Level/35/image/testpaper.png and b/Assets/Art/Level/35/image/testpaper.png differ diff --git a/Assets/Art/Level/35/image/titletext35.png b/Assets/Art/Level/35/image/titletext35.png index e97aab57..15ae5a73 100644 Binary files a/Assets/Art/Level/35/image/titletext35.png and b/Assets/Art/Level/35/image/titletext35.png differ diff --git a/Assets/Art/Level/35/image/voice1.png b/Assets/Art/Level/35/image/voice1.png index 26416b82..7a91792a 100644 Binary files a/Assets/Art/Level/35/image/voice1.png and b/Assets/Art/Level/35/image/voice1.png differ diff --git a/Assets/Art/Level/35/image/voice2.png b/Assets/Art/Level/35/image/voice2.png index 9e064f32..f462dc00 100644 Binary files a/Assets/Art/Level/35/image/voice2.png and b/Assets/Art/Level/35/image/voice2.png differ diff --git a/Assets/Art/Level/35/image/voice3.png b/Assets/Art/Level/35/image/voice3.png index 11444764..6a063b78 100644 Binary files a/Assets/Art/Level/35/image/voice3.png and b/Assets/Art/Level/35/image/voice3.png differ diff --git a/Assets/Art/Level/4/image/1635.png b/Assets/Art/Level/4/image/1635.png index 34cb96a5..0523e5b1 100644 Binary files a/Assets/Art/Level/4/image/1635.png and b/Assets/Art/Level/4/image/1635.png differ diff --git a/Assets/Art/Level/4/image/2526.png b/Assets/Art/Level/4/image/2526.png index 49b91936..34c9fdec 100644 Binary files a/Assets/Art/Level/4/image/2526.png and b/Assets/Art/Level/4/image/2526.png differ diff --git a/Assets/Art/Level/4/image/2529.png b/Assets/Art/Level/4/image/2529.png index fada745a..99c49605 100644 Binary files a/Assets/Art/Level/4/image/2529.png and b/Assets/Art/Level/4/image/2529.png differ diff --git a/Assets/Art/Level/4/image/2533.png b/Assets/Art/Level/4/image/2533.png index 369a66b5..f063bbe1 100644 Binary files a/Assets/Art/Level/4/image/2533.png and b/Assets/Art/Level/4/image/2533.png differ diff --git a/Assets/Art/Level/4/image/2535.png b/Assets/Art/Level/4/image/2535.png index d413ab79..8ef5efcd 100644 Binary files a/Assets/Art/Level/4/image/2535.png and b/Assets/Art/Level/4/image/2535.png differ diff --git a/Assets/Art/Level/4/image/2538.png b/Assets/Art/Level/4/image/2538.png index e19b20d3..202ee58c 100644 Binary files a/Assets/Art/Level/4/image/2538.png and b/Assets/Art/Level/4/image/2538.png differ diff --git a/Assets/Art/Level/4/image/2542.png b/Assets/Art/Level/4/image/2542.png index f9140ea9..842eacbc 100644 Binary files a/Assets/Art/Level/4/image/2542.png and b/Assets/Art/Level/4/image/2542.png differ diff --git a/Assets/Art/Level/4/image/2546.png b/Assets/Art/Level/4/image/2546.png index 1fa40b78..e51bae18 100644 Binary files a/Assets/Art/Level/4/image/2546.png and b/Assets/Art/Level/4/image/2546.png differ diff --git a/Assets/Art/Level/4/image/2549.png b/Assets/Art/Level/4/image/2549.png index cf30c471..c71bc7f4 100644 Binary files a/Assets/Art/Level/4/image/2549.png and b/Assets/Art/Level/4/image/2549.png differ diff --git a/Assets/Art/Level/4/image/2553.png b/Assets/Art/Level/4/image/2553.png index b2b48918..ea6fc129 100644 Binary files a/Assets/Art/Level/4/image/2553.png and b/Assets/Art/Level/4/image/2553.png differ diff --git a/Assets/Art/Level/4/image/2558.png b/Assets/Art/Level/4/image/2558.png index 954b189f..7a0d5fd7 100644 Binary files a/Assets/Art/Level/4/image/2558.png and b/Assets/Art/Level/4/image/2558.png differ diff --git a/Assets/Art/Level/4/image/2561.png b/Assets/Art/Level/4/image/2561.png index ff06a69a..e2d81ccf 100644 Binary files a/Assets/Art/Level/4/image/2561.png and b/Assets/Art/Level/4/image/2561.png differ diff --git a/Assets/Art/Level/4/image/2566.png b/Assets/Art/Level/4/image/2566.png index 9859ad43..bd1e65e4 100644 Binary files a/Assets/Art/Level/4/image/2566.png and b/Assets/Art/Level/4/image/2566.png differ diff --git a/Assets/Art/Level/4/image/2570.png b/Assets/Art/Level/4/image/2570.png index c00135f6..08bf397e 100644 Binary files a/Assets/Art/Level/4/image/2570.png and b/Assets/Art/Level/4/image/2570.png differ diff --git a/Assets/Art/Level/4/image/2576.png b/Assets/Art/Level/4/image/2576.png index 5599c6c0..9d948c8f 100644 Binary files a/Assets/Art/Level/4/image/2576.png and b/Assets/Art/Level/4/image/2576.png differ diff --git a/Assets/Art/Level/4/image/2579.png b/Assets/Art/Level/4/image/2579.png index 5e53ed27..840dea5f 100644 Binary files a/Assets/Art/Level/4/image/2579.png and b/Assets/Art/Level/4/image/2579.png differ diff --git a/Assets/Art/Level/4/image/2582.png b/Assets/Art/Level/4/image/2582.png index af2a36f2..91347079 100644 Binary files a/Assets/Art/Level/4/image/2582.png and b/Assets/Art/Level/4/image/2582.png differ diff --git a/Assets/Art/Level/4/image/2591_IMG_ITEM_FULU.png b/Assets/Art/Level/4/image/2591_IMG_ITEM_FULU.png index b60109f1..6e09c33c 100644 Binary files a/Assets/Art/Level/4/image/2591_IMG_ITEM_FULU.png and b/Assets/Art/Level/4/image/2591_IMG_ITEM_FULU.png differ diff --git a/Assets/Art/Level/4/image/2592.png b/Assets/Art/Level/4/image/2592.png index c6b4bd22..4df2757f 100644 Binary files a/Assets/Art/Level/4/image/2592.png and b/Assets/Art/Level/4/image/2592.png differ diff --git a/Assets/Art/Level/4/image/2598_IMG_ITEM_GOKU.png b/Assets/Art/Level/4/image/2598_IMG_ITEM_GOKU.png index 37933646..75245a30 100644 Binary files a/Assets/Art/Level/4/image/2598_IMG_ITEM_GOKU.png and b/Assets/Art/Level/4/image/2598_IMG_ITEM_GOKU.png differ diff --git a/Assets/Art/Level/4/image/2601_IMG_ITEM_ZUZU.png b/Assets/Art/Level/4/image/2601_IMG_ITEM_ZUZU.png index b06951ae..bfb4aae1 100644 Binary files a/Assets/Art/Level/4/image/2601_IMG_ITEM_ZUZU.png and b/Assets/Art/Level/4/image/2601_IMG_ITEM_ZUZU.png differ diff --git a/Assets/Art/Level/42/image/1845.png b/Assets/Art/Level/42/image/1845.png index 8057ef26..a13c6ff9 100644 Binary files a/Assets/Art/Level/42/image/1845.png and b/Assets/Art/Level/42/image/1845.png differ diff --git a/Assets/Art/Level/42/image/1847.png b/Assets/Art/Level/42/image/1847.png index 18c68e90..e06caf28 100644 Binary files a/Assets/Art/Level/42/image/1847.png and b/Assets/Art/Level/42/image/1847.png differ diff --git a/Assets/Art/Level/42/image/1850.png b/Assets/Art/Level/42/image/1850.png index 0aadf124..4fa33562 100644 Binary files a/Assets/Art/Level/42/image/1850.png and b/Assets/Art/Level/42/image/1850.png differ diff --git a/Assets/Art/Level/42/image/1852.png b/Assets/Art/Level/42/image/1852.png index a4b971c3..cf6565a0 100644 Binary files a/Assets/Art/Level/42/image/1852.png and b/Assets/Art/Level/42/image/1852.png differ diff --git a/Assets/Art/Level/42/image/1856.png b/Assets/Art/Level/42/image/1856.png index 65c15334..baf23c2b 100644 Binary files a/Assets/Art/Level/42/image/1856.png and b/Assets/Art/Level/42/image/1856.png differ diff --git a/Assets/Art/Level/42/image/1859.png b/Assets/Art/Level/42/image/1859.png index 634c942b..8eda60ed 100644 Binary files a/Assets/Art/Level/42/image/1859.png and b/Assets/Art/Level/42/image/1859.png differ diff --git a/Assets/Art/Level/42/image/1862.png b/Assets/Art/Level/42/image/1862.png index 04f04b02..6cbbf5a4 100644 Binary files a/Assets/Art/Level/42/image/1862.png and b/Assets/Art/Level/42/image/1862.png differ diff --git a/Assets/Art/Level/42/image/1866.png b/Assets/Art/Level/42/image/1866.png index 799698c3..8b4a49be 100644 Binary files a/Assets/Art/Level/42/image/1866.png and b/Assets/Art/Level/42/image/1866.png differ diff --git a/Assets/Art/Level/42/image/1873.png b/Assets/Art/Level/42/image/1873.png index 6bbebbe7..1e81212b 100644 Binary files a/Assets/Art/Level/42/image/1873.png and b/Assets/Art/Level/42/image/1873.png differ diff --git a/Assets/Art/Level/42/image/1876.png b/Assets/Art/Level/42/image/1876.png index 14c94408..6b0e7cb2 100644 Binary files a/Assets/Art/Level/42/image/1876.png and b/Assets/Art/Level/42/image/1876.png differ diff --git a/Assets/Art/Level/42/image/1880.png b/Assets/Art/Level/42/image/1880.png index 35340bbb..54a162f6 100644 Binary files a/Assets/Art/Level/42/image/1880.png and b/Assets/Art/Level/42/image/1880.png differ diff --git a/Assets/Art/Level/42/image/1887.png b/Assets/Art/Level/42/image/1887.png index 0d0a2845..2c001cdd 100644 Binary files a/Assets/Art/Level/42/image/1887.png and b/Assets/Art/Level/42/image/1887.png differ diff --git a/Assets/Art/Level/42/image/1890.png b/Assets/Art/Level/42/image/1890.png index 4c790335..855e970a 100644 Binary files a/Assets/Art/Level/42/image/1890.png and b/Assets/Art/Level/42/image/1890.png differ diff --git a/Assets/Art/Level/42/image/1894.png b/Assets/Art/Level/42/image/1894.png index c92f424b..1725b232 100644 Binary files a/Assets/Art/Level/42/image/1894.png and b/Assets/Art/Level/42/image/1894.png differ diff --git a/Assets/Art/Level/42/image/1901.png b/Assets/Art/Level/42/image/1901.png index 16fa2887..1a235cda 100644 Binary files a/Assets/Art/Level/42/image/1901.png and b/Assets/Art/Level/42/image/1901.png differ diff --git a/Assets/Art/Level/42/image/1905.png b/Assets/Art/Level/42/image/1905.png index e72268bf..b603ba1b 100644 Binary files a/Assets/Art/Level/42/image/1905.png and b/Assets/Art/Level/42/image/1905.png differ diff --git a/Assets/Art/Level/42/image/1909.png b/Assets/Art/Level/42/image/1909.png index 706b0be8..f6823ce3 100644 Binary files a/Assets/Art/Level/42/image/1909.png and b/Assets/Art/Level/42/image/1909.png differ diff --git a/Assets/Art/Level/42/image/2291.png b/Assets/Art/Level/42/image/2291.png index 140112c1..5d2cd788 100644 Binary files a/Assets/Art/Level/42/image/2291.png and b/Assets/Art/Level/42/image/2291.png differ diff --git a/Assets/Art/Level/42/image/2305.png b/Assets/Art/Level/42/image/2305.png index dbe231cc..4e8321fb 100644 Binary files a/Assets/Art/Level/42/image/2305.png and b/Assets/Art/Level/42/image/2305.png differ diff --git a/Assets/Art/Level/42/image/2319.png b/Assets/Art/Level/42/image/2319.png index 560a78b5..d26845a3 100644 Binary files a/Assets/Art/Level/42/image/2319.png and b/Assets/Art/Level/42/image/2319.png differ diff --git a/Assets/Art/Level/42/image/2335_IMG_ITEM_BI_.png b/Assets/Art/Level/42/image/2335_IMG_ITEM_BI_.png index a0aec63c..5a628bd3 100644 Binary files a/Assets/Art/Level/42/image/2335_IMG_ITEM_BI_.png and b/Assets/Art/Level/42/image/2335_IMG_ITEM_BI_.png differ diff --git a/Assets/Art/Level/42/image/2338_IMG_ITEM_PULU_.png b/Assets/Art/Level/42/image/2338_IMG_ITEM_PULU_.png index 024ae4b6..9446bbe7 100644 Binary files a/Assets/Art/Level/42/image/2338_IMG_ITEM_PULU_.png and b/Assets/Art/Level/42/image/2338_IMG_ITEM_PULU_.png differ diff --git a/Assets/Art/Level/42/image/2341_IMG_ITEM_BOFULTU.png b/Assets/Art/Level/42/image/2341_IMG_ITEM_BOFULTU.png index 6af220f1..ec14cff0 100644 Binary files a/Assets/Art/Level/42/image/2341_IMG_ITEM_BOFULTU.png and b/Assets/Art/Level/42/image/2341_IMG_ITEM_BOFULTU.png differ diff --git a/Assets/Art/Level/45/image/1.png b/Assets/Art/Level/45/image/1.png index c779f9ff..25dcb64d 100644 Binary files a/Assets/Art/Level/45/image/1.png and b/Assets/Art/Level/45/image/1.png differ diff --git a/Assets/Art/Level/45/image/10.png b/Assets/Art/Level/45/image/10.png index 8ab466d2..47602854 100644 Binary files a/Assets/Art/Level/45/image/10.png and b/Assets/Art/Level/45/image/10.png differ diff --git a/Assets/Art/Level/45/image/11.png b/Assets/Art/Level/45/image/11.png index d92b27a3..8289a283 100644 Binary files a/Assets/Art/Level/45/image/11.png and b/Assets/Art/Level/45/image/11.png differ diff --git a/Assets/Art/Level/45/image/12.png b/Assets/Art/Level/45/image/12.png index 9e6ab79f..6777b2a3 100644 Binary files a/Assets/Art/Level/45/image/12.png and b/Assets/Art/Level/45/image/12.png differ diff --git a/Assets/Art/Level/45/image/13.png b/Assets/Art/Level/45/image/13.png index 8c0bb6a5..9943b2ba 100644 Binary files a/Assets/Art/Level/45/image/13.png and b/Assets/Art/Level/45/image/13.png differ diff --git a/Assets/Art/Level/45/image/14.png b/Assets/Art/Level/45/image/14.png index 544216f7..a0946fe3 100644 Binary files a/Assets/Art/Level/45/image/14.png and b/Assets/Art/Level/45/image/14.png differ diff --git a/Assets/Art/Level/45/image/15.png b/Assets/Art/Level/45/image/15.png index 9b220c7d..43551178 100644 Binary files a/Assets/Art/Level/45/image/15.png and b/Assets/Art/Level/45/image/15.png differ diff --git a/Assets/Art/Level/45/image/16.png b/Assets/Art/Level/45/image/16.png index d38f589f..516485c0 100644 Binary files a/Assets/Art/Level/45/image/16.png and b/Assets/Art/Level/45/image/16.png differ diff --git a/Assets/Art/Level/45/image/17.png b/Assets/Art/Level/45/image/17.png index efe2d524..0cc5a23c 100644 Binary files a/Assets/Art/Level/45/image/17.png and b/Assets/Art/Level/45/image/17.png differ diff --git a/Assets/Art/Level/45/image/18.png b/Assets/Art/Level/45/image/18.png index ec2a5289..78aa3edb 100644 Binary files a/Assets/Art/Level/45/image/18.png and b/Assets/Art/Level/45/image/18.png differ diff --git a/Assets/Art/Level/45/image/19.png b/Assets/Art/Level/45/image/19.png index 4c6f8c36..a2e4598e 100644 Binary files a/Assets/Art/Level/45/image/19.png and b/Assets/Art/Level/45/image/19.png differ diff --git a/Assets/Art/Level/45/image/2.png b/Assets/Art/Level/45/image/2.png index 7a444e66..c58ffaab 100644 Binary files a/Assets/Art/Level/45/image/2.png and b/Assets/Art/Level/45/image/2.png differ diff --git a/Assets/Art/Level/45/image/20.png b/Assets/Art/Level/45/image/20.png index 91847114..429d95f8 100644 Binary files a/Assets/Art/Level/45/image/20.png and b/Assets/Art/Level/45/image/20.png differ diff --git a/Assets/Art/Level/45/image/21.png b/Assets/Art/Level/45/image/21.png index a397c77f..769e7f4a 100644 Binary files a/Assets/Art/Level/45/image/21.png and b/Assets/Art/Level/45/image/21.png differ diff --git a/Assets/Art/Level/45/image/22.png b/Assets/Art/Level/45/image/22.png index 67c908cf..4c4b6aa6 100644 Binary files a/Assets/Art/Level/45/image/22.png and b/Assets/Art/Level/45/image/22.png differ diff --git a/Assets/Art/Level/45/image/23.png b/Assets/Art/Level/45/image/23.png index 6478e14c..fd3d000e 100644 Binary files a/Assets/Art/Level/45/image/23.png and b/Assets/Art/Level/45/image/23.png differ diff --git a/Assets/Art/Level/45/image/24.png b/Assets/Art/Level/45/image/24.png index bcf14f5d..124b522d 100644 Binary files a/Assets/Art/Level/45/image/24.png and b/Assets/Art/Level/45/image/24.png differ diff --git a/Assets/Art/Level/45/image/25.png b/Assets/Art/Level/45/image/25.png index 5ef950a5..2a481e61 100644 Binary files a/Assets/Art/Level/45/image/25.png and b/Assets/Art/Level/45/image/25.png differ diff --git a/Assets/Art/Level/45/image/26.png b/Assets/Art/Level/45/image/26.png index e1c5dcf2..9f2a99f8 100644 Binary files a/Assets/Art/Level/45/image/26.png and b/Assets/Art/Level/45/image/26.png differ diff --git a/Assets/Art/Level/45/image/27.png b/Assets/Art/Level/45/image/27.png index 2d448fe8..fbd7c41a 100644 Binary files a/Assets/Art/Level/45/image/27.png and b/Assets/Art/Level/45/image/27.png differ diff --git a/Assets/Art/Level/45/image/28.png b/Assets/Art/Level/45/image/28.png index f7a0e00f..d5577eee 100644 Binary files a/Assets/Art/Level/45/image/28.png and b/Assets/Art/Level/45/image/28.png differ diff --git a/Assets/Art/Level/45/image/29.png b/Assets/Art/Level/45/image/29.png index 112e43c2..0910770c 100644 Binary files a/Assets/Art/Level/45/image/29.png and b/Assets/Art/Level/45/image/29.png differ diff --git a/Assets/Art/Level/45/image/3.png b/Assets/Art/Level/45/image/3.png index e49903c9..3883f1ea 100644 Binary files a/Assets/Art/Level/45/image/3.png and b/Assets/Art/Level/45/image/3.png differ diff --git a/Assets/Art/Level/45/image/30.png b/Assets/Art/Level/45/image/30.png index db0aeed0..b7d153ca 100644 Binary files a/Assets/Art/Level/45/image/30.png and b/Assets/Art/Level/45/image/30.png differ diff --git a/Assets/Art/Level/45/image/31.png b/Assets/Art/Level/45/image/31.png index 974ce0a7..cd251392 100644 Binary files a/Assets/Art/Level/45/image/31.png and b/Assets/Art/Level/45/image/31.png differ diff --git a/Assets/Art/Level/45/image/32.png b/Assets/Art/Level/45/image/32.png index a281b73d..905a087c 100644 Binary files a/Assets/Art/Level/45/image/32.png and b/Assets/Art/Level/45/image/32.png differ diff --git a/Assets/Art/Level/45/image/4.png b/Assets/Art/Level/45/image/4.png index f7e01faa..310c4048 100644 Binary files a/Assets/Art/Level/45/image/4.png and b/Assets/Art/Level/45/image/4.png differ diff --git a/Assets/Art/Level/45/image/5.png b/Assets/Art/Level/45/image/5.png index 80aa8e29..f6c97990 100644 Binary files a/Assets/Art/Level/45/image/5.png and b/Assets/Art/Level/45/image/5.png differ diff --git a/Assets/Art/Level/45/image/6.png b/Assets/Art/Level/45/image/6.png index 8d6ab03e..b6e4470d 100644 Binary files a/Assets/Art/Level/45/image/6.png and b/Assets/Art/Level/45/image/6.png differ diff --git a/Assets/Art/Level/45/image/7.png b/Assets/Art/Level/45/image/7.png index e197bc9c..fbd72fa0 100644 Binary files a/Assets/Art/Level/45/image/7.png and b/Assets/Art/Level/45/image/7.png differ diff --git a/Assets/Art/Level/45/image/8.png b/Assets/Art/Level/45/image/8.png index c94a31df..1184a7ed 100644 Binary files a/Assets/Art/Level/45/image/8.png and b/Assets/Art/Level/45/image/8.png differ diff --git a/Assets/Art/Level/45/image/9.png b/Assets/Art/Level/45/image/9.png index 310a3bbf..e7659509 100644 Binary files a/Assets/Art/Level/45/image/9.png and b/Assets/Art/Level/45/image/9.png differ diff --git a/Assets/Art/Level/45/image/voice1.png b/Assets/Art/Level/45/image/voice1.png index b567d97a..54b59aa2 100644 Binary files a/Assets/Art/Level/45/image/voice1.png and b/Assets/Art/Level/45/image/voice1.png differ diff --git a/Assets/Art/Level/45/image/voice2.png b/Assets/Art/Level/45/image/voice2.png index c4948793..3b575ecd 100644 Binary files a/Assets/Art/Level/45/image/voice2.png and b/Assets/Art/Level/45/image/voice2.png differ diff --git a/Assets/Art/Level/45/image/voice3.png b/Assets/Art/Level/45/image/voice3.png index 75168e2c..bdfcbff9 100644 Binary files a/Assets/Art/Level/45/image/voice3.png and b/Assets/Art/Level/45/image/voice3.png differ diff --git a/Assets/Art/Level/49/image/bg.png b/Assets/Art/Level/49/image/bg.png index cdc170f6..d028e1db 100644 Binary files a/Assets/Art/Level/49/image/bg.png and b/Assets/Art/Level/49/image/bg.png differ diff --git a/Assets/Art/Level/49/image/cloud.png b/Assets/Art/Level/49/image/cloud.png index 51d02bd4..556c9e7b 100644 Binary files a/Assets/Art/Level/49/image/cloud.png and b/Assets/Art/Level/49/image/cloud.png differ diff --git a/Assets/Art/Level/49/image/firecracker.png b/Assets/Art/Level/49/image/firecracker.png index 9f46f0d8..5868fbb1 100644 Binary files a/Assets/Art/Level/49/image/firecracker.png and b/Assets/Art/Level/49/image/firecracker.png differ diff --git a/Assets/Art/Level/49/image/firecracker1.png b/Assets/Art/Level/49/image/firecracker1.png index 65c37006..db690f6a 100644 Binary files a/Assets/Art/Level/49/image/firecracker1.png and b/Assets/Art/Level/49/image/firecracker1.png differ diff --git a/Assets/Art/Level/49/image/firecracker2.png b/Assets/Art/Level/49/image/firecracker2.png index e474d06e..a30d668b 100644 Binary files a/Assets/Art/Level/49/image/firecracker2.png and b/Assets/Art/Level/49/image/firecracker2.png differ diff --git a/Assets/Art/Level/49/image/firecracker_black 1.png b/Assets/Art/Level/49/image/firecracker_black 1.png index cd2f6ee6..2f4cd4ba 100644 Binary files a/Assets/Art/Level/49/image/firecracker_black 1.png and b/Assets/Art/Level/49/image/firecracker_black 1.png differ diff --git a/Assets/Art/Level/49/image/firecracker_black 2.png b/Assets/Art/Level/49/image/firecracker_black 2.png index 35ff5f1b..57352fea 100644 Binary files a/Assets/Art/Level/49/image/firecracker_black 2.png and b/Assets/Art/Level/49/image/firecracker_black 2.png differ diff --git a/Assets/Art/Level/49/image/firecracker_black.png b/Assets/Art/Level/49/image/firecracker_black.png index bd971093..d8c2621d 100644 Binary files a/Assets/Art/Level/49/image/firecracker_black.png and b/Assets/Art/Level/49/image/firecracker_black.png differ diff --git a/Assets/Art/Level/49/image/flame1.png b/Assets/Art/Level/49/image/flame1.png index d7f5d22d..2f51bfb0 100644 Binary files a/Assets/Art/Level/49/image/flame1.png and b/Assets/Art/Level/49/image/flame1.png differ diff --git a/Assets/Art/Level/49/image/flame2.png b/Assets/Art/Level/49/image/flame2.png index 13e8ab1b..20d1c676 100644 Binary files a/Assets/Art/Level/49/image/flame2.png and b/Assets/Art/Level/49/image/flame2.png differ diff --git a/Assets/Art/Level/49/image/hanako1.png b/Assets/Art/Level/49/image/hanako1.png index 21c6bdc1..8895d772 100644 Binary files a/Assets/Art/Level/49/image/hanako1.png and b/Assets/Art/Level/49/image/hanako1.png differ diff --git a/Assets/Art/Level/49/image/hanako2.png b/Assets/Art/Level/49/image/hanako2.png index a09081c0..fc527dae 100644 Binary files a/Assets/Art/Level/49/image/hanako2.png and b/Assets/Art/Level/49/image/hanako2.png differ diff --git a/Assets/Art/Level/49/image/hanako3.png b/Assets/Art/Level/49/image/hanako3.png index 881cfd74..3667bb30 100644 Binary files a/Assets/Art/Level/49/image/hanako3.png and b/Assets/Art/Level/49/image/hanako3.png differ diff --git a/Assets/Art/Level/49/image/hanako_black.png b/Assets/Art/Level/49/image/hanako_black.png index 94542b98..3f9242e8 100644 Binary files a/Assets/Art/Level/49/image/hanako_black.png and b/Assets/Art/Level/49/image/hanako_black.png differ diff --git a/Assets/Art/Level/49/image/hanako_cry1.png b/Assets/Art/Level/49/image/hanako_cry1.png index d2b3cce6..cf1558e2 100644 Binary files a/Assets/Art/Level/49/image/hanako_cry1.png and b/Assets/Art/Level/49/image/hanako_cry1.png differ diff --git a/Assets/Art/Level/49/image/hanako_cry2.png b/Assets/Art/Level/49/image/hanako_cry2.png index e75f6173..d39e8ce6 100644 Binary files a/Assets/Art/Level/49/image/hanako_cry2.png and b/Assets/Art/Level/49/image/hanako_cry2.png differ diff --git a/Assets/Art/Level/49/image/hanako_happy1.png b/Assets/Art/Level/49/image/hanako_happy1.png index 34f98229..59949baa 100644 Binary files a/Assets/Art/Level/49/image/hanako_happy1.png and b/Assets/Art/Level/49/image/hanako_happy1.png differ diff --git a/Assets/Art/Level/49/image/hanako_happy2.png b/Assets/Art/Level/49/image/hanako_happy2.png index 4d21da43..c8ddde31 100644 Binary files a/Assets/Art/Level/49/image/hanako_happy2.png and b/Assets/Art/Level/49/image/hanako_happy2.png differ diff --git a/Assets/Art/Level/49/image/hanako_put1.png b/Assets/Art/Level/49/image/hanako_put1.png index 7c9ca857..cae05391 100644 Binary files a/Assets/Art/Level/49/image/hanako_put1.png and b/Assets/Art/Level/49/image/hanako_put1.png differ diff --git a/Assets/Art/Level/49/image/hanako_put2.png b/Assets/Art/Level/49/image/hanako_put2.png index 6455b025..88705b07 100644 Binary files a/Assets/Art/Level/49/image/hanako_put2.png and b/Assets/Art/Level/49/image/hanako_put2.png differ diff --git a/Assets/Art/Level/49/image/hanako_put3.png b/Assets/Art/Level/49/image/hanako_put3.png index 18f1e579..ae1cd87b 100644 Binary files a/Assets/Art/Level/49/image/hanako_put3.png and b/Assets/Art/Level/49/image/hanako_put3.png differ diff --git a/Assets/Art/Level/49/image/hanako_run1.png b/Assets/Art/Level/49/image/hanako_run1.png index 4739d14c..e91a091f 100644 Binary files a/Assets/Art/Level/49/image/hanako_run1.png and b/Assets/Art/Level/49/image/hanako_run1.png differ diff --git a/Assets/Art/Level/49/image/hanako_run2.png b/Assets/Art/Level/49/image/hanako_run2.png index 0e283f63..94da63e0 100644 Binary files a/Assets/Art/Level/49/image/hanako_run2.png and b/Assets/Art/Level/49/image/hanako_run2.png differ diff --git a/Assets/Art/Level/49/image/shadow1.png b/Assets/Art/Level/49/image/shadow1.png index eafb8016..c5d51e74 100644 Binary files a/Assets/Art/Level/49/image/shadow1.png and b/Assets/Art/Level/49/image/shadow1.png differ diff --git a/Assets/Art/Level/49/image/shadow2.png b/Assets/Art/Level/49/image/shadow2.png index ac56326b..b0ef9c53 100644 Binary files a/Assets/Art/Level/49/image/shadow2.png and b/Assets/Art/Level/49/image/shadow2.png differ diff --git a/Assets/Art/Level/49/image/shadow3.png b/Assets/Art/Level/49/image/shadow3.png index 8c080f85..6e7ddb27 100644 Binary files a/Assets/Art/Level/49/image/shadow3.png and b/Assets/Art/Level/49/image/shadow3.png differ diff --git a/Assets/Art/Level/49/image/voice1.png b/Assets/Art/Level/49/image/voice1.png index 3bf343fe..7f51c1a7 100644 Binary files a/Assets/Art/Level/49/image/voice1.png and b/Assets/Art/Level/49/image/voice1.png differ diff --git a/Assets/Art/Level/49/image/voice2.png b/Assets/Art/Level/49/image/voice2.png index 9aa89300..35852529 100644 Binary files a/Assets/Art/Level/49/image/voice2.png and b/Assets/Art/Level/49/image/voice2.png differ diff --git a/Assets/Art/Level/49/image/voice3.png b/Assets/Art/Level/49/image/voice3.png index 87f27bf0..ec4a4119 100644 Binary files a/Assets/Art/Level/49/image/voice3.png and b/Assets/Art/Level/49/image/voice3.png differ diff --git a/Assets/Art/Level/5/image/1025.png b/Assets/Art/Level/5/image/1025.png index 602a9d89..a92316bc 100644 Binary files a/Assets/Art/Level/5/image/1025.png and b/Assets/Art/Level/5/image/1025.png differ diff --git a/Assets/Art/Level/5/image/1027.png b/Assets/Art/Level/5/image/1027.png index 9ded38b7..08d6ee25 100644 Binary files a/Assets/Art/Level/5/image/1027.png and b/Assets/Art/Level/5/image/1027.png differ diff --git a/Assets/Art/Level/5/image/1032.png b/Assets/Art/Level/5/image/1032.png index edbe2fa2..b21e0b6e 100644 Binary files a/Assets/Art/Level/5/image/1032.png and b/Assets/Art/Level/5/image/1032.png differ diff --git a/Assets/Art/Level/5/image/1034.png b/Assets/Art/Level/5/image/1034.png index b6aaefb7..9f6c0a0f 100644 Binary files a/Assets/Art/Level/5/image/1034.png and b/Assets/Art/Level/5/image/1034.png differ diff --git a/Assets/Art/Level/5/image/1037.png b/Assets/Art/Level/5/image/1037.png index fb0cca12..788dcc3f 100644 Binary files a/Assets/Art/Level/5/image/1037.png and b/Assets/Art/Level/5/image/1037.png differ diff --git a/Assets/Art/Level/5/image/1039.png b/Assets/Art/Level/5/image/1039.png index 06bf99fe..8ad19da6 100644 Binary files a/Assets/Art/Level/5/image/1039.png and b/Assets/Art/Level/5/image/1039.png differ diff --git a/Assets/Art/Level/5/image/1042.png b/Assets/Art/Level/5/image/1042.png index ce78cd06..9eee0523 100644 Binary files a/Assets/Art/Level/5/image/1042.png and b/Assets/Art/Level/5/image/1042.png differ diff --git a/Assets/Art/Level/5/image/1044.png b/Assets/Art/Level/5/image/1044.png index 02a405c3..003365a0 100644 Binary files a/Assets/Art/Level/5/image/1044.png and b/Assets/Art/Level/5/image/1044.png differ diff --git a/Assets/Art/Level/5/image/1047.png b/Assets/Art/Level/5/image/1047.png index 3fd18330..b72c5b5f 100644 Binary files a/Assets/Art/Level/5/image/1047.png and b/Assets/Art/Level/5/image/1047.png differ diff --git a/Assets/Art/Level/5/image/1049.png b/Assets/Art/Level/5/image/1049.png index 29c50b18..a0ea9ad2 100644 Binary files a/Assets/Art/Level/5/image/1049.png and b/Assets/Art/Level/5/image/1049.png differ diff --git a/Assets/Art/Level/5/image/1052.png b/Assets/Art/Level/5/image/1052.png index 6bb03d17..55270c27 100644 Binary files a/Assets/Art/Level/5/image/1052.png and b/Assets/Art/Level/5/image/1052.png differ diff --git a/Assets/Art/Level/5/image/1055.png b/Assets/Art/Level/5/image/1055.png index fd3e0aef..924e2f64 100644 Binary files a/Assets/Art/Level/5/image/1055.png and b/Assets/Art/Level/5/image/1055.png differ diff --git a/Assets/Art/Level/5/image/1058.png b/Assets/Art/Level/5/image/1058.png index b7aa2206..bd2b8b3e 100644 Binary files a/Assets/Art/Level/5/image/1058.png and b/Assets/Art/Level/5/image/1058.png differ diff --git a/Assets/Art/Level/5/image/1062.png b/Assets/Art/Level/5/image/1062.png index 5037cab2..419687b9 100644 Binary files a/Assets/Art/Level/5/image/1062.png and b/Assets/Art/Level/5/image/1062.png differ diff --git a/Assets/Art/Level/5/image/1063.png b/Assets/Art/Level/5/image/1063.png index d906d82c..f989bf14 100644 Binary files a/Assets/Art/Level/5/image/1063.png and b/Assets/Art/Level/5/image/1063.png differ diff --git a/Assets/Art/Level/5/image/1064.png b/Assets/Art/Level/5/image/1064.png index 7c7a432d..90914e2d 100644 Binary files a/Assets/Art/Level/5/image/1064.png and b/Assets/Art/Level/5/image/1064.png differ diff --git a/Assets/Art/Level/5/image/1071.png b/Assets/Art/Level/5/image/1071.png index 33cb917e..1aa5dbcc 100644 Binary files a/Assets/Art/Level/5/image/1071.png and b/Assets/Art/Level/5/image/1071.png differ diff --git a/Assets/Art/Level/5/image/1074.png b/Assets/Art/Level/5/image/1074.png index d552935d..6ee2e641 100644 Binary files a/Assets/Art/Level/5/image/1074.png and b/Assets/Art/Level/5/image/1074.png differ diff --git a/Assets/Art/Level/5/image/1077.png b/Assets/Art/Level/5/image/1077.png index 01aa7027..851a189b 100644 Binary files a/Assets/Art/Level/5/image/1077.png and b/Assets/Art/Level/5/image/1077.png differ diff --git a/Assets/Art/Level/5/image/1081.png b/Assets/Art/Level/5/image/1081.png index 56840747..43ce25b6 100644 Binary files a/Assets/Art/Level/5/image/1081.png and b/Assets/Art/Level/5/image/1081.png differ diff --git a/Assets/Art/Level/5/image/1083.png b/Assets/Art/Level/5/image/1083.png index 96f37412..914f9270 100644 Binary files a/Assets/Art/Level/5/image/1083.png and b/Assets/Art/Level/5/image/1083.png differ diff --git a/Assets/Art/Level/5/image/1087.png b/Assets/Art/Level/5/image/1087.png index 40edf646..152e5370 100644 Binary files a/Assets/Art/Level/5/image/1087.png and b/Assets/Art/Level/5/image/1087.png differ diff --git a/Assets/Art/Level/5/image/1089.png b/Assets/Art/Level/5/image/1089.png index 19d4b992..05bf4471 100644 Binary files a/Assets/Art/Level/5/image/1089.png and b/Assets/Art/Level/5/image/1089.png differ diff --git a/Assets/Art/Level/5/image/1092.png b/Assets/Art/Level/5/image/1092.png index 67a4cf99..5d989013 100644 Binary files a/Assets/Art/Level/5/image/1092.png and b/Assets/Art/Level/5/image/1092.png differ diff --git a/Assets/Art/Level/5/image/1094.png b/Assets/Art/Level/5/image/1094.png index d949d44f..ed29eda6 100644 Binary files a/Assets/Art/Level/5/image/1094.png and b/Assets/Art/Level/5/image/1094.png differ diff --git a/Assets/Art/Level/5/image/1097.png b/Assets/Art/Level/5/image/1097.png index d572245c..77dcf520 100644 Binary files a/Assets/Art/Level/5/image/1097.png and b/Assets/Art/Level/5/image/1097.png differ diff --git a/Assets/Art/Level/5/image/1100.png b/Assets/Art/Level/5/image/1100.png index ad40ea06..90d2637a 100644 Binary files a/Assets/Art/Level/5/image/1100.png and b/Assets/Art/Level/5/image/1100.png differ diff --git a/Assets/Art/Level/5/image/1102.png b/Assets/Art/Level/5/image/1102.png index 4abc147c..4fe276e0 100644 Binary files a/Assets/Art/Level/5/image/1102.png and b/Assets/Art/Level/5/image/1102.png differ diff --git a/Assets/Art/Level/5/image/1104.png b/Assets/Art/Level/5/image/1104.png index ab1cbf82..1fbb2f75 100644 Binary files a/Assets/Art/Level/5/image/1104.png and b/Assets/Art/Level/5/image/1104.png differ diff --git a/Assets/Art/Level/5/image/1107.png b/Assets/Art/Level/5/image/1107.png index 03cb3dd9..10494e66 100644 Binary files a/Assets/Art/Level/5/image/1107.png and b/Assets/Art/Level/5/image/1107.png differ diff --git a/Assets/Art/Level/5/image/1110.png b/Assets/Art/Level/5/image/1110.png index 06a485ef..7b737fb8 100644 Binary files a/Assets/Art/Level/5/image/1110.png and b/Assets/Art/Level/5/image/1110.png differ diff --git a/Assets/Art/Level/5/image/1114.png b/Assets/Art/Level/5/image/1114.png index 34512741..c9a90d8c 100644 Binary files a/Assets/Art/Level/5/image/1114.png and b/Assets/Art/Level/5/image/1114.png differ diff --git a/Assets/Art/Level/5/image/1120_IMG_ITEM_CHOKI.png b/Assets/Art/Level/5/image/1120_IMG_ITEM_CHOKI.png index 37f7a169..b3b2918f 100644 Binary files a/Assets/Art/Level/5/image/1120_IMG_ITEM_CHOKI.png and b/Assets/Art/Level/5/image/1120_IMG_ITEM_CHOKI.png differ diff --git a/Assets/Art/Level/5/image/1123_IMG_ITEM_WASHA.png b/Assets/Art/Level/5/image/1123_IMG_ITEM_WASHA.png index 55d8449c..816adb9a 100644 Binary files a/Assets/Art/Level/5/image/1123_IMG_ITEM_WASHA.png and b/Assets/Art/Level/5/image/1123_IMG_ITEM_WASHA.png differ diff --git a/Assets/Art/Level/5/image/1126_IMG_ITEM_BULO_.png b/Assets/Art/Level/5/image/1126_IMG_ITEM_BULO_.png index 245215db..98d6fdaa 100644 Binary files a/Assets/Art/Level/5/image/1126_IMG_ITEM_BULO_.png and b/Assets/Art/Level/5/image/1126_IMG_ITEM_BULO_.png differ diff --git a/Assets/Art/Level/50/image/T-in.png b/Assets/Art/Level/50/image/T-in.png index 16e5fb3b..42eac853 100644 Binary files a/Assets/Art/Level/50/image/T-in.png and b/Assets/Art/Level/50/image/T-in.png differ diff --git a/Assets/Art/Level/50/image/T-out.png b/Assets/Art/Level/50/image/T-out.png index c9f755ec..933656c3 100644 Binary files a/Assets/Art/Level/50/image/T-out.png and b/Assets/Art/Level/50/image/T-out.png differ diff --git a/Assets/Art/Level/50/image/T-skyline.png b/Assets/Art/Level/50/image/T-skyline.png index 8803a9d5..b705704e 100644 Binary files a/Assets/Art/Level/50/image/T-skyline.png and b/Assets/Art/Level/50/image/T-skyline.png differ diff --git a/Assets/Art/Level/50/image/TV-18X1.png b/Assets/Art/Level/50/image/TV-18X1.png index be967a1e..72733263 100644 Binary files a/Assets/Art/Level/50/image/TV-18X1.png and b/Assets/Art/Level/50/image/TV-18X1.png differ diff --git a/Assets/Art/Level/50/image/TV-18X2.png b/Assets/Art/Level/50/image/TV-18X2.png index 0e02eed0..f9ec43fd 100644 Binary files a/Assets/Art/Level/50/image/TV-18X2.png and b/Assets/Art/Level/50/image/TV-18X2.png differ diff --git a/Assets/Art/Level/50/image/TV-black.png b/Assets/Art/Level/50/image/TV-black.png index 020bf6e1..72f9decc 100644 Binary files a/Assets/Art/Level/50/image/TV-black.png and b/Assets/Art/Level/50/image/TV-black.png differ diff --git a/Assets/Art/Level/50/image/TV-ghost.png b/Assets/Art/Level/50/image/TV-ghost.png index d2a0d9f9..7dfe9a1d 100644 Binary files a/Assets/Art/Level/50/image/TV-ghost.png and b/Assets/Art/Level/50/image/TV-ghost.png differ diff --git a/Assets/Art/Level/50/image/TV-snow1.png b/Assets/Art/Level/50/image/TV-snow1.png index b1ebb30e..4e3fac14 100644 Binary files a/Assets/Art/Level/50/image/TV-snow1.png and b/Assets/Art/Level/50/image/TV-snow1.png differ diff --git a/Assets/Art/Level/50/image/TV-snow2.png b/Assets/Art/Level/50/image/TV-snow2.png index 073ec1a1..c20b9571 100644 Binary files a/Assets/Art/Level/50/image/TV-snow2.png and b/Assets/Art/Level/50/image/TV-snow2.png differ diff --git a/Assets/Art/Level/50/image/TV-white.png b/Assets/Art/Level/50/image/TV-white.png index 9a35dedc..1f3053eb 100644 Binary files a/Assets/Art/Level/50/image/TV-white.png and b/Assets/Art/Level/50/image/TV-white.png differ diff --git a/Assets/Art/Level/50/image/TV-win-1.png b/Assets/Art/Level/50/image/TV-win-1.png index 176e9b81..eaf6cfb6 100644 Binary files a/Assets/Art/Level/50/image/TV-win-1.png and b/Assets/Art/Level/50/image/TV-win-1.png differ diff --git a/Assets/Art/Level/50/image/TV-win-2.png b/Assets/Art/Level/50/image/TV-win-2.png index 799f4ac1..af550664 100644 Binary files a/Assets/Art/Level/50/image/TV-win-2.png and b/Assets/Art/Level/50/image/TV-win-2.png differ diff --git a/Assets/Art/Level/50/image/TV-win.png b/Assets/Art/Level/50/image/TV-win.png index 32e535da..e4f794a4 100644 Binary files a/Assets/Art/Level/50/image/TV-win.png and b/Assets/Art/Level/50/image/TV-win.png differ diff --git a/Assets/Art/Level/50/image/Tvcabinet.png b/Assets/Art/Level/50/image/Tvcabinet.png index 7a34811d..be1bfe7f 100644 Binary files a/Assets/Art/Level/50/image/Tvcabinet.png and b/Assets/Art/Level/50/image/Tvcabinet.png differ diff --git a/Assets/Art/Level/50/image/bg.png b/Assets/Art/Level/50/image/bg.png index 612949f7..a9a57b41 100644 Binary files a/Assets/Art/Level/50/image/bg.png and b/Assets/Art/Level/50/image/bg.png differ diff --git a/Assets/Art/Level/50/image/boy-0.png b/Assets/Art/Level/50/image/boy-0.png index eab04c78..6f33b3da 100644 Binary files a/Assets/Art/Level/50/image/boy-0.png and b/Assets/Art/Level/50/image/boy-0.png differ diff --git a/Assets/Art/Level/50/image/boy-an1.png b/Assets/Art/Level/50/image/boy-an1.png index 81a99911..a75c94b2 100644 Binary files a/Assets/Art/Level/50/image/boy-an1.png and b/Assets/Art/Level/50/image/boy-an1.png differ diff --git a/Assets/Art/Level/50/image/boy-an2.png b/Assets/Art/Level/50/image/boy-an2.png index b213eed1..6e5505f1 100644 Binary files a/Assets/Art/Level/50/image/boy-an2.png and b/Assets/Art/Level/50/image/boy-an2.png differ diff --git a/Assets/Art/Level/50/image/boy-huang1.png b/Assets/Art/Level/50/image/boy-huang1.png index 66a056f4..92895579 100644 Binary files a/Assets/Art/Level/50/image/boy-huang1.png and b/Assets/Art/Level/50/image/boy-huang1.png differ diff --git a/Assets/Art/Level/50/image/boy-huang2.png b/Assets/Art/Level/50/image/boy-huang2.png index 301f6dbe..b0f69825 100644 Binary files a/Assets/Art/Level/50/image/boy-huang2.png and b/Assets/Art/Level/50/image/boy-huang2.png differ diff --git a/Assets/Art/Level/50/image/boy-lose.png b/Assets/Art/Level/50/image/boy-lose.png index f55d07cf..5bec3f65 100644 Binary files a/Assets/Art/Level/50/image/boy-lose.png and b/Assets/Art/Level/50/image/boy-lose.png differ diff --git a/Assets/Art/Level/50/image/boy-pai1.png b/Assets/Art/Level/50/image/boy-pai1.png index 9e2f2b63..17d3fd11 100644 Binary files a/Assets/Art/Level/50/image/boy-pai1.png and b/Assets/Art/Level/50/image/boy-pai1.png differ diff --git a/Assets/Art/Level/50/image/boy-pai2.png b/Assets/Art/Level/50/image/boy-pai2.png index 1e094fcc..78dcdeac 100644 Binary files a/Assets/Art/Level/50/image/boy-pai2.png and b/Assets/Art/Level/50/image/boy-pai2.png differ diff --git a/Assets/Art/Level/50/image/boy-scary.png b/Assets/Art/Level/50/image/boy-scary.png index 80396a51..aaee9a1c 100644 Binary files a/Assets/Art/Level/50/image/boy-scary.png and b/Assets/Art/Level/50/image/boy-scary.png differ diff --git a/Assets/Art/Level/50/image/boy-shy.png b/Assets/Art/Level/50/image/boy-shy.png index 4f48e401..5dd8a41c 100644 Binary files a/Assets/Art/Level/50/image/boy-shy.png and b/Assets/Art/Level/50/image/boy-shy.png differ diff --git a/Assets/Art/Level/50/image/boy-win.png b/Assets/Art/Level/50/image/boy-win.png index 31fc93eb..ad8e4036 100644 Binary files a/Assets/Art/Level/50/image/boy-win.png and b/Assets/Art/Level/50/image/boy-win.png differ diff --git a/Assets/Art/Level/50/image/voice1.png b/Assets/Art/Level/50/image/voice1.png index bfa0768e..cbd4ce4c 100644 Binary files a/Assets/Art/Level/50/image/voice1.png and b/Assets/Art/Level/50/image/voice1.png differ diff --git a/Assets/Art/Level/50/image/voice2.png b/Assets/Art/Level/50/image/voice2.png index d639b237..b0240039 100644 Binary files a/Assets/Art/Level/50/image/voice2.png and b/Assets/Art/Level/50/image/voice2.png differ diff --git a/Assets/Art/Level/50/image/voice3.png b/Assets/Art/Level/50/image/voice3.png index dd7693d0..7fbcaed9 100644 Binary files a/Assets/Art/Level/50/image/voice3.png and b/Assets/Art/Level/50/image/voice3.png differ diff --git a/Assets/Art/Level/53/image/1463.png b/Assets/Art/Level/53/image/1463.png index 7fff44b0..b43587f1 100644 Binary files a/Assets/Art/Level/53/image/1463.png and b/Assets/Art/Level/53/image/1463.png differ diff --git a/Assets/Art/Level/53/image/1465.png b/Assets/Art/Level/53/image/1465.png index e4151be2..16f907cf 100644 Binary files a/Assets/Art/Level/53/image/1465.png and b/Assets/Art/Level/53/image/1465.png differ diff --git a/Assets/Art/Level/53/image/L-ye-2.png b/Assets/Art/Level/53/image/L-ye-2.png index 168ec13d..c83450ec 100644 Binary files a/Assets/Art/Level/53/image/L-ye-2.png and b/Assets/Art/Level/53/image/L-ye-2.png differ diff --git a/Assets/Art/Level/53/image/La-dai.png b/Assets/Art/Level/53/image/La-dai.png index 1c8a3783..65692317 100644 Binary files a/Assets/Art/Level/53/image/La-dai.png and b/Assets/Art/Level/53/image/La-dai.png differ diff --git a/Assets/Art/Level/53/image/La-getmask.png b/Assets/Art/Level/53/image/La-getmask.png index 9a4a4766..07b5d103 100644 Binary files a/Assets/Art/Level/53/image/La-getmask.png and b/Assets/Art/Level/53/image/La-getmask.png differ diff --git a/Assets/Art/Level/53/image/La-idle.png b/Assets/Art/Level/53/image/La-idle.png index ca8339f1..c398be46 100644 Binary files a/Assets/Art/Level/53/image/La-idle.png and b/Assets/Art/Level/53/image/La-idle.png differ diff --git a/Assets/Art/Level/53/image/R-ye-1.png b/Assets/Art/Level/53/image/R-ye-1.png index c73a4bbd..17a6fe3a 100644 Binary files a/Assets/Art/Level/53/image/R-ye-1.png and b/Assets/Art/Level/53/image/R-ye-1.png differ diff --git a/Assets/Art/Level/53/image/Ra-get.png b/Assets/Art/Level/53/image/Ra-get.png index 74d8f500..78549337 100644 Binary files a/Assets/Art/Level/53/image/Ra-get.png and b/Assets/Art/Level/53/image/Ra-get.png differ diff --git a/Assets/Art/Level/53/image/Ra-getmask.png b/Assets/Art/Level/53/image/Ra-getmask.png index 2dcc0e50..2d418a01 100644 Binary files a/Assets/Art/Level/53/image/Ra-getmask.png and b/Assets/Art/Level/53/image/Ra-getmask.png differ diff --git a/Assets/Art/Level/53/image/Ra-idle.png b/Assets/Art/Level/53/image/Ra-idle.png index 78efbd92..a56907dd 100644 Binary files a/Assets/Art/Level/53/image/Ra-idle.png and b/Assets/Art/Level/53/image/Ra-idle.png differ diff --git a/Assets/Art/Level/53/image/a-si.png b/Assets/Art/Level/53/image/a-si.png index 7095b7a0..94f5f89b 100644 Binary files a/Assets/Art/Level/53/image/a-si.png and b/Assets/Art/Level/53/image/a-si.png differ diff --git a/Assets/Art/Level/53/image/bg.png b/Assets/Art/Level/53/image/bg.png index 489f1774..3620ffc4 100644 Binary files a/Assets/Art/Level/53/image/bg.png and b/Assets/Art/Level/53/image/bg.png differ diff --git a/Assets/Art/Level/53/image/body.png b/Assets/Art/Level/53/image/body.png index 9877c15b..f292046b 100644 Binary files a/Assets/Art/Level/53/image/body.png and b/Assets/Art/Level/53/image/body.png differ diff --git a/Assets/Art/Level/53/image/head-cry.png b/Assets/Art/Level/53/image/head-cry.png index 7007c599..6f1c8098 100644 Binary files a/Assets/Art/Level/53/image/head-cry.png and b/Assets/Art/Level/53/image/head-cry.png differ diff --git a/Assets/Art/Level/53/image/head-idle.png b/Assets/Art/Level/53/image/head-idle.png index a42926d7..c7faf1ac 100644 Binary files a/Assets/Art/Level/53/image/head-idle.png and b/Assets/Art/Level/53/image/head-idle.png differ diff --git a/Assets/Art/Level/53/image/head-red.png b/Assets/Art/Level/53/image/head-red.png index dd11300b..05eebc0f 100644 Binary files a/Assets/Art/Level/53/image/head-red.png and b/Assets/Art/Level/53/image/head-red.png differ diff --git a/Assets/Art/Level/53/image/head-sad.png b/Assets/Art/Level/53/image/head-sad.png index 59c8fb88..28b3dc01 100644 Binary files a/Assets/Art/Level/53/image/head-sad.png and b/Assets/Art/Level/53/image/head-sad.png differ diff --git a/Assets/Art/Level/53/image/headmask.png b/Assets/Art/Level/53/image/headmask.png index 909d9896..65d94581 100644 Binary files a/Assets/Art/Level/53/image/headmask.png and b/Assets/Art/Level/53/image/headmask.png differ diff --git a/Assets/Art/Level/53/image/mask-in.png b/Assets/Art/Level/53/image/mask-in.png index 211c24f0..7f3c9649 100644 Binary files a/Assets/Art/Level/53/image/mask-in.png and b/Assets/Art/Level/53/image/mask-in.png differ diff --git a/Assets/Art/Level/53/image/mask-none.png b/Assets/Art/Level/53/image/mask-none.png index 71056d03..b524ee22 100644 Binary files a/Assets/Art/Level/53/image/mask-none.png and b/Assets/Art/Level/53/image/mask-none.png differ diff --git a/Assets/Art/Level/53/image/mask-put 1.png b/Assets/Art/Level/53/image/mask-put 1.png index ac9687d0..bb0c4a41 100644 Binary files a/Assets/Art/Level/53/image/mask-put 1.png and b/Assets/Art/Level/53/image/mask-put 1.png differ diff --git a/Assets/Art/Level/53/image/mask-put 2.png b/Assets/Art/Level/53/image/mask-put 2.png index aac39991..c919f54e 100644 Binary files a/Assets/Art/Level/53/image/mask-put 2.png and b/Assets/Art/Level/53/image/mask-put 2.png differ diff --git a/Assets/Art/Level/53/image/mask-put.png b/Assets/Art/Level/53/image/mask-put.png index 6beef454..df4feb7d 100644 Binary files a/Assets/Art/Level/53/image/mask-put.png and b/Assets/Art/Level/53/image/mask-put.png differ diff --git a/Assets/Art/Level/53/image/sad.png b/Assets/Art/Level/53/image/sad.png index 5dd484bf..ba1dd194 100644 Binary files a/Assets/Art/Level/53/image/sad.png and b/Assets/Art/Level/53/image/sad.png differ diff --git a/Assets/Art/Level/53/image/voice1.png b/Assets/Art/Level/53/image/voice1.png index d88f277f..b962063b 100644 Binary files a/Assets/Art/Level/53/image/voice1.png and b/Assets/Art/Level/53/image/voice1.png differ diff --git a/Assets/Art/Level/53/image/voice2.png b/Assets/Art/Level/53/image/voice2.png index 394b9f3f..63747d60 100644 Binary files a/Assets/Art/Level/53/image/voice2.png and b/Assets/Art/Level/53/image/voice2.png differ diff --git a/Assets/Art/Level/6/image/1230.png b/Assets/Art/Level/6/image/1230.png index 09c57ec7..d6df4cdd 100644 Binary files a/Assets/Art/Level/6/image/1230.png and b/Assets/Art/Level/6/image/1230.png differ diff --git a/Assets/Art/Level/6/image/1231.png b/Assets/Art/Level/6/image/1231.png index f72a62aa..fb55ea44 100644 Binary files a/Assets/Art/Level/6/image/1231.png and b/Assets/Art/Level/6/image/1231.png differ diff --git a/Assets/Art/Level/6/image/1234.png b/Assets/Art/Level/6/image/1234.png index 2e243e63..d4753e5b 100644 Binary files a/Assets/Art/Level/6/image/1234.png and b/Assets/Art/Level/6/image/1234.png differ diff --git a/Assets/Art/Level/6/image/1236.png b/Assets/Art/Level/6/image/1236.png index 9e47d5b5..2f13bfe4 100644 Binary files a/Assets/Art/Level/6/image/1236.png and b/Assets/Art/Level/6/image/1236.png differ diff --git a/Assets/Art/Level/6/image/1243.png b/Assets/Art/Level/6/image/1243.png index 861b10f5..4f051cfa 100644 Binary files a/Assets/Art/Level/6/image/1243.png and b/Assets/Art/Level/6/image/1243.png differ diff --git a/Assets/Art/Level/6/image/1247.png b/Assets/Art/Level/6/image/1247.png index 5c8e3cd5..8c021207 100644 Binary files a/Assets/Art/Level/6/image/1247.png and b/Assets/Art/Level/6/image/1247.png differ diff --git a/Assets/Art/Level/6/image/1251.png b/Assets/Art/Level/6/image/1251.png index 7540a485..a23a38a8 100644 Binary files a/Assets/Art/Level/6/image/1251.png and b/Assets/Art/Level/6/image/1251.png differ diff --git a/Assets/Art/Level/6/image/1258.png b/Assets/Art/Level/6/image/1258.png index 0deed03f..54b7da87 100644 Binary files a/Assets/Art/Level/6/image/1258.png and b/Assets/Art/Level/6/image/1258.png differ diff --git a/Assets/Art/Level/6/image/1259.png b/Assets/Art/Level/6/image/1259.png index f69c71d2..126ee5e0 100644 Binary files a/Assets/Art/Level/6/image/1259.png and b/Assets/Art/Level/6/image/1259.png differ diff --git a/Assets/Art/Level/6/image/1261.png b/Assets/Art/Level/6/image/1261.png index a530b41e..23b7b8ea 100644 Binary files a/Assets/Art/Level/6/image/1261.png and b/Assets/Art/Level/6/image/1261.png differ diff --git a/Assets/Art/Level/6/image/1263.png b/Assets/Art/Level/6/image/1263.png index f635707c..c975e506 100644 Binary files a/Assets/Art/Level/6/image/1263.png and b/Assets/Art/Level/6/image/1263.png differ diff --git a/Assets/Art/Level/6/image/1267.png b/Assets/Art/Level/6/image/1267.png index 0681628a..fff797d1 100644 Binary files a/Assets/Art/Level/6/image/1267.png and b/Assets/Art/Level/6/image/1267.png differ diff --git a/Assets/Art/Level/6/image/1269.png b/Assets/Art/Level/6/image/1269.png index 7711892d..cf437361 100644 Binary files a/Assets/Art/Level/6/image/1269.png and b/Assets/Art/Level/6/image/1269.png differ diff --git a/Assets/Art/Level/6/image/1271.png b/Assets/Art/Level/6/image/1271.png index 0214cb63..aea14a9a 100644 Binary files a/Assets/Art/Level/6/image/1271.png and b/Assets/Art/Level/6/image/1271.png differ diff --git a/Assets/Art/Level/6/image/1273.png b/Assets/Art/Level/6/image/1273.png index d66684bb..80edae82 100644 Binary files a/Assets/Art/Level/6/image/1273.png and b/Assets/Art/Level/6/image/1273.png differ diff --git a/Assets/Art/Level/6/image/1278.png b/Assets/Art/Level/6/image/1278.png index b740cfc8..63e84e1d 100644 Binary files a/Assets/Art/Level/6/image/1278.png and b/Assets/Art/Level/6/image/1278.png differ diff --git a/Assets/Art/Level/6/image/1281.png b/Assets/Art/Level/6/image/1281.png index 037a01aa..5ac61c1a 100644 Binary files a/Assets/Art/Level/6/image/1281.png and b/Assets/Art/Level/6/image/1281.png differ diff --git a/Assets/Art/Level/6/image/1285.png b/Assets/Art/Level/6/image/1285.png index 38067ada..55c1ff85 100644 Binary files a/Assets/Art/Level/6/image/1285.png and b/Assets/Art/Level/6/image/1285.png differ diff --git a/Assets/Art/Level/6/image/1290.png b/Assets/Art/Level/6/image/1290.png index 17409cba..550690ba 100644 Binary files a/Assets/Art/Level/6/image/1290.png and b/Assets/Art/Level/6/image/1290.png differ diff --git a/Assets/Art/Level/6/image/1293.png b/Assets/Art/Level/6/image/1293.png index 4ce0624b..b55b1533 100644 Binary files a/Assets/Art/Level/6/image/1293.png and b/Assets/Art/Level/6/image/1293.png differ diff --git a/Assets/Art/Level/6/image/1296.png b/Assets/Art/Level/6/image/1296.png index 0a8dd2ce..e93c3aa3 100644 Binary files a/Assets/Art/Level/6/image/1296.png and b/Assets/Art/Level/6/image/1296.png differ diff --git a/Assets/Art/Level/6/image/1299_IMG_ITEM_PERA.png b/Assets/Art/Level/6/image/1299_IMG_ITEM_PERA.png index 8a65de80..a7f5d4e3 100644 Binary files a/Assets/Art/Level/6/image/1299_IMG_ITEM_PERA.png and b/Assets/Art/Level/6/image/1299_IMG_ITEM_PERA.png differ diff --git a/Assets/Art/Level/6/image/1302_IMG_ITEM_POI.png b/Assets/Art/Level/6/image/1302_IMG_ITEM_POI.png index 14523333..4fab4c6a 100644 Binary files a/Assets/Art/Level/6/image/1302_IMG_ITEM_POI.png and b/Assets/Art/Level/6/image/1302_IMG_ITEM_POI.png differ diff --git a/Assets/Art/Level/6/image/1305_IMG_ITEM_KUSHA.png b/Assets/Art/Level/6/image/1305_IMG_ITEM_KUSHA.png index 85a13c98..305eb051 100644 Binary files a/Assets/Art/Level/6/image/1305_IMG_ITEM_KUSHA.png and b/Assets/Art/Level/6/image/1305_IMG_ITEM_KUSHA.png differ diff --git a/Assets/Art/Level/6/image/515.png b/Assets/Art/Level/6/image/515.png index e73f4c76..923d46e0 100644 Binary files a/Assets/Art/Level/6/image/515.png and b/Assets/Art/Level/6/image/515.png differ diff --git a/Assets/Art/Level/7/image/107_IMG_COVER_31.png b/Assets/Art/Level/7/image/107_IMG_COVER_31.png index 9f78e4ba..bf9e435b 100644 Binary files a/Assets/Art/Level/7/image/107_IMG_COVER_31.png and b/Assets/Art/Level/7/image/107_IMG_COVER_31.png differ diff --git a/Assets/Art/Level/7/image/145_IMG_SITUATION_ICON_31.png b/Assets/Art/Level/7/image/145_IMG_SITUATION_ICON_31.png index 89c77edd..416fd880 100644 Binary files a/Assets/Art/Level/7/image/145_IMG_SITUATION_ICON_31.png and b/Assets/Art/Level/7/image/145_IMG_SITUATION_ICON_31.png differ diff --git a/Assets/Art/Level/7/image/176_IMG_SITUATION_LOGO_31.png b/Assets/Art/Level/7/image/176_IMG_SITUATION_LOGO_31.png index 759036af..b6f8b1d6 100644 Binary files a/Assets/Art/Level/7/image/176_IMG_SITUATION_LOGO_31.png and b/Assets/Art/Level/7/image/176_IMG_SITUATION_LOGO_31.png differ diff --git a/Assets/Art/Level/7/image/252.png b/Assets/Art/Level/7/image/252.png index ebab9534..4db3e4de 100644 Binary files a/Assets/Art/Level/7/image/252.png and b/Assets/Art/Level/7/image/252.png differ diff --git a/Assets/Art/Level/7/image/254.png b/Assets/Art/Level/7/image/254.png index b068d791..9d6118e9 100644 Binary files a/Assets/Art/Level/7/image/254.png and b/Assets/Art/Level/7/image/254.png differ diff --git a/Assets/Art/Level/7/image/258.png b/Assets/Art/Level/7/image/258.png index bb605636..247065e5 100644 Binary files a/Assets/Art/Level/7/image/258.png and b/Assets/Art/Level/7/image/258.png differ diff --git a/Assets/Art/Level/7/image/260.png b/Assets/Art/Level/7/image/260.png index 17cf7c07..e8b14ba8 100644 Binary files a/Assets/Art/Level/7/image/260.png and b/Assets/Art/Level/7/image/260.png differ diff --git a/Assets/Art/Level/7/image/264.png b/Assets/Art/Level/7/image/264.png index bcd7b107..56053d79 100644 Binary files a/Assets/Art/Level/7/image/264.png and b/Assets/Art/Level/7/image/264.png differ diff --git a/Assets/Art/Level/7/image/267.png b/Assets/Art/Level/7/image/267.png index 9138b6e7..e2a08573 100644 Binary files a/Assets/Art/Level/7/image/267.png and b/Assets/Art/Level/7/image/267.png differ diff --git a/Assets/Art/Level/7/image/273.png b/Assets/Art/Level/7/image/273.png index fba74ac1..ea5edd8c 100644 Binary files a/Assets/Art/Level/7/image/273.png and b/Assets/Art/Level/7/image/273.png differ diff --git a/Assets/Art/Level/7/image/275.png b/Assets/Art/Level/7/image/275.png index aa2f48b5..47ffcb10 100644 Binary files a/Assets/Art/Level/7/image/275.png and b/Assets/Art/Level/7/image/275.png differ diff --git a/Assets/Art/Level/7/image/280.png b/Assets/Art/Level/7/image/280.png index 90586a1c..c395b68d 100644 Binary files a/Assets/Art/Level/7/image/280.png and b/Assets/Art/Level/7/image/280.png differ diff --git a/Assets/Art/Level/7/image/282.png b/Assets/Art/Level/7/image/282.png index e32579b7..b10ef306 100644 Binary files a/Assets/Art/Level/7/image/282.png and b/Assets/Art/Level/7/image/282.png differ diff --git a/Assets/Art/Level/7/image/286.png b/Assets/Art/Level/7/image/286.png index 2fff0788..e2e51587 100644 Binary files a/Assets/Art/Level/7/image/286.png and b/Assets/Art/Level/7/image/286.png differ diff --git a/Assets/Art/Level/7/image/288.png b/Assets/Art/Level/7/image/288.png index 99ce2a01..009fae55 100644 Binary files a/Assets/Art/Level/7/image/288.png and b/Assets/Art/Level/7/image/288.png differ diff --git a/Assets/Art/Level/7/image/291.png b/Assets/Art/Level/7/image/291.png index 2d949ed3..cd5f1c8a 100644 Binary files a/Assets/Art/Level/7/image/291.png and b/Assets/Art/Level/7/image/291.png differ diff --git a/Assets/Art/Level/7/image/294.png b/Assets/Art/Level/7/image/294.png index 4115eb22..832090a8 100644 Binary files a/Assets/Art/Level/7/image/294.png and b/Assets/Art/Level/7/image/294.png differ diff --git a/Assets/Art/Level/7/image/298.png b/Assets/Art/Level/7/image/298.png index 74c9b616..86af68b3 100644 Binary files a/Assets/Art/Level/7/image/298.png and b/Assets/Art/Level/7/image/298.png differ diff --git a/Assets/Art/Level/7/image/300.png b/Assets/Art/Level/7/image/300.png index 30dec0b6..277e86fb 100644 Binary files a/Assets/Art/Level/7/image/300.png and b/Assets/Art/Level/7/image/300.png differ diff --git a/Assets/Art/Level/7/image/302.png b/Assets/Art/Level/7/image/302.png index 2c57728e..db3e4bd8 100644 Binary files a/Assets/Art/Level/7/image/302.png and b/Assets/Art/Level/7/image/302.png differ diff --git a/Assets/Art/Level/7/image/306.png b/Assets/Art/Level/7/image/306.png index 426d42de..954100e3 100644 Binary files a/Assets/Art/Level/7/image/306.png and b/Assets/Art/Level/7/image/306.png differ diff --git a/Assets/Art/Level/7/image/308.png b/Assets/Art/Level/7/image/308.png index 3e65a59a..893414aa 100644 Binary files a/Assets/Art/Level/7/image/308.png and b/Assets/Art/Level/7/image/308.png differ diff --git a/Assets/Art/Level/7/image/311.png b/Assets/Art/Level/7/image/311.png index f706f4b5..1a69a178 100644 Binary files a/Assets/Art/Level/7/image/311.png and b/Assets/Art/Level/7/image/311.png differ diff --git a/Assets/Art/Level/7/image/313.png b/Assets/Art/Level/7/image/313.png index 7c7f6549..fd920666 100644 Binary files a/Assets/Art/Level/7/image/313.png and b/Assets/Art/Level/7/image/313.png differ diff --git a/Assets/Art/Level/7/image/317.png b/Assets/Art/Level/7/image/317.png index 2940dfe4..39e620c0 100644 Binary files a/Assets/Art/Level/7/image/317.png and b/Assets/Art/Level/7/image/317.png differ diff --git a/Assets/Art/Level/7/image/321.png b/Assets/Art/Level/7/image/321.png index 0acbc6fc..8dff2a7a 100644 Binary files a/Assets/Art/Level/7/image/321.png and b/Assets/Art/Level/7/image/321.png differ diff --git a/Assets/Art/Level/7/image/325.png b/Assets/Art/Level/7/image/325.png index 417f79da..45080017 100644 Binary files a/Assets/Art/Level/7/image/325.png and b/Assets/Art/Level/7/image/325.png differ diff --git a/Assets/Art/Level/7/image/329.png b/Assets/Art/Level/7/image/329.png index 9d8a7769..24dcb491 100644 Binary files a/Assets/Art/Level/7/image/329.png and b/Assets/Art/Level/7/image/329.png differ diff --git a/Assets/Art/Level/7/image/333.png b/Assets/Art/Level/7/image/333.png index d54ec00f..5d1a3489 100644 Binary files a/Assets/Art/Level/7/image/333.png and b/Assets/Art/Level/7/image/333.png differ diff --git a/Assets/Art/Level/7/image/335.png b/Assets/Art/Level/7/image/335.png index a76a3be2..8ab7f094 100644 Binary files a/Assets/Art/Level/7/image/335.png and b/Assets/Art/Level/7/image/335.png differ diff --git a/Assets/Art/Level/7/image/340.png b/Assets/Art/Level/7/image/340.png index e5f3a45e..fcc814a2 100644 Binary files a/Assets/Art/Level/7/image/340.png and b/Assets/Art/Level/7/image/340.png differ diff --git a/Assets/Art/Level/7/image/342.png b/Assets/Art/Level/7/image/342.png index 64fc5f9d..b9f10f97 100644 Binary files a/Assets/Art/Level/7/image/342.png and b/Assets/Art/Level/7/image/342.png differ diff --git a/Assets/Art/Level/7/image/345.png b/Assets/Art/Level/7/image/345.png index d6425999..c761266f 100644 Binary files a/Assets/Art/Level/7/image/345.png and b/Assets/Art/Level/7/image/345.png differ diff --git a/Assets/Art/Level/7/image/353.png b/Assets/Art/Level/7/image/353.png index f6f471a2..8fb7ffd5 100644 Binary files a/Assets/Art/Level/7/image/353.png and b/Assets/Art/Level/7/image/353.png differ diff --git a/Assets/Art/Level/7/image/355.png b/Assets/Art/Level/7/image/355.png index add46e70..02dfbd11 100644 Binary files a/Assets/Art/Level/7/image/355.png and b/Assets/Art/Level/7/image/355.png differ diff --git a/Assets/Art/Level/7/image/357.png b/Assets/Art/Level/7/image/357.png index ce3adff4..bda65f3f 100644 Binary files a/Assets/Art/Level/7/image/357.png and b/Assets/Art/Level/7/image/357.png differ diff --git a/Assets/Art/Level/7/image/361.png b/Assets/Art/Level/7/image/361.png index be8cf986..72b2f2c3 100644 Binary files a/Assets/Art/Level/7/image/361.png and b/Assets/Art/Level/7/image/361.png differ diff --git a/Assets/Art/Level/7/image/365_IMG_ITEM_BASHILTU2.png b/Assets/Art/Level/7/image/365_IMG_ITEM_BASHILTU2.png index 0e768bfd..eda1622f 100644 Binary files a/Assets/Art/Level/7/image/365_IMG_ITEM_BASHILTU2.png and b/Assets/Art/Level/7/image/365_IMG_ITEM_BASHILTU2.png differ diff --git a/Assets/Art/Level/7/image/368_IMG_ITEM_DON.png b/Assets/Art/Level/7/image/368_IMG_ITEM_DON.png index 51b16321..df20e3f3 100644 Binary files a/Assets/Art/Level/7/image/368_IMG_ITEM_DON.png and b/Assets/Art/Level/7/image/368_IMG_ITEM_DON.png differ diff --git a/Assets/Art/Level/7/image/371_IMG_ITEM_SHU_.png b/Assets/Art/Level/7/image/371_IMG_ITEM_SHU_.png index d0e98092..e4166403 100644 Binary files a/Assets/Art/Level/7/image/371_IMG_ITEM_SHU_.png and b/Assets/Art/Level/7/image/371_IMG_ITEM_SHU_.png differ diff --git a/Assets/Art/Level/8/image/109_IMG_COVER_29.png b/Assets/Art/Level/8/image/109_IMG_COVER_29.png index 7a5675b5..fc8f1796 100644 Binary files a/Assets/Art/Level/8/image/109_IMG_COVER_29.png and b/Assets/Art/Level/8/image/109_IMG_COVER_29.png differ diff --git a/Assets/Art/Level/8/image/147_IMG_SITUATION_ICON_29.png b/Assets/Art/Level/8/image/147_IMG_SITUATION_ICON_29.png index e14f8ed9..3c3c1f2f 100644 Binary files a/Assets/Art/Level/8/image/147_IMG_SITUATION_ICON_29.png and b/Assets/Art/Level/8/image/147_IMG_SITUATION_ICON_29.png differ diff --git a/Assets/Art/Level/8/image/178_IMG_SITUATION_LOGO_29.png b/Assets/Art/Level/8/image/178_IMG_SITUATION_LOGO_29.png index 8e8f4cc8..7708149b 100644 Binary files a/Assets/Art/Level/8/image/178_IMG_SITUATION_LOGO_29.png and b/Assets/Art/Level/8/image/178_IMG_SITUATION_LOGO_29.png differ diff --git a/Assets/Art/Level/8/image/422.png b/Assets/Art/Level/8/image/422.png index 16c99b3d..a40990c9 100644 Binary files a/Assets/Art/Level/8/image/422.png and b/Assets/Art/Level/8/image/422.png differ diff --git a/Assets/Art/Level/8/image/424.png b/Assets/Art/Level/8/image/424.png index 6ae120ea..a57f4381 100644 Binary files a/Assets/Art/Level/8/image/424.png and b/Assets/Art/Level/8/image/424.png differ diff --git a/Assets/Art/Level/8/image/426.png b/Assets/Art/Level/8/image/426.png index eb5da251..a72f0d32 100644 Binary files a/Assets/Art/Level/8/image/426.png and b/Assets/Art/Level/8/image/426.png differ diff --git a/Assets/Art/Level/8/image/429.png b/Assets/Art/Level/8/image/429.png index 4d15d073..d020ea9c 100644 Binary files a/Assets/Art/Level/8/image/429.png and b/Assets/Art/Level/8/image/429.png differ diff --git a/Assets/Art/Level/8/image/432.png b/Assets/Art/Level/8/image/432.png index fff9c60e..3a5818f4 100644 Binary files a/Assets/Art/Level/8/image/432.png and b/Assets/Art/Level/8/image/432.png differ diff --git a/Assets/Art/Level/8/image/435.png b/Assets/Art/Level/8/image/435.png index 1a78dc7a..7148d714 100644 Binary files a/Assets/Art/Level/8/image/435.png and b/Assets/Art/Level/8/image/435.png differ diff --git a/Assets/Art/Level/8/image/438.png b/Assets/Art/Level/8/image/438.png index e9764f24..b63896d6 100644 Binary files a/Assets/Art/Level/8/image/438.png and b/Assets/Art/Level/8/image/438.png differ diff --git a/Assets/Art/Level/8/image/440.png b/Assets/Art/Level/8/image/440.png index 7fc1268b..50ad0ca8 100644 Binary files a/Assets/Art/Level/8/image/440.png and b/Assets/Art/Level/8/image/440.png differ diff --git a/Assets/Art/Level/8/image/443.png b/Assets/Art/Level/8/image/443.png index 2c3d2fd2..9061c0a0 100644 Binary files a/Assets/Art/Level/8/image/443.png and b/Assets/Art/Level/8/image/443.png differ diff --git a/Assets/Art/Level/8/image/446.png b/Assets/Art/Level/8/image/446.png index 161da693..ae1809bd 100644 Binary files a/Assets/Art/Level/8/image/446.png and b/Assets/Art/Level/8/image/446.png differ diff --git a/Assets/Art/Level/8/image/449.png b/Assets/Art/Level/8/image/449.png index f5b4f32f..2a35b730 100644 Binary files a/Assets/Art/Level/8/image/449.png and b/Assets/Art/Level/8/image/449.png differ diff --git a/Assets/Art/Level/8/image/452.png b/Assets/Art/Level/8/image/452.png index 09de6e76..13b9dc83 100644 Binary files a/Assets/Art/Level/8/image/452.png and b/Assets/Art/Level/8/image/452.png differ diff --git a/Assets/Art/Level/8/image/455.png b/Assets/Art/Level/8/image/455.png index a507f0a2..6812036b 100644 Binary files a/Assets/Art/Level/8/image/455.png and b/Assets/Art/Level/8/image/455.png differ diff --git a/Assets/Art/Level/8/image/457.png b/Assets/Art/Level/8/image/457.png index fe05738e..3e08974f 100644 Binary files a/Assets/Art/Level/8/image/457.png and b/Assets/Art/Level/8/image/457.png differ diff --git a/Assets/Art/Level/8/image/459.png b/Assets/Art/Level/8/image/459.png index db81630c..85ba2eb0 100644 Binary files a/Assets/Art/Level/8/image/459.png and b/Assets/Art/Level/8/image/459.png differ diff --git a/Assets/Art/Level/8/image/461.png b/Assets/Art/Level/8/image/461.png index 3a4982e1..2a3140c6 100644 Binary files a/Assets/Art/Level/8/image/461.png and b/Assets/Art/Level/8/image/461.png differ diff --git a/Assets/Art/Level/8/image/464.png b/Assets/Art/Level/8/image/464.png index c1f683ec..86bae788 100644 Binary files a/Assets/Art/Level/8/image/464.png and b/Assets/Art/Level/8/image/464.png differ diff --git a/Assets/Art/Level/8/image/467.png b/Assets/Art/Level/8/image/467.png index 968fb8ce..6cb0d15d 100644 Binary files a/Assets/Art/Level/8/image/467.png and b/Assets/Art/Level/8/image/467.png differ diff --git a/Assets/Art/Level/8/image/470.png b/Assets/Art/Level/8/image/470.png index e2592747..cac20597 100644 Binary files a/Assets/Art/Level/8/image/470.png and b/Assets/Art/Level/8/image/470.png differ diff --git a/Assets/Art/Level/8/image/473.png b/Assets/Art/Level/8/image/473.png index cc4afe8e..ee1d70bd 100644 Binary files a/Assets/Art/Level/8/image/473.png and b/Assets/Art/Level/8/image/473.png differ diff --git a/Assets/Art/Level/8/image/476.png b/Assets/Art/Level/8/image/476.png index 1a1478ed..682d6c9f 100644 Binary files a/Assets/Art/Level/8/image/476.png and b/Assets/Art/Level/8/image/476.png differ diff --git a/Assets/Art/Level/8/image/479.png b/Assets/Art/Level/8/image/479.png index 6cad83f3..97844d7c 100644 Binary files a/Assets/Art/Level/8/image/479.png and b/Assets/Art/Level/8/image/479.png differ diff --git a/Assets/Art/Level/8/image/482.png b/Assets/Art/Level/8/image/482.png index 26470f50..cb4d0bb1 100644 Binary files a/Assets/Art/Level/8/image/482.png and b/Assets/Art/Level/8/image/482.png differ diff --git a/Assets/Art/Level/8/image/486.png b/Assets/Art/Level/8/image/486.png index 06b87a48..cc069abd 100644 Binary files a/Assets/Art/Level/8/image/486.png and b/Assets/Art/Level/8/image/486.png differ diff --git a/Assets/Art/Level/8/image/488.png b/Assets/Art/Level/8/image/488.png index 533287eb..29dc96d0 100644 Binary files a/Assets/Art/Level/8/image/488.png and b/Assets/Art/Level/8/image/488.png differ diff --git a/Assets/Art/Level/8/image/493.png b/Assets/Art/Level/8/image/493.png index 7aac49b9..997d3a7a 100644 Binary files a/Assets/Art/Level/8/image/493.png and b/Assets/Art/Level/8/image/493.png differ diff --git a/Assets/Art/Level/8/image/498.png b/Assets/Art/Level/8/image/498.png index 29899fdb..9488e19f 100644 Binary files a/Assets/Art/Level/8/image/498.png and b/Assets/Art/Level/8/image/498.png differ diff --git a/Assets/Art/Level/8/image/504.png b/Assets/Art/Level/8/image/504.png index 47a83f83..0841cf5d 100644 Binary files a/Assets/Art/Level/8/image/504.png and b/Assets/Art/Level/8/image/504.png differ diff --git a/Assets/Art/Level/8/image/506.png b/Assets/Art/Level/8/image/506.png index 301fc0b5..b97a6491 100644 Binary files a/Assets/Art/Level/8/image/506.png and b/Assets/Art/Level/8/image/506.png differ diff --git a/Assets/Art/Level/8/image/513.png b/Assets/Art/Level/8/image/513.png index f31ecb1c..5f296ca7 100644 Binary files a/Assets/Art/Level/8/image/513.png and b/Assets/Art/Level/8/image/513.png differ diff --git a/Assets/Art/Level/8/image/515.png b/Assets/Art/Level/8/image/515.png index e73f4c76..c1af3fdc 100644 Binary files a/Assets/Art/Level/8/image/515.png and b/Assets/Art/Level/8/image/515.png differ diff --git a/Assets/Art/Level/8/image/520.png b/Assets/Art/Level/8/image/520.png index 67ac992e..ab320198 100644 Binary files a/Assets/Art/Level/8/image/520.png and b/Assets/Art/Level/8/image/520.png differ diff --git a/Assets/Art/Level/8/image/524.png b/Assets/Art/Level/8/image/524.png index b7f1a736..8cfec6b5 100644 Binary files a/Assets/Art/Level/8/image/524.png and b/Assets/Art/Level/8/image/524.png differ diff --git a/Assets/Art/Level/8/image/527_IMG_ITEM_ZABUZABU.png b/Assets/Art/Level/8/image/527_IMG_ITEM_ZABUZABU.png index df71da17..4148cd5f 100644 Binary files a/Assets/Art/Level/8/image/527_IMG_ITEM_ZABUZABU.png and b/Assets/Art/Level/8/image/527_IMG_ITEM_ZABUZABU.png differ diff --git a/Assets/Art/Level/8/image/530_IMG_ITEM_OGYA_.png b/Assets/Art/Level/8/image/530_IMG_ITEM_OGYA_.png index acae64c9..d63cb01f 100644 Binary files a/Assets/Art/Level/8/image/530_IMG_ITEM_OGYA_.png and b/Assets/Art/Level/8/image/530_IMG_ITEM_OGYA_.png differ diff --git a/Assets/Art/Level/8/image/533_IMG_ITEM_CHAPU.png b/Assets/Art/Level/8/image/533_IMG_ITEM_CHAPU.png index 48c46ac4..679e3b75 100644 Binary files a/Assets/Art/Level/8/image/533_IMG_ITEM_CHAPU.png and b/Assets/Art/Level/8/image/533_IMG_ITEM_CHAPU.png differ diff --git a/Assets/Art/Level/9/image/2062.png b/Assets/Art/Level/9/image/2062.png index 3953ae20..70439f93 100644 Binary files a/Assets/Art/Level/9/image/2062.png and b/Assets/Art/Level/9/image/2062.png differ diff --git a/Assets/Art/Level/9/image/2064.png b/Assets/Art/Level/9/image/2064.png index c53d0422..60d1194f 100644 Binary files a/Assets/Art/Level/9/image/2064.png and b/Assets/Art/Level/9/image/2064.png differ diff --git a/Assets/Art/Level/9/image/2067.png b/Assets/Art/Level/9/image/2067.png index c3c02eb3..70636cd4 100644 Binary files a/Assets/Art/Level/9/image/2067.png and b/Assets/Art/Level/9/image/2067.png differ diff --git a/Assets/Art/Level/9/image/2069.png b/Assets/Art/Level/9/image/2069.png index a9e544a8..679a6abb 100644 Binary files a/Assets/Art/Level/9/image/2069.png and b/Assets/Art/Level/9/image/2069.png differ diff --git a/Assets/Art/Level/9/image/2072.png b/Assets/Art/Level/9/image/2072.png index 8fdaaae1..225a9c26 100644 Binary files a/Assets/Art/Level/9/image/2072.png and b/Assets/Art/Level/9/image/2072.png differ diff --git a/Assets/Art/Level/9/image/2074.png b/Assets/Art/Level/9/image/2074.png index a1db4e10..253d37fa 100644 Binary files a/Assets/Art/Level/9/image/2074.png and b/Assets/Art/Level/9/image/2074.png differ diff --git a/Assets/Art/Level/9/image/2077.png b/Assets/Art/Level/9/image/2077.png index b6e0b096..e1a931af 100644 Binary files a/Assets/Art/Level/9/image/2077.png and b/Assets/Art/Level/9/image/2077.png differ diff --git a/Assets/Art/Level/9/image/2079.png b/Assets/Art/Level/9/image/2079.png index 2571c222..55ef85e3 100644 Binary files a/Assets/Art/Level/9/image/2079.png and b/Assets/Art/Level/9/image/2079.png differ diff --git a/Assets/Art/Level/9/image/2082.png b/Assets/Art/Level/9/image/2082.png index bfdaf846..eb9451dd 100644 Binary files a/Assets/Art/Level/9/image/2082.png and b/Assets/Art/Level/9/image/2082.png differ diff --git a/Assets/Art/Level/9/image/2084.png b/Assets/Art/Level/9/image/2084.png index fe68e863..97674898 100644 Binary files a/Assets/Art/Level/9/image/2084.png and b/Assets/Art/Level/9/image/2084.png differ diff --git a/Assets/Art/Level/9/image/2086.png b/Assets/Art/Level/9/image/2086.png index cbd9768c..3fd885f1 100644 Binary files a/Assets/Art/Level/9/image/2086.png and b/Assets/Art/Level/9/image/2086.png differ diff --git a/Assets/Art/Level/9/image/2089.png b/Assets/Art/Level/9/image/2089.png index cb771c3c..f3ac2ffa 100644 Binary files a/Assets/Art/Level/9/image/2089.png and b/Assets/Art/Level/9/image/2089.png differ diff --git a/Assets/Art/Level/9/image/2092.png b/Assets/Art/Level/9/image/2092.png index 6119a180..fdf31b3a 100644 Binary files a/Assets/Art/Level/9/image/2092.png and b/Assets/Art/Level/9/image/2092.png differ diff --git a/Assets/Art/Level/9/image/2094.png b/Assets/Art/Level/9/image/2094.png index 129a246d..8a27468c 100644 Binary files a/Assets/Art/Level/9/image/2094.png and b/Assets/Art/Level/9/image/2094.png differ diff --git a/Assets/Art/Level/9/image/2098.png b/Assets/Art/Level/9/image/2098.png index 07041000..082b3e1a 100644 Binary files a/Assets/Art/Level/9/image/2098.png and b/Assets/Art/Level/9/image/2098.png differ diff --git a/Assets/Art/Level/9/image/2103.png b/Assets/Art/Level/9/image/2103.png index 6712ef27..8b010232 100644 Binary files a/Assets/Art/Level/9/image/2103.png and b/Assets/Art/Level/9/image/2103.png differ diff --git a/Assets/Art/Level/9/image/2107_IMG_ITEM_GASHAN.png b/Assets/Art/Level/9/image/2107_IMG_ITEM_GASHAN.png index 9fc9573d..d111d1ee 100644 Binary files a/Assets/Art/Level/9/image/2107_IMG_ITEM_GASHAN.png and b/Assets/Art/Level/9/image/2107_IMG_ITEM_GASHAN.png differ diff --git a/Assets/Art/Level/9/image/2110_IMG_ITEM_POCHILTU.png b/Assets/Art/Level/9/image/2110_IMG_ITEM_POCHILTU.png index 56affe62..581e1a4a 100644 Binary files a/Assets/Art/Level/9/image/2110_IMG_ITEM_POCHILTU.png and b/Assets/Art/Level/9/image/2110_IMG_ITEM_POCHILTU.png differ diff --git a/Assets/Art/Level/9/image/2113_IMG_ITEM_ULI_NN.png b/Assets/Art/Level/9/image/2113_IMG_ITEM_ULI_NN.png index 2da272fb..36337cce 100644 Binary files a/Assets/Art/Level/9/image/2113_IMG_ITEM_ULI_NN.png and b/Assets/Art/Level/9/image/2113_IMG_ITEM_ULI_NN.png differ diff --git a/Assets/Art/Level/9/image/515.png b/Assets/Art/Level/9/image/515.png index e73f4c76..b10a1221 100644 Binary files a/Assets/Art/Level/9/image/515.png and b/Assets/Art/Level/9/image/515.png differ diff --git a/Assets/Art/UI/Victory/piece.mat b/Assets/Art/UI/Victory/piece.mat index e0588c7b..5c15a0bf 100644 --- a/Assets/Art/UI/Victory/piece.mat +++ b/Assets/Art/UI/Victory/piece.mat @@ -2,14 +2,16 @@ %TAG !u! tag:unity3d.com,2011: --- !u!21 &2100000 Material: - serializedVersion: 6 + serializedVersion: 8 m_ObjectHideFlags: 0 m_CorrespondingSourceObject: {fileID: 0} m_PrefabInstance: {fileID: 0} m_PrefabAsset: {fileID: 0} m_Name: piece m_Shader: {fileID: 211, guid: 0000000000000000f000000000000000, type: 0} - m_ShaderKeywords: _ALPHABLEND_ON + m_ValidKeywords: + - _ALPHABLEND_ON + m_InvalidKeywords: [] m_LightmapFlags: 0 m_EnableInstancingVariants: 0 m_DoubleSidedGI: 0 @@ -17,7 +19,7 @@ Material: stringTagMap: RenderType: Transparent disabledShaderPasses: - - ALWAYS + - GRABPASS m_SavedProperties: serializedVersion: 3 m_TexEnvs: @@ -33,6 +35,7 @@ Material: m_Texture: {fileID: 2800000, guid: 4ae622d6d6c1bbd4fb4e4fc03290b585, type: 3} m_Scale: {x: 1, y: 1} m_Offset: {x: 0, y: 0} + m_Ints: [] m_Floats: - _BlendOp: 0 - _BumpScale: 1 @@ -62,3 +65,4 @@ Material: - _ColorAddSubDiff: {r: 0, g: 0, b: 0, a: 0} - _EmissionColor: {r: 0, g: 0, b: 0, a: 1} - _SoftParticleFadeParams: {r: 0, g: 0, b: 0, a: 0} + m_BuildTextureStacks: [] diff --git a/Assets/Editor/StarkBuilderSetting.asset b/Assets/Editor/StarkBuilderSetting.asset index b2c0afec..27b3baa4 100644 --- a/Assets/Editor/StarkBuilderSetting.asset +++ b/Assets/Editor/StarkBuilderSetting.asset @@ -9,20 +9,31 @@ MonoBehaviour: m_GameObject: {fileID: 0} m_Enabled: 1 m_EditorHideFlags: 0 - m_Script: {fileID: -375266806, guid: 537494521630842e4908164366ce4901, type: 3} + m_Script: {fileID: 1315287583, guid: c24e371c16cf76e45ae311c35c2d5fd1, type: 3} m_Name: StarkBuilderSetting m_EditorClassIdentifier: - a: 0 - b: 0 - c: tt48073ebad739259407 - d: out_apk_chicken - e: 2 - f: 2 - g: 0 - h: 0 - i: 2 - j: 0 - k: 0 - l: + isDevBuild: 0 + stripEngineCode: 0 + appId: tt48073ebad739259407 + version: 1.0.32 + isWebGL2: 0 + needCompress: 1 + wasmResourceUrl: http:// + webglPackagePath: /Users/junconglee/Desktop/TKG_Game/Chicken_WebGLUnity_2019_dy_android_new_tp/Build/webgl/webgl_package-20240307_191704.zip + useByteAudioAPI: 0 + wasmMemorySize: 512 + urlCacheList: [] + dontCacheFileNames: [] + apkFileNameBase: DYChicken + appHost: 2 + compressMethod: 1 + runtimeEnv: 0 + framework: 1 + architecture: 2 + miniApkVersion: 1 + scriptingBackend: 0 + publishType: 1 + buildOptions: 0 + NativeWhiteListRegex: - com.bytedance.starksdk - _Backup~ diff --git a/Assets/Plugins/ByteGame/com.bytedance.starksdk/Runtime.meta b/Assets/HCMiniSdk.meta similarity index 77% rename from Assets/Plugins/ByteGame/com.bytedance.starksdk/Runtime.meta rename to Assets/HCMiniSdk.meta index c033d4fd..ad60b714 100644 --- a/Assets/Plugins/ByteGame/com.bytedance.starksdk/Runtime.meta +++ b/Assets/HCMiniSdk.meta @@ -1,5 +1,5 @@ fileFormatVersion: 2 -guid: 9cd0f6dbad72844268d78fd14078795c +guid: db81b3b5494fc4ac59453b617a8d6545 folderAsset: yes DefaultImporter: externalObjects: {} diff --git a/Assets/Plugins/ByteGame/com.bytedance.starksdk/UNBridge.meta b/Assets/HCMiniSdk/Config.meta similarity index 77% rename from Assets/Plugins/ByteGame/com.bytedance.starksdk/UNBridge.meta rename to Assets/HCMiniSdk/Config.meta index ec0b2dfe..4961b2d5 100644 --- a/Assets/Plugins/ByteGame/com.bytedance.starksdk/UNBridge.meta +++ b/Assets/HCMiniSdk/Config.meta @@ -1,5 +1,5 @@ fileFormatVersion: 2 -guid: d1dcba75f3ed242b2b6dbbaa3e305b53 +guid: 1b0333a7746eb4e4bb1a6690a3a4bc40 folderAsset: yes DefaultImporter: externalObjects: {} diff --git a/Assets/Plugins/ByteGame/com.bytedance.starksdk/ByteREC.meta b/Assets/HCMiniSdk/Config/Scripts.meta similarity index 73% rename from Assets/Plugins/ByteGame/com.bytedance.starksdk/ByteREC.meta rename to Assets/HCMiniSdk/Config/Scripts.meta index f2a7a877..9566cbb8 100644 --- a/Assets/Plugins/ByteGame/com.bytedance.starksdk/ByteREC.meta +++ b/Assets/HCMiniSdk/Config/Scripts.meta @@ -1,8 +1,8 @@ -fileFormatVersion: 2 -guid: 9ebd0939c953449aead728d125ec8392 -folderAsset: yes -DefaultImporter: - externalObjects: {} - userData: - assetBundleName: - assetBundleVariant: +fileFormatVersion: 2 +guid: 736befd258ac649d5ab41611ed08a2b4 +folderAsset: yes +DefaultImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/HCMiniSdk/Config/Scripts/HCAdPositionDefine.cs b/Assets/HCMiniSdk/Config/Scripts/HCAdPositionDefine.cs new file mode 100644 index 00000000..7aa9a505 --- /dev/null +++ b/Assets/HCMiniSdk/Config/Scripts/HCAdPositionDefine.cs @@ -0,0 +1,48 @@ +namespace HC +{ + public enum HCIVADType + { + NULL = -1, + IV1 = 0, + IV2, + IV3, + IV4, + IV5, + IV6, + IV7, + IV8 + } + + + public enum HCIVPositionName + { + Game_Autoiv, + + IV_Success, + IV_Fail, + IV_Retry, + IV_NextLevel, + IV_Back, + gaming_select, + end_game_retry, + end_game_next, + end_game_select, + resultpanel, + IV_Spin + } + + public enum HCRVPositionName + { + GetDoubleCoin, + GetTips, + RV_GetDoubleCoin, + RV_GetTips, + RV_Get_Tips, + RV_Get_Skip, + RV_Get_Revive, + RV_Get_SpecialLevel, + RV_sound_unlock, + RV_level_unlock, + RV_end_skip, + } +} \ No newline at end of file diff --git a/Assets/HCMiniSdk/Config/Scripts/HCAdPositionDefine.cs.meta b/Assets/HCMiniSdk/Config/Scripts/HCAdPositionDefine.cs.meta new file mode 100644 index 00000000..ae47a43a --- /dev/null +++ b/Assets/HCMiniSdk/Config/Scripts/HCAdPositionDefine.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: d7c780735a7e449f5866cc7b4503087d +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/HCMiniSdk/Config/Scripts/HCOtherConfigs.cs b/Assets/HCMiniSdk/Config/Scripts/HCOtherConfigs.cs new file mode 100644 index 00000000..149576ef --- /dev/null +++ b/Assets/HCMiniSdk/Config/Scripts/HCOtherConfigs.cs @@ -0,0 +1,14 @@ +using System.Collections; +using System.Collections.Generic; +using UnityEngine; + +namespace HC +{ + public class HCOtherConfigs + { + /// + /// debug switch + /// + public static bool IsDebugLog = true; + } +} diff --git a/Assets/HCMiniSdk/Config/Scripts/HCOtherConfigs.cs.meta b/Assets/HCMiniSdk/Config/Scripts/HCOtherConfigs.cs.meta new file mode 100644 index 00000000..1f2df165 --- /dev/null +++ b/Assets/HCMiniSdk/Config/Scripts/HCOtherConfigs.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: dd041015f7186484c91920c498cfbc22 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/HCMiniSdk/Config/Scripts/HCStaticParams.cs b/Assets/HCMiniSdk/Config/Scripts/HCStaticParams.cs new file mode 100644 index 00000000..98a516a2 --- /dev/null +++ b/Assets/HCMiniSdk/Config/Scripts/HCStaticParams.cs @@ -0,0 +1,109 @@ +using System.Collections; +using System.Collections.Generic; +using UnityEngine; + +namespace HC +{ + public static class HCStaticParams + { + + +#if WEBGL_WX + + // 友盟id + public static string UMENG_ID = "111"; + + // 数数埋点配置, 如果不配置,不会进行始化 + public static string TDAppId = ""; //demo id = b14660acc69f454ab45a5c8182777724 + public static string TDServerUrl = "https://ss.dgtverse.cn"; // + + + // 支付key + public static string PAY_OFFERID = "1450154409"; + + // Ads + public static string BannerAdUnitID = "adunit-1275aef9ec5b6c6e"; + + public static string InterAdUnitID = "adunit-477a114617621f0e"; + + // 提审模式下激励视频广告位ID + public static string ReviewRewardUnitId = "adunit-1f8d99004f8fefe2"; + + // 线上激励视频广告位ID + public static string RewardAdUnitID = "adunit-1f8d99004f8fefe2"; + + public static string NativeAdUnitID1 = "test-1"; + public static string NativeAdUnitID2 = "test-2"; + public static string NativeAdUnitID3 = "test-3"; + public static string NativeAdUnitID4 = "test-4"; + + private static HCNativeAdUnit HCNativeAdUnit1 = new HCNativeAdUnit("adunit-404c299843d1088e", 5, 5, TextAnchor.MiddleCenter, + new HCNativeAdUnit("adunit-52f9e3736648a512", 4, 5, + fit: new HCNativeAdUnit("adunit-6aa81f49d8a8c4a5", 3, 5, + fit: new HCNativeAdUnit("adunit-c2e21a5ede6f1ca0", 2, 5)))); + + private static HCNativeAdUnit HCNativeAdUnit2 = new HCNativeAdUnit("adunit-0340f300a558cb12", 5, 5, isFull: true); + private static HCNativeAdUnit HCNativeAdUnit3 = new HCNativeAdUnit("adunit-cd2f17188ded766d", 1, 5, TextAnchor.UpperLeft); + private static HCNativeAdUnit HCNativeAdUnit4 = new HCNativeAdUnit("adunit-8f5b651e53f72100", 1, 5, TextAnchor.LowerCenter); + + + public static Dictionary NativeAdUnitIDDictionary = new Dictionary + { + [NativeAdUnitID1] = HCNativeAdUnit1, + [NativeAdUnitID2] = HCNativeAdUnit2, + [NativeAdUnitID3] = HCNativeAdUnit3, + [NativeAdUnitID4] = HCNativeAdUnit4, + }; +#elif WEBGL_BYTEDANCE + + // 数数埋点配置, 如果不配置,不会进行始化 + public static string TDAppId = "b14660acc69f454ab45a5c8182777724"; //demo id = b14660acc69f454ab45a5c8182777724 + public static string TDServerUrl = "https://ss.dgtverse.cn"; // + // Ads + public static string BytedanceAppId = "tt48073ebad739259407"; + + public static string BannerAdUnitID = "gifhp9rf68922c59e1"; + + public static string InterAdUnitID = "dd5iaf297h193cbbfn"; + + // 提审模式下激励视频广告位ID + public static string ReviewRewardUnitId = RewardAdUnitID; + + // 线上激励视频广告位ID + public static string RewardAdUnitID = "oa31oo12lhr20333ed"; + + public static Dictionary NativeAdUnitIDDictionary = new Dictionary + { + }; + public static string NativeAdUnitID1 = "test-1"; + public static string NativeAdUnitID2 = "test-2"; + public static string NativeAdUnitID3 = "test-3"; + public static string NativeAdUnitID4 = "test-4"; +#else + // 数数埋点配置, 如果不配置,不会进行始化 + public static string TDAppId = "b14660acc69f454ab45a5c8182777724"; //demo id = b14660acc69f454ab45a5c8182777724 + public static string TDServerUrl = "https://ss.zolnm.com"; // + // Ads + public static string BytedanceAppId = "tt593c2f81c60de1cf07"; + + public static string BannerAdUnitID = "2klk6483gike22jjf4"; + + public static string InterAdUnitID = "57cne4qci2g2h3g6lm"; + + // 提审模式下激励视频广告位ID + public static string ReviewRewardUnitId = RewardAdUnitID; + + // 线上激励视频广告位ID + public static string RewardAdUnitID = "16568k956ll11k514l"; + + public static Dictionary NativeAdUnitIDDictionary = new Dictionary + { + }; + public static string NativeAdUnitID1 = "test-1"; + public static string NativeAdUnitID2 = "test-2"; + public static string NativeAdUnitID3 = "test-3"; + public static string NativeAdUnitID4 = "test-4"; + +#endif + } +} \ No newline at end of file diff --git a/Assets/HCMiniSdk/Config/Scripts/HCStaticParams.cs.meta b/Assets/HCMiniSdk/Config/Scripts/HCStaticParams.cs.meta new file mode 100644 index 00000000..6ac2aebb --- /dev/null +++ b/Assets/HCMiniSdk/Config/Scripts/HCStaticParams.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: f9c029dc0e0fa4bec830382a98190e74 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/HCMiniSdk/Demo.meta b/Assets/HCMiniSdk/Demo.meta new file mode 100644 index 00000000..3141a763 --- /dev/null +++ b/Assets/HCMiniSdk/Demo.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: 6c9c4f36ed193469a92e8050f7e522b3 +folderAsset: yes +DefaultImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/HCMiniSdk/Demo/Resources.meta b/Assets/HCMiniSdk/Demo/Resources.meta new file mode 100644 index 00000000..9d4e1c87 --- /dev/null +++ b/Assets/HCMiniSdk/Demo/Resources.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: eb2799a5272464356a335b0c2956cf27 +folderAsset: yes +DefaultImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/HCMiniSdk/Demo/Resources/LoginDemoView.prefab b/Assets/HCMiniSdk/Demo/Resources/LoginDemoView.prefab new file mode 100644 index 00000000..7c1008ed --- /dev/null +++ b/Assets/HCMiniSdk/Demo/Resources/LoginDemoView.prefab @@ -0,0 +1,4144 @@ +%YAML 1.1 +%TAG !u! tag:unity3d.com,2011: +--- !u!1 &1783675487 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 1783675488} + - component: {fileID: 1783675491} + - component: {fileID: 1783675490} + - component: {fileID: 1783675489} + m_Layer: 5 + m_Name: BackButton + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!224 &1783675488 +RectTransform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1783675487} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: 0, y: 0, z: 0} + m_LocalScale: {x: 1, y: 1, z: 1} + m_ConstrainProportionsScale: 0 + m_Children: + - {fileID: 2122056608} + m_Father: {fileID: 4294162434102936163} + m_RootOrder: 3 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} + m_AnchorMin: {x: 0.5, y: 0.5} + m_AnchorMax: {x: 0.5, y: 0.5} + m_AnchoredPosition: {x: -400, y: 861} + m_SizeDelta: {x: 180, y: 100} + m_Pivot: {x: 0.5, y: 0.5} +--- !u!222 &1783675491 +CanvasRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1783675487} + m_CullTransparentMesh: 1 +--- !u!114 &1783675490 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1783675487} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: fe87c0e1cc204ed48ad3b37840f39efc, type: 3} + m_Name: + m_EditorClassIdentifier: + m_Material: {fileID: 0} + m_Color: {r: 1, g: 1, b: 1, a: 1} + m_RaycastTarget: 1 + m_RaycastPadding: {x: 0, y: 0, z: 0, w: 0} + m_Maskable: 1 + m_OnCullStateChanged: + m_PersistentCalls: + m_Calls: [] + m_Sprite: {fileID: 10905, guid: 0000000000000000f000000000000000, type: 0} + m_Type: 1 + m_PreserveAspect: 0 + m_FillCenter: 1 + m_FillMethod: 4 + m_FillAmount: 1 + m_FillClockwise: 1 + m_FillOrigin: 0 + m_UseSpriteMesh: 0 + m_PixelsPerUnitMultiplier: 1 +--- !u!114 &1783675489 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1783675487} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 4e29b1a8efbd4b44bb3f3716e73f07ff, type: 3} + m_Name: + m_EditorClassIdentifier: + m_Navigation: + m_Mode: 3 + m_WrapAround: 0 + m_SelectOnUp: {fileID: 0} + m_SelectOnDown: {fileID: 0} + m_SelectOnLeft: {fileID: 0} + m_SelectOnRight: {fileID: 0} + m_Transition: 1 + m_Colors: + m_NormalColor: {r: 1, g: 1, b: 1, a: 1} + m_HighlightedColor: {r: 0.9607843, g: 0.9607843, b: 0.9607843, a: 1} + m_PressedColor: {r: 0.78431374, g: 0.78431374, b: 0.78431374, a: 1} + m_SelectedColor: {r: 0.9607843, g: 0.9607843, b: 0.9607843, a: 1} + m_DisabledColor: {r: 0.78431374, g: 0.78431374, b: 0.78431374, a: 0.5019608} + m_ColorMultiplier: 1 + m_FadeDuration: 0.1 + m_SpriteState: + m_HighlightedSprite: {fileID: 0} + m_PressedSprite: {fileID: 0} + m_SelectedSprite: {fileID: 0} + m_DisabledSprite: {fileID: 0} + m_AnimationTriggers: + m_NormalTrigger: Normal + m_HighlightedTrigger: Highlighted + m_PressedTrigger: Pressed + m_SelectedTrigger: Selected + m_DisabledTrigger: Disabled + m_Interactable: 1 + m_TargetGraphic: {fileID: 1783675490} + m_OnClick: + m_PersistentCalls: + m_Calls: + - m_Target: {fileID: 733856151592599062} + m_TargetAssemblyTypeName: HCLoginDemoView, Assembly-CSharp + m_MethodName: ButtonEvent_Back + m_Mode: 1 + m_Arguments: + m_ObjectArgument: {fileID: 0} + m_ObjectArgumentAssemblyTypeName: UnityEngine.Object, UnityEngine + m_IntArgument: 0 + m_FloatArgument: 0 + m_StringArgument: + m_BoolArgument: 0 + m_CallState: 2 +--- !u!1 &2122056607 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 2122056608} + - component: {fileID: 2122056610} + - component: {fileID: 2122056609} + m_Layer: 5 + m_Name: Text + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!224 &2122056608 +RectTransform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 2122056607} + m_LocalRotation: {x: -0, y: -0, z: -0, w: 1} + m_LocalPosition: {x: 0, y: 0, z: 0} + m_LocalScale: {x: 1, y: 1, z: 1} + m_ConstrainProportionsScale: 0 + m_Children: [] + m_Father: {fileID: 1783675488} + m_RootOrder: 0 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} + m_AnchorMin: {x: 0, y: 0} + m_AnchorMax: {x: 1, y: 1} + m_AnchoredPosition: {x: 0, y: 0} + m_SizeDelta: {x: 0, y: 0} + m_Pivot: {x: 0.5, y: 0.5} +--- !u!222 &2122056610 +CanvasRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 2122056607} + m_CullTransparentMesh: 1 +--- !u!114 &2122056609 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 2122056607} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 5f7201a12d95ffc409449d95f23cf332, type: 3} + m_Name: + m_EditorClassIdentifier: + m_Material: {fileID: 0} + m_Color: {r: 0.19607843, g: 0.19607843, b: 0.19607843, a: 1} + m_RaycastTarget: 1 + m_RaycastPadding: {x: 0, y: 0, z: 0, w: 0} + m_Maskable: 1 + m_OnCullStateChanged: + m_PersistentCalls: + m_Calls: [] + m_FontData: + m_Font: {fileID: 10102, guid: 0000000000000000e000000000000000, type: 0} + m_FontSize: 58 + m_FontStyle: 0 + m_BestFit: 0 + m_MinSize: 5 + m_MaxSize: 88 + m_Alignment: 4 + m_AlignByGeometry: 0 + m_RichText: 1 + m_HorizontalOverflow: 0 + m_VerticalOverflow: 0 + m_LineSpacing: 1 + m_Text: Back +--- !u!1 &979353502950905801 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 2487917395142333241} + - component: {fileID: 4629666163876148489} + - component: {fileID: 4770630515246582985} + m_Layer: 5 + m_Name: Text + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!224 &2487917395142333241 +RectTransform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 979353502950905801} + m_LocalRotation: {x: -0, y: -0, z: -0, w: 1} + m_LocalPosition: {x: 0, y: 0, z: 0} + m_LocalScale: {x: 1, y: 1, z: 1} + m_ConstrainProportionsScale: 0 + m_Children: [] + m_Father: {fileID: 884154943731010375} + m_RootOrder: 0 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} + m_AnchorMin: {x: 0, y: 0} + m_AnchorMax: {x: 1, y: 1} + m_AnchoredPosition: {x: 0, y: 0} + m_SizeDelta: {x: 0, y: 0} + m_Pivot: {x: 0.5, y: 0.5} +--- !u!222 &4629666163876148489 +CanvasRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 979353502950905801} + m_CullTransparentMesh: 1 +--- !u!114 &4770630515246582985 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 979353502950905801} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 5f7201a12d95ffc409449d95f23cf332, type: 3} + m_Name: + m_EditorClassIdentifier: + m_Material: {fileID: 0} + m_Color: {r: 0.19607843, g: 0.19607843, b: 0.19607843, a: 1} + m_RaycastTarget: 1 + m_RaycastPadding: {x: 0, y: 0, z: 0, w: 0} + m_Maskable: 1 + m_OnCullStateChanged: + m_PersistentCalls: + m_Calls: [] + m_FontData: + m_Font: {fileID: 10102, guid: 0000000000000000e000000000000000, type: 0} + m_FontSize: 42 + m_FontStyle: 0 + m_BestFit: 0 + m_MinSize: 4 + m_MaxSize: 48 + m_Alignment: 4 + m_AlignByGeometry: 0 + m_RichText: 1 + m_HorizontalOverflow: 0 + m_VerticalOverflow: 0 + m_LineSpacing: 1 + m_Text: GoGameClub +--- !u!1 &1060068668799076826 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 1484711290239480336} + - component: {fileID: 7368618515494672116} + - component: {fileID: 1098092148410739704} + m_Layer: 5 + m_Name: GameClub3 + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!224 &1484711290239480336 +RectTransform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1060068668799076826} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: 0, y: 0, z: 0} + m_LocalScale: {x: 1, y: 1, z: 1} + m_ConstrainProportionsScale: 0 + m_Children: [] + m_Father: {fileID: 4294162432488689155} + m_RootOrder: 10 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} + m_AnchorMin: {x: 0.5, y: 0.5} + m_AnchorMax: {x: 0.5, y: 0.5} + m_AnchoredPosition: {x: 63, y: 264.1} + m_SizeDelta: {x: 100, y: 100} + m_Pivot: {x: 0.5, y: 0.5} +--- !u!222 &7368618515494672116 +CanvasRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1060068668799076826} + m_CullTransparentMesh: 1 +--- !u!114 &1098092148410739704 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1060068668799076826} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: fe87c0e1cc204ed48ad3b37840f39efc, type: 3} + m_Name: + m_EditorClassIdentifier: + m_Material: {fileID: 0} + m_Color: {r: 1, g: 1, b: 1, a: 1} + m_RaycastTarget: 1 + m_RaycastPadding: {x: 0, y: 0, z: 0, w: 0} + m_Maskable: 1 + m_OnCullStateChanged: + m_PersistentCalls: + m_Calls: [] + m_Sprite: {fileID: 0} + m_Type: 0 + m_PreserveAspect: 0 + m_FillCenter: 1 + m_FillMethod: 4 + m_FillAmount: 1 + m_FillClockwise: 1 + m_FillOrigin: 0 + m_UseSpriteMesh: 0 + m_PixelsPerUnitMultiplier: 1 +--- !u!1 &1122331537026448467 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 8446837146461438084} + - component: {fileID: 3745430548880972917} + - component: {fileID: 5258761200634956360} + m_Layer: 5 + m_Name: GameClub + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!224 &8446837146461438084 +RectTransform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1122331537026448467} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: 0, y: 0, z: 0} + m_LocalScale: {x: 1, y: 1, z: 1} + m_ConstrainProportionsScale: 0 + m_Children: [] + m_Father: {fileID: 4294162432488689155} + m_RootOrder: 8 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} + m_AnchorMin: {x: 0.5, y: 0.5} + m_AnchorMax: {x: 0.5, y: 0.5} + m_AnchoredPosition: {x: 312, y: 622} + m_SizeDelta: {x: 300, y: 100} + m_Pivot: {x: 0.5, y: 0.5} +--- !u!222 &3745430548880972917 +CanvasRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1122331537026448467} + m_CullTransparentMesh: 1 +--- !u!114 &5258761200634956360 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1122331537026448467} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: fe87c0e1cc204ed48ad3b37840f39efc, type: 3} + m_Name: + m_EditorClassIdentifier: + m_Material: {fileID: 0} + m_Color: {r: 1, g: 1, b: 1, a: 1} + m_RaycastTarget: 1 + m_RaycastPadding: {x: 0, y: 0, z: 0, w: 0} + m_Maskable: 1 + m_OnCullStateChanged: + m_PersistentCalls: + m_Calls: [] + m_Sprite: {fileID: 0} + m_Type: 0 + m_PreserveAspect: 0 + m_FillCenter: 1 + m_FillMethod: 4 + m_FillAmount: 1 + m_FillClockwise: 1 + m_FillOrigin: 0 + m_UseSpriteMesh: 0 + m_PixelsPerUnitMultiplier: 1 +--- !u!1 &1588024687758389754 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 132285784501508409} + - component: {fileID: 196513439843858978} + - component: {fileID: 92757878356527565} + - component: {fileID: 8303791757745516948} + m_Layer: 5 + m_Name: Toast + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!224 &132285784501508409 +RectTransform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1588024687758389754} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: 0, y: 0, z: 0} + m_LocalScale: {x: 1, y: 1, z: 1} + m_ConstrainProportionsScale: 0 + m_Children: + - {fileID: 5194129794978951985} + m_Father: {fileID: 4294162434102936163} + m_RootOrder: 4 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} + m_AnchorMin: {x: 0.5, y: 0.5} + m_AnchorMax: {x: 0.5, y: 0.5} + m_AnchoredPosition: {x: 0, y: -735} + m_SizeDelta: {x: 740.4584, y: 100} + m_Pivot: {x: 0.5, y: 0.5} +--- !u!222 &196513439843858978 +CanvasRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1588024687758389754} + m_CullTransparentMesh: 1 +--- !u!114 &92757878356527565 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1588024687758389754} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: fe87c0e1cc204ed48ad3b37840f39efc, type: 3} + m_Name: + m_EditorClassIdentifier: + m_Material: {fileID: 0} + m_Color: {r: 0.6320754, g: 0.623131, b: 0.623131, a: 1} + m_RaycastTarget: 1 + m_RaycastPadding: {x: 0, y: 0, z: 0, w: 0} + m_Maskable: 1 + m_OnCullStateChanged: + m_PersistentCalls: + m_Calls: [] + m_Sprite: {fileID: 0} + m_Type: 0 + m_PreserveAspect: 0 + m_FillCenter: 1 + m_FillMethod: 4 + m_FillAmount: 1 + m_FillClockwise: 1 + m_FillOrigin: 0 + m_UseSpriteMesh: 0 + m_PixelsPerUnitMultiplier: 1 +--- !u!114 &8303791757745516948 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1588024687758389754} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 036a9d8642a4e4c729cbd63943c217f7, type: 3} + m_Name: + m_EditorClassIdentifier: + toastText: {fileID: 1405330412556018282} +--- !u!1 &2261921982737803762 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 5575616750695414833} + - component: {fileID: 6069087775497399329} + - component: {fileID: 6959881472029099013} + m_Layer: 5 + m_Name: TitleText + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!224 &5575616750695414833 +RectTransform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 2261921982737803762} + m_LocalRotation: {x: -0, y: -0, z: -0, w: 1} + m_LocalPosition: {x: 0, y: 0, z: 0} + m_LocalScale: {x: 1, y: 1, z: 1} + m_ConstrainProportionsScale: 0 + m_Children: [] + m_Father: {fileID: 4294162432488689155} + m_RootOrder: 0 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} + m_AnchorMin: {x: 0, y: 0} + m_AnchorMax: {x: 1, y: 1} + m_AnchoredPosition: {x: 33.000015, y: 725} + m_SizeDelta: {x: 804.5001, y: 40} + m_Pivot: {x: 0.5, y: 0.5} +--- !u!222 &6069087775497399329 +CanvasRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 2261921982737803762} + m_CullTransparentMesh: 1 +--- !u!114 &6959881472029099013 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 2261921982737803762} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 5f7201a12d95ffc409449d95f23cf332, type: 3} + m_Name: + m_EditorClassIdentifier: + m_Material: {fileID: 0} + m_Color: {r: 0.19607843, g: 0.19607843, b: 0.19607843, a: 1} + m_RaycastTarget: 1 + m_RaycastPadding: {x: 0, y: 0, z: 0, w: 0} + m_Maskable: 1 + m_OnCullStateChanged: + m_PersistentCalls: + m_Calls: [] + m_FontData: + m_Font: {fileID: 10102, guid: 0000000000000000e000000000000000, type: 0} + m_FontSize: 72 + m_FontStyle: 0 + m_BestFit: 0 + m_MinSize: 4 + m_MaxSize: 88 + m_Alignment: 4 + m_AlignByGeometry: 0 + m_RichText: 1 + m_HorizontalOverflow: 0 + m_VerticalOverflow: 0 + m_LineSpacing: 1 + m_Text: Welcome to My Game! +--- !u!1 &3007124851583675366 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 5443178375594607303} + - component: {fileID: 4939898562406212413} + - component: {fileID: 5030995918005629926} + m_Layer: 5 + m_Name: BindAccountInfoText + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!224 &5443178375594607303 +RectTransform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 3007124851583675366} + m_LocalRotation: {x: -0, y: -0, z: -0, w: 1} + m_LocalPosition: {x: 0, y: 0, z: 0} + m_LocalScale: {x: 1, y: 1, z: 1} + m_ConstrainProportionsScale: 0 + m_Children: [] + m_Father: {fileID: 4294162432488689155} + m_RootOrder: 2 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} + m_AnchorMin: {x: 0, y: 0} + m_AnchorMax: {x: 1, y: 1} + m_AnchoredPosition: {x: 33.000015, y: 372} + m_SizeDelta: {x: 804.5001, y: 40} + m_Pivot: {x: 0.5, y: 0.5} +--- !u!222 &4939898562406212413 +CanvasRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 3007124851583675366} + m_CullTransparentMesh: 1 +--- !u!114 &5030995918005629926 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 3007124851583675366} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 5f7201a12d95ffc409449d95f23cf332, type: 3} + m_Name: + m_EditorClassIdentifier: + m_Material: {fileID: 0} + m_Color: {r: 0.19607843, g: 0.19607843, b: 0.19607843, a: 1} + m_RaycastTarget: 1 + m_RaycastPadding: {x: 0, y: 0, z: 0, w: 0} + m_Maskable: 1 + m_OnCullStateChanged: + m_PersistentCalls: + m_Calls: [] + m_FontData: + m_Font: {fileID: 10102, guid: 0000000000000000e000000000000000, type: 0} + m_FontSize: 32 + m_FontStyle: 0 + m_BestFit: 0 + m_MinSize: 3 + m_MaxSize: 88 + m_Alignment: 3 + m_AlignByGeometry: 0 + m_RichText: 1 + m_HorizontalOverflow: 0 + m_VerticalOverflow: 0 + m_LineSpacing: 1 + m_Text: Welcome to My Game! +--- !u!1 &4254661213020255936 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 6833649039534518275} + - component: {fileID: 465698995584768700} + - component: {fileID: 1571211570710339275} + m_Layer: 5 + m_Name: Text + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!224 &6833649039534518275 +RectTransform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 4254661213020255936} + m_LocalRotation: {x: -0, y: -0, z: -0, w: 1} + m_LocalPosition: {x: 0, y: 0, z: 0} + m_LocalScale: {x: 1, y: 1, z: 1} + m_ConstrainProportionsScale: 0 + m_Children: [] + m_Father: {fileID: 7630730582446823084} + m_RootOrder: 0 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} + m_AnchorMin: {x: 0, y: 0} + m_AnchorMax: {x: 1, y: 1} + m_AnchoredPosition: {x: 0, y: 0} + m_SizeDelta: {x: 0, y: 0} + m_Pivot: {x: 0.5, y: 0.5} +--- !u!222 &465698995584768700 +CanvasRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 4254661213020255936} + m_CullTransparentMesh: 1 +--- !u!114 &1571211570710339275 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 4254661213020255936} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 5f7201a12d95ffc409449d95f23cf332, type: 3} + m_Name: + m_EditorClassIdentifier: + m_Material: {fileID: 0} + m_Color: {r: 0.19607843, g: 0.19607843, b: 0.19607843, a: 1} + m_RaycastTarget: 1 + m_RaycastPadding: {x: 0, y: 0, z: 0, w: 0} + m_Maskable: 1 + m_OnCullStateChanged: + m_PersistentCalls: + m_Calls: [] + m_FontData: + m_Font: {fileID: 10102, guid: 0000000000000000e000000000000000, type: 0} + m_FontSize: 48 + m_FontStyle: 0 + m_BestFit: 0 + m_MinSize: 4 + m_MaxSize: 48 + m_Alignment: 4 + m_AlignByGeometry: 0 + m_RichText: 1 + m_HorizontalOverflow: 0 + m_VerticalOverflow: 0 + m_LineSpacing: 1 + m_Text: ForceBind02 +--- !u!1 &4294162432188718697 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 4294162432188718698} + - component: {fileID: 4294162432188718701} + - component: {fileID: 4294162432188718700} + - component: {fileID: 4294162432188718699} + m_Layer: 5 + m_Name: AppleLoginButton + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!224 &4294162432188718698 +RectTransform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 4294162432188718697} + m_LocalRotation: {x: -0, y: -0, z: -0, w: 1} + m_LocalPosition: {x: 0, y: 0, z: 0} + m_LocalScale: {x: 1, y: 1, z: 1} + m_ConstrainProportionsScale: 0 + m_Children: + - {fileID: 4294162433245388186} + - {fileID: 4294162434084982350} + m_Father: {fileID: 4294162433051651899} + m_RootOrder: 4 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} + m_AnchorMin: {x: 0.5, y: 0.5} + m_AnchorMax: {x: 0.5, y: 0.5} + m_AnchoredPosition: {x: -185, y: -416} + m_SizeDelta: {x: 460, y: 140} + m_Pivot: {x: 0, y: 0.5} +--- !u!222 &4294162432188718701 +CanvasRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 4294162432188718697} + m_CullTransparentMesh: 1 +--- !u!114 &4294162432188718700 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 4294162432188718697} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: fe87c0e1cc204ed48ad3b37840f39efc, type: 3} + m_Name: + m_EditorClassIdentifier: + m_Material: {fileID: 0} + m_Color: {r: 0.60008013, g: 0.78614205, b: 0.8207547, a: 1} + m_RaycastTarget: 1 + m_RaycastPadding: {x: 0, y: 0, z: 0, w: 0} + m_Maskable: 1 + m_OnCullStateChanged: + m_PersistentCalls: + m_Calls: [] + m_Sprite: {fileID: 10905, guid: 0000000000000000f000000000000000, type: 0} + m_Type: 1 + m_PreserveAspect: 0 + m_FillCenter: 1 + m_FillMethod: 4 + m_FillAmount: 1 + m_FillClockwise: 1 + m_FillOrigin: 0 + m_UseSpriteMesh: 0 + m_PixelsPerUnitMultiplier: 1 +--- !u!114 &4294162432188718699 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 4294162432188718697} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 4e29b1a8efbd4b44bb3f3716e73f07ff, type: 3} + m_Name: + m_EditorClassIdentifier: + m_Navigation: + m_Mode: 3 + m_WrapAround: 0 + m_SelectOnUp: {fileID: 0} + m_SelectOnDown: {fileID: 0} + m_SelectOnLeft: {fileID: 0} + m_SelectOnRight: {fileID: 0} + m_Transition: 1 + m_Colors: + m_NormalColor: {r: 1, g: 1, b: 1, a: 1} + m_HighlightedColor: {r: 0.9607843, g: 0.9607843, b: 0.9607843, a: 1} + m_PressedColor: {r: 0.78431374, g: 0.78431374, b: 0.78431374, a: 1} + m_SelectedColor: {r: 0.9607843, g: 0.9607843, b: 0.9607843, a: 1} + m_DisabledColor: {r: 0.78431374, g: 0.78431374, b: 0.78431374, a: 0.5019608} + m_ColorMultiplier: 1 + m_FadeDuration: 0.1 + m_SpriteState: + m_HighlightedSprite: {fileID: 0} + m_PressedSprite: {fileID: 0} + m_SelectedSprite: {fileID: 0} + m_DisabledSprite: {fileID: 0} + m_AnimationTriggers: + m_NormalTrigger: Normal + m_HighlightedTrigger: Highlighted + m_PressedTrigger: Pressed + m_SelectedTrigger: Selected + m_DisabledTrigger: Disabled + m_Interactable: 1 + m_TargetGraphic: {fileID: 4294162432188718700} + m_OnClick: + m_PersistentCalls: + m_Calls: + - m_Target: {fileID: 733856151592599062} + m_TargetAssemblyTypeName: HCLoginDemoView, Assembly-CSharp + m_MethodName: ButtonEvent_AppleLogin + m_Mode: 1 + m_Arguments: + m_ObjectArgument: {fileID: 0} + m_ObjectArgumentAssemblyTypeName: UnityEngine.Object, UnityEngine + m_IntArgument: 0 + m_FloatArgument: 0 + m_StringArgument: + m_BoolArgument: 0 + m_CallState: 2 +--- !u!1 &4294162432191516665 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 4294162432191516666} + - component: {fileID: 4294162432191516668} + - component: {fileID: 4294162432191516667} + m_Layer: 5 + m_Name: Text + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!224 &4294162432191516666 +RectTransform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 4294162432191516665} + m_LocalRotation: {x: -0, y: -0, z: -0, w: 1} + m_LocalPosition: {x: 0, y: 0, z: 0} + m_LocalScale: {x: 1, y: 1, z: 1} + m_ConstrainProportionsScale: 0 + m_Children: [] + m_Father: {fileID: 4294162432955333778} + m_RootOrder: 0 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} + m_AnchorMin: {x: 0, y: 0} + m_AnchorMax: {x: 1, y: 1} + m_AnchoredPosition: {x: 0, y: 0} + m_SizeDelta: {x: 0, y: 0} + m_Pivot: {x: 0.5, y: 0.5} +--- !u!222 &4294162432191516668 +CanvasRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 4294162432191516665} + m_CullTransparentMesh: 1 +--- !u!114 &4294162432191516667 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 4294162432191516665} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 5f7201a12d95ffc409449d95f23cf332, type: 3} + m_Name: + m_EditorClassIdentifier: + m_Material: {fileID: 0} + m_Color: {r: 0.19607843, g: 0.19607843, b: 0.19607843, a: 1} + m_RaycastTarget: 1 + m_RaycastPadding: {x: 0, y: 0, z: 0, w: 0} + m_Maskable: 1 + m_OnCullStateChanged: + m_PersistentCalls: + m_Calls: [] + m_FontData: + m_Font: {fileID: 10102, guid: 0000000000000000e000000000000000, type: 0} + m_FontSize: 48 + m_FontStyle: 0 + m_BestFit: 0 + m_MinSize: 4 + m_MaxSize: 48 + m_Alignment: 4 + m_AlignByGeometry: 0 + m_RichText: 1 + m_HorizontalOverflow: 0 + m_VerticalOverflow: 0 + m_LineSpacing: 1 + m_Text: AutoLogin +--- !u!1 &4294162432436564279 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 4294162432436564280} + - component: {fileID: 733856151592599062} + m_Layer: 5 + m_Name: LoginDemoView + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 0 +--- !u!224 &4294162432436564280 +RectTransform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 4294162432436564279} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: 0, y: 0, z: 0} + m_LocalScale: {x: 1, y: 1, z: 1} + m_ConstrainProportionsScale: 0 + m_Children: + - {fileID: 4294162434102936163} + m_Father: {fileID: 0} + m_RootOrder: 0 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} + m_AnchorMin: {x: 0, y: 0} + m_AnchorMax: {x: 1, y: 1} + m_AnchoredPosition: {x: 0, y: 0} + m_SizeDelta: {x: 0, y: 0} + m_Pivot: {x: 0.5, y: 0.5} +--- !u!114 &733856151592599062 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 4294162432436564279} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 370553651bea74befb3856be623fce3c, type: 3} + m_Name: + m_EditorClassIdentifier: + mLoginScreenView: {fileID: 4294162433051651898} + mNoLoginScreenView: {fileID: 4294162432640133111} + mGameView: {fileID: 4294162432488689154} + bindAccountGP: {fileID: 4294162434148090823} + bindAccountApple: {fileID: 7944884875184429939} + forceBind01: {fileID: 4294162433765959670} + forceBind02: {fileID: 8207712068283654259} + currAccountText: {fileID: 7639728277395056425} + bindAccountText: {fileID: 5030995918005629926} + gameClub: {fileID: 5258761200634956360} + gameClub2: {fileID: 5429948512697693620} + gameClub3: {fileID: 1098092148410739704} +--- !u!1 &4294162432488689154 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 4294162432488689155} + m_Layer: 5 + m_Name: GameView + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!224 &4294162432488689155 +RectTransform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 4294162432488689154} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: 0, y: 0, z: 0} + m_LocalScale: {x: 1, y: 1, z: 1} + m_ConstrainProportionsScale: 0 + m_Children: + - {fileID: 5575616750695414833} + - {fileID: 6632160149121441925} + - {fileID: 5443178375594607303} + - {fileID: 4294162432958913092} + - {fileID: 4294162433993405229} + - {fileID: 4294162433594131732} + - {fileID: 6556306728583367042} + - {fileID: 884154943731010375} + - {fileID: 8446837146461438084} + - {fileID: 578793549159237808} + - {fileID: 1484711290239480336} + m_Father: {fileID: 4294162434102936163} + m_RootOrder: 2 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} + m_AnchorMin: {x: 0.5, y: 0.5} + m_AnchorMax: {x: 0.5, y: 0.5} + m_AnchoredPosition: {x: 0, y: 0} + m_SizeDelta: {x: 100, y: 100} + m_Pivot: {x: 0.5, y: 0.5} +--- !u!1 &4294162432640133111 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 4294162432640133112} + m_Layer: 5 + m_Name: NoLoginView + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 0 +--- !u!224 &4294162432640133112 +RectTransform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 4294162432640133111} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: 0, y: 0, z: 0} + m_LocalScale: {x: 1, y: 1, z: 1} + m_ConstrainProportionsScale: 0 + m_Children: + - {fileID: 4294162432955333778} + m_Father: {fileID: 4294162434102936163} + m_RootOrder: 1 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} + m_AnchorMin: {x: 0.5, y: 0.5} + m_AnchorMax: {x: 0.5, y: 0.5} + m_AnchoredPosition: {x: 0, y: 0} + m_SizeDelta: {x: 100, y: 100} + m_Pivot: {x: 0.5, y: 0.5} +--- !u!1 &4294162432642984164 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 4294162432642984165} + - component: {fileID: 4294162432642984167} + - component: {fileID: 4294162432642984166} + m_Layer: 5 + m_Name: Text + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!224 &4294162432642984165 +RectTransform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 4294162432642984164} + m_LocalRotation: {x: -0, y: -0, z: -0, w: 1} + m_LocalPosition: {x: 0, y: 0, z: 0} + m_LocalScale: {x: 1, y: 1, z: 1} + m_ConstrainProportionsScale: 0 + m_Children: [] + m_Father: {fileID: 4294162433090550885} + m_RootOrder: 0 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} + m_AnchorMin: {x: 0, y: 0} + m_AnchorMax: {x: 1, y: 1} + m_AnchoredPosition: {x: 0, y: 0} + m_SizeDelta: {x: 0, y: 0} + m_Pivot: {x: 0.5, y: 0.5} +--- !u!222 &4294162432642984167 +CanvasRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 4294162432642984164} + m_CullTransparentMesh: 1 +--- !u!114 &4294162432642984166 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 4294162432642984164} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 5f7201a12d95ffc409449d95f23cf332, type: 3} + m_Name: + m_EditorClassIdentifier: + m_Material: {fileID: 0} + m_Color: {r: 0.19607843, g: 0.19607843, b: 0.19607843, a: 1} + m_RaycastTarget: 1 + m_RaycastPadding: {x: 0, y: 0, z: 0, w: 0} + m_Maskable: 1 + m_OnCullStateChanged: + m_PersistentCalls: + m_Calls: [] + m_FontData: + m_Font: {fileID: 10102, guid: 0000000000000000e000000000000000, type: 0} + m_FontSize: 48 + m_FontStyle: 0 + m_BestFit: 0 + m_MinSize: 4 + m_MaxSize: 48 + m_Alignment: 4 + m_AlignByGeometry: 0 + m_RichText: 1 + m_HorizontalOverflow: 0 + m_VerticalOverflow: 0 + m_LineSpacing: 1 + m_Text: WechatLogin +--- !u!1 &4294162432955333777 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 4294162432955333778} + - component: {fileID: 4294162432955333781} + - component: {fileID: 4294162432955333780} + - component: {fileID: 4294162432955333779} + m_Layer: 5 + m_Name: AutoLoginButton + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!224 &4294162432955333778 +RectTransform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 4294162432955333777} + m_LocalRotation: {x: -0, y: -0, z: -0, w: 1} + m_LocalPosition: {x: 0, y: 0, z: 0} + m_LocalScale: {x: 1, y: 1, z: 1} + m_ConstrainProportionsScale: 0 + m_Children: + - {fileID: 4294162432191516666} + m_Father: {fileID: 4294162432640133112} + m_RootOrder: 0 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} + m_AnchorMin: {x: 0.5, y: 0.5} + m_AnchorMax: {x: 0.5, y: 0.5} + m_AnchoredPosition: {x: -214, y: 17} + m_SizeDelta: {x: 460, y: 140} + m_Pivot: {x: 0, y: 0.5} +--- !u!222 &4294162432955333781 +CanvasRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 4294162432955333777} + m_CullTransparentMesh: 1 +--- !u!114 &4294162432955333780 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 4294162432955333777} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: fe87c0e1cc204ed48ad3b37840f39efc, type: 3} + m_Name: + m_EditorClassIdentifier: + m_Material: {fileID: 0} + m_Color: {r: 1, g: 1, b: 1, a: 1} + m_RaycastTarget: 1 + m_RaycastPadding: {x: 0, y: 0, z: 0, w: 0} + m_Maskable: 1 + m_OnCullStateChanged: + m_PersistentCalls: + m_Calls: [] + m_Sprite: {fileID: 10905, guid: 0000000000000000f000000000000000, type: 0} + m_Type: 1 + m_PreserveAspect: 0 + m_FillCenter: 1 + m_FillMethod: 4 + m_FillAmount: 1 + m_FillClockwise: 1 + m_FillOrigin: 0 + m_UseSpriteMesh: 0 + m_PixelsPerUnitMultiplier: 1 +--- !u!114 &4294162432955333779 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 4294162432955333777} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 4e29b1a8efbd4b44bb3f3716e73f07ff, type: 3} + m_Name: + m_EditorClassIdentifier: + m_Navigation: + m_Mode: 3 + m_WrapAround: 0 + m_SelectOnUp: {fileID: 0} + m_SelectOnDown: {fileID: 0} + m_SelectOnLeft: {fileID: 0} + m_SelectOnRight: {fileID: 0} + m_Transition: 1 + m_Colors: + m_NormalColor: {r: 1, g: 1, b: 1, a: 1} + m_HighlightedColor: {r: 0.9607843, g: 0.9607843, b: 0.9607843, a: 1} + m_PressedColor: {r: 0.78431374, g: 0.78431374, b: 0.78431374, a: 1} + m_SelectedColor: {r: 0.9607843, g: 0.9607843, b: 0.9607843, a: 1} + m_DisabledColor: {r: 0.78431374, g: 0.78431374, b: 0.78431374, a: 0.5019608} + m_ColorMultiplier: 1 + m_FadeDuration: 0.1 + m_SpriteState: + m_HighlightedSprite: {fileID: 0} + m_PressedSprite: {fileID: 0} + m_SelectedSprite: {fileID: 0} + m_DisabledSprite: {fileID: 0} + m_AnimationTriggers: + m_NormalTrigger: Normal + m_HighlightedTrigger: Highlighted + m_PressedTrigger: Pressed + m_SelectedTrigger: Selected + m_DisabledTrigger: Disabled + m_Interactable: 1 + m_TargetGraphic: {fileID: 4294162432955333780} + m_OnClick: + m_PersistentCalls: + m_Calls: + - m_Target: {fileID: 733856151592599062} + m_TargetAssemblyTypeName: HCLoginDemoView, Assembly-CSharp + m_MethodName: ButtonEvent_AutoLogin + m_Mode: 1 + m_Arguments: + m_ObjectArgument: {fileID: 0} + m_ObjectArgumentAssemblyTypeName: UnityEngine.Object, UnityEngine + m_IntArgument: 0 + m_FloatArgument: 0 + m_StringArgument: + m_BoolArgument: 0 + m_CallState: 2 +--- !u!1 &4294162432958913091 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 4294162432958913092} + m_Layer: 5 + m_Name: GuestEnteredView + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!224 &4294162432958913092 +RectTransform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 4294162432958913091} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: 0, y: 0, z: 0} + m_LocalScale: {x: 1, y: 1, z: 1} + m_ConstrainProportionsScale: 0 + m_Children: + - {fileID: 4294162434148090824} + - {fileID: 1707087404811008121} + - {fileID: 4294162433765959671} + - {fileID: 7630730582446823084} + m_Father: {fileID: 4294162432488689155} + m_RootOrder: 3 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} + m_AnchorMin: {x: 0.5, y: 0.5} + m_AnchorMax: {x: 0.5, y: 0.5} + m_AnchoredPosition: {x: 0, y: 0} + m_SizeDelta: {x: 100, y: 100} + m_Pivot: {x: 0.5, y: 0.5} +--- !u!1 &4294162432983476602 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 4294162432983476603} + - component: {fileID: 4294162432983476605} + - component: {fileID: 4294162432983476604} + m_Layer: 5 + m_Name: Text + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!224 &4294162432983476603 +RectTransform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 4294162432983476602} + m_LocalRotation: {x: -0, y: -0, z: -0, w: 1} + m_LocalPosition: {x: 0, y: 0, z: 0} + m_LocalScale: {x: 1, y: 1, z: 1} + m_ConstrainProportionsScale: 0 + m_Children: [] + m_Father: {fileID: 4294162433240609927} + m_RootOrder: 0 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} + m_AnchorMin: {x: 0, y: 0} + m_AnchorMax: {x: 1, y: 1} + m_AnchoredPosition: {x: 0, y: 0} + m_SizeDelta: {x: 0, y: 0} + m_Pivot: {x: 0.5, y: 0.5} +--- !u!222 &4294162432983476605 +CanvasRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 4294162432983476602} + m_CullTransparentMesh: 1 +--- !u!114 &4294162432983476604 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 4294162432983476602} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 5f7201a12d95ffc409449d95f23cf332, type: 3} + m_Name: + m_EditorClassIdentifier: + m_Material: {fileID: 0} + m_Color: {r: 0.19607843, g: 0.19607843, b: 0.19607843, a: 1} + m_RaycastTarget: 1 + m_RaycastPadding: {x: 0, y: 0, z: 0, w: 0} + m_Maskable: 1 + m_OnCullStateChanged: + m_PersistentCalls: + m_Calls: [] + m_FontData: + m_Font: {fileID: 10102, guid: 0000000000000000e000000000000000, type: 0} + m_FontSize: 48 + m_FontStyle: 0 + m_BestFit: 0 + m_MinSize: 4 + m_MaxSize: 48 + m_Alignment: 4 + m_AlignByGeometry: 0 + m_RichText: 1 + m_HorizontalOverflow: 0 + m_VerticalOverflow: 0 + m_LineSpacing: 1 + m_Text: FacebookLogin +--- !u!1 &4294162433051651898 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 4294162433051651899} + - component: {fileID: 7677354817390200078} + m_Layer: 5 + m_Name: LoginView + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 0 +--- !u!224 &4294162433051651899 +RectTransform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 4294162433051651898} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: 0, y: 0, z: 0} + m_LocalScale: {x: 1, y: 1, z: 1} + m_ConstrainProportionsScale: 0 + m_Children: + - {fileID: 7600893053795411932} + - {fileID: 4294162433876769940} + - {fileID: 4294162433090550885} + - {fileID: 4294162433240609927} + - {fileID: 4294162432188718698} + m_Father: {fileID: 4294162434102936163} + m_RootOrder: 0 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} + m_AnchorMin: {x: 0.5, y: 0.5} + m_AnchorMax: {x: 0.5, y: 0.5} + m_AnchoredPosition: {x: 0, y: 0} + m_SizeDelta: {x: 100, y: 100} + m_Pivot: {x: 0.5, y: 0.5} +--- !u!114 &7677354817390200078 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 4294162433051651898} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 370553651bea74befb3856be623fce3c, type: 3} + m_Name: + m_EditorClassIdentifier: + mLoginScreenView: {fileID: 4294162433051651898} + mNoLoginScreenView: {fileID: 4294162432640133111} + mGameView: {fileID: 4294162432488689154} + bindAccountGP: {fileID: 0} + bindAccountApple: {fileID: 0} + forceBind01: {fileID: 0} + forceBind02: {fileID: 0} + currAccountText: {fileID: 0} + bindAccountText: {fileID: 0} + gameClub: {fileID: 0} + gameClub2: {fileID: 0} + gameClub3: {fileID: 0} +--- !u!1 &4294162433090550884 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 4294162433090550885} + - component: {fileID: 4294162433090550888} + - component: {fileID: 4294162433090550887} + - component: {fileID: 4294162433090550886} + m_Layer: 5 + m_Name: GoogleLoginButton + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!224 &4294162433090550885 +RectTransform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 4294162433090550884} + m_LocalRotation: {x: -0, y: -0, z: -0, w: 1} + m_LocalPosition: {x: 0, y: 0, z: 0} + m_LocalScale: {x: 1, y: 1, z: 1} + m_ConstrainProportionsScale: 0 + m_Children: + - {fileID: 4294162432642984165} + m_Father: {fileID: 4294162433051651899} + m_RootOrder: 2 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} + m_AnchorMin: {x: 0.5, y: 0.5} + m_AnchorMax: {x: 0.5, y: 0.5} + m_AnchoredPosition: {x: -185, y: -9} + m_SizeDelta: {x: 460, y: 140} + m_Pivot: {x: 0, y: 0.5} +--- !u!222 &4294162433090550888 +CanvasRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 4294162433090550884} + m_CullTransparentMesh: 1 +--- !u!114 &4294162433090550887 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 4294162433090550884} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: fe87c0e1cc204ed48ad3b37840f39efc, type: 3} + m_Name: + m_EditorClassIdentifier: + m_Material: {fileID: 0} + m_Color: {r: 1, g: 1, b: 1, a: 1} + m_RaycastTarget: 1 + m_RaycastPadding: {x: 0, y: 0, z: 0, w: 0} + m_Maskable: 1 + m_OnCullStateChanged: + m_PersistentCalls: + m_Calls: [] + m_Sprite: {fileID: 10905, guid: 0000000000000000f000000000000000, type: 0} + m_Type: 1 + m_PreserveAspect: 0 + m_FillCenter: 1 + m_FillMethod: 4 + m_FillAmount: 1 + m_FillClockwise: 1 + m_FillOrigin: 0 + m_UseSpriteMesh: 0 + m_PixelsPerUnitMultiplier: 1 +--- !u!114 &4294162433090550886 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 4294162433090550884} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 4e29b1a8efbd4b44bb3f3716e73f07ff, type: 3} + m_Name: + m_EditorClassIdentifier: + m_Navigation: + m_Mode: 3 + m_WrapAround: 0 + m_SelectOnUp: {fileID: 0} + m_SelectOnDown: {fileID: 0} + m_SelectOnLeft: {fileID: 0} + m_SelectOnRight: {fileID: 0} + m_Transition: 1 + m_Colors: + m_NormalColor: {r: 1, g: 1, b: 1, a: 1} + m_HighlightedColor: {r: 0.9607843, g: 0.9607843, b: 0.9607843, a: 1} + m_PressedColor: {r: 0.78431374, g: 0.78431374, b: 0.78431374, a: 1} + m_SelectedColor: {r: 0.9607843, g: 0.9607843, b: 0.9607843, a: 1} + m_DisabledColor: {r: 0.78431374, g: 0.78431374, b: 0.78431374, a: 0.5019608} + m_ColorMultiplier: 1 + m_FadeDuration: 0.1 + m_SpriteState: + m_HighlightedSprite: {fileID: 0} + m_PressedSprite: {fileID: 0} + m_SelectedSprite: {fileID: 0} + m_DisabledSprite: {fileID: 0} + m_AnimationTriggers: + m_NormalTrigger: Normal + m_HighlightedTrigger: Highlighted + m_PressedTrigger: Pressed + m_SelectedTrigger: Selected + m_DisabledTrigger: Disabled + m_Interactable: 1 + m_TargetGraphic: {fileID: 4294162433090550887} + m_OnClick: + m_PersistentCalls: + m_Calls: + - m_Target: {fileID: 733856151592599062} + m_TargetAssemblyTypeName: HCLoginDemoView, Assembly-CSharp + m_MethodName: ButtonEvent_GoogleLogin + m_Mode: 1 + m_Arguments: + m_ObjectArgument: {fileID: 0} + m_ObjectArgumentAssemblyTypeName: UnityEngine.Object, UnityEngine + m_IntArgument: 0 + m_FloatArgument: 0 + m_StringArgument: + m_BoolArgument: 0 + m_CallState: 2 + - m_Target: {fileID: 0} + m_TargetAssemblyTypeName: SignInSample.SigninSampleScript, Assembly-CSharp + m_MethodName: OnSignIn + m_Mode: 1 + m_Arguments: + m_ObjectArgument: {fileID: 0} + m_ObjectArgumentAssemblyTypeName: UnityEngine.Object, UnityEngine + m_IntArgument: 0 + m_FloatArgument: 0 + m_StringArgument: + m_BoolArgument: 0 + m_CallState: 2 +--- !u!1 &4294162433240609926 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 4294162433240609927} + - component: {fileID: 4294162433240609930} + - component: {fileID: 4294162433240609929} + - component: {fileID: 4294162433240609928} + m_Layer: 5 + m_Name: FacebookLoginButton + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!224 &4294162433240609927 +RectTransform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 4294162433240609926} + m_LocalRotation: {x: -0, y: -0, z: -0, w: 1} + m_LocalPosition: {x: 0, y: 0, z: 0} + m_LocalScale: {x: 1, y: 1, z: 1} + m_ConstrainProportionsScale: 0 + m_Children: + - {fileID: 4294162432983476603} + m_Father: {fileID: 4294162433051651899} + m_RootOrder: 3 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} + m_AnchorMin: {x: 0.5, y: 0.5} + m_AnchorMax: {x: 0.5, y: 0.5} + m_AnchoredPosition: {x: -185, y: -210} + m_SizeDelta: {x: 460, y: 140} + m_Pivot: {x: 0, y: 0.5} +--- !u!222 &4294162433240609930 +CanvasRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 4294162433240609926} + m_CullTransparentMesh: 1 +--- !u!114 &4294162433240609929 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 4294162433240609926} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: fe87c0e1cc204ed48ad3b37840f39efc, type: 3} + m_Name: + m_EditorClassIdentifier: + m_Material: {fileID: 0} + m_Color: {r: 1, g: 1, b: 1, a: 1} + m_RaycastTarget: 1 + m_RaycastPadding: {x: 0, y: 0, z: 0, w: 0} + m_Maskable: 1 + m_OnCullStateChanged: + m_PersistentCalls: + m_Calls: [] + m_Sprite: {fileID: 10905, guid: 0000000000000000f000000000000000, type: 0} + m_Type: 1 + m_PreserveAspect: 0 + m_FillCenter: 1 + m_FillMethod: 4 + m_FillAmount: 1 + m_FillClockwise: 1 + m_FillOrigin: 0 + m_UseSpriteMesh: 0 + m_PixelsPerUnitMultiplier: 1 +--- !u!114 &4294162433240609928 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 4294162433240609926} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 4e29b1a8efbd4b44bb3f3716e73f07ff, type: 3} + m_Name: + m_EditorClassIdentifier: + m_Navigation: + m_Mode: 3 + m_WrapAround: 0 + m_SelectOnUp: {fileID: 0} + m_SelectOnDown: {fileID: 0} + m_SelectOnLeft: {fileID: 0} + m_SelectOnRight: {fileID: 0} + m_Transition: 1 + m_Colors: + m_NormalColor: {r: 1, g: 1, b: 1, a: 1} + m_HighlightedColor: {r: 0.9607843, g: 0.9607843, b: 0.9607843, a: 1} + m_PressedColor: {r: 0.78431374, g: 0.78431374, b: 0.78431374, a: 1} + m_SelectedColor: {r: 0.9607843, g: 0.9607843, b: 0.9607843, a: 1} + m_DisabledColor: {r: 0.78431374, g: 0.78431374, b: 0.78431374, a: 0.5019608} + m_ColorMultiplier: 1 + m_FadeDuration: 0.1 + m_SpriteState: + m_HighlightedSprite: {fileID: 0} + m_PressedSprite: {fileID: 0} + m_SelectedSprite: {fileID: 0} + m_DisabledSprite: {fileID: 0} + m_AnimationTriggers: + m_NormalTrigger: Normal + m_HighlightedTrigger: Highlighted + m_PressedTrigger: Pressed + m_SelectedTrigger: Selected + m_DisabledTrigger: Disabled + m_Interactable: 0 + m_TargetGraphic: {fileID: 4294162433240609929} + m_OnClick: + m_PersistentCalls: + m_Calls: + - m_Target: {fileID: 733856151592599062} + m_TargetAssemblyTypeName: HCLoginDemoView, Assembly-CSharp + m_MethodName: ButtonEvent_FBLogin + m_Mode: 1 + m_Arguments: + m_ObjectArgument: {fileID: 0} + m_ObjectArgumentAssemblyTypeName: UnityEngine.Object, UnityEngine + m_IntArgument: 0 + m_FloatArgument: 0 + m_StringArgument: + m_BoolArgument: 0 + m_CallState: 2 +--- !u!1 &4294162433245388185 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 4294162433245388186} + - component: {fileID: 4294162433245388188} + - component: {fileID: 4294162433245388187} + m_Layer: 5 + m_Name: TitleText + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!224 &4294162433245388186 +RectTransform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 4294162433245388185} + m_LocalRotation: {x: -0, y: -0, z: -0, w: 1} + m_LocalPosition: {x: 0, y: 0, z: 0} + m_LocalScale: {x: 1, y: 1, z: 1} + m_ConstrainProportionsScale: 0 + m_Children: [] + m_Father: {fileID: 4294162432188718698} + m_RootOrder: 0 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} + m_AnchorMin: {x: 0, y: 0} + m_AnchorMax: {x: 1, y: 1} + m_AnchoredPosition: {x: -387, y: 0} + m_SizeDelta: {x: 0, y: 0} + m_Pivot: {x: 0.5, y: 0.5} +--- !u!222 &4294162433245388188 +CanvasRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 4294162433245388185} + m_CullTransparentMesh: 1 +--- !u!114 &4294162433245388187 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 4294162433245388185} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 5f7201a12d95ffc409449d95f23cf332, type: 3} + m_Name: + m_EditorClassIdentifier: + m_Material: {fileID: 0} + m_Color: {r: 0.19607843, g: 0.19607843, b: 0.19607843, a: 1} + m_RaycastTarget: 1 + m_RaycastPadding: {x: 0, y: 0, z: 0, w: 0} + m_Maskable: 1 + m_OnCullStateChanged: + m_PersistentCalls: + m_Calls: [] + m_FontData: + m_Font: {fileID: 10102, guid: 0000000000000000e000000000000000, type: 0} + m_FontSize: 48 + m_FontStyle: 0 + m_BestFit: 0 + m_MinSize: 4 + m_MaxSize: 48 + m_Alignment: 4 + m_AlignByGeometry: 0 + m_RichText: 1 + m_HorizontalOverflow: 0 + m_VerticalOverflow: 0 + m_LineSpacing: 1 + m_Text: 'Only iOS: ' +--- !u!1 &4294162433347518854 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 4294162433347518855} + - component: {fileID: 4294162433347518857} + - component: {fileID: 4294162433347518856} + m_Layer: 5 + m_Name: Text + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!224 &4294162433347518855 +RectTransform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 4294162433347518854} + m_LocalRotation: {x: -0, y: -0, z: -0, w: 1} + m_LocalPosition: {x: 0, y: 0, z: 0} + m_LocalScale: {x: 1, y: 1, z: 1} + m_ConstrainProportionsScale: 0 + m_Children: [] + m_Father: {fileID: 4294162433765959671} + m_RootOrder: 0 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} + m_AnchorMin: {x: 0, y: 0} + m_AnchorMax: {x: 1, y: 1} + m_AnchoredPosition: {x: 0, y: 0} + m_SizeDelta: {x: 0, y: 0} + m_Pivot: {x: 0.5, y: 0.5} +--- !u!222 &4294162433347518857 +CanvasRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 4294162433347518854} + m_CullTransparentMesh: 1 +--- !u!114 &4294162433347518856 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 4294162433347518854} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 5f7201a12d95ffc409449d95f23cf332, type: 3} + m_Name: + m_EditorClassIdentifier: + m_Material: {fileID: 0} + m_Color: {r: 0.19607843, g: 0.19607843, b: 0.19607843, a: 1} + m_RaycastTarget: 1 + m_RaycastPadding: {x: 0, y: 0, z: 0, w: 0} + m_Maskable: 1 + m_OnCullStateChanged: + m_PersistentCalls: + m_Calls: [] + m_FontData: + m_Font: {fileID: 10102, guid: 0000000000000000e000000000000000, type: 0} + m_FontSize: 48 + m_FontStyle: 0 + m_BestFit: 0 + m_MinSize: 4 + m_MaxSize: 48 + m_Alignment: 4 + m_AlignByGeometry: 0 + m_RichText: 1 + m_HorizontalOverflow: 0 + m_VerticalOverflow: 0 + m_LineSpacing: 1 + m_Text: ForceBind01 +--- !u!1 &4294162433510624514 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 4294162433510624515} + - component: {fileID: 4294162433510624517} + - component: {fileID: 4294162433510624516} + m_Layer: 5 + m_Name: Text + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!224 &4294162433510624515 +RectTransform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 4294162433510624514} + m_LocalRotation: {x: -0, y: -0, z: -0, w: 1} + m_LocalPosition: {x: 0, y: 0, z: 0} + m_LocalScale: {x: 1, y: 1, z: 1} + m_ConstrainProportionsScale: 0 + m_Children: [] + m_Father: {fileID: 4294162433594131732} + m_RootOrder: 0 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} + m_AnchorMin: {x: 0, y: 0} + m_AnchorMax: {x: 1, y: 1} + m_AnchoredPosition: {x: 0, y: 0} + m_SizeDelta: {x: 0, y: 0} + m_Pivot: {x: 0.5, y: 0.5} +--- !u!222 &4294162433510624517 +CanvasRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 4294162433510624514} + m_CullTransparentMesh: 1 +--- !u!114 &4294162433510624516 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 4294162433510624514} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 5f7201a12d95ffc409449d95f23cf332, type: 3} + m_Name: + m_EditorClassIdentifier: + m_Material: {fileID: 0} + m_Color: {r: 0.19607843, g: 0.19607843, b: 0.19607843, a: 1} + m_RaycastTarget: 1 + m_RaycastPadding: {x: 0, y: 0, z: 0, w: 0} + m_Maskable: 1 + m_OnCullStateChanged: + m_PersistentCalls: + m_Calls: [] + m_FontData: + m_Font: {fileID: 10102, guid: 0000000000000000e000000000000000, type: 0} + m_FontSize: 42 + m_FontStyle: 0 + m_BestFit: 0 + m_MinSize: 4 + m_MaxSize: 48 + m_Alignment: 4 + m_AlignByGeometry: 0 + m_RichText: 1 + m_HorizontalOverflow: 0 + m_VerticalOverflow: 0 + m_LineSpacing: 1 + m_Text: DeleteAccount +--- !u!1 &4294162433594131731 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 4294162433594131732} + - component: {fileID: 4294162433594131735} + - component: {fileID: 4294162433594131734} + - component: {fileID: 4294162433594131733} + m_Layer: 5 + m_Name: DeleteAccountButton + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!224 &4294162433594131732 +RectTransform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 4294162433594131731} + m_LocalRotation: {x: -0, y: -0, z: -0, w: 1} + m_LocalPosition: {x: 0, y: 0, z: 0} + m_LocalScale: {x: 1, y: 1, z: 1} + m_ConstrainProportionsScale: 0 + m_Children: + - {fileID: 4294162433510624515} + m_Father: {fileID: 4294162432488689155} + m_RootOrder: 5 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} + m_AnchorMin: {x: 0.5, y: 0.5} + m_AnchorMax: {x: 0.5, y: 0.5} + m_AnchoredPosition: {x: 40, y: -210.00005} + m_SizeDelta: {x: 460, y: 140} + m_Pivot: {x: 0, y: 0.5} +--- !u!222 &4294162433594131735 +CanvasRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 4294162433594131731} + m_CullTransparentMesh: 1 +--- !u!114 &4294162433594131734 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 4294162433594131731} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: fe87c0e1cc204ed48ad3b37840f39efc, type: 3} + m_Name: + m_EditorClassIdentifier: + m_Material: {fileID: 0} + m_Color: {r: 0.8773585, g: 0.45937166, b: 0.49273026, a: 1} + m_RaycastTarget: 1 + m_RaycastPadding: {x: 0, y: 0, z: 0, w: 0} + m_Maskable: 1 + m_OnCullStateChanged: + m_PersistentCalls: + m_Calls: [] + m_Sprite: {fileID: 10905, guid: 0000000000000000f000000000000000, type: 0} + m_Type: 1 + m_PreserveAspect: 0 + m_FillCenter: 1 + m_FillMethod: 4 + m_FillAmount: 1 + m_FillClockwise: 1 + m_FillOrigin: 0 + m_UseSpriteMesh: 0 + m_PixelsPerUnitMultiplier: 1 +--- !u!114 &4294162433594131733 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 4294162433594131731} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 4e29b1a8efbd4b44bb3f3716e73f07ff, type: 3} + m_Name: + m_EditorClassIdentifier: + m_Navigation: + m_Mode: 3 + m_WrapAround: 0 + m_SelectOnUp: {fileID: 0} + m_SelectOnDown: {fileID: 0} + m_SelectOnLeft: {fileID: 0} + m_SelectOnRight: {fileID: 0} + m_Transition: 1 + m_Colors: + m_NormalColor: {r: 1, g: 1, b: 1, a: 1} + m_HighlightedColor: {r: 0.9607843, g: 0.9607843, b: 0.9607843, a: 1} + m_PressedColor: {r: 0.78431374, g: 0.78431374, b: 0.78431374, a: 1} + m_SelectedColor: {r: 0.9607843, g: 0.9607843, b: 0.9607843, a: 1} + m_DisabledColor: {r: 0.78431374, g: 0.78431374, b: 0.78431374, a: 0.5019608} + m_ColorMultiplier: 1 + m_FadeDuration: 0.1 + m_SpriteState: + m_HighlightedSprite: {fileID: 0} + m_PressedSprite: {fileID: 0} + m_SelectedSprite: {fileID: 0} + m_DisabledSprite: {fileID: 0} + m_AnimationTriggers: + m_NormalTrigger: Normal + m_HighlightedTrigger: Highlighted + m_PressedTrigger: Pressed + m_SelectedTrigger: Selected + m_DisabledTrigger: Disabled + m_Interactable: 1 + m_TargetGraphic: {fileID: 4294162433594131734} + m_OnClick: + m_PersistentCalls: + m_Calls: + - m_Target: {fileID: 733856151592599062} + m_TargetAssemblyTypeName: HCLoginDemoView, Assembly-CSharp + m_MethodName: ButtonEvent_DeleteAccount + m_Mode: 1 + m_Arguments: + m_ObjectArgument: {fileID: 0} + m_ObjectArgumentAssemblyTypeName: UnityEngine.Object, UnityEngine + m_IntArgument: 0 + m_FloatArgument: 0 + m_StringArgument: + m_BoolArgument: 0 + m_CallState: 2 +--- !u!1 &4294162433765959670 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 4294162433765959671} + - component: {fileID: 4294162433765959674} + - component: {fileID: 4294162433765959673} + - component: {fileID: 4294162433765959672} + m_Layer: 5 + m_Name: ForceBindAccount01Button + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!224 &4294162433765959671 +RectTransform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 4294162433765959670} + m_LocalRotation: {x: -0, y: -0, z: -0, w: 1} + m_LocalPosition: {x: 0, y: 0, z: 0} + m_LocalScale: {x: 1, y: 1, z: 1} + m_ConstrainProportionsScale: 0 + m_Children: + - {fileID: 4294162433347518855} + m_Father: {fileID: 4294162432958913092} + m_RootOrder: 2 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} + m_AnchorMin: {x: 0.5, y: 0.5} + m_AnchorMax: {x: 0.5, y: 0.5} + m_AnchoredPosition: {x: -492, y: -5.000046} + m_SizeDelta: {x: 460, y: 140} + m_Pivot: {x: 0, y: 0.5} +--- !u!222 &4294162433765959674 +CanvasRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 4294162433765959670} + m_CullTransparentMesh: 1 +--- !u!114 &4294162433765959673 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 4294162433765959670} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: fe87c0e1cc204ed48ad3b37840f39efc, type: 3} + m_Name: + m_EditorClassIdentifier: + m_Material: {fileID: 0} + m_Color: {r: 1, g: 1, b: 1, a: 1} + m_RaycastTarget: 1 + m_RaycastPadding: {x: 0, y: 0, z: 0, w: 0} + m_Maskable: 1 + m_OnCullStateChanged: + m_PersistentCalls: + m_Calls: [] + m_Sprite: {fileID: 10905, guid: 0000000000000000f000000000000000, type: 0} + m_Type: 1 + m_PreserveAspect: 0 + m_FillCenter: 1 + m_FillMethod: 4 + m_FillAmount: 1 + m_FillClockwise: 1 + m_FillOrigin: 0 + m_UseSpriteMesh: 0 + m_PixelsPerUnitMultiplier: 1 +--- !u!114 &4294162433765959672 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 4294162433765959670} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 4e29b1a8efbd4b44bb3f3716e73f07ff, type: 3} + m_Name: + m_EditorClassIdentifier: + m_Navigation: + m_Mode: 3 + m_WrapAround: 0 + m_SelectOnUp: {fileID: 0} + m_SelectOnDown: {fileID: 0} + m_SelectOnLeft: {fileID: 0} + m_SelectOnRight: {fileID: 0} + m_Transition: 1 + m_Colors: + m_NormalColor: {r: 1, g: 1, b: 1, a: 1} + m_HighlightedColor: {r: 0.9607843, g: 0.9607843, b: 0.9607843, a: 1} + m_PressedColor: {r: 0.78431374, g: 0.78431374, b: 0.78431374, a: 1} + m_SelectedColor: {r: 0.9607843, g: 0.9607843, b: 0.9607843, a: 1} + m_DisabledColor: {r: 0.78431374, g: 0.78431374, b: 0.78431374, a: 0.5019608} + m_ColorMultiplier: 1 + m_FadeDuration: 0.1 + m_SpriteState: + m_HighlightedSprite: {fileID: 0} + m_PressedSprite: {fileID: 0} + m_SelectedSprite: {fileID: 0} + m_DisabledSprite: {fileID: 0} + m_AnimationTriggers: + m_NormalTrigger: Normal + m_HighlightedTrigger: Highlighted + m_PressedTrigger: Pressed + m_SelectedTrigger: Selected + m_DisabledTrigger: Disabled + m_Interactable: 1 + m_TargetGraphic: {fileID: 4294162433765959673} + m_OnClick: + m_PersistentCalls: + m_Calls: + - m_Target: {fileID: 733856151592599062} + m_TargetAssemblyTypeName: HCLoginDemoView, Assembly-CSharp + m_MethodName: ButtonEvent_ForceBindAccount01 + m_Mode: 1 + m_Arguments: + m_ObjectArgument: {fileID: 0} + m_ObjectArgumentAssemblyTypeName: UnityEngine.Object, UnityEngine + m_IntArgument: 0 + m_FloatArgument: 0 + m_StringArgument: + m_BoolArgument: 0 + m_CallState: 2 +--- !u!1 &4294162433818382106 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 4294162433818382107} + - component: {fileID: 4294162433818382109} + - component: {fileID: 4294162433818382108} + m_Layer: 5 + m_Name: Text + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!224 &4294162433818382107 +RectTransform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 4294162433818382106} + m_LocalRotation: {x: -0, y: -0, z: -0, w: 1} + m_LocalPosition: {x: 0, y: 0, z: 0} + m_LocalScale: {x: 1, y: 1, z: 1} + m_ConstrainProportionsScale: 0 + m_Children: [] + m_Father: {fileID: 4294162433876769940} + m_RootOrder: 0 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} + m_AnchorMin: {x: 0, y: 0} + m_AnchorMax: {x: 1, y: 1} + m_AnchoredPosition: {x: 0, y: 0} + m_SizeDelta: {x: 0, y: 0} + m_Pivot: {x: 0.5, y: 0.5} +--- !u!222 &4294162433818382109 +CanvasRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 4294162433818382106} + m_CullTransparentMesh: 1 +--- !u!114 &4294162433818382108 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 4294162433818382106} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 5f7201a12d95ffc409449d95f23cf332, type: 3} + m_Name: + m_EditorClassIdentifier: + m_Material: {fileID: 0} + m_Color: {r: 0.19607843, g: 0.19607843, b: 0.19607843, a: 1} + m_RaycastTarget: 1 + m_RaycastPadding: {x: 0, y: 0, z: 0, w: 0} + m_Maskable: 1 + m_OnCullStateChanged: + m_PersistentCalls: + m_Calls: [] + m_FontData: + m_Font: {fileID: 10102, guid: 0000000000000000e000000000000000, type: 0} + m_FontSize: 48 + m_FontStyle: 0 + m_BestFit: 0 + m_MinSize: 4 + m_MaxSize: 48 + m_Alignment: 4 + m_AlignByGeometry: 0 + m_RichText: 1 + m_HorizontalOverflow: 0 + m_VerticalOverflow: 0 + m_LineSpacing: 1 + m_Text: GuestLogin +--- !u!1 &4294162433876769939 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 4294162433876769940} + - component: {fileID: 4294162433876769943} + - component: {fileID: 4294162433876769942} + - component: {fileID: 4294162433876769941} + m_Layer: 5 + m_Name: GuestLoginButton + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!224 &4294162433876769940 +RectTransform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 4294162433876769939} + m_LocalRotation: {x: -0, y: -0, z: -0, w: 1} + m_LocalPosition: {x: 0, y: 0, z: 0} + m_LocalScale: {x: 1, y: 1, z: 1} + m_ConstrainProportionsScale: 0 + m_Children: + - {fileID: 4294162433818382107} + m_Father: {fileID: 4294162433051651899} + m_RootOrder: 1 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} + m_AnchorMin: {x: 0.5, y: 0.5} + m_AnchorMax: {x: 0.5, y: 0.5} + m_AnchoredPosition: {x: -185, y: 197} + m_SizeDelta: {x: 460, y: 140} + m_Pivot: {x: 0, y: 0.5} +--- !u!222 &4294162433876769943 +CanvasRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 4294162433876769939} + m_CullTransparentMesh: 1 +--- !u!114 &4294162433876769942 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 4294162433876769939} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: fe87c0e1cc204ed48ad3b37840f39efc, type: 3} + m_Name: + m_EditorClassIdentifier: + m_Material: {fileID: 0} + m_Color: {r: 1, g: 1, b: 1, a: 1} + m_RaycastTarget: 1 + m_RaycastPadding: {x: 0, y: 0, z: 0, w: 0} + m_Maskable: 1 + m_OnCullStateChanged: + m_PersistentCalls: + m_Calls: [] + m_Sprite: {fileID: 10905, guid: 0000000000000000f000000000000000, type: 0} + m_Type: 1 + m_PreserveAspect: 0 + m_FillCenter: 1 + m_FillMethod: 4 + m_FillAmount: 1 + m_FillClockwise: 1 + m_FillOrigin: 0 + m_UseSpriteMesh: 0 + m_PixelsPerUnitMultiplier: 1 +--- !u!114 &4294162433876769941 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 4294162433876769939} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 4e29b1a8efbd4b44bb3f3716e73f07ff, type: 3} + m_Name: + m_EditorClassIdentifier: + m_Navigation: + m_Mode: 3 + m_WrapAround: 0 + m_SelectOnUp: {fileID: 0} + m_SelectOnDown: {fileID: 0} + m_SelectOnLeft: {fileID: 0} + m_SelectOnRight: {fileID: 0} + m_Transition: 1 + m_Colors: + m_NormalColor: {r: 1, g: 1, b: 1, a: 1} + m_HighlightedColor: {r: 0.9607843, g: 0.9607843, b: 0.9607843, a: 1} + m_PressedColor: {r: 0.78431374, g: 0.78431374, b: 0.78431374, a: 1} + m_SelectedColor: {r: 0.9607843, g: 0.9607843, b: 0.9607843, a: 1} + m_DisabledColor: {r: 0.78431374, g: 0.78431374, b: 0.78431374, a: 0.5019608} + m_ColorMultiplier: 1 + m_FadeDuration: 0.1 + m_SpriteState: + m_HighlightedSprite: {fileID: 0} + m_PressedSprite: {fileID: 0} + m_SelectedSprite: {fileID: 0} + m_DisabledSprite: {fileID: 0} + m_AnimationTriggers: + m_NormalTrigger: Normal + m_HighlightedTrigger: Highlighted + m_PressedTrigger: Pressed + m_SelectedTrigger: Selected + m_DisabledTrigger: Disabled + m_Interactable: 1 + m_TargetGraphic: {fileID: 4294162433876769942} + m_OnClick: + m_PersistentCalls: + m_Calls: + - m_Target: {fileID: 733856151592599062} + m_TargetAssemblyTypeName: HCLoginDemoView, Assembly-CSharp + m_MethodName: ButtonEvent_GuestLogin + m_Mode: 1 + m_Arguments: + m_ObjectArgument: {fileID: 0} + m_ObjectArgumentAssemblyTypeName: UnityEngine.Object, UnityEngine + m_IntArgument: 0 + m_FloatArgument: 0 + m_StringArgument: + m_BoolArgument: 0 + m_CallState: 2 +--- !u!1 &4294162433877855147 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 4294162433877855148} + - component: {fileID: 4294162433877855150} + - component: {fileID: 4294162433877855149} + m_Layer: 5 + m_Name: Text + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!224 &4294162433877855148 +RectTransform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 4294162433877855147} + m_LocalRotation: {x: -0, y: -0, z: -0, w: 1} + m_LocalPosition: {x: 0, y: 0, z: 0} + m_LocalScale: {x: 1, y: 1, z: 1} + m_ConstrainProportionsScale: 0 + m_Children: [] + m_Father: {fileID: 4294162434148090824} + m_RootOrder: 0 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} + m_AnchorMin: {x: 0, y: 0} + m_AnchorMax: {x: 1, y: 1} + m_AnchoredPosition: {x: 0, y: 0} + m_SizeDelta: {x: 0, y: 0} + m_Pivot: {x: 0.5, y: 0.5} +--- !u!222 &4294162433877855150 +CanvasRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 4294162433877855147} + m_CullTransparentMesh: 1 +--- !u!114 &4294162433877855149 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 4294162433877855147} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 5f7201a12d95ffc409449d95f23cf332, type: 3} + m_Name: + m_EditorClassIdentifier: + m_Material: {fileID: 0} + m_Color: {r: 0.19607843, g: 0.19607843, b: 0.19607843, a: 1} + m_RaycastTarget: 1 + m_RaycastPadding: {x: 0, y: 0, z: 0, w: 0} + m_Maskable: 1 + m_OnCullStateChanged: + m_PersistentCalls: + m_Calls: [] + m_FontData: + m_Font: {fileID: 10102, guid: 0000000000000000e000000000000000, type: 0} + m_FontSize: 48 + m_FontStyle: 0 + m_BestFit: 0 + m_MinSize: 4 + m_MaxSize: 48 + m_Alignment: 4 + m_AlignByGeometry: 0 + m_RichText: 1 + m_HorizontalOverflow: 0 + m_VerticalOverflow: 0 + m_LineSpacing: 1 + m_Text: BindGPAccount +--- !u!1 &4294162433993405228 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 4294162433993405229} + - component: {fileID: 4294162433993405232} + - component: {fileID: 4294162433993405231} + - component: {fileID: 4294162433993405230} + m_Layer: 5 + m_Name: LogoutButton + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!224 &4294162433993405229 +RectTransform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 4294162433993405228} + m_LocalRotation: {x: -0, y: -0, z: -0, w: 1} + m_LocalPosition: {x: 0, y: 0, z: 0} + m_LocalScale: {x: 1, y: 1, z: 1} + m_ConstrainProportionsScale: 0 + m_Children: + - {fileID: 4294162434057969757} + m_Father: {fileID: 4294162432488689155} + m_RootOrder: 4 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} + m_AnchorMin: {x: 0.5, y: 0.5} + m_AnchorMax: {x: 0.5, y: 0.5} + m_AnchoredPosition: {x: -494, y: -209.00005} + m_SizeDelta: {x: 460, y: 140} + m_Pivot: {x: 0, y: 0.5} +--- !u!222 &4294162433993405232 +CanvasRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 4294162433993405228} + m_CullTransparentMesh: 1 +--- !u!114 &4294162433993405231 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 4294162433993405228} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: fe87c0e1cc204ed48ad3b37840f39efc, type: 3} + m_Name: + m_EditorClassIdentifier: + m_Material: {fileID: 0} + m_Color: {r: 1, g: 1, b: 1, a: 1} + m_RaycastTarget: 1 + m_RaycastPadding: {x: 0, y: 0, z: 0, w: 0} + m_Maskable: 1 + m_OnCullStateChanged: + m_PersistentCalls: + m_Calls: [] + m_Sprite: {fileID: 10905, guid: 0000000000000000f000000000000000, type: 0} + m_Type: 1 + m_PreserveAspect: 0 + m_FillCenter: 1 + m_FillMethod: 4 + m_FillAmount: 1 + m_FillClockwise: 1 + m_FillOrigin: 0 + m_UseSpriteMesh: 0 + m_PixelsPerUnitMultiplier: 1 +--- !u!114 &4294162433993405230 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 4294162433993405228} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 4e29b1a8efbd4b44bb3f3716e73f07ff, type: 3} + m_Name: + m_EditorClassIdentifier: + m_Navigation: + m_Mode: 3 + m_WrapAround: 0 + m_SelectOnUp: {fileID: 0} + m_SelectOnDown: {fileID: 0} + m_SelectOnLeft: {fileID: 0} + m_SelectOnRight: {fileID: 0} + m_Transition: 1 + m_Colors: + m_NormalColor: {r: 1, g: 1, b: 1, a: 1} + m_HighlightedColor: {r: 0.9607843, g: 0.9607843, b: 0.9607843, a: 1} + m_PressedColor: {r: 0.78431374, g: 0.78431374, b: 0.78431374, a: 1} + m_SelectedColor: {r: 0.9607843, g: 0.9607843, b: 0.9607843, a: 1} + m_DisabledColor: {r: 0.78431374, g: 0.78431374, b: 0.78431374, a: 0.5019608} + m_ColorMultiplier: 1 + m_FadeDuration: 0.1 + m_SpriteState: + m_HighlightedSprite: {fileID: 0} + m_PressedSprite: {fileID: 0} + m_SelectedSprite: {fileID: 0} + m_DisabledSprite: {fileID: 0} + m_AnimationTriggers: + m_NormalTrigger: Normal + m_HighlightedTrigger: Highlighted + m_PressedTrigger: Pressed + m_SelectedTrigger: Selected + m_DisabledTrigger: Disabled + m_Interactable: 1 + m_TargetGraphic: {fileID: 4294162433993405231} + m_OnClick: + m_PersistentCalls: + m_Calls: + - m_Target: {fileID: 733856151592599062} + m_TargetAssemblyTypeName: HCLoginDemoView, Assembly-CSharp + m_MethodName: ButtonEvent_Logout + m_Mode: 1 + m_Arguments: + m_ObjectArgument: {fileID: 0} + m_ObjectArgumentAssemblyTypeName: UnityEngine.Object, UnityEngine + m_IntArgument: 0 + m_FloatArgument: 0 + m_StringArgument: + m_BoolArgument: 0 + m_CallState: 2 +--- !u!1 &4294162434057969756 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 4294162434057969757} + - component: {fileID: 4294162434057969759} + - component: {fileID: 4294162434057969758} + m_Layer: 5 + m_Name: Text + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!224 &4294162434057969757 +RectTransform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 4294162434057969756} + m_LocalRotation: {x: -0, y: -0, z: -0, w: 1} + m_LocalPosition: {x: 0, y: 0, z: 0} + m_LocalScale: {x: 1, y: 1, z: 1} + m_ConstrainProportionsScale: 0 + m_Children: [] + m_Father: {fileID: 4294162433993405229} + m_RootOrder: 0 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} + m_AnchorMin: {x: 0, y: 0} + m_AnchorMax: {x: 1, y: 1} + m_AnchoredPosition: {x: 0, y: 0} + m_SizeDelta: {x: 0, y: 0} + m_Pivot: {x: 0.5, y: 0.5} +--- !u!222 &4294162434057969759 +CanvasRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 4294162434057969756} + m_CullTransparentMesh: 1 +--- !u!114 &4294162434057969758 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 4294162434057969756} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 5f7201a12d95ffc409449d95f23cf332, type: 3} + m_Name: + m_EditorClassIdentifier: + m_Material: {fileID: 0} + m_Color: {r: 0.19607843, g: 0.19607843, b: 0.19607843, a: 1} + m_RaycastTarget: 1 + m_RaycastPadding: {x: 0, y: 0, z: 0, w: 0} + m_Maskable: 1 + m_OnCullStateChanged: + m_PersistentCalls: + m_Calls: [] + m_FontData: + m_Font: {fileID: 10102, guid: 0000000000000000e000000000000000, type: 0} + m_FontSize: 48 + m_FontStyle: 0 + m_BestFit: 0 + m_MinSize: 4 + m_MaxSize: 48 + m_Alignment: 4 + m_AlignByGeometry: 0 + m_RichText: 1 + m_HorizontalOverflow: 0 + m_VerticalOverflow: 0 + m_LineSpacing: 1 + m_Text: Logout +--- !u!1 &4294162434084982349 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 4294162434084982350} + - component: {fileID: 4294162434084982352} + - component: {fileID: 4294162434084982351} + m_Layer: 5 + m_Name: Text + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!224 &4294162434084982350 +RectTransform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 4294162434084982349} + m_LocalRotation: {x: -0, y: -0, z: -0, w: 1} + m_LocalPosition: {x: 0, y: 0, z: 0} + m_LocalScale: {x: 1, y: 1, z: 1} + m_ConstrainProportionsScale: 0 + m_Children: [] + m_Father: {fileID: 4294162432188718698} + m_RootOrder: 1 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} + m_AnchorMin: {x: 0, y: 0} + m_AnchorMax: {x: 1, y: 1} + m_AnchoredPosition: {x: 0, y: 0} + m_SizeDelta: {x: 0, y: 0} + m_Pivot: {x: 0.5, y: 0.5} +--- !u!222 &4294162434084982352 +CanvasRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 4294162434084982349} + m_CullTransparentMesh: 1 +--- !u!114 &4294162434084982351 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 4294162434084982349} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 5f7201a12d95ffc409449d95f23cf332, type: 3} + m_Name: + m_EditorClassIdentifier: + m_Material: {fileID: 0} + m_Color: {r: 0.19607843, g: 0.19607843, b: 0.19607843, a: 1} + m_RaycastTarget: 1 + m_RaycastPadding: {x: 0, y: 0, z: 0, w: 0} + m_Maskable: 1 + m_OnCullStateChanged: + m_PersistentCalls: + m_Calls: [] + m_FontData: + m_Font: {fileID: 10102, guid: 0000000000000000e000000000000000, type: 0} + m_FontSize: 48 + m_FontStyle: 0 + m_BestFit: 0 + m_MinSize: 4 + m_MaxSize: 48 + m_Alignment: 4 + m_AlignByGeometry: 0 + m_RichText: 1 + m_HorizontalOverflow: 0 + m_VerticalOverflow: 0 + m_LineSpacing: 1 + m_Text: AppleLogin +--- !u!1 &4294162434102936162 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 4294162434102936163} + - component: {fileID: 4294162434102936165} + - component: {fileID: 4294162434102936164} + m_Layer: 5 + m_Name: BgImage + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!224 &4294162434102936163 +RectTransform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 4294162434102936162} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: 0, y: 0, z: 0} + m_LocalScale: {x: 1, y: 1, z: 1} + m_ConstrainProportionsScale: 0 + m_Children: + - {fileID: 4294162433051651899} + - {fileID: 4294162432640133112} + - {fileID: 4294162432488689155} + - {fileID: 1783675488} + - {fileID: 132285784501508409} + m_Father: {fileID: 4294162432436564280} + m_RootOrder: 0 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} + m_AnchorMin: {x: 0, y: 0} + m_AnchorMax: {x: 1, y: 1} + m_AnchoredPosition: {x: 0, y: 0} + m_SizeDelta: {x: 0, y: 0} + m_Pivot: {x: 0.5, y: 0.5} +--- !u!222 &4294162434102936165 +CanvasRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 4294162434102936162} + m_CullTransparentMesh: 1 +--- !u!114 &4294162434102936164 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 4294162434102936162} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: fe87c0e1cc204ed48ad3b37840f39efc, type: 3} + m_Name: + m_EditorClassIdentifier: + m_Material: {fileID: 0} + m_Color: {r: 0.6401471, g: 0.6792453, b: 0.6247775, a: 1} + m_RaycastTarget: 1 + m_RaycastPadding: {x: 0, y: 0, z: 0, w: 0} + m_Maskable: 1 + m_OnCullStateChanged: + m_PersistentCalls: + m_Calls: [] + m_Sprite: {fileID: 0} + m_Type: 0 + m_PreserveAspect: 0 + m_FillCenter: 1 + m_FillMethod: 4 + m_FillAmount: 1 + m_FillClockwise: 1 + m_FillOrigin: 0 + m_UseSpriteMesh: 0 + m_PixelsPerUnitMultiplier: 1 +--- !u!1 &4294162434148090823 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 4294162434148090824} + - component: {fileID: 4294162434148090827} + - component: {fileID: 4294162434148090826} + - component: {fileID: 4294162434148090825} + m_Layer: 5 + m_Name: BindGPAccountButton + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!224 &4294162434148090824 +RectTransform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 4294162434148090823} + m_LocalRotation: {x: -0, y: -0, z: -0, w: 1} + m_LocalPosition: {x: 0, y: 0, z: 0} + m_LocalScale: {x: 1, y: 1, z: 1} + m_ConstrainProportionsScale: 0 + m_Children: + - {fileID: 4294162433877855148} + m_Father: {fileID: 4294162432958913092} + m_RootOrder: 0 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} + m_AnchorMin: {x: 0.5, y: 0.5} + m_AnchorMax: {x: 0.5, y: 0.5} + m_AnchoredPosition: {x: -489, y: 204.99995} + m_SizeDelta: {x: 460, y: 140} + m_Pivot: {x: 0, y: 0.5} +--- !u!222 &4294162434148090827 +CanvasRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 4294162434148090823} + m_CullTransparentMesh: 1 +--- !u!114 &4294162434148090826 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 4294162434148090823} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: fe87c0e1cc204ed48ad3b37840f39efc, type: 3} + m_Name: + m_EditorClassIdentifier: + m_Material: {fileID: 0} + m_Color: {r: 1, g: 1, b: 1, a: 1} + m_RaycastTarget: 1 + m_RaycastPadding: {x: 0, y: 0, z: 0, w: 0} + m_Maskable: 1 + m_OnCullStateChanged: + m_PersistentCalls: + m_Calls: [] + m_Sprite: {fileID: 10905, guid: 0000000000000000f000000000000000, type: 0} + m_Type: 1 + m_PreserveAspect: 0 + m_FillCenter: 1 + m_FillMethod: 4 + m_FillAmount: 1 + m_FillClockwise: 1 + m_FillOrigin: 0 + m_UseSpriteMesh: 0 + m_PixelsPerUnitMultiplier: 1 +--- !u!114 &4294162434148090825 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 4294162434148090823} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 4e29b1a8efbd4b44bb3f3716e73f07ff, type: 3} + m_Name: + m_EditorClassIdentifier: + m_Navigation: + m_Mode: 3 + m_WrapAround: 0 + m_SelectOnUp: {fileID: 0} + m_SelectOnDown: {fileID: 0} + m_SelectOnLeft: {fileID: 0} + m_SelectOnRight: {fileID: 0} + m_Transition: 1 + m_Colors: + m_NormalColor: {r: 1, g: 1, b: 1, a: 1} + m_HighlightedColor: {r: 0.9607843, g: 0.9607843, b: 0.9607843, a: 1} + m_PressedColor: {r: 0.78431374, g: 0.78431374, b: 0.78431374, a: 1} + m_SelectedColor: {r: 0.9607843, g: 0.9607843, b: 0.9607843, a: 1} + m_DisabledColor: {r: 0.78431374, g: 0.78431374, b: 0.78431374, a: 0.5019608} + m_ColorMultiplier: 1 + m_FadeDuration: 0.1 + m_SpriteState: + m_HighlightedSprite: {fileID: 0} + m_PressedSprite: {fileID: 0} + m_SelectedSprite: {fileID: 0} + m_DisabledSprite: {fileID: 0} + m_AnimationTriggers: + m_NormalTrigger: Normal + m_HighlightedTrigger: Highlighted + m_PressedTrigger: Pressed + m_SelectedTrigger: Selected + m_DisabledTrigger: Disabled + m_Interactable: 1 + m_TargetGraphic: {fileID: 4294162434148090826} + m_OnClick: + m_PersistentCalls: + m_Calls: + - m_Target: {fileID: 733856151592599062} + m_TargetAssemblyTypeName: HCLoginDemoView, Assembly-CSharp + m_MethodName: ButtonEvent_BindGPAccount + m_Mode: 1 + m_Arguments: + m_ObjectArgument: {fileID: 0} + m_ObjectArgumentAssemblyTypeName: UnityEngine.Object, UnityEngine + m_IntArgument: 0 + m_FloatArgument: 0 + m_StringArgument: + m_BoolArgument: 0 + m_CallState: 2 +--- !u!1 &5332462343057580256 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 578793549159237808} + - component: {fileID: 6346246135460676094} + - component: {fileID: 5429948512697693620} + m_Layer: 5 + m_Name: GameClub2 + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!224 &578793549159237808 +RectTransform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 5332462343057580256} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: 0, y: 0, z: 0} + m_LocalScale: {x: 1, y: 1, z: 1} + m_ConstrainProportionsScale: 0 + m_Children: [] + m_Father: {fileID: 4294162432488689155} + m_RootOrder: 9 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} + m_AnchorMin: {x: 0.5, y: 0.5} + m_AnchorMax: {x: 0.5, y: 0.5} + m_AnchoredPosition: {x: 312, y: 374} + m_SizeDelta: {x: 100, y: 100} + m_Pivot: {x: 0.5, y: 0.5} +--- !u!222 &6346246135460676094 +CanvasRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 5332462343057580256} + m_CullTransparentMesh: 1 +--- !u!114 &5429948512697693620 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 5332462343057580256} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: fe87c0e1cc204ed48ad3b37840f39efc, type: 3} + m_Name: + m_EditorClassIdentifier: + m_Material: {fileID: 0} + m_Color: {r: 1, g: 1, b: 1, a: 1} + m_RaycastTarget: 1 + m_RaycastPadding: {x: 0, y: 0, z: 0, w: 0} + m_Maskable: 1 + m_OnCullStateChanged: + m_PersistentCalls: + m_Calls: [] + m_Sprite: {fileID: 0} + m_Type: 0 + m_PreserveAspect: 0 + m_FillCenter: 1 + m_FillMethod: 4 + m_FillAmount: 1 + m_FillClockwise: 1 + m_FillOrigin: 0 + m_UseSpriteMesh: 0 + m_PixelsPerUnitMultiplier: 1 +--- !u!1 &6908785865222444216 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 5194129794978951985} + - component: {fileID: 4235554796263428689} + - component: {fileID: 1405330412556018282} + m_Layer: 5 + m_Name: Text + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!224 &5194129794978951985 +RectTransform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 6908785865222444216} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: 0, y: 0, z: 0} + m_LocalScale: {x: 1, y: 1, z: 1} + m_ConstrainProportionsScale: 0 + m_Children: [] + m_Father: {fileID: 132285784501508409} + m_RootOrder: 0 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} + m_AnchorMin: {x: 0, y: 0.5} + m_AnchorMax: {x: 1, y: 0.5} + m_AnchoredPosition: {x: 0, y: 8} + m_SizeDelta: {x: 0, y: 90} + m_Pivot: {x: 0.5, y: 0.5} +--- !u!222 &4235554796263428689 +CanvasRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 6908785865222444216} + m_CullTransparentMesh: 1 +--- !u!114 &1405330412556018282 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 6908785865222444216} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 5f7201a12d95ffc409449d95f23cf332, type: 3} + m_Name: + m_EditorClassIdentifier: + m_Material: {fileID: 0} + m_Color: {r: 0.19607843, g: 0.19607843, b: 0.19607843, a: 1} + m_RaycastTarget: 1 + m_RaycastPadding: {x: 0, y: 0, z: 0, w: 0} + m_Maskable: 1 + m_OnCullStateChanged: + m_PersistentCalls: + m_Calls: [] + m_FontData: + m_Font: {fileID: 10102, guid: 0000000000000000e000000000000000, type: 0} + m_FontSize: 48 + m_FontStyle: 1 + m_BestFit: 0 + m_MinSize: 3 + m_MaxSize: 48 + m_Alignment: 4 + m_AlignByGeometry: 0 + m_RichText: 1 + m_HorizontalOverflow: 0 + m_VerticalOverflow: 0 + m_LineSpacing: 1 + m_Text: 'Tips:' +--- !u!1 &7180976568595589765 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 7600893053795411932} + - component: {fileID: 6048181235747828528} + - component: {fileID: 4214785410961028820} + m_Layer: 5 + m_Name: StatusText + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!224 &7600893053795411932 +RectTransform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 7180976568595589765} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: 0, y: 0, z: 0} + m_LocalScale: {x: 1, y: 1, z: 1} + m_ConstrainProportionsScale: 0 + m_Children: [] + m_Father: {fileID: 4294162433051651899} + m_RootOrder: 0 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} + m_AnchorMin: {x: 0.5, y: 0.5} + m_AnchorMax: {x: 0.5, y: 0.5} + m_AnchoredPosition: {x: 0, y: 553} + m_SizeDelta: {x: 882.1836, y: 392.8734} + m_Pivot: {x: 0.5, y: 0.5} +--- !u!222 &6048181235747828528 +CanvasRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 7180976568595589765} + m_CullTransparentMesh: 1 +--- !u!114 &4214785410961028820 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 7180976568595589765} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 5f7201a12d95ffc409449d95f23cf332, type: 3} + m_Name: + m_EditorClassIdentifier: + m_Material: {fileID: 0} + m_Color: {r: 0.19607843, g: 0.19607843, b: 0.19607843, a: 1} + m_RaycastTarget: 1 + m_RaycastPadding: {x: 0, y: 0, z: 0, w: 0} + m_Maskable: 1 + m_OnCullStateChanged: + m_PersistentCalls: + m_Calls: [] + m_FontData: + m_Font: {fileID: 10102, guid: 0000000000000000e000000000000000, type: 0} + m_FontSize: 52 + m_FontStyle: 1 + m_BestFit: 0 + m_MinSize: 3 + m_MaxSize: 52 + m_Alignment: 0 + m_AlignByGeometry: 0 + m_RichText: 1 + m_HorizontalOverflow: 0 + m_VerticalOverflow: 0 + m_LineSpacing: 1 + m_Text: +--- !u!1 &7482611480546708824 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 6556306728583367042} + - component: {fileID: 4620761252157173105} + - component: {fileID: 4396998034942964561} + - component: {fileID: 6868924394055446761} + m_Layer: 5 + m_Name: GetCurrAccountButton + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!224 &6556306728583367042 +RectTransform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 7482611480546708824} + m_LocalRotation: {x: -0, y: -0, z: -0, w: 1} + m_LocalPosition: {x: 0, y: 0, z: 0} + m_LocalScale: {x: 1, y: 1, z: 1} + m_ConstrainProportionsScale: 0 + m_Children: + - {fileID: 4729295495060722199} + m_Father: {fileID: 4294162432488689155} + m_RootOrder: 6 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} + m_AnchorMin: {x: 0.5, y: 0.5} + m_AnchorMax: {x: 0.5, y: 0.5} + m_AnchoredPosition: {x: -195, y: -509} + m_SizeDelta: {x: 460, y: 140} + m_Pivot: {x: 0, y: 0.5} +--- !u!222 &4620761252157173105 +CanvasRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 7482611480546708824} + m_CullTransparentMesh: 1 +--- !u!114 &4396998034942964561 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 7482611480546708824} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: fe87c0e1cc204ed48ad3b37840f39efc, type: 3} + m_Name: + m_EditorClassIdentifier: + m_Material: {fileID: 0} + m_Color: {r: 1, g: 1, b: 1, a: 1} + m_RaycastTarget: 1 + m_RaycastPadding: {x: 0, y: 0, z: 0, w: 0} + m_Maskable: 1 + m_OnCullStateChanged: + m_PersistentCalls: + m_Calls: [] + m_Sprite: {fileID: 10905, guid: 0000000000000000f000000000000000, type: 0} + m_Type: 1 + m_PreserveAspect: 0 + m_FillCenter: 1 + m_FillMethod: 4 + m_FillAmount: 1 + m_FillClockwise: 1 + m_FillOrigin: 0 + m_UseSpriteMesh: 0 + m_PixelsPerUnitMultiplier: 1 +--- !u!114 &6868924394055446761 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 7482611480546708824} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 4e29b1a8efbd4b44bb3f3716e73f07ff, type: 3} + m_Name: + m_EditorClassIdentifier: + m_Navigation: + m_Mode: 3 + m_WrapAround: 0 + m_SelectOnUp: {fileID: 0} + m_SelectOnDown: {fileID: 0} + m_SelectOnLeft: {fileID: 0} + m_SelectOnRight: {fileID: 0} + m_Transition: 1 + m_Colors: + m_NormalColor: {r: 1, g: 1, b: 1, a: 1} + m_HighlightedColor: {r: 0.9607843, g: 0.9607843, b: 0.9607843, a: 1} + m_PressedColor: {r: 0.78431374, g: 0.78431374, b: 0.78431374, a: 1} + m_SelectedColor: {r: 0.9607843, g: 0.9607843, b: 0.9607843, a: 1} + m_DisabledColor: {r: 0.78431374, g: 0.78431374, b: 0.78431374, a: 0.5019608} + m_ColorMultiplier: 1 + m_FadeDuration: 0.1 + m_SpriteState: + m_HighlightedSprite: {fileID: 0} + m_PressedSprite: {fileID: 0} + m_SelectedSprite: {fileID: 0} + m_DisabledSprite: {fileID: 0} + m_AnimationTriggers: + m_NormalTrigger: Normal + m_HighlightedTrigger: Highlighted + m_PressedTrigger: Pressed + m_SelectedTrigger: Selected + m_DisabledTrigger: Disabled + m_Interactable: 1 + m_TargetGraphic: {fileID: 4396998034942964561} + m_OnClick: + m_PersistentCalls: + m_Calls: + - m_Target: {fileID: 733856151592599062} + m_TargetAssemblyTypeName: HCLoginDemoView, Assembly-CSharp + m_MethodName: ButtonEvent_GetCurrentAccount + m_Mode: 1 + m_Arguments: + m_ObjectArgument: {fileID: 0} + m_ObjectArgumentAssemblyTypeName: UnityEngine.Object, UnityEngine + m_IntArgument: 0 + m_FloatArgument: 0 + m_StringArgument: + m_BoolArgument: 0 + m_CallState: 2 +--- !u!1 &7944884875184429939 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 1707087404811008121} + - component: {fileID: 6726325319456693158} + - component: {fileID: 2060466898915017248} + - component: {fileID: 6137957589035836736} + m_Layer: 5 + m_Name: BindAppleAccountButton + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!224 &1707087404811008121 +RectTransform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 7944884875184429939} + m_LocalRotation: {x: -0, y: -0, z: -0, w: 1} + m_LocalPosition: {x: 0, y: 0, z: 0} + m_LocalScale: {x: 1, y: 1, z: 1} + m_ConstrainProportionsScale: 0 + m_Children: + - {fileID: 2652275759293131260} + m_Father: {fileID: 4294162432958913092} + m_RootOrder: 1 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} + m_AnchorMin: {x: 0.5, y: 0.5} + m_AnchorMax: {x: 0.5, y: 0.5} + m_AnchoredPosition: {x: 34, y: 208.99995} + m_SizeDelta: {x: 460, y: 140} + m_Pivot: {x: 0, y: 0.5} +--- !u!222 &6726325319456693158 +CanvasRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 7944884875184429939} + m_CullTransparentMesh: 1 +--- !u!114 &2060466898915017248 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 7944884875184429939} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: fe87c0e1cc204ed48ad3b37840f39efc, type: 3} + m_Name: + m_EditorClassIdentifier: + m_Material: {fileID: 0} + m_Color: {r: 1, g: 1, b: 1, a: 1} + m_RaycastTarget: 1 + m_RaycastPadding: {x: 0, y: 0, z: 0, w: 0} + m_Maskable: 1 + m_OnCullStateChanged: + m_PersistentCalls: + m_Calls: [] + m_Sprite: {fileID: 10905, guid: 0000000000000000f000000000000000, type: 0} + m_Type: 1 + m_PreserveAspect: 0 + m_FillCenter: 1 + m_FillMethod: 4 + m_FillAmount: 1 + m_FillClockwise: 1 + m_FillOrigin: 0 + m_UseSpriteMesh: 0 + m_PixelsPerUnitMultiplier: 1 +--- !u!114 &6137957589035836736 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 7944884875184429939} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 4e29b1a8efbd4b44bb3f3716e73f07ff, type: 3} + m_Name: + m_EditorClassIdentifier: + m_Navigation: + m_Mode: 3 + m_WrapAround: 0 + m_SelectOnUp: {fileID: 0} + m_SelectOnDown: {fileID: 0} + m_SelectOnLeft: {fileID: 0} + m_SelectOnRight: {fileID: 0} + m_Transition: 1 + m_Colors: + m_NormalColor: {r: 1, g: 1, b: 1, a: 1} + m_HighlightedColor: {r: 0.9607843, g: 0.9607843, b: 0.9607843, a: 1} + m_PressedColor: {r: 0.78431374, g: 0.78431374, b: 0.78431374, a: 1} + m_SelectedColor: {r: 0.9607843, g: 0.9607843, b: 0.9607843, a: 1} + m_DisabledColor: {r: 0.78431374, g: 0.78431374, b: 0.78431374, a: 0.5019608} + m_ColorMultiplier: 1 + m_FadeDuration: 0.1 + m_SpriteState: + m_HighlightedSprite: {fileID: 0} + m_PressedSprite: {fileID: 0} + m_SelectedSprite: {fileID: 0} + m_DisabledSprite: {fileID: 0} + m_AnimationTriggers: + m_NormalTrigger: Normal + m_HighlightedTrigger: Highlighted + m_PressedTrigger: Pressed + m_SelectedTrigger: Selected + m_DisabledTrigger: Disabled + m_Interactable: 1 + m_TargetGraphic: {fileID: 2060466898915017248} + m_OnClick: + m_PersistentCalls: + m_Calls: + - m_Target: {fileID: 733856151592599062} + m_TargetAssemblyTypeName: HCLoginDemoView, Assembly-CSharp + m_MethodName: ButtonEvent_BindAppleAccount + m_Mode: 1 + m_Arguments: + m_ObjectArgument: {fileID: 0} + m_ObjectArgumentAssemblyTypeName: UnityEngine.Object, UnityEngine + m_IntArgument: 0 + m_FloatArgument: 0 + m_StringArgument: + m_BoolArgument: 0 + m_CallState: 2 +--- !u!1 &8108494241079604106 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 6632160149121441925} + - component: {fileID: 2082960957341342720} + - component: {fileID: 7639728277395056425} + m_Layer: 5 + m_Name: CurrAccountInfoText + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!224 &6632160149121441925 +RectTransform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 8108494241079604106} + m_LocalRotation: {x: -0, y: -0, z: -0, w: 1} + m_LocalPosition: {x: 0, y: 0, z: 0} + m_LocalScale: {x: 1, y: 1, z: 1} + m_ConstrainProportionsScale: 0 + m_Children: [] + m_Father: {fileID: 4294162432488689155} + m_RootOrder: 1 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} + m_AnchorMin: {x: 0, y: 0} + m_AnchorMax: {x: 1, y: 1} + m_AnchoredPosition: {x: 33.000015, y: 539} + m_SizeDelta: {x: 804.5001, y: 40} + m_Pivot: {x: 0.5, y: 0.5} +--- !u!222 &2082960957341342720 +CanvasRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 8108494241079604106} + m_CullTransparentMesh: 1 +--- !u!114 &7639728277395056425 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 8108494241079604106} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 5f7201a12d95ffc409449d95f23cf332, type: 3} + m_Name: + m_EditorClassIdentifier: + m_Material: {fileID: 0} + m_Color: {r: 0.19607843, g: 0.19607843, b: 0.19607843, a: 1} + m_RaycastTarget: 1 + m_RaycastPadding: {x: 0, y: 0, z: 0, w: 0} + m_Maskable: 1 + m_OnCullStateChanged: + m_PersistentCalls: + m_Calls: [] + m_FontData: + m_Font: {fileID: 10102, guid: 0000000000000000e000000000000000, type: 0} + m_FontSize: 32 + m_FontStyle: 0 + m_BestFit: 0 + m_MinSize: 3 + m_MaxSize: 88 + m_Alignment: 3 + m_AlignByGeometry: 0 + m_RichText: 1 + m_HorizontalOverflow: 0 + m_VerticalOverflow: 0 + m_LineSpacing: 1 + m_Text: Welcome to My Game!Welcome to My Game!Welcome to My Game!Welcome to My + Game! +--- !u!1 &8168520962975326272 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 2652275759293131260} + - component: {fileID: 4400516797785660084} + - component: {fileID: 2489763500310209298} + m_Layer: 5 + m_Name: Text + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!224 &2652275759293131260 +RectTransform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 8168520962975326272} + m_LocalRotation: {x: -0, y: -0, z: -0, w: 1} + m_LocalPosition: {x: 0, y: 0, z: 0} + m_LocalScale: {x: 1, y: 1, z: 1} + m_ConstrainProportionsScale: 0 + m_Children: [] + m_Father: {fileID: 1707087404811008121} + m_RootOrder: 0 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} + m_AnchorMin: {x: 0, y: 0} + m_AnchorMax: {x: 1, y: 1} + m_AnchoredPosition: {x: 0, y: 0} + m_SizeDelta: {x: 0, y: 0} + m_Pivot: {x: 0.5, y: 0.5} +--- !u!222 &4400516797785660084 +CanvasRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 8168520962975326272} + m_CullTransparentMesh: 1 +--- !u!114 &2489763500310209298 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 8168520962975326272} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 5f7201a12d95ffc409449d95f23cf332, type: 3} + m_Name: + m_EditorClassIdentifier: + m_Material: {fileID: 0} + m_Color: {r: 0.19607843, g: 0.19607843, b: 0.19607843, a: 1} + m_RaycastTarget: 1 + m_RaycastPadding: {x: 0, y: 0, z: 0, w: 0} + m_Maskable: 1 + m_OnCullStateChanged: + m_PersistentCalls: + m_Calls: [] + m_FontData: + m_Font: {fileID: 10102, guid: 0000000000000000e000000000000000, type: 0} + m_FontSize: 48 + m_FontStyle: 0 + m_BestFit: 0 + m_MinSize: 4 + m_MaxSize: 48 + m_Alignment: 4 + m_AlignByGeometry: 0 + m_RichText: 1 + m_HorizontalOverflow: 0 + m_VerticalOverflow: 0 + m_LineSpacing: 1 + m_Text: BindAppleAccount +--- !u!1 &8207712068283654259 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 7630730582446823084} + - component: {fileID: 4894774388131525417} + - component: {fileID: 1407499323836400454} + - component: {fileID: 3226379440998748811} + m_Layer: 5 + m_Name: ForceBindAccount02Button + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!224 &7630730582446823084 +RectTransform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 8207712068283654259} + m_LocalRotation: {x: -0, y: -0, z: -0, w: 1} + m_LocalPosition: {x: 0, y: 0, z: 0} + m_LocalScale: {x: 1, y: 1, z: 1} + m_ConstrainProportionsScale: 0 + m_Children: + - {fileID: 6833649039534518275} + m_Father: {fileID: 4294162432958913092} + m_RootOrder: 3 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} + m_AnchorMin: {x: 0.5, y: 0.5} + m_AnchorMax: {x: 0.5, y: 0.5} + m_AnchoredPosition: {x: 38, y: -5} + m_SizeDelta: {x: 460, y: 140} + m_Pivot: {x: 0, y: 0.5} +--- !u!222 &4894774388131525417 +CanvasRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 8207712068283654259} + m_CullTransparentMesh: 1 +--- !u!114 &1407499323836400454 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 8207712068283654259} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: fe87c0e1cc204ed48ad3b37840f39efc, type: 3} + m_Name: + m_EditorClassIdentifier: + m_Material: {fileID: 0} + m_Color: {r: 1, g: 1, b: 1, a: 1} + m_RaycastTarget: 1 + m_RaycastPadding: {x: 0, y: 0, z: 0, w: 0} + m_Maskable: 1 + m_OnCullStateChanged: + m_PersistentCalls: + m_Calls: [] + m_Sprite: {fileID: 10905, guid: 0000000000000000f000000000000000, type: 0} + m_Type: 1 + m_PreserveAspect: 0 + m_FillCenter: 1 + m_FillMethod: 4 + m_FillAmount: 1 + m_FillClockwise: 1 + m_FillOrigin: 0 + m_UseSpriteMesh: 0 + m_PixelsPerUnitMultiplier: 1 +--- !u!114 &3226379440998748811 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 8207712068283654259} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 4e29b1a8efbd4b44bb3f3716e73f07ff, type: 3} + m_Name: + m_EditorClassIdentifier: + m_Navigation: + m_Mode: 3 + m_WrapAround: 0 + m_SelectOnUp: {fileID: 0} + m_SelectOnDown: {fileID: 0} + m_SelectOnLeft: {fileID: 0} + m_SelectOnRight: {fileID: 0} + m_Transition: 1 + m_Colors: + m_NormalColor: {r: 1, g: 1, b: 1, a: 1} + m_HighlightedColor: {r: 0.9607843, g: 0.9607843, b: 0.9607843, a: 1} + m_PressedColor: {r: 0.78431374, g: 0.78431374, b: 0.78431374, a: 1} + m_SelectedColor: {r: 0.9607843, g: 0.9607843, b: 0.9607843, a: 1} + m_DisabledColor: {r: 0.78431374, g: 0.78431374, b: 0.78431374, a: 0.5019608} + m_ColorMultiplier: 1 + m_FadeDuration: 0.1 + m_SpriteState: + m_HighlightedSprite: {fileID: 0} + m_PressedSprite: {fileID: 0} + m_SelectedSprite: {fileID: 0} + m_DisabledSprite: {fileID: 0} + m_AnimationTriggers: + m_NormalTrigger: Normal + m_HighlightedTrigger: Highlighted + m_PressedTrigger: Pressed + m_SelectedTrigger: Selected + m_DisabledTrigger: Disabled + m_Interactable: 1 + m_TargetGraphic: {fileID: 1407499323836400454} + m_OnClick: + m_PersistentCalls: + m_Calls: + - m_Target: {fileID: 733856151592599062} + m_TargetAssemblyTypeName: HCLoginDemoView, Assembly-CSharp + m_MethodName: ButtonEvent_ForceBindAccount02 + m_Mode: 1 + m_Arguments: + m_ObjectArgument: {fileID: 0} + m_ObjectArgumentAssemblyTypeName: UnityEngine.Object, UnityEngine + m_IntArgument: 0 + m_FloatArgument: 0 + m_StringArgument: + m_BoolArgument: 0 + m_CallState: 2 +--- !u!1 &8579793259455708683 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 4729295495060722199} + - component: {fileID: 6880928067771146204} + - component: {fileID: 4306791697567388414} + m_Layer: 5 + m_Name: Text + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!224 &4729295495060722199 +RectTransform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 8579793259455708683} + m_LocalRotation: {x: -0, y: -0, z: -0, w: 1} + m_LocalPosition: {x: 0, y: 0, z: 0} + m_LocalScale: {x: 1, y: 1, z: 1} + m_ConstrainProportionsScale: 0 + m_Children: [] + m_Father: {fileID: 6556306728583367042} + m_RootOrder: 0 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} + m_AnchorMin: {x: 0, y: 0} + m_AnchorMax: {x: 1, y: 1} + m_AnchoredPosition: {x: 0, y: 0} + m_SizeDelta: {x: 0, y: 0} + m_Pivot: {x: 0.5, y: 0.5} +--- !u!222 &6880928067771146204 +CanvasRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 8579793259455708683} + m_CullTransparentMesh: 1 +--- !u!114 &4306791697567388414 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 8579793259455708683} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 5f7201a12d95ffc409449d95f23cf332, type: 3} + m_Name: + m_EditorClassIdentifier: + m_Material: {fileID: 0} + m_Color: {r: 0.19607843, g: 0.19607843, b: 0.19607843, a: 1} + m_RaycastTarget: 1 + m_RaycastPadding: {x: 0, y: 0, z: 0, w: 0} + m_Maskable: 1 + m_OnCullStateChanged: + m_PersistentCalls: + m_Calls: [] + m_FontData: + m_Font: {fileID: 10102, guid: 0000000000000000e000000000000000, type: 0} + m_FontSize: 42 + m_FontStyle: 0 + m_BestFit: 0 + m_MinSize: 4 + m_MaxSize: 48 + m_Alignment: 4 + m_AlignByGeometry: 0 + m_RichText: 1 + m_HorizontalOverflow: 0 + m_VerticalOverflow: 0 + m_LineSpacing: 1 + m_Text: GetCurrAccount +--- !u!1 &8599555501725377185 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 884154943731010375} + - component: {fileID: 7670135462805221781} + - component: {fileID: 1328585646629388449} + - component: {fileID: 2688207363094699647} + m_Layer: 5 + m_Name: GoGameClub + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!224 &884154943731010375 +RectTransform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 8599555501725377185} + m_LocalRotation: {x: -0, y: -0, z: -0, w: 1} + m_LocalPosition: {x: 0, y: 0, z: 0} + m_LocalScale: {x: 1, y: 1, z: 1} + m_ConstrainProportionsScale: 0 + m_Children: + - {fileID: 2487917395142333241} + m_Father: {fileID: 4294162432488689155} + m_RootOrder: 7 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} + m_AnchorMin: {x: 0.5, y: 0.5} + m_AnchorMax: {x: 0.5, y: 0.5} + m_AnchoredPosition: {x: 43, y: -506} + m_SizeDelta: {x: 460, y: 140} + m_Pivot: {x: 0, y: 0.5} +--- !u!222 &7670135462805221781 +CanvasRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 8599555501725377185} + m_CullTransparentMesh: 1 +--- !u!114 &1328585646629388449 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 8599555501725377185} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: fe87c0e1cc204ed48ad3b37840f39efc, type: 3} + m_Name: + m_EditorClassIdentifier: + m_Material: {fileID: 0} + m_Color: {r: 1, g: 1, b: 1, a: 1} + m_RaycastTarget: 1 + m_RaycastPadding: {x: 0, y: 0, z: 0, w: 0} + m_Maskable: 1 + m_OnCullStateChanged: + m_PersistentCalls: + m_Calls: [] + m_Sprite: {fileID: 10905, guid: 0000000000000000f000000000000000, type: 0} + m_Type: 1 + m_PreserveAspect: 0 + m_FillCenter: 1 + m_FillMethod: 4 + m_FillAmount: 1 + m_FillClockwise: 1 + m_FillOrigin: 0 + m_UseSpriteMesh: 0 + m_PixelsPerUnitMultiplier: 1 +--- !u!114 &2688207363094699647 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 8599555501725377185} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 4e29b1a8efbd4b44bb3f3716e73f07ff, type: 3} + m_Name: + m_EditorClassIdentifier: + m_Navigation: + m_Mode: 3 + m_WrapAround: 0 + m_SelectOnUp: {fileID: 0} + m_SelectOnDown: {fileID: 0} + m_SelectOnLeft: {fileID: 0} + m_SelectOnRight: {fileID: 0} + m_Transition: 1 + m_Colors: + m_NormalColor: {r: 1, g: 1, b: 1, a: 1} + m_HighlightedColor: {r: 0.9607843, g: 0.9607843, b: 0.9607843, a: 1} + m_PressedColor: {r: 0.78431374, g: 0.78431374, b: 0.78431374, a: 1} + m_SelectedColor: {r: 0.9607843, g: 0.9607843, b: 0.9607843, a: 1} + m_DisabledColor: {r: 0.78431374, g: 0.78431374, b: 0.78431374, a: 0.5019608} + m_ColorMultiplier: 1 + m_FadeDuration: 0.1 + m_SpriteState: + m_HighlightedSprite: {fileID: 0} + m_PressedSprite: {fileID: 0} + m_SelectedSprite: {fileID: 0} + m_DisabledSprite: {fileID: 0} + m_AnimationTriggers: + m_NormalTrigger: Normal + m_HighlightedTrigger: Highlighted + m_PressedTrigger: Pressed + m_SelectedTrigger: Selected + m_DisabledTrigger: Disabled + m_Interactable: 1 + m_TargetGraphic: {fileID: 1328585646629388449} + m_OnClick: + m_PersistentCalls: + m_Calls: + - m_Target: {fileID: 733856151592599062} + m_TargetAssemblyTypeName: HCLoginDemoView, Assembly-CSharp + m_MethodName: ButtonEvent_GoGameClub + m_Mode: 1 + m_Arguments: + m_ObjectArgument: {fileID: 0} + m_ObjectArgumentAssemblyTypeName: UnityEngine.Object, UnityEngine + m_IntArgument: 0 + m_FloatArgument: 0 + m_StringArgument: + m_BoolArgument: 0 + m_CallState: 2 diff --git a/Assets/Plugins/ByteGame/com.bytedance.starksdk.unitytools/dofuscatorConfig.xml.meta b/Assets/HCMiniSdk/Demo/Resources/LoginDemoView.prefab.meta similarity index 60% rename from Assets/Plugins/ByteGame/com.bytedance.starksdk.unitytools/dofuscatorConfig.xml.meta rename to Assets/HCMiniSdk/Demo/Resources/LoginDemoView.prefab.meta index b0c88a73..4e19826d 100644 --- a/Assets/Plugins/ByteGame/com.bytedance.starksdk.unitytools/dofuscatorConfig.xml.meta +++ b/Assets/HCMiniSdk/Demo/Resources/LoginDemoView.prefab.meta @@ -1,7 +1,7 @@ -fileFormatVersion: 2 -guid: dd0a8677dc2f7634999693d9e23ed383 -TextScriptImporter: - externalObjects: {} - userData: - assetBundleName: - assetBundleVariant: +fileFormatVersion: 2 +guid: f72cd7b149a7e42d6818628ebadb8ba4 +PrefabImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/HCMiniSdk/Demo/Resources/MainDemoView.prefab b/Assets/HCMiniSdk/Demo/Resources/MainDemoView.prefab new file mode 100644 index 00000000..5575e6ff --- /dev/null +++ b/Assets/HCMiniSdk/Demo/Resources/MainDemoView.prefab @@ -0,0 +1,8593 @@ +%YAML 1.1 +%TAG !u! tag:unity3d.com,2011: +--- !u!1 &68725997335851007 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 6767664043325814637} + - component: {fileID: 2054928313474719825} + - component: {fileID: 7130299496316587953} + - component: {fileID: 1492670052576965230} + m_Layer: 5 + m_Name: HideNativeButton4 + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!224 &6767664043325814637 +RectTransform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 68725997335851007} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: 0, y: 0, z: 0} + m_LocalScale: {x: 1, y: 1, z: 1} + m_ConstrainProportionsScale: 0 + m_Children: + - {fileID: 2403994819041314570} + m_Father: {fileID: 1240445629039028095} + m_RootOrder: 14 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} + m_AnchorMin: {x: 0.5, y: 0.5} + m_AnchorMax: {x: 0.5, y: 0.5} + m_AnchoredPosition: {x: 4, y: -449} + m_SizeDelta: {x: 400, y: 120} + m_Pivot: {x: 0, y: 0.5} +--- !u!222 &2054928313474719825 +CanvasRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 68725997335851007} + m_CullTransparentMesh: 1 +--- !u!114 &7130299496316587953 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 68725997335851007} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: fe87c0e1cc204ed48ad3b37840f39efc, type: 3} + m_Name: + m_EditorClassIdentifier: + m_Material: {fileID: 0} + m_Color: {r: 1, g: 1, b: 1, a: 1} + m_RaycastTarget: 1 + m_RaycastPadding: {x: 0, y: 0, z: 0, w: 0} + m_Maskable: 1 + m_OnCullStateChanged: + m_PersistentCalls: + m_Calls: [] + m_Sprite: {fileID: 10905, guid: 0000000000000000f000000000000000, type: 0} + m_Type: 1 + m_PreserveAspect: 0 + m_FillCenter: 1 + m_FillMethod: 4 + m_FillAmount: 1 + m_FillClockwise: 1 + m_FillOrigin: 0 + m_UseSpriteMesh: 0 + m_PixelsPerUnitMultiplier: 1 +--- !u!114 &1492670052576965230 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 68725997335851007} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 4e29b1a8efbd4b44bb3f3716e73f07ff, type: 3} + m_Name: + m_EditorClassIdentifier: + m_Navigation: + m_Mode: 3 + m_WrapAround: 0 + m_SelectOnUp: {fileID: 0} + m_SelectOnDown: {fileID: 0} + m_SelectOnLeft: {fileID: 0} + m_SelectOnRight: {fileID: 0} + m_Transition: 1 + m_Colors: + m_NormalColor: {r: 1, g: 1, b: 1, a: 1} + m_HighlightedColor: {r: 0.9607843, g: 0.9607843, b: 0.9607843, a: 1} + m_PressedColor: {r: 0.78431374, g: 0.78431374, b: 0.78431374, a: 1} + m_SelectedColor: {r: 0.9607843, g: 0.9607843, b: 0.9607843, a: 1} + m_DisabledColor: {r: 0.78431374, g: 0.78431374, b: 0.78431374, a: 0.5019608} + m_ColorMultiplier: 1 + m_FadeDuration: 0.1 + m_SpriteState: + m_HighlightedSprite: {fileID: 0} + m_PressedSprite: {fileID: 0} + m_SelectedSprite: {fileID: 0} + m_DisabledSprite: {fileID: 0} + m_AnimationTriggers: + m_NormalTrigger: Normal + m_HighlightedTrigger: Highlighted + m_PressedTrigger: Pressed + m_SelectedTrigger: Selected + m_DisabledTrigger: Disabled + m_Interactable: 1 + m_TargetGraphic: {fileID: 7130299496316587953} + m_OnClick: + m_PersistentCalls: + m_Calls: + - m_Target: {fileID: 7348458583946661662} + m_TargetAssemblyTypeName: HCDemoScene, Assembly-CSharp + m_MethodName: Button_RemoveNative_4 + m_Mode: 1 + m_Arguments: + m_ObjectArgument: {fileID: 0} + m_ObjectArgumentAssemblyTypeName: UnityEngine.Object, UnityEngine + m_IntArgument: 0 + m_FloatArgument: 0 + m_StringArgument: + m_BoolArgument: 0 + m_CallState: 2 +--- !u!1 &125899406088889185 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 4650141467237551916} + m_Layer: 5 + m_Name: Record + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!224 &4650141467237551916 +RectTransform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 125899406088889185} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: 0, y: 0, z: 0} + m_LocalScale: {x: 1, y: 1, z: 1} + m_ConstrainProportionsScale: 0 + m_Children: + - {fileID: 4256443865166052869} + - {fileID: 7121337215618893364} + - {fileID: 978645317646675521} + m_Father: {fileID: 1240445628202320349} + m_RootOrder: 13 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} + m_AnchorMin: {x: 0, y: 0} + m_AnchorMax: {x: 0, y: 0} + m_AnchoredPosition: {x: 0, y: 0} + m_SizeDelta: {x: 1080, y: 430} + m_Pivot: {x: 0.5, y: 0.5} +--- !u!1 &237551955684365337 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 6316302514725709722} + - component: {fileID: 6347552251207035619} + - component: {fileID: 5859170891100439653} + m_Layer: 5 + m_Name: Text + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!224 &6316302514725709722 +RectTransform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 237551955684365337} + m_LocalRotation: {x: -0, y: -0, z: -0, w: 1} + m_LocalPosition: {x: 0, y: 0, z: 0} + m_LocalScale: {x: 1, y: 1, z: 1} + m_ConstrainProportionsScale: 0 + m_Children: [] + m_Father: {fileID: 5877652753891351603} + m_RootOrder: 0 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} + m_AnchorMin: {x: 0, y: 0} + m_AnchorMax: {x: 1, y: 1} + m_AnchoredPosition: {x: 0, y: 0} + m_SizeDelta: {x: 0, y: 0} + m_Pivot: {x: 0.5, y: 0.5} +--- !u!222 &6347552251207035619 +CanvasRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 237551955684365337} + m_CullTransparentMesh: 1 +--- !u!114 &5859170891100439653 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 237551955684365337} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 5f7201a12d95ffc409449d95f23cf332, type: 3} + m_Name: + m_EditorClassIdentifier: + m_Material: {fileID: 0} + m_Color: {r: 0.19607843, g: 0.19607843, b: 0.19607843, a: 1} + m_RaycastTarget: 1 + m_RaycastPadding: {x: 0, y: 0, z: 0, w: 0} + m_Maskable: 1 + m_OnCullStateChanged: + m_PersistentCalls: + m_Calls: [] + m_FontData: + m_Font: {fileID: 10102, guid: 0000000000000000e000000000000000, type: 0} + m_FontSize: 48 + m_FontStyle: 0 + m_BestFit: 0 + m_MinSize: 4 + m_MaxSize: 48 + m_Alignment: 4 + m_AlignByGeometry: 0 + m_RichText: 1 + m_HorizontalOverflow: 0 + m_VerticalOverflow: 0 + m_LineSpacing: 1 + m_Text: GetAdjustInfo +--- !u!1 &579959108112326976 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 4562240983544754487} + - component: {fileID: 6404975722162745990} + - component: {fileID: 5142929905796999701} + m_Layer: 5 + m_Name: Text + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!224 &4562240983544754487 +RectTransform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 579959108112326976} + m_LocalRotation: {x: -0, y: -0, z: -0, w: 1} + m_LocalPosition: {x: 0, y: 0, z: 0} + m_LocalScale: {x: 1, y: 1, z: 1} + m_ConstrainProportionsScale: 0 + m_Children: [] + m_Father: {fileID: 7309820859639243390} + m_RootOrder: 0 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} + m_AnchorMin: {x: 0, y: 0} + m_AnchorMax: {x: 1, y: 1} + m_AnchoredPosition: {x: 0, y: 0} + m_SizeDelta: {x: 0, y: 0} + m_Pivot: {x: 0.5, y: 0.5} +--- !u!222 &6404975722162745990 +CanvasRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 579959108112326976} + m_CullTransparentMesh: 1 +--- !u!114 &5142929905796999701 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 579959108112326976} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 5f7201a12d95ffc409449d95f23cf332, type: 3} + m_Name: + m_EditorClassIdentifier: + m_Material: {fileID: 0} + m_Color: {r: 0.19607843, g: 0.19607843, b: 0.19607843, a: 1} + m_RaycastTarget: 1 + m_RaycastPadding: {x: 0, y: 0, z: 0, w: 0} + m_Maskable: 1 + m_OnCullStateChanged: + m_PersistentCalls: + m_Calls: [] + m_FontData: + m_Font: {fileID: 10102, guid: 0000000000000000e000000000000000, type: 0} + m_FontSize: 48 + m_FontStyle: 0 + m_BestFit: 0 + m_MinSize: 4 + m_MaxSize: 48 + m_Alignment: 4 + m_AlignByGeometry: 0 + m_RichText: 1 + m_HorizontalOverflow: 0 + m_VerticalOverflow: 0 + m_LineSpacing: 1 + m_Text: Share +--- !u!1 &672530396032114785 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 2401205720692808534} + - component: {fileID: 6739383664983973061} + - component: {fileID: 4308330113861644845} + - component: {fileID: 2231760192442658748} + m_Layer: 5 + m_Name: BVButton + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!224 &2401205720692808534 +RectTransform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 672530396032114785} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: 0, y: 0, z: 0} + m_LocalScale: {x: 1, y: 1, z: 1} + m_ConstrainProportionsScale: 0 + m_Children: + - {fileID: 7424365926007618859} + m_Father: {fileID: 1240445629039028095} + m_RootOrder: 4 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} + m_AnchorMin: {x: 0.5, y: 0.5} + m_AnchorMax: {x: 0.5, y: 0.5} + m_AnchoredPosition: {x: -469, y: 192.00006} + m_SizeDelta: {x: 400, y: 120} + m_Pivot: {x: 0, y: 0.5} +--- !u!222 &6739383664983973061 +CanvasRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 672530396032114785} + m_CullTransparentMesh: 1 +--- !u!114 &4308330113861644845 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 672530396032114785} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: fe87c0e1cc204ed48ad3b37840f39efc, type: 3} + m_Name: + m_EditorClassIdentifier: + m_Material: {fileID: 0} + m_Color: {r: 1, g: 1, b: 1, a: 1} + m_RaycastTarget: 1 + m_RaycastPadding: {x: 0, y: 0, z: 0, w: 0} + m_Maskable: 1 + m_OnCullStateChanged: + m_PersistentCalls: + m_Calls: [] + m_Sprite: {fileID: 10905, guid: 0000000000000000f000000000000000, type: 0} + m_Type: 1 + m_PreserveAspect: 0 + m_FillCenter: 1 + m_FillMethod: 4 + m_FillAmount: 1 + m_FillClockwise: 1 + m_FillOrigin: 0 + m_UseSpriteMesh: 0 + m_PixelsPerUnitMultiplier: 1 +--- !u!114 &2231760192442658748 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 672530396032114785} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 4e29b1a8efbd4b44bb3f3716e73f07ff, type: 3} + m_Name: + m_EditorClassIdentifier: + m_Navigation: + m_Mode: 3 + m_WrapAround: 0 + m_SelectOnUp: {fileID: 0} + m_SelectOnDown: {fileID: 0} + m_SelectOnLeft: {fileID: 0} + m_SelectOnRight: {fileID: 0} + m_Transition: 1 + m_Colors: + m_NormalColor: {r: 1, g: 1, b: 1, a: 1} + m_HighlightedColor: {r: 0.9607843, g: 0.9607843, b: 0.9607843, a: 1} + m_PressedColor: {r: 0.78431374, g: 0.78431374, b: 0.78431374, a: 1} + m_SelectedColor: {r: 0.9607843, g: 0.9607843, b: 0.9607843, a: 1} + m_DisabledColor: {r: 0.78431374, g: 0.78431374, b: 0.78431374, a: 0.5019608} + m_ColorMultiplier: 1 + m_FadeDuration: 0.1 + m_SpriteState: + m_HighlightedSprite: {fileID: 0} + m_PressedSprite: {fileID: 0} + m_SelectedSprite: {fileID: 0} + m_DisabledSprite: {fileID: 0} + m_AnimationTriggers: + m_NormalTrigger: Normal + m_HighlightedTrigger: Highlighted + m_PressedTrigger: Pressed + m_SelectedTrigger: Selected + m_DisabledTrigger: Disabled + m_Interactable: 1 + m_TargetGraphic: {fileID: 4308330113861644845} + m_OnClick: + m_PersistentCalls: + m_Calls: + - m_Target: {fileID: 7348458583946661662} + m_TargetAssemblyTypeName: HCDemoScene, Assembly-CSharp + m_MethodName: Button_ShowBanner + m_Mode: 1 + m_Arguments: + m_ObjectArgument: {fileID: 0} + m_ObjectArgumentAssemblyTypeName: UnityEngine.Object, UnityEngine + m_IntArgument: 0 + m_FloatArgument: 0 + m_StringArgument: + m_BoolArgument: 0 + m_CallState: 2 +--- !u!1 &823802174323842103 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 978645317646675521} + - component: {fileID: 5269299600490662118} + - component: {fileID: 4440773079402493317} + - component: {fileID: 3354128325505446271} + m_Layer: 5 + m_Name: StopRecordButton + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!224 &978645317646675521 +RectTransform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 823802174323842103} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: 0, y: 0, z: 0} + m_LocalScale: {x: 1, y: 1, z: 1} + m_ConstrainProportionsScale: 0 + m_Children: + - {fileID: 5137608969474747836} + m_Father: {fileID: 4650141467237551916} + m_RootOrder: 2 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} + m_AnchorMin: {x: 0.5, y: 0.5} + m_AnchorMax: {x: 0.5, y: 0.5} + m_AnchoredPosition: {x: 1, y: 54} + m_SizeDelta: {x: 400, y: 120} + m_Pivot: {x: 0, y: 0.5} +--- !u!222 &5269299600490662118 +CanvasRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 823802174323842103} + m_CullTransparentMesh: 1 +--- !u!114 &4440773079402493317 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 823802174323842103} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: fe87c0e1cc204ed48ad3b37840f39efc, type: 3} + m_Name: + m_EditorClassIdentifier: + m_Material: {fileID: 0} + m_Color: {r: 1, g: 1, b: 1, a: 1} + m_RaycastTarget: 1 + m_RaycastPadding: {x: 0, y: 0, z: 0, w: 0} + m_Maskable: 1 + m_OnCullStateChanged: + m_PersistentCalls: + m_Calls: [] + m_Sprite: {fileID: 10905, guid: 0000000000000000f000000000000000, type: 0} + m_Type: 1 + m_PreserveAspect: 0 + m_FillCenter: 1 + m_FillMethod: 4 + m_FillAmount: 1 + m_FillClockwise: 1 + m_FillOrigin: 0 + m_UseSpriteMesh: 0 + m_PixelsPerUnitMultiplier: 1 +--- !u!114 &3354128325505446271 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 823802174323842103} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 4e29b1a8efbd4b44bb3f3716e73f07ff, type: 3} + m_Name: + m_EditorClassIdentifier: + m_Navigation: + m_Mode: 3 + m_WrapAround: 0 + m_SelectOnUp: {fileID: 0} + m_SelectOnDown: {fileID: 0} + m_SelectOnLeft: {fileID: 0} + m_SelectOnRight: {fileID: 0} + m_Transition: 1 + m_Colors: + m_NormalColor: {r: 1, g: 1, b: 1, a: 1} + m_HighlightedColor: {r: 0.9607843, g: 0.9607843, b: 0.9607843, a: 1} + m_PressedColor: {r: 0.78431374, g: 0.78431374, b: 0.78431374, a: 1} + m_SelectedColor: {r: 0.9607843, g: 0.9607843, b: 0.9607843, a: 1} + m_DisabledColor: {r: 0.78431374, g: 0.78431374, b: 0.78431374, a: 0.5019608} + m_ColorMultiplier: 1 + m_FadeDuration: 0.1 + m_SpriteState: + m_HighlightedSprite: {fileID: 0} + m_PressedSprite: {fileID: 0} + m_SelectedSprite: {fileID: 0} + m_DisabledSprite: {fileID: 0} + m_AnimationTriggers: + m_NormalTrigger: Normal + m_HighlightedTrigger: Highlighted + m_PressedTrigger: Pressed + m_SelectedTrigger: Selected + m_DisabledTrigger: Disabled + m_Interactable: 1 + m_TargetGraphic: {fileID: 4440773079402493317} + m_OnClick: + m_PersistentCalls: + m_Calls: + - m_Target: {fileID: 7348458583946661662} + m_TargetAssemblyTypeName: HCDemoScene, Assembly-CSharp + m_MethodName: ButtonEvent_StopRecord + m_Mode: 1 + m_Arguments: + m_ObjectArgument: {fileID: 0} + m_ObjectArgumentAssemblyTypeName: UnityEngine.Object, UnityEngine + m_IntArgument: 0 + m_FloatArgument: 0 + m_StringArgument: + m_BoolArgument: 0 + m_CallState: 2 +--- !u!1 &892507191629866670 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 8702948117595993398} + - component: {fileID: 9050816800391712230} + - component: {fileID: 8850322136819035262} + - component: {fileID: 162218740888059846} + m_Layer: 5 + m_Name: WebGLButton (2) + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!224 &8702948117595993398 +RectTransform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 892507191629866670} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: 0, y: 0, z: 0} + m_LocalScale: {x: 1, y: 1, z: 1} + m_ConstrainProportionsScale: 0 + m_Children: + - {fileID: 7087879535456899680} + m_Father: {fileID: 1240445628316549557} + m_RootOrder: 6 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} + m_AnchorMin: {x: 0.5, y: 0.5} + m_AnchorMax: {x: 0.5, y: 0.5} + m_AnchoredPosition: {x: -472, y: -181} + m_SizeDelta: {x: 400, y: 120} + m_Pivot: {x: 0, y: 0.5} +--- !u!222 &9050816800391712230 +CanvasRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 892507191629866670} + m_CullTransparentMesh: 1 +--- !u!114 &8850322136819035262 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 892507191629866670} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: fe87c0e1cc204ed48ad3b37840f39efc, type: 3} + m_Name: + m_EditorClassIdentifier: + m_Material: {fileID: 0} + m_Color: {r: 1, g: 1, b: 1, a: 1} + m_RaycastTarget: 1 + m_RaycastPadding: {x: 0, y: 0, z: 0, w: 0} + m_Maskable: 1 + m_OnCullStateChanged: + m_PersistentCalls: + m_Calls: [] + m_Sprite: {fileID: 10905, guid: 0000000000000000f000000000000000, type: 0} + m_Type: 1 + m_PreserveAspect: 0 + m_FillCenter: 1 + m_FillMethod: 4 + m_FillAmount: 1 + m_FillClockwise: 1 + m_FillOrigin: 0 + m_UseSpriteMesh: 0 + m_PixelsPerUnitMultiplier: 1 +--- !u!114 &162218740888059846 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 892507191629866670} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 4e29b1a8efbd4b44bb3f3716e73f07ff, type: 3} + m_Name: + m_EditorClassIdentifier: + m_Navigation: + m_Mode: 3 + m_WrapAround: 0 + m_SelectOnUp: {fileID: 0} + m_SelectOnDown: {fileID: 0} + m_SelectOnLeft: {fileID: 0} + m_SelectOnRight: {fileID: 0} + m_Transition: 1 + m_Colors: + m_NormalColor: {r: 1, g: 1, b: 1, a: 1} + m_HighlightedColor: {r: 0.9607843, g: 0.9607843, b: 0.9607843, a: 1} + m_PressedColor: {r: 0.78431374, g: 0.78431374, b: 0.78431374, a: 1} + m_SelectedColor: {r: 0.9607843, g: 0.9607843, b: 0.9607843, a: 1} + m_DisabledColor: {r: 0.78431374, g: 0.78431374, b: 0.78431374, a: 0.5019608} + m_ColorMultiplier: 1 + m_FadeDuration: 0.1 + m_SpriteState: + m_HighlightedSprite: {fileID: 0} + m_PressedSprite: {fileID: 0} + m_SelectedSprite: {fileID: 0} + m_DisabledSprite: {fileID: 0} + m_AnimationTriggers: + m_NormalTrigger: Normal + m_HighlightedTrigger: Highlighted + m_PressedTrigger: Pressed + m_SelectedTrigger: Selected + m_DisabledTrigger: Disabled + m_Interactable: 1 + m_TargetGraphic: {fileID: 8850322136819035262} + m_OnClick: + m_PersistentCalls: + m_Calls: + - m_Target: {fileID: 7348458583946661662} + m_TargetAssemblyTypeName: HCDemoScene, Assembly-CSharp + m_MethodName: ButtonWebGL3 + m_Mode: 1 + m_Arguments: + m_ObjectArgument: {fileID: 0} + m_ObjectArgumentAssemblyTypeName: UnityEngine.Object, UnityEngine + m_IntArgument: 0 + m_FloatArgument: 0 + m_StringArgument: + m_BoolArgument: 0 + m_CallState: 2 +--- !u!1 &1146426227015537853 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 3642661175399491718} + - component: {fileID: 6669807713923439575} + - component: {fileID: 5506839436533348185} + m_Layer: 5 + m_Name: Text + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!224 &3642661175399491718 +RectTransform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1146426227015537853} + m_LocalRotation: {x: -0, y: -0, z: -0, w: 1} + m_LocalPosition: {x: 0, y: 0, z: 0} + m_LocalScale: {x: 1, y: 1, z: 1} + m_ConstrainProportionsScale: 0 + m_Children: [] + m_Father: {fileID: 5524767040267571040} + m_RootOrder: 0 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} + m_AnchorMin: {x: 0, y: 0} + m_AnchorMax: {x: 1, y: 1} + m_AnchoredPosition: {x: 0, y: 0} + m_SizeDelta: {x: 0, y: 0} + m_Pivot: {x: 0.5, y: 0.5} +--- !u!222 &6669807713923439575 +CanvasRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1146426227015537853} + m_CullTransparentMesh: 1 +--- !u!114 &5506839436533348185 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1146426227015537853} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 5f7201a12d95ffc409449d95f23cf332, type: 3} + m_Name: + m_EditorClassIdentifier: + m_Material: {fileID: 0} + m_Color: {r: 0.19607843, g: 0.19607843, b: 0.19607843, a: 1} + m_RaycastTarget: 1 + m_RaycastPadding: {x: 0, y: 0, z: 0, w: 0} + m_Maskable: 1 + m_OnCullStateChanged: + m_PersistentCalls: + m_Calls: [] + m_FontData: + m_Font: {fileID: 10102, guid: 0000000000000000e000000000000000, type: 0} + m_FontSize: 48 + m_FontStyle: 0 + m_BestFit: 0 + m_MinSize: 4 + m_MaxSize: 48 + m_Alignment: 4 + m_AlignByGeometry: 0 + m_RichText: 1 + m_HorizontalOverflow: 0 + m_VerticalOverflow: 0 + m_LineSpacing: 1 + m_Text: Banner +--- !u!1 &1240445628065797722 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 1240445628065797723} + - component: {fileID: 1240445628065797701} + - component: {fileID: 1240445628065797700} + m_Layer: 5 + m_Name: Text + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!224 &1240445628065797723 +RectTransform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1240445628065797722} + m_LocalRotation: {x: -0, y: -0, z: -0, w: 1} + m_LocalPosition: {x: 0, y: 0, z: 0} + m_LocalScale: {x: 1, y: 1, z: 1} + m_ConstrainProportionsScale: 0 + m_Children: [] + m_Father: {fileID: 1240445628752246435} + m_RootOrder: 0 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} + m_AnchorMin: {x: 0, y: 0} + m_AnchorMax: {x: 1, y: 1} + m_AnchoredPosition: {x: 0, y: 0} + m_SizeDelta: {x: 0, y: 0} + m_Pivot: {x: 0.5, y: 0.5} +--- !u!222 &1240445628065797701 +CanvasRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1240445628065797722} + m_CullTransparentMesh: 1 +--- !u!114 &1240445628065797700 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1240445628065797722} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 5f7201a12d95ffc409449d95f23cf332, type: 3} + m_Name: + m_EditorClassIdentifier: + m_Material: {fileID: 0} + m_Color: {r: 0.19607843, g: 0.19607843, b: 0.19607843, a: 1} + m_RaycastTarget: 1 + m_RaycastPadding: {x: 0, y: 0, z: 0, w: 0} + m_Maskable: 1 + m_OnCullStateChanged: + m_PersistentCalls: + m_Calls: [] + m_FontData: + m_Font: {fileID: 10102, guid: 0000000000000000e000000000000000, type: 0} + m_FontSize: 48 + m_FontStyle: 0 + m_BestFit: 0 + m_MinSize: 4 + m_MaxSize: 48 + m_Alignment: 4 + m_AlignByGeometry: 0 + m_RichText: 1 + m_HorizontalOverflow: 0 + m_VerticalOverflow: 0 + m_LineSpacing: 1 + m_Text: Restore +--- !u!1 &1240445628077361973 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 1240445628077361974} + m_Layer: 5 + m_Name: Login + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!224 &1240445628077361974 +RectTransform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1240445628077361973} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: 0, y: 0, z: 0} + m_LocalScale: {x: 1, y: 1, z: 1} + m_ConstrainProportionsScale: 0 + m_Children: + - {fileID: 1240445628499041681} + - {fileID: 1240445629714686069} + - {fileID: 1240445629733809831} + - {fileID: 1240445628485939833} + - {fileID: 1240445628305562347} + m_Father: {fileID: 1240445628202320349} + m_RootOrder: 9 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} + m_AnchorMin: {x: 0, y: 0} + m_AnchorMax: {x: 0, y: 0} + m_AnchoredPosition: {x: 0, y: 0} + m_SizeDelta: {x: 1080, y: 400} + m_Pivot: {x: 0.5, y: 0.5} +--- !u!1 &1240445628159014727 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 1240445628159014720} + - component: {fileID: 1240445628159014722} + - component: {fileID: 1240445628159014721} + m_Layer: 5 + m_Name: Line + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!224 &1240445628159014720 +RectTransform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1240445628159014727} + m_LocalRotation: {x: -0, y: -0, z: -0, w: 1} + m_LocalPosition: {x: 0, y: 0, z: 0} + m_LocalScale: {x: 1, y: 1, z: 1} + m_ConstrainProportionsScale: 0 + m_Children: [] + m_Father: {fileID: 1240445628202320349} + m_RootOrder: 6 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} + m_AnchorMin: {x: 0, y: 0} + m_AnchorMax: {x: 0, y: 0} + m_AnchoredPosition: {x: 0, y: 0} + m_SizeDelta: {x: 1080, y: 12} + m_Pivot: {x: 0.5, y: 0.5} +--- !u!222 &1240445628159014722 +CanvasRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1240445628159014727} + m_CullTransparentMesh: 1 +--- !u!114 &1240445628159014721 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1240445628159014727} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: fe87c0e1cc204ed48ad3b37840f39efc, type: 3} + m_Name: + m_EditorClassIdentifier: + m_Material: {fileID: 0} + m_Color: {r: 0.3759642, g: 0.4339623, b: 0.34184766, a: 1} + m_RaycastTarget: 1 + m_RaycastPadding: {x: 0, y: 0, z: 0, w: 0} + m_Maskable: 1 + m_OnCullStateChanged: + m_PersistentCalls: + m_Calls: [] + m_Sprite: {fileID: 0} + m_Type: 0 + m_PreserveAspect: 0 + m_FillCenter: 1 + m_FillMethod: 4 + m_FillAmount: 1 + m_FillClockwise: 1 + m_FillOrigin: 0 + m_UseSpriteMesh: 0 + m_PixelsPerUnitMultiplier: 1 +--- !u!1 &1240445628202320348 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 1240445628202320349} + - component: {fileID: 1240445628202320350} + m_Layer: 5 + m_Name: Content + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!224 &1240445628202320349 +RectTransform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1240445628202320348} + m_LocalRotation: {x: -0, y: -0, z: -0, w: 1} + m_LocalPosition: {x: 0, y: 0, z: 0} + m_LocalScale: {x: 1, y: 1, z: 1} + m_ConstrainProportionsScale: 0 + m_Children: + - {fileID: 1240445628530372788} + - {fileID: 1240445629789692595} + - {fileID: 1240445628569325650} + - {fileID: 1240445629039028095} + - {fileID: 1240445629534457790} + - {fileID: 1240445629906932932} + - {fileID: 1240445628159014720} + - {fileID: 1240445628316549557} + - {fileID: 1240445629679888802} + - {fileID: 1240445628077361974} + - {fileID: 8141970662575567352} + - {fileID: 591582440344992329} + - {fileID: 73467314029594367} + - {fileID: 4650141467237551916} + m_Father: {fileID: 1240445628703286520} + m_RootOrder: 0 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} + m_AnchorMin: {x: 0, y: 1} + m_AnchorMax: {x: 1, y: 1} + m_AnchoredPosition: {x: 0, y: 0.00015747779} + m_SizeDelta: {x: 0, y: 3850} + m_Pivot: {x: 0, y: 1} +--- !u!114 &1240445628202320350 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1240445628202320348} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 59f8146938fff824cb5fd77236b75775, type: 3} + m_Name: + m_EditorClassIdentifier: + m_Padding: + m_Left: 0 + m_Right: 0 + m_Top: 0 + m_Bottom: 0 + m_ChildAlignment: 0 + m_Spacing: 0 + m_ChildForceExpandWidth: 1 + m_ChildForceExpandHeight: 1 + m_ChildControlWidth: 0 + m_ChildControlHeight: 0 + m_ChildScaleWidth: 0 + m_ChildScaleHeight: 0 + m_ReverseArrangement: 0 +--- !u!1 &1240445628305562346 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 1240445628305562347} + - component: {fileID: 1240445628305562262} + - component: {fileID: 1240445628305562261} + - component: {fileID: 1240445628305562260} + m_Layer: 5 + m_Name: NoLoginScreenButton + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!224 &1240445628305562347 +RectTransform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1240445628305562346} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: 0, y: 0, z: 0} + m_LocalScale: {x: 1, y: 1, z: 1} + m_ConstrainProportionsScale: 0 + m_Children: + - {fileID: 1240445629726163032} + m_Father: {fileID: 1240445628077361974} + m_RootOrder: 4 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} + m_AnchorMin: {x: 0.5, y: 0.5} + m_AnchorMax: {x: 0.5, y: 0.5} + m_AnchoredPosition: {x: -2, y: -79.00006} + m_SizeDelta: {x: 400, y: 120} + m_Pivot: {x: 0, y: 0.5} +--- !u!222 &1240445628305562262 +CanvasRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1240445628305562346} + m_CullTransparentMesh: 1 +--- !u!114 &1240445628305562261 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1240445628305562346} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: fe87c0e1cc204ed48ad3b37840f39efc, type: 3} + m_Name: + m_EditorClassIdentifier: + m_Material: {fileID: 0} + m_Color: {r: 1, g: 1, b: 1, a: 1} + m_RaycastTarget: 1 + m_RaycastPadding: {x: 0, y: 0, z: 0, w: 0} + m_Maskable: 1 + m_OnCullStateChanged: + m_PersistentCalls: + m_Calls: [] + m_Sprite: {fileID: 10905, guid: 0000000000000000f000000000000000, type: 0} + m_Type: 1 + m_PreserveAspect: 0 + m_FillCenter: 1 + m_FillMethod: 4 + m_FillAmount: 1 + m_FillClockwise: 1 + m_FillOrigin: 0 + m_UseSpriteMesh: 0 + m_PixelsPerUnitMultiplier: 1 +--- !u!114 &1240445628305562260 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1240445628305562346} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 4e29b1a8efbd4b44bb3f3716e73f07ff, type: 3} + m_Name: + m_EditorClassIdentifier: + m_Navigation: + m_Mode: 3 + m_WrapAround: 0 + m_SelectOnUp: {fileID: 0} + m_SelectOnDown: {fileID: 0} + m_SelectOnLeft: {fileID: 0} + m_SelectOnRight: {fileID: 0} + m_Transition: 1 + m_Colors: + m_NormalColor: {r: 1, g: 1, b: 1, a: 1} + m_HighlightedColor: {r: 0.9607843, g: 0.9607843, b: 0.9607843, a: 1} + m_PressedColor: {r: 0.78431374, g: 0.78431374, b: 0.78431374, a: 1} + m_SelectedColor: {r: 0.9607843, g: 0.9607843, b: 0.9607843, a: 1} + m_DisabledColor: {r: 0.78431374, g: 0.78431374, b: 0.78431374, a: 0.5019608} + m_ColorMultiplier: 1 + m_FadeDuration: 0.1 + m_SpriteState: + m_HighlightedSprite: {fileID: 0} + m_PressedSprite: {fileID: 0} + m_SelectedSprite: {fileID: 0} + m_DisabledSprite: {fileID: 0} + m_AnimationTriggers: + m_NormalTrigger: Normal + m_HighlightedTrigger: Highlighted + m_PressedTrigger: Pressed + m_SelectedTrigger: Selected + m_DisabledTrigger: Disabled + m_Interactable: 1 + m_TargetGraphic: {fileID: 1240445628305562261} + m_OnClick: + m_PersistentCalls: + m_Calls: + - m_Target: {fileID: 7348458583946661662} + m_TargetAssemblyTypeName: HCDemoScene, Assembly-CSharp + m_MethodName: ButtonEvent_Directlogin + m_Mode: 1 + m_Arguments: + m_ObjectArgument: {fileID: 0} + m_ObjectArgumentAssemblyTypeName: UnityEngine.Object, UnityEngine + m_IntArgument: 0 + m_FloatArgument: 0 + m_StringArgument: + m_BoolArgument: 0 + m_CallState: 2 +--- !u!1 &1240445628316549556 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 1240445628316549557} + m_Layer: 5 + m_Name: IAP + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!224 &1240445628316549557 +RectTransform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1240445628316549556} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: 0, y: 0, z: 0} + m_LocalScale: {x: 1, y: 1, z: 1} + m_ConstrainProportionsScale: 0 + m_Children: + - {fileID: 1240445629731455436} + - {fileID: 1240445629520549018} + - {fileID: 1240445629125505494} + - {fileID: 1240445628752246435} + - {fileID: 167536599284978532} + - {fileID: 6811790315065618171} + - {fileID: 8702948117595993398} + m_Father: {fileID: 1240445628202320349} + m_RootOrder: 7 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} + m_AnchorMin: {x: 0, y: 1} + m_AnchorMax: {x: 0, y: 1} + m_AnchoredPosition: {x: 540, y: -2411} + m_SizeDelta: {x: 1080, y: 630} + m_Pivot: {x: 0.5, y: 0.5} +--- !u!1 &1240445628478472523 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 1240445628478472564} + - component: {fileID: 1240445628478472567} + - component: {fileID: 1240445628478472566} + - component: {fileID: 1240445628478472565} + m_Layer: 5 + m_Name: Event01Button + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!224 &1240445628478472564 +RectTransform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1240445628478472523} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: 0, y: 0, z: 0} + m_LocalScale: {x: 1, y: 1, z: 1} + m_ConstrainProportionsScale: 0 + m_Children: + - {fileID: 1240445629146722335} + m_Father: {fileID: 1240445629906932932} + m_RootOrder: 1 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} + m_AnchorMin: {x: 0.5, y: 0.5} + m_AnchorMax: {x: 0.5, y: 0.5} + m_AnchoredPosition: {x: -473, y: 58} + m_SizeDelta: {x: 400, y: 120} + m_Pivot: {x: 0, y: 0.5} +--- !u!222 &1240445628478472567 +CanvasRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1240445628478472523} + m_CullTransparentMesh: 1 +--- !u!114 &1240445628478472566 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1240445628478472523} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: fe87c0e1cc204ed48ad3b37840f39efc, type: 3} + m_Name: + m_EditorClassIdentifier: + m_Material: {fileID: 0} + m_Color: {r: 1, g: 1, b: 1, a: 1} + m_RaycastTarget: 1 + m_RaycastPadding: {x: 0, y: 0, z: 0, w: 0} + m_Maskable: 1 + m_OnCullStateChanged: + m_PersistentCalls: + m_Calls: [] + m_Sprite: {fileID: 10905, guid: 0000000000000000f000000000000000, type: 0} + m_Type: 1 + m_PreserveAspect: 0 + m_FillCenter: 1 + m_FillMethod: 4 + m_FillAmount: 1 + m_FillClockwise: 1 + m_FillOrigin: 0 + m_UseSpriteMesh: 0 + m_PixelsPerUnitMultiplier: 1 +--- !u!114 &1240445628478472565 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1240445628478472523} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 4e29b1a8efbd4b44bb3f3716e73f07ff, type: 3} + m_Name: + m_EditorClassIdentifier: + m_Navigation: + m_Mode: 3 + m_WrapAround: 0 + m_SelectOnUp: {fileID: 0} + m_SelectOnDown: {fileID: 0} + m_SelectOnLeft: {fileID: 0} + m_SelectOnRight: {fileID: 0} + m_Transition: 1 + m_Colors: + m_NormalColor: {r: 1, g: 1, b: 1, a: 1} + m_HighlightedColor: {r: 0.9607843, g: 0.9607843, b: 0.9607843, a: 1} + m_PressedColor: {r: 0.78431374, g: 0.78431374, b: 0.78431374, a: 1} + m_SelectedColor: {r: 0.9607843, g: 0.9607843, b: 0.9607843, a: 1} + m_DisabledColor: {r: 0.78431374, g: 0.78431374, b: 0.78431374, a: 0.5019608} + m_ColorMultiplier: 1 + m_FadeDuration: 0.1 + m_SpriteState: + m_HighlightedSprite: {fileID: 0} + m_PressedSprite: {fileID: 0} + m_SelectedSprite: {fileID: 0} + m_DisabledSprite: {fileID: 0} + m_AnimationTriggers: + m_NormalTrigger: Normal + m_HighlightedTrigger: Highlighted + m_PressedTrigger: Pressed + m_SelectedTrigger: Selected + m_DisabledTrigger: Disabled + m_Interactable: 1 + m_TargetGraphic: {fileID: 1240445628478472566} + m_OnClick: + m_PersistentCalls: + m_Calls: + - m_Target: {fileID: 7348458583946661662} + m_TargetAssemblyTypeName: HCDemoScene, Assembly-CSharp + m_MethodName: Button_Event01 + m_Mode: 1 + m_Arguments: + m_ObjectArgument: {fileID: 0} + m_ObjectArgumentAssemblyTypeName: UnityEngine.Object, UnityEngine + m_IntArgument: 0 + m_FloatArgument: 0 + m_StringArgument: + m_BoolArgument: 0 + m_CallState: 2 +--- !u!1 &1240445628485939832 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 1240445628485939833} + - component: {fileID: 1240445628485939812} + - component: {fileID: 1240445628485939835} + - component: {fileID: 1240445628485939834} + m_Layer: 5 + m_Name: ShowLoginScreenButton + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!224 &1240445628485939833 +RectTransform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1240445628485939832} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: 0, y: 0, z: 0} + m_LocalScale: {x: 1, y: 1, z: 1} + m_ConstrainProportionsScale: 0 + m_Children: + - {fileID: 1240445630143173265} + m_Father: {fileID: 1240445628077361974} + m_RootOrder: 3 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} + m_AnchorMin: {x: 0.5, y: 0.5} + m_AnchorMax: {x: 0.5, y: 0.5} + m_AnchoredPosition: {x: -477, y: -77.13736} + m_SizeDelta: {x: 400, y: 120} + m_Pivot: {x: 0, y: 0.5} +--- !u!222 &1240445628485939812 +CanvasRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1240445628485939832} + m_CullTransparentMesh: 1 +--- !u!114 &1240445628485939835 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1240445628485939832} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: fe87c0e1cc204ed48ad3b37840f39efc, type: 3} + m_Name: + m_EditorClassIdentifier: + m_Material: {fileID: 0} + m_Color: {r: 1, g: 1, b: 1, a: 1} + m_RaycastTarget: 1 + m_RaycastPadding: {x: 0, y: 0, z: 0, w: 0} + m_Maskable: 1 + m_OnCullStateChanged: + m_PersistentCalls: + m_Calls: [] + m_Sprite: {fileID: 10905, guid: 0000000000000000f000000000000000, type: 0} + m_Type: 1 + m_PreserveAspect: 0 + m_FillCenter: 1 + m_FillMethod: 4 + m_FillAmount: 1 + m_FillClockwise: 1 + m_FillOrigin: 0 + m_UseSpriteMesh: 0 + m_PixelsPerUnitMultiplier: 1 +--- !u!114 &1240445628485939834 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1240445628485939832} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 4e29b1a8efbd4b44bb3f3716e73f07ff, type: 3} + m_Name: + m_EditorClassIdentifier: + m_Navigation: + m_Mode: 3 + m_WrapAround: 0 + m_SelectOnUp: {fileID: 0} + m_SelectOnDown: {fileID: 0} + m_SelectOnLeft: {fileID: 0} + m_SelectOnRight: {fileID: 0} + m_Transition: 1 + m_Colors: + m_NormalColor: {r: 1, g: 1, b: 1, a: 1} + m_HighlightedColor: {r: 0.9607843, g: 0.9607843, b: 0.9607843, a: 1} + m_PressedColor: {r: 0.78431374, g: 0.78431374, b: 0.78431374, a: 1} + m_SelectedColor: {r: 0.9607843, g: 0.9607843, b: 0.9607843, a: 1} + m_DisabledColor: {r: 0.78431374, g: 0.78431374, b: 0.78431374, a: 0.5019608} + m_ColorMultiplier: 1 + m_FadeDuration: 0.1 + m_SpriteState: + m_HighlightedSprite: {fileID: 0} + m_PressedSprite: {fileID: 0} + m_SelectedSprite: {fileID: 0} + m_DisabledSprite: {fileID: 0} + m_AnimationTriggers: + m_NormalTrigger: Normal + m_HighlightedTrigger: Highlighted + m_PressedTrigger: Pressed + m_SelectedTrigger: Selected + m_DisabledTrigger: Disabled + m_Interactable: 1 + m_TargetGraphic: {fileID: 1240445628485939835} + m_OnClick: + m_PersistentCalls: + m_Calls: + - m_Target: {fileID: 7348458583946661662} + m_TargetAssemblyTypeName: HCDemoScene, Assembly-CSharp + m_MethodName: ButtonEvent_ShowLoginScreen + m_Mode: 1 + m_Arguments: + m_ObjectArgument: {fileID: 0} + m_ObjectArgumentAssemblyTypeName: UnityEngine.Object, UnityEngine + m_IntArgument: 0 + m_FloatArgument: 0 + m_StringArgument: + m_BoolArgument: 0 + m_CallState: 2 +--- !u!1 &1240445628499041680 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 1240445628499041681} + - component: {fileID: 1240445628499041683} + - component: {fileID: 1240445628499041682} + m_Layer: 5 + m_Name: TitleText + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!224 &1240445628499041681 +RectTransform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1240445628499041680} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: 0, y: 0, z: 0} + m_LocalScale: {x: 1, y: 1, z: 1} + m_ConstrainProportionsScale: 0 + m_Children: [] + m_Father: {fileID: 1240445628077361974} + m_RootOrder: 0 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} + m_AnchorMin: {x: 0.5, y: 0.5} + m_AnchorMax: {x: 0.5, y: 0.5} + m_AnchoredPosition: {x: -472, y: 157} + m_SizeDelta: {x: 238.4239, y: 54.8398} + m_Pivot: {x: 0, y: 0.5} +--- !u!222 &1240445628499041683 +CanvasRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1240445628499041680} + m_CullTransparentMesh: 1 +--- !u!114 &1240445628499041682 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1240445628499041680} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 5f7201a12d95ffc409449d95f23cf332, type: 3} + m_Name: + m_EditorClassIdentifier: + m_Material: {fileID: 0} + m_Color: {r: 0.19607843, g: 0.19607843, b: 0.19607843, a: 1} + m_RaycastTarget: 1 + m_RaycastPadding: {x: 0, y: 0, z: 0, w: 0} + m_Maskable: 1 + m_OnCullStateChanged: + m_PersistentCalls: + m_Calls: [] + m_FontData: + m_Font: {fileID: 10102, guid: 0000000000000000e000000000000000, type: 0} + m_FontSize: 48 + m_FontStyle: 1 + m_BestFit: 0 + m_MinSize: 3 + m_MaxSize: 48 + m_Alignment: 0 + m_AlignByGeometry: 0 + m_RichText: 1 + m_HorizontalOverflow: 0 + m_VerticalOverflow: 0 + m_LineSpacing: 1 + m_Text: Login +--- !u!1 &1240445628530372747 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 1240445628530372788} + - component: {fileID: 1240445628530372790} + - component: {fileID: 1240445628530372789} + m_Layer: 5 + m_Name: TitleText + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!224 &1240445628530372788 +RectTransform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1240445628530372747} + m_LocalRotation: {x: -0, y: -0, z: -0, w: 1} + m_LocalPosition: {x: 0, y: 0, z: 0} + m_LocalScale: {x: 1, y: 1, z: 1} + m_ConstrainProportionsScale: 0 + m_Children: [] + m_Father: {fileID: 1240445628202320349} + m_RootOrder: 0 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} + m_AnchorMin: {x: 0, y: 0} + m_AnchorMax: {x: 0, y: 0} + m_AnchoredPosition: {x: 0, y: 0} + m_SizeDelta: {x: 1080, y: 160} + m_Pivot: {x: 0, y: 0.5} +--- !u!222 &1240445628530372790 +CanvasRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1240445628530372747} + m_CullTransparentMesh: 1 +--- !u!114 &1240445628530372789 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1240445628530372747} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 5f7201a12d95ffc409449d95f23cf332, type: 3} + m_Name: + m_EditorClassIdentifier: + m_Material: {fileID: 0} + m_Color: {r: 0.19607843, g: 0.19607843, b: 0.19607843, a: 1} + m_RaycastTarget: 1 + m_RaycastPadding: {x: 0, y: 0, z: 0, w: 0} + m_Maskable: 1 + m_OnCullStateChanged: + m_PersistentCalls: + m_Calls: [] + m_FontData: + m_Font: {fileID: 10102, guid: 0000000000000000e000000000000000, type: 0} + m_FontSize: 68 + m_FontStyle: 1 + m_BestFit: 0 + m_MinSize: 0 + m_MaxSize: 120 + m_Alignment: 1 + m_AlignByGeometry: 0 + m_RichText: 1 + m_HorizontalOverflow: 0 + m_VerticalOverflow: 0 + m_LineSpacing: 1 + m_Text: ' + + HCSDK Demo' +--- !u!1 &1240445628569325649 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 1240445628569325650} + - component: {fileID: 1240445628569325660} + - component: {fileID: 1240445628569325651} + m_Layer: 5 + m_Name: Line + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!224 &1240445628569325650 +RectTransform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1240445628569325649} + m_LocalRotation: {x: -0, y: -0, z: -0, w: 1} + m_LocalPosition: {x: 0, y: 0, z: 0} + m_LocalScale: {x: 1, y: 1, z: 1} + m_ConstrainProportionsScale: 0 + m_Children: [] + m_Father: {fileID: 1240445628202320349} + m_RootOrder: 2 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} + m_AnchorMin: {x: 0, y: 0} + m_AnchorMax: {x: 0, y: 0} + m_AnchoredPosition: {x: 0, y: 0} + m_SizeDelta: {x: 1080, y: 12} + m_Pivot: {x: 0.5, y: 0.5} +--- !u!222 &1240445628569325660 +CanvasRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1240445628569325649} + m_CullTransparentMesh: 1 +--- !u!114 &1240445628569325651 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1240445628569325649} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: fe87c0e1cc204ed48ad3b37840f39efc, type: 3} + m_Name: + m_EditorClassIdentifier: + m_Material: {fileID: 0} + m_Color: {r: 0.3759642, g: 0.4339623, b: 0.34184766, a: 1} + m_RaycastTarget: 1 + m_RaycastPadding: {x: 0, y: 0, z: 0, w: 0} + m_Maskable: 1 + m_OnCullStateChanged: + m_PersistentCalls: + m_Calls: [] + m_Sprite: {fileID: 0} + m_Type: 0 + m_PreserveAspect: 0 + m_FillCenter: 1 + m_FillMethod: 4 + m_FillAmount: 1 + m_FillClockwise: 1 + m_FillOrigin: 0 + m_UseSpriteMesh: 0 + m_PixelsPerUnitMultiplier: 1 +--- !u!1 &1240445628703286527 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 1240445628703286520} + - component: {fileID: 1240445628703286523} + - component: {fileID: 1240445628703286522} + - component: {fileID: 1240445628703286521} + m_Layer: 5 + m_Name: Viewport + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!224 &1240445628703286520 +RectTransform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1240445628703286527} + m_LocalRotation: {x: -0, y: -0, z: -0, w: 1} + m_LocalPosition: {x: 0, y: 0, z: 0} + m_LocalScale: {x: 1, y: 1, z: 1} + m_ConstrainProportionsScale: 0 + m_Children: + - {fileID: 1240445628202320349} + m_Father: {fileID: 1240445629073021843} + m_RootOrder: 0 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} + m_AnchorMin: {x: 0, y: 0} + m_AnchorMax: {x: 1, y: 1} + m_AnchoredPosition: {x: 0, y: 0} + m_SizeDelta: {x: 0, y: 0} + m_Pivot: {x: 0, y: 1} +--- !u!222 &1240445628703286523 +CanvasRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1240445628703286527} + m_CullTransparentMesh: 1 +--- !u!114 &1240445628703286522 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1240445628703286527} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: fe87c0e1cc204ed48ad3b37840f39efc, type: 3} + m_Name: + m_EditorClassIdentifier: + m_Material: {fileID: 0} + m_Color: {r: 1, g: 1, b: 1, a: 1} + m_RaycastTarget: 1 + m_RaycastPadding: {x: 0, y: 0, z: 0, w: 0} + m_Maskable: 1 + m_OnCullStateChanged: + m_PersistentCalls: + m_Calls: [] + m_Sprite: {fileID: 10917, guid: 0000000000000000f000000000000000, type: 0} + m_Type: 1 + m_PreserveAspect: 0 + m_FillCenter: 1 + m_FillMethod: 4 + m_FillAmount: 1 + m_FillClockwise: 1 + m_FillOrigin: 0 + m_UseSpriteMesh: 0 + m_PixelsPerUnitMultiplier: 1 +--- !u!114 &1240445628703286521 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1240445628703286527} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 31a19414c41e5ae4aae2af33fee712f6, type: 3} + m_Name: + m_EditorClassIdentifier: + m_ShowMaskGraphic: 0 +--- !u!1 &1240445628744111307 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 1240445628744111348} + - component: {fileID: 1240445628744111350} + - component: {fileID: 1240445628744111349} + m_Layer: 5 + m_Name: TitleText + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!224 &1240445628744111348 +RectTransform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1240445628744111307} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: 0, y: 0, z: 0} + m_LocalScale: {x: 1, y: 1, z: 1} + m_ConstrainProportionsScale: 0 + m_Children: [] + m_Father: {fileID: 1240445629789692595} + m_RootOrder: 0 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} + m_AnchorMin: {x: 0.5, y: 0.5} + m_AnchorMax: {x: 0.5, y: 0.5} + m_AnchoredPosition: {x: -464, y: 85} + m_SizeDelta: {x: 238.4239, y: 54.8398} + m_Pivot: {x: 0, y: 0.5} +--- !u!222 &1240445628744111350 +CanvasRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1240445628744111307} + m_CullTransparentMesh: 1 +--- !u!114 &1240445628744111349 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1240445628744111307} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 5f7201a12d95ffc409449d95f23cf332, type: 3} + m_Name: + m_EditorClassIdentifier: + m_Material: {fileID: 0} + m_Color: {r: 0.19607843, g: 0.19607843, b: 0.19607843, a: 1} + m_RaycastTarget: 1 + m_RaycastPadding: {x: 0, y: 0, z: 0, w: 0} + m_Maskable: 1 + m_OnCullStateChanged: + m_PersistentCalls: + m_Calls: [] + m_FontData: + m_Font: {fileID: 10102, guid: 0000000000000000e000000000000000, type: 0} + m_FontSize: 48 + m_FontStyle: 1 + m_BestFit: 0 + m_MinSize: 3 + m_MaxSize: 48 + m_Alignment: 0 + m_AlignByGeometry: 0 + m_RichText: 1 + m_HorizontalOverflow: 0 + m_VerticalOverflow: 0 + m_LineSpacing: 1 + m_Text: SDK Init +--- !u!1 &1240445628752246434 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 1240445628752246435} + - component: {fileID: 1240445628752246446} + - component: {fileID: 1240445628752246445} + - component: {fileID: 1240445628752246444} + m_Layer: 5 + m_Name: RestoreButton + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!224 &1240445628752246435 +RectTransform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1240445628752246434} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: 0, y: 0, z: 0} + m_LocalScale: {x: 1, y: 1, z: 1} + m_ConstrainProportionsScale: 0 + m_Children: + - {fileID: 1240445628065797723} + m_Father: {fileID: 1240445628316549557} + m_RootOrder: 3 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} + m_AnchorMin: {x: 0.5, y: 0.5} + m_AnchorMax: {x: 0.5, y: 0.5} + m_AnchoredPosition: {x: -468, y: -86} + m_SizeDelta: {x: 400, y: 120} + m_Pivot: {x: 0, y: 0.5} +--- !u!222 &1240445628752246446 +CanvasRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1240445628752246434} + m_CullTransparentMesh: 1 +--- !u!114 &1240445628752246445 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1240445628752246434} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: fe87c0e1cc204ed48ad3b37840f39efc, type: 3} + m_Name: + m_EditorClassIdentifier: + m_Material: {fileID: 0} + m_Color: {r: 1, g: 1, b: 1, a: 1} + m_RaycastTarget: 1 + m_RaycastPadding: {x: 0, y: 0, z: 0, w: 0} + m_Maskable: 1 + m_OnCullStateChanged: + m_PersistentCalls: + m_Calls: [] + m_Sprite: {fileID: 10905, guid: 0000000000000000f000000000000000, type: 0} + m_Type: 1 + m_PreserveAspect: 0 + m_FillCenter: 1 + m_FillMethod: 4 + m_FillAmount: 1 + m_FillClockwise: 1 + m_FillOrigin: 0 + m_UseSpriteMesh: 0 + m_PixelsPerUnitMultiplier: 1 +--- !u!114 &1240445628752246444 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1240445628752246434} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 4e29b1a8efbd4b44bb3f3716e73f07ff, type: 3} + m_Name: + m_EditorClassIdentifier: + m_Navigation: + m_Mode: 3 + m_WrapAround: 0 + m_SelectOnUp: {fileID: 0} + m_SelectOnDown: {fileID: 0} + m_SelectOnLeft: {fileID: 0} + m_SelectOnRight: {fileID: 0} + m_Transition: 1 + m_Colors: + m_NormalColor: {r: 1, g: 1, b: 1, a: 1} + m_HighlightedColor: {r: 0.9607843, g: 0.9607843, b: 0.9607843, a: 1} + m_PressedColor: {r: 0.78431374, g: 0.78431374, b: 0.78431374, a: 1} + m_SelectedColor: {r: 0.9607843, g: 0.9607843, b: 0.9607843, a: 1} + m_DisabledColor: {r: 0.78431374, g: 0.78431374, b: 0.78431374, a: 0.5019608} + m_ColorMultiplier: 1 + m_FadeDuration: 0.1 + m_SpriteState: + m_HighlightedSprite: {fileID: 0} + m_PressedSprite: {fileID: 0} + m_SelectedSprite: {fileID: 0} + m_DisabledSprite: {fileID: 0} + m_AnimationTriggers: + m_NormalTrigger: Normal + m_HighlightedTrigger: Highlighted + m_PressedTrigger: Pressed + m_SelectedTrigger: Selected + m_DisabledTrigger: Disabled + m_Interactable: 1 + m_TargetGraphic: {fileID: 1240445628752246445} + m_OnClick: + m_PersistentCalls: + m_Calls: + - m_Target: {fileID: 7348458583946661662} + m_TargetAssemblyTypeName: HCDemoScene, Assembly-CSharp + m_MethodName: ButtonRestore + m_Mode: 1 + m_Arguments: + m_ObjectArgument: {fileID: 0} + m_ObjectArgumentAssemblyTypeName: UnityEngine.Object, UnityEngine + m_IntArgument: 0 + m_FloatArgument: 0 + m_StringArgument: + m_BoolArgument: 0 + m_CallState: 2 +--- !u!1 &1240445628785883999 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 1240445628785883992} + - component: {fileID: 1240445628785883994} + - component: {fileID: 1240445628785883993} + m_Layer: 5 + m_Name: TitleText + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!224 &1240445628785883992 +RectTransform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1240445628785883999} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: 0, y: 0, z: 0} + m_LocalScale: {x: 1, y: 1, z: 1} + m_ConstrainProportionsScale: 0 + m_Children: [] + m_Father: {fileID: 1240445629906932932} + m_RootOrder: 0 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} + m_AnchorMin: {x: 0.5, y: 0.5} + m_AnchorMax: {x: 0.5, y: 0.5} + m_AnchoredPosition: {x: -468, y: 182} + m_SizeDelta: {x: 238.4239, y: 54.8398} + m_Pivot: {x: 0, y: 0.5} +--- !u!222 &1240445628785883994 +CanvasRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1240445628785883999} + m_CullTransparentMesh: 1 +--- !u!114 &1240445628785883993 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1240445628785883999} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 5f7201a12d95ffc409449d95f23cf332, type: 3} + m_Name: + m_EditorClassIdentifier: + m_Material: {fileID: 0} + m_Color: {r: 0.19607843, g: 0.19607843, b: 0.19607843, a: 1} + m_RaycastTarget: 1 + m_RaycastPadding: {x: 0, y: 0, z: 0, w: 0} + m_Maskable: 1 + m_OnCullStateChanged: + m_PersistentCalls: + m_Calls: [] + m_FontData: + m_Font: {fileID: 10102, guid: 0000000000000000e000000000000000, type: 0} + m_FontSize: 48 + m_FontStyle: 1 + m_BestFit: 0 + m_MinSize: 3 + m_MaxSize: 48 + m_Alignment: 0 + m_AlignByGeometry: 0 + m_RichText: 1 + m_HorizontalOverflow: 0 + m_VerticalOverflow: 0 + m_LineSpacing: 1 + m_Text: Analytics +--- !u!1 &1240445628788880488 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 1240445628788880489} + - component: {fileID: 1240445628788880491} + - component: {fileID: 1240445628788880490} + m_Layer: 5 + m_Name: TitleText + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!224 &1240445628788880489 +RectTransform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1240445628788880488} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: 0, y: 0, z: 0} + m_LocalScale: {x: 1, y: 1, z: 1} + m_ConstrainProportionsScale: 0 + m_Children: [] + m_Father: {fileID: 1240445629039028095} + m_RootOrder: 0 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} + m_AnchorMin: {x: 0.5, y: 0.5} + m_AnchorMax: {x: 0.5, y: 0.5} + m_AnchoredPosition: {x: -464, y: 477.00012} + m_SizeDelta: {x: 238.4239, y: 54.8398} + m_Pivot: {x: 0, y: 0.5} +--- !u!222 &1240445628788880491 +CanvasRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1240445628788880488} + m_CullTransparentMesh: 1 +--- !u!114 &1240445628788880490 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1240445628788880488} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 5f7201a12d95ffc409449d95f23cf332, type: 3} + m_Name: + m_EditorClassIdentifier: + m_Material: {fileID: 0} + m_Color: {r: 0.19607843, g: 0.19607843, b: 0.19607843, a: 1} + m_RaycastTarget: 1 + m_RaycastPadding: {x: 0, y: 0, z: 0, w: 0} + m_Maskable: 1 + m_OnCullStateChanged: + m_PersistentCalls: + m_Calls: [] + m_FontData: + m_Font: {fileID: 10102, guid: 0000000000000000e000000000000000, type: 0} + m_FontSize: 48 + m_FontStyle: 1 + m_BestFit: 0 + m_MinSize: 3 + m_MaxSize: 48 + m_Alignment: 0 + m_AlignByGeometry: 0 + m_RichText: 1 + m_HorizontalOverflow: 0 + m_VerticalOverflow: 0 + m_LineSpacing: 1 + m_Text: Ads +--- !u!1 &1240445628887719588 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 1240445628887719589} + - component: {fileID: 1240445628887719591} + - component: {fileID: 1240445628887719590} + m_Layer: 5 + m_Name: Text + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!224 &1240445628887719589 +RectTransform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1240445628887719588} + m_LocalRotation: {x: -0, y: -0, z: -0, w: 1} + m_LocalPosition: {x: 0, y: 0, z: 0} + m_LocalScale: {x: 1, y: 1, z: 1} + m_ConstrainProportionsScale: 0 + m_Children: [] + m_Father: {fileID: 1240445629125505494} + m_RootOrder: 0 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} + m_AnchorMin: {x: 0, y: 0} + m_AnchorMax: {x: 1, y: 1} + m_AnchoredPosition: {x: 0, y: 0} + m_SizeDelta: {x: 0, y: 0} + m_Pivot: {x: 0.5, y: 0.5} +--- !u!222 &1240445628887719591 +CanvasRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1240445628887719588} + m_CullTransparentMesh: 1 +--- !u!114 &1240445628887719590 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1240445628887719588} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 5f7201a12d95ffc409449d95f23cf332, type: 3} + m_Name: + m_EditorClassIdentifier: + m_Material: {fileID: 0} + m_Color: {r: 0.19607843, g: 0.19607843, b: 0.19607843, a: 1} + m_RaycastTarget: 1 + m_RaycastPadding: {x: 0, y: 0, z: 0, w: 0} + m_Maskable: 1 + m_OnCullStateChanged: + m_PersistentCalls: + m_Calls: [] + m_FontData: + m_Font: {fileID: 10102, guid: 0000000000000000e000000000000000, type: 0} + m_FontSize: 48 + m_FontStyle: 0 + m_BestFit: 0 + m_MinSize: 4 + m_MaxSize: 48 + m_Alignment: 4 + m_AlignByGeometry: 0 + m_RichText: 1 + m_HorizontalOverflow: 0 + m_VerticalOverflow: 0 + m_LineSpacing: 1 + m_Text: Buy Coins +--- !u!1 &1240445628892899887 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 1240445628892899880} + - component: {fileID: 1240445628892899883} + - component: {fileID: 1240445628892899882} + - component: {fileID: 1240445628892899881} + m_Layer: 5 + m_Name: Event03Button + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!224 &1240445628892899880 +RectTransform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1240445628892899887} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: 0, y: 0, z: 0} + m_LocalScale: {x: 1, y: 1, z: 1} + m_ConstrainProportionsScale: 0 + m_Children: + - {fileID: 1240445629531303428} + m_Father: {fileID: 1240445629906932932} + m_RootOrder: 3 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} + m_AnchorMin: {x: 0.5, y: 0.5} + m_AnchorMax: {x: 0.5, y: 0.5} + m_AnchoredPosition: {x: -471, y: -82} + m_SizeDelta: {x: 400, y: 120} + m_Pivot: {x: 0, y: 0.5} +--- !u!222 &1240445628892899883 +CanvasRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1240445628892899887} + m_CullTransparentMesh: 1 +--- !u!114 &1240445628892899882 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1240445628892899887} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: fe87c0e1cc204ed48ad3b37840f39efc, type: 3} + m_Name: + m_EditorClassIdentifier: + m_Material: {fileID: 0} + m_Color: {r: 1, g: 1, b: 1, a: 1} + m_RaycastTarget: 1 + m_RaycastPadding: {x: 0, y: 0, z: 0, w: 0} + m_Maskable: 1 + m_OnCullStateChanged: + m_PersistentCalls: + m_Calls: [] + m_Sprite: {fileID: 10905, guid: 0000000000000000f000000000000000, type: 0} + m_Type: 1 + m_PreserveAspect: 0 + m_FillCenter: 1 + m_FillMethod: 4 + m_FillAmount: 1 + m_FillClockwise: 1 + m_FillOrigin: 0 + m_UseSpriteMesh: 0 + m_PixelsPerUnitMultiplier: 1 +--- !u!114 &1240445628892899881 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1240445628892899887} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 4e29b1a8efbd4b44bb3f3716e73f07ff, type: 3} + m_Name: + m_EditorClassIdentifier: + m_Navigation: + m_Mode: 3 + m_WrapAround: 0 + m_SelectOnUp: {fileID: 0} + m_SelectOnDown: {fileID: 0} + m_SelectOnLeft: {fileID: 0} + m_SelectOnRight: {fileID: 0} + m_Transition: 1 + m_Colors: + m_NormalColor: {r: 1, g: 1, b: 1, a: 1} + m_HighlightedColor: {r: 0.9607843, g: 0.9607843, b: 0.9607843, a: 1} + m_PressedColor: {r: 0.78431374, g: 0.78431374, b: 0.78431374, a: 1} + m_SelectedColor: {r: 0.9607843, g: 0.9607843, b: 0.9607843, a: 1} + m_DisabledColor: {r: 0.78431374, g: 0.78431374, b: 0.78431374, a: 0.5019608} + m_ColorMultiplier: 1 + m_FadeDuration: 0.1 + m_SpriteState: + m_HighlightedSprite: {fileID: 0} + m_PressedSprite: {fileID: 0} + m_SelectedSprite: {fileID: 0} + m_DisabledSprite: {fileID: 0} + m_AnimationTriggers: + m_NormalTrigger: Normal + m_HighlightedTrigger: Highlighted + m_PressedTrigger: Pressed + m_SelectedTrigger: Selected + m_DisabledTrigger: Disabled + m_Interactable: 1 + m_TargetGraphic: {fileID: 1240445628892899882} + m_OnClick: + m_PersistentCalls: + m_Calls: + - m_Target: {fileID: 7348458583946661662} + m_TargetAssemblyTypeName: HCDemoScene, Assembly-CSharp + m_MethodName: Button_Event03 + m_Mode: 1 + m_Arguments: + m_ObjectArgument: {fileID: 0} + m_ObjectArgumentAssemblyTypeName: UnityEngine.Object, UnityEngine + m_IntArgument: 0 + m_FloatArgument: 0 + m_StringArgument: + m_BoolArgument: 0 + m_CallState: 2 +--- !u!1 &1240445629039028094 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 1240445629039028095} + m_Layer: 5 + m_Name: Ads + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!224 &1240445629039028095 +RectTransform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1240445629039028094} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: 0, y: 0, z: 0} + m_LocalScale: {x: 1, y: 1, z: 1} + m_ConstrainProportionsScale: 0 + m_Children: + - {fileID: 1240445628788880489} + - {fileID: 1240445630207821380} + - {fileID: 2889643666326708838} + - {fileID: 1240445629766085277} + - {fileID: 2401205720692808534} + - {fileID: 5378779329489247566} + - {fileID: 5524767040267571040} + - {fileID: 8614133738618825381} + - {fileID: 4724915981391621506} + - {fileID: 386111344024387214} + - {fileID: 2504313023457929693} + - {fileID: 3116041821519604338} + - {fileID: 3223175518735522177} + - {fileID: 88522639002915039} + - {fileID: 6767664043325814637} + - {fileID: 5395937451915722863} + m_Father: {fileID: 1240445628202320349} + m_RootOrder: 3 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} + m_AnchorMin: {x: 0, y: 0} + m_AnchorMax: {x: 0, y: 0} + m_AnchoredPosition: {x: 0, y: 0} + m_SizeDelta: {x: 1080, y: 1050} + m_Pivot: {x: 0.5, y: 0.5} +--- !u!1 &1240445629073021842 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 1240445629073021843} + - component: {fileID: 1240445629073021854} + - component: {fileID: 1240445629073021853} + - component: {fileID: 1240445629073021852} + m_Layer: 5 + m_Name: Scroll View + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!224 &1240445629073021843 +RectTransform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1240445629073021842} + m_LocalRotation: {x: -0, y: -0, z: -0, w: 1} + m_LocalPosition: {x: 0, y: 0, z: 0} + m_LocalScale: {x: 1, y: 1, z: 1} + m_ConstrainProportionsScale: 0 + m_Children: + - {fileID: 1240445628703286520} + m_Father: {fileID: 1240445629907049998} + m_RootOrder: 0 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} + m_AnchorMin: {x: 0, y: 0} + m_AnchorMax: {x: 1, y: 1} + m_AnchoredPosition: {x: 0, y: 0} + m_SizeDelta: {x: 0, y: 0} + m_Pivot: {x: 0.5, y: 0.5} +--- !u!222 &1240445629073021854 +CanvasRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1240445629073021842} + m_CullTransparentMesh: 1 +--- !u!114 &1240445629073021853 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1240445629073021842} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: fe87c0e1cc204ed48ad3b37840f39efc, type: 3} + m_Name: + m_EditorClassIdentifier: + m_Material: {fileID: 0} + m_Color: {r: 1, g: 1, b: 1, a: 0.392} + m_RaycastTarget: 1 + m_RaycastPadding: {x: 0, y: 0, z: 0, w: 0} + m_Maskable: 1 + m_OnCullStateChanged: + m_PersistentCalls: + m_Calls: [] + m_Sprite: {fileID: 10907, guid: 0000000000000000f000000000000000, type: 0} + m_Type: 1 + m_PreserveAspect: 0 + m_FillCenter: 1 + m_FillMethod: 4 + m_FillAmount: 1 + m_FillClockwise: 1 + m_FillOrigin: 0 + m_UseSpriteMesh: 0 + m_PixelsPerUnitMultiplier: 1 +--- !u!114 &1240445629073021852 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1240445629073021842} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 1aa08ab6e0800fa44ae55d278d1423e3, type: 3} + m_Name: + m_EditorClassIdentifier: + m_Content: {fileID: 1240445628202320349} + m_Horizontal: 0 + m_Vertical: 1 + m_MovementType: 1 + m_Elasticity: 0.1 + m_Inertia: 1 + m_DecelerationRate: 0.135 + m_ScrollSensitivity: 1 + m_Viewport: {fileID: 1240445628703286520} + m_HorizontalScrollbar: {fileID: 0} + m_VerticalScrollbar: {fileID: 0} + m_HorizontalScrollbarVisibility: 2 + m_VerticalScrollbarVisibility: 2 + m_HorizontalScrollbarSpacing: -3 + m_VerticalScrollbarSpacing: -3 + m_OnValueChanged: + m_PersistentCalls: + m_Calls: [] +--- !u!1 &1240445629125505493 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 1240445629125505494} + - component: {fileID: 1240445629125505489} + - component: {fileID: 1240445629125505488} + - component: {fileID: 1240445629125505495} + m_Layer: 5 + m_Name: BuyCoinsButton + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!224 &1240445629125505494 +RectTransform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1240445629125505493} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: 0, y: 0, z: 0} + m_LocalScale: {x: 1, y: 1, z: 1} + m_ConstrainProportionsScale: 0 + m_Children: + - {fileID: 1240445628887719589} + m_Father: {fileID: 1240445628316549557} + m_RootOrder: 2 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} + m_AnchorMin: {x: 0.5, y: 0.5} + m_AnchorMax: {x: 0.5, y: 0.5} + m_AnchoredPosition: {x: 5, y: 54} + m_SizeDelta: {x: 400, y: 120} + m_Pivot: {x: 0, y: 0.5} +--- !u!222 &1240445629125505489 +CanvasRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1240445629125505493} + m_CullTransparentMesh: 1 +--- !u!114 &1240445629125505488 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1240445629125505493} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: fe87c0e1cc204ed48ad3b37840f39efc, type: 3} + m_Name: + m_EditorClassIdentifier: + m_Material: {fileID: 0} + m_Color: {r: 1, g: 1, b: 1, a: 1} + m_RaycastTarget: 1 + m_RaycastPadding: {x: 0, y: 0, z: 0, w: 0} + m_Maskable: 1 + m_OnCullStateChanged: + m_PersistentCalls: + m_Calls: [] + m_Sprite: {fileID: 10905, guid: 0000000000000000f000000000000000, type: 0} + m_Type: 1 + m_PreserveAspect: 0 + m_FillCenter: 1 + m_FillMethod: 4 + m_FillAmount: 1 + m_FillClockwise: 1 + m_FillOrigin: 0 + m_UseSpriteMesh: 0 + m_PixelsPerUnitMultiplier: 1 +--- !u!114 &1240445629125505495 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1240445629125505493} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 4e29b1a8efbd4b44bb3f3716e73f07ff, type: 3} + m_Name: + m_EditorClassIdentifier: + m_Navigation: + m_Mode: 3 + m_WrapAround: 0 + m_SelectOnUp: {fileID: 0} + m_SelectOnDown: {fileID: 0} + m_SelectOnLeft: {fileID: 0} + m_SelectOnRight: {fileID: 0} + m_Transition: 1 + m_Colors: + m_NormalColor: {r: 1, g: 1, b: 1, a: 1} + m_HighlightedColor: {r: 0.9607843, g: 0.9607843, b: 0.9607843, a: 1} + m_PressedColor: {r: 0.78431374, g: 0.78431374, b: 0.78431374, a: 1} + m_SelectedColor: {r: 0.9607843, g: 0.9607843, b: 0.9607843, a: 1} + m_DisabledColor: {r: 0.78431374, g: 0.78431374, b: 0.78431374, a: 0.5019608} + m_ColorMultiplier: 1 + m_FadeDuration: 0.1 + m_SpriteState: + m_HighlightedSprite: {fileID: 0} + m_PressedSprite: {fileID: 0} + m_SelectedSprite: {fileID: 0} + m_DisabledSprite: {fileID: 0} + m_AnimationTriggers: + m_NormalTrigger: Normal + m_HighlightedTrigger: Highlighted + m_PressedTrigger: Pressed + m_SelectedTrigger: Selected + m_DisabledTrigger: Disabled + m_Interactable: 1 + m_TargetGraphic: {fileID: 1240445629125505488} + m_OnClick: + m_PersistentCalls: + m_Calls: + - m_Target: {fileID: 7348458583946661662} + m_TargetAssemblyTypeName: HCDemoScene, Assembly-CSharp + m_MethodName: ButtonBuyCoins + m_Mode: 1 + m_Arguments: + m_ObjectArgument: {fileID: 0} + m_ObjectArgumentAssemblyTypeName: UnityEngine.Object, UnityEngine + m_IntArgument: 0 + m_FloatArgument: 0 + m_StringArgument: + m_BoolArgument: 0 + m_CallState: 2 +--- !u!1 &1240445629146722334 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 1240445629146722335} + - component: {fileID: 1240445629146722329} + - component: {fileID: 1240445629146722328} + m_Layer: 5 + m_Name: Text + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!224 &1240445629146722335 +RectTransform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1240445629146722334} + m_LocalRotation: {x: -0, y: -0, z: -0, w: 1} + m_LocalPosition: {x: 0, y: 0, z: 0} + m_LocalScale: {x: 1, y: 1, z: 1} + m_ConstrainProportionsScale: 0 + m_Children: [] + m_Father: {fileID: 1240445628478472564} + m_RootOrder: 0 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} + m_AnchorMin: {x: 0, y: 0} + m_AnchorMax: {x: 1, y: 1} + m_AnchoredPosition: {x: 0, y: 0} + m_SizeDelta: {x: 0, y: 0} + m_Pivot: {x: 0.5, y: 0.5} +--- !u!222 &1240445629146722329 +CanvasRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1240445629146722334} + m_CullTransparentMesh: 1 +--- !u!114 &1240445629146722328 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1240445629146722334} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 5f7201a12d95ffc409449d95f23cf332, type: 3} + m_Name: + m_EditorClassIdentifier: + m_Material: {fileID: 0} + m_Color: {r: 0.19607843, g: 0.19607843, b: 0.19607843, a: 1} + m_RaycastTarget: 1 + m_RaycastPadding: {x: 0, y: 0, z: 0, w: 0} + m_Maskable: 1 + m_OnCullStateChanged: + m_PersistentCalls: + m_Calls: [] + m_FontData: + m_Font: {fileID: 10102, guid: 0000000000000000e000000000000000, type: 0} + m_FontSize: 48 + m_FontStyle: 0 + m_BestFit: 0 + m_MinSize: 4 + m_MaxSize: 48 + m_Alignment: 4 + m_AlignByGeometry: 0 + m_RichText: 1 + m_HorizontalOverflow: 0 + m_VerticalOverflow: 0 + m_LineSpacing: 1 + m_Text: Event01 +--- !u!1 &1240445629520549017 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 1240445629520549018} + - component: {fileID: 1240445629520548997} + - component: {fileID: 1240445629520548996} + - component: {fileID: 1240445629520549019} + m_Layer: 5 + m_Name: BuyNoAdsButton + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!224 &1240445629520549018 +RectTransform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1240445629520549017} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: 0, y: 0, z: 0} + m_LocalScale: {x: 1, y: 1, z: 1} + m_ConstrainProportionsScale: 0 + m_Children: + - {fileID: 1240445629911360601} + m_Father: {fileID: 1240445628316549557} + m_RootOrder: 1 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} + m_AnchorMin: {x: 0.5, y: 0.5} + m_AnchorMax: {x: 0.5, y: 0.5} + m_AnchoredPosition: {x: -470, y: 54} + m_SizeDelta: {x: 400, y: 120} + m_Pivot: {x: 0, y: 0.5} +--- !u!222 &1240445629520548997 +CanvasRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1240445629520549017} + m_CullTransparentMesh: 1 +--- !u!114 &1240445629520548996 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1240445629520549017} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: fe87c0e1cc204ed48ad3b37840f39efc, type: 3} + m_Name: + m_EditorClassIdentifier: + m_Material: {fileID: 0} + m_Color: {r: 1, g: 1, b: 1, a: 1} + m_RaycastTarget: 1 + m_RaycastPadding: {x: 0, y: 0, z: 0, w: 0} + m_Maskable: 1 + m_OnCullStateChanged: + m_PersistentCalls: + m_Calls: [] + m_Sprite: {fileID: 10905, guid: 0000000000000000f000000000000000, type: 0} + m_Type: 1 + m_PreserveAspect: 0 + m_FillCenter: 1 + m_FillMethod: 4 + m_FillAmount: 1 + m_FillClockwise: 1 + m_FillOrigin: 0 + m_UseSpriteMesh: 0 + m_PixelsPerUnitMultiplier: 1 +--- !u!114 &1240445629520549019 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1240445629520549017} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 4e29b1a8efbd4b44bb3f3716e73f07ff, type: 3} + m_Name: + m_EditorClassIdentifier: + m_Navigation: + m_Mode: 3 + m_WrapAround: 0 + m_SelectOnUp: {fileID: 0} + m_SelectOnDown: {fileID: 0} + m_SelectOnLeft: {fileID: 0} + m_SelectOnRight: {fileID: 0} + m_Transition: 1 + m_Colors: + m_NormalColor: {r: 1, g: 1, b: 1, a: 1} + m_HighlightedColor: {r: 0.9607843, g: 0.9607843, b: 0.9607843, a: 1} + m_PressedColor: {r: 0.78431374, g: 0.78431374, b: 0.78431374, a: 1} + m_SelectedColor: {r: 0.9607843, g: 0.9607843, b: 0.9607843, a: 1} + m_DisabledColor: {r: 0.78431374, g: 0.78431374, b: 0.78431374, a: 0.5019608} + m_ColorMultiplier: 1 + m_FadeDuration: 0.1 + m_SpriteState: + m_HighlightedSprite: {fileID: 0} + m_PressedSprite: {fileID: 0} + m_SelectedSprite: {fileID: 0} + m_DisabledSprite: {fileID: 0} + m_AnimationTriggers: + m_NormalTrigger: Normal + m_HighlightedTrigger: Highlighted + m_PressedTrigger: Pressed + m_SelectedTrigger: Selected + m_DisabledTrigger: Disabled + m_Interactable: 1 + m_TargetGraphic: {fileID: 1240445629520548996} + m_OnClick: + m_PersistentCalls: + m_Calls: + - m_Target: {fileID: 7348458583946661662} + m_TargetAssemblyTypeName: HCDemoScene, Assembly-CSharp + m_MethodName: ButtonBuyNoads + m_Mode: 1 + m_Arguments: + m_ObjectArgument: {fileID: 0} + m_ObjectArgumentAssemblyTypeName: UnityEngine.Object, UnityEngine + m_IntArgument: 0 + m_FloatArgument: 0 + m_StringArgument: + m_BoolArgument: 0 + m_CallState: 2 +--- !u!1 &1240445629531303451 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 1240445629531303428} + - component: {fileID: 1240445629531303430} + - component: {fileID: 1240445629531303429} + m_Layer: 5 + m_Name: Text + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!224 &1240445629531303428 +RectTransform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1240445629531303451} + m_LocalRotation: {x: -0, y: -0, z: -0, w: 1} + m_LocalPosition: {x: 0, y: 0, z: 0} + m_LocalScale: {x: 1, y: 1, z: 1} + m_ConstrainProportionsScale: 0 + m_Children: [] + m_Father: {fileID: 1240445628892899880} + m_RootOrder: 0 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} + m_AnchorMin: {x: 0, y: 0} + m_AnchorMax: {x: 1, y: 1} + m_AnchoredPosition: {x: 0, y: 0} + m_SizeDelta: {x: 0, y: 0} + m_Pivot: {x: 0.5, y: 0.5} +--- !u!222 &1240445629531303430 +CanvasRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1240445629531303451} + m_CullTransparentMesh: 1 +--- !u!114 &1240445629531303429 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1240445629531303451} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 5f7201a12d95ffc409449d95f23cf332, type: 3} + m_Name: + m_EditorClassIdentifier: + m_Material: {fileID: 0} + m_Color: {r: 0.19607843, g: 0.19607843, b: 0.19607843, a: 1} + m_RaycastTarget: 1 + m_RaycastPadding: {x: 0, y: 0, z: 0, w: 0} + m_Maskable: 1 + m_OnCullStateChanged: + m_PersistentCalls: + m_Calls: [] + m_FontData: + m_Font: {fileID: 10102, guid: 0000000000000000e000000000000000, type: 0} + m_FontSize: 48 + m_FontStyle: 0 + m_BestFit: 0 + m_MinSize: 4 + m_MaxSize: 48 + m_Alignment: 4 + m_AlignByGeometry: 0 + m_RichText: 1 + m_HorizontalOverflow: 0 + m_VerticalOverflow: 0 + m_LineSpacing: 1 + m_Text: Event03 +--- !u!1 &1240445629534457789 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 1240445629534457790} + - component: {fileID: 1240445629534457784} + - component: {fileID: 1240445629534457791} + m_Layer: 5 + m_Name: Line + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!224 &1240445629534457790 +RectTransform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1240445629534457789} + m_LocalRotation: {x: -0, y: -0, z: -0, w: 1} + m_LocalPosition: {x: 0, y: 0, z: 0} + m_LocalScale: {x: 1, y: 1, z: 1} + m_ConstrainProportionsScale: 0 + m_Children: [] + m_Father: {fileID: 1240445628202320349} + m_RootOrder: 4 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} + m_AnchorMin: {x: 0, y: 0} + m_AnchorMax: {x: 0, y: 0} + m_AnchoredPosition: {x: 0, y: 0} + m_SizeDelta: {x: 1080, y: 12} + m_Pivot: {x: 0.5, y: 0.5} +--- !u!222 &1240445629534457784 +CanvasRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1240445629534457789} + m_CullTransparentMesh: 1 +--- !u!114 &1240445629534457791 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1240445629534457789} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: fe87c0e1cc204ed48ad3b37840f39efc, type: 3} + m_Name: + m_EditorClassIdentifier: + m_Material: {fileID: 0} + m_Color: {r: 0.3759642, g: 0.4339623, b: 0.34184766, a: 1} + m_RaycastTarget: 1 + m_RaycastPadding: {x: 0, y: 0, z: 0, w: 0} + m_Maskable: 1 + m_OnCullStateChanged: + m_PersistentCalls: + m_Calls: [] + m_Sprite: {fileID: 0} + m_Type: 0 + m_PreserveAspect: 0 + m_FillCenter: 1 + m_FillMethod: 4 + m_FillAmount: 1 + m_FillClockwise: 1 + m_FillOrigin: 0 + m_UseSpriteMesh: 0 + m_PixelsPerUnitMultiplier: 1 +--- !u!1 &1240445629679888801 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 1240445629679888802} + - component: {fileID: 1240445629679888812} + - component: {fileID: 1240445629679888803} + m_Layer: 5 + m_Name: Line + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!224 &1240445629679888802 +RectTransform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1240445629679888801} + m_LocalRotation: {x: -0, y: -0, z: -0, w: 1} + m_LocalPosition: {x: 0, y: 0, z: 0} + m_LocalScale: {x: 1, y: 1, z: 1} + m_ConstrainProportionsScale: 0 + m_Children: [] + m_Father: {fileID: 1240445628202320349} + m_RootOrder: 8 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} + m_AnchorMin: {x: 0, y: 0} + m_AnchorMax: {x: 0, y: 0} + m_AnchoredPosition: {x: 0, y: 0} + m_SizeDelta: {x: 1080, y: 12} + m_Pivot: {x: 0.5, y: 0.5} +--- !u!222 &1240445629679888812 +CanvasRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1240445629679888801} + m_CullTransparentMesh: 1 +--- !u!114 &1240445629679888803 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1240445629679888801} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: fe87c0e1cc204ed48ad3b37840f39efc, type: 3} + m_Name: + m_EditorClassIdentifier: + m_Material: {fileID: 0} + m_Color: {r: 0.3759642, g: 0.4339623, b: 0.34184766, a: 1} + m_RaycastTarget: 1 + m_RaycastPadding: {x: 0, y: 0, z: 0, w: 0} + m_Maskable: 1 + m_OnCullStateChanged: + m_PersistentCalls: + m_Calls: [] + m_Sprite: {fileID: 0} + m_Type: 0 + m_PreserveAspect: 0 + m_FillCenter: 1 + m_FillMethod: 4 + m_FillAmount: 1 + m_FillClockwise: 1 + m_FillOrigin: 0 + m_UseSpriteMesh: 0 + m_PixelsPerUnitMultiplier: 1 +--- !u!1 &1240445629714686068 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 1240445629714686069} + - component: {fileID: 1240445629714686071} + - component: {fileID: 1240445629714686070} + m_Layer: 5 + m_Name: TitleText (1) + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!224 &1240445629714686069 +RectTransform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1240445629714686068} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: 0, y: 0, z: 0} + m_LocalScale: {x: 1, y: 1, z: 1} + m_ConstrainProportionsScale: 0 + m_Children: [] + m_Father: {fileID: 1240445628077361974} + m_RootOrder: 1 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} + m_AnchorMin: {x: 0.5, y: 0.5} + m_AnchorMax: {x: 0.5, y: 0.5} + m_AnchoredPosition: {x: -472, y: 68.99994} + m_SizeDelta: {x: 322.067, y: 54.8398} + m_Pivot: {x: 0, y: 0.5} +--- !u!222 &1240445629714686071 +CanvasRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1240445629714686068} + m_CullTransparentMesh: 1 +--- !u!114 &1240445629714686070 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1240445629714686068} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 5f7201a12d95ffc409449d95f23cf332, type: 3} + m_Name: + m_EditorClassIdentifier: + m_Material: {fileID: 0} + m_Color: {r: 0.19607843, g: 0.19607843, b: 0.19607843, a: 1} + m_RaycastTarget: 1 + m_RaycastPadding: {x: 0, y: 0, z: 0, w: 0} + m_Maskable: 1 + m_OnCullStateChanged: + m_PersistentCalls: + m_Calls: [] + m_FontData: + m_Font: {fileID: 10102, guid: 0000000000000000e000000000000000, type: 0} + m_FontSize: 48 + m_FontStyle: 1 + m_BestFit: 0 + m_MinSize: 3 + m_MaxSize: 48 + m_Alignment: 0 + m_AlignByGeometry: 0 + m_RichText: 1 + m_HorizontalOverflow: 0 + m_VerticalOverflow: 0 + m_LineSpacing: 1 + m_Text: Has Login Screen +--- !u!1 &1240445629726163039 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 1240445629726163032} + - component: {fileID: 1240445629726163034} + - component: {fileID: 1240445629726163033} + m_Layer: 5 + m_Name: Text + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!224 &1240445629726163032 +RectTransform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1240445629726163039} + m_LocalRotation: {x: -0, y: -0, z: -0, w: 1} + m_LocalPosition: {x: 0, y: 0, z: 0} + m_LocalScale: {x: 1, y: 1, z: 1} + m_ConstrainProportionsScale: 0 + m_Children: [] + m_Father: {fileID: 1240445628305562347} + m_RootOrder: 0 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} + m_AnchorMin: {x: 0, y: 0} + m_AnchorMax: {x: 1, y: 1} + m_AnchoredPosition: {x: 0, y: 0} + m_SizeDelta: {x: 0, y: 0} + m_Pivot: {x: 0.5, y: 0.5} +--- !u!222 &1240445629726163034 +CanvasRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1240445629726163039} + m_CullTransparentMesh: 1 +--- !u!114 &1240445629726163033 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1240445629726163039} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 5f7201a12d95ffc409449d95f23cf332, type: 3} + m_Name: + m_EditorClassIdentifier: + m_Material: {fileID: 0} + m_Color: {r: 0.19607843, g: 0.19607843, b: 0.19607843, a: 1} + m_RaycastTarget: 1 + m_RaycastPadding: {x: 0, y: 0, z: 0, w: 0} + m_Maskable: 1 + m_OnCullStateChanged: + m_PersistentCalls: + m_Calls: [] + m_FontData: + m_Font: {fileID: 10102, guid: 0000000000000000e000000000000000, type: 0} + m_FontSize: 48 + m_FontStyle: 0 + m_BestFit: 0 + m_MinSize: 4 + m_MaxSize: 48 + m_Alignment: 4 + m_AlignByGeometry: 0 + m_RichText: 1 + m_HorizontalOverflow: 0 + m_VerticalOverflow: 0 + m_LineSpacing: 1 + m_Text: NoLoginScreen +--- !u!1 &1240445629731455427 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 1240445629731455436} + - component: {fileID: 1240445629731455438} + - component: {fileID: 1240445629731455437} + m_Layer: 5 + m_Name: TitleText + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!224 &1240445629731455436 +RectTransform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1240445629731455427} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: 0, y: 0, z: 0} + m_LocalScale: {x: 1, y: 1, z: 1} + m_ConstrainProportionsScale: 0 + m_Children: [] + m_Father: {fileID: 1240445628316549557} + m_RootOrder: 0 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} + m_AnchorMin: {x: 0.5, y: 0.5} + m_AnchorMax: {x: 0.5, y: 0.5} + m_AnchoredPosition: {x: -465, y: 178} + m_SizeDelta: {x: 238.4239, y: 54.8398} + m_Pivot: {x: 0, y: 0.5} +--- !u!222 &1240445629731455438 +CanvasRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1240445629731455427} + m_CullTransparentMesh: 1 +--- !u!114 &1240445629731455437 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1240445629731455427} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 5f7201a12d95ffc409449d95f23cf332, type: 3} + m_Name: + m_EditorClassIdentifier: + m_Material: {fileID: 0} + m_Color: {r: 0.19607843, g: 0.19607843, b: 0.19607843, a: 1} + m_RaycastTarget: 1 + m_RaycastPadding: {x: 0, y: 0, z: 0, w: 0} + m_Maskable: 1 + m_OnCullStateChanged: + m_PersistentCalls: + m_Calls: [] + m_FontData: + m_Font: {fileID: 10102, guid: 0000000000000000e000000000000000, type: 0} + m_FontSize: 48 + m_FontStyle: 1 + m_BestFit: 0 + m_MinSize: 3 + m_MaxSize: 48 + m_Alignment: 0 + m_AlignByGeometry: 0 + m_RichText: 1 + m_HorizontalOverflow: 0 + m_VerticalOverflow: 0 + m_LineSpacing: 1 + m_Text: IAP +--- !u!1 &1240445629733809830 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 1240445629733809831} + - component: {fileID: 1240445629733809825} + - component: {fileID: 1240445629733809824} + m_Layer: 5 + m_Name: TitleText (2) + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!224 &1240445629733809831 +RectTransform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1240445629733809830} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: 0, y: 0, z: 0} + m_LocalScale: {x: 1, y: 1, z: 1} + m_ConstrainProportionsScale: 0 + m_Children: [] + m_Father: {fileID: 1240445628077361974} + m_RootOrder: 2 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} + m_AnchorMin: {x: 0.5, y: 0.5} + m_AnchorMax: {x: 0.5, y: 0.5} + m_AnchoredPosition: {x: 4, y: 68.99994} + m_SizeDelta: {x: 452.8623, y: 54.8398} + m_Pivot: {x: 0, y: 0.5} +--- !u!222 &1240445629733809825 +CanvasRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1240445629733809830} + m_CullTransparentMesh: 1 +--- !u!114 &1240445629733809824 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1240445629733809830} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 5f7201a12d95ffc409449d95f23cf332, type: 3} + m_Name: + m_EditorClassIdentifier: + m_Material: {fileID: 0} + m_Color: {r: 0.19607843, g: 0.19607843, b: 0.19607843, a: 1} + m_RaycastTarget: 1 + m_RaycastPadding: {x: 0, y: 0, z: 0, w: 0} + m_Maskable: 1 + m_OnCullStateChanged: + m_PersistentCalls: + m_Calls: [] + m_FontData: + m_Font: {fileID: 10102, guid: 0000000000000000e000000000000000, type: 0} + m_FontSize: 48 + m_FontStyle: 1 + m_BestFit: 0 + m_MinSize: 3 + m_MaxSize: 48 + m_Alignment: 0 + m_AlignByGeometry: 0 + m_RichText: 1 + m_HorizontalOverflow: 0 + m_VerticalOverflow: 0 + m_LineSpacing: 1 + m_Text: No Login Screen +--- !u!1 &1240445629766085276 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 1240445629766085277} + - component: {fileID: 1240445629766085272} + - component: {fileID: 1240445629766085279} + - component: {fileID: 1240445629766085278} + m_Layer: 5 + m_Name: RVButton + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!224 &1240445629766085277 +RectTransform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1240445629766085276} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: 0, y: 0, z: 0} + m_LocalScale: {x: 1, y: 1, z: 1} + m_ConstrainProportionsScale: 0 + m_Children: + - {fileID: 1240445630128938484} + m_Father: {fileID: 1240445629039028095} + m_RootOrder: 3 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} + m_AnchorMin: {x: 0.5, y: 0.5} + m_AnchorMax: {x: 0.5, y: 0.5} + m_AnchoredPosition: {x: 6, y: 353.00006} + m_SizeDelta: {x: 400, y: 120} + m_Pivot: {x: 0, y: 0.5} +--- !u!222 &1240445629766085272 +CanvasRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1240445629766085276} + m_CullTransparentMesh: 1 +--- !u!114 &1240445629766085279 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1240445629766085276} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: fe87c0e1cc204ed48ad3b37840f39efc, type: 3} + m_Name: + m_EditorClassIdentifier: + m_Material: {fileID: 0} + m_Color: {r: 1, g: 1, b: 1, a: 1} + m_RaycastTarget: 1 + m_RaycastPadding: {x: 0, y: 0, z: 0, w: 0} + m_Maskable: 1 + m_OnCullStateChanged: + m_PersistentCalls: + m_Calls: [] + m_Sprite: {fileID: 10905, guid: 0000000000000000f000000000000000, type: 0} + m_Type: 1 + m_PreserveAspect: 0 + m_FillCenter: 1 + m_FillMethod: 4 + m_FillAmount: 1 + m_FillClockwise: 1 + m_FillOrigin: 0 + m_UseSpriteMesh: 0 + m_PixelsPerUnitMultiplier: 1 +--- !u!114 &1240445629766085278 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1240445629766085276} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 4e29b1a8efbd4b44bb3f3716e73f07ff, type: 3} + m_Name: + m_EditorClassIdentifier: + m_Navigation: + m_Mode: 3 + m_WrapAround: 0 + m_SelectOnUp: {fileID: 0} + m_SelectOnDown: {fileID: 0} + m_SelectOnLeft: {fileID: 0} + m_SelectOnRight: {fileID: 0} + m_Transition: 1 + m_Colors: + m_NormalColor: {r: 1, g: 1, b: 1, a: 1} + m_HighlightedColor: {r: 0.9607843, g: 0.9607843, b: 0.9607843, a: 1} + m_PressedColor: {r: 0.78431374, g: 0.78431374, b: 0.78431374, a: 1} + m_SelectedColor: {r: 0.9607843, g: 0.9607843, b: 0.9607843, a: 1} + m_DisabledColor: {r: 0.78431374, g: 0.78431374, b: 0.78431374, a: 0.5019608} + m_ColorMultiplier: 1 + m_FadeDuration: 0.1 + m_SpriteState: + m_HighlightedSprite: {fileID: 0} + m_PressedSprite: {fileID: 0} + m_SelectedSprite: {fileID: 0} + m_DisabledSprite: {fileID: 0} + m_AnimationTriggers: + m_NormalTrigger: Normal + m_HighlightedTrigger: Highlighted + m_PressedTrigger: Pressed + m_SelectedTrigger: Selected + m_DisabledTrigger: Disabled + m_Interactable: 1 + m_TargetGraphic: {fileID: 1240445629766085279} + m_OnClick: + m_PersistentCalls: + m_Calls: + - m_Target: {fileID: 7348458583946661662} + m_TargetAssemblyTypeName: HCDemoScene, Assembly-CSharp + m_MethodName: Button_ShowRV + m_Mode: 1 + m_Arguments: + m_ObjectArgument: {fileID: 0} + m_ObjectArgumentAssemblyTypeName: UnityEngine.Object, UnityEngine + m_IntArgument: 0 + m_FloatArgument: 0 + m_StringArgument: + m_BoolArgument: 0 + m_CallState: 2 +--- !u!1 &1240445629789692594 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 1240445629789692595} + m_Layer: 5 + m_Name: Init + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!224 &1240445629789692595 +RectTransform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1240445629789692594} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: 0, y: 0, z: 0} + m_LocalScale: {x: 1, y: 1, z: 1} + m_ConstrainProportionsScale: 0 + m_Children: + - {fileID: 1240445628744111348} + - {fileID: 1240445630210680887} + - {fileID: 1319004118607695220} + m_Father: {fileID: 1240445628202320349} + m_RootOrder: 1 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} + m_AnchorMin: {x: 0, y: 0} + m_AnchorMax: {x: 0, y: 0} + m_AnchoredPosition: {x: 0, y: 0} + m_SizeDelta: {x: 1080, y: 400} + m_Pivot: {x: 0.5, y: 0.5} +--- !u!1 &1240445629872685081 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 1240445629872685082} + - component: {fileID: 1240445629872685060} + - component: {fileID: 1240445629872685083} + m_Layer: 5 + m_Name: Text + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!224 &1240445629872685082 +RectTransform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1240445629872685081} + m_LocalRotation: {x: -0, y: -0, z: -0, w: 1} + m_LocalPosition: {x: 0, y: 0, z: 0} + m_LocalScale: {x: 1, y: 1, z: 1} + m_ConstrainProportionsScale: 0 + m_Children: [] + m_Father: {fileID: 1240445629995664446} + m_RootOrder: 0 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} + m_AnchorMin: {x: 0, y: 0} + m_AnchorMax: {x: 1, y: 1} + m_AnchoredPosition: {x: 0, y: 0} + m_SizeDelta: {x: 0, y: 0} + m_Pivot: {x: 0.5, y: 0.5} +--- !u!222 &1240445629872685060 +CanvasRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1240445629872685081} + m_CullTransparentMesh: 1 +--- !u!114 &1240445629872685083 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1240445629872685081} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 5f7201a12d95ffc409449d95f23cf332, type: 3} + m_Name: + m_EditorClassIdentifier: + m_Material: {fileID: 0} + m_Color: {r: 0.19607843, g: 0.19607843, b: 0.19607843, a: 1} + m_RaycastTarget: 1 + m_RaycastPadding: {x: 0, y: 0, z: 0, w: 0} + m_Maskable: 1 + m_OnCullStateChanged: + m_PersistentCalls: + m_Calls: [] + m_FontData: + m_Font: {fileID: 10102, guid: 0000000000000000e000000000000000, type: 0} + m_FontSize: 48 + m_FontStyle: 0 + m_BestFit: 0 + m_MinSize: 4 + m_MaxSize: 48 + m_Alignment: 4 + m_AlignByGeometry: 0 + m_RichText: 1 + m_HorizontalOverflow: 0 + m_VerticalOverflow: 0 + m_LineSpacing: 1 + m_Text: Event02 +--- !u!1 &1240445629906932955 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 1240445629906932932} + m_Layer: 5 + m_Name: Analytics + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!224 &1240445629906932932 +RectTransform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1240445629906932955} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: 0, y: 0, z: 0} + m_LocalScale: {x: 1, y: 1, z: 1} + m_ConstrainProportionsScale: 0 + m_Children: + - {fileID: 1240445628785883992} + - {fileID: 1240445628478472564} + - {fileID: 1240445629995664446} + - {fileID: 1240445628892899880} + - {fileID: 5877652753891351603} + m_Father: {fileID: 1240445628202320349} + m_RootOrder: 5 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} + m_AnchorMin: {x: 0, y: 0} + m_AnchorMax: {x: 0, y: 0} + m_AnchoredPosition: {x: 0, y: 0} + m_SizeDelta: {x: 1080, y: 450} + m_Pivot: {x: 0.5, y: 0.5} +--- !u!1 &1240445629907049997 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 1240445629907049998} + - component: {fileID: 7348458583946661662} + m_Layer: 5 + m_Name: MainDemoView + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!224 &1240445629907049998 +RectTransform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1240445629907049997} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: 0, y: 0, z: 0} + m_LocalScale: {x: 1, y: 1, z: 1} + m_ConstrainProportionsScale: 0 + m_Children: + - {fileID: 1240445629073021843} + m_Father: {fileID: 0} + m_RootOrder: 0 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} + m_AnchorMin: {x: 0, y: 0} + m_AnchorMax: {x: 1, y: 1} + m_AnchoredPosition: {x: 0, y: 0} + m_SizeDelta: {x: 0, y: 0} + m_Pivot: {x: 0.5, y: 0.5} +--- !u!114 &7348458583946661662 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1240445629907049997} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 2b861244fe74b4ab78178c3aadfb35e4, type: 3} + m_Name: + m_EditorClassIdentifier: + mLoginDemoView: {fileID: 0} + mCheckSensitiveWordView: {fileID: 0} + mPurchaseBtn: {fileID: 1240445629911360602} + nativeImage: {fileID: 4823452881522463278} +--- !u!1 &1240445629911360600 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 1240445629911360601} + - component: {fileID: 1240445629911360603} + - component: {fileID: 1240445629911360602} + m_Layer: 5 + m_Name: Text + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!224 &1240445629911360601 +RectTransform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1240445629911360600} + m_LocalRotation: {x: -0, y: -0, z: -0, w: 1} + m_LocalPosition: {x: 0, y: 0, z: 0} + m_LocalScale: {x: 1, y: 1, z: 1} + m_ConstrainProportionsScale: 0 + m_Children: [] + m_Father: {fileID: 1240445629520549018} + m_RootOrder: 0 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} + m_AnchorMin: {x: 0, y: 0} + m_AnchorMax: {x: 1, y: 1} + m_AnchoredPosition: {x: 0, y: 0} + m_SizeDelta: {x: 0, y: 0} + m_Pivot: {x: 0.5, y: 0.5} +--- !u!222 &1240445629911360603 +CanvasRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1240445629911360600} + m_CullTransparentMesh: 1 +--- !u!114 &1240445629911360602 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1240445629911360600} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 5f7201a12d95ffc409449d95f23cf332, type: 3} + m_Name: + m_EditorClassIdentifier: + m_Material: {fileID: 0} + m_Color: {r: 0.19607843, g: 0.19607843, b: 0.19607843, a: 1} + m_RaycastTarget: 1 + m_RaycastPadding: {x: 0, y: 0, z: 0, w: 0} + m_Maskable: 1 + m_OnCullStateChanged: + m_PersistentCalls: + m_Calls: [] + m_FontData: + m_Font: {fileID: 10102, guid: 0000000000000000e000000000000000, type: 0} + m_FontSize: 48 + m_FontStyle: 0 + m_BestFit: 0 + m_MinSize: 4 + m_MaxSize: 48 + m_Alignment: 4 + m_AlignByGeometry: 0 + m_RichText: 1 + m_HorizontalOverflow: 0 + m_VerticalOverflow: 0 + m_LineSpacing: 1 + m_Text: Buy No Ads +--- !u!1 &1240445629995664445 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 1240445629995664446} + - component: {fileID: 1240445629995664441} + - component: {fileID: 1240445629995664440} + - component: {fileID: 1240445629995664447} + m_Layer: 5 + m_Name: Event02Button + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!224 &1240445629995664446 +RectTransform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1240445629995664445} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: 0, y: 0, z: 0} + m_LocalScale: {x: 1, y: 1, z: 1} + m_ConstrainProportionsScale: 0 + m_Children: + - {fileID: 1240445629872685082} + m_Father: {fileID: 1240445629906932932} + m_RootOrder: 2 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} + m_AnchorMin: {x: 0.5, y: 0.5} + m_AnchorMax: {x: 0.5, y: 0.5} + m_AnchoredPosition: {x: 2, y: 58} + m_SizeDelta: {x: 400, y: 120} + m_Pivot: {x: 0, y: 0.5} +--- !u!222 &1240445629995664441 +CanvasRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1240445629995664445} + m_CullTransparentMesh: 1 +--- !u!114 &1240445629995664440 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1240445629995664445} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: fe87c0e1cc204ed48ad3b37840f39efc, type: 3} + m_Name: + m_EditorClassIdentifier: + m_Material: {fileID: 0} + m_Color: {r: 1, g: 1, b: 1, a: 1} + m_RaycastTarget: 1 + m_RaycastPadding: {x: 0, y: 0, z: 0, w: 0} + m_Maskable: 1 + m_OnCullStateChanged: + m_PersistentCalls: + m_Calls: [] + m_Sprite: {fileID: 10905, guid: 0000000000000000f000000000000000, type: 0} + m_Type: 1 + m_PreserveAspect: 0 + m_FillCenter: 1 + m_FillMethod: 4 + m_FillAmount: 1 + m_FillClockwise: 1 + m_FillOrigin: 0 + m_UseSpriteMesh: 0 + m_PixelsPerUnitMultiplier: 1 +--- !u!114 &1240445629995664447 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1240445629995664445} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 4e29b1a8efbd4b44bb3f3716e73f07ff, type: 3} + m_Name: + m_EditorClassIdentifier: + m_Navigation: + m_Mode: 3 + m_WrapAround: 0 + m_SelectOnUp: {fileID: 0} + m_SelectOnDown: {fileID: 0} + m_SelectOnLeft: {fileID: 0} + m_SelectOnRight: {fileID: 0} + m_Transition: 1 + m_Colors: + m_NormalColor: {r: 1, g: 1, b: 1, a: 1} + m_HighlightedColor: {r: 0.9607843, g: 0.9607843, b: 0.9607843, a: 1} + m_PressedColor: {r: 0.78431374, g: 0.78431374, b: 0.78431374, a: 1} + m_SelectedColor: {r: 0.9607843, g: 0.9607843, b: 0.9607843, a: 1} + m_DisabledColor: {r: 0.78431374, g: 0.78431374, b: 0.78431374, a: 0.5019608} + m_ColorMultiplier: 1 + m_FadeDuration: 0.1 + m_SpriteState: + m_HighlightedSprite: {fileID: 0} + m_PressedSprite: {fileID: 0} + m_SelectedSprite: {fileID: 0} + m_DisabledSprite: {fileID: 0} + m_AnimationTriggers: + m_NormalTrigger: Normal + m_HighlightedTrigger: Highlighted + m_PressedTrigger: Pressed + m_SelectedTrigger: Selected + m_DisabledTrigger: Disabled + m_Interactable: 1 + m_TargetGraphic: {fileID: 1240445629995664440} + m_OnClick: + m_PersistentCalls: + m_Calls: + - m_Target: {fileID: 7348458583946661662} + m_TargetAssemblyTypeName: HCDemoScene, Assembly-CSharp + m_MethodName: Button_Event02 + m_Mode: 1 + m_Arguments: + m_ObjectArgument: {fileID: 0} + m_ObjectArgumentAssemblyTypeName: UnityEngine.Object, UnityEngine + m_IntArgument: 0 + m_FloatArgument: 0 + m_StringArgument: + m_BoolArgument: 0 + m_CallState: 2 +--- !u!1 &1240445630052331320 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 1240445630052331321} + - component: {fileID: 1240445630052331323} + - component: {fileID: 1240445630052331322} + m_Layer: 5 + m_Name: Text + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!224 &1240445630052331321 +RectTransform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1240445630052331320} + m_LocalRotation: {x: -0, y: -0, z: -0, w: 1} + m_LocalPosition: {x: 0, y: 0, z: 0} + m_LocalScale: {x: 1, y: 1, z: 1} + m_ConstrainProportionsScale: 0 + m_Children: [] + m_Father: {fileID: 1240445630207821380} + m_RootOrder: 0 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} + m_AnchorMin: {x: 0, y: 0} + m_AnchorMax: {x: 1, y: 1} + m_AnchoredPosition: {x: 0, y: 0} + m_SizeDelta: {x: 0, y: 0} + m_Pivot: {x: 0.5, y: 0.5} +--- !u!222 &1240445630052331323 +CanvasRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1240445630052331320} + m_CullTransparentMesh: 1 +--- !u!114 &1240445630052331322 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1240445630052331320} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 5f7201a12d95ffc409449d95f23cf332, type: 3} + m_Name: + m_EditorClassIdentifier: + m_Material: {fileID: 0} + m_Color: {r: 0.19607843, g: 0.19607843, b: 0.19607843, a: 1} + m_RaycastTarget: 1 + m_RaycastPadding: {x: 0, y: 0, z: 0, w: 0} + m_Maskable: 1 + m_OnCullStateChanged: + m_PersistentCalls: + m_Calls: [] + m_FontData: + m_Font: {fileID: 10102, guid: 0000000000000000e000000000000000, type: 0} + m_FontSize: 48 + m_FontStyle: 0 + m_BestFit: 0 + m_MinSize: 4 + m_MaxSize: 48 + m_Alignment: 4 + m_AlignByGeometry: 0 + m_RichText: 1 + m_HorizontalOverflow: 0 + m_VerticalOverflow: 0 + m_LineSpacing: 1 + m_Text: IV1 +--- !u!1 &1240445630084410287 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 1240445630084410280} + - component: {fileID: 1240445630084410282} + - component: {fileID: 1240445630084410281} + m_Layer: 5 + m_Name: Text + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!224 &1240445630084410280 +RectTransform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1240445630084410287} + m_LocalRotation: {x: -0, y: -0, z: -0, w: 1} + m_LocalPosition: {x: 0, y: 0, z: 0} + m_LocalScale: {x: 1, y: 1, z: 1} + m_ConstrainProportionsScale: 0 + m_Children: [] + m_Father: {fileID: 1240445630210680887} + m_RootOrder: 0 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} + m_AnchorMin: {x: 0, y: 0} + m_AnchorMax: {x: 1, y: 1} + m_AnchoredPosition: {x: 0, y: 0} + m_SizeDelta: {x: 0, y: 0} + m_Pivot: {x: 0.5, y: 0.5} +--- !u!222 &1240445630084410282 +CanvasRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1240445630084410287} + m_CullTransparentMesh: 1 +--- !u!114 &1240445630084410281 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1240445630084410287} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 5f7201a12d95ffc409449d95f23cf332, type: 3} + m_Name: + m_EditorClassIdentifier: + m_Material: {fileID: 0} + m_Color: {r: 0.19607843, g: 0.19607843, b: 0.19607843, a: 1} + m_RaycastTarget: 1 + m_RaycastPadding: {x: 0, y: 0, z: 0, w: 0} + m_Maskable: 1 + m_OnCullStateChanged: + m_PersistentCalls: + m_Calls: [] + m_FontData: + m_Font: {fileID: 10102, guid: 0000000000000000e000000000000000, type: 0} + m_FontSize: 48 + m_FontStyle: 0 + m_BestFit: 0 + m_MinSize: 4 + m_MaxSize: 48 + m_Alignment: 4 + m_AlignByGeometry: 0 + m_RichText: 1 + m_HorizontalOverflow: 0 + m_VerticalOverflow: 0 + m_LineSpacing: 1 + m_Text: InitSDK +--- !u!1 &1240445630128938443 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 1240445630128938484} + - component: {fileID: 1240445630128938486} + - component: {fileID: 1240445630128938485} + m_Layer: 5 + m_Name: Text + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!224 &1240445630128938484 +RectTransform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1240445630128938443} + m_LocalRotation: {x: -0, y: -0, z: -0, w: 1} + m_LocalPosition: {x: 0, y: 0, z: 0} + m_LocalScale: {x: 1, y: 1, z: 1} + m_ConstrainProportionsScale: 0 + m_Children: [] + m_Father: {fileID: 1240445629766085277} + m_RootOrder: 0 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} + m_AnchorMin: {x: 0, y: 0} + m_AnchorMax: {x: 1, y: 1} + m_AnchoredPosition: {x: 0, y: 0} + m_SizeDelta: {x: 0, y: 0} + m_Pivot: {x: 0.5, y: 0.5} +--- !u!222 &1240445630128938486 +CanvasRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1240445630128938443} + m_CullTransparentMesh: 1 +--- !u!114 &1240445630128938485 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1240445630128938443} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 5f7201a12d95ffc409449d95f23cf332, type: 3} + m_Name: + m_EditorClassIdentifier: + m_Material: {fileID: 0} + m_Color: {r: 0.19607843, g: 0.19607843, b: 0.19607843, a: 1} + m_RaycastTarget: 1 + m_RaycastPadding: {x: 0, y: 0, z: 0, w: 0} + m_Maskable: 1 + m_OnCullStateChanged: + m_PersistentCalls: + m_Calls: [] + m_FontData: + m_Font: {fileID: 10102, guid: 0000000000000000e000000000000000, type: 0} + m_FontSize: 48 + m_FontStyle: 0 + m_BestFit: 0 + m_MinSize: 4 + m_MaxSize: 48 + m_Alignment: 4 + m_AlignByGeometry: 0 + m_RichText: 1 + m_HorizontalOverflow: 0 + m_VerticalOverflow: 0 + m_LineSpacing: 1 + m_Text: RV +--- !u!1 &1240445630143173264 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 1240445630143173265} + - component: {fileID: 1240445630143173267} + - component: {fileID: 1240445630143173266} + m_Layer: 5 + m_Name: Text + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!224 &1240445630143173265 +RectTransform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1240445630143173264} + m_LocalRotation: {x: -0, y: -0, z: -0, w: 1} + m_LocalPosition: {x: 0, y: 0, z: 0} + m_LocalScale: {x: 1, y: 1, z: 1} + m_ConstrainProportionsScale: 0 + m_Children: [] + m_Father: {fileID: 1240445628485939833} + m_RootOrder: 0 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} + m_AnchorMin: {x: 0, y: 0} + m_AnchorMax: {x: 1, y: 1} + m_AnchoredPosition: {x: 0, y: 0} + m_SizeDelta: {x: 0, y: 0} + m_Pivot: {x: 0.5, y: 0.5} +--- !u!222 &1240445630143173267 +CanvasRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1240445630143173264} + m_CullTransparentMesh: 1 +--- !u!114 &1240445630143173266 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1240445630143173264} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 5f7201a12d95ffc409449d95f23cf332, type: 3} + m_Name: + m_EditorClassIdentifier: + m_Material: {fileID: 0} + m_Color: {r: 0.19607843, g: 0.19607843, b: 0.19607843, a: 1} + m_RaycastTarget: 1 + m_RaycastPadding: {x: 0, y: 0, z: 0, w: 0} + m_Maskable: 1 + m_OnCullStateChanged: + m_PersistentCalls: + m_Calls: [] + m_FontData: + m_Font: {fileID: 10102, guid: 0000000000000000e000000000000000, type: 0} + m_FontSize: 48 + m_FontStyle: 0 + m_BestFit: 0 + m_MinSize: 4 + m_MaxSize: 48 + m_Alignment: 4 + m_AlignByGeometry: 0 + m_RichText: 1 + m_HorizontalOverflow: 0 + m_VerticalOverflow: 0 + m_LineSpacing: 1 + m_Text: ShowLoginScreen +--- !u!1 &1240445630207821403 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 1240445630207821380} + - component: {fileID: 1240445630207821383} + - component: {fileID: 1240445630207821382} + - component: {fileID: 1240445630207821381} + m_Layer: 5 + m_Name: IV1Button + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!224 &1240445630207821380 +RectTransform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1240445630207821403} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: 0, y: 0, z: 0} + m_LocalScale: {x: 1, y: 1, z: 1} + m_ConstrainProportionsScale: 0 + m_Children: + - {fileID: 1240445630052331321} + m_Father: {fileID: 1240445629039028095} + m_RootOrder: 1 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} + m_AnchorMin: {x: 0.5, y: 0.5} + m_AnchorMax: {x: 0.5, y: 0.5} + m_AnchoredPosition: {x: -469, y: 353.00006} + m_SizeDelta: {x: 200, y: 120} + m_Pivot: {x: 0, y: 0.5} +--- !u!222 &1240445630207821383 +CanvasRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1240445630207821403} + m_CullTransparentMesh: 1 +--- !u!114 &1240445630207821382 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1240445630207821403} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: fe87c0e1cc204ed48ad3b37840f39efc, type: 3} + m_Name: + m_EditorClassIdentifier: + m_Material: {fileID: 0} + m_Color: {r: 1, g: 1, b: 1, a: 1} + m_RaycastTarget: 1 + m_RaycastPadding: {x: 0, y: 0, z: 0, w: 0} + m_Maskable: 1 + m_OnCullStateChanged: + m_PersistentCalls: + m_Calls: [] + m_Sprite: {fileID: 10905, guid: 0000000000000000f000000000000000, type: 0} + m_Type: 1 + m_PreserveAspect: 0 + m_FillCenter: 1 + m_FillMethod: 4 + m_FillAmount: 1 + m_FillClockwise: 1 + m_FillOrigin: 0 + m_UseSpriteMesh: 0 + m_PixelsPerUnitMultiplier: 1 +--- !u!114 &1240445630207821381 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1240445630207821403} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 4e29b1a8efbd4b44bb3f3716e73f07ff, type: 3} + m_Name: + m_EditorClassIdentifier: + m_Navigation: + m_Mode: 3 + m_WrapAround: 0 + m_SelectOnUp: {fileID: 0} + m_SelectOnDown: {fileID: 0} + m_SelectOnLeft: {fileID: 0} + m_SelectOnRight: {fileID: 0} + m_Transition: 1 + m_Colors: + m_NormalColor: {r: 1, g: 1, b: 1, a: 1} + m_HighlightedColor: {r: 0.9607843, g: 0.9607843, b: 0.9607843, a: 1} + m_PressedColor: {r: 0.78431374, g: 0.78431374, b: 0.78431374, a: 1} + m_SelectedColor: {r: 0.9607843, g: 0.9607843, b: 0.9607843, a: 1} + m_DisabledColor: {r: 0.78431374, g: 0.78431374, b: 0.78431374, a: 0.5019608} + m_ColorMultiplier: 1 + m_FadeDuration: 0.1 + m_SpriteState: + m_HighlightedSprite: {fileID: 0} + m_PressedSprite: {fileID: 0} + m_SelectedSprite: {fileID: 0} + m_DisabledSprite: {fileID: 0} + m_AnimationTriggers: + m_NormalTrigger: Normal + m_HighlightedTrigger: Highlighted + m_PressedTrigger: Pressed + m_SelectedTrigger: Selected + m_DisabledTrigger: Disabled + m_Interactable: 1 + m_TargetGraphic: {fileID: 1240445630207821382} + m_OnClick: + m_PersistentCalls: + m_Calls: + - m_Target: {fileID: 7348458583946661662} + m_TargetAssemblyTypeName: HCDemoScene, Assembly-CSharp + m_MethodName: Button_ShowIV1 + m_Mode: 1 + m_Arguments: + m_ObjectArgument: {fileID: 0} + m_ObjectArgumentAssemblyTypeName: UnityEngine.Object, UnityEngine + m_IntArgument: 0 + m_FloatArgument: 0 + m_StringArgument: + m_BoolArgument: 0 + m_CallState: 2 +--- !u!1 &1240445630210680886 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 1240445630210680887} + - component: {fileID: 1240445630210680882} + - component: {fileID: 1240445630210680881} + - component: {fileID: 1240445630210680880} + m_Layer: 5 + m_Name: InitButton + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!224 &1240445630210680887 +RectTransform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1240445630210680886} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: 0, y: 0, z: 0} + m_LocalScale: {x: 1, y: 1, z: 1} + m_ConstrainProportionsScale: 0 + m_Children: + - {fileID: 1240445630084410280} + m_Father: {fileID: 1240445629789692595} + m_RootOrder: 1 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} + m_AnchorMin: {x: 0.5, y: 0.5} + m_AnchorMax: {x: 0.5, y: 0.5} + m_AnchoredPosition: {x: -478, y: -44} + m_SizeDelta: {x: 400, y: 120} + m_Pivot: {x: 0, y: 0.5} +--- !u!222 &1240445630210680882 +CanvasRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1240445630210680886} + m_CullTransparentMesh: 1 +--- !u!114 &1240445630210680881 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1240445630210680886} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: fe87c0e1cc204ed48ad3b37840f39efc, type: 3} + m_Name: + m_EditorClassIdentifier: + m_Material: {fileID: 0} + m_Color: {r: 1, g: 1, b: 1, a: 1} + m_RaycastTarget: 1 + m_RaycastPadding: {x: 0, y: 0, z: 0, w: 0} + m_Maskable: 1 + m_OnCullStateChanged: + m_PersistentCalls: + m_Calls: [] + m_Sprite: {fileID: 10905, guid: 0000000000000000f000000000000000, type: 0} + m_Type: 1 + m_PreserveAspect: 0 + m_FillCenter: 1 + m_FillMethod: 4 + m_FillAmount: 1 + m_FillClockwise: 1 + m_FillOrigin: 0 + m_UseSpriteMesh: 0 + m_PixelsPerUnitMultiplier: 1 +--- !u!114 &1240445630210680880 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1240445630210680886} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 4e29b1a8efbd4b44bb3f3716e73f07ff, type: 3} + m_Name: + m_EditorClassIdentifier: + m_Navigation: + m_Mode: 3 + m_WrapAround: 0 + m_SelectOnUp: {fileID: 0} + m_SelectOnDown: {fileID: 0} + m_SelectOnLeft: {fileID: 0} + m_SelectOnRight: {fileID: 0} + m_Transition: 1 + m_Colors: + m_NormalColor: {r: 1, g: 1, b: 1, a: 1} + m_HighlightedColor: {r: 0.9607843, g: 0.9607843, b: 0.9607843, a: 1} + m_PressedColor: {r: 0.78431374, g: 0.78431374, b: 0.78431374, a: 1} + m_SelectedColor: {r: 0.9607843, g: 0.9607843, b: 0.9607843, a: 1} + m_DisabledColor: {r: 0.78431374, g: 0.78431374, b: 0.78431374, a: 0.5019608} + m_ColorMultiplier: 1 + m_FadeDuration: 0.1 + m_SpriteState: + m_HighlightedSprite: {fileID: 0} + m_PressedSprite: {fileID: 0} + m_SelectedSprite: {fileID: 0} + m_DisabledSprite: {fileID: 0} + m_AnimationTriggers: + m_NormalTrigger: Normal + m_HighlightedTrigger: Highlighted + m_PressedTrigger: Pressed + m_SelectedTrigger: Selected + m_DisabledTrigger: Disabled + m_Interactable: 1 + m_TargetGraphic: {fileID: 1240445630210680881} + m_OnClick: + m_PersistentCalls: + m_Calls: + - m_Target: {fileID: 7348458583946661662} + m_TargetAssemblyTypeName: HCDemoScene, Assembly-CSharp + m_MethodName: Button_InitSDK + m_Mode: 1 + m_Arguments: + m_ObjectArgument: {fileID: 0} + m_ObjectArgumentAssemblyTypeName: UnityEngine.Object, UnityEngine + m_IntArgument: 0 + m_FloatArgument: 0 + m_StringArgument: + m_BoolArgument: 0 + m_CallState: 2 +--- !u!1 &1255958034328456631 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 73467314029594367} + - component: {fileID: 7106810916337303689} + - component: {fileID: 6024226398485925007} + m_Layer: 5 + m_Name: Line + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!224 &73467314029594367 +RectTransform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1255958034328456631} + m_LocalRotation: {x: -0, y: -0, z: -0, w: 1} + m_LocalPosition: {x: 0, y: 0, z: 0} + m_LocalScale: {x: 1, y: 1, z: 1} + m_ConstrainProportionsScale: 0 + m_Children: [] + m_Father: {fileID: 1240445628202320349} + m_RootOrder: 12 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} + m_AnchorMin: {x: 0, y: 0} + m_AnchorMax: {x: 0, y: 0} + m_AnchoredPosition: {x: 0, y: 0} + m_SizeDelta: {x: 1080, y: 12} + m_Pivot: {x: 0.5, y: 0.5} +--- !u!222 &7106810916337303689 +CanvasRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1255958034328456631} + m_CullTransparentMesh: 1 +--- !u!114 &6024226398485925007 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1255958034328456631} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: fe87c0e1cc204ed48ad3b37840f39efc, type: 3} + m_Name: + m_EditorClassIdentifier: + m_Material: {fileID: 0} + m_Color: {r: 0.3759642, g: 0.4339623, b: 0.34184766, a: 1} + m_RaycastTarget: 1 + m_RaycastPadding: {x: 0, y: 0, z: 0, w: 0} + m_Maskable: 1 + m_OnCullStateChanged: + m_PersistentCalls: + m_Calls: [] + m_Sprite: {fileID: 0} + m_Type: 0 + m_PreserveAspect: 0 + m_FillCenter: 1 + m_FillMethod: 4 + m_FillAmount: 1 + m_FillClockwise: 1 + m_FillOrigin: 0 + m_UseSpriteMesh: 0 + m_PixelsPerUnitMultiplier: 1 +--- !u!1 &1525270119869748011 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 2386732006083139689} + - component: {fileID: 8612463086539082651} + - component: {fileID: 4077446805441556591} + m_Layer: 5 + m_Name: Text + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!224 &2386732006083139689 +RectTransform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1525270119869748011} + m_LocalRotation: {x: -0, y: -0, z: -0, w: 1} + m_LocalPosition: {x: 0, y: 0, z: 0} + m_LocalScale: {x: 1, y: 1, z: 1} + m_ConstrainProportionsScale: 0 + m_Children: [] + m_Father: {fileID: 3223175518735522177} + m_RootOrder: 0 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} + m_AnchorMin: {x: 0, y: 0} + m_AnchorMax: {x: 1, y: 1} + m_AnchoredPosition: {x: 0, y: 0} + m_SizeDelta: {x: 0, y: 0} + m_Pivot: {x: 0.5, y: 0.5} +--- !u!222 &8612463086539082651 +CanvasRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1525270119869748011} + m_CullTransparentMesh: 1 +--- !u!114 &4077446805441556591 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1525270119869748011} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 5f7201a12d95ffc409449d95f23cf332, type: 3} + m_Name: + m_EditorClassIdentifier: + m_Material: {fileID: 0} + m_Color: {r: 0.19607843, g: 0.19607843, b: 0.19607843, a: 1} + m_RaycastTarget: 1 + m_RaycastPadding: {x: 0, y: 0, z: 0, w: 0} + m_Maskable: 1 + m_OnCullStateChanged: + m_PersistentCalls: + m_Calls: [] + m_FontData: + m_Font: {fileID: 10102, guid: 0000000000000000e000000000000000, type: 0} + m_FontSize: 48 + m_FontStyle: 0 + m_BestFit: 0 + m_MinSize: 4 + m_MaxSize: 48 + m_Alignment: 4 + m_AlignByGeometry: 0 + m_RichText: 1 + m_HorizontalOverflow: 0 + m_VerticalOverflow: 0 + m_LineSpacing: 1 + m_Text: Native3 +--- !u!1 &1829999966303394074 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 2504313023457929693} + - component: {fileID: 1978686554136529874} + - component: {fileID: 6275270648732856470} + - component: {fileID: 669955869336378224} + m_Layer: 5 + m_Name: NativeButton + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!224 &2504313023457929693 +RectTransform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1829999966303394074} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: 0, y: 0, z: 0} + m_LocalScale: {x: 1, y: 1, z: 1} + m_ConstrainProportionsScale: 0 + m_Children: + - {fileID: 3917181213187945007} + m_Father: {fileID: 1240445629039028095} + m_RootOrder: 10 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} + m_AnchorMin: {x: 0.5, y: 0.5} + m_AnchorMax: {x: 0.5, y: 0.5} + m_AnchoredPosition: {x: -467, y: -122.999985} + m_SizeDelta: {x: 400, y: 120} + m_Pivot: {x: 0, y: 0.5} +--- !u!222 &1978686554136529874 +CanvasRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1829999966303394074} + m_CullTransparentMesh: 1 +--- !u!114 &6275270648732856470 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1829999966303394074} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: fe87c0e1cc204ed48ad3b37840f39efc, type: 3} + m_Name: + m_EditorClassIdentifier: + m_Material: {fileID: 0} + m_Color: {r: 1, g: 1, b: 1, a: 1} + m_RaycastTarget: 1 + m_RaycastPadding: {x: 0, y: 0, z: 0, w: 0} + m_Maskable: 1 + m_OnCullStateChanged: + m_PersistentCalls: + m_Calls: [] + m_Sprite: {fileID: 10905, guid: 0000000000000000f000000000000000, type: 0} + m_Type: 1 + m_PreserveAspect: 0 + m_FillCenter: 1 + m_FillMethod: 4 + m_FillAmount: 1 + m_FillClockwise: 1 + m_FillOrigin: 0 + m_UseSpriteMesh: 0 + m_PixelsPerUnitMultiplier: 1 +--- !u!114 &669955869336378224 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1829999966303394074} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 4e29b1a8efbd4b44bb3f3716e73f07ff, type: 3} + m_Name: + m_EditorClassIdentifier: + m_Navigation: + m_Mode: 3 + m_WrapAround: 0 + m_SelectOnUp: {fileID: 0} + m_SelectOnDown: {fileID: 0} + m_SelectOnLeft: {fileID: 0} + m_SelectOnRight: {fileID: 0} + m_Transition: 1 + m_Colors: + m_NormalColor: {r: 1, g: 1, b: 1, a: 1} + m_HighlightedColor: {r: 0.9607843, g: 0.9607843, b: 0.9607843, a: 1} + m_PressedColor: {r: 0.78431374, g: 0.78431374, b: 0.78431374, a: 1} + m_SelectedColor: {r: 0.9607843, g: 0.9607843, b: 0.9607843, a: 1} + m_DisabledColor: {r: 0.78431374, g: 0.78431374, b: 0.78431374, a: 0.5019608} + m_ColorMultiplier: 1 + m_FadeDuration: 0.1 + m_SpriteState: + m_HighlightedSprite: {fileID: 0} + m_PressedSprite: {fileID: 0} + m_SelectedSprite: {fileID: 0} + m_DisabledSprite: {fileID: 0} + m_AnimationTriggers: + m_NormalTrigger: Normal + m_HighlightedTrigger: Highlighted + m_PressedTrigger: Pressed + m_SelectedTrigger: Selected + m_DisabledTrigger: Disabled + m_Interactable: 1 + m_TargetGraphic: {fileID: 6275270648732856470} + m_OnClick: + m_PersistentCalls: + m_Calls: + - m_Target: {fileID: 7348458583946661662} + m_TargetAssemblyTypeName: HCDemoScene, Assembly-CSharp + m_MethodName: Button_ShowNative_2 + m_Mode: 1 + m_Arguments: + m_ObjectArgument: {fileID: 0} + m_ObjectArgumentAssemblyTypeName: UnityEngine.Object, UnityEngine + m_IntArgument: 0 + m_FloatArgument: 0 + m_StringArgument: + m_BoolArgument: 0 + m_CallState: 2 +--- !u!1 &2045659930158435966 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 705544146933374672} + - component: {fileID: 6491327741198211826} + - component: {fileID: 8903829026316105647} + m_Layer: 5 + m_Name: Text + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!224 &705544146933374672 +RectTransform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 2045659930158435966} + m_LocalRotation: {x: -0, y: -0, z: -0, w: 1} + m_LocalPosition: {x: 0, y: 0, z: 0} + m_LocalScale: {x: 1, y: 1, z: 1} + m_ConstrainProportionsScale: 0 + m_Children: [] + m_Father: {fileID: 3116041821519604338} + m_RootOrder: 0 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} + m_AnchorMin: {x: 0, y: 0} + m_AnchorMax: {x: 1, y: 1} + m_AnchoredPosition: {x: 0, y: 0} + m_SizeDelta: {x: 0, y: 0} + m_Pivot: {x: 0.5, y: 0.5} +--- !u!222 &6491327741198211826 +CanvasRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 2045659930158435966} + m_CullTransparentMesh: 1 +--- !u!114 &8903829026316105647 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 2045659930158435966} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 5f7201a12d95ffc409449d95f23cf332, type: 3} + m_Name: + m_EditorClassIdentifier: + m_Material: {fileID: 0} + m_Color: {r: 0.19607843, g: 0.19607843, b: 0.19607843, a: 1} + m_RaycastTarget: 1 + m_RaycastPadding: {x: 0, y: 0, z: 0, w: 0} + m_Maskable: 1 + m_OnCullStateChanged: + m_PersistentCalls: + m_Calls: [] + m_FontData: + m_Font: {fileID: 10102, guid: 0000000000000000e000000000000000, type: 0} + m_FontSize: 48 + m_FontStyle: 0 + m_BestFit: 0 + m_MinSize: 4 + m_MaxSize: 48 + m_Alignment: 4 + m_AlignByGeometry: 0 + m_RichText: 1 + m_HorizontalOverflow: 0 + m_VerticalOverflow: 0 + m_LineSpacing: 1 + m_Text: HideNative2 +--- !u!1 &2089699687344190817 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 4256443865166052869} + - component: {fileID: 5789222563759495785} + - component: {fileID: 8233485366272033738} + m_Layer: 5 + m_Name: TitleText + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!224 &4256443865166052869 +RectTransform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 2089699687344190817} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: 0, y: 0, z: 0} + m_LocalScale: {x: 1, y: 1, z: 1} + m_ConstrainProportionsScale: 0 + m_Children: [] + m_Father: {fileID: 4650141467237551916} + m_RootOrder: 0 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} + m_AnchorMin: {x: 0.5, y: 0.5} + m_AnchorMax: {x: 0.5, y: 0.5} + m_AnchoredPosition: {x: -465, y: 178} + m_SizeDelta: {x: 238.4239, y: 54.8398} + m_Pivot: {x: 0, y: 0.5} +--- !u!222 &5789222563759495785 +CanvasRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 2089699687344190817} + m_CullTransparentMesh: 1 +--- !u!114 &8233485366272033738 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 2089699687344190817} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 5f7201a12d95ffc409449d95f23cf332, type: 3} + m_Name: + m_EditorClassIdentifier: + m_Material: {fileID: 0} + m_Color: {r: 0.19607843, g: 0.19607843, b: 0.19607843, a: 1} + m_RaycastTarget: 1 + m_RaycastPadding: {x: 0, y: 0, z: 0, w: 0} + m_Maskable: 1 + m_OnCullStateChanged: + m_PersistentCalls: + m_Calls: [] + m_FontData: + m_Font: {fileID: 10102, guid: 0000000000000000e000000000000000, type: 0} + m_FontSize: 48 + m_FontStyle: 1 + m_BestFit: 0 + m_MinSize: 3 + m_MaxSize: 48 + m_Alignment: 0 + m_AlignByGeometry: 0 + m_RichText: 1 + m_HorizontalOverflow: 0 + m_VerticalOverflow: 0 + m_LineSpacing: 1 + m_Text: douyin-Record +--- !u!1 &2128027199366383981 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 5877652753891351603} + - component: {fileID: 231391302334279939} + - component: {fileID: 469321775334204044} + - component: {fileID: 4299325726265023591} + m_Layer: 5 + m_Name: Event04Button + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!224 &5877652753891351603 +RectTransform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 2128027199366383981} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: 0, y: 0, z: 0} + m_LocalScale: {x: 1, y: 1, z: 1} + m_ConstrainProportionsScale: 0 + m_Children: + - {fileID: 6316302514725709722} + m_Father: {fileID: 1240445629906932932} + m_RootOrder: 4 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} + m_AnchorMin: {x: 0.5, y: 0.5} + m_AnchorMax: {x: 0.5, y: 0.5} + m_AnchoredPosition: {x: 1, y: -82} + m_SizeDelta: {x: 400, y: 120} + m_Pivot: {x: 0, y: 0.5} +--- !u!222 &231391302334279939 +CanvasRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 2128027199366383981} + m_CullTransparentMesh: 1 +--- !u!114 &469321775334204044 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 2128027199366383981} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: fe87c0e1cc204ed48ad3b37840f39efc, type: 3} + m_Name: + m_EditorClassIdentifier: + m_Material: {fileID: 0} + m_Color: {r: 1, g: 1, b: 1, a: 1} + m_RaycastTarget: 1 + m_RaycastPadding: {x: 0, y: 0, z: 0, w: 0} + m_Maskable: 1 + m_OnCullStateChanged: + m_PersistentCalls: + m_Calls: [] + m_Sprite: {fileID: 10905, guid: 0000000000000000f000000000000000, type: 0} + m_Type: 1 + m_PreserveAspect: 0 + m_FillCenter: 1 + m_FillMethod: 4 + m_FillAmount: 1 + m_FillClockwise: 1 + m_FillOrigin: 0 + m_UseSpriteMesh: 0 + m_PixelsPerUnitMultiplier: 1 +--- !u!114 &4299325726265023591 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 2128027199366383981} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 4e29b1a8efbd4b44bb3f3716e73f07ff, type: 3} + m_Name: + m_EditorClassIdentifier: + m_Navigation: + m_Mode: 3 + m_WrapAround: 0 + m_SelectOnUp: {fileID: 0} + m_SelectOnDown: {fileID: 0} + m_SelectOnLeft: {fileID: 0} + m_SelectOnRight: {fileID: 0} + m_Transition: 1 + m_Colors: + m_NormalColor: {r: 1, g: 1, b: 1, a: 1} + m_HighlightedColor: {r: 0.9607843, g: 0.9607843, b: 0.9607843, a: 1} + m_PressedColor: {r: 0.78431374, g: 0.78431374, b: 0.78431374, a: 1} + m_SelectedColor: {r: 0.9607843, g: 0.9607843, b: 0.9607843, a: 1} + m_DisabledColor: {r: 0.78431374, g: 0.78431374, b: 0.78431374, a: 0.5019608} + m_ColorMultiplier: 1 + m_FadeDuration: 0.1 + m_SpriteState: + m_HighlightedSprite: {fileID: 0} + m_PressedSprite: {fileID: 0} + m_SelectedSprite: {fileID: 0} + m_DisabledSprite: {fileID: 0} + m_AnimationTriggers: + m_NormalTrigger: Normal + m_HighlightedTrigger: Highlighted + m_PressedTrigger: Pressed + m_SelectedTrigger: Selected + m_DisabledTrigger: Disabled + m_Interactable: 1 + m_TargetGraphic: {fileID: 469321775334204044} + m_OnClick: + m_PersistentCalls: + m_Calls: + - m_Target: {fileID: 7348458583946661662} + m_TargetAssemblyTypeName: HCDemoScene, Assembly-CSharp + m_MethodName: Button_GetAdjustInfo + m_Mode: 1 + m_Arguments: + m_ObjectArgument: {fileID: 0} + m_ObjectArgumentAssemblyTypeName: UnityEngine.Object, UnityEngine + m_IntArgument: 0 + m_FloatArgument: 0 + m_StringArgument: + m_BoolArgument: 0 + m_CallState: 2 +--- !u!1 &2130070605273890109 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 591582440344992329} + m_Layer: 5 + m_Name: Share + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!224 &591582440344992329 +RectTransform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 2130070605273890109} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: 0, y: 0, z: 0} + m_LocalScale: {x: 1, y: 1, z: 1} + m_ConstrainProportionsScale: 0 + m_Children: + - {fileID: 6549588200963992483} + - {fileID: 7309820859639243390} + m_Father: {fileID: 1240445628202320349} + m_RootOrder: 11 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} + m_AnchorMin: {x: 0, y: 0} + m_AnchorMax: {x: 0, y: 0} + m_AnchoredPosition: {x: 0, y: 0} + m_SizeDelta: {x: 1080, y: 430} + m_Pivot: {x: 0.5, y: 0.5} +--- !u!1 &2149048852680998744 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 6290292838591348200} + - component: {fileID: 7752783903590822391} + - component: {fileID: 7657696364016299544} + m_Layer: 5 + m_Name: Text + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!224 &6290292838591348200 +RectTransform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 2149048852680998744} + m_LocalRotation: {x: -0, y: -0, z: -0, w: 1} + m_LocalPosition: {x: 0, y: 0, z: 0} + m_LocalScale: {x: 1, y: 1, z: 1} + m_ConstrainProportionsScale: 0 + m_Children: [] + m_Father: {fileID: 2889643666326708838} + m_RootOrder: 0 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} + m_AnchorMin: {x: 0, y: 0} + m_AnchorMax: {x: 1, y: 1} + m_AnchoredPosition: {x: 0, y: 0} + m_SizeDelta: {x: 0, y: 0} + m_Pivot: {x: 0.5, y: 0.5} +--- !u!222 &7752783903590822391 +CanvasRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 2149048852680998744} + m_CullTransparentMesh: 1 +--- !u!114 &7657696364016299544 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 2149048852680998744} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 5f7201a12d95ffc409449d95f23cf332, type: 3} + m_Name: + m_EditorClassIdentifier: + m_Material: {fileID: 0} + m_Color: {r: 0.19607843, g: 0.19607843, b: 0.19607843, a: 1} + m_RaycastTarget: 1 + m_RaycastPadding: {x: 0, y: 0, z: 0, w: 0} + m_Maskable: 1 + m_OnCullStateChanged: + m_PersistentCalls: + m_Calls: [] + m_FontData: + m_Font: {fileID: 10102, guid: 0000000000000000e000000000000000, type: 0} + m_FontSize: 48 + m_FontStyle: 0 + m_BestFit: 0 + m_MinSize: 4 + m_MaxSize: 48 + m_Alignment: 4 + m_AlignByGeometry: 0 + m_RichText: 1 + m_HorizontalOverflow: 0 + m_VerticalOverflow: 0 + m_LineSpacing: 1 + m_Text: IV2 +--- !u!1 &2178129371675395542 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 5165712014677799799} + - component: {fileID: 182630049198719165} + - component: {fileID: 2478477408808059106} + m_Layer: 5 + m_Name: Text + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!224 &5165712014677799799 +RectTransform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 2178129371675395542} + m_LocalRotation: {x: -0, y: -0, z: -0, w: 1} + m_LocalPosition: {x: 0, y: 0, z: 0} + m_LocalScale: {x: 1, y: 1, z: 1} + m_ConstrainProportionsScale: 0 + m_Children: [] + m_Father: {fileID: 167536599284978532} + m_RootOrder: 0 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} + m_AnchorMin: {x: 0, y: 0} + m_AnchorMax: {x: 1, y: 1} + m_AnchoredPosition: {x: 0, y: 0} + m_SizeDelta: {x: 0, y: 0} + m_Pivot: {x: 0.5, y: 0.5} +--- !u!222 &182630049198719165 +CanvasRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 2178129371675395542} + m_CullTransparentMesh: 1 +--- !u!114 &2478477408808059106 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 2178129371675395542} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 5f7201a12d95ffc409449d95f23cf332, type: 3} + m_Name: + m_EditorClassIdentifier: + m_Material: {fileID: 0} + m_Color: {r: 0.19607843, g: 0.19607843, b: 0.19607843, a: 1} + m_RaycastTarget: 1 + m_RaycastPadding: {x: 0, y: 0, z: 0, w: 0} + m_Maskable: 1 + m_OnCullStateChanged: + m_PersistentCalls: + m_Calls: [] + m_FontData: + m_Font: {fileID: 10102, guid: 0000000000000000e000000000000000, type: 0} + m_FontSize: 48 + m_FontStyle: 0 + m_BestFit: 0 + m_MinSize: 4 + m_MaxSize: 48 + m_Alignment: 4 + m_AlignByGeometry: 0 + m_RichText: 1 + m_HorizontalOverflow: 0 + m_VerticalOverflow: 0 + m_LineSpacing: 1 + m_Text: 1CNY +--- !u!1 &2332886298151500704 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 3917181213187945007} + - component: {fileID: 881449656039234774} + - component: {fileID: 1254678889973099525} + m_Layer: 5 + m_Name: Text + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!224 &3917181213187945007 +RectTransform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 2332886298151500704} + m_LocalRotation: {x: -0, y: -0, z: -0, w: 1} + m_LocalPosition: {x: 0, y: 0, z: 0} + m_LocalScale: {x: 1, y: 1, z: 1} + m_ConstrainProportionsScale: 0 + m_Children: [] + m_Father: {fileID: 2504313023457929693} + m_RootOrder: 0 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} + m_AnchorMin: {x: 0, y: 0} + m_AnchorMax: {x: 1, y: 1} + m_AnchoredPosition: {x: 0, y: 0} + m_SizeDelta: {x: 0, y: 0} + m_Pivot: {x: 0.5, y: 0.5} +--- !u!222 &881449656039234774 +CanvasRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 2332886298151500704} + m_CullTransparentMesh: 1 +--- !u!114 &1254678889973099525 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 2332886298151500704} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 5f7201a12d95ffc409449d95f23cf332, type: 3} + m_Name: + m_EditorClassIdentifier: + m_Material: {fileID: 0} + m_Color: {r: 0.19607843, g: 0.19607843, b: 0.19607843, a: 1} + m_RaycastTarget: 1 + m_RaycastPadding: {x: 0, y: 0, z: 0, w: 0} + m_Maskable: 1 + m_OnCullStateChanged: + m_PersistentCalls: + m_Calls: [] + m_FontData: + m_Font: {fileID: 10102, guid: 0000000000000000e000000000000000, type: 0} + m_FontSize: 48 + m_FontStyle: 0 + m_BestFit: 0 + m_MinSize: 4 + m_MaxSize: 48 + m_Alignment: 4 + m_AlignByGeometry: 0 + m_RichText: 1 + m_HorizontalOverflow: 0 + m_VerticalOverflow: 0 + m_LineSpacing: 1 + m_Text: Native2 +--- !u!1 &2582522942413482740 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 2828476879980855506} + - component: {fileID: 1360077671512269386} + - component: {fileID: 912461059767634856} + m_Layer: 5 + m_Name: Text + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!224 &2828476879980855506 +RectTransform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 2582522942413482740} + m_LocalRotation: {x: -0, y: -0, z: -0, w: 1} + m_LocalPosition: {x: 0, y: 0, z: 0} + m_LocalScale: {x: 1, y: 1, z: 1} + m_ConstrainProportionsScale: 0 + m_Children: [] + m_Father: {fileID: 4724915981391621506} + m_RootOrder: 0 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} + m_AnchorMin: {x: 0, y: 0} + m_AnchorMax: {x: 1, y: 1} + m_AnchoredPosition: {x: 0, y: 0} + m_SizeDelta: {x: 0, y: 0} + m_Pivot: {x: 0.5, y: 0.5} +--- !u!222 &1360077671512269386 +CanvasRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 2582522942413482740} + m_CullTransparentMesh: 1 +--- !u!114 &912461059767634856 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 2582522942413482740} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 5f7201a12d95ffc409449d95f23cf332, type: 3} + m_Name: + m_EditorClassIdentifier: + m_Material: {fileID: 0} + m_Color: {r: 0.19607843, g: 0.19607843, b: 0.19607843, a: 1} + m_RaycastTarget: 1 + m_RaycastPadding: {x: 0, y: 0, z: 0, w: 0} + m_Maskable: 1 + m_OnCullStateChanged: + m_PersistentCalls: + m_Calls: [] + m_FontData: + m_Font: {fileID: 10102, guid: 0000000000000000e000000000000000, type: 0} + m_FontSize: 48 + m_FontStyle: 0 + m_BestFit: 0 + m_MinSize: 4 + m_MaxSize: 48 + m_Alignment: 4 + m_AlignByGeometry: 0 + m_RichText: 1 + m_HorizontalOverflow: 0 + m_VerticalOverflow: 0 + m_LineSpacing: 1 + m_Text: RemoveNative +--- !u!1 &2644983215803081656 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 2889643666326708838} + - component: {fileID: 4655351043276740435} + - component: {fileID: 3404519979063824433} + - component: {fileID: 1683144536445930814} + m_Layer: 5 + m_Name: IV2Button + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!224 &2889643666326708838 +RectTransform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 2644983215803081656} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: 0, y: 0, z: 0} + m_LocalScale: {x: 1, y: 1, z: 1} + m_ConstrainProportionsScale: 0 + m_Children: + - {fileID: 6290292838591348200} + m_Father: {fileID: 1240445629039028095} + m_RootOrder: 2 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} + m_AnchorMin: {x: 0.5, y: 0.5} + m_AnchorMax: {x: 0.5, y: 0.5} + m_AnchoredPosition: {x: -249, y: 353.00006} + m_SizeDelta: {x: 200, y: 120} + m_Pivot: {x: 0, y: 0.5} +--- !u!222 &4655351043276740435 +CanvasRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 2644983215803081656} + m_CullTransparentMesh: 1 +--- !u!114 &3404519979063824433 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 2644983215803081656} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: fe87c0e1cc204ed48ad3b37840f39efc, type: 3} + m_Name: + m_EditorClassIdentifier: + m_Material: {fileID: 0} + m_Color: {r: 1, g: 1, b: 1, a: 1} + m_RaycastTarget: 1 + m_RaycastPadding: {x: 0, y: 0, z: 0, w: 0} + m_Maskable: 1 + m_OnCullStateChanged: + m_PersistentCalls: + m_Calls: [] + m_Sprite: {fileID: 10905, guid: 0000000000000000f000000000000000, type: 0} + m_Type: 1 + m_PreserveAspect: 0 + m_FillCenter: 1 + m_FillMethod: 4 + m_FillAmount: 1 + m_FillClockwise: 1 + m_FillOrigin: 0 + m_UseSpriteMesh: 0 + m_PixelsPerUnitMultiplier: 1 +--- !u!114 &1683144536445930814 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 2644983215803081656} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 4e29b1a8efbd4b44bb3f3716e73f07ff, type: 3} + m_Name: + m_EditorClassIdentifier: + m_Navigation: + m_Mode: 3 + m_WrapAround: 0 + m_SelectOnUp: {fileID: 0} + m_SelectOnDown: {fileID: 0} + m_SelectOnLeft: {fileID: 0} + m_SelectOnRight: {fileID: 0} + m_Transition: 1 + m_Colors: + m_NormalColor: {r: 1, g: 1, b: 1, a: 1} + m_HighlightedColor: {r: 0.9607843, g: 0.9607843, b: 0.9607843, a: 1} + m_PressedColor: {r: 0.78431374, g: 0.78431374, b: 0.78431374, a: 1} + m_SelectedColor: {r: 0.9607843, g: 0.9607843, b: 0.9607843, a: 1} + m_DisabledColor: {r: 0.78431374, g: 0.78431374, b: 0.78431374, a: 0.5019608} + m_ColorMultiplier: 1 + m_FadeDuration: 0.1 + m_SpriteState: + m_HighlightedSprite: {fileID: 0} + m_PressedSprite: {fileID: 0} + m_SelectedSprite: {fileID: 0} + m_DisabledSprite: {fileID: 0} + m_AnimationTriggers: + m_NormalTrigger: Normal + m_HighlightedTrigger: Highlighted + m_PressedTrigger: Pressed + m_SelectedTrigger: Selected + m_DisabledTrigger: Disabled + m_Interactable: 1 + m_TargetGraphic: {fileID: 3404519979063824433} + m_OnClick: + m_PersistentCalls: + m_Calls: + - m_Target: {fileID: 7348458583946661662} + m_TargetAssemblyTypeName: HCDemoScene, Assembly-CSharp + m_MethodName: Button_ShowIV2 + m_Mode: 1 + m_Arguments: + m_ObjectArgument: {fileID: 0} + m_ObjectArgumentAssemblyTypeName: UnityEngine.Object, UnityEngine + m_IntArgument: 0 + m_FloatArgument: 0 + m_StringArgument: + m_BoolArgument: 0 + m_CallState: 2 +--- !u!1 &2898798170187373281 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 4254590187756137931} + - component: {fileID: 1917344438678946363} + - component: {fileID: 2509815607315441947} + m_Layer: 5 + m_Name: Text + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!224 &4254590187756137931 +RectTransform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 2898798170187373281} + m_LocalRotation: {x: -0, y: -0, z: -0, w: 1} + m_LocalPosition: {x: 0, y: 0, z: 0} + m_LocalScale: {x: 1, y: 1, z: 1} + m_ConstrainProportionsScale: 0 + m_Children: [] + m_Father: {fileID: 1319004118607695220} + m_RootOrder: 0 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} + m_AnchorMin: {x: 0, y: 0} + m_AnchorMax: {x: 1, y: 1} + m_AnchoredPosition: {x: 0, y: 0} + m_SizeDelta: {x: 0, y: 0} + m_Pivot: {x: 0.5, y: 0.5} +--- !u!222 &1917344438678946363 +CanvasRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 2898798170187373281} + m_CullTransparentMesh: 1 +--- !u!114 &2509815607315441947 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 2898798170187373281} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 5f7201a12d95ffc409449d95f23cf332, type: 3} + m_Name: + m_EditorClassIdentifier: + m_Material: {fileID: 0} + m_Color: {r: 0.19607843, g: 0.19607843, b: 0.19607843, a: 1} + m_RaycastTarget: 1 + m_RaycastPadding: {x: 0, y: 0, z: 0, w: 0} + m_Maskable: 1 + m_OnCullStateChanged: + m_PersistentCalls: + m_Calls: [] + m_FontData: + m_Font: {fileID: 10102, guid: 0000000000000000e000000000000000, type: 0} + m_FontSize: 48 + m_FontStyle: 0 + m_BestFit: 0 + m_MinSize: 4 + m_MaxSize: 48 + m_Alignment: 4 + m_AlignByGeometry: 0 + m_RichText: 1 + m_HorizontalOverflow: 0 + m_VerticalOverflow: 0 + m_LineSpacing: 1 + m_Text: SensitiveWord +--- !u!1 &2968277542587649970 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 5524767040267571040} + - component: {fileID: 2880363741052836253} + - component: {fileID: 6499894749239940031} + - component: {fileID: 5374432526699477846} + m_Layer: 5 + m_Name: BVButton + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!224 &5524767040267571040 +RectTransform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 2968277542587649970} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: 0, y: 0, z: 0} + m_LocalScale: {x: 1, y: 1, z: 1} + m_ConstrainProportionsScale: 0 + m_Children: + - {fileID: 3642661175399491718} + m_Father: {fileID: 1240445629039028095} + m_RootOrder: 6 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} + m_AnchorMin: {x: 0.5, y: 0.5} + m_AnchorMax: {x: 0.5, y: 0.5} + m_AnchoredPosition: {x: 6, y: 192.00006} + m_SizeDelta: {x: 400, y: 120} + m_Pivot: {x: 0, y: 0.5} +--- !u!222 &2880363741052836253 +CanvasRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 2968277542587649970} + m_CullTransparentMesh: 1 +--- !u!114 &6499894749239940031 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 2968277542587649970} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: fe87c0e1cc204ed48ad3b37840f39efc, type: 3} + m_Name: + m_EditorClassIdentifier: + m_Material: {fileID: 0} + m_Color: {r: 1, g: 1, b: 1, a: 1} + m_RaycastTarget: 1 + m_RaycastPadding: {x: 0, y: 0, z: 0, w: 0} + m_Maskable: 1 + m_OnCullStateChanged: + m_PersistentCalls: + m_Calls: [] + m_Sprite: {fileID: 10905, guid: 0000000000000000f000000000000000, type: 0} + m_Type: 1 + m_PreserveAspect: 0 + m_FillCenter: 1 + m_FillMethod: 4 + m_FillAmount: 1 + m_FillClockwise: 1 + m_FillOrigin: 0 + m_UseSpriteMesh: 0 + m_PixelsPerUnitMultiplier: 1 +--- !u!114 &5374432526699477846 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 2968277542587649970} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 4e29b1a8efbd4b44bb3f3716e73f07ff, type: 3} + m_Name: + m_EditorClassIdentifier: + m_Navigation: + m_Mode: 3 + m_WrapAround: 0 + m_SelectOnUp: {fileID: 0} + m_SelectOnDown: {fileID: 0} + m_SelectOnLeft: {fileID: 0} + m_SelectOnRight: {fileID: 0} + m_Transition: 1 + m_Colors: + m_NormalColor: {r: 1, g: 1, b: 1, a: 1} + m_HighlightedColor: {r: 0.9607843, g: 0.9607843, b: 0.9607843, a: 1} + m_PressedColor: {r: 0.78431374, g: 0.78431374, b: 0.78431374, a: 1} + m_SelectedColor: {r: 0.9607843, g: 0.9607843, b: 0.9607843, a: 1} + m_DisabledColor: {r: 0.78431374, g: 0.78431374, b: 0.78431374, a: 0.5019608} + m_ColorMultiplier: 1 + m_FadeDuration: 0.1 + m_SpriteState: + m_HighlightedSprite: {fileID: 0} + m_PressedSprite: {fileID: 0} + m_SelectedSprite: {fileID: 0} + m_DisabledSprite: {fileID: 0} + m_AnimationTriggers: + m_NormalTrigger: Normal + m_HighlightedTrigger: Highlighted + m_PressedTrigger: Pressed + m_SelectedTrigger: Selected + m_DisabledTrigger: Disabled + m_Interactable: 1 + m_TargetGraphic: {fileID: 6499894749239940031} + m_OnClick: + m_PersistentCalls: + m_Calls: + - m_Target: {fileID: 7348458583946661662} + m_TargetAssemblyTypeName: HCDemoScene, Assembly-CSharp + m_MethodName: Button_ShowBanner + m_Mode: 1 + m_Arguments: + m_ObjectArgument: {fileID: 0} + m_ObjectArgumentAssemblyTypeName: UnityEngine.Object, UnityEngine + m_IntArgument: 0 + m_FloatArgument: 0 + m_StringArgument: + m_BoolArgument: 0 + m_CallState: 2 +--- !u!1 &3052697684712606869 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 7309820859639243390} + - component: {fileID: 9148682612203608690} + - component: {fileID: 5166684066272673554} + - component: {fileID: 9211518866954110424} + m_Layer: 5 + m_Name: ShareButton + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!224 &7309820859639243390 +RectTransform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 3052697684712606869} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: 0, y: 0, z: 0} + m_LocalScale: {x: 1, y: 1, z: 1} + m_ConstrainProportionsScale: 0 + m_Children: + - {fileID: 4562240983544754487} + m_Father: {fileID: 591582440344992329} + m_RootOrder: 1 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} + m_AnchorMin: {x: 0.5, y: 0.5} + m_AnchorMax: {x: 0.5, y: 0.5} + m_AnchoredPosition: {x: -470, y: 54} + m_SizeDelta: {x: 400, y: 120} + m_Pivot: {x: 0, y: 0.5} +--- !u!222 &9148682612203608690 +CanvasRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 3052697684712606869} + m_CullTransparentMesh: 1 +--- !u!114 &5166684066272673554 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 3052697684712606869} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: fe87c0e1cc204ed48ad3b37840f39efc, type: 3} + m_Name: + m_EditorClassIdentifier: + m_Material: {fileID: 0} + m_Color: {r: 1, g: 1, b: 1, a: 1} + m_RaycastTarget: 1 + m_RaycastPadding: {x: 0, y: 0, z: 0, w: 0} + m_Maskable: 1 + m_OnCullStateChanged: + m_PersistentCalls: + m_Calls: [] + m_Sprite: {fileID: 10905, guid: 0000000000000000f000000000000000, type: 0} + m_Type: 1 + m_PreserveAspect: 0 + m_FillCenter: 1 + m_FillMethod: 4 + m_FillAmount: 1 + m_FillClockwise: 1 + m_FillOrigin: 0 + m_UseSpriteMesh: 0 + m_PixelsPerUnitMultiplier: 1 +--- !u!114 &9211518866954110424 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 3052697684712606869} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 4e29b1a8efbd4b44bb3f3716e73f07ff, type: 3} + m_Name: + m_EditorClassIdentifier: + m_Navigation: + m_Mode: 3 + m_WrapAround: 0 + m_SelectOnUp: {fileID: 0} + m_SelectOnDown: {fileID: 0} + m_SelectOnLeft: {fileID: 0} + m_SelectOnRight: {fileID: 0} + m_Transition: 1 + m_Colors: + m_NormalColor: {r: 1, g: 1, b: 1, a: 1} + m_HighlightedColor: {r: 0.9607843, g: 0.9607843, b: 0.9607843, a: 1} + m_PressedColor: {r: 0.78431374, g: 0.78431374, b: 0.78431374, a: 1} + m_SelectedColor: {r: 0.9607843, g: 0.9607843, b: 0.9607843, a: 1} + m_DisabledColor: {r: 0.78431374, g: 0.78431374, b: 0.78431374, a: 0.5019608} + m_ColorMultiplier: 1 + m_FadeDuration: 0.1 + m_SpriteState: + m_HighlightedSprite: {fileID: 0} + m_PressedSprite: {fileID: 0} + m_SelectedSprite: {fileID: 0} + m_DisabledSprite: {fileID: 0} + m_AnimationTriggers: + m_NormalTrigger: Normal + m_HighlightedTrigger: Highlighted + m_PressedTrigger: Pressed + m_SelectedTrigger: Selected + m_DisabledTrigger: Disabled + m_Interactable: 1 + m_TargetGraphic: {fileID: 5166684066272673554} + m_OnClick: + m_PersistentCalls: + m_Calls: + - m_Target: {fileID: 7348458583946661662} + m_TargetAssemblyTypeName: HCDemoScene, Assembly-CSharp + m_MethodName: ButtonEvent_Share + m_Mode: 1 + m_Arguments: + m_ObjectArgument: {fileID: 0} + m_ObjectArgumentAssemblyTypeName: UnityEngine.Object, UnityEngine + m_IntArgument: 0 + m_FloatArgument: 0 + m_StringArgument: + m_BoolArgument: 0 + m_CallState: 2 +--- !u!1 &3720199235560687025 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 7121337215618893364} + - component: {fileID: 2541475635723079860} + - component: {fileID: 6525854927113329019} + - component: {fileID: 1767919809492474406} + m_Layer: 5 + m_Name: StartRecordButton + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!224 &7121337215618893364 +RectTransform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 3720199235560687025} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: 0, y: 0, z: 0} + m_LocalScale: {x: 1, y: 1, z: 1} + m_ConstrainProportionsScale: 0 + m_Children: + - {fileID: 3212023409645216795} + m_Father: {fileID: 4650141467237551916} + m_RootOrder: 1 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} + m_AnchorMin: {x: 0.5, y: 0.5} + m_AnchorMax: {x: 0.5, y: 0.5} + m_AnchoredPosition: {x: -470, y: 54} + m_SizeDelta: {x: 400, y: 120} + m_Pivot: {x: 0, y: 0.5} +--- !u!222 &2541475635723079860 +CanvasRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 3720199235560687025} + m_CullTransparentMesh: 1 +--- !u!114 &6525854927113329019 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 3720199235560687025} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: fe87c0e1cc204ed48ad3b37840f39efc, type: 3} + m_Name: + m_EditorClassIdentifier: + m_Material: {fileID: 0} + m_Color: {r: 1, g: 1, b: 1, a: 1} + m_RaycastTarget: 1 + m_RaycastPadding: {x: 0, y: 0, z: 0, w: 0} + m_Maskable: 1 + m_OnCullStateChanged: + m_PersistentCalls: + m_Calls: [] + m_Sprite: {fileID: 10905, guid: 0000000000000000f000000000000000, type: 0} + m_Type: 1 + m_PreserveAspect: 0 + m_FillCenter: 1 + m_FillMethod: 4 + m_FillAmount: 1 + m_FillClockwise: 1 + m_FillOrigin: 0 + m_UseSpriteMesh: 0 + m_PixelsPerUnitMultiplier: 1 +--- !u!114 &1767919809492474406 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 3720199235560687025} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 4e29b1a8efbd4b44bb3f3716e73f07ff, type: 3} + m_Name: + m_EditorClassIdentifier: + m_Navigation: + m_Mode: 3 + m_WrapAround: 0 + m_SelectOnUp: {fileID: 0} + m_SelectOnDown: {fileID: 0} + m_SelectOnLeft: {fileID: 0} + m_SelectOnRight: {fileID: 0} + m_Transition: 1 + m_Colors: + m_NormalColor: {r: 1, g: 1, b: 1, a: 1} + m_HighlightedColor: {r: 0.9607843, g: 0.9607843, b: 0.9607843, a: 1} + m_PressedColor: {r: 0.78431374, g: 0.78431374, b: 0.78431374, a: 1} + m_SelectedColor: {r: 0.9607843, g: 0.9607843, b: 0.9607843, a: 1} + m_DisabledColor: {r: 0.78431374, g: 0.78431374, b: 0.78431374, a: 0.5019608} + m_ColorMultiplier: 1 + m_FadeDuration: 0.1 + m_SpriteState: + m_HighlightedSprite: {fileID: 0} + m_PressedSprite: {fileID: 0} + m_SelectedSprite: {fileID: 0} + m_DisabledSprite: {fileID: 0} + m_AnimationTriggers: + m_NormalTrigger: Normal + m_HighlightedTrigger: Highlighted + m_PressedTrigger: Pressed + m_SelectedTrigger: Selected + m_DisabledTrigger: Disabled + m_Interactable: 1 + m_TargetGraphic: {fileID: 6525854927113329019} + m_OnClick: + m_PersistentCalls: + m_Calls: + - m_Target: {fileID: 7348458583946661662} + m_TargetAssemblyTypeName: HCDemoScene, Assembly-CSharp + m_MethodName: ButtonEvent_StartRecord + m_Mode: 1 + m_Arguments: + m_ObjectArgument: {fileID: 0} + m_ObjectArgumentAssemblyTypeName: UnityEngine.Object, UnityEngine + m_IntArgument: 0 + m_FloatArgument: 0 + m_StringArgument: + m_BoolArgument: 0 + m_CallState: 2 +--- !u!1 &3854711372182264156 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 7087879535456899680} + - component: {fileID: 2443620489524730235} + - component: {fileID: 6921200032205925617} + m_Layer: 5 + m_Name: Text + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!224 &7087879535456899680 +RectTransform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 3854711372182264156} + m_LocalRotation: {x: -0, y: -0, z: -0, w: 1} + m_LocalPosition: {x: 0, y: 0, z: 0} + m_LocalScale: {x: 1, y: 1, z: 1} + m_ConstrainProportionsScale: 0 + m_Children: [] + m_Father: {fileID: 8702948117595993398} + m_RootOrder: 0 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} + m_AnchorMin: {x: 0, y: 0} + m_AnchorMax: {x: 1, y: 1} + m_AnchoredPosition: {x: 0, y: 0} + m_SizeDelta: {x: 0, y: 0} + m_Pivot: {x: 0.5, y: 0.5} +--- !u!222 &2443620489524730235 +CanvasRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 3854711372182264156} + m_CullTransparentMesh: 1 +--- !u!114 &6921200032205925617 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 3854711372182264156} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 5f7201a12d95ffc409449d95f23cf332, type: 3} + m_Name: + m_EditorClassIdentifier: + m_Material: {fileID: 0} + m_Color: {r: 0.19607843, g: 0.19607843, b: 0.19607843, a: 1} + m_RaycastTarget: 1 + m_RaycastPadding: {x: 0, y: 0, z: 0, w: 0} + m_Maskable: 1 + m_OnCullStateChanged: + m_PersistentCalls: + m_Calls: [] + m_FontData: + m_Font: {fileID: 10102, guid: 0000000000000000e000000000000000, type: 0} + m_FontSize: 48 + m_FontStyle: 0 + m_BestFit: 0 + m_MinSize: 4 + m_MaxSize: 48 + m_Alignment: 4 + m_AlignByGeometry: 0 + m_RichText: 1 + m_HorizontalOverflow: 0 + m_VerticalOverflow: 0 + m_LineSpacing: 1 + m_Text: 6CNY +--- !u!1 &4220140302230951968 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 8141970662575567352} + - component: {fileID: 5135199287661292635} + - component: {fileID: 8008765686523956696} + m_Layer: 5 + m_Name: Line + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!224 &8141970662575567352 +RectTransform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 4220140302230951968} + m_LocalRotation: {x: -0, y: -0, z: -0, w: 1} + m_LocalPosition: {x: 0, y: 0, z: 0} + m_LocalScale: {x: 1, y: 1, z: 1} + m_ConstrainProportionsScale: 0 + m_Children: [] + m_Father: {fileID: 1240445628202320349} + m_RootOrder: 10 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} + m_AnchorMin: {x: 0, y: 0} + m_AnchorMax: {x: 0, y: 0} + m_AnchoredPosition: {x: 0, y: 0} + m_SizeDelta: {x: 1080, y: 12} + m_Pivot: {x: 0.5, y: 0.5} +--- !u!222 &5135199287661292635 +CanvasRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 4220140302230951968} + m_CullTransparentMesh: 1 +--- !u!114 &8008765686523956696 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 4220140302230951968} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: fe87c0e1cc204ed48ad3b37840f39efc, type: 3} + m_Name: + m_EditorClassIdentifier: + m_Material: {fileID: 0} + m_Color: {r: 0.3759642, g: 0.4339623, b: 0.34184766, a: 1} + m_RaycastTarget: 1 + m_RaycastPadding: {x: 0, y: 0, z: 0, w: 0} + m_Maskable: 1 + m_OnCullStateChanged: + m_PersistentCalls: + m_Calls: [] + m_Sprite: {fileID: 0} + m_Type: 0 + m_PreserveAspect: 0 + m_FillCenter: 1 + m_FillMethod: 4 + m_FillAmount: 1 + m_FillClockwise: 1 + m_FillOrigin: 0 + m_UseSpriteMesh: 0 + m_PixelsPerUnitMultiplier: 1 +--- !u!1 &4302422567423943744 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 5176872578219230044} + - component: {fileID: 1272034499833714035} + - component: {fileID: 2314738932812382391} + m_Layer: 5 + m_Name: Text + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!224 &5176872578219230044 +RectTransform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 4302422567423943744} + m_LocalRotation: {x: -0, y: -0, z: -0, w: 1} + m_LocalPosition: {x: 0, y: 0, z: 0} + m_LocalScale: {x: 1, y: 1, z: 1} + m_ConstrainProportionsScale: 0 + m_Children: [] + m_Father: {fileID: 386111344024387214} + m_RootOrder: 0 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} + m_AnchorMin: {x: 0, y: 0} + m_AnchorMax: {x: 1, y: 1} + m_AnchoredPosition: {x: 0, y: 0} + m_SizeDelta: {x: 0, y: 0} + m_Pivot: {x: 0.5, y: 0.5} +--- !u!222 &1272034499833714035 +CanvasRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 4302422567423943744} + m_CullTransparentMesh: 1 +--- !u!114 &2314738932812382391 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 4302422567423943744} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 5f7201a12d95ffc409449d95f23cf332, type: 3} + m_Name: + m_EditorClassIdentifier: + m_Material: {fileID: 0} + m_Color: {r: 0.19607843, g: 0.19607843, b: 0.19607843, a: 1} + m_RaycastTarget: 1 + m_RaycastPadding: {x: 0, y: 0, z: 0, w: 0} + m_Maskable: 1 + m_OnCullStateChanged: + m_PersistentCalls: + m_Calls: [] + m_FontData: + m_Font: {fileID: 10102, guid: 0000000000000000e000000000000000, type: 0} + m_FontSize: 48 + m_FontStyle: 0 + m_BestFit: 0 + m_MinSize: 4 + m_MaxSize: 48 + m_Alignment: 4 + m_AlignByGeometry: 0 + m_RichText: 1 + m_HorizontalOverflow: 0 + m_VerticalOverflow: 0 + m_LineSpacing: 1 + m_Text: HideBanner +--- !u!1 &4453627734408320066 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 6549588200963992483} + - component: {fileID: 3583443012823887454} + - component: {fileID: 5791452042729023017} + m_Layer: 5 + m_Name: TitleText + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!224 &6549588200963992483 +RectTransform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 4453627734408320066} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: 0, y: 0, z: 0} + m_LocalScale: {x: 1, y: 1, z: 1} + m_ConstrainProportionsScale: 0 + m_Children: [] + m_Father: {fileID: 591582440344992329} + m_RootOrder: 0 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} + m_AnchorMin: {x: 0.5, y: 0.5} + m_AnchorMax: {x: 0.5, y: 0.5} + m_AnchoredPosition: {x: -465, y: 178} + m_SizeDelta: {x: 238.4239, y: 54.8398} + m_Pivot: {x: 0, y: 0.5} +--- !u!222 &3583443012823887454 +CanvasRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 4453627734408320066} + m_CullTransparentMesh: 1 +--- !u!114 &5791452042729023017 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 4453627734408320066} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 5f7201a12d95ffc409449d95f23cf332, type: 3} + m_Name: + m_EditorClassIdentifier: + m_Material: {fileID: 0} + m_Color: {r: 0.19607843, g: 0.19607843, b: 0.19607843, a: 1} + m_RaycastTarget: 1 + m_RaycastPadding: {x: 0, y: 0, z: 0, w: 0} + m_Maskable: 1 + m_OnCullStateChanged: + m_PersistentCalls: + m_Calls: [] + m_FontData: + m_Font: {fileID: 10102, guid: 0000000000000000e000000000000000, type: 0} + m_FontSize: 48 + m_FontStyle: 1 + m_BestFit: 0 + m_MinSize: 3 + m_MaxSize: 48 + m_Alignment: 0 + m_AlignByGeometry: 0 + m_RichText: 1 + m_HorizontalOverflow: 0 + m_VerticalOverflow: 0 + m_LineSpacing: 1 + m_Text: Share +--- !u!1 &4507940871113014326 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 386111344024387214} + - component: {fileID: 430752432705818059} + - component: {fileID: 8206153080406256131} + - component: {fileID: 8431542693629505174} + m_Layer: 5 + m_Name: HideBnanerButton + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!224 &386111344024387214 +RectTransform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 4507940871113014326} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: 0, y: 0, z: 0} + m_LocalScale: {x: 1, y: 1, z: 1} + m_ConstrainProportionsScale: 0 + m_Children: + - {fileID: 5176872578219230044} + m_Father: {fileID: 1240445629039028095} + m_RootOrder: 9 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} + m_AnchorMin: {x: 0.5, y: 0.5} + m_AnchorMax: {x: 0.5, y: 0.5} + m_AnchoredPosition: {x: 4, y: 27.00003} + m_SizeDelta: {x: 400, y: 120} + m_Pivot: {x: 0, y: 0.5} +--- !u!222 &430752432705818059 +CanvasRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 4507940871113014326} + m_CullTransparentMesh: 1 +--- !u!114 &8206153080406256131 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 4507940871113014326} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: fe87c0e1cc204ed48ad3b37840f39efc, type: 3} + m_Name: + m_EditorClassIdentifier: + m_Material: {fileID: 0} + m_Color: {r: 1, g: 1, b: 1, a: 1} + m_RaycastTarget: 1 + m_RaycastPadding: {x: 0, y: 0, z: 0, w: 0} + m_Maskable: 1 + m_OnCullStateChanged: + m_PersistentCalls: + m_Calls: [] + m_Sprite: {fileID: 10905, guid: 0000000000000000f000000000000000, type: 0} + m_Type: 1 + m_PreserveAspect: 0 + m_FillCenter: 1 + m_FillMethod: 4 + m_FillAmount: 1 + m_FillClockwise: 1 + m_FillOrigin: 0 + m_UseSpriteMesh: 0 + m_PixelsPerUnitMultiplier: 1 +--- !u!114 &8431542693629505174 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 4507940871113014326} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 4e29b1a8efbd4b44bb3f3716e73f07ff, type: 3} + m_Name: + m_EditorClassIdentifier: + m_Navigation: + m_Mode: 3 + m_WrapAround: 0 + m_SelectOnUp: {fileID: 0} + m_SelectOnDown: {fileID: 0} + m_SelectOnLeft: {fileID: 0} + m_SelectOnRight: {fileID: 0} + m_Transition: 1 + m_Colors: + m_NormalColor: {r: 1, g: 1, b: 1, a: 1} + m_HighlightedColor: {r: 0.9607843, g: 0.9607843, b: 0.9607843, a: 1} + m_PressedColor: {r: 0.78431374, g: 0.78431374, b: 0.78431374, a: 1} + m_SelectedColor: {r: 0.9607843, g: 0.9607843, b: 0.9607843, a: 1} + m_DisabledColor: {r: 0.78431374, g: 0.78431374, b: 0.78431374, a: 0.5019608} + m_ColorMultiplier: 1 + m_FadeDuration: 0.1 + m_SpriteState: + m_HighlightedSprite: {fileID: 0} + m_PressedSprite: {fileID: 0} + m_SelectedSprite: {fileID: 0} + m_DisabledSprite: {fileID: 0} + m_AnimationTriggers: + m_NormalTrigger: Normal + m_HighlightedTrigger: Highlighted + m_PressedTrigger: Pressed + m_SelectedTrigger: Selected + m_DisabledTrigger: Disabled + m_Interactable: 1 + m_TargetGraphic: {fileID: 8206153080406256131} + m_OnClick: + m_PersistentCalls: + m_Calls: + - m_Target: {fileID: 7348458583946661662} + m_TargetAssemblyTypeName: HCDemoScene, Assembly-CSharp + m_MethodName: Button_HideBanner + m_Mode: 1 + m_Arguments: + m_ObjectArgument: {fileID: 0} + m_ObjectArgumentAssemblyTypeName: UnityEngine.Object, UnityEngine + m_IntArgument: 0 + m_FloatArgument: 0 + m_StringArgument: + m_BoolArgument: 0 + m_CallState: 2 +--- !u!1 &4707270670127832436 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 6811790315065618171} + - component: {fileID: 2363565930705143264} + - component: {fileID: 7658553412054238980} + - component: {fileID: 3047108998749690769} + m_Layer: 5 + m_Name: WebGLButton (1) + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!224 &6811790315065618171 +RectTransform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 4707270670127832436} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: 0, y: 0, z: 0} + m_LocalScale: {x: 1, y: 1, z: 1} + m_ConstrainProportionsScale: 0 + m_Children: + - {fileID: 1728096110061714620} + m_Father: {fileID: 1240445628316549557} + m_RootOrder: 5 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} + m_AnchorMin: {x: 0.5, y: 0.5} + m_AnchorMax: {x: 0.5, y: 0.5} + m_AnchoredPosition: {x: 6, y: -181} + m_SizeDelta: {x: 400, y: 120} + m_Pivot: {x: 0, y: 0.5} +--- !u!222 &2363565930705143264 +CanvasRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 4707270670127832436} + m_CullTransparentMesh: 1 +--- !u!114 &7658553412054238980 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 4707270670127832436} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: fe87c0e1cc204ed48ad3b37840f39efc, type: 3} + m_Name: + m_EditorClassIdentifier: + m_Material: {fileID: 0} + m_Color: {r: 1, g: 1, b: 1, a: 1} + m_RaycastTarget: 1 + m_RaycastPadding: {x: 0, y: 0, z: 0, w: 0} + m_Maskable: 1 + m_OnCullStateChanged: + m_PersistentCalls: + m_Calls: [] + m_Sprite: {fileID: 10905, guid: 0000000000000000f000000000000000, type: 0} + m_Type: 1 + m_PreserveAspect: 0 + m_FillCenter: 1 + m_FillMethod: 4 + m_FillAmount: 1 + m_FillClockwise: 1 + m_FillOrigin: 0 + m_UseSpriteMesh: 0 + m_PixelsPerUnitMultiplier: 1 +--- !u!114 &3047108998749690769 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 4707270670127832436} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 4e29b1a8efbd4b44bb3f3716e73f07ff, type: 3} + m_Name: + m_EditorClassIdentifier: + m_Navigation: + m_Mode: 3 + m_WrapAround: 0 + m_SelectOnUp: {fileID: 0} + m_SelectOnDown: {fileID: 0} + m_SelectOnLeft: {fileID: 0} + m_SelectOnRight: {fileID: 0} + m_Transition: 1 + m_Colors: + m_NormalColor: {r: 1, g: 1, b: 1, a: 1} + m_HighlightedColor: {r: 0.9607843, g: 0.9607843, b: 0.9607843, a: 1} + m_PressedColor: {r: 0.78431374, g: 0.78431374, b: 0.78431374, a: 1} + m_SelectedColor: {r: 0.9607843, g: 0.9607843, b: 0.9607843, a: 1} + m_DisabledColor: {r: 0.78431374, g: 0.78431374, b: 0.78431374, a: 0.5019608} + m_ColorMultiplier: 1 + m_FadeDuration: 0.1 + m_SpriteState: + m_HighlightedSprite: {fileID: 0} + m_PressedSprite: {fileID: 0} + m_SelectedSprite: {fileID: 0} + m_DisabledSprite: {fileID: 0} + m_AnimationTriggers: + m_NormalTrigger: Normal + m_HighlightedTrigger: Highlighted + m_PressedTrigger: Pressed + m_SelectedTrigger: Selected + m_DisabledTrigger: Disabled + m_Interactable: 1 + m_TargetGraphic: {fileID: 7658553412054238980} + m_OnClick: + m_PersistentCalls: + m_Calls: + - m_Target: {fileID: 7348458583946661662} + m_TargetAssemblyTypeName: HCDemoScene, Assembly-CSharp + m_MethodName: ButtonWebGL2 + m_Mode: 1 + m_Arguments: + m_ObjectArgument: {fileID: 0} + m_ObjectArgumentAssemblyTypeName: UnityEngine.Object, UnityEngine + m_IntArgument: 0 + m_FloatArgument: 0 + m_StringArgument: + m_BoolArgument: 0 + m_CallState: 2 +--- !u!1 &4876577991641362507 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 1319004118607695220} + - component: {fileID: 4704931364560478575} + - component: {fileID: 1715493822520102698} + - component: {fileID: 8849862816406106811} + m_Layer: 5 + m_Name: SensitiveWordView + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!224 &1319004118607695220 +RectTransform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 4876577991641362507} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: 0, y: 0, z: 0} + m_LocalScale: {x: 1, y: 1, z: 1} + m_ConstrainProportionsScale: 0 + m_Children: + - {fileID: 4254590187756137931} + m_Father: {fileID: 1240445629789692595} + m_RootOrder: 2 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} + m_AnchorMin: {x: 0.5, y: 0.5} + m_AnchorMax: {x: 0.5, y: 0.5} + m_AnchoredPosition: {x: 0, y: -44} + m_SizeDelta: {x: 400, y: 120} + m_Pivot: {x: 0, y: 0.5} +--- !u!222 &4704931364560478575 +CanvasRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 4876577991641362507} + m_CullTransparentMesh: 1 +--- !u!114 &1715493822520102698 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 4876577991641362507} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: fe87c0e1cc204ed48ad3b37840f39efc, type: 3} + m_Name: + m_EditorClassIdentifier: + m_Material: {fileID: 0} + m_Color: {r: 1, g: 1, b: 1, a: 1} + m_RaycastTarget: 1 + m_RaycastPadding: {x: 0, y: 0, z: 0, w: 0} + m_Maskable: 1 + m_OnCullStateChanged: + m_PersistentCalls: + m_Calls: [] + m_Sprite: {fileID: 10905, guid: 0000000000000000f000000000000000, type: 0} + m_Type: 1 + m_PreserveAspect: 0 + m_FillCenter: 1 + m_FillMethod: 4 + m_FillAmount: 1 + m_FillClockwise: 1 + m_FillOrigin: 0 + m_UseSpriteMesh: 0 + m_PixelsPerUnitMultiplier: 1 +--- !u!114 &8849862816406106811 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 4876577991641362507} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 4e29b1a8efbd4b44bb3f3716e73f07ff, type: 3} + m_Name: + m_EditorClassIdentifier: + m_Navigation: + m_Mode: 3 + m_WrapAround: 0 + m_SelectOnUp: {fileID: 0} + m_SelectOnDown: {fileID: 0} + m_SelectOnLeft: {fileID: 0} + m_SelectOnRight: {fileID: 0} + m_Transition: 1 + m_Colors: + m_NormalColor: {r: 1, g: 1, b: 1, a: 1} + m_HighlightedColor: {r: 0.9607843, g: 0.9607843, b: 0.9607843, a: 1} + m_PressedColor: {r: 0.78431374, g: 0.78431374, b: 0.78431374, a: 1} + m_SelectedColor: {r: 0.9607843, g: 0.9607843, b: 0.9607843, a: 1} + m_DisabledColor: {r: 0.78431374, g: 0.78431374, b: 0.78431374, a: 0.5019608} + m_ColorMultiplier: 1 + m_FadeDuration: 0.1 + m_SpriteState: + m_HighlightedSprite: {fileID: 0} + m_PressedSprite: {fileID: 0} + m_SelectedSprite: {fileID: 0} + m_DisabledSprite: {fileID: 0} + m_AnimationTriggers: + m_NormalTrigger: Normal + m_HighlightedTrigger: Highlighted + m_PressedTrigger: Pressed + m_SelectedTrigger: Selected + m_DisabledTrigger: Disabled + m_Interactable: 1 + m_TargetGraphic: {fileID: 1715493822520102698} + m_OnClick: + m_PersistentCalls: + m_Calls: + - m_Target: {fileID: 7348458583946661662} + m_TargetAssemblyTypeName: HCDemoScene, Assembly-CSharp + m_MethodName: ButtonEvent_SensitiveWordView + m_Mode: 1 + m_Arguments: + m_ObjectArgument: {fileID: 0} + m_ObjectArgumentAssemblyTypeName: UnityEngine.Object, UnityEngine + m_IntArgument: 0 + m_FloatArgument: 0 + m_StringArgument: + m_BoolArgument: 0 + m_CallState: 2 +--- !u!1 &5044178600330901058 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 4410921710156430414} + - component: {fileID: 2522500610828267892} + - component: {fileID: 6795632249956345037} + m_Layer: 5 + m_Name: Text + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!224 &4410921710156430414 +RectTransform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 5044178600330901058} + m_LocalRotation: {x: -0, y: -0, z: -0, w: 1} + m_LocalPosition: {x: 0, y: 0, z: 0} + m_LocalScale: {x: 1, y: 1, z: 1} + m_ConstrainProportionsScale: 0 + m_Children: [] + m_Father: {fileID: 88522639002915039} + m_RootOrder: 0 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} + m_AnchorMin: {x: 0, y: 0} + m_AnchorMax: {x: 1, y: 1} + m_AnchoredPosition: {x: 0, y: 0} + m_SizeDelta: {x: 0, y: 0} + m_Pivot: {x: 0.5, y: 0.5} +--- !u!222 &2522500610828267892 +CanvasRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 5044178600330901058} + m_CullTransparentMesh: 1 +--- !u!114 &6795632249956345037 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 5044178600330901058} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 5f7201a12d95ffc409449d95f23cf332, type: 3} + m_Name: + m_EditorClassIdentifier: + m_Material: {fileID: 0} + m_Color: {r: 0.19607843, g: 0.19607843, b: 0.19607843, a: 1} + m_RaycastTarget: 1 + m_RaycastPadding: {x: 0, y: 0, z: 0, w: 0} + m_Maskable: 1 + m_OnCullStateChanged: + m_PersistentCalls: + m_Calls: [] + m_FontData: + m_Font: {fileID: 10102, guid: 0000000000000000e000000000000000, type: 0} + m_FontSize: 48 + m_FontStyle: 0 + m_BestFit: 0 + m_MinSize: 4 + m_MaxSize: 48 + m_Alignment: 4 + m_AlignByGeometry: 0 + m_RichText: 1 + m_HorizontalOverflow: 0 + m_VerticalOverflow: 0 + m_LineSpacing: 1 + m_Text: HideNative3 +--- !u!1 &5749738596676648995 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 167536599284978532} + - component: {fileID: 3024665479700241150} + - component: {fileID: 7101805393197160550} + - component: {fileID: 3048801596286703611} + m_Layer: 5 + m_Name: WebGLButton + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!224 &167536599284978532 +RectTransform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 5749738596676648995} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: 0, y: 0, z: 0} + m_LocalScale: {x: 1, y: 1, z: 1} + m_ConstrainProportionsScale: 0 + m_Children: + - {fileID: 5165712014677799799} + m_Father: {fileID: 1240445628316549557} + m_RootOrder: 4 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} + m_AnchorMin: {x: 0.5, y: 0.5} + m_AnchorMax: {x: 0.5, y: 0.5} + m_AnchoredPosition: {x: 6, y: -86} + m_SizeDelta: {x: 400, y: 120} + m_Pivot: {x: 0, y: 0.5} +--- !u!222 &3024665479700241150 +CanvasRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 5749738596676648995} + m_CullTransparentMesh: 1 +--- !u!114 &7101805393197160550 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 5749738596676648995} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: fe87c0e1cc204ed48ad3b37840f39efc, type: 3} + m_Name: + m_EditorClassIdentifier: + m_Material: {fileID: 0} + m_Color: {r: 1, g: 1, b: 1, a: 1} + m_RaycastTarget: 1 + m_RaycastPadding: {x: 0, y: 0, z: 0, w: 0} + m_Maskable: 1 + m_OnCullStateChanged: + m_PersistentCalls: + m_Calls: [] + m_Sprite: {fileID: 10905, guid: 0000000000000000f000000000000000, type: 0} + m_Type: 1 + m_PreserveAspect: 0 + m_FillCenter: 1 + m_FillMethod: 4 + m_FillAmount: 1 + m_FillClockwise: 1 + m_FillOrigin: 0 + m_UseSpriteMesh: 0 + m_PixelsPerUnitMultiplier: 1 +--- !u!114 &3048801596286703611 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 5749738596676648995} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 4e29b1a8efbd4b44bb3f3716e73f07ff, type: 3} + m_Name: + m_EditorClassIdentifier: + m_Navigation: + m_Mode: 3 + m_WrapAround: 0 + m_SelectOnUp: {fileID: 0} + m_SelectOnDown: {fileID: 0} + m_SelectOnLeft: {fileID: 0} + m_SelectOnRight: {fileID: 0} + m_Transition: 1 + m_Colors: + m_NormalColor: {r: 1, g: 1, b: 1, a: 1} + m_HighlightedColor: {r: 0.9607843, g: 0.9607843, b: 0.9607843, a: 1} + m_PressedColor: {r: 0.78431374, g: 0.78431374, b: 0.78431374, a: 1} + m_SelectedColor: {r: 0.9607843, g: 0.9607843, b: 0.9607843, a: 1} + m_DisabledColor: {r: 0.78431374, g: 0.78431374, b: 0.78431374, a: 0.5019608} + m_ColorMultiplier: 1 + m_FadeDuration: 0.1 + m_SpriteState: + m_HighlightedSprite: {fileID: 0} + m_PressedSprite: {fileID: 0} + m_SelectedSprite: {fileID: 0} + m_DisabledSprite: {fileID: 0} + m_AnimationTriggers: + m_NormalTrigger: Normal + m_HighlightedTrigger: Highlighted + m_PressedTrigger: Pressed + m_SelectedTrigger: Selected + m_DisabledTrigger: Disabled + m_Interactable: 1 + m_TargetGraphic: {fileID: 7101805393197160550} + m_OnClick: + m_PersistentCalls: + m_Calls: + - m_Target: {fileID: 7348458583946661662} + m_TargetAssemblyTypeName: HCDemoScene, Assembly-CSharp + m_MethodName: ButtonWebGL + m_Mode: 1 + m_Arguments: + m_ObjectArgument: {fileID: 0} + m_ObjectArgumentAssemblyTypeName: UnityEngine.Object, UnityEngine + m_IntArgument: 0 + m_FloatArgument: 0 + m_StringArgument: + m_BoolArgument: 0 + m_CallState: 2 +--- !u!1 &5898636100965729447 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 3116041821519604338} + - component: {fileID: 4958763139670923852} + - component: {fileID: 5852602200325309086} + - component: {fileID: 1627037971003440718} + m_Layer: 5 + m_Name: HideNativeButton + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!224 &3116041821519604338 +RectTransform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 5898636100965729447} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: 0, y: 0, z: 0} + m_LocalScale: {x: 1, y: 1, z: 1} + m_ConstrainProportionsScale: 0 + m_Children: + - {fileID: 705544146933374672} + m_Father: {fileID: 1240445629039028095} + m_RootOrder: 11 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} + m_AnchorMin: {x: 0.5, y: 0.5} + m_AnchorMax: {x: 0.5, y: 0.5} + m_AnchoredPosition: {x: 4, y: -123} + m_SizeDelta: {x: 400, y: 120} + m_Pivot: {x: 0, y: 0.5} +--- !u!222 &4958763139670923852 +CanvasRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 5898636100965729447} + m_CullTransparentMesh: 1 +--- !u!114 &5852602200325309086 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 5898636100965729447} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: fe87c0e1cc204ed48ad3b37840f39efc, type: 3} + m_Name: + m_EditorClassIdentifier: + m_Material: {fileID: 0} + m_Color: {r: 1, g: 1, b: 1, a: 1} + m_RaycastTarget: 1 + m_RaycastPadding: {x: 0, y: 0, z: 0, w: 0} + m_Maskable: 1 + m_OnCullStateChanged: + m_PersistentCalls: + m_Calls: [] + m_Sprite: {fileID: 10905, guid: 0000000000000000f000000000000000, type: 0} + m_Type: 1 + m_PreserveAspect: 0 + m_FillCenter: 1 + m_FillMethod: 4 + m_FillAmount: 1 + m_FillClockwise: 1 + m_FillOrigin: 0 + m_UseSpriteMesh: 0 + m_PixelsPerUnitMultiplier: 1 +--- !u!114 &1627037971003440718 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 5898636100965729447} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 4e29b1a8efbd4b44bb3f3716e73f07ff, type: 3} + m_Name: + m_EditorClassIdentifier: + m_Navigation: + m_Mode: 3 + m_WrapAround: 0 + m_SelectOnUp: {fileID: 0} + m_SelectOnDown: {fileID: 0} + m_SelectOnLeft: {fileID: 0} + m_SelectOnRight: {fileID: 0} + m_Transition: 1 + m_Colors: + m_NormalColor: {r: 1, g: 1, b: 1, a: 1} + m_HighlightedColor: {r: 0.9607843, g: 0.9607843, b: 0.9607843, a: 1} + m_PressedColor: {r: 0.78431374, g: 0.78431374, b: 0.78431374, a: 1} + m_SelectedColor: {r: 0.9607843, g: 0.9607843, b: 0.9607843, a: 1} + m_DisabledColor: {r: 0.78431374, g: 0.78431374, b: 0.78431374, a: 0.5019608} + m_ColorMultiplier: 1 + m_FadeDuration: 0.1 + m_SpriteState: + m_HighlightedSprite: {fileID: 0} + m_PressedSprite: {fileID: 0} + m_SelectedSprite: {fileID: 0} + m_DisabledSprite: {fileID: 0} + m_AnimationTriggers: + m_NormalTrigger: Normal + m_HighlightedTrigger: Highlighted + m_PressedTrigger: Pressed + m_SelectedTrigger: Selected + m_DisabledTrigger: Disabled + m_Interactable: 1 + m_TargetGraphic: {fileID: 5852602200325309086} + m_OnClick: + m_PersistentCalls: + m_Calls: + - m_Target: {fileID: 7348458583946661662} + m_TargetAssemblyTypeName: HCDemoScene, Assembly-CSharp + m_MethodName: Button_RemoveNative_2 + m_Mode: 1 + m_Arguments: + m_ObjectArgument: {fileID: 0} + m_ObjectArgumentAssemblyTypeName: UnityEngine.Object, UnityEngine + m_IntArgument: 0 + m_FloatArgument: 0 + m_StringArgument: + m_BoolArgument: 0 + m_CallState: 2 +--- !u!1 &6274757865270093682 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 5137608969474747836} + - component: {fileID: 4638509789242313693} + - component: {fileID: 8519773436396669306} + m_Layer: 5 + m_Name: Text + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!224 &5137608969474747836 +RectTransform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 6274757865270093682} + m_LocalRotation: {x: -0, y: -0, z: -0, w: 1} + m_LocalPosition: {x: 0, y: 0, z: 0} + m_LocalScale: {x: 1, y: 1, z: 1} + m_ConstrainProportionsScale: 0 + m_Children: [] + m_Father: {fileID: 978645317646675521} + m_RootOrder: 0 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} + m_AnchorMin: {x: 0, y: 0} + m_AnchorMax: {x: 1, y: 1} + m_AnchoredPosition: {x: 0, y: 0} + m_SizeDelta: {x: 0, y: 0} + m_Pivot: {x: 0.5, y: 0.5} +--- !u!222 &4638509789242313693 +CanvasRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 6274757865270093682} + m_CullTransparentMesh: 1 +--- !u!114 &8519773436396669306 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 6274757865270093682} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 5f7201a12d95ffc409449d95f23cf332, type: 3} + m_Name: + m_EditorClassIdentifier: + m_Material: {fileID: 0} + m_Color: {r: 0.19607843, g: 0.19607843, b: 0.19607843, a: 1} + m_RaycastTarget: 1 + m_RaycastPadding: {x: 0, y: 0, z: 0, w: 0} + m_Maskable: 1 + m_OnCullStateChanged: + m_PersistentCalls: + m_Calls: [] + m_FontData: + m_Font: {fileID: 10102, guid: 0000000000000000e000000000000000, type: 0} + m_FontSize: 48 + m_FontStyle: 0 + m_BestFit: 0 + m_MinSize: 4 + m_MaxSize: 48 + m_Alignment: 4 + m_AlignByGeometry: 0 + m_RichText: 1 + m_HorizontalOverflow: 0 + m_VerticalOverflow: 0 + m_LineSpacing: 1 + m_Text: StopRecord +--- !u!1 &6419553888984062846 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 1728096110061714620} + - component: {fileID: 8556529863185516433} + - component: {fileID: 3563516157435428382} + m_Layer: 5 + m_Name: Text + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!224 &1728096110061714620 +RectTransform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 6419553888984062846} + m_LocalRotation: {x: -0, y: -0, z: -0, w: 1} + m_LocalPosition: {x: 0, y: 0, z: 0} + m_LocalScale: {x: 1, y: 1, z: 1} + m_ConstrainProportionsScale: 0 + m_Children: [] + m_Father: {fileID: 6811790315065618171} + m_RootOrder: 0 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} + m_AnchorMin: {x: 0, y: 0} + m_AnchorMax: {x: 1, y: 1} + m_AnchoredPosition: {x: 0, y: 0} + m_SizeDelta: {x: 0, y: 0} + m_Pivot: {x: 0.5, y: 0.5} +--- !u!222 &8556529863185516433 +CanvasRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 6419553888984062846} + m_CullTransparentMesh: 1 +--- !u!114 &3563516157435428382 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 6419553888984062846} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 5f7201a12d95ffc409449d95f23cf332, type: 3} + m_Name: + m_EditorClassIdentifier: + m_Material: {fileID: 0} + m_Color: {r: 0.19607843, g: 0.19607843, b: 0.19607843, a: 1} + m_RaycastTarget: 1 + m_RaycastPadding: {x: 0, y: 0, z: 0, w: 0} + m_Maskable: 1 + m_OnCullStateChanged: + m_PersistentCalls: + m_Calls: [] + m_FontData: + m_Font: {fileID: 10102, guid: 0000000000000000e000000000000000, type: 0} + m_FontSize: 48 + m_FontStyle: 0 + m_BestFit: 0 + m_MinSize: 4 + m_MaxSize: 48 + m_Alignment: 4 + m_AlignByGeometry: 0 + m_RichText: 1 + m_HorizontalOverflow: 0 + m_VerticalOverflow: 0 + m_LineSpacing: 1 + m_Text: 68CNY +--- !u!1 &7373504841126940124 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 3628657939277581149} + - component: {fileID: 7186641959769666831} + - component: {fileID: 6764631585254728724} + m_Layer: 5 + m_Name: Text + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!224 &3628657939277581149 +RectTransform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 7373504841126940124} + m_LocalRotation: {x: -0, y: -0, z: -0, w: 1} + m_LocalPosition: {x: 0, y: 0, z: 0} + m_LocalScale: {x: 1, y: 1, z: 1} + m_ConstrainProportionsScale: 0 + m_Children: [] + m_Father: {fileID: 5378779329489247566} + m_RootOrder: 0 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} + m_AnchorMin: {x: 0, y: 0} + m_AnchorMax: {x: 1, y: 1} + m_AnchoredPosition: {x: 0, y: 0} + m_SizeDelta: {x: 0, y: 0} + m_Pivot: {x: 0.5, y: 0.5} +--- !u!222 &7186641959769666831 +CanvasRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 7373504841126940124} + m_CullTransparentMesh: 1 +--- !u!114 &6764631585254728724 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 7373504841126940124} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 5f7201a12d95ffc409449d95f23cf332, type: 3} + m_Name: + m_EditorClassIdentifier: + m_Material: {fileID: 0} + m_Color: {r: 0.19607843, g: 0.19607843, b: 0.19607843, a: 1} + m_RaycastTarget: 1 + m_RaycastPadding: {x: 0, y: 0, z: 0, w: 0} + m_Maskable: 1 + m_OnCullStateChanged: + m_PersistentCalls: + m_Calls: [] + m_FontData: + m_Font: {fileID: 10102, guid: 0000000000000000e000000000000000, type: 0} + m_FontSize: 48 + m_FontStyle: 0 + m_BestFit: 0 + m_MinSize: 4 + m_MaxSize: 48 + m_Alignment: 4 + m_AlignByGeometry: 0 + m_RichText: 1 + m_HorizontalOverflow: 0 + m_VerticalOverflow: 0 + m_LineSpacing: 1 + m_Text: Native +--- !u!1 &7446115655747775568 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 3223175518735522177} + - component: {fileID: 7691945207600236226} + - component: {fileID: 6242047225825023205} + - component: {fileID: 6780123419263040133} + m_Layer: 5 + m_Name: NativeButton3 + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!224 &3223175518735522177 +RectTransform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 7446115655747775568} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: 0, y: 0, z: 0} + m_LocalScale: {x: 1, y: 1, z: 1} + m_ConstrainProportionsScale: 0 + m_Children: + - {fileID: 2386732006083139689} + m_Father: {fileID: 1240445629039028095} + m_RootOrder: 12 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} + m_AnchorMin: {x: 0.5, y: 0.5} + m_AnchorMax: {x: 0.5, y: 0.5} + m_AnchoredPosition: {x: -467, y: -294} + m_SizeDelta: {x: 400, y: 120} + m_Pivot: {x: 0, y: 0.5} +--- !u!222 &7691945207600236226 +CanvasRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 7446115655747775568} + m_CullTransparentMesh: 1 +--- !u!114 &6242047225825023205 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 7446115655747775568} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: fe87c0e1cc204ed48ad3b37840f39efc, type: 3} + m_Name: + m_EditorClassIdentifier: + m_Material: {fileID: 0} + m_Color: {r: 1, g: 1, b: 1, a: 1} + m_RaycastTarget: 1 + m_RaycastPadding: {x: 0, y: 0, z: 0, w: 0} + m_Maskable: 1 + m_OnCullStateChanged: + m_PersistentCalls: + m_Calls: [] + m_Sprite: {fileID: 10905, guid: 0000000000000000f000000000000000, type: 0} + m_Type: 1 + m_PreserveAspect: 0 + m_FillCenter: 1 + m_FillMethod: 4 + m_FillAmount: 1 + m_FillClockwise: 1 + m_FillOrigin: 0 + m_UseSpriteMesh: 0 + m_PixelsPerUnitMultiplier: 1 +--- !u!114 &6780123419263040133 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 7446115655747775568} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 4e29b1a8efbd4b44bb3f3716e73f07ff, type: 3} + m_Name: + m_EditorClassIdentifier: + m_Navigation: + m_Mode: 3 + m_WrapAround: 0 + m_SelectOnUp: {fileID: 0} + m_SelectOnDown: {fileID: 0} + m_SelectOnLeft: {fileID: 0} + m_SelectOnRight: {fileID: 0} + m_Transition: 1 + m_Colors: + m_NormalColor: {r: 1, g: 1, b: 1, a: 1} + m_HighlightedColor: {r: 0.9607843, g: 0.9607843, b: 0.9607843, a: 1} + m_PressedColor: {r: 0.78431374, g: 0.78431374, b: 0.78431374, a: 1} + m_SelectedColor: {r: 0.9607843, g: 0.9607843, b: 0.9607843, a: 1} + m_DisabledColor: {r: 0.78431374, g: 0.78431374, b: 0.78431374, a: 0.5019608} + m_ColorMultiplier: 1 + m_FadeDuration: 0.1 + m_SpriteState: + m_HighlightedSprite: {fileID: 0} + m_PressedSprite: {fileID: 0} + m_SelectedSprite: {fileID: 0} + m_DisabledSprite: {fileID: 0} + m_AnimationTriggers: + m_NormalTrigger: Normal + m_HighlightedTrigger: Highlighted + m_PressedTrigger: Pressed + m_SelectedTrigger: Selected + m_DisabledTrigger: Disabled + m_Interactable: 1 + m_TargetGraphic: {fileID: 6242047225825023205} + m_OnClick: + m_PersistentCalls: + m_Calls: + - m_Target: {fileID: 7348458583946661662} + m_TargetAssemblyTypeName: HCDemoScene, Assembly-CSharp + m_MethodName: Button_ShowNative_3 + m_Mode: 1 + m_Arguments: + m_ObjectArgument: {fileID: 0} + m_ObjectArgumentAssemblyTypeName: UnityEngine.Object, UnityEngine + m_IntArgument: 0 + m_FloatArgument: 0 + m_StringArgument: + m_BoolArgument: 0 + m_CallState: 2 +--- !u!1 &7454600482636112316 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 2403994819041314570} + - component: {fileID: 5267065710814318085} + - component: {fileID: 6414948736800431070} + m_Layer: 5 + m_Name: Text + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!224 &2403994819041314570 +RectTransform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 7454600482636112316} + m_LocalRotation: {x: -0, y: -0, z: -0, w: 1} + m_LocalPosition: {x: 0, y: 0, z: 0} + m_LocalScale: {x: 1, y: 1, z: 1} + m_ConstrainProportionsScale: 0 + m_Children: [] + m_Father: {fileID: 6767664043325814637} + m_RootOrder: 0 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} + m_AnchorMin: {x: 0, y: 0} + m_AnchorMax: {x: 1, y: 1} + m_AnchoredPosition: {x: 0, y: 0} + m_SizeDelta: {x: 0, y: 0} + m_Pivot: {x: 0.5, y: 0.5} +--- !u!222 &5267065710814318085 +CanvasRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 7454600482636112316} + m_CullTransparentMesh: 1 +--- !u!114 &6414948736800431070 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 7454600482636112316} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 5f7201a12d95ffc409449d95f23cf332, type: 3} + m_Name: + m_EditorClassIdentifier: + m_Material: {fileID: 0} + m_Color: {r: 0.19607843, g: 0.19607843, b: 0.19607843, a: 1} + m_RaycastTarget: 1 + m_RaycastPadding: {x: 0, y: 0, z: 0, w: 0} + m_Maskable: 1 + m_OnCullStateChanged: + m_PersistentCalls: + m_Calls: [] + m_FontData: + m_Font: {fileID: 10102, guid: 0000000000000000e000000000000000, type: 0} + m_FontSize: 48 + m_FontStyle: 0 + m_BestFit: 0 + m_MinSize: 4 + m_MaxSize: 48 + m_Alignment: 4 + m_AlignByGeometry: 0 + m_RichText: 1 + m_HorizontalOverflow: 0 + m_VerticalOverflow: 0 + m_LineSpacing: 1 + m_Text: HideNative4 +--- !u!1 &8017592159832216604 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 5395937451915722863} + - component: {fileID: 4976376434940623305} + - component: {fileID: 3656811228129435375} + - component: {fileID: 5712547441475546993} + m_Layer: 5 + m_Name: NativeButton4 + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!224 &5395937451915722863 +RectTransform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 8017592159832216604} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: 0, y: 0, z: 0} + m_LocalScale: {x: 1, y: 1, z: 1} + m_ConstrainProportionsScale: 0 + m_Children: + - {fileID: 8767559988700284408} + m_Father: {fileID: 1240445629039028095} + m_RootOrder: 15 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} + m_AnchorMin: {x: 0.5, y: 0.5} + m_AnchorMax: {x: 0.5, y: 0.5} + m_AnchoredPosition: {x: -467, y: -449} + m_SizeDelta: {x: 400, y: 120} + m_Pivot: {x: 0, y: 0.5} +--- !u!222 &4976376434940623305 +CanvasRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 8017592159832216604} + m_CullTransparentMesh: 1 +--- !u!114 &3656811228129435375 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 8017592159832216604} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: fe87c0e1cc204ed48ad3b37840f39efc, type: 3} + m_Name: + m_EditorClassIdentifier: + m_Material: {fileID: 0} + m_Color: {r: 1, g: 1, b: 1, a: 1} + m_RaycastTarget: 1 + m_RaycastPadding: {x: 0, y: 0, z: 0, w: 0} + m_Maskable: 1 + m_OnCullStateChanged: + m_PersistentCalls: + m_Calls: [] + m_Sprite: {fileID: 10905, guid: 0000000000000000f000000000000000, type: 0} + m_Type: 1 + m_PreserveAspect: 0 + m_FillCenter: 1 + m_FillMethod: 4 + m_FillAmount: 1 + m_FillClockwise: 1 + m_FillOrigin: 0 + m_UseSpriteMesh: 0 + m_PixelsPerUnitMultiplier: 1 +--- !u!114 &5712547441475546993 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 8017592159832216604} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 4e29b1a8efbd4b44bb3f3716e73f07ff, type: 3} + m_Name: + m_EditorClassIdentifier: + m_Navigation: + m_Mode: 3 + m_WrapAround: 0 + m_SelectOnUp: {fileID: 0} + m_SelectOnDown: {fileID: 0} + m_SelectOnLeft: {fileID: 0} + m_SelectOnRight: {fileID: 0} + m_Transition: 1 + m_Colors: + m_NormalColor: {r: 1, g: 1, b: 1, a: 1} + m_HighlightedColor: {r: 0.9607843, g: 0.9607843, b: 0.9607843, a: 1} + m_PressedColor: {r: 0.78431374, g: 0.78431374, b: 0.78431374, a: 1} + m_SelectedColor: {r: 0.9607843, g: 0.9607843, b: 0.9607843, a: 1} + m_DisabledColor: {r: 0.78431374, g: 0.78431374, b: 0.78431374, a: 0.5019608} + m_ColorMultiplier: 1 + m_FadeDuration: 0.1 + m_SpriteState: + m_HighlightedSprite: {fileID: 0} + m_PressedSprite: {fileID: 0} + m_SelectedSprite: {fileID: 0} + m_DisabledSprite: {fileID: 0} + m_AnimationTriggers: + m_NormalTrigger: Normal + m_HighlightedTrigger: Highlighted + m_PressedTrigger: Pressed + m_SelectedTrigger: Selected + m_DisabledTrigger: Disabled + m_Interactable: 1 + m_TargetGraphic: {fileID: 3656811228129435375} + m_OnClick: + m_PersistentCalls: + m_Calls: + - m_Target: {fileID: 7348458583946661662} + m_TargetAssemblyTypeName: HCDemoScene, Assembly-CSharp + m_MethodName: Button_ShowNative_4 + m_Mode: 1 + m_Arguments: + m_ObjectArgument: {fileID: 0} + m_ObjectArgumentAssemblyTypeName: UnityEngine.Object, UnityEngine + m_IntArgument: 0 + m_FloatArgument: 0 + m_StringArgument: + m_BoolArgument: 0 + m_CallState: 2 +--- !u!1 &8330470244567723433 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 8614133738618825381} + - component: {fileID: 5735122801945724275} + - component: {fileID: 4823452881522463278} + m_Layer: 5 + m_Name: NativeImage + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!224 &8614133738618825381 +RectTransform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 8330470244567723433} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: 0, y: 0, z: 0} + m_LocalScale: {x: 1, y: 1, z: 1} + m_ConstrainProportionsScale: 0 + m_Children: [] + m_Father: {fileID: 1240445629039028095} + m_RootOrder: 7 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} + m_AnchorMin: {x: 0.5, y: 0.5} + m_AnchorMax: {x: 0.5, y: 0.5} + m_AnchoredPosition: {x: 0, y: 657} + m_SizeDelta: {x: 800, y: 600} + m_Pivot: {x: 0.5, y: 0.5} +--- !u!222 &5735122801945724275 +CanvasRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 8330470244567723433} + m_CullTransparentMesh: 1 +--- !u!114 &4823452881522463278 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 8330470244567723433} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: fe87c0e1cc204ed48ad3b37840f39efc, type: 3} + m_Name: + m_EditorClassIdentifier: + m_Material: {fileID: 0} + m_Color: {r: 1, g: 1, b: 1, a: 0} + m_RaycastTarget: 1 + m_RaycastPadding: {x: 0, y: 0, z: 0, w: 0} + m_Maskable: 1 + m_OnCullStateChanged: + m_PersistentCalls: + m_Calls: [] + m_Sprite: {fileID: 0} + m_Type: 0 + m_PreserveAspect: 0 + m_FillCenter: 1 + m_FillMethod: 4 + m_FillAmount: 1 + m_FillClockwise: 1 + m_FillOrigin: 0 + m_UseSpriteMesh: 0 + m_PixelsPerUnitMultiplier: 1 +--- !u!1 &8472988879350783222 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 3212023409645216795} + - component: {fileID: 2532385610270228917} + - component: {fileID: 3017760778374648043} + m_Layer: 5 + m_Name: Text + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!224 &3212023409645216795 +RectTransform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 8472988879350783222} + m_LocalRotation: {x: -0, y: -0, z: -0, w: 1} + m_LocalPosition: {x: 0, y: 0, z: 0} + m_LocalScale: {x: 1, y: 1, z: 1} + m_ConstrainProportionsScale: 0 + m_Children: [] + m_Father: {fileID: 7121337215618893364} + m_RootOrder: 0 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} + m_AnchorMin: {x: 0, y: 0} + m_AnchorMax: {x: 1, y: 1} + m_AnchoredPosition: {x: 0, y: 0} + m_SizeDelta: {x: 0, y: 0} + m_Pivot: {x: 0.5, y: 0.5} +--- !u!222 &2532385610270228917 +CanvasRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 8472988879350783222} + m_CullTransparentMesh: 1 +--- !u!114 &3017760778374648043 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 8472988879350783222} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 5f7201a12d95ffc409449d95f23cf332, type: 3} + m_Name: + m_EditorClassIdentifier: + m_Material: {fileID: 0} + m_Color: {r: 0.19607843, g: 0.19607843, b: 0.19607843, a: 1} + m_RaycastTarget: 1 + m_RaycastPadding: {x: 0, y: 0, z: 0, w: 0} + m_Maskable: 1 + m_OnCullStateChanged: + m_PersistentCalls: + m_Calls: [] + m_FontData: + m_Font: {fileID: 10102, guid: 0000000000000000e000000000000000, type: 0} + m_FontSize: 48 + m_FontStyle: 0 + m_BestFit: 0 + m_MinSize: 4 + m_MaxSize: 48 + m_Alignment: 4 + m_AlignByGeometry: 0 + m_RichText: 1 + m_HorizontalOverflow: 0 + m_VerticalOverflow: 0 + m_LineSpacing: 1 + m_Text: StartRecord +--- !u!1 &8516946641700896979 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 4724915981391621506} + - component: {fileID: 5481287370648956891} + - component: {fileID: 6641738608645423593} + - component: {fileID: 8941537191785919389} + m_Layer: 5 + m_Name: RemoveNativeButton + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!224 &4724915981391621506 +RectTransform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 8516946641700896979} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: 0, y: 0, z: 0} + m_LocalScale: {x: 1, y: 1, z: 1} + m_ConstrainProportionsScale: 0 + m_Children: + - {fileID: 2828476879980855506} + m_Father: {fileID: 1240445629039028095} + m_RootOrder: 8 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} + m_AnchorMin: {x: 0.5, y: 0.5} + m_AnchorMax: {x: 0.5, y: 0.5} + m_AnchoredPosition: {x: -469, y: 31.000061} + m_SizeDelta: {x: 400, y: 120} + m_Pivot: {x: 0, y: 0.5} +--- !u!222 &5481287370648956891 +CanvasRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 8516946641700896979} + m_CullTransparentMesh: 1 +--- !u!114 &6641738608645423593 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 8516946641700896979} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: fe87c0e1cc204ed48ad3b37840f39efc, type: 3} + m_Name: + m_EditorClassIdentifier: + m_Material: {fileID: 0} + m_Color: {r: 1, g: 1, b: 1, a: 1} + m_RaycastTarget: 1 + m_RaycastPadding: {x: 0, y: 0, z: 0, w: 0} + m_Maskable: 1 + m_OnCullStateChanged: + m_PersistentCalls: + m_Calls: [] + m_Sprite: {fileID: 10905, guid: 0000000000000000f000000000000000, type: 0} + m_Type: 1 + m_PreserveAspect: 0 + m_FillCenter: 1 + m_FillMethod: 4 + m_FillAmount: 1 + m_FillClockwise: 1 + m_FillOrigin: 0 + m_UseSpriteMesh: 0 + m_PixelsPerUnitMultiplier: 1 +--- !u!114 &8941537191785919389 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 8516946641700896979} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 4e29b1a8efbd4b44bb3f3716e73f07ff, type: 3} + m_Name: + m_EditorClassIdentifier: + m_Navigation: + m_Mode: 3 + m_WrapAround: 0 + m_SelectOnUp: {fileID: 0} + m_SelectOnDown: {fileID: 0} + m_SelectOnLeft: {fileID: 0} + m_SelectOnRight: {fileID: 0} + m_Transition: 1 + m_Colors: + m_NormalColor: {r: 1, g: 1, b: 1, a: 1} + m_HighlightedColor: {r: 0.9607843, g: 0.9607843, b: 0.9607843, a: 1} + m_PressedColor: {r: 0.78431374, g: 0.78431374, b: 0.78431374, a: 1} + m_SelectedColor: {r: 0.9607843, g: 0.9607843, b: 0.9607843, a: 1} + m_DisabledColor: {r: 0.78431374, g: 0.78431374, b: 0.78431374, a: 0.5019608} + m_ColorMultiplier: 1 + m_FadeDuration: 0.1 + m_SpriteState: + m_HighlightedSprite: {fileID: 0} + m_PressedSprite: {fileID: 0} + m_SelectedSprite: {fileID: 0} + m_DisabledSprite: {fileID: 0} + m_AnimationTriggers: + m_NormalTrigger: Normal + m_HighlightedTrigger: Highlighted + m_PressedTrigger: Pressed + m_SelectedTrigger: Selected + m_DisabledTrigger: Disabled + m_Interactable: 1 + m_TargetGraphic: {fileID: 6641738608645423593} + m_OnClick: + m_PersistentCalls: + m_Calls: + - m_Target: {fileID: 7348458583946661662} + m_TargetAssemblyTypeName: HCDemoScene, Assembly-CSharp + m_MethodName: Button_RemoveNative + m_Mode: 1 + m_Arguments: + m_ObjectArgument: {fileID: 0} + m_ObjectArgumentAssemblyTypeName: UnityEngine.Object, UnityEngine + m_IntArgument: 0 + m_FloatArgument: 0 + m_StringArgument: + m_BoolArgument: 0 + m_CallState: 2 +--- !u!1 &8599511052816145311 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 88522639002915039} + - component: {fileID: 5731036791378373589} + - component: {fileID: 2509419330530331832} + - component: {fileID: 7393924066326098438} + m_Layer: 5 + m_Name: HideNativeButton3 + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!224 &88522639002915039 +RectTransform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 8599511052816145311} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: 0, y: 0, z: 0} + m_LocalScale: {x: 1, y: 1, z: 1} + m_ConstrainProportionsScale: 0 + m_Children: + - {fileID: 4410921710156430414} + m_Father: {fileID: 1240445629039028095} + m_RootOrder: 13 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} + m_AnchorMin: {x: 0.5, y: 0.5} + m_AnchorMax: {x: 0.5, y: 0.5} + m_AnchoredPosition: {x: 4, y: -294} + m_SizeDelta: {x: 400, y: 120} + m_Pivot: {x: 0, y: 0.5} +--- !u!222 &5731036791378373589 +CanvasRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 8599511052816145311} + m_CullTransparentMesh: 1 +--- !u!114 &2509419330530331832 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 8599511052816145311} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: fe87c0e1cc204ed48ad3b37840f39efc, type: 3} + m_Name: + m_EditorClassIdentifier: + m_Material: {fileID: 0} + m_Color: {r: 1, g: 1, b: 1, a: 1} + m_RaycastTarget: 1 + m_RaycastPadding: {x: 0, y: 0, z: 0, w: 0} + m_Maskable: 1 + m_OnCullStateChanged: + m_PersistentCalls: + m_Calls: [] + m_Sprite: {fileID: 10905, guid: 0000000000000000f000000000000000, type: 0} + m_Type: 1 + m_PreserveAspect: 0 + m_FillCenter: 1 + m_FillMethod: 4 + m_FillAmount: 1 + m_FillClockwise: 1 + m_FillOrigin: 0 + m_UseSpriteMesh: 0 + m_PixelsPerUnitMultiplier: 1 +--- !u!114 &7393924066326098438 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 8599511052816145311} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 4e29b1a8efbd4b44bb3f3716e73f07ff, type: 3} + m_Name: + m_EditorClassIdentifier: + m_Navigation: + m_Mode: 3 + m_WrapAround: 0 + m_SelectOnUp: {fileID: 0} + m_SelectOnDown: {fileID: 0} + m_SelectOnLeft: {fileID: 0} + m_SelectOnRight: {fileID: 0} + m_Transition: 1 + m_Colors: + m_NormalColor: {r: 1, g: 1, b: 1, a: 1} + m_HighlightedColor: {r: 0.9607843, g: 0.9607843, b: 0.9607843, a: 1} + m_PressedColor: {r: 0.78431374, g: 0.78431374, b: 0.78431374, a: 1} + m_SelectedColor: {r: 0.9607843, g: 0.9607843, b: 0.9607843, a: 1} + m_DisabledColor: {r: 0.78431374, g: 0.78431374, b: 0.78431374, a: 0.5019608} + m_ColorMultiplier: 1 + m_FadeDuration: 0.1 + m_SpriteState: + m_HighlightedSprite: {fileID: 0} + m_PressedSprite: {fileID: 0} + m_SelectedSprite: {fileID: 0} + m_DisabledSprite: {fileID: 0} + m_AnimationTriggers: + m_NormalTrigger: Normal + m_HighlightedTrigger: Highlighted + m_PressedTrigger: Pressed + m_SelectedTrigger: Selected + m_DisabledTrigger: Disabled + m_Interactable: 1 + m_TargetGraphic: {fileID: 2509419330530331832} + m_OnClick: + m_PersistentCalls: + m_Calls: + - m_Target: {fileID: 7348458583946661662} + m_TargetAssemblyTypeName: HCDemoScene, Assembly-CSharp + m_MethodName: Button_RemoveNative_3 + m_Mode: 1 + m_Arguments: + m_ObjectArgument: {fileID: 0} + m_ObjectArgumentAssemblyTypeName: UnityEngine.Object, UnityEngine + m_IntArgument: 0 + m_FloatArgument: 0 + m_StringArgument: + m_BoolArgument: 0 + m_CallState: 2 +--- !u!1 &8871623197544898555 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 5378779329489247566} + - component: {fileID: 5930735375174242643} + - component: {fileID: 6828885261393552781} + - component: {fileID: 8794852528563356124} + m_Layer: 5 + m_Name: NVButton + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!224 &5378779329489247566 +RectTransform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 8871623197544898555} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: 0, y: 0, z: 0} + m_LocalScale: {x: 1, y: 1, z: 1} + m_ConstrainProportionsScale: 0 + m_Children: + - {fileID: 3628657939277581149} + m_Father: {fileID: 1240445629039028095} + m_RootOrder: 5 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} + m_AnchorMin: {x: 0.5, y: 0.5} + m_AnchorMax: {x: 0.5, y: 0.5} + m_AnchoredPosition: {x: -469, y: 192.00006} + m_SizeDelta: {x: 400, y: 120} + m_Pivot: {x: 0, y: 0.5} +--- !u!222 &5930735375174242643 +CanvasRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 8871623197544898555} + m_CullTransparentMesh: 1 +--- !u!114 &6828885261393552781 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 8871623197544898555} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: fe87c0e1cc204ed48ad3b37840f39efc, type: 3} + m_Name: + m_EditorClassIdentifier: + m_Material: {fileID: 0} + m_Color: {r: 1, g: 1, b: 1, a: 1} + m_RaycastTarget: 1 + m_RaycastPadding: {x: 0, y: 0, z: 0, w: 0} + m_Maskable: 1 + m_OnCullStateChanged: + m_PersistentCalls: + m_Calls: [] + m_Sprite: {fileID: 10905, guid: 0000000000000000f000000000000000, type: 0} + m_Type: 1 + m_PreserveAspect: 0 + m_FillCenter: 1 + m_FillMethod: 4 + m_FillAmount: 1 + m_FillClockwise: 1 + m_FillOrigin: 0 + m_UseSpriteMesh: 0 + m_PixelsPerUnitMultiplier: 1 +--- !u!114 &8794852528563356124 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 8871623197544898555} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 4e29b1a8efbd4b44bb3f3716e73f07ff, type: 3} + m_Name: + m_EditorClassIdentifier: + m_Navigation: + m_Mode: 3 + m_WrapAround: 0 + m_SelectOnUp: {fileID: 0} + m_SelectOnDown: {fileID: 0} + m_SelectOnLeft: {fileID: 0} + m_SelectOnRight: {fileID: 0} + m_Transition: 1 + m_Colors: + m_NormalColor: {r: 1, g: 1, b: 1, a: 1} + m_HighlightedColor: {r: 0.9607843, g: 0.9607843, b: 0.9607843, a: 1} + m_PressedColor: {r: 0.78431374, g: 0.78431374, b: 0.78431374, a: 1} + m_SelectedColor: {r: 0.9607843, g: 0.9607843, b: 0.9607843, a: 1} + m_DisabledColor: {r: 0.78431374, g: 0.78431374, b: 0.78431374, a: 0.5019608} + m_ColorMultiplier: 1 + m_FadeDuration: 0.1 + m_SpriteState: + m_HighlightedSprite: {fileID: 0} + m_PressedSprite: {fileID: 0} + m_SelectedSprite: {fileID: 0} + m_DisabledSprite: {fileID: 0} + m_AnimationTriggers: + m_NormalTrigger: Normal + m_HighlightedTrigger: Highlighted + m_PressedTrigger: Pressed + m_SelectedTrigger: Selected + m_DisabledTrigger: Disabled + m_Interactable: 1 + m_TargetGraphic: {fileID: 6828885261393552781} + m_OnClick: + m_PersistentCalls: + m_Calls: + - m_Target: {fileID: 7348458583946661662} + m_TargetAssemblyTypeName: HCDemoScene, Assembly-CSharp + m_MethodName: Button_ShowNative + m_Mode: 1 + m_Arguments: + m_ObjectArgument: {fileID: 0} + m_ObjectArgumentAssemblyTypeName: UnityEngine.Object, UnityEngine + m_IntArgument: 0 + m_FloatArgument: 0 + m_StringArgument: + m_BoolArgument: 0 + m_CallState: 2 +--- !u!1 &9049411200735095089 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 8767559988700284408} + - component: {fileID: 2527370381289334922} + - component: {fileID: 4333276186086012546} + m_Layer: 5 + m_Name: Text + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!224 &8767559988700284408 +RectTransform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 9049411200735095089} + m_LocalRotation: {x: -0, y: -0, z: -0, w: 1} + m_LocalPosition: {x: 0, y: 0, z: 0} + m_LocalScale: {x: 1, y: 1, z: 1} + m_ConstrainProportionsScale: 0 + m_Children: [] + m_Father: {fileID: 5395937451915722863} + m_RootOrder: 0 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} + m_AnchorMin: {x: 0, y: 0} + m_AnchorMax: {x: 1, y: 1} + m_AnchoredPosition: {x: 0, y: 0} + m_SizeDelta: {x: 0, y: 0} + m_Pivot: {x: 0.5, y: 0.5} +--- !u!222 &2527370381289334922 +CanvasRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 9049411200735095089} + m_CullTransparentMesh: 1 +--- !u!114 &4333276186086012546 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 9049411200735095089} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 5f7201a12d95ffc409449d95f23cf332, type: 3} + m_Name: + m_EditorClassIdentifier: + m_Material: {fileID: 0} + m_Color: {r: 0.19607843, g: 0.19607843, b: 0.19607843, a: 1} + m_RaycastTarget: 1 + m_RaycastPadding: {x: 0, y: 0, z: 0, w: 0} + m_Maskable: 1 + m_OnCullStateChanged: + m_PersistentCalls: + m_Calls: [] + m_FontData: + m_Font: {fileID: 10102, guid: 0000000000000000e000000000000000, type: 0} + m_FontSize: 48 + m_FontStyle: 0 + m_BestFit: 0 + m_MinSize: 4 + m_MaxSize: 48 + m_Alignment: 4 + m_AlignByGeometry: 0 + m_RichText: 1 + m_HorizontalOverflow: 0 + m_VerticalOverflow: 0 + m_LineSpacing: 1 + m_Text: Native4 +--- !u!1 &9213862441305793758 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 7424365926007618859} + - component: {fileID: 5249636239993767689} + - component: {fileID: 1646592906570625939} + m_Layer: 5 + m_Name: Text + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!224 &7424365926007618859 +RectTransform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 9213862441305793758} + m_LocalRotation: {x: -0, y: -0, z: -0, w: 1} + m_LocalPosition: {x: 0, y: 0, z: 0} + m_LocalScale: {x: 1, y: 1, z: 1} + m_ConstrainProportionsScale: 0 + m_Children: [] + m_Father: {fileID: 2401205720692808534} + m_RootOrder: 0 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} + m_AnchorMin: {x: 0, y: 0} + m_AnchorMax: {x: 1, y: 1} + m_AnchoredPosition: {x: 0, y: 0} + m_SizeDelta: {x: 0, y: 0} + m_Pivot: {x: 0.5, y: 0.5} +--- !u!222 &5249636239993767689 +CanvasRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 9213862441305793758} + m_CullTransparentMesh: 1 +--- !u!114 &1646592906570625939 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 9213862441305793758} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 5f7201a12d95ffc409449d95f23cf332, type: 3} + m_Name: + m_EditorClassIdentifier: + m_Material: {fileID: 0} + m_Color: {r: 0.19607843, g: 0.19607843, b: 0.19607843, a: 1} + m_RaycastTarget: 1 + m_RaycastPadding: {x: 0, y: 0, z: 0, w: 0} + m_Maskable: 1 + m_OnCullStateChanged: + m_PersistentCalls: + m_Calls: [] + m_FontData: + m_Font: {fileID: 10102, guid: 0000000000000000e000000000000000, type: 0} + m_FontSize: 48 + m_FontStyle: 0 + m_BestFit: 0 + m_MinSize: 4 + m_MaxSize: 48 + m_Alignment: 4 + m_AlignByGeometry: 0 + m_RichText: 1 + m_HorizontalOverflow: 0 + m_VerticalOverflow: 0 + m_LineSpacing: 1 + m_Text: IV diff --git a/Assets/HCMiniSdk/Demo/Resources/MainDemoView.prefab.meta b/Assets/HCMiniSdk/Demo/Resources/MainDemoView.prefab.meta new file mode 100644 index 00000000..e9a00d8d --- /dev/null +++ b/Assets/HCMiniSdk/Demo/Resources/MainDemoView.prefab.meta @@ -0,0 +1,7 @@ +fileFormatVersion: 2 +guid: 5c2c2a1ec1c2b413089f70d32db88680 +PrefabImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/HCMiniSdk/Demo/Scene.meta b/Assets/HCMiniSdk/Demo/Scene.meta new file mode 100644 index 00000000..655ccad1 --- /dev/null +++ b/Assets/HCMiniSdk/Demo/Scene.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: 2ab7148cf20fc4c52ad2a09567a15f42 +folderAsset: yes +DefaultImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/HCMiniSdk/Demo/Scene/HCDemoScene.unity b/Assets/HCMiniSdk/Demo/Scene/HCDemoScene.unity new file mode 100644 index 00000000..0023f66c --- /dev/null +++ b/Assets/HCMiniSdk/Demo/Scene/HCDemoScene.unity @@ -0,0 +1,2928 @@ +%YAML 1.1 +%TAG !u! tag:unity3d.com,2011: +--- !u!29 &1 +OcclusionCullingSettings: + m_ObjectHideFlags: 0 + serializedVersion: 2 + m_OcclusionBakeSettings: + smallestOccluder: 5 + smallestHole: 0.25 + backfaceThreshold: 100 + m_SceneGUID: 00000000000000000000000000000000 + m_OcclusionCullingData: {fileID: 0} +--- !u!104 &2 +RenderSettings: + m_ObjectHideFlags: 0 + serializedVersion: 9 + m_Fog: 0 + m_FogColor: {r: 0.5, g: 0.5, b: 0.5, a: 1} + m_FogMode: 3 + m_FogDensity: 0.01 + m_LinearFogStart: 0 + m_LinearFogEnd: 300 + m_AmbientSkyColor: {r: 0.212, g: 0.227, b: 0.259, a: 1} + m_AmbientEquatorColor: {r: 0.114, g: 0.125, b: 0.133, a: 1} + m_AmbientGroundColor: {r: 0.047, g: 0.043, b: 0.035, a: 1} + m_AmbientIntensity: 1 + m_AmbientMode: 0 + m_SubtractiveShadowColor: {r: 0.42, g: 0.478, b: 0.627, a: 1} + m_SkyboxMaterial: {fileID: 10304, guid: 0000000000000000f000000000000000, type: 0} + m_HaloStrength: 0.5 + m_FlareStrength: 1 + m_FlareFadeSpeed: 3 + m_HaloTexture: {fileID: 0} + m_SpotCookie: {fileID: 10001, guid: 0000000000000000e000000000000000, type: 0} + m_DefaultReflectionMode: 0 + m_DefaultReflectionResolution: 128 + m_ReflectionBounces: 1 + m_ReflectionIntensity: 1 + m_CustomReflection: {fileID: 0} + m_Sun: {fileID: 0} + m_IndirectSpecularColor: {r: 0.44657815, g: 0.49641192, b: 0.57481617, a: 1} + m_UseRadianceAmbientProbe: 0 +--- !u!157 &3 +LightmapSettings: + m_ObjectHideFlags: 0 + serializedVersion: 12 + m_GIWorkflowMode: 1 + m_GISettings: + serializedVersion: 2 + m_BounceScale: 1 + m_IndirectOutputScale: 1 + m_AlbedoBoost: 1 + m_EnvironmentLightingMode: 0 + m_EnableBakedLightmaps: 1 + m_EnableRealtimeLightmaps: 0 + m_LightmapEditorSettings: + serializedVersion: 12 + m_Resolution: 2 + m_BakeResolution: 40 + m_AtlasSize: 1024 + m_AO: 0 + m_AOMaxDistance: 1 + m_CompAOExponent: 1 + m_CompAOExponentDirect: 0 + m_ExtractAmbientOcclusion: 0 + m_Padding: 2 + m_LightmapParameters: {fileID: 0} + m_LightmapsBakeMode: 1 + m_TextureCompression: 1 + m_FinalGather: 0 + m_FinalGatherFiltering: 1 + m_FinalGatherRayCount: 256 + m_ReflectionCompression: 2 + m_MixedBakeMode: 2 + m_BakeBackend: 1 + m_PVRSampling: 1 + m_PVRDirectSampleCount: 32 + m_PVRSampleCount: 512 + m_PVRBounces: 2 + m_PVREnvironmentSampleCount: 256 + m_PVREnvironmentReferencePointCount: 2048 + m_PVRFilteringMode: 1 + m_PVRDenoiserTypeDirect: 1 + m_PVRDenoiserTypeIndirect: 1 + m_PVRDenoiserTypeAO: 1 + m_PVRFilterTypeDirect: 0 + m_PVRFilterTypeIndirect: 0 + m_PVRFilterTypeAO: 0 + m_PVREnvironmentMIS: 1 + m_PVRCulling: 1 + m_PVRFilteringGaussRadiusDirect: 1 + m_PVRFilteringGaussRadiusIndirect: 5 + m_PVRFilteringGaussRadiusAO: 2 + m_PVRFilteringAtrousPositionSigmaDirect: 0.5 + m_PVRFilteringAtrousPositionSigmaIndirect: 2 + m_PVRFilteringAtrousPositionSigmaAO: 1 + m_ExportTrainingData: 0 + m_TrainingDataDestination: TrainingData + m_LightProbeSampleCountMultiplier: 4 + m_LightingDataAsset: {fileID: 0} + m_LightingSettings: {fileID: 0} +--- !u!196 &4 +NavMeshSettings: + serializedVersion: 2 + m_ObjectHideFlags: 0 + m_BuildSettings: + serializedVersion: 2 + agentTypeID: 0 + agentRadius: 0.5 + agentHeight: 2 + agentSlope: 45 + agentClimb: 0.4 + ledgeDropHeight: 0 + maxJumpAcrossDistance: 0 + minRegionArea: 2 + manualCellSize: 0 + cellSize: 0.16666667 + manualTileSize: 0 + tileSize: 256 + accuratePlacement: 0 + maxJobWorkers: 0 + preserveTilesOutsideBounds: 0 + debug: + m_Flags: 0 + m_NavMeshData: {fileID: 0} +--- !u!1 &293459840 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 293459841} + - component: {fileID: 293459843} + - component: {fileID: 293459842} + m_Layer: 5 + m_Name: Text + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!224 &293459841 +RectTransform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 293459840} + m_LocalRotation: {x: -0, y: -0, z: -0, w: 1} + m_LocalPosition: {x: 0, y: 0, z: 0} + m_LocalScale: {x: 1, y: 1, z: 1} + m_ConstrainProportionsScale: 0 + m_Children: [] + m_Father: {fileID: 1249814389} + m_RootOrder: 0 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} + m_AnchorMin: {x: 0, y: 0} + m_AnchorMax: {x: 1, y: 1} + m_AnchoredPosition: {x: 0, y: 0} + m_SizeDelta: {x: 0, y: 0} + m_Pivot: {x: 0.5, y: 0.5} +--- !u!114 &293459842 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 293459840} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 5f7201a12d95ffc409449d95f23cf332, type: 3} + m_Name: + m_EditorClassIdentifier: + m_Material: {fileID: 0} + m_Color: {r: 0.19607843, g: 0.19607843, b: 0.19607843, a: 1} + m_RaycastTarget: 1 + m_RaycastPadding: {x: 0, y: 0, z: 0, w: 0} + m_Maskable: 1 + m_OnCullStateChanged: + m_PersistentCalls: + m_Calls: [] + m_FontData: + m_Font: {fileID: 10102, guid: 0000000000000000e000000000000000, type: 0} + m_FontSize: 48 + m_FontStyle: 0 + m_BestFit: 0 + m_MinSize: 4 + m_MaxSize: 48 + m_Alignment: 4 + m_AlignByGeometry: 0 + m_RichText: 1 + m_HorizontalOverflow: 0 + m_VerticalOverflow: 0 + m_LineSpacing: 1 + m_Text: FriendsRank +--- !u!222 &293459843 +CanvasRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 293459840} + m_CullTransparentMesh: 1 +--- !u!1 &347109330 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 347109331} + - component: {fileID: 347109334} + - component: {fileID: 347109333} + - component: {fileID: 347109332} + - component: {fileID: 347109335} + m_Layer: 5 + m_Name: InputField + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!224 &347109331 +RectTransform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 347109330} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: 0, y: 0, z: 0} + m_LocalScale: {x: 1, y: 1, z: 1} + m_ConstrainProportionsScale: 0 + m_Children: + - {fileID: 1206114823} + - {fileID: 887356211} + m_Father: {fileID: 1117415502} + m_RootOrder: 1 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} + m_AnchorMin: {x: 0, y: 1} + m_AnchorMax: {x: 1, y: 1} + m_AnchoredPosition: {x: 0, y: -439} + m_SizeDelta: {x: -200, y: 100} + m_Pivot: {x: 0.5, y: 0.5} +--- !u!114 &347109332 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 347109330} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: d199490a83bb2b844b9695cbf13b01ef, type: 3} + m_Name: + m_EditorClassIdentifier: + m_Navigation: + m_Mode: 3 + m_WrapAround: 0 + m_SelectOnUp: {fileID: 0} + m_SelectOnDown: {fileID: 0} + m_SelectOnLeft: {fileID: 0} + m_SelectOnRight: {fileID: 0} + m_Transition: 1 + m_Colors: + m_NormalColor: {r: 1, g: 1, b: 1, a: 1} + m_HighlightedColor: {r: 0.9607843, g: 0.9607843, b: 0.9607843, a: 1} + m_PressedColor: {r: 0.78431374, g: 0.78431374, b: 0.78431374, a: 1} + m_SelectedColor: {r: 0.9607843, g: 0.9607843, b: 0.9607843, a: 1} + m_DisabledColor: {r: 0.78431374, g: 0.78431374, b: 0.78431374, a: 0.5019608} + m_ColorMultiplier: 1 + m_FadeDuration: 0.1 + m_SpriteState: + m_HighlightedSprite: {fileID: 0} + m_PressedSprite: {fileID: 0} + m_SelectedSprite: {fileID: 0} + m_DisabledSprite: {fileID: 0} + m_AnimationTriggers: + m_NormalTrigger: Normal + m_HighlightedTrigger: Highlighted + m_PressedTrigger: Pressed + m_SelectedTrigger: Selected + m_DisabledTrigger: Disabled + m_Interactable: 1 + m_TargetGraphic: {fileID: 347109333} + m_TextComponent: {fileID: 887356212} + m_Placeholder: {fileID: 1206114824} + m_ContentType: 0 + m_InputType: 0 + m_AsteriskChar: 42 + m_KeyboardType: 0 + m_LineType: 0 + m_HideMobileInput: 0 + m_CharacterValidation: 0 + m_CharacterLimit: 0 + m_OnSubmit: + m_PersistentCalls: + m_Calls: [] + m_OnDidEndEdit: + m_PersistentCalls: + m_Calls: [] + m_OnValueChanged: + m_PersistentCalls: + m_Calls: [] + m_CaretColor: {r: 0.19607843, g: 0.19607843, b: 0.19607843, a: 1} + m_CustomCaretColor: 0 + m_SelectionColor: {r: 0.65882355, g: 0.80784315, b: 1, a: 0.7529412} + m_Text: + m_CaretBlinkRate: 0.85 + m_CaretWidth: 1 + m_ReadOnly: 0 + m_ShouldActivateOnSelect: 1 +--- !u!114 &347109333 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 347109330} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: fe87c0e1cc204ed48ad3b37840f39efc, type: 3} + m_Name: + m_EditorClassIdentifier: + m_Material: {fileID: 0} + m_Color: {r: 1, g: 1, b: 1, a: 1} + m_RaycastTarget: 1 + m_RaycastPadding: {x: 0, y: 0, z: 0, w: 0} + m_Maskable: 1 + m_OnCullStateChanged: + m_PersistentCalls: + m_Calls: [] + m_Sprite: {fileID: 10911, guid: 0000000000000000f000000000000000, type: 0} + m_Type: 1 + m_PreserveAspect: 0 + m_FillCenter: 1 + m_FillMethod: 4 + m_FillAmount: 1 + m_FillClockwise: 1 + m_FillOrigin: 0 + m_UseSpriteMesh: 0 + m_PixelsPerUnitMultiplier: 1 +--- !u!222 &347109334 +CanvasRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 347109330} + m_CullTransparentMesh: 1 +--- !u!114 &347109335 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 347109330} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 75b1af924b324371ae9fdce2a490d481, type: 3} + m_Name: + m_EditorClassIdentifier: +--- !u!224 &391857240 stripped +RectTransform: + m_CorrespondingSourceObject: {fileID: 4294162432436564280, guid: f72cd7b149a7e42d6818628ebadb8ba4, + type: 3} + m_PrefabInstance: {fileID: 4294162432255735136} + m_PrefabAsset: {fileID: 0} +--- !u!114 &391857241 stripped +MonoBehaviour: + m_CorrespondingSourceObject: {fileID: 733856151592599062, guid: f72cd7b149a7e42d6818628ebadb8ba4, + type: 3} + m_PrefabInstance: {fileID: 4294162432255735136} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 0} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 370553651bea74befb3856be623fce3c, type: 3} + m_Name: + m_EditorClassIdentifier: +--- !u!1 &537742147 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 537742148} + - component: {fileID: 537742150} + - component: {fileID: 537742149} + m_Layer: 5 + m_Name: Text (Legacy) + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!224 &537742148 +RectTransform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 537742147} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: 0, y: 0, z: 0} + m_LocalScale: {x: 1, y: 1, z: 1} + m_ConstrainProportionsScale: 0 + m_Children: [] + m_Father: {fileID: 1324528415} + m_RootOrder: 0 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} + m_AnchorMin: {x: 0, y: 1} + m_AnchorMax: {x: 0, y: 1} + m_AnchoredPosition: {x: 1857.2661, y: -100} + m_SizeDelta: {x: 350, y: 200} + m_Pivot: {x: 0.5, y: 0.5} +--- !u!114 &537742149 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 537742147} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 5f7201a12d95ffc409449d95f23cf332, type: 3} + m_Name: + m_EditorClassIdentifier: + m_Material: {fileID: 0} + m_Color: {r: 0.19607843, g: 0.19607843, b: 0.19607843, a: 1} + m_RaycastTarget: 1 + m_RaycastPadding: {x: 0, y: 0, z: 0, w: 0} + m_Maskable: 1 + m_OnCullStateChanged: + m_PersistentCalls: + m_Calls: [] + m_FontData: + m_Font: {fileID: 10102, guid: 0000000000000000e000000000000000, type: 0} + m_FontSize: 50 + m_FontStyle: 0 + m_BestFit: 0 + m_MinSize: 5 + m_MaxSize: 50 + m_Alignment: 3 + m_AlignByGeometry: 0 + m_RichText: 1 + m_HorizontalOverflow: 0 + m_VerticalOverflow: 0 + m_LineSpacing: 1 + m_Text: 'HasSensitive:' +--- !u!222 &537742150 +CanvasRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 537742147} + m_CullTransparentMesh: 1 +--- !u!1 &548341157 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 548341161} + - component: {fileID: 548341160} + - component: {fileID: 548341159} + - component: {fileID: 548341158} + m_Layer: 5 + m_Name: Canvas + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!114 &548341158 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 548341157} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: dc42784cf147c0c48a680349fa168899, type: 3} + m_Name: + m_EditorClassIdentifier: + m_IgnoreReversedGraphics: 1 + m_BlockingObjects: 0 + m_BlockingMask: + serializedVersion: 2 + m_Bits: 4294967295 +--- !u!114 &548341159 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 548341157} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 0cd44c1031e13a943bb63640046fad76, type: 3} + m_Name: + m_EditorClassIdentifier: + m_UiScaleMode: 1 + m_ReferencePixelsPerUnit: 100 + m_ScaleFactor: 1 + m_ReferenceResolution: {x: 1080, y: 1920} + m_ScreenMatchMode: 1 + m_MatchWidthOrHeight: 0 + m_PhysicalUnit: 3 + m_FallbackScreenDPI: 96 + m_DefaultSpriteDPI: 96 + m_DynamicPixelsPerUnit: 1 + m_PresetInfoIsWorld: 0 +--- !u!223 &548341160 +Canvas: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 548341157} + m_Enabled: 1 + serializedVersion: 3 + m_RenderMode: 0 + m_Camera: {fileID: 0} + m_PlaneDistance: 100 + m_PixelPerfect: 0 + m_ReceivesEvents: 1 + m_OverrideSorting: 0 + m_OverridePixelPerfect: 0 + m_SortingBucketNormalizedSize: 0 + m_AdditionalShaderChannelsFlag: 25 + m_SortingLayerID: 0 + m_SortingOrder: 0 + m_TargetDisplay: 0 +--- !u!224 &548341161 +RectTransform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 548341157} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: 0, y: 0, z: 0} + m_LocalScale: {x: 0, y: 0, z: 0} + m_ConstrainProportionsScale: 0 + m_Children: + - {fileID: 1259983528} + - {fileID: 391857240} + - {fileID: 1117415502} + m_Father: {fileID: 0} + m_RootOrder: 2 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} + m_AnchorMin: {x: 0, y: 0} + m_AnchorMax: {x: 0, y: 0} + m_AnchoredPosition: {x: 0, y: 0} + m_SizeDelta: {x: 0, y: 0} + m_Pivot: {x: 0, y: 0} +--- !u!1 &743846833 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 743846834} + - component: {fileID: 743846836} + - component: {fileID: 743846835} + m_Layer: 5 + m_Name: Text (Legacy) (4) + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!224 &743846834 +RectTransform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 743846833} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: 0, y: 0, z: 0} + m_LocalScale: {x: 1, y: 1, z: 1} + m_ConstrainProportionsScale: 0 + m_Children: [] + m_Father: {fileID: 1324528415} + m_RootOrder: 4 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} + m_AnchorMin: {x: 0, y: 1} + m_AnchorMax: {x: 0, y: 1} + m_AnchoredPosition: {x: 1857.2661, y: -500} + m_SizeDelta: {x: 350, y: 200} + m_Pivot: {x: 0.5, y: 0.5} +--- !u!114 &743846835 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 743846833} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 5f7201a12d95ffc409449d95f23cf332, type: 3} + m_Name: + m_EditorClassIdentifier: + m_Material: {fileID: 0} + m_Color: {r: 0.19607843, g: 0.19607843, b: 0.19607843, a: 1} + m_RaycastTarget: 1 + m_RaycastPadding: {x: 0, y: 0, z: 0, w: 0} + m_Maskable: 1 + m_OnCullStateChanged: + m_PersistentCalls: + m_Calls: [] + m_FontData: + m_Font: {fileID: 10102, guid: 0000000000000000e000000000000000, type: 0} + m_FontSize: 50 + m_FontStyle: 0 + m_BestFit: 0 + m_MinSize: 5 + m_MaxSize: 50 + m_Alignment: 3 + m_AlignByGeometry: 0 + m_RichText: 1 + m_HorizontalOverflow: 0 + m_VerticalOverflow: 0 + m_LineSpacing: 1 + m_Text: 'Text:' +--- !u!222 &743846836 +CanvasRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 743846833} + m_CullTransparentMesh: 1 +--- !u!1 &837296880 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 837296883} + - component: {fileID: 837296882} + - component: {fileID: 837296881} + m_Layer: 0 + m_Name: Main Camera + m_TagString: MainCamera + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!81 &837296881 +AudioListener: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 837296880} + m_Enabled: 1 +--- !u!20 &837296882 +Camera: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 837296880} + m_Enabled: 1 + serializedVersion: 2 + m_ClearFlags: 2 + m_BackGroundColor: {r: 0.2509804, g: 0.38039216, b: 0.17254902, a: 0} + m_projectionMatrixMode: 1 + m_GateFitMode: 2 + m_FOVAxisMode: 0 + m_SensorSize: {x: 36, y: 24} + m_LensShift: {x: 0, y: 0} + m_FocalLength: 50 + m_NormalizedViewPortRect: + serializedVersion: 2 + x: 0 + y: 0 + width: 1 + height: 1 + near clip plane: 0.3 + far clip plane: 1000 + field of view: 60 + orthographic: 0 + orthographic size: 5 + m_Depth: -1 + m_CullingMask: + serializedVersion: 2 + m_Bits: 4294967295 + m_RenderingPath: -1 + m_TargetTexture: {fileID: 0} + m_TargetDisplay: 0 + m_TargetEye: 3 + m_HDR: 1 + m_AllowMSAA: 1 + m_AllowDynamicResolution: 0 + m_ForceIntoRT: 0 + m_OcclusionCulling: 1 + m_StereoConvergence: 10 + m_StereoSeparation: 0.022 +--- !u!4 &837296883 +Transform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 837296880} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: 0, y: 1, z: -10} + m_LocalScale: {x: 1, y: 1, z: 1} + m_ConstrainProportionsScale: 0 + m_Children: [] + m_Father: {fileID: 0} + m_RootOrder: 0 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} +--- !u!1 &884394861 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 884394863} + - component: {fileID: 884394862} + m_Layer: 0 + m_Name: Directional Light + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!108 &884394862 +Light: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 884394861} + m_Enabled: 1 + serializedVersion: 10 + m_Type: 1 + m_Shape: 0 + m_Color: {r: 1, g: 0.95686275, b: 0.8392157, a: 1} + m_Intensity: 1 + m_Range: 10 + m_SpotAngle: 30 + m_InnerSpotAngle: 21.80208 + m_CookieSize: 10 + m_Shadows: + m_Type: 2 + m_Resolution: -1 + m_CustomResolution: -1 + m_Strength: 1 + m_Bias: 0.05 + m_NormalBias: 0.4 + m_NearPlane: 0.2 + m_CullingMatrixOverride: + e00: 1 + e01: 0 + e02: 0 + e03: 0 + e10: 0 + e11: 1 + e12: 0 + e13: 0 + e20: 0 + e21: 0 + e22: 1 + e23: 0 + e30: 0 + e31: 0 + e32: 0 + e33: 1 + m_UseCullingMatrixOverride: 0 + m_Cookie: {fileID: 0} + m_DrawHalo: 0 + m_Flare: {fileID: 0} + m_RenderMode: 0 + m_CullingMask: + serializedVersion: 2 + m_Bits: 4294967295 + m_RenderingLayerMask: 1 + m_Lightmapping: 4 + m_LightShadowCasterMode: 0 + m_AreaSize: {x: 1, y: 1} + m_BounceIntensity: 1 + m_ColorTemperature: 6570 + m_UseColorTemperature: 0 + m_BoundingSphereOverride: {x: 0, y: 0, z: 0, w: 0} + m_UseBoundingSphereOverride: 0 + m_UseViewFrustumForShadowCasterCull: 1 + m_ShadowRadius: 0 + m_ShadowAngle: 0 +--- !u!4 &884394863 +Transform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 884394861} + m_LocalRotation: {x: 0.40821788, y: -0.23456968, z: 0.10938163, w: 0.8754261} + m_LocalPosition: {x: 0, y: 3, z: 0} + m_LocalScale: {x: 1, y: 1, z: 1} + m_ConstrainProportionsScale: 0 + m_Children: [] + m_Father: {fileID: 0} + m_RootOrder: 1 + m_LocalEulerAnglesHint: {x: 50, y: -30, z: 0} +--- !u!1 &887356210 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 887356211} + - component: {fileID: 887356213} + - component: {fileID: 887356212} + m_Layer: 5 + m_Name: Text + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!224 &887356211 +RectTransform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 887356210} + m_LocalRotation: {x: -0, y: -0, z: -0, w: 1} + m_LocalPosition: {x: 0, y: 0, z: 0} + m_LocalScale: {x: 1, y: 1, z: 1} + m_ConstrainProportionsScale: 0 + m_Children: [] + m_Father: {fileID: 347109331} + m_RootOrder: 1 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} + m_AnchorMin: {x: 0, y: 0} + m_AnchorMax: {x: 1, y: 1} + m_AnchoredPosition: {x: 0, y: -0.5} + m_SizeDelta: {x: -20, y: -13} + m_Pivot: {x: 0.5, y: 0.5} +--- !u!114 &887356212 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 887356210} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 5f7201a12d95ffc409449d95f23cf332, type: 3} + m_Name: + m_EditorClassIdentifier: + m_Material: {fileID: 0} + m_Color: {r: 0.19607843, g: 0.19607843, b: 0.19607843, a: 1} + m_RaycastTarget: 1 + m_RaycastPadding: {x: 0, y: 0, z: 0, w: 0} + m_Maskable: 1 + m_OnCullStateChanged: + m_PersistentCalls: + m_Calls: [] + m_FontData: + m_Font: {fileID: 10102, guid: 0000000000000000e000000000000000, type: 0} + m_FontSize: 50 + m_FontStyle: 0 + m_BestFit: 0 + m_MinSize: 1 + m_MaxSize: 100 + m_Alignment: 3 + m_AlignByGeometry: 0 + m_RichText: 0 + m_HorizontalOverflow: 1 + m_VerticalOverflow: 0 + m_LineSpacing: 1 + m_Text: +--- !u!222 &887356213 +CanvasRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 887356210} + m_CullTransparentMesh: 1 +--- !u!1 &1088553688 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 1088553689} + - component: {fileID: 1088553691} + - component: {fileID: 1088553690} + m_Layer: 5 + m_Name: Text (Legacy) (1) + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!224 &1088553689 +RectTransform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1088553688} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: 0, y: 0, z: 0} + m_LocalScale: {x: 1, y: 1, z: 1} + m_ConstrainProportionsScale: 0 + m_Children: [] + m_Father: {fileID: 1324528415} + m_RootOrder: 1 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} + m_AnchorMin: {x: 0, y: 1} + m_AnchorMax: {x: 0, y: 1} + m_AnchoredPosition: {x: 2227.266, y: -100} + m_SizeDelta: {x: 350, y: 200} + m_Pivot: {x: 0.5, y: 0.5} +--- !u!114 &1088553690 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1088553688} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 5f7201a12d95ffc409449d95f23cf332, type: 3} + m_Name: + m_EditorClassIdentifier: + m_Material: {fileID: 0} + m_Color: {r: 0.23529412, g: 0.81960785, b: 0.31764707, a: 1} + m_RaycastTarget: 1 + m_RaycastPadding: {x: 0, y: 0, z: 0, w: 0} + m_Maskable: 1 + m_OnCullStateChanged: + m_PersistentCalls: + m_Calls: [] + m_FontData: + m_Font: {fileID: 10102, guid: 0000000000000000e000000000000000, type: 0} + m_FontSize: 50 + m_FontStyle: 0 + m_BestFit: 0 + m_MinSize: 5 + m_MaxSize: 50 + m_Alignment: 3 + m_AlignByGeometry: 0 + m_RichText: 1 + m_HorizontalOverflow: 0 + m_VerticalOverflow: 0 + m_LineSpacing: 1 + m_Text: +--- !u!222 &1088553691 +CanvasRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1088553688} + m_CullTransparentMesh: 1 +--- !u!1 &1097981909 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 1097981910} + - component: {fileID: 1097981912} + - component: {fileID: 1097981911} + m_Layer: 5 + m_Name: FriendsRankPanel + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 0 +--- !u!224 &1097981910 +RectTransform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1097981909} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: 0, y: 0, z: 0} + m_LocalScale: {x: 1, y: 1, z: 1} + m_ConstrainProportionsScale: 0 + m_Children: + - {fileID: 1500506545} + - {fileID: 2093305768} + m_Father: {fileID: 2016519414} + m_RootOrder: 12 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} + m_AnchorMin: {x: 0.5, y: 0.5} + m_AnchorMax: {x: 0.5, y: 0.5} + m_AnchoredPosition: {x: 0, y: 0} + m_SizeDelta: {x: 800, y: 1200} + m_Pivot: {x: 0.5, y: 0.5} +--- !u!114 &1097981911 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1097981909} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: fe87c0e1cc204ed48ad3b37840f39efc, type: 3} + m_Name: + m_EditorClassIdentifier: + m_Material: {fileID: 0} + m_Color: {r: 1, g: 0.84313726, b: 0.62352943, a: 1} + m_RaycastTarget: 1 + m_RaycastPadding: {x: 0, y: 0, z: 0, w: 0} + m_Maskable: 1 + m_OnCullStateChanged: + m_PersistentCalls: + m_Calls: [] + m_Sprite: {fileID: 0} + m_Type: 0 + m_PreserveAspect: 0 + m_FillCenter: 1 + m_FillMethod: 4 + m_FillAmount: 1 + m_FillClockwise: 1 + m_FillOrigin: 0 + m_UseSpriteMesh: 0 + m_PixelsPerUnitMultiplier: 1 +--- !u!222 &1097981912 +CanvasRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1097981909} + m_CullTransparentMesh: 1 +--- !u!1 &1117415501 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 1117415502} + - component: {fileID: 1117415505} + - component: {fileID: 1117415504} + - component: {fileID: 1117415503} + m_Layer: 5 + m_Name: CheckSensitiveDemoView + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 0 +--- !u!224 &1117415502 +RectTransform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1117415501} + m_LocalRotation: {x: -0, y: -0, z: -0, w: 1} + m_LocalPosition: {x: 0, y: 0, z: 0} + m_LocalScale: {x: 1, y: 1, z: 1} + m_ConstrainProportionsScale: 0 + m_Children: + - {fileID: 1935668894} + - {fileID: 347109331} + - {fileID: 1136649633} + - {fileID: 1324528415} + m_Father: {fileID: 548341161} + m_RootOrder: 2 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} + m_AnchorMin: {x: 0, y: 0} + m_AnchorMax: {x: 1, y: 1} + m_AnchoredPosition: {x: 0, y: 0} + m_SizeDelta: {x: 0, y: 0} + m_Pivot: {x: 0.5, y: 0.5} +--- !u!114 &1117415503 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1117415501} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: f263d468b9ec4c9f991a1a39f5869cf5, type: 3} + m_Name: + m_EditorClassIdentifier: + InputField: {fileID: 347109332} + Button: {fileID: 1136649634} + HasSensitiveText: {fileID: 1088553690} + TextText: {fileID: 1981647159} + CheckSourceText: {fileID: 2059125835} +--- !u!114 &1117415504 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1117415501} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: fe87c0e1cc204ed48ad3b37840f39efc, type: 3} + m_Name: + m_EditorClassIdentifier: + m_Material: {fileID: 0} + m_Color: {r: 0.6392157, g: 0.6784314, b: 0.62352943, a: 1} + m_RaycastTarget: 1 + m_RaycastPadding: {x: 0, y: 0, z: 0, w: 0} + m_Maskable: 1 + m_OnCullStateChanged: + m_PersistentCalls: + m_Calls: [] + m_Sprite: {fileID: 10907, guid: 0000000000000000f000000000000000, type: 0} + m_Type: 1 + m_PreserveAspect: 0 + m_FillCenter: 1 + m_FillMethod: 4 + m_FillAmount: 1 + m_FillClockwise: 1 + m_FillOrigin: 0 + m_UseSpriteMesh: 0 + m_PixelsPerUnitMultiplier: 1 +--- !u!222 &1117415505 +CanvasRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1117415501} + m_CullTransparentMesh: 1 +--- !u!1 &1136649632 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 1136649633} + - component: {fileID: 1136649636} + - component: {fileID: 1136649635} + - component: {fileID: 1136649634} + m_Layer: 5 + m_Name: Button (Legacy) + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!224 &1136649633 +RectTransform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1136649632} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: 0, y: 0, z: 0} + m_LocalScale: {x: 1, y: 1, z: 1} + m_ConstrainProportionsScale: 0 + m_Children: + - {fileID: 2001876799} + m_Father: {fileID: 1117415502} + m_RootOrder: 2 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} + m_AnchorMin: {x: 0, y: 1} + m_AnchorMax: {x: 1, y: 1} + m_AnchoredPosition: {x: 0, y: -658} + m_SizeDelta: {x: -200, y: 100} + m_Pivot: {x: 0.5, y: 0.5} +--- !u!114 &1136649634 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1136649632} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 4e29b1a8efbd4b44bb3f3716e73f07ff, type: 3} + m_Name: + m_EditorClassIdentifier: + m_Navigation: + m_Mode: 3 + m_WrapAround: 0 + m_SelectOnUp: {fileID: 0} + m_SelectOnDown: {fileID: 0} + m_SelectOnLeft: {fileID: 0} + m_SelectOnRight: {fileID: 0} + m_Transition: 1 + m_Colors: + m_NormalColor: {r: 1, g: 1, b: 1, a: 1} + m_HighlightedColor: {r: 0.9607843, g: 0.9607843, b: 0.9607843, a: 1} + m_PressedColor: {r: 0.78431374, g: 0.78431374, b: 0.78431374, a: 1} + m_SelectedColor: {r: 0.9607843, g: 0.9607843, b: 0.9607843, a: 1} + m_DisabledColor: {r: 0.78431374, g: 0.78431374, b: 0.78431374, a: 0.5019608} + m_ColorMultiplier: 1 + m_FadeDuration: 0.1 + m_SpriteState: + m_HighlightedSprite: {fileID: 0} + m_PressedSprite: {fileID: 0} + m_SelectedSprite: {fileID: 0} + m_DisabledSprite: {fileID: 0} + m_AnimationTriggers: + m_NormalTrigger: Normal + m_HighlightedTrigger: Highlighted + m_PressedTrigger: Pressed + m_SelectedTrigger: Selected + m_DisabledTrigger: Disabled + m_Interactable: 1 + m_TargetGraphic: {fileID: 1136649635} + m_OnClick: + m_PersistentCalls: + m_Calls: [] +--- !u!114 &1136649635 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1136649632} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: fe87c0e1cc204ed48ad3b37840f39efc, type: 3} + m_Name: + m_EditorClassIdentifier: + m_Material: {fileID: 0} + m_Color: {r: 0.23616053, g: 0.8207547, b: 0.31909385, a: 1} + m_RaycastTarget: 1 + m_RaycastPadding: {x: 0, y: 0, z: 0, w: 0} + m_Maskable: 1 + m_OnCullStateChanged: + m_PersistentCalls: + m_Calls: [] + m_Sprite: {fileID: 10905, guid: 0000000000000000f000000000000000, type: 0} + m_Type: 1 + m_PreserveAspect: 0 + m_FillCenter: 1 + m_FillMethod: 4 + m_FillAmount: 1 + m_FillClockwise: 1 + m_FillOrigin: 0 + m_UseSpriteMesh: 0 + m_PixelsPerUnitMultiplier: 1 +--- !u!222 &1136649636 +CanvasRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1136649632} + m_CullTransparentMesh: 1 +--- !u!1 &1157798866 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 1157798869} + - component: {fileID: 1157798868} + - component: {fileID: 1157798867} + m_Layer: 0 + m_Name: EventSystem + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!114 &1157798867 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1157798866} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 4f231c4fb786f3946a6b90b886c48677, type: 3} + m_Name: + m_EditorClassIdentifier: + m_SendPointerHoverToParent: 1 + m_HorizontalAxis: Horizontal + m_VerticalAxis: Vertical + m_SubmitButton: Submit + m_CancelButton: Cancel + m_InputActionsPerSecond: 10 + m_RepeatDelay: 0.5 + m_ForceModuleActive: 0 +--- !u!114 &1157798868 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1157798866} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 76c392e42b5098c458856cdf6ecaaaa1, type: 3} + m_Name: + m_EditorClassIdentifier: + m_FirstSelected: {fileID: 0} + m_sendNavigationEvents: 1 + m_DragThreshold: 10 +--- !u!4 &1157798869 +Transform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1157798866} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: 0, y: 0, z: 0} + m_LocalScale: {x: 1, y: 1, z: 1} + m_ConstrainProportionsScale: 0 + m_Children: [] + m_Father: {fileID: 0} + m_RootOrder: 3 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} +--- !u!1 &1206114822 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 1206114823} + - component: {fileID: 1206114825} + - component: {fileID: 1206114824} + m_Layer: 5 + m_Name: Placeholder + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!224 &1206114823 +RectTransform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1206114822} + m_LocalRotation: {x: -0, y: -0, z: -0, w: 1} + m_LocalPosition: {x: 0, y: 0, z: 0} + m_LocalScale: {x: 1, y: 1, z: 1} + m_ConstrainProportionsScale: 0 + m_Children: [] + m_Father: {fileID: 347109331} + m_RootOrder: 0 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} + m_AnchorMin: {x: 0, y: 0} + m_AnchorMax: {x: 1, y: 1} + m_AnchoredPosition: {x: 0, y: -0.5} + m_SizeDelta: {x: -20, y: -13} + m_Pivot: {x: 0.5, y: 0.5} +--- !u!114 &1206114824 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1206114822} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 5f7201a12d95ffc409449d95f23cf332, type: 3} + m_Name: + m_EditorClassIdentifier: + m_Material: {fileID: 0} + m_Color: {r: 0.19607843, g: 0.19607843, b: 0.19607843, a: 0.5} + m_RaycastTarget: 1 + m_RaycastPadding: {x: 0, y: 0, z: 0, w: 0} + m_Maskable: 1 + m_OnCullStateChanged: + m_PersistentCalls: + m_Calls: [] + m_FontData: + m_Font: {fileID: 10102, guid: 0000000000000000e000000000000000, type: 0} + m_FontSize: 50 + m_FontStyle: 2 + m_BestFit: 0 + m_MinSize: 0 + m_MaxSize: 100 + m_Alignment: 3 + m_AlignByGeometry: 0 + m_RichText: 1 + m_HorizontalOverflow: 0 + m_VerticalOverflow: 0 + m_LineSpacing: 1 + m_Text: Enter text... +--- !u!222 &1206114825 +CanvasRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1206114822} + m_CullTransparentMesh: 1 +--- !u!1 &1249814388 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 1249814389} + - component: {fileID: 1249814392} + - component: {fileID: 1249814391} + - component: {fileID: 1249814390} + m_Layer: 5 + m_Name: FriendsRankButton + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!224 &1249814389 +RectTransform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1249814388} + m_LocalRotation: {x: -0, y: -0, z: -0, w: 1} + m_LocalPosition: {x: 0, y: 0, z: 0} + m_LocalScale: {x: 1, y: 1, z: 1} + m_ConstrainProportionsScale: 0 + m_Children: + - {fileID: 293459841} + m_Father: {fileID: 2016519414} + m_RootOrder: 11 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} + m_AnchorMin: {x: 1, y: 1} + m_AnchorMax: {x: 1, y: 1} + m_AnchoredPosition: {x: -42, y: 795} + m_SizeDelta: {x: 460, y: 140} + m_Pivot: {x: 0, y: 0.5} +--- !u!114 &1249814390 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1249814388} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 4e29b1a8efbd4b44bb3f3716e73f07ff, type: 3} + m_Name: + m_EditorClassIdentifier: + m_Navigation: + m_Mode: 3 + m_WrapAround: 0 + m_SelectOnUp: {fileID: 0} + m_SelectOnDown: {fileID: 0} + m_SelectOnLeft: {fileID: 0} + m_SelectOnRight: {fileID: 0} + m_Transition: 1 + m_Colors: + m_NormalColor: {r: 1, g: 1, b: 1, a: 1} + m_HighlightedColor: {r: 0.9607843, g: 0.9607843, b: 0.9607843, a: 1} + m_PressedColor: {r: 0.78431374, g: 0.78431374, b: 0.78431374, a: 1} + m_SelectedColor: {r: 0.9607843, g: 0.9607843, b: 0.9607843, a: 1} + m_DisabledColor: {r: 0.78431374, g: 0.78431374, b: 0.78431374, a: 0.5019608} + m_ColorMultiplier: 1 + m_FadeDuration: 0.1 + m_SpriteState: + m_HighlightedSprite: {fileID: 0} + m_PressedSprite: {fileID: 0} + m_SelectedSprite: {fileID: 0} + m_DisabledSprite: {fileID: 0} + m_AnimationTriggers: + m_NormalTrigger: Normal + m_HighlightedTrigger: Highlighted + m_PressedTrigger: Pressed + m_SelectedTrigger: Selected + m_DisabledTrigger: Disabled + m_Interactable: 1 + m_TargetGraphic: {fileID: 1249814391} + m_OnClick: + m_PersistentCalls: + m_Calls: + - m_Target: {fileID: 391857241} + m_TargetAssemblyTypeName: HCLoginDemoView, Assembly-CSharp + m_MethodName: ButtonEvent_ShowFriendsRank + m_Mode: 1 + m_Arguments: + m_ObjectArgument: {fileID: 0} + m_ObjectArgumentAssemblyTypeName: UnityEngine.Object, UnityEngine + m_IntArgument: 0 + m_FloatArgument: 0 + m_StringArgument: + m_BoolArgument: 0 + m_CallState: 2 +--- !u!114 &1249814391 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1249814388} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: fe87c0e1cc204ed48ad3b37840f39efc, type: 3} + m_Name: + m_EditorClassIdentifier: + m_Material: {fileID: 0} + m_Color: {r: 1, g: 1, b: 1, a: 1} + m_RaycastTarget: 1 + m_RaycastPadding: {x: 0, y: 0, z: 0, w: 0} + m_Maskable: 1 + m_OnCullStateChanged: + m_PersistentCalls: + m_Calls: [] + m_Sprite: {fileID: 10905, guid: 0000000000000000f000000000000000, type: 0} + m_Type: 1 + m_PreserveAspect: 0 + m_FillCenter: 1 + m_FillMethod: 4 + m_FillAmount: 1 + m_FillClockwise: 1 + m_FillOrigin: 0 + m_UseSpriteMesh: 0 + m_PixelsPerUnitMultiplier: 1 +--- !u!222 &1249814392 +CanvasRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1249814388} + m_CullTransparentMesh: 1 +--- !u!1001 &1259983527 +PrefabInstance: + m_ObjectHideFlags: 0 + serializedVersion: 2 + m_Modification: + m_TransformParent: {fileID: 548341161} + m_Modifications: + - target: {fileID: 73467314029594367, guid: 5c2c2a1ec1c2b413089f70d32db88680, + type: 3} + propertyPath: m_AnchorMax.y + value: 0 + objectReference: {fileID: 0} + - target: {fileID: 73467314029594367, guid: 5c2c2a1ec1c2b413089f70d32db88680, + type: 3} + propertyPath: m_AnchorMin.y + value: 0 + objectReference: {fileID: 0} + - target: {fileID: 73467314029594367, guid: 5c2c2a1ec1c2b413089f70d32db88680, + type: 3} + propertyPath: m_AnchoredPosition.x + value: 0 + objectReference: {fileID: 0} + - target: {fileID: 73467314029594367, guid: 5c2c2a1ec1c2b413089f70d32db88680, + type: 3} + propertyPath: m_AnchoredPosition.y + value: 0 + objectReference: {fileID: 0} + - target: {fileID: 167536599284978532, guid: 5c2c2a1ec1c2b413089f70d32db88680, + type: 3} + propertyPath: m_AnchoredPosition.y + value: -5.9999847 + objectReference: {fileID: 0} + - target: {fileID: 591582440344992329, guid: 5c2c2a1ec1c2b413089f70d32db88680, + type: 3} + propertyPath: m_AnchorMax.y + value: 0 + objectReference: {fileID: 0} + - target: {fileID: 591582440344992329, guid: 5c2c2a1ec1c2b413089f70d32db88680, + type: 3} + propertyPath: m_AnchorMin.y + value: 0 + objectReference: {fileID: 0} + - target: {fileID: 591582440344992329, guid: 5c2c2a1ec1c2b413089f70d32db88680, + type: 3} + propertyPath: m_AnchoredPosition.x + value: 0 + objectReference: {fileID: 0} + - target: {fileID: 591582440344992329, guid: 5c2c2a1ec1c2b413089f70d32db88680, + type: 3} + propertyPath: m_AnchoredPosition.y + value: 0 + objectReference: {fileID: 0} + - target: {fileID: 1240445628077361974, guid: 5c2c2a1ec1c2b413089f70d32db88680, + type: 3} + propertyPath: m_AnchorMax.y + value: 0 + objectReference: {fileID: 0} + - target: {fileID: 1240445628077361974, guid: 5c2c2a1ec1c2b413089f70d32db88680, + type: 3} + propertyPath: m_AnchorMin.y + value: 0 + objectReference: {fileID: 0} + - target: {fileID: 1240445628077361974, guid: 5c2c2a1ec1c2b413089f70d32db88680, + type: 3} + propertyPath: m_AnchoredPosition.x + value: 0 + objectReference: {fileID: 0} + - target: {fileID: 1240445628077361974, guid: 5c2c2a1ec1c2b413089f70d32db88680, + type: 3} + propertyPath: m_AnchoredPosition.y + value: 0 + objectReference: {fileID: 0} + - target: {fileID: 1240445628159014720, guid: 5c2c2a1ec1c2b413089f70d32db88680, + type: 3} + propertyPath: m_AnchorMax.y + value: 0 + objectReference: {fileID: 0} + - target: {fileID: 1240445628159014720, guid: 5c2c2a1ec1c2b413089f70d32db88680, + type: 3} + propertyPath: m_AnchorMin.y + value: 0 + objectReference: {fileID: 0} + - target: {fileID: 1240445628159014720, guid: 5c2c2a1ec1c2b413089f70d32db88680, + type: 3} + propertyPath: m_AnchoredPosition.x + value: 0 + objectReference: {fileID: 0} + - target: {fileID: 1240445628159014720, guid: 5c2c2a1ec1c2b413089f70d32db88680, + type: 3} + propertyPath: m_AnchoredPosition.y + value: 0 + objectReference: {fileID: 0} + - target: {fileID: 1240445628316549557, guid: 5c2c2a1ec1c2b413089f70d32db88680, + type: 3} + propertyPath: m_AnchorMax.y + value: 0 + objectReference: {fileID: 0} + - target: {fileID: 1240445628316549557, guid: 5c2c2a1ec1c2b413089f70d32db88680, + type: 3} + propertyPath: m_AnchorMin.y + value: 0 + objectReference: {fileID: 0} + - target: {fileID: 1240445628316549557, guid: 5c2c2a1ec1c2b413089f70d32db88680, + type: 3} + propertyPath: m_AnchoredPosition.x + value: 0 + objectReference: {fileID: 0} + - target: {fileID: 1240445628316549557, guid: 5c2c2a1ec1c2b413089f70d32db88680, + type: 3} + propertyPath: m_AnchoredPosition.y + value: 0 + objectReference: {fileID: 0} + - target: {fileID: 1240445628530372788, guid: 5c2c2a1ec1c2b413089f70d32db88680, + type: 3} + propertyPath: m_AnchorMax.y + value: 0 + objectReference: {fileID: 0} + - target: {fileID: 1240445628530372788, guid: 5c2c2a1ec1c2b413089f70d32db88680, + type: 3} + propertyPath: m_AnchorMin.y + value: 0 + objectReference: {fileID: 0} + - target: {fileID: 1240445628530372788, guid: 5c2c2a1ec1c2b413089f70d32db88680, + type: 3} + propertyPath: m_AnchoredPosition.y + value: 0 + objectReference: {fileID: 0} + - target: {fileID: 1240445628569325650, guid: 5c2c2a1ec1c2b413089f70d32db88680, + type: 3} + propertyPath: m_AnchorMax.y + value: 0 + objectReference: {fileID: 0} + - target: {fileID: 1240445628569325650, guid: 5c2c2a1ec1c2b413089f70d32db88680, + type: 3} + propertyPath: m_AnchorMin.y + value: 0 + objectReference: {fileID: 0} + - target: {fileID: 1240445628569325650, guid: 5c2c2a1ec1c2b413089f70d32db88680, + type: 3} + propertyPath: m_AnchoredPosition.x + value: 0 + objectReference: {fileID: 0} + - target: {fileID: 1240445628569325650, guid: 5c2c2a1ec1c2b413089f70d32db88680, + type: 3} + propertyPath: m_AnchoredPosition.y + value: 0 + objectReference: {fileID: 0} + - target: {fileID: 1240445628752246435, guid: 5c2c2a1ec1c2b413089f70d32db88680, + type: 3} + propertyPath: m_AnchoredPosition.y + value: -5.9999847 + objectReference: {fileID: 0} + - target: {fileID: 1240445629039028095, guid: 5c2c2a1ec1c2b413089f70d32db88680, + type: 3} + propertyPath: m_AnchorMax.y + value: 0 + objectReference: {fileID: 0} + - target: {fileID: 1240445629039028095, guid: 5c2c2a1ec1c2b413089f70d32db88680, + type: 3} + propertyPath: m_AnchorMin.y + value: 0 + objectReference: {fileID: 0} + - target: {fileID: 1240445629039028095, guid: 5c2c2a1ec1c2b413089f70d32db88680, + type: 3} + propertyPath: m_AnchoredPosition.x + value: 0 + objectReference: {fileID: 0} + - target: {fileID: 1240445629039028095, guid: 5c2c2a1ec1c2b413089f70d32db88680, + type: 3} + propertyPath: m_AnchoredPosition.y + value: 0 + objectReference: {fileID: 0} + - target: {fileID: 1240445629125505494, guid: 5c2c2a1ec1c2b413089f70d32db88680, + type: 3} + propertyPath: m_AnchoredPosition.y + value: 134 + objectReference: {fileID: 0} + - target: {fileID: 1240445629520549018, guid: 5c2c2a1ec1c2b413089f70d32db88680, + type: 3} + propertyPath: m_AnchoredPosition.y + value: 134.00002 + objectReference: {fileID: 0} + - target: {fileID: 1240445629534457790, guid: 5c2c2a1ec1c2b413089f70d32db88680, + type: 3} + propertyPath: m_AnchorMax.y + value: 0 + objectReference: {fileID: 0} + - target: {fileID: 1240445629534457790, guid: 5c2c2a1ec1c2b413089f70d32db88680, + type: 3} + propertyPath: m_AnchorMin.y + value: 0 + objectReference: {fileID: 0} + - target: {fileID: 1240445629534457790, guid: 5c2c2a1ec1c2b413089f70d32db88680, + type: 3} + propertyPath: m_AnchoredPosition.x + value: 0 + objectReference: {fileID: 0} + - target: {fileID: 1240445629534457790, guid: 5c2c2a1ec1c2b413089f70d32db88680, + type: 3} + propertyPath: m_AnchoredPosition.y + value: 0 + objectReference: {fileID: 0} + - target: {fileID: 1240445629679888802, guid: 5c2c2a1ec1c2b413089f70d32db88680, + type: 3} + propertyPath: m_AnchorMax.y + value: 0 + objectReference: {fileID: 0} + - target: {fileID: 1240445629679888802, guid: 5c2c2a1ec1c2b413089f70d32db88680, + type: 3} + propertyPath: m_AnchorMin.y + value: 0 + objectReference: {fileID: 0} + - target: {fileID: 1240445629679888802, guid: 5c2c2a1ec1c2b413089f70d32db88680, + type: 3} + propertyPath: m_AnchoredPosition.x + value: 0 + objectReference: {fileID: 0} + - target: {fileID: 1240445629679888802, guid: 5c2c2a1ec1c2b413089f70d32db88680, + type: 3} + propertyPath: m_AnchoredPosition.y + value: 0 + objectReference: {fileID: 0} + - target: {fileID: 1240445629731455436, guid: 5c2c2a1ec1c2b413089f70d32db88680, + type: 3} + propertyPath: m_AnchoredPosition.y + value: 258 + objectReference: {fileID: 0} + - target: {fileID: 1240445629789692595, guid: 5c2c2a1ec1c2b413089f70d32db88680, + type: 3} + propertyPath: m_AnchorMax.y + value: 0 + objectReference: {fileID: 0} + - target: {fileID: 1240445629789692595, guid: 5c2c2a1ec1c2b413089f70d32db88680, + type: 3} + propertyPath: m_AnchorMin.y + value: 0 + objectReference: {fileID: 0} + - target: {fileID: 1240445629789692595, guid: 5c2c2a1ec1c2b413089f70d32db88680, + type: 3} + propertyPath: m_AnchoredPosition.x + value: 0 + objectReference: {fileID: 0} + - target: {fileID: 1240445629789692595, guid: 5c2c2a1ec1c2b413089f70d32db88680, + type: 3} + propertyPath: m_AnchoredPosition.y + value: 0 + objectReference: {fileID: 0} + - target: {fileID: 1240445629906932932, guid: 5c2c2a1ec1c2b413089f70d32db88680, + type: 3} + propertyPath: m_AnchorMax.y + value: 0 + objectReference: {fileID: 0} + - target: {fileID: 1240445629906932932, guid: 5c2c2a1ec1c2b413089f70d32db88680, + type: 3} + propertyPath: m_AnchorMin.y + value: 0 + objectReference: {fileID: 0} + - target: {fileID: 1240445629906932932, guid: 5c2c2a1ec1c2b413089f70d32db88680, + type: 3} + propertyPath: m_AnchoredPosition.x + value: 0 + objectReference: {fileID: 0} + - target: {fileID: 1240445629906932932, guid: 5c2c2a1ec1c2b413089f70d32db88680, + type: 3} + propertyPath: m_AnchoredPosition.y + value: 0 + objectReference: {fileID: 0} + - target: {fileID: 1240445629907049997, guid: 5c2c2a1ec1c2b413089f70d32db88680, + type: 3} + propertyPath: m_Name + value: MainDemoView + objectReference: {fileID: 0} + - target: {fileID: 1240445629907049998, guid: 5c2c2a1ec1c2b413089f70d32db88680, + type: 3} + propertyPath: m_Pivot.x + value: 0.5 + objectReference: {fileID: 0} + - target: {fileID: 1240445629907049998, guid: 5c2c2a1ec1c2b413089f70d32db88680, + type: 3} + propertyPath: m_Pivot.y + value: 0.5 + objectReference: {fileID: 0} + - target: {fileID: 1240445629907049998, guid: 5c2c2a1ec1c2b413089f70d32db88680, + type: 3} + propertyPath: m_RootOrder + value: 0 + objectReference: {fileID: 0} + - target: {fileID: 1240445629907049998, guid: 5c2c2a1ec1c2b413089f70d32db88680, + type: 3} + propertyPath: m_AnchorMax.x + value: 1 + objectReference: {fileID: 0} + - target: {fileID: 1240445629907049998, guid: 5c2c2a1ec1c2b413089f70d32db88680, + type: 3} + propertyPath: m_AnchorMax.y + value: 1 + objectReference: {fileID: 0} + - target: {fileID: 1240445629907049998, guid: 5c2c2a1ec1c2b413089f70d32db88680, + type: 3} + propertyPath: m_AnchorMin.x + value: 0 + objectReference: {fileID: 0} + - target: {fileID: 1240445629907049998, guid: 5c2c2a1ec1c2b413089f70d32db88680, + type: 3} + propertyPath: m_AnchorMin.y + value: 0 + objectReference: {fileID: 0} + - target: {fileID: 1240445629907049998, guid: 5c2c2a1ec1c2b413089f70d32db88680, + type: 3} + propertyPath: m_SizeDelta.x + value: 0 + objectReference: {fileID: 0} + - target: {fileID: 1240445629907049998, guid: 5c2c2a1ec1c2b413089f70d32db88680, + type: 3} + propertyPath: m_SizeDelta.y + value: 0 + objectReference: {fileID: 0} + - target: {fileID: 1240445629907049998, guid: 5c2c2a1ec1c2b413089f70d32db88680, + type: 3} + propertyPath: m_LocalPosition.x + value: 0 + objectReference: {fileID: 0} + - target: {fileID: 1240445629907049998, guid: 5c2c2a1ec1c2b413089f70d32db88680, + type: 3} + propertyPath: m_LocalPosition.y + value: 0 + objectReference: {fileID: 0} + - target: {fileID: 1240445629907049998, guid: 5c2c2a1ec1c2b413089f70d32db88680, + type: 3} + propertyPath: m_LocalPosition.z + value: 0 + objectReference: {fileID: 0} + - target: {fileID: 1240445629907049998, guid: 5c2c2a1ec1c2b413089f70d32db88680, + type: 3} + propertyPath: m_LocalRotation.w + value: 1 + objectReference: {fileID: 0} + - target: {fileID: 1240445629907049998, guid: 5c2c2a1ec1c2b413089f70d32db88680, + type: 3} + propertyPath: m_LocalRotation.x + value: 0 + objectReference: {fileID: 0} + - target: {fileID: 1240445629907049998, guid: 5c2c2a1ec1c2b413089f70d32db88680, + type: 3} + propertyPath: m_LocalRotation.y + value: 0 + objectReference: {fileID: 0} + - target: {fileID: 1240445629907049998, guid: 5c2c2a1ec1c2b413089f70d32db88680, + type: 3} + propertyPath: m_LocalRotation.z + value: 0 + objectReference: {fileID: 0} + - target: {fileID: 1240445629907049998, guid: 5c2c2a1ec1c2b413089f70d32db88680, + type: 3} + propertyPath: m_AnchoredPosition.x + value: 0 + objectReference: {fileID: 0} + - target: {fileID: 1240445629907049998, guid: 5c2c2a1ec1c2b413089f70d32db88680, + type: 3} + propertyPath: m_AnchoredPosition.y + value: 0 + objectReference: {fileID: 0} + - target: {fileID: 1240445629907049998, guid: 5c2c2a1ec1c2b413089f70d32db88680, + type: 3} + propertyPath: m_LocalEulerAnglesHint.x + value: 0 + objectReference: {fileID: 0} + - target: {fileID: 1240445629907049998, guid: 5c2c2a1ec1c2b413089f70d32db88680, + type: 3} + propertyPath: m_LocalEulerAnglesHint.y + value: 0 + objectReference: {fileID: 0} + - target: {fileID: 1240445629907049998, guid: 5c2c2a1ec1c2b413089f70d32db88680, + type: 3} + propertyPath: m_LocalEulerAnglesHint.z + value: 0 + objectReference: {fileID: 0} + - target: {fileID: 3325350476177637516, guid: 5c2c2a1ec1c2b413089f70d32db88680, + type: 3} + propertyPath: m_RootOrder + value: 3 + objectReference: {fileID: 0} + - target: {fileID: 4650141467237551916, guid: 5c2c2a1ec1c2b413089f70d32db88680, + type: 3} + propertyPath: m_AnchorMax.y + value: 0 + objectReference: {fileID: 0} + - target: {fileID: 4650141467237551916, guid: 5c2c2a1ec1c2b413089f70d32db88680, + type: 3} + propertyPath: m_AnchorMin.y + value: 0 + objectReference: {fileID: 0} + - target: {fileID: 4650141467237551916, guid: 5c2c2a1ec1c2b413089f70d32db88680, + type: 3} + propertyPath: m_AnchoredPosition.x + value: 0 + objectReference: {fileID: 0} + - target: {fileID: 4650141467237551916, guid: 5c2c2a1ec1c2b413089f70d32db88680, + type: 3} + propertyPath: m_AnchoredPosition.y + value: 0 + objectReference: {fileID: 0} + - target: {fileID: 7348458583946661662, guid: 5c2c2a1ec1c2b413089f70d32db88680, + type: 3} + propertyPath: mLoginDemoView + value: + objectReference: {fileID: 391857241} + - target: {fileID: 7348458583946661662, guid: 5c2c2a1ec1c2b413089f70d32db88680, + type: 3} + propertyPath: mCheckSensitiveWordView + value: + objectReference: {fileID: 1117415503} + - target: {fileID: 8141970662575567352, guid: 5c2c2a1ec1c2b413089f70d32db88680, + type: 3} + propertyPath: m_AnchorMax.y + value: 0 + objectReference: {fileID: 0} + - target: {fileID: 8141970662575567352, guid: 5c2c2a1ec1c2b413089f70d32db88680, + type: 3} + propertyPath: m_AnchorMin.y + value: 0 + objectReference: {fileID: 0} + - target: {fileID: 8141970662575567352, guid: 5c2c2a1ec1c2b413089f70d32db88680, + type: 3} + propertyPath: m_AnchoredPosition.x + value: 0 + objectReference: {fileID: 0} + - target: {fileID: 8141970662575567352, guid: 5c2c2a1ec1c2b413089f70d32db88680, + type: 3} + propertyPath: m_AnchoredPosition.y + value: 0 + objectReference: {fileID: 0} + - target: {fileID: 8330470244567723433, guid: 5c2c2a1ec1c2b413089f70d32db88680, + type: 3} + propertyPath: m_IsActive + value: 0 + objectReference: {fileID: 0} + m_RemovedComponents: [] + m_SourcePrefab: {fileID: 100100000, guid: 5c2c2a1ec1c2b413089f70d32db88680, type: 3} +--- !u!224 &1259983528 stripped +RectTransform: + m_CorrespondingSourceObject: {fileID: 1240445629907049998, guid: 5c2c2a1ec1c2b413089f70d32db88680, + type: 3} + m_PrefabInstance: {fileID: 1259983527} + m_PrefabAsset: {fileID: 0} +--- !u!1 &1292926949 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 1292926950} + - component: {fileID: 1292926952} + - component: {fileID: 1292926951} + m_Layer: 5 + m_Name: Text + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!224 &1292926950 +RectTransform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1292926949} + m_LocalRotation: {x: -0, y: -0, z: -0, w: 1} + m_LocalPosition: {x: 0, y: 0, z: 0} + m_LocalScale: {x: 1, y: 1, z: 1} + m_ConstrainProportionsScale: 0 + m_Children: [] + m_Father: {fileID: 2093305768} + m_RootOrder: 0 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} + m_AnchorMin: {x: 0, y: 0} + m_AnchorMax: {x: 1, y: 1} + m_AnchoredPosition: {x: 0, y: 0} + m_SizeDelta: {x: 0, y: 0} + m_Pivot: {x: 0.5, y: 0.5} +--- !u!114 &1292926951 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1292926949} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 5f7201a12d95ffc409449d95f23cf332, type: 3} + m_Name: + m_EditorClassIdentifier: + m_Material: {fileID: 0} + m_Color: {r: 0.19607843, g: 0.19607843, b: 0.19607843, a: 1} + m_RaycastTarget: 1 + m_RaycastPadding: {x: 0, y: 0, z: 0, w: 0} + m_Maskable: 1 + m_OnCullStateChanged: + m_PersistentCalls: + m_Calls: [] + m_FontData: + m_Font: {fileID: 10102, guid: 0000000000000000e000000000000000, type: 0} + m_FontSize: 48 + m_FontStyle: 0 + m_BestFit: 0 + m_MinSize: 4 + m_MaxSize: 48 + m_Alignment: 4 + m_AlignByGeometry: 0 + m_RichText: 1 + m_HorizontalOverflow: 0 + m_VerticalOverflow: 0 + m_LineSpacing: 1 + m_Text: "\u5173\u95ED" +--- !u!222 &1292926952 +CanvasRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1292926949} + m_CullTransparentMesh: 1 +--- !u!1 &1324528414 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 1324528415} + - component: {fileID: 1324528416} + m_Layer: 5 + m_Name: GameObject + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!224 &1324528415 +RectTransform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1324528414} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: 0, y: 0, z: 0} + m_LocalScale: {x: 1, y: 1, z: 1} + m_ConstrainProportionsScale: 0 + m_Children: + - {fileID: 537742148} + - {fileID: 1088553689} + - {fileID: 1971153166} + - {fileID: 2059125834} + - {fileID: 743846834} + - {fileID: 1981647158} + m_Father: {fileID: 1117415502} + m_RootOrder: 3 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} + m_AnchorMin: {x: 0, y: 1} + m_AnchorMax: {x: 1, y: 1} + m_AnchoredPosition: {x: 0, y: -824} + m_SizeDelta: {x: -200, y: 100} + m_Pivot: {x: 0.5, y: 0.5} +--- !u!114 &1324528416 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1324528414} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 8a8695521f0d02e499659fee002a26c2, type: 3} + m_Name: + m_EditorClassIdentifier: + m_Padding: + m_Left: 0 + m_Right: 0 + m_Top: 0 + m_Bottom: 0 + m_ChildAlignment: 1 + m_StartCorner: 0 + m_StartAxis: 0 + m_CellSize: {x: 350, y: 200} + m_Spacing: {x: 20, y: 0} + m_Constraint: 1 + m_ConstraintCount: 2 +--- !u!1 &1500506544 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 1500506545} + m_Layer: 5 + m_Name: root + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!224 &1500506545 +RectTransform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1500506544} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: 0, y: 0, z: 0} + m_LocalScale: {x: 1, y: 1, z: 1} + m_ConstrainProportionsScale: 0 + m_Children: [] + m_Father: {fileID: 1097981910} + m_RootOrder: 0 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} + m_AnchorMin: {x: 0.5, y: 1} + m_AnchorMax: {x: 0.5, y: 1} + m_AnchoredPosition: {x: -1.859, y: -634.2971} + m_SizeDelta: {x: 654.959, y: 1068.594} + m_Pivot: {x: 0.5, y: 0.5} +--- !u!1 &1935668893 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 1935668894} + - component: {fileID: 1935668896} + - component: {fileID: 1935668895} + - component: {fileID: 1935668897} + m_Layer: 5 + m_Name: Text + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!224 &1935668894 +RectTransform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1935668893} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: 0, y: 0, z: 0} + m_LocalScale: {x: 1, y: 1, z: 1} + m_ConstrainProportionsScale: 0 + m_Children: [] + m_Father: {fileID: 1117415502} + m_RootOrder: 0 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} + m_AnchorMin: {x: 0.5, y: 1} + m_AnchorMax: {x: 0.5, y: 1} + m_AnchoredPosition: {x: 0, y: -290} + m_SizeDelta: {x: 488.66998, y: 110.34483} + m_Pivot: {x: 0.5, y: 0.5} +--- !u!114 &1935668895 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1935668893} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 5f7201a12d95ffc409449d95f23cf332, type: 3} + m_Name: + m_EditorClassIdentifier: + m_Material: {fileID: 0} + m_Color: {r: 0, g: 0, b: 0, a: 1} + m_RaycastTarget: 1 + m_RaycastPadding: {x: 0, y: 0, z: 0, w: 0} + m_Maskable: 1 + m_OnCullStateChanged: + m_PersistentCalls: + m_Calls: [] + m_FontData: + m_Font: {fileID: 10102, guid: 0000000000000000e000000000000000, type: 0} + m_FontSize: 100 + m_FontStyle: 0 + m_BestFit: 0 + m_MinSize: 0 + m_MaxSize: 100 + m_Alignment: 1 + m_AlignByGeometry: 0 + m_RichText: 1 + m_HorizontalOverflow: 0 + m_VerticalOverflow: 0 + m_LineSpacing: 1 + m_Text: "\u654F\u611F\u8BCD\u68C0\u67E5" +--- !u!222 &1935668896 +CanvasRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1935668893} + m_CullTransparentMesh: 1 +--- !u!114 &1935668897 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1935668893} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 3245ec927659c4140ac4f8d17403cc18, type: 3} + m_Name: + m_EditorClassIdentifier: + m_HorizontalFit: 2 + m_VerticalFit: 2 +--- !u!1 &1971153165 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 1971153166} + - component: {fileID: 1971153168} + - component: {fileID: 1971153167} + m_Layer: 5 + m_Name: Text (Legacy) (2) + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!224 &1971153166 +RectTransform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1971153165} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: 0, y: 0, z: 0} + m_LocalScale: {x: 1, y: 1, z: 1} + m_ConstrainProportionsScale: 0 + m_Children: [] + m_Father: {fileID: 1324528415} + m_RootOrder: 2 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} + m_AnchorMin: {x: 0, y: 1} + m_AnchorMax: {x: 0, y: 1} + m_AnchoredPosition: {x: 1857.2661, y: -300} + m_SizeDelta: {x: 350, y: 200} + m_Pivot: {x: 0.5, y: 0.5} +--- !u!114 &1971153167 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1971153165} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 5f7201a12d95ffc409449d95f23cf332, type: 3} + m_Name: + m_EditorClassIdentifier: + m_Material: {fileID: 0} + m_Color: {r: 0.19607843, g: 0.19607843, b: 0.19607843, a: 1} + m_RaycastTarget: 1 + m_RaycastPadding: {x: 0, y: 0, z: 0, w: 0} + m_Maskable: 1 + m_OnCullStateChanged: + m_PersistentCalls: + m_Calls: [] + m_FontData: + m_Font: {fileID: 10102, guid: 0000000000000000e000000000000000, type: 0} + m_FontSize: 50 + m_FontStyle: 0 + m_BestFit: 0 + m_MinSize: 5 + m_MaxSize: 50 + m_Alignment: 3 + m_AlignByGeometry: 0 + m_RichText: 1 + m_HorizontalOverflow: 0 + m_VerticalOverflow: 0 + m_LineSpacing: 1 + m_Text: 'CheckSource:' +--- !u!222 &1971153168 +CanvasRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1971153165} + m_CullTransparentMesh: 1 +--- !u!1 &1981647157 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 1981647158} + - component: {fileID: 1981647160} + - component: {fileID: 1981647159} + m_Layer: 5 + m_Name: Text (Legacy) (5) + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!224 &1981647158 +RectTransform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1981647157} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: 0, y: 0, z: 0} + m_LocalScale: {x: 1, y: 1, z: 1} + m_ConstrainProportionsScale: 0 + m_Children: [] + m_Father: {fileID: 1324528415} + m_RootOrder: 5 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} + m_AnchorMin: {x: 0, y: 1} + m_AnchorMax: {x: 0, y: 1} + m_AnchoredPosition: {x: 2227.266, y: -500} + m_SizeDelta: {x: 350, y: 200} + m_Pivot: {x: 0.5, y: 0.5} +--- !u!114 &1981647159 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1981647157} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 5f7201a12d95ffc409449d95f23cf332, type: 3} + m_Name: + m_EditorClassIdentifier: + m_Material: {fileID: 0} + m_Color: {r: 0.23529412, g: 0.81960785, b: 0.31764707, a: 1} + m_RaycastTarget: 1 + m_RaycastPadding: {x: 0, y: 0, z: 0, w: 0} + m_Maskable: 1 + m_OnCullStateChanged: + m_PersistentCalls: + m_Calls: [] + m_FontData: + m_Font: {fileID: 10102, guid: 0000000000000000e000000000000000, type: 0} + m_FontSize: 50 + m_FontStyle: 0 + m_BestFit: 0 + m_MinSize: 5 + m_MaxSize: 50 + m_Alignment: 3 + m_AlignByGeometry: 0 + m_RichText: 1 + m_HorizontalOverflow: 0 + m_VerticalOverflow: 0 + m_LineSpacing: 1 + m_Text: +--- !u!222 &1981647160 +CanvasRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1981647157} + m_CullTransparentMesh: 1 +--- !u!1 &2001876798 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 2001876799} + - component: {fileID: 2001876801} + - component: {fileID: 2001876800} + m_Layer: 5 + m_Name: Text (Legacy) + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!224 &2001876799 +RectTransform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 2001876798} + m_LocalRotation: {x: -0, y: -0, z: -0, w: 1} + m_LocalPosition: {x: 0, y: 0, z: 0} + m_LocalScale: {x: 1, y: 1, z: 1} + m_ConstrainProportionsScale: 0 + m_Children: [] + m_Father: {fileID: 1136649633} + m_RootOrder: 0 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} + m_AnchorMin: {x: 0, y: 0} + m_AnchorMax: {x: 1, y: 1} + m_AnchoredPosition: {x: 0, y: 0} + m_SizeDelta: {x: 0, y: 0} + m_Pivot: {x: 0.5, y: 0.5} +--- !u!114 &2001876800 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 2001876798} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 5f7201a12d95ffc409449d95f23cf332, type: 3} + m_Name: + m_EditorClassIdentifier: + m_Material: {fileID: 0} + m_Color: {r: 0.19607843, g: 0.19607843, b: 0.19607843, a: 1} + m_RaycastTarget: 1 + m_RaycastPadding: {x: 0, y: 0, z: 0, w: 0} + m_Maskable: 1 + m_OnCullStateChanged: + m_PersistentCalls: + m_Calls: [] + m_FontData: + m_Font: {fileID: 10102, guid: 0000000000000000e000000000000000, type: 0} + m_FontSize: 50 + m_FontStyle: 0 + m_BestFit: 0 + m_MinSize: 5 + m_MaxSize: 50 + m_Alignment: 4 + m_AlignByGeometry: 0 + m_RichText: 1 + m_HorizontalOverflow: 0 + m_VerticalOverflow: 0 + m_LineSpacing: 1 + m_Text: 'Check + +' +--- !u!222 &2001876801 +CanvasRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 2001876798} + m_CullTransparentMesh: 1 +--- !u!224 &2016519414 stripped +RectTransform: + m_CorrespondingSourceObject: {fileID: 4294162432488689155, guid: f72cd7b149a7e42d6818628ebadb8ba4, + type: 3} + m_PrefabInstance: {fileID: 4294162432255735136} + m_PrefabAsset: {fileID: 0} +--- !u!1 &2059125833 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 2059125834} + - component: {fileID: 2059125836} + - component: {fileID: 2059125835} + m_Layer: 5 + m_Name: Text (Legacy) (3) + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!224 &2059125834 +RectTransform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 2059125833} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: 0, y: 0, z: 0} + m_LocalScale: {x: 1, y: 1, z: 1} + m_ConstrainProportionsScale: 0 + m_Children: [] + m_Father: {fileID: 1324528415} + m_RootOrder: 3 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} + m_AnchorMin: {x: 0, y: 1} + m_AnchorMax: {x: 0, y: 1} + m_AnchoredPosition: {x: 2227.266, y: -300} + m_SizeDelta: {x: 350, y: 200} + m_Pivot: {x: 0.5, y: 0.5} +--- !u!114 &2059125835 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 2059125833} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 5f7201a12d95ffc409449d95f23cf332, type: 3} + m_Name: + m_EditorClassIdentifier: + m_Material: {fileID: 0} + m_Color: {r: 0.23529412, g: 0.81960785, b: 0.31764707, a: 1} + m_RaycastTarget: 1 + m_RaycastPadding: {x: 0, y: 0, z: 0, w: 0} + m_Maskable: 1 + m_OnCullStateChanged: + m_PersistentCalls: + m_Calls: [] + m_FontData: + m_Font: {fileID: 10102, guid: 0000000000000000e000000000000000, type: 0} + m_FontSize: 50 + m_FontStyle: 0 + m_BestFit: 0 + m_MinSize: 5 + m_MaxSize: 50 + m_Alignment: 3 + m_AlignByGeometry: 0 + m_RichText: 1 + m_HorizontalOverflow: 0 + m_VerticalOverflow: 0 + m_LineSpacing: 1 + m_Text: +--- !u!222 &2059125836 +CanvasRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 2059125833} + m_CullTransparentMesh: 1 +--- !u!1 &2093305767 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 2093305768} + - component: {fileID: 2093305771} + - component: {fileID: 2093305770} + - component: {fileID: 2093305769} + m_Layer: 5 + m_Name: FriendsRankBackButton + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!224 &2093305768 +RectTransform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 2093305767} + m_LocalRotation: {x: -0, y: -0, z: -0, w: 1} + m_LocalPosition: {x: 0, y: 0, z: 0} + m_LocalScale: {x: 1, y: 1, z: 1} + m_ConstrainProportionsScale: 0 + m_Children: + - {fileID: 1292926950} + m_Father: {fileID: 1097981910} + m_RootOrder: 1 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} + m_AnchorMin: {x: 1, y: 0} + m_AnchorMax: {x: 1, y: 0} + m_AnchoredPosition: {x: -230, y: 0} + m_SizeDelta: {x: 460, y: 140} + m_Pivot: {x: 0, y: 0.5} +--- !u!114 &2093305769 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 2093305767} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 4e29b1a8efbd4b44bb3f3716e73f07ff, type: 3} + m_Name: + m_EditorClassIdentifier: + m_Navigation: + m_Mode: 3 + m_WrapAround: 0 + m_SelectOnUp: {fileID: 0} + m_SelectOnDown: {fileID: 0} + m_SelectOnLeft: {fileID: 0} + m_SelectOnRight: {fileID: 0} + m_Transition: 1 + m_Colors: + m_NormalColor: {r: 1, g: 1, b: 1, a: 1} + m_HighlightedColor: {r: 0.9607843, g: 0.9607843, b: 0.9607843, a: 1} + m_PressedColor: {r: 0.78431374, g: 0.78431374, b: 0.78431374, a: 1} + m_SelectedColor: {r: 0.9607843, g: 0.9607843, b: 0.9607843, a: 1} + m_DisabledColor: {r: 0.78431374, g: 0.78431374, b: 0.78431374, a: 0.5019608} + m_ColorMultiplier: 1 + m_FadeDuration: 0.1 + m_SpriteState: + m_HighlightedSprite: {fileID: 0} + m_PressedSprite: {fileID: 0} + m_SelectedSprite: {fileID: 0} + m_DisabledSprite: {fileID: 0} + m_AnimationTriggers: + m_NormalTrigger: Normal + m_HighlightedTrigger: Highlighted + m_PressedTrigger: Pressed + m_SelectedTrigger: Selected + m_DisabledTrigger: Disabled + m_Interactable: 1 + m_TargetGraphic: {fileID: 2093305770} + m_OnClick: + m_PersistentCalls: + m_Calls: + - m_Target: {fileID: 391857241} + m_TargetAssemblyTypeName: HCLoginDemoView, Assembly-CSharp + m_MethodName: ButtonEvent_CloseFriendsRank + m_Mode: 1 + m_Arguments: + m_ObjectArgument: {fileID: 0} + m_ObjectArgumentAssemblyTypeName: UnityEngine.Object, UnityEngine + m_IntArgument: 0 + m_FloatArgument: 0 + m_StringArgument: + m_BoolArgument: 0 + m_CallState: 2 +--- !u!114 &2093305770 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 2093305767} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: fe87c0e1cc204ed48ad3b37840f39efc, type: 3} + m_Name: + m_EditorClassIdentifier: + m_Material: {fileID: 0} + m_Color: {r: 1, g: 1, b: 1, a: 1} + m_RaycastTarget: 1 + m_RaycastPadding: {x: 0, y: 0, z: 0, w: 0} + m_Maskable: 1 + m_OnCullStateChanged: + m_PersistentCalls: + m_Calls: [] + m_Sprite: {fileID: 10905, guid: 0000000000000000f000000000000000, type: 0} + m_Type: 1 + m_PreserveAspect: 0 + m_FillCenter: 1 + m_FillMethod: 4 + m_FillAmount: 1 + m_FillClockwise: 1 + m_FillOrigin: 0 + m_UseSpriteMesh: 0 + m_PixelsPerUnitMultiplier: 1 +--- !u!222 &2093305771 +CanvasRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 2093305767} + m_CullTransparentMesh: 1 +--- !u!1001 &4294162432255735136 +PrefabInstance: + m_ObjectHideFlags: 0 + serializedVersion: 2 + m_Modification: + m_TransformParent: {fileID: 548341161} + m_Modifications: + - target: {fileID: 578793549159237808, guid: f72cd7b149a7e42d6818628ebadb8ba4, + type: 3} + propertyPath: m_AnchoredPosition.x + value: 59 + objectReference: {fileID: 0} + - target: {fileID: 578793549159237808, guid: f72cd7b149a7e42d6818628ebadb8ba4, + type: 3} + propertyPath: m_AnchoredPosition.y + value: 673 + objectReference: {fileID: 0} + - target: {fileID: 733856151592599062, guid: f72cd7b149a7e42d6818628ebadb8ba4, + type: 3} + propertyPath: FriendsRankPanel + value: + objectReference: {fileID: 1097981909} + - target: {fileID: 733856151592599062, guid: f72cd7b149a7e42d6818628ebadb8ba4, + type: 3} + propertyPath: FriendsRankRootShowPanel + value: + objectReference: {fileID: 1500506544} + - target: {fileID: 1484711290239480336, guid: f72cd7b149a7e42d6818628ebadb8ba4, + type: 3} + propertyPath: m_SizeDelta.x + value: 430.139 + objectReference: {fileID: 0} + - target: {fileID: 1484711290239480336, guid: f72cd7b149a7e42d6818628ebadb8ba4, + type: 3} + propertyPath: m_SizeDelta.y + value: 179.4 + objectReference: {fileID: 0} + - target: {fileID: 1484711290239480336, guid: f72cd7b149a7e42d6818628ebadb8ba4, + type: 3} + propertyPath: m_AnchoredPosition.x + value: -273 + objectReference: {fileID: 0} + - target: {fileID: 1484711290239480336, guid: f72cd7b149a7e42d6818628ebadb8ba4, + type: 3} + propertyPath: m_AnchoredPosition.y + value: 655 + objectReference: {fileID: 0} + - target: {fileID: 4294162432436564279, guid: f72cd7b149a7e42d6818628ebadb8ba4, + type: 3} + propertyPath: m_Name + value: LoginDemoView + objectReference: {fileID: 0} + - target: {fileID: 4294162432436564279, guid: f72cd7b149a7e42d6818628ebadb8ba4, + type: 3} + propertyPath: m_IsActive + value: 1 + objectReference: {fileID: 0} + - target: {fileID: 4294162432436564280, guid: f72cd7b149a7e42d6818628ebadb8ba4, + type: 3} + propertyPath: m_Pivot.x + value: 0.5 + objectReference: {fileID: 0} + - target: {fileID: 4294162432436564280, guid: f72cd7b149a7e42d6818628ebadb8ba4, + type: 3} + propertyPath: m_Pivot.y + value: 0.5 + objectReference: {fileID: 0} + - target: {fileID: 4294162432436564280, guid: f72cd7b149a7e42d6818628ebadb8ba4, + type: 3} + propertyPath: m_RootOrder + value: 1 + objectReference: {fileID: 0} + - target: {fileID: 4294162432436564280, guid: f72cd7b149a7e42d6818628ebadb8ba4, + type: 3} + propertyPath: m_AnchorMax.x + value: 1 + objectReference: {fileID: 0} + - target: {fileID: 4294162432436564280, guid: f72cd7b149a7e42d6818628ebadb8ba4, + type: 3} + propertyPath: m_AnchorMax.y + value: 1 + objectReference: {fileID: 0} + - target: {fileID: 4294162432436564280, guid: f72cd7b149a7e42d6818628ebadb8ba4, + type: 3} + propertyPath: m_AnchorMin.x + value: 0 + objectReference: {fileID: 0} + - target: {fileID: 4294162432436564280, guid: f72cd7b149a7e42d6818628ebadb8ba4, + type: 3} + propertyPath: m_AnchorMin.y + value: 0 + objectReference: {fileID: 0} + - target: {fileID: 4294162432436564280, guid: f72cd7b149a7e42d6818628ebadb8ba4, + type: 3} + propertyPath: m_SizeDelta.x + value: 0 + objectReference: {fileID: 0} + - target: {fileID: 4294162432436564280, guid: f72cd7b149a7e42d6818628ebadb8ba4, + type: 3} + propertyPath: m_SizeDelta.y + value: 0 + objectReference: {fileID: 0} + - target: {fileID: 4294162432436564280, guid: f72cd7b149a7e42d6818628ebadb8ba4, + type: 3} + propertyPath: m_LocalPosition.x + value: 0 + objectReference: {fileID: 0} + - target: {fileID: 4294162432436564280, guid: f72cd7b149a7e42d6818628ebadb8ba4, + type: 3} + propertyPath: m_LocalPosition.y + value: 0 + objectReference: {fileID: 0} + - target: {fileID: 4294162432436564280, guid: f72cd7b149a7e42d6818628ebadb8ba4, + type: 3} + propertyPath: m_LocalPosition.z + value: 0 + objectReference: {fileID: 0} + - target: {fileID: 4294162432436564280, guid: f72cd7b149a7e42d6818628ebadb8ba4, + type: 3} + propertyPath: m_LocalRotation.w + value: 1 + objectReference: {fileID: 0} + - target: {fileID: 4294162432436564280, guid: f72cd7b149a7e42d6818628ebadb8ba4, + type: 3} + propertyPath: m_LocalRotation.x + value: 0 + objectReference: {fileID: 0} + - target: {fileID: 4294162432436564280, guid: f72cd7b149a7e42d6818628ebadb8ba4, + type: 3} + propertyPath: m_LocalRotation.y + value: 0 + objectReference: {fileID: 0} + - target: {fileID: 4294162432436564280, guid: f72cd7b149a7e42d6818628ebadb8ba4, + type: 3} + propertyPath: m_LocalRotation.z + value: 0 + objectReference: {fileID: 0} + - target: {fileID: 4294162432436564280, guid: f72cd7b149a7e42d6818628ebadb8ba4, + type: 3} + propertyPath: m_AnchoredPosition.x + value: 0 + objectReference: {fileID: 0} + - target: {fileID: 4294162432436564280, guid: f72cd7b149a7e42d6818628ebadb8ba4, + type: 3} + propertyPath: m_AnchoredPosition.y + value: 0 + objectReference: {fileID: 0} + - target: {fileID: 4294162432436564280, guid: f72cd7b149a7e42d6818628ebadb8ba4, + type: 3} + propertyPath: m_LocalEulerAnglesHint.x + value: 0 + objectReference: {fileID: 0} + - target: {fileID: 4294162432436564280, guid: f72cd7b149a7e42d6818628ebadb8ba4, + type: 3} + propertyPath: m_LocalEulerAnglesHint.y + value: 0 + objectReference: {fileID: 0} + - target: {fileID: 4294162432436564280, guid: f72cd7b149a7e42d6818628ebadb8ba4, + type: 3} + propertyPath: m_LocalEulerAnglesHint.z + value: 0 + objectReference: {fileID: 0} + - target: {fileID: 4294162432642984166, guid: f72cd7b149a7e42d6818628ebadb8ba4, + type: 3} + propertyPath: m_Text + value: WechatLogin + objectReference: {fileID: 0} + - target: {fileID: 6556306728583367042, guid: f72cd7b149a7e42d6818628ebadb8ba4, + type: 3} + propertyPath: m_AnchoredPosition.x + value: -494 + objectReference: {fileID: 0} + - target: {fileID: 6556306728583367042, guid: f72cd7b149a7e42d6818628ebadb8ba4, + type: 3} + propertyPath: m_AnchoredPosition.y + value: -506 + objectReference: {fileID: 0} + m_RemovedComponents: [] + m_SourcePrefab: {fileID: 100100000, guid: f72cd7b149a7e42d6818628ebadb8ba4, type: 3} diff --git a/Assets/HCMiniSdk/Demo/Scene/HCDemoScene.unity.meta b/Assets/HCMiniSdk/Demo/Scene/HCDemoScene.unity.meta new file mode 100644 index 00000000..f495656e --- /dev/null +++ b/Assets/HCMiniSdk/Demo/Scene/HCDemoScene.unity.meta @@ -0,0 +1,7 @@ +fileFormatVersion: 2 +guid: 2385d0ab3347640158c322b6fc9e5150 +DefaultImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/HCMiniSdk/Demo/Scripts.meta b/Assets/HCMiniSdk/Demo/Scripts.meta new file mode 100644 index 00000000..503b5e1d --- /dev/null +++ b/Assets/HCMiniSdk/Demo/Scripts.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: 7efda361ad0e14549bd367ed12e72cec +folderAsset: yes +DefaultImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/HCMiniSdk/Demo/Scripts/HCDemoScene.cs b/Assets/HCMiniSdk/Demo/Scripts/HCDemoScene.cs new file mode 100644 index 00000000..1945e4d5 --- /dev/null +++ b/Assets/HCMiniSdk/Demo/Scripts/HCDemoScene.cs @@ -0,0 +1,353 @@ +using System.Collections; +using System.Collections.Generic; +using UnityEngine; +using HC; +using UnityEngine.UI; +using System.Linq; +using Newtonsoft.Json.Linq; + +public class HCDemoScene : MonoBehaviour +{ + public HCLoginDemoView mLoginDemoView; + public HCCheckSensitiveWordView mCheckSensitiveWordView; + public Text mPurchaseBtn; + + public Image nativeImage; + + // Start is called before the first frame update + void Start() + { +#if UNITY_EDITOR && WEBGL_BYTEDANCE + StarkSDKSpace.MockSetting.OpenAllMockModule(); +#endif + mLoginDemoView.gameObject.SetActive(false); + mCheckSensitiveWordView.gameObject.SetActive(false); + HCSDKManager.Instance.SetOnPurchaseDone(PurchaseCallback); + HCSDKManager.Instance.InitializeSdk(); + +#if WEBGL_BYTEDANCE + HCSDKManager.Instance.OnShowWithDict(param => + { + // 抖音首页侧边栏 + // launch_from = homepage + // location = sidebar_card + param.TryGetValue("launch_from", out var launchFrom); + param.TryGetValue("location", out var location); + HCDebugger.LogDebug($"[OnShowWithDict] launch_from = {launchFrom} location = {location}"); + }); +#endif + } + + + public void Button_InitSDK() + { + HCSDKManager.Instance.InitializeSdk(); + HCDebugger.LogDebug("Button_InitSDK"); + } + + public void Button_ShowIV1() + { + HCDebugger.LogDebug("Button_ShowIV1"); + HCSDKManager.Instance.ShowInterstitial(HCIVPositionName.IV_Success, HCIVADType.IV1, IVCloseCallback); + } + + private void IVCloseCallback() + { + Debug.Log("IVCloseCallback"); + } + + public void Button_ShowIV2() + { + HCDebugger.LogDebug("Button_ShowIV2 start auto iv"); + // StartCoroutine("AutoIV"); + Invoke("AutoIV", 10); + } + + private void AutoIV() + { + HCDebugger.LogDebug("自动插屏显示"); + HCSDKManager.Instance.ShowInterstitial(HCIVPositionName.IV_Success, HCIVADType.IV2); + Invoke("AutoIV", 10); + } + + public void Button_ShowBanner() + { + HCDebugger.LogDebug("Button_ShowBanner"); + HCSDKManager.Instance.ShowBanner(); + } + + public void Button_HideBanner() + { + HCDebugger.LogDebug("Button_HideBanner"); + HCSDKManager.Instance.HideBanner(); + } + + public void Button_ShowNative() + { + HCDebugger.LogDebug($"Button_ShowNative {HCStaticParams.NativeAdUnitID1} = {HCSDKManager.Instance.IsNativeAdReady(HCStaticParams.NativeAdUnitID1)}"); + nativeImage.color = Color.blue; + HCSDKManager.Instance.ShowNative(nativeImage.rectTransform, adUnit: HCStaticParams.NativeAdUnitID1, _showFailedCallback: (i, s) => + { + HCDebugger.LogDebug($"$Button_show callback show fail code = {i} msg = {s}"); + nativeImage.color = Color.clear; + }, _closeCallback: () => + { + HCDebugger.LogDebug($"$Button_show callback close"); + nativeImage.color = Color.clear; + }); + } + + public void Button_RemoveNative() + { + HCDebugger.LogDebug("Button_RemoveNative"); + nativeImage.color = Color.clear; + HCSDKManager.Instance.RemoveNative(HCStaticParams.NativeAdUnitID1); + } + + public void Button_ShowNative_2() + { + HCDebugger.LogDebug($"Button_ShowNative_2 {HCStaticParams.NativeAdUnitID2} = {HCSDKManager.Instance.IsNativeAdReady(HCStaticParams.NativeAdUnitID2)}"); + HCDebugger.LogDebug("Button_ShowNative_2"); + HCSDKManager.Instance.ShowNative(null, adUnit: HCStaticParams.NativeAdUnitID2); + } + + public void Button_RemoveNative_2() + { + HCDebugger.LogDebug("Button_RemoveNative_2"); + HCSDKManager.Instance.RemoveNative(HCStaticParams.NativeAdUnitID2); + } + + public void Button_ShowNative_3() + { + HCDebugger.LogDebug($"Button_ShowNative_3 {HCStaticParams.NativeAdUnitID3} = {HCSDKManager.Instance.IsNativeAdReady(HCStaticParams.NativeAdUnitID3)}"); + HCDebugger.LogDebug("Button_ShowNative_3"); + HCSDKManager.Instance.ShowNative(null, adUnit: HCStaticParams.NativeAdUnitID3); + } + + public void Button_RemoveNative_3() + { + HCDebugger.LogDebug("Button_RemoveNative_3"); + HCSDKManager.Instance.RemoveNative(HCStaticParams.NativeAdUnitID3); + } + + public void Button_ShowNative_4() + { + HCDebugger.LogDebug($"Button_ShowNative_4 {HCStaticParams.NativeAdUnitID4} = {HCSDKManager.Instance.IsNativeAdReady(HCStaticParams.NativeAdUnitID4)}"); + HCDebugger.LogDebug("Button_ShowNative_4"); + HCSDKManager.Instance.ShowNative(null, adUnit: HCStaticParams.NativeAdUnitID4); + } + + public void Button_RemoveNative_4() + { + HCDebugger.LogDebug("Button_RemoveNative_4"); + HCSDKManager.Instance.RemoveNative(HCStaticParams.NativeAdUnitID4); + } + + public void Button_ShowRV() + { + HCDebugger.LogDebug("Button_ShowRV"); + HCSDKManager.Instance.ShowRewardedAd(HCRVPositionName.GetDoubleCoin, RewardCallback); + } + + private void RewardCallback(bool success) + { + HCDebugger.LogDebug("RewardCallback result:" + success); + } + + public void Button_Event01() + { + HCDebugger.LogDebug("Button_Event01"); + HCSDKManager.Instance.LogEvent("TestEvent01"); + } + + public void Button_Event02() + { + HCDebugger.LogDebug("Button_Event02"); + HCSDKManager.Instance.LogEvent("TestEvent02", "key01", "value01"); + } + + public void Button_Event03() + { + HCDebugger.LogDebug("Button_Event03"); + HCSDKManager.Instance.LogEvent("TestEvent03", "key01", "value01", "key02", "value02"); + } + + public void ButtonBuyNoads() + { + HCDebugger.LogDebug("ButtonBuy"); +#if USE_IAP + HCSDKManager.Instance.BuyProductByID(HCPurchaseProducts.NoAds,"RemoveAds"); +#endif + } + + public void ButtonBuyCoins() + { + HCDebugger.LogDebug("ButtonRestore"); +#if USE_IAP + HCSDKManager.Instance.BuyProductByID(HCPurchaseProducts.Product01, "coins"); +#endif + } + + public void ButtonRestore() + { +#if USE_IAP + HCSDKManager.Instance.RestorePurchases(); +#endif + } + + public void ButtonWebGL() + { +#if UNITY_WEBGL + HCSDKManager.Instance.Buy(new HCPaymentArgs + { + productId = "boori.cash.1", + productName = "1元商品", + money = 100, + gameExtraParam = "{\\\"player_id\\\":150}" + }); + +#endif + } + + public void ButtonWebGL2() + { +#if UNITY_WEBGL + HCSDKManager.Instance.Buy(new HCPaymentArgs + { + productId = "id.68", + productName = "68元商品", + money = 6800, + gameExtraParam = "拓展字段" + }); + +#endif + } + + public void ButtonWebGL3() + { +#if UNITY_WEBGL + HCSDKManager.Instance.Buy(new HCPaymentArgs + { + productId = "id.3", + productName = "6元商品", + money = 600, + gameExtraParam = "拓展字段" + }); + +#endif + } + + + private void PurchaseCallback(string orderID, string productName, string productID, bool purchaseResult, string gameExtra, bool orderAlreadyExists, string serverGameExtra) + { + if (purchaseResult) + { + mPurchaseBtn.text = "购买成功"; +#if WEBGL_WX + WeChatWASM.WX.ShowToast(new WeChatWASM.ShowToastOption + { + title = $"购买成功 {productName} {orderID}" + }); + + HCSDKManager.Instance.Awarded(orderID); +#endif + + } + else + { + mPurchaseBtn.text = "购买失败"; +#if WEBGL_WX + WeChatWASM.WX.ShowToast(new WeChatWASM.ShowToastOption + { + icon = "error", + title = $"购买失败 {productName} {orderID}" + + }); +#endif + } + + HCDebugger.LogDebug("PurchaseCallback orderID:" + orderID + "productName:" + productName + "productID" + productID + "purResult" + purchaseResult + "gameExtra:" + gameExtra + "\t serverGameExtra : " + serverGameExtra); + } + + + private void UserSourceListenerCallback(bool isOrganic, string network) + { + HCSDKManager.Instance.ShowToast("isOrganic:" + isOrganic + "===newwotk:" + network); + HCDebugger.LogDebug("SetUserSourceListenerCallback isOrganic:" + isOrganic + "network:" + network); + } + + #region Account + + /// + /// Guest Login + /// + public void ButtonEvent_ShowLoginScreen() + { + HCDebugger.LogDebug("ButtonEvent_ShowLoginScreen"); + mLoginDemoView.OpenWithLoginScreen(true); + } + + /// + /// Google Login + /// + public void ButtonEvent_Directlogin() + { + HCDebugger.LogDebug("ButtonEvent_Directlogin"); + mLoginDemoView.OpenWithLoginScreen(false); + } + + /// + /// share + /// + public void ButtonEvent_Share() + { + HCDebugger.LogDebug("ButtonEvent_Share"); + HCSDKManager.Instance.Share("title", null, null, (result) => { HCDebugger.LogDebug($"Share callback result = {result}"); }); + } + + #endregion + + #region Record + + /// + /// StartRecord + /// + public void ButtonEvent_StartRecord() + { + HCDebugger.LogDebug("StartRecord"); +#if WEBGL_BYTEDANCE + // 主调调用结束 + HCSDKManager.Instance.StartRecord(true, timeoutCallback: (s) => + { + HCDebugger.LogDebug($"录制结束 s = {s}"); + }); +#endif + } + + /// + /// StopRecord + /// + public void ButtonEvent_StopRecord() + { + HCDebugger.LogDebug("StopRecord"); +#if WEBGL_BYTEDANCE + HCSDKManager.Instance.StopRecord(s => + { +#if WEBGL_BYTEDANCE + + HCSDKManager.Instance.DyShareRecordVideo("title test", new[] { "topic 1", "topic 2" }, (result, msg, dict) => + { + HCDebugger.LogDebug($"[StopRecord] result = ${result} msg = {msg}"); + }); +#endif + }); +#endif + } + + public void ButtonEvent_SensitiveWordView() + { + mCheckSensitiveWordView.gameObject.SetActive(true); + } + + #endregion +} \ No newline at end of file diff --git a/Assets/HCMiniSdk/Demo/Scripts/HCDemoScene.cs.meta b/Assets/HCMiniSdk/Demo/Scripts/HCDemoScene.cs.meta new file mode 100644 index 00000000..9c965328 --- /dev/null +++ b/Assets/HCMiniSdk/Demo/Scripts/HCDemoScene.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: 2b861244fe74b4ab78178c3aadfb35e4 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/HCMiniSdk/Demo/Scripts/Views.meta b/Assets/HCMiniSdk/Demo/Scripts/Views.meta new file mode 100644 index 00000000..97925617 --- /dev/null +++ b/Assets/HCMiniSdk/Demo/Scripts/Views.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: 221344cede6f1499e964a5ee7ad080b4 +folderAsset: yes +DefaultImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/HCMiniSdk/Demo/Scripts/Views/HCCheckSensitiveWordView.cs b/Assets/HCMiniSdk/Demo/Scripts/Views/HCCheckSensitiveWordView.cs new file mode 100644 index 00000000..8c50d4a4 --- /dev/null +++ b/Assets/HCMiniSdk/Demo/Scripts/Views/HCCheckSensitiveWordView.cs @@ -0,0 +1,33 @@ +using System; +using UnityEngine; +using UnityEngine.UI; + +namespace HC +{ + public class HCCheckSensitiveWordView : MonoBehaviour + { + public InputField InputField; + public Button Button; + public Text HasSensitiveText; + public Text TextText; + public Text CheckSourceText; + + private void Start() + { + Button.onClick.AddListener(() => + { + var inputFieldText = InputField.text; + HasSensitiveText.text = ""; + TextText.text = ""; + CheckSourceText.text = ""; + + HCSDKManager.Instance.CheckSensitiveWords(inputFieldText, SensitiveType.Chat, result => + { + HasSensitiveText.text = result.HasSensitive.ToString(); + TextText.text = result.Text; + CheckSourceText.text = result.CheckSource.ToString(); + }); + }); + } + } +} \ No newline at end of file diff --git a/Assets/HCMiniSdk/Demo/Scripts/Views/HCCheckSensitiveWordView.cs.meta b/Assets/HCMiniSdk/Demo/Scripts/Views/HCCheckSensitiveWordView.cs.meta new file mode 100644 index 00000000..a85cc36c --- /dev/null +++ b/Assets/HCMiniSdk/Demo/Scripts/Views/HCCheckSensitiveWordView.cs.meta @@ -0,0 +1,3 @@ +fileFormatVersion: 2 +guid: f263d468b9ec4c9f991a1a39f5869cf5 +timeCreated: 1706111963 \ No newline at end of file diff --git a/Assets/HCMiniSdk/Demo/Scripts/Views/HCLoginDemoView.cs b/Assets/HCMiniSdk/Demo/Scripts/Views/HCLoginDemoView.cs new file mode 100644 index 00000000..dee70632 --- /dev/null +++ b/Assets/HCMiniSdk/Demo/Scripts/Views/HCLoginDemoView.cs @@ -0,0 +1,421 @@ +using System.Collections; +using System.Collections.Generic; +using UnityEngine; +using HC; +using System; +using UnityEngine.UI; + +public class HCLoginDemoView : MonoBehaviour +{ + public GameObject mLoginScreenView; + public GameObject mNoLoginScreenView; + public GameObject mGameView; + + public GameObject bindAccountGP; + public GameObject bindAccountApple; + public GameObject forceBind01; + public GameObject forceBind02; + + + public Text currAccountText; + public Text bindAccountText; + + public Image gameClub; + public Image gameClub2; + public Image gameClub3; + + // if has login screen + private bool hasLoginScreen = false; + + private string _userId; + private string _token; + private HCLoginType _userType; + private HCLoginType _loginType; + private Action _loginAction; + + private Action _bindAccountCallback; + + private string[] userIDs; + + public GameObject FriendsRankPanel; + public GameObject FriendsRankRootShowPanel; + + // Start is called before the first frame update + void Start() + { + HCDebugger.LogDebug("HCLoginDemoView Start"); + //currAccountText.text = ""; + //bindAccountText.text = ""; + + _loginAction = (LoginInfo) => + { + Debug.Log($"登陆回调 {LoginInfo.loginStatus} type:{LoginInfo.userInfo.loginType} msg:{LoginInfo.loginMsg} userId:{LoginInfo.userInfo.userID} token:{LoginInfo.userInfo.token}"); + if (LoginInfo.loginStatus == HCLoginStatus.LOGIN_STATUS_SUCC) + { + _userId = LoginInfo.userInfo.userID; + _userType = LoginInfo.userInfo.loginType; + _token = LoginInfo.userInfo.token; + EnterGame(); + HCToast.ShowToast("登陆成功"); + + SetCurrAccountText(); + RefershBindBtns(); +#if WEBGL_WX + var playerPrefsInt = HCTools.GetPlayerPrefsInt("hc_score",0); + HCTools.SavePlayerPrefsInt("hc_score", playerPrefsInt + 1); + HCSDKManager.Instance.SetUserRecord(playerPrefsInt, (result, msg) => + { + HCDebugger.LogDebug($"[ShowFriendsRank] SetUserRecord callback result = {result} smg = {msg}"); + }, extra: new Dictionary() + { + ["temp"] = _userId + }); + + HCSDKManager.Instance.GetGameClubData((res) => + { + if (res.Code == 0) + { + foreach (var (key, value) in res.Data) + { + HCDebugger.LogDebug($"Game Club key = {key} value = {value}"); + } + } + else + { + HCDebugger.LogError($"获取失败 , msg = {res.Msg} msg = {res.PlatformMsg}"); + } + }); + HCSDKManager.Instance.ShowGameClubButton("https://wxres.dgtverse.cn/h5pay/img/weChat.png", gameClub.rectTransform, + callback: result => { HCDebugger.LogDebug($"[ShowGameClubButton] result.Code {result.Code} result.Msg {result.Msg} result.IsClick {result.IsClick}"); }); + HCSDKManager.Instance.ShowGameClubButton("https://wxres.dgtverse.cn/h5pay/img/weChat.png", gameClub2.rectTransform, + callback: result => { HCDebugger.LogDebug($"[ShowGameClubButton] result.Code {result.Code} result.Msg {result.Msg} result.IsClick {result.IsClick}"); }); + // HCSDKManager.Instance.ShowGameClubButton("https://wxres.dgtverse.cn/h5pay/img/weChat.png", gameClub3.rectTransform,callback: result => + // { + // HCDebugger.LogDebug($"[ShowGameClubButton] result.Code {result.Code} result.Msg {result.Msg} result.IsClick {result.IsClick}"); + // }); + + HCSDKManager.Instance.GetUserInfo(result => + { + if (result.Code == WxUserInfo.CODE_SUCCESS) + { + HCDebugger.LogDebug($"用户信息 1[直接获取] 获取成功 NickName = {result.NickName}, AvatarUrl = {result.AvatarUrl}, Province = {result.Province}, City = {result.City}"); + // 获取成功 + } + else + { + HCDebugger.LogDebug($"用户没有权限,需要显示按钮 Code = {result.Code} Msg = {result.Msg}"); + // 游戏需要跳转授权界面,同时显示按钮 + HCSDKManager.Instance.CreateUserInfoButton(gameClub3.rectTransform, + result => { HCDebugger.LogDebug($"用户信息 2[按钮显示] 获取成功 NickName = {result.NickName}, AvatarUrl = {result.AvatarUrl}, Province = {result.Province}, City = {result.City}"); }); + } + }); + +#endif + } + else + { + _userId = ""; + _userType = HCLoginType.LOGIN_BY_GUESTER; + _token = ""; + HCToast.ShowToast($"登陆失败:{LoginInfo.loginMsg}"); + OpenWithLoginScreen(hasLoginScreen); + } + }; + + _bindAccountCallback = (BindInfo) => + { + Debug.Log( + $"绑定回调 {BindInfo.bindStatus} type:{BindInfo.userInfo.loginType} msg:{BindInfo.bindMsg} userId:{BindInfo.userInfo.userID} token:{BindInfo.userInfo.token} userIdList:{BindInfo.userIDs}"); + if (BindInfo.bindStatus == HCBindAccountStatus.BIND_CODE_SELECT) + { + HCDebugger.LogDebug("绑定回调 - 选择界面"); + userIDs = BindInfo.userIDs; + + forceBind01.SetActive(true); + forceBind02.SetActive(true); + bindAccountGP.SetActive(false); + bindAccountApple.SetActive(false); + + SetBindAccountText(); + + + //InitBindSelectView(userIdList); // TODO + return; + } + + if (BindInfo.bindStatus == HCBindAccountStatus.BIND_CODE_SUCC) + { + HCDebugger.LogDebug("绑定回调 - 绑定成功"); + if (!BindInfo.userInfo.userID.Equals(_userId)) + { + HCDebugger.LogDebug($"绑定回调 - 绑定成功 - 重新登陆 userId:{BindInfo.userInfo.userID} _userId:{_userId}"); + //CloseBindSelectView(); // TODO + //// 重新登陆了 + //ShowLoading(); + return; + } + + forceBind01.SetActive(false); + forceBind02.SetActive(false); + bindAccountGP.SetActive(false); + bindAccountApple.SetActive(false); + + SetBindAccountText(); + + HCToast.ShowToast("绑定成功"); + //ShowUserCenter(); // TODO + return; + } + + HCToast.ShowToast($"绑定失败 {BindInfo.bindMsg}"); + }; + } + + private void SetCurrAccountText() + { + HC.UserInfo userInfo = HCSDKManager.Instance.GetCurrAccountInfo(); + if (userInfo != null) + { + currAccountText.text = "UserID : " + userInfo.userID + " , loginType : " + userInfo.loginType; + } + } + + private void SetBindAccountText() + { + bindAccountText.text = "2"; // "UserID1 : " + userIDs[0] + " , UserID2 : " + userIDs[2]; + } + + /// + /// open login demo view + /// + /// + public void OpenWithLoginScreen(bool _hasLoginScreen) + { + hasLoginScreen = _hasLoginScreen; + gameObject.SetActive(true); + mLoginScreenView.SetActive(false); + mNoLoginScreenView.SetActive(false); + mGameView.SetActive(false); + + RefershBindBtns(); + + if (_hasLoginScreen) + { + mLoginScreenView.SetActive(true); + + List list = HCSDKManager.Instance.AvailableLoginChannelList(); + for (int i = 0; i < list.Count; i++) + { + HCDebugger.LogDebug("Available login Type : " + list[i]); + } + } + else + { + mNoLoginScreenView.SetActive(true); + } + } + + private void RefershBindBtns() + { + if (HCSDKManager.Instance.GetCurrAccountInfo() != null && HCSDKManager.Instance.GetCurrAccountInfo().loginType == HCLoginType.LOGIN_BY_GUESTER) + { + bindAccountGP.SetActive(true); +#if UNITY_IOS + bindAccountApple.SetActive(true); +#endif + forceBind01.SetActive(false); + forceBind02.SetActive(false); + } + else if (HCSDKManager.Instance.GetCurrAccountInfo() != null && HCSDKManager.Instance.GetCurrAccountInfo().loginType != HCLoginType.LOGIN_BY_GUESTER) + { + bindAccountGP.SetActive(false); + + bindAccountApple.SetActive(false); + + forceBind01.SetActive(false); + forceBind02.SetActive(false); + } + } + + /// + /// enter game + /// + private void EnterGame() + { + gameObject.SetActive(true); + mLoginScreenView.SetActive(false); + mNoLoginScreenView.SetActive(false); + mGameView.SetActive(true); + } + + #region Button Event + + /// + /// Back Button Click + /// + public void ButtonEvent_Back() + { + HCDebugger.LogDebug("ButtonEvent_ShowLoginScreen"); + gameObject.SetActive(false); +#if WEBGL_WX + HCSDKManager.Instance.CloseGameClubButton(); + HCSDKManager.Instance.CloseUserInfoButton(); +#endif + } + + /// + /// Guest Login + /// + public void ButtonEvent_GuestLogin() + { + HCDebugger.LogDebug("ButtonEvent_GuestLogin"); + HCSDKManager.Instance.Login(HCLoginType.LOGIN_BY_GUESTER, _loginAction); + } + + /// + /// Google Login + /// + public void ButtonEvent_GoogleLogin() + { + HCDebugger.LogDebug("ButtonEvent_GoogleLogin"); + HCSDKManager.Instance.Login(HCLoginType.LOGIN_BY_WECHAT_MINI_GAME, _loginAction); + } + + /// + /// Facebook Login + /// + public void ButtonEvent_FBLogin() + { + HCDebugger.LogDebug("ButtonEvent_FBLogin"); + HCSDKManager.Instance.Login(HCLoginType.LOGIN_BY_FACEBOOK, _loginAction); + } + + /// + /// Apple Login + /// + public void ButtonEvent_AppleLogin() + { + HCDebugger.LogDebug("ButtonEvent_AppleLogin"); + HCSDKManager.Instance.Login(HCLoginType.LOGIN_BY_Apple, _loginAction); + } + + /// + /// Auto Login + /// + public void ButtonEvent_AutoLogin() + { + HCDebugger.LogDebug("ButtonEvent_AutoLogin"); + HCSDKManager.Instance.AutoLogin(); + } + + /// + /// Bind Account + /// + public void ButtonEvent_BindGPAccount() + { + HCDebugger.LogDebug("ButtonEvent_BindAccount"); + HCSDKManager.Instance.BindAccount(HCLoginType.LOGIN_BY_GOOGLE, _bindAccountCallback); + } + + /// + /// Bind Account + /// + public void ButtonEvent_BindAppleAccount() + { + HCDebugger.LogDebug("ButtonEvent_BindAppleAccount"); + HCSDKManager.Instance.BindAccount(HCLoginType.LOGIN_BY_Apple, _bindAccountCallback); + } + + /// + /// Force Bind Account + /// + public void ButtonEvent_ForceBindAccount01() + { + HCDebugger.LogDebug("ButtonEvent_ForceBindAccount"); + HCSDKManager.Instance.ForceBindAccount(userIDs[0], _bindAccountCallback); + } + + /// + /// Force Bind Account + /// + public void ButtonEvent_ForceBindAccount02() + { + HCDebugger.LogDebug("ButtonEvent_ForceBindAccount"); + HCSDKManager.Instance.ForceBindAccount(userIDs[1], _bindAccountCallback); + } + + + /// + /// Logout + /// + public void ButtonEvent_Logout() + { + HCDebugger.LogDebug("ButtonEvent_Logout"); + HCSDKManager.Instance.Logout(); + } + + /// + /// Delete Account + /// + public void ButtonEvent_DeleteAccount() + { + HCDebugger.LogDebug("ButtonEvent_DeleteAccount"); + HCSDKManager.Instance.DeleteAccount(DeleteCallback); + } + + private void DeleteCallback(HCDeleteStatus status, string msg) + { + HCDebugger.LogDebug("Delete account callback status:" + status + "msg:" + msg); + } + + /// + /// Get Current Account + /// + public void ButtonEvent_GetCurrentAccount() + { + HC.UserInfo userInfo = HCSDKManager.Instance.GetCurrAccountInfo(); + Debug.Log("ButtonEvent_GetCurrentAccount, userID :" + userInfo.userID + " , loginType : " + userInfo.loginType); + SetCurrAccountText(); + } + + /// + /// 微信跳转到游戏圈子 + /// + public void ButtonEvent_GoGameClub() + { +#if WEBGL_WX + HCSDKManager.Instance.CloseGameClubButton(gameClub.rectTransform); +#endif + } + + public void ButtonEvent_ShowFriendsRank() + { +#if WEBGL_WX + if (FriendsRankPanel.activeSelf) + { + return; + } + + FriendsRankPanel.SetActive(true); + HCSDKManager.Instance.ShowFriendsRankAndRequestAuthorize(FriendsRankRootShowPanel, (code, msg) => + { + if (code == -1) + { + // TODO 没有获取到权限,排行榜不会显示,游戏根据自己逻辑做不同操作,比如:可以弹出引导玩家到直接界面开启权限。HCSDKManager.Instance.OpenSetting() + } + HCDebugger.LogDebug($"[ShowFriendsRank] 显示结果: code = {code} msg = {msg}"); + }); + +#endif + } + + public void ButtonEvent_CloseFriendsRank() + { +#if WEBGL_WX + FriendsRankPanel.SetActive(false); + HCSDKManager.Instance.CloseFriendsRank(); +#endif + } + + #endregion +} \ No newline at end of file diff --git a/Assets/HCMiniSdk/Demo/Scripts/Views/HCLoginDemoView.cs.meta b/Assets/HCMiniSdk/Demo/Scripts/Views/HCLoginDemoView.cs.meta new file mode 100644 index 00000000..2e7dbe42 --- /dev/null +++ b/Assets/HCMiniSdk/Demo/Scripts/Views/HCLoginDemoView.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: 370553651bea74befb3856be623fce3c +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/HCMiniSdk/Demo/Scripts/Views/HCToast.cs b/Assets/HCMiniSdk/Demo/Scripts/Views/HCToast.cs new file mode 100644 index 00000000..a62df15a --- /dev/null +++ b/Assets/HCMiniSdk/Demo/Scripts/Views/HCToast.cs @@ -0,0 +1,54 @@ +using System.Collections; +using System.Collections.Generic; +using UnityEngine; +using UnityEngine.UI; + +namespace HC +{ + public class HCToast : MonoBehaviour + { + private static HCToast instance; + + private void Awake() + { + if (instance != null) + { + Destroy(gameObject); + } + else + { + instance = this; + } + } + + private void Start() + { + instance.gameObject.SetActive(false); + } + + public static HCToast Instance => instance; + + public Text toastText; + private const float ToastDuration = 2f; + + public static void ShowToast(string message) + { + instance._ShowToast(message); + } + + private void _ShowToast(string message) + { + instance.gameObject.SetActive(true); + StartCoroutine(ShowAndHideToast(message)); + } + + private IEnumerator ShowAndHideToast(string message) + { + toastText.text = message; + instance.gameObject.SetActive(true); + yield return new WaitForSeconds(ToastDuration); + instance.gameObject.SetActive(false); + } + } + +} diff --git a/Assets/HCMiniSdk/Demo/Scripts/Views/HCToast.cs.meta b/Assets/HCMiniSdk/Demo/Scripts/Views/HCToast.cs.meta new file mode 100644 index 00000000..f8fd11cc --- /dev/null +++ b/Assets/HCMiniSdk/Demo/Scripts/Views/HCToast.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: 036a9d8642a4e4c729cbd63943c217f7 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/HCMiniSdk/Resources.meta b/Assets/HCMiniSdk/Resources.meta new file mode 100644 index 00000000..13bf7735 --- /dev/null +++ b/Assets/HCMiniSdk/Resources.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: 0fc1349529f2f4052ba11e42c0b29cd4 +folderAsset: yes +DefaultImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/HCMiniSdk/Resources/Image.meta b/Assets/HCMiniSdk/Resources/Image.meta new file mode 100644 index 00000000..ca11fe2e --- /dev/null +++ b/Assets/HCMiniSdk/Resources/Image.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: 73edd4165924d4e139e9e67d56ee41a4 +folderAsset: yes +DefaultImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/HCMiniSdk/Resources/Image/hc_transparent.png b/Assets/HCMiniSdk/Resources/Image/hc_transparent.png new file mode 100644 index 00000000..fdf950d0 Binary files /dev/null and b/Assets/HCMiniSdk/Resources/Image/hc_transparent.png differ diff --git a/Assets/HCMiniSdk/Resources/Image/hc_transparent.png.meta b/Assets/HCMiniSdk/Resources/Image/hc_transparent.png.meta new file mode 100644 index 00000000..dd4c2ae2 --- /dev/null +++ b/Assets/HCMiniSdk/Resources/Image/hc_transparent.png.meta @@ -0,0 +1,159 @@ +fileFormatVersion: 2 +guid: 2b2ebb01864b94715ae83e1b51b736af +TextureImporter: + internalIDToNameTable: [] + externalObjects: {} + serializedVersion: 12 + mipmaps: + mipMapMode: 0 + enableMipMap: 0 + sRGBTexture: 1 + linearTexture: 0 + fadeOut: 0 + borderMipMap: 0 + mipMapsPreserveCoverage: 0 + alphaTestReferenceValue: 0.5 + mipMapFadeDistanceStart: 1 + mipMapFadeDistanceEnd: 3 + bumpmap: + convertToNormalMap: 0 + externalNormalMap: 0 + heightScale: 0.25 + normalMapFilter: 0 + isReadable: 0 + streamingMipmaps: 0 + streamingMipmapsPriority: 0 + vTOnly: 0 + ignoreMasterTextureLimit: 0 + grayScaleToAlpha: 0 + generateCubemap: 6 + cubemapConvolution: 0 + seamlessCubemap: 0 + textureFormat: 1 + maxTextureSize: 2048 + textureSettings: + serializedVersion: 2 + filterMode: 1 + aniso: 1 + mipBias: 0 + wrapU: 1 + wrapV: 1 + wrapW: 1 + nPOTScale: 0 + lightmap: 0 + compressionQuality: 50 + spriteMode: 1 + spriteExtrude: 1 + spriteMeshType: 1 + alignment: 0 + spritePivot: {x: 0.5, y: 0.5} + spritePixelsToUnits: 100 + spriteBorder: {x: 0, y: 0, z: 0, w: 0} + spriteGenerateFallbackPhysicsShape: 1 + alphaUsage: 1 + alphaIsTransparency: 1 + spriteTessellationDetail: -1 + textureType: 8 + textureShape: 1 + singleChannelComponent: 0 + flipbookRows: 1 + flipbookColumns: 1 + maxTextureSizeSet: 0 + compressionQualitySet: 0 + textureFormatSet: 0 + ignorePngGamma: 0 + applyGammaDecoding: 0 + cookieLightType: 0 + platformSettings: + - serializedVersion: 3 + buildTarget: DefaultTexturePlatform + maxTextureSize: 2048 + resizeAlgorithm: 0 + textureFormat: -1 + textureCompression: 1 + compressionQuality: 50 + crunchedCompression: 0 + allowsAlphaSplitting: 0 + overridden: 0 + androidETC2FallbackOverride: 0 + forceMaximumCompressionQuality_BC6H_BC7: 0 + - serializedVersion: 3 + buildTarget: Standalone + maxTextureSize: 2048 + resizeAlgorithm: 0 + textureFormat: -1 + textureCompression: 1 + compressionQuality: 50 + crunchedCompression: 0 + allowsAlphaSplitting: 0 + overridden: 0 + androidETC2FallbackOverride: 0 + forceMaximumCompressionQuality_BC6H_BC7: 0 + - serializedVersion: 3 + buildTarget: Server + maxTextureSize: 2048 + resizeAlgorithm: 0 + textureFormat: -1 + textureCompression: 1 + compressionQuality: 50 + crunchedCompression: 0 + allowsAlphaSplitting: 0 + overridden: 0 + androidETC2FallbackOverride: 0 + forceMaximumCompressionQuality_BC6H_BC7: 0 + - serializedVersion: 3 + buildTarget: Android + maxTextureSize: 2048 + resizeAlgorithm: 0 + textureFormat: -1 + textureCompression: 1 + compressionQuality: 50 + crunchedCompression: 0 + allowsAlphaSplitting: 0 + overridden: 0 + androidETC2FallbackOverride: 0 + forceMaximumCompressionQuality_BC6H_BC7: 0 + - serializedVersion: 3 + buildTarget: iPhone + maxTextureSize: 2048 + resizeAlgorithm: 0 + textureFormat: -1 + textureCompression: 1 + compressionQuality: 50 + crunchedCompression: 0 + allowsAlphaSplitting: 0 + overridden: 0 + androidETC2FallbackOverride: 0 + forceMaximumCompressionQuality_BC6H_BC7: 0 + - serializedVersion: 3 + buildTarget: WebGL + maxTextureSize: 2048 + resizeAlgorithm: 0 + textureFormat: -1 + textureCompression: 1 + compressionQuality: 50 + crunchedCompression: 0 + allowsAlphaSplitting: 0 + overridden: 0 + androidETC2FallbackOverride: 0 + forceMaximumCompressionQuality_BC6H_BC7: 0 + spriteSheet: + serializedVersion: 2 + sprites: [] + outline: [] + physicsShape: [] + bones: [] + spriteID: 5e97eb03825dee720800000000000000 + internalID: 0 + vertices: [] + indices: + edges: [] + weights: [] + secondaryTextures: [] + nameFileIdTable: {} + spritePackingTag: + pSDRemoveMatte: 0 + pSDShowRemoveMatteOption: 0 + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/HCMiniSdk/Resources/Prefabs.meta b/Assets/HCMiniSdk/Resources/Prefabs.meta new file mode 100644 index 00000000..39c502c0 --- /dev/null +++ b/Assets/HCMiniSdk/Resources/Prefabs.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: 7dbab14bedeb44c9db00604cbcb53962 +folderAsset: yes +DefaultImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/HCMiniSdk/Resources/Prefabs/hc_FriendsRank.prefab b/Assets/HCMiniSdk/Resources/Prefabs/hc_FriendsRank.prefab new file mode 100644 index 00000000..341d8d98 --- /dev/null +++ b/Assets/HCMiniSdk/Resources/Prefabs/hc_FriendsRank.prefab @@ -0,0 +1,75 @@ +%YAML 1.1 +%TAG !u! tag:unity3d.com,2011: +--- !u!1 &1298210844127883318 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 1298210844127883319} + - component: {fileID: 1298210844127883313} + - component: {fileID: 1298210844127883312} + m_Layer: 5 + m_Name: hc_FriendsRank + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!224 &1298210844127883319 +RectTransform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1298210844127883318} + m_LocalRotation: {x: 1, y: 0, z: 0, w: 0} + m_LocalPosition: {x: 0, y: 0, z: 0} + m_LocalScale: {x: 1, y: 1, z: 1} + m_ConstrainProportionsScale: 0 + m_Children: [] + m_Father: {fileID: 0} + m_RootOrder: 0 + m_LocalEulerAnglesHint: {x: 180, y: 0, z: 0} + m_AnchorMin: {x: 0, y: 0} + m_AnchorMax: {x: 1, y: 1} + m_AnchoredPosition: {x: 0, y: 0} + m_SizeDelta: {x: 0, y: 0} + m_Pivot: {x: 0.5, y: 0.5} +--- !u!222 &1298210844127883313 +CanvasRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1298210844127883318} + m_CullTransparentMesh: 1 +--- !u!114 &1298210844127883312 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1298210844127883318} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 1344c3c82d62a2a41a3576d8abb8e3ea, type: 3} + m_Name: + m_EditorClassIdentifier: + m_Material: {fileID: 0} + m_Color: {r: 1, g: 1, b: 1, a: 1} + m_RaycastTarget: 1 + m_RaycastPadding: {x: 0, y: 0, z: 0, w: 0} + m_Maskable: 1 + m_OnCullStateChanged: + m_PersistentCalls: + m_Calls: [] + m_Texture: {fileID: 2800000, guid: 2b2ebb01864b94715ae83e1b51b736af, type: 3} + m_UVRect: + serializedVersion: 2 + x: 0 + y: 0 + width: 1 + height: 1 diff --git a/Assets/HCMiniSdk/Resources/Prefabs/hc_FriendsRank.prefab.meta b/Assets/HCMiniSdk/Resources/Prefabs/hc_FriendsRank.prefab.meta new file mode 100644 index 00000000..4d977e0a --- /dev/null +++ b/Assets/HCMiniSdk/Resources/Prefabs/hc_FriendsRank.prefab.meta @@ -0,0 +1,7 @@ +fileFormatVersion: 2 +guid: 37efcfa935e7b4c448d9d12456dddbc7 +PrefabImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/HCMiniSdk/Scripts.meta b/Assets/HCMiniSdk/Scripts.meta new file mode 100644 index 00000000..44157afd --- /dev/null +++ b/Assets/HCMiniSdk/Scripts.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: 2ac94276d4d5e4e2f83d3332b6ae3b7b +folderAsset: yes +DefaultImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/HCMiniSdk/Scripts/Account.meta b/Assets/HCMiniSdk/Scripts/Account.meta new file mode 100644 index 00000000..908b450a --- /dev/null +++ b/Assets/HCMiniSdk/Scripts/Account.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: 85cad72b1cc7c44f88d112bb480fa2b5 +folderAsset: yes +DefaultImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/HCMiniSdk/Scripts/Account/HCAccountDefine.cs b/Assets/HCMiniSdk/Scripts/Account/HCAccountDefine.cs new file mode 100644 index 00000000..ce6e7e75 --- /dev/null +++ b/Assets/HCMiniSdk/Scripts/Account/HCAccountDefine.cs @@ -0,0 +1,72 @@ +using UnityEngine; +using System.Collections; + +namespace HC +{ + public enum HCLoginType + { + // 游客登录 + LOGIN_BY_GUESTER = 0, + + // 邮箱账号登录(暂不支持) + LOGIN_BY_EMAIL = 1, + + // Google登录 + LOGIN_BY_GOOGLE = 2, + + // Facebook登录 + LOGIN_BY_FACEBOOK = 3, + + // Apple登录 + LOGIN_BY_Apple = 4, + + // 微信小游戏登陆 + LOGIN_BY_WECHAT_MINI_GAME = 5, + + // 抖音小游戏登陆 + LOGIN_BY_BYTEDANCE = 8, + + // Auto登录 + LOGIN_BY_AUTO = 10, + } + + public enum HCBindAccountStatus + { + // 绑定失败 + BIND_CODE_FAILED = -1, + // 绑定成功 + BIND_CODE_SUCC = 0, + // 取消绑定 + BIND_CODE_CANCEL = 1, + // 已经绑定账户,需要选择 + BIND_CODE_SELECT = 2, + } + + public enum HCBindType + { + NO_FORCE = 0, + FORCE = 1, + } + + public enum HCDeleteStatus + { + DELETE_ACCOUNT_SUCC = 0, + DELETE_ACCOUNT_CANCEL = 1, + DELETE_ACCOUNT_FAILED = -1 + } + + public enum HCLoginStatus + { + // 登录成功 + LOGIN_STATUS_SUCC = 0, + + // 登录被用户取消 + LOGIN_STATUS_CANCEL = 1, + + // 自动登陆没有缓存数据 + LOGIN_STATUS_NO_CACHE = 2, + + // 登录失败 + LOGIN_STATUS_FAILED = -1 + } +} diff --git a/Assets/HCMiniSdk/Scripts/Account/HCAccountDefine.cs.meta b/Assets/HCMiniSdk/Scripts/Account/HCAccountDefine.cs.meta new file mode 100644 index 00000000..1c885770 --- /dev/null +++ b/Assets/HCMiniSdk/Scripts/Account/HCAccountDefine.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: 0c0780db0345f497fa8f4d1ceb1ec02b +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/HCMiniSdk/Scripts/Account/HCAccountManager.cs b/Assets/HCMiniSdk/Scripts/Account/HCAccountManager.cs new file mode 100644 index 00000000..eb544863 --- /dev/null +++ b/Assets/HCMiniSdk/Scripts/Account/HCAccountManager.cs @@ -0,0 +1,565 @@ +using System; +using System.Collections; +using System.Collections.Generic; +using System.Linq; +using UnityEngine; + +namespace HC +{ + public class HCAccountManager : HCSingleton + { + private string staticOnlineKey_loginChannels = "loginChannels"; + + public string staticSaveKey_DeviceID = "DeviceID"; + private string staticSaveKey_LastLoginType = "LastLoginType"; + public const string staticSaveKey_UserID = "UserID"; + public const string staticSaveKey_UserType = "UserType"; + private string staticSaveKey_Token = "Token"; + + // 当前登录信息 + private UserInfo CurrUserInfo; + + private Action mLoginResultCallback = null; + + // Start is called before the first frame update + void Start() + { + } + + /// + /// Login + /// + /// loginType + /// loginCallback + public void Login(HCLoginType _loginType, Action _loginResultCallback = null) + { + mLoginResultCallback = _loginResultCallback; + HCTools.SavePlayerPrefsInt(staticSaveKey_LastLoginType, (int)_loginType); + + if (_loginType == HCLoginType.LOGIN_BY_GUESTER) + { + // 取deviceID给服务器发登录请求 + string deviceID = HCTools.GetPlayerPrefsString(staticSaveKey_DeviceID); + if (string.IsNullOrEmpty(deviceID)) + { + deviceID = HCNativeInterface.Instance.GetDeviceID(); + if (string.IsNullOrEmpty(deviceID)) + { + deviceID = System.Guid.NewGuid().ToString(); + } + HCTools.SavePlayerPrefsString(staticSaveKey_DeviceID, deviceID); + GuestLogin(deviceID); + } + else + { + GuestLogin(deviceID); + } + } + else + { + // 调用三方登录 + HCNativeInterface.Instance.Login(_loginType, ThirdLoginCallback); + } + + // 事件埋点 + if (HCTools.IfFirstCheckPlayerPrefs(string.Format("{0}_IfFirst", HCInnerStaticSting.HC_Login_CreateTKUserid))) + { + HCAnalyticsManager.Instance.TrackEvent(HCInnerStaticSting.HC_Login_CreateTKUserid, HCInnerStaticSting.HC_Account, GetLoginTypeString(_loginType)); + } + + HCAnalyticsManager.Instance.TrackEvent(HCInnerStaticSting.HC_Login_Enter, HCInnerStaticSting.HC_Account, GetLoginTypeString(_loginType)); + } + + /// + /// 游客登录方法 + /// + /// + private void GuestLogin(string _deviceID) + { + _deviceID = _deviceID.Replace("-", ""); + UserInfo userInfo = new UserInfo(); + userInfo.userID = _deviceID; + userInfo.loginType = HCLoginType.LOGIN_BY_GUESTER; + LoginByServer(userInfo, ServerLoginCallback); + } + + /// + /// 三方登录回调,请求服务器登录 + /// + /// + private void ThirdLoginCallback(LoginInfo _loginInfo) + { + + // 事件埋点 + if (_loginInfo.loginStatus == HCLoginStatus.LOGIN_STATUS_SUCC) + { + HCAnalyticsManager.Instance.TrackEvent(HCInnerStaticSting.HC_Login_Success, HCInnerStaticSting.HC_Account, GetLoginTypeString(_loginInfo.userInfo.loginType)); + } + else + { + HCAnalyticsManager.Instance.TrackEvent(HCInnerStaticSting.HC_Login_Fail, HCInnerStaticSting.HC_Account, GetLoginTypeString(_loginInfo.userInfo.loginType)); + } + + if (_loginInfo.loginStatus == HCLoginStatus.LOGIN_STATUS_SUCC) + { + LoginByServer(_loginInfo.userInfo, ServerLoginCallback); + } + else + { + mLoginResultCallback?.Invoke(_loginInfo); + } + + } + + /// + /// 服务器登录返回,callback回游戏 + /// + /// + /// + /// + private void ServerLoginCallback(int status, string msg, ServerBackLoginInfo callbackInfo) + { + var loginStatus = status == 0 ? HCLoginStatus.LOGIN_STATUS_SUCC : HCLoginStatus.LOGIN_STATUS_FAILED; + var loginTypeEnum = (HCLoginType)Enum.ToObject(typeof(HCLoginType), callbackInfo.user_type); + HCTools.SavePlayerPrefsString(staticSaveKey_UserID, callbackInfo.user_id); + HCTools.SavePlayerPrefsString(staticSaveKey_Token, callbackInfo.token); + HCTools.SavePlayerPrefsInt(staticSaveKey_UserType, callbackInfo.user_type); + + LoginInfo loginInfo = new LoginInfo(); + loginInfo.loginStatus = loginStatus; + loginInfo.userInfo = new UserInfo(); + loginInfo.userInfo.loginType = loginTypeEnum; + loginInfo.loginMsg = msg; + loginInfo.userInfo.userID = callbackInfo.user_id; + loginInfo.userInfo.token = callbackInfo.token; + loginInfo.userInfo.email = ""; + loginInfo.userInfo.nickName = ""; + loginInfo.userInfo.photoUrl = ""; + + if (loginStatus == HCLoginStatus.LOGIN_STATUS_SUCC) + { + CurrUserInfo = loginInfo.userInfo; + HCAnalyticsManager.Instance.SetUserId(loginInfo.userInfo.userID); + } + + mLoginResultCallback?.Invoke(loginInfo); + + // 事件埋点 + if (HCTools.IfFirstCheckPlayerPrefs(string.Format("{0}_IfFirst_Result", HCInnerStaticSting.HC_Login_CreateTKUserid))) + { + if (loginStatus == HCLoginStatus.LOGIN_STATUS_SUCC) + { + HCAnalyticsManager.Instance.TrackEvent(HCInnerStaticSting.HC_Login_CreateTKUserid_Success, HCInnerStaticSting.HC_Account, GetLoginTypeString(loginInfo.userInfo.loginType)); + } + else + { + HCAnalyticsManager.Instance.TrackEvent(HCInnerStaticSting.HC_Login_CreateTKUserid_Fail, HCInnerStaticSting.HC_Account, GetLoginTypeString(loginInfo.userInfo.loginType), "fail_reason", msg); + } + } + + // 事件埋点 + if (loginStatus == HCLoginStatus.LOGIN_STATUS_SUCC) + { + HCAnalyticsManager.Instance.TrackEvent(HCInnerStaticSting.HC_Login_Enter_Success, HCInnerStaticSting.HC_Account, GetLoginTypeString(loginInfo.userInfo.loginType)); + } + else + { + HCAnalyticsManager.Instance.TrackEvent(HCInnerStaticSting.HC_Login_Enter_Fail, HCInnerStaticSting.HC_Account, GetLoginTypeString(loginInfo.userInfo.loginType), "fail_reason", msg); + } + } + + /// + /// 自动登录 + /// + /// + public void AutoLogin(Action _loginResultCallback = null) + { + if (!IsCanAutoLogin()) + { + Login(HCLoginType.LOGIN_BY_GUESTER, _loginResultCallback); + } + else + { + var lastLoginType = HCTools.GetPlayerPrefsInt(staticSaveKey_LastLoginType); + Login((HCLoginType)Enum.ToObject(typeof(HCLoginType), lastLoginType), _loginResultCallback); + } + } + + /// + /// 获取当前用户类型 + /// + /// + public HCLoginType GetAccountType() + { + int userType = HCTools.GetPlayerPrefsInt(staticSaveKey_UserType); + return (HCLoginType)Enum.ToObject(typeof(HCLoginType), userType); + } + + /// + /// 是否可自动登录 + /// + /// + public bool IsCanAutoLogin() + { + return HCTools.HasKey(staticSaveKey_LastLoginType); + } + + /// + /// 登出 + /// + /// + public void Logout(Action _logoutCallback = null) + { + HCTools.DeleteKey(staticSaveKey_LastLoginType); + HCTools.DeleteKey(staticSaveKey_UserID); + HCTools.DeleteKey(staticSaveKey_UserType); + HCTools.DeleteKey(staticSaveKey_Token); + if(null != CurrUserInfo) + { + CurrUserInfo.ClearData(); + } + + _logoutCallback?.Invoke(); + + HCNativeInterface.Instance.Logout(); + + HCAnalyticsManager.Instance.TrackEvent(HCInnerStaticSting.HC_Logout_Success, HCInnerStaticSting.HC_Account, GetLoginTypeString(CurrUserInfo.loginType)); + } + + /// + /// 获取支持登录类型列表 + /// 在线参数配置:0,1,2 + /// + /// + public List AvailableLoginChannelList() + { + string loginChannels = HCSDKManager.Instance.GetRemoteConfigStr(staticOnlineKey_loginChannels, "0,2"); + if (string.IsNullOrEmpty(loginChannels)) + { + loginChannels = "0,2"; + } + return loginChannels.Split(',') + .Select(channel => (HCLoginType)Enum.ToObject(typeof(HCLoginType), int.Parse(channel))).ToList(); + } + + /// + /// 删除账号 + /// + /// + public void DeleteAccount(Action deleteAccountCallback = null) + { + DeleteAccountByServer(HCTools.GetPlayerPrefsString(staticSaveKey_UserID), (code, msg) => + { + // 退出账号 + if(code == 0) + { + Logout(); + } + + deleteAccountCallback?.Invoke( + code == 0 ? HCDeleteStatus.DELETE_ACCOUNT_SUCC : HCDeleteStatus.DELETE_ACCOUNT_FAILED, msg); + + // 事件埋点 + if (code == 0) + { + HCAnalyticsManager.Instance.TrackEvent(HCInnerStaticSting.HC_Delete_Account_Success, HCInnerStaticSting.HC_Account, HCInnerStaticSting.HC_Delete_Account_Success); + } + else + { + HCAnalyticsManager.Instance.TrackEvent(HCInnerStaticSting.HC_Delete_Account_Success, HCInnerStaticSting.HC_Account, HCInnerStaticSting.HC_Delete_Account_Fail); + } + }); + } + + // 保存当前绑定类型 + private HCBindType currBindType = HCBindType.NO_FORCE; + + // 保存当前要绑定的userID + private string currUserID = ""; + + // 保存绑定回调 + private Action currBindAccountCallback = null; + + /// + /// 绑定账号 + /// + /// + /// + /// + /// + public void BindAccount(HCLoginType type, HCBindType isForce, string userId, Action bindAccountCallback) + { + currBindType = isForce; + currUserID = userId; + currBindAccountCallback = bindAccountCallback; + // 调用三方登录 + HCNativeInterface.Instance.Login(type, ThirdLoginCallbackForBind); + + // 事件埋点 + HCAnalyticsManager.Instance.TrackEvent(HCInnerStaticSting.HC_Click_Bind, HCInnerStaticSting.HC_Account, GetLoginTypeString(type)); + } + + /// + /// 绑定时三方登录回调,请求服务器绑定 + /// + /// + private void ThirdLoginCallbackForBind(LoginInfo _thirdLoginInfo) + { + if (_thirdLoginInfo.loginStatus != HCLoginStatus.LOGIN_STATUS_SUCC) + { + var bindInfo = new BindInfo + { + userInfo = _thirdLoginInfo.userInfo, + bindStatus = HCBindAccountStatus.BIND_CODE_FAILED, + bindMsg = _thirdLoginInfo.loginMsg + }; + + HCAnalyticsManager.Instance.TrackEvent(HCInnerStaticSting.HC_Click_Bind_Fail, HCInnerStaticSting.HC_Account, GetLoginTypeString(_thirdLoginInfo.userInfo.loginType), "fail_reason", $"bind error from login :{_thirdLoginInfo.loginMsg}"); + HCAnalyticsManager.Instance.TrackEvent(HCInnerStaticSting.HC_Click_Bind_Login_Fail, HCInnerStaticSting.HC_Account, GetLoginTypeString(_thirdLoginInfo.userInfo.loginType), "fail_reason", $"bind error from login :{_thirdLoginInfo.loginMsg}"); + + currBindAccountCallback?.Invoke(bindInfo); + return; + } + + if (currBindType == HCBindType.NO_FORCE) + { + currUserID = HCTools.GetPlayerPrefsString(staticSaveKey_UserID); + } + + if (_thirdLoginInfo.loginStatus == HCLoginStatus.LOGIN_STATUS_SUCC) + { + CallBind2Server(_thirdLoginInfo.userInfo, currBindType, _thirdLoginInfo.userInfo.userID, currUserID, currBindAccountCallback); + } + } + + /// + /// 调用服务器方法操作绑定 + /// + /// + /// + /// + /// + /// + private void CallBind2Server(UserInfo userInfo, HCBindType isForce, string thirdUserId, string userId, Action bindAccountCallback) + { + BindByServer(userInfo, isForce, thirdUserId, userId, (status, msg, data) => + { + if (status != 0) + { + BindInfo bindInfo = new BindInfo(); + bindInfo.bindStatus = HCBindAccountStatus.BIND_CODE_FAILED; + bindInfo.userInfo = new UserInfo(); + bindInfo.userInfo.loginType = userInfo.loginType; + bindInfo.bindMsg = msg; + bindInfo.userInfo.userID = data.user_id; + bindInfo.userInfo.token = data.token; + bindInfo.userInfo.email = userInfo.email; + bindInfo.userInfo.nickName = userInfo.nickName; + bindInfo.userInfo.photoUrl = userInfo.photoUrl; + bindInfo.userIDs = data.user_ids; + + bindAccountCallback.Invoke(bindInfo); + + // 事件埋点 + HCAnalyticsManager.Instance.TrackEvent(HCInnerStaticSting.HC_Click_Bind_Fail, HCInnerStaticSting.HC_Account, GetLoginTypeString(userInfo.loginType), "fail_reason", msg); + HCAnalyticsManager.Instance.TrackEvent(HCInnerStaticSting.HC_Click_Bind_Login_Fail, HCInnerStaticSting.HC_Account, GetLoginTypeString(userInfo.loginType), "fail_reason", $"bind error from login :{msg}"); + + return; + } + + if (data.user_ids != null && data.user_ids.Length == 2) + { + // (status, loginTYpe, msg, userId, token, email, displayName, photoUrl, userIdList) + BindInfo bindInfo = new BindInfo(); + bindInfo.bindStatus = HCBindAccountStatus.BIND_CODE_SELECT; + bindInfo.userInfo = new UserInfo(); + bindInfo.userInfo.loginType = userInfo.loginType; + bindInfo.bindMsg = msg; + bindInfo.userInfo.userID = data.user_id; + bindInfo.userInfo.token = data.token; + bindInfo.userInfo.email = userInfo.email; + bindInfo.userInfo.nickName = userInfo.nickName; + bindInfo.userInfo.photoUrl = userInfo.photoUrl; + bindInfo.userIDs = data.user_ids; + + bindAccountCallback.Invoke(bindInfo); + + // 事件埋点 + HCAnalyticsManager.Instance.TrackEvent(HCInnerStaticSting.HC_Click_Bind_Conflict, HCInnerStaticSting.HC_Account, GetLoginTypeString(userInfo.loginType)); + } + else // 绑定成功 + { + HCTools.SavePlayerPrefsString(staticSaveKey_UserID, data.user_id); + HCTools.SavePlayerPrefsString(staticSaveKey_Token, data.token); + HCTools.SavePlayerPrefsInt(staticSaveKey_UserType, (int)userInfo.loginType); + + BindInfo bindInfo = new BindInfo(); + bindInfo.bindStatus = HCBindAccountStatus.BIND_CODE_SUCC; + bindInfo.userInfo = new UserInfo(); + bindInfo.userInfo.loginType = userInfo.loginType; + bindInfo.bindMsg = msg; + bindInfo.userInfo.userID = data.user_id; + bindInfo.userInfo.token = data.token; + bindInfo.userInfo.email = userInfo.email; + bindInfo.userInfo.nickName = userInfo.nickName; + bindInfo.userInfo.photoUrl = userInfo.photoUrl; + bindInfo.userIDs = data.user_ids; + + + CurrUserInfo = bindInfo.userInfo; // 保存当前登录信息 + + bindAccountCallback.Invoke(bindInfo); + + // 事件埋点 + HCAnalyticsManager.Instance.TrackEvent(HCInnerStaticSting.HC_Click_Bind_Success, HCInnerStaticSting.HC_Account, GetLoginTypeString(userInfo.loginType)); + HCAnalyticsManager.Instance.TrackEvent(HCInnerStaticSting.HC_Click_Bind_Login_Success, HCInnerStaticSting.HC_Account, GetLoginTypeString(userInfo.loginType)); + + } + }); + } + + #region server + + private void LoginByServer(UserInfo userInfo, Action callback) + { + Debug.Log("userInfo : " + userInfo); + // userInfo.ext?.TryGetValue("anonymousCode", out var anonymousCode); + var body = new Dictionary() + { + ["user_type"] = (int)userInfo.loginType, + ["third_uid"] = userInfo.userID, + ["user_id"] = HCTools.GetPlayerPrefsString(staticSaveKey_UserID), + + ["third_token"] = userInfo.token, + ["email"] = userInfo.email, + ["photoUrl"] = userInfo.photoUrl, + ["displayName"] = userInfo.nickName, + }; + HCDebugger.LogDebug("zj third_token : " + userInfo.token + " , userID : " + userInfo.userID + ", third_id : " + HCTools.GetPlayerPrefsString(staticSaveKey_UserID)); + HCServer.Instance.Post(HCServer.URL_LOGIN, body, callback); + } + + public void BindByServer(UserInfo userInfo, HCBindType bindType, string thirdUid, string userId, + Action callback) + { + var args = new Dictionary + { + { "user_type", (int)userInfo.loginType }, + { "third_uid", thirdUid }, + { "user_id", userId }, + { "is_force", (int)bindType }, + { "third_token", userInfo.token }, + { "email", userInfo.email }, + { "photoUrl", userInfo.photoUrl }, + { "displayName", userInfo.nickName }, + }; + HCServer.Instance.Post(HCServer.URL_BIND, args, callback); + } + + public void DeleteAccountByServer(string userId, Action callback) + { + if (string.IsNullOrEmpty(userId)) + { + callback?.Invoke((int)HCDeleteStatus.DELETE_ACCOUNT_FAILED, "empty userID by client."); + return; + } + var args = new Dictionary { { "user_id", userId } }; + + HCServer.Instance.Post(HCServer.URL_DELETE, args, + (code, msg, obj) => { callback.Invoke(code, code == 0 ? userId : msg); }); + } + + /// + /// 根据登录类别,获取对应登录事件名称 + /// + /// + /// + public string GetLoginTypeString(HCLoginType _loginType) + { + switch (_loginType) + { + case HCLoginType.LOGIN_BY_GUESTER: + return "Guest"; //Google/Facebook/Geust + case HCLoginType.LOGIN_BY_GOOGLE: + return "Google"; + case HCLoginType.LOGIN_BY_FACEBOOK: + return "Facebook"; + case HCLoginType.LOGIN_BY_Apple: + return "Apple"; + case HCLoginType.LOGIN_BY_EMAIL: + return "Email"; + case HCLoginType.LOGIN_BY_WECHAT_MINI_GAME: + return "wechat_mini_game"; + default: + return "Unknow"; + } + } + + /// + /// 获取当前UserInfo + /// + /// + public UserInfo GetCurrUserInfo() + { + return CurrUserInfo; + } + + #endregion + } + + // 登录状态码,登录类型,登录状态信息,userid,token,邮箱 , 显示名称 , 头像url + [System.Serializable] + public struct LoginInfo + { + public HCLoginStatus loginStatus; + public string loginMsg; + public UserInfo userInfo; + } + + // HCBindAccountStatus, HCLoginType, string, string, string, string, string, string, string[] + [System.Serializable] + public struct BindInfo + { + public HCBindAccountStatus bindStatus; + public string bindMsg; + public UserInfo userInfo; + public string[] userIDs; + } + + [System.Serializable] + public class UserInfo + { + public HCLoginType loginType; + public string userID = ""; + public string token = ""; + public string email = ""; + public string nickName = ""; + public string photoUrl = ""; + + public void ClearData() + { + userID = ""; + token = ""; + email = ""; + nickName = ""; + photoUrl = ""; + } + } + + [System.Serializable] + public struct ServerBackLoginInfo + { + public string user_id; + public string token; + public int user_type; + public int first_login; + } + + [System.Serializable] + public struct ServerBackBindInfo + { + public string user_id; + public string token; + public string[] user_ids; + } +} \ No newline at end of file diff --git a/Assets/HCMiniSdk/Scripts/Account/HCAccountManager.cs.meta b/Assets/HCMiniSdk/Scripts/Account/HCAccountManager.cs.meta new file mode 100644 index 00000000..e1ffc8de --- /dev/null +++ b/Assets/HCMiniSdk/Scripts/Account/HCAccountManager.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: ef9e6de1e105a4090a201136f9ad9bd0 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/HCMiniSdk/Scripts/Ads.meta b/Assets/HCMiniSdk/Scripts/Ads.meta new file mode 100644 index 00000000..0b641d65 --- /dev/null +++ b/Assets/HCMiniSdk/Scripts/Ads.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: be74286d4b0e14f7c96f7068e5c3d877 +folderAsset: yes +DefaultImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/HCMiniSdk/Scripts/Ads/HCAdsManager.cs b/Assets/HCMiniSdk/Scripts/Ads/HCAdsManager.cs new file mode 100644 index 00000000..e583bf1a --- /dev/null +++ b/Assets/HCMiniSdk/Scripts/Ads/HCAdsManager.cs @@ -0,0 +1,904 @@ +using System; +using System.Collections; +using System.Collections.Generic; +using System.Globalization; +using System.Linq; +using HC.Plugins; +using Newtonsoft.Json.Linq; +using UnityEngine; + +namespace HC +{ + public class HCAdsManager : HCSingleton + { + public enum HCArraignmentModeType + { + // 正式模式 + Online, + + // 提审模式 + Review + } + + private bool m_isInitialized = false; + + int m_rewardRetryAttempt; + int m_interRetryAttempt; + int m_bannerRetryAttempt; + + bool m_rewardIdLoad = false; + + + private float m_oldTimeScale = 1f; + private float m_oldVolume = 1f; + + private float m_rvStartLoadTime = 0; + private float m_ivStartLoadTime = 0; + + private Dictionary ivsCount = new Dictionary(); + + private Action m_rewardCallback; + private Action m_showFailCallback; + //private bool m_reward = false; + + private Action m_interCloseCallback; + + private HCIBaseAds plugin; + + private Dictionary adTypeTimeInterVal = new(); + + private HCIVADType currentShowIVADType = HCIVADType.NULL; + + private HCIVPositionName mIVPos; + private HCRVPositionName mRVPos; + + private float GetCurrentTimeInterVal(HCIVADType type) + { + if (adTypeTimeInterVal.TryGetValue(type, out var val)) + { + return val; + } + + return 0; + } + + private void SaveCurrentTimeInterVal(HCIVADType type) + { + adTypeTimeInterVal[type] = Time.time; + } + + public void InitializeSdk() + { + if (m_isInitialized) return; + + plugin = new HCWebGLAdPlugin(); +// #else +// plugin = new HCMaxSdkAdPlugin(); +// #endif + plugin.InitializeSdk(result => { StartCoroutine(LoadAds()); }); + + // rv + plugin.HCOnRewardedRevenue += OnRewardedRevenue; + plugin.HCOnRewardedAdLoadedEvent += OnRewardedAdLoadedEvent; + plugin.HCOnRewardedAdLoadFailedEvent += OnRewardedAdLoadFailedEvent; + plugin.HCOnRewardedAdDisplayedEvent += OnRewardedAdDisplayedEvent; + plugin.HCOnRewardedAdClickedEvent += OnRewardedAdClickedEvent; + plugin.HCOnRewardedAdFailedToDisplayEvent += OnRewardedAdFailedToDisplayEvent; + plugin.HCOnRewardedAdReceivedRewardEvent += OnRewardedAdReceivedRewardEvent; + plugin.HCOnRewardedAdHiddenEvent += OnRewardedAdHiddenEvent; + + + // iv + plugin.HCOnInterstitialLoadFailedEvent += OnInterstitialLoadFailedEvent; + plugin.HCOnInterstitialAdFailedToDisplayEvent += OnInterstitialAdFailedToDisplayEvent; + plugin.HCOnInterstitialHiddenEvent += OnInterstitialHiddenEvent; + plugin.HCOnInterstitialClickedEvent += OnInterstitialClickedEvent; + plugin.HCOnInterstitialDisplayedEvent += OnInterstitialDisplayedEvent; + plugin.HCOnInterstitialLoadedEvent += OnInterstitialLoadedEvent; + plugin.HCOnInterstitialRevenue += OnInterstitialRevenue; + + + // banner + plugin.HCOnBannerAdLoadedEvent += OnBannerAdLoadedEvent; + plugin.HCOnBannerAdLoadFailedEvent += OnBannerAdLoadFailedEvent; + plugin.HCOnBannerAdClickedEvent += OnBannerAdClickedEvent; + plugin.HCOnBannerAdRevenuePaidEvent += OnBannerAdRevenuePaidEvent; + plugin.HCOnBannerAdExpandedEvent += OnBannerAdExpandedEvent; + plugin.HCOnBannerAdCollapsedEvent += OnBannerAdCollapsedEvent; + m_isInitialized = true; + } + + + private IEnumerator LoadAds() + { + LoadRewardedAd(); + LoadInterstitial(); + yield return new WaitForSeconds(0.25f); + LoadBanner(); + yield return new WaitForSeconds(0.5f); + LoadNative(); + } + + #region reward + + private void LoadRewardedAd() + { + if (m_rewardIdLoad) + { + return; + } + + m_rewardIdLoad = true; + + + if (IsAdUnitEmpty(IsReviewModel() ? HCStaticParams.ReviewRewardUnitId : HCStaticParams.RewardAdUnitID, ADType.Reward)) return; + plugin.LoadRewardedAd(IsReviewModel() ? HCStaticParams.ReviewRewardUnitId : HCStaticParams.RewardAdUnitID); + m_rvStartLoadTime = Time.time; + HCAnalyticsManager.Instance.TrackEvent(HCInnerStaticSting.HC_RV_Start_Load); + } + + public bool IsRewardedAdReady() + { + if (IsAdUnitEmpty(IsReviewModel() ? HCStaticParams.ReviewRewardUnitId : HCStaticParams.RewardAdUnitID, ADType.Reward)) return false; + return plugin.IsRewardedAdReady(IsReviewModel() ? HCStaticParams.ReviewRewardUnitId : HCStaticParams.RewardAdUnitID); + } + + public void ShowRewardedAd(HCRVPositionName _adPos, Action _rewardCallback = null, Action _showFCallback = null, bool _useSDKToast = true) + { + mRVPos = _adPos; + HCAnalyticsManager.Instance.LogRewardBtnClick(_adPos.ToString()); + + if (IsAdUnitEmpty(IsReviewModel() ? HCStaticParams.ReviewRewardUnitId : HCStaticParams.RewardAdUnitID, ADType.Reward)) return; + m_rewardCallback = _rewardCallback; + m_showFailCallback = _showFCallback; + + if (IsRewardedAdReady()) + { + HCAnalyticsManager.Instance.TrackEvent(HCInnerStaticSting.HC_RV_AchieveShow_Match, new Dictionary { { HCInnerStaticSting.HC_Position, _adPos.ToString() } }); + // PauseGame(); + plugin.ShowRewardedAd(IsReviewModel() ? HCStaticParams.ReviewRewardUnitId : HCStaticParams.RewardAdUnitID); + } + else + { + if (_useSDKToast) + { + HCNativeInterface.Instance.ShowToast(HCTools.IsChinese() ? "广告还未准备好" : "This ad is not ready yet."); + } + + m_showFailCallback?.Invoke(); + m_showFailCallback = null; + LoadRewardedAd(); + + HCAnalyticsManager.Instance.TrackEvent(HCInnerStaticSting.HC_RV_ShowFail_Not_Ready,new Dictionary { { HCInnerStaticSting.HC_Position, _adPos.ToString() } }); + } + } + + private void OnRewardedRevenue(string adunit, Dictionary dictionary) + { + HCAnalyticsManager.Instance.TrackRevenueEvent(dictionary); + } + + private void OnRewardedAdLoadedEvent(string adunit, Dictionary dictionary) + { + m_rewardIdLoad = false; + m_rewardRetryAttempt = 0; + float loadTime = Time.time - m_rvStartLoadTime; + HCAnalyticsManager.Instance.TrackEvent(HCInnerStaticSting.HC_RV_Loaded, + new Dictionary + { + { HCInnerStaticSting.HC_Time, loadTime.ToString() }, + { "ad_platform", dictionary.GetValue("networkName", "") }, + { "ad_id", dictionary.GetValue("networkPlacement", "") }, + { "ad_ecpm", dictionary.GetValue("revenue", "0") } + }); + } + + private void OnRewardedAdLoadFailedEvent(string adunit, Dictionary dictionary) + { + m_rewardIdLoad = false; + + float loadTime = Time.time - m_rvStartLoadTime; + dictionary ??= new Dictionary(); + dictionary[HCInnerStaticSting.HC_Time] = loadTime.ToString(); + + if (dictionary.ContainsKey("type")) + { + dictionary["return_type"] = dictionary["type"]; + dictionary.Remove("type"); + } + HCAnalyticsManager.Instance.TrackEvent(HCInnerStaticSting.HC_RV_Fail_Loaded, dictionary); + m_rewardRetryAttempt++; + double retryDelay = Math.Pow(2, Math.Min(6, m_rewardRetryAttempt)); + Invoke("LoadRewardedAd", (float)retryDelay); + } + + private void OnRewardedAdDisplayedEvent(string adUnitId, Dictionary dictionary) + { + PauseGame(); + int playCount = HCTools.GetPlayerPrefsInt("REWARD_PLAY_COUNT", 0) + 1; + HCTools.SavePlayerPrefsInt("REWARD_PLAY_COUNT", playCount); + HCAnalyticsManager.Instance.SetUserProperties(new Dictionary() { { "total_rv_ad_times", playCount } }); + HCAnalyticsManager.Instance.TrackEvent(HCInnerStaticSting.HC_RV_Show, new Dictionary() { { HCInnerStaticSting.HC_Position, mRVPos.ToString() } }); + } + + private void OnRewardedAdClickedEvent(string adUnitId, Dictionary dictionary) + { + } + + private void OnRewardedAdFailedToDisplayEvent(string adUnitId, Dictionary errorInfoDictionary, Dictionary dictionary) + { + ResumeGame(); + + m_showFailCallback?.Invoke(); + m_showFailCallback = null; + + LoadRewardedAd(); + + if (errorInfoDictionary.ContainsKey("type")) + { + errorInfoDictionary["return_type"] = errorInfoDictionary["type"]; + errorInfoDictionary.Remove("type"); + } + HCAnalyticsManager.Instance.TrackEvent(HCInnerStaticSting.HC_RV_ShowFail, errorInfoDictionary); + } + + private void OnRewardedAdReceivedRewardEvent(string adUnitId, Dictionary rewardDictionary, Dictionary dictionary) + { + } + + private void OnRewardedAdHiddenEvent(string adUnitId, Dictionary dictionary) + { + ResumeGame(); + var result = (bool)dictionary.GetValue("isEnded", false); + m_rewardCallback?.Invoke(result); + + m_rewardCallback = null; + if (dictionary.ContainsKey("type")) + { + dictionary["return_type"] = dictionary["type"]; + dictionary.Remove("type"); + } + dictionary.AddIfNotExists(HCInnerStaticSting.HC_Position, mRVPos.ToString()); + HCAnalyticsManager.Instance.TrackEvent("RV_Close", dictionary); + if (IsDouyinWebGL()) + { + int playCount = HCTools.GetPlayerPrefsInt("REWARD_PLAY_COUNT", 0) + 1; + HCTools.SavePlayerPrefsInt("REWARD_PLAY_COUNT", playCount); + HCAnalyticsManager.Instance.SetUserProperties(new Dictionary() { { "total_rv_ad_times", playCount } }); + HCAnalyticsManager.Instance.TrackEvent(HCInnerStaticSting.HC_RV_Show, dictionary); + } + + LoadRewardedAd(); + } + + private bool IsDouyinWebGL() + { +#if UNITY_WEBGL && WEBGL_BYTEDANCE + return HCWebGLSDKManager.AppInfo.GetPlatform().ToLower().Contains("ios"); +#else + return false; +#endif + } + + #endregion + + #region inter + + private bool _ivIsLoading; + + private void LoadInterstitial() + { + if (IsReviewModel() || IsAdUnitEmpty(HCStaticParams.InterAdUnitID, ADType.Intersitital) || HCTools.IsRemoveAds()) return; + if (IsInterstitialReady()) + { + HCDebugger.LogDebug("IV已经准备就绪"); + return; + } + if (_ivIsLoading) + { + HCAnalyticsManager.Instance.TrackEvent("IV_Loading"); + return; + } + + // 2 s没回来,就算load失败,放开load锁 + Invoke("WatchIvLoadCallback", 2); + + _ivIsLoading = true; + + plugin.LoadInterstitial(HCStaticParams.InterAdUnitID); + + m_ivStartLoadTime = Time.time; + HCAnalyticsManager.Instance.TrackEvent(HCInnerStaticSting.HC_IV_Start_Load); + } + + private void WatchIvLoadCallback() + { + _ivIsLoading = false; + HCDebugger.LogDebug("没有收到回调Iv load 回调"); + HCAnalyticsManager.Instance.TrackEvent("WatchIvLoadCallback"); + } + + public bool IsInterstitialReady() + { + if (IsReviewModel() || IsAdUnitEmpty(HCStaticParams.InterAdUnitID, ADType.Intersitital) || HCTools.IsRemoveAds()) return false; + return plugin.IsInterstitialReady(HCStaticParams.InterAdUnitID); + } + + public void ShowInterstitial(HCIVPositionName _adPos, HCIVADType _IvType = HCIVADType.IV1, Action _closeCallback = null) + { + HCAnalyticsManager.Instance.TrackEvent(HCInnerStaticSting.HC_IV_Position, new Dictionary { { HCInnerStaticSting.HC_Position, _adPos.ToString() }, { HCInnerStaticSting.HC_IV_Type, _IvType.ToString() } }); + if (m_interCloseCallback != null) + { + HCDebugger.LogDebug($"[ShowInterstitial] 正在显示插屏广告,显示失败 callback = {_closeCallback}"); + _closeCallback?.Invoke(); + HCAnalyticsManager.Instance.TrackEvent(HCInnerStaticSting.HC_IV_ShowFail_Rule_Limit, + new Dictionary { + { HCInnerStaticSting.HC_Position, _adPos.ToString() }, + { HCInnerStaticSting.HC_IV_Type, _IvType.ToString() }, + { "IV_STATUS", "playing" }, + { "IV_CURRENT_AD_TYPE", currentShowIVADType.ToString() }, + }); + return; + } + + mIVPos = _adPos; + + var isRemoveAds = HCTools.IsRemoveAds(); + var isReviewModel = IsReviewModel(); + var isAdUnitEmpty = IsAdUnitEmpty(HCStaticParams.InterAdUnitID, ADType.Intersitital); + var canShowInterval = CanShowInter(_IvType); + if (isRemoveAds || isReviewModel || isAdUnitEmpty || canShowInterval != null) + { + HCAnalyticsManager.Instance.TrackEvent(HCInnerStaticSting.HC_IV_ShowFail_Rule_Limit, + new Dictionary { + { HCInnerStaticSting.HC_Position, _adPos.ToString() }, + { HCInnerStaticSting.HC_IV_Type, _IvType.ToString() }, + { "IV_STATUS", "rule" }, + { "HC_isRemoveAds", isRemoveAds }, + { "HC_isReviewModel", isReviewModel }, + { "HC_isAdUnitEmpty", isAdUnitEmpty }, + { "HC_canShowInter", canShowInterval }, + }); + + HCDebugger.LogDebug($"[ShowInterstitial] 间隔中,显示失败 callback = {_closeCallback}"); + _closeCallback?.Invoke(); + return; + } + + + HCAnalyticsManager.Instance.TrackEvent(HCInnerStaticSting.HC_IV_AchieveShow_Match, HCInnerStaticSting.HC_Position, _adPos.ToString(), HCInnerStaticSting.HC_IV_Type, _IvType.ToString()); + + + if (IsInterstitialReady()) + { + currentShowIVADType = _IvType; + HCDebugger.LogDebug($"[ShowInterstitial] 开始显示插屏 _closeCallback = {_closeCallback}"); + m_interCloseCallback = _closeCallback ?? (() => { HCDebugger.LogDebug($"[ShowInterstitial] close _closeCallback = close iv"); }); + + Invoke("CheckCloseCallback", 3); + + HCAnalyticsManager.Instance.TrackEvent(HCInnerStaticSting.HC_IV_AchieveShow, new Dictionary { { HCInnerStaticSting.HC_Position, _adPos.ToString() }, { HCInnerStaticSting.HC_IV_Type, _IvType.ToString() } }); + // PauseGame(); + plugin.ShowInterstitial(HCStaticParams.InterAdUnitID); + } + else + { + currentShowIVADType = HCIVADType.NULL; + _closeCallback?.Invoke(); + HCDebugger.LogDebug($"[ShowInterstitial] 没有缓存,执行close callback _closeCallback = {_closeCallback}"); + HCAnalyticsManager.Instance.TrackEvent(HCInnerStaticSting.HC_IV_ShowFail_Not_Ready, + new Dictionary { { HCInnerStaticSting.HC_Position, _adPos.ToString() }, { HCInnerStaticSting.HC_IV_Type, _IvType.ToString() } }); + LoadInterstitial(); + } + } + + private void CheckCloseCallback() + { + // CancelInvoke("CheckCloseCallback"); + HCDebugger.LogError($"[CheckCloseCallback] 3s没收到iv show 的回调,直接回调close m_interCloseCallback = {m_interCloseCallback}"); + m_interCloseCallback?.Invoke(); + m_interCloseCallback = null; + } + + //Conditional Control + private string CanShowInter(HCIVADType _type) + { + // 【1】前N次不展示插屏 + var checkIfReachFirstNTimes = CheckIfReachFirstNTimes(_type); + if (checkIfReachFirstNTimes != null) + { + return checkIfReachFirstNTimes; + } + + // 到达N次后,第N+1次直接展示插屏 + if (IfFirstCheckPlayerPrefs(_type)) + { + // 直接展示 + return null; + } + + // 非第N+1次,不能直接展示广告; 【2】要判断是否达到了间隔次数; + + //innerIvType 和 _type 其实就是一样的 + int innerIvType = GetInterRules(_type, HCInnerStaticSting.HC_TYPE); + + int currTimes; // 当前达到的间隔次数 + int needTimes = GetInterRules(_type, HCInnerStaticSting.HC_OVER_LEVEL); // 需要达到的间隔次数 + // 获取当前进程里 iv 的展示次数 + if (ivsCount.ContainsKey(innerIvType)) + { + // 读取字典里插屏类型的次数 + currTimes = ivsCount[innerIvType] + 1; + ivsCount[innerIvType] = currTimes; + } + else + { + // 字典里没有数据,添加数据 + currTimes = 1; + ivsCount.Add(innerIvType, currTimes); + } + + HCDebugger.LogDebug("当前间隔次数:" + currTimes + "远端次数:" + needTimes + "IV Type:" + _type); + if (currTimes <= needTimes) + { + // 没到频次控制时间 + return "当前间隔次数:" + currTimes + "远端次数:" + needTimes + "IV Type:" + _type; + } + + + //【3】判断是否达到最小时间间隔 + int timeInterVal = GetInterRules(_type, HCInnerStaticSting.HC_INTERVAL); + + var mIvStartTime = GetCurrentTimeInterVal(_type); + var adInterTime = Time.time - mIvStartTime; + bool canShowFlag = adInterTime >= timeInterVal; + var msg = "插屏时间间隔:当前时间:" + adInterTime + "远端时间:" + timeInterVal + "IV Type:" + _type + " canShowFlag:" + canShowFlag; + HCDebugger.LogDebug(msg); + if (canShowFlag) + { + // 重置次数 + ivsCount[innerIvType] = 0; + } + + if (!canShowFlag) + { + return msg; + } + return null; + } + + + private string CheckIfReachFirstNTimes(HCIVADType _type) + { + bool canShow = false; + + string reachKey = "ivReachTimes" + _type.ToString(); + // 取出本地插屏播放的次数 + int reachTime = HCTools.GetPlayerPrefsInt(reachKey, 0); + // 是否到达可播放时机 + if (reachTime >= GetInterRules(_type, HCInnerStaticSting.HC_SKIP_LEVEL)) + { + canShow = true; + } + + reachTime += 1; + HCTools.SavePlayerPrefsInt(reachKey, reachTime); + var msg = "前N次不展示插屏,本地次数:" + reachTime + "远端参数:" + GetInterRules(_type, HCInnerStaticSting.HC_SKIP_LEVEL) + "IV Type:" + _type; + HCDebugger.LogDebug(msg); + if (!canShow) + { + return msg; + } + return null; + } + + private bool IfFirstCheckPlayerPrefs(HCIVADType _type) + { + string key = HCInnerStaticSting.HC_FIRST_SHOW + _type.ToString(); + string values = HCTools.GetPlayerPrefsString(key, ""); + + if (values.Length <= 0) + { + HCTools.SavePlayerPrefsString(key, key); + return true; + } + else + { + return false; + } + } + + + private int GetInterRules(HCIVADType index, string key) + { + string jsonData = HCAnalyticsManager.Instance.GetRemoteConfigStr(HCInnerStaticSting.HC_INTER_RULES_Remote, HCInnerStaticSting.HC_INTER_RULES_DEFAULT_VALUE); + JArray jsonArray; + try + { + jsonArray = JArray.Parse(jsonData); + } + catch + { + jsonArray = JArray.Parse(HCInnerStaticSting.HC_INTER_RULES_DEFAULT_VALUE); + } + + int temp = 0; + if ((int)index > jsonArray.Count - 1) return temp; + + int.TryParse((string)jsonArray[(int)index][key], out temp); + return temp; + } + + + // callback + private void OnInterstitialLoadedEvent(string adunit, Dictionary adInfo) + { + CancelInvoke(nameof(WatchIvLoadCallback)); + _ivIsLoading = false; + + m_interRetryAttempt = 0; + + float loadTime = Time.time - m_ivStartLoadTime; + HCAnalyticsManager.Instance.TrackEvent(HCInnerStaticSting.HC_IV_Loaded, + new Dictionary + { + { HCInnerStaticSting.HC_Time, loadTime.ToString() }, + { "ad_platform", adInfo.GetValue("networkname", "") }, + { "ad_id", adInfo.GetValue("networkplacement", "") }, + { "ad_ecpm", adInfo.GetValue("revenue", "0") } + }); + } + + private void OnInterstitialLoadFailedEvent(string adUnitId, Dictionary errorInfo) + { + _ivIsLoading = false; + CancelInvoke(nameof(WatchIvLoadCallback)); + // HCDebugger.LogDebug($"[HCAdsManager] [OnInterstitialLoadFailedEvent] adUnitId = {adUnitId} m_interCloseCallback = {m_interCloseCallback}"); + // m_interCloseCallback?.Invoke(); + // m_interCloseCallback = null; + + float loadTime = Time.time - m_ivStartLoadTime; + errorInfo ??= new Dictionary(); + errorInfo[HCInnerStaticSting.HC_Time] = loadTime.ToString(CultureInfo.InvariantCulture); + + if (errorInfo.ContainsKey("type")) + { + errorInfo["return_type"] = errorInfo["type"]; + errorInfo.Remove("type"); + } + HCAnalyticsManager.Instance.TrackEvent(HCInnerStaticSting.HC_IV_Fail_Loaded, errorInfo); + + m_interRetryAttempt++; + double retryDelay = Math.Pow(2, Math.Max(4, m_interRetryAttempt)); + Invoke("LoadInterstitial", (float)retryDelay); + } + + private void OnInterstitialAdFailedToDisplayEvent(string adUnitId, Dictionary errorInfo, Dictionary adInfo) + { + CancelInvoke("CheckCloseCallback"); + + HCDebugger.LogDebug($"[HCAdsManager] [OnInterstitialAdFailedToDisplayEvent] adUnitId = {adUnitId} m_interCloseCallback = {m_interCloseCallback}"); + ResumeGame(); + LoadInterstitial(); + + m_interCloseCallback?.Invoke(); + m_interCloseCallback = null; + + if (errorInfo.ContainsKey("type")) + { + errorInfo["return_type"] = errorInfo["type"]; + errorInfo.Remove("type"); + } + HCAnalyticsManager.Instance.TrackEvent(HCInnerStaticSting.HC_IV_ShowFail, errorInfo); + } + + private void OnInterstitialClickedEvent(string adUnitId, Dictionary adInfo) + { + } + + private void OnInterstitialDisplayedEvent(string adUnitId, Dictionary info) + { + PauseGame(); + + CancelInvoke("CheckCloseCallback"); + + HCDebugger.LogDebug($"[HCAdsManager] [OnInterstitialDisplayedEvent] adUnitId = {adUnitId} m_interCloseCallback = {m_interCloseCallback}"); + + int playCount = HCTools.GetPlayerPrefsInt("INTER_PLAY_COUNT", 0) + 1; + HCTools.SavePlayerPrefsInt("INTER_PLAY_COUNT", playCount); + HCAnalyticsManager.Instance.SetUserProperties(new Dictionary() { { "total_iv_ad_times", playCount } }); + if (info.ContainsKey("type")) + { + info["return_type"] = info["type"]; + info.Remove("type"); + } + info.Add(HCInnerStaticSting.HC_Position, mIVPos.ToString()); + HCAnalyticsManager.Instance.TrackEvent(HCInnerStaticSting.HC_IV_Show, info); + } + + private void OnInterstitialHiddenEvent(string adUnitId, Dictionary adInfo) + { + ResumeGame(); + + HCDebugger.LogDebug($"[HCAdsManager] [OnInterstitialHiddenEvent] adUnitId = {adUnitId} m_interCloseCallback = {m_interCloseCallback}"); + + m_interCloseCallback?.Invoke(); + m_interCloseCallback = null; + + if (currentShowIVADType != HCIVADType.NULL) + { + SaveCurrentTimeInterVal(currentShowIVADType); + } + + currentShowIVADType = HCIVADType.NULL; + + if (adInfo.ContainsKey("type")) + { + adInfo["return_type"] = adInfo["type"]; + adInfo.Remove("type"); + } + + HCAnalyticsManager.Instance.TrackEvent(HCInnerStaticSting.HC_IV_Close, adInfo); + LoadInterstitial(); + } + + private void OnInterstitialRevenue(string adunit, Dictionary adInfo) + { + HCAnalyticsManager.Instance.TrackRevenueEvent(adInfo); + } + + #endregion + + #region Banner + + private void LoadBanner() + { + if (IsAdUnitEmpty(HCStaticParams.BannerAdUnitID, ADType.Banner) || HCTools.IsRemoveAds() || IsReviewModel()) + { + plugin.DestroyBanner(HCStaticParams.BannerAdUnitID); + return; + } + + plugin.CreateBanner(HCStaticParams.BannerAdUnitID); + } + + public void ShowBanner() + { + if (IsAdUnitEmpty(HCStaticParams.BannerAdUnitID, ADType.Banner) || HCTools.IsRemoveAds() || IsReviewModel()) + { + plugin.DestroyBanner(HCStaticParams.BannerAdUnitID); + return; + } + + plugin.ShowBanner(HCStaticParams.BannerAdUnitID); + } + + public void HideBanner() + { + if (IsAdUnitEmpty(HCStaticParams.BannerAdUnitID, ADType.Banner)) return; + plugin.HideBanner(HCStaticParams.BannerAdUnitID); + } + + + private void OnBannerAdLoadedEvent(string adUnitId, Dictionary adInfo) + { + m_bannerRetryAttempt = 0; + } + + private void OnBannerAdLoadFailedEvent(string adUnitId, Dictionary errorInfo) + { + m_bannerRetryAttempt++; + double retryDelay = Math.Pow(2, Math.Min(6, m_bannerRetryAttempt)); + Invoke("LoadBanner", (float)retryDelay); + } + + private void OnBannerAdClickedEvent(string adUnitId, Dictionary adInfo) + { + } + + private void OnBannerAdRevenuePaidEvent(string adUnitId, Dictionary adInfo) + { + HCAnalyticsManager.Instance.TrackRevenueEvent(adInfo); + } + + private void OnBannerAdExpandedEvent(string adUnitId, Dictionary adInfo) + { + } + + private void OnBannerAdCollapsedEvent(string adUnitId, Dictionary adInfo) + { + } + + #endregion + + #region native + + private void LoadNative(string adUnit = "") + { +#if UNITY_WEBGL + if (IsReviewModel() || HCTools.IsRemoveAds()) return; + if (HCStaticParams.NativeAdUnitIDDictionary.Count == 0) + { + HCDebugger.LogError("广告id没有配置"); + return; + } + + if (string.IsNullOrEmpty(adUnit)) + { + foreach (var key in HCStaticParams.NativeAdUnitIDDictionary.Keys) + { + HCNativeInterface.Instance.LoadNative(key); + } + } + else if (HCStaticParams.NativeAdUnitIDDictionary.Keys.Contains(adUnit)) + { + HCNativeInterface.Instance.LoadNative(adUnit); + } + else + { + HCDebugger.LogError("加载的广告id没有配置"); + } +#endif +// #else +// if (IsReviewModel() || IsAdUnitEmpty(HCStaticParams.NativeAdUnitID, ADType.Native) || HCTools.IsRemoveAds()) return; +// HCNativeInterface.Instance.LoadNative(HCStaticParams.NativeAdUnitID); +// #endif + } + + public bool IsNativeReady(string adUnit = "") + { +#if UNITY_WEBGL + if (IsReviewModel() || HCTools.IsRemoveAds()) return false; + if (HCStaticParams.NativeAdUnitIDDictionary.Count == 0) + { + HCDebugger.LogError("广告id没有配置"); + return false; + } + + if (string.IsNullOrEmpty(adUnit)) + { + HCDebugger.LogError("adUnit 不能为空"); + return false; + } + + if (!HCStaticParams.NativeAdUnitIDDictionary.Keys.Contains(adUnit)) + { + HCDebugger.LogError("广告id没有配置"); + return false; + } + + return HCNativeInterface.Instance.IsNativeAdReady(adUnit); +#endif +// #else +// if (IsReviewModel() || IsAdUnitEmpty(HCStaticParams.NativeAdUnitID, ADType.Native) || HCTools.IsRemoveAds()) return false; +// return HCNativeInterface.Instance.IsNativeAdReady(); +// #endif + return false; + } + + public void RemoveNative(string adUnit = "") + { +#if UNITY_WEBGL + if (IsReviewModel() || HCTools.IsRemoveAds()) return; + if (HCStaticParams.NativeAdUnitIDDictionary.Count == 0) + { + HCDebugger.LogError("广告id没有配置"); + return; + } + + if (string.IsNullOrEmpty(adUnit)) + { + HCDebugger.LogError("adUnit 不能为空"); + return; + } + + if (!HCStaticParams.NativeAdUnitIDDictionary.Keys.Contains(adUnit)) + { + HCDebugger.LogError("广告id没有配置"); + return; + } + + HCNativeInterface.Instance.RemoveNative(adUnit); +#endif +// #else +// if (IsAdUnitEmpty(HCStaticParams.NativeAdUnitID, ADType.Native)) return; +// HCNativeInterface.Instance.RemoveNative(); +// #endif + } + + public void ShowNative(RectTransform pRect, Camera pCam = null, string pAdPos = "", string adUnit = "", Action _showFailedCallback = null, Action _closeCallback = null) + { +#if UNITY_WEBGL + if (IsReviewModel()) + { + _showFailedCallback?.Invoke(-1, "IsReviewModel"); + return; + } + + if (HCStaticParams.NativeAdUnitIDDictionary.Count == 0) + { + _showFailedCallback?.Invoke(-2, "广告id没有配置"); + HCDebugger.LogError("广告id没有配置"); + return; + } + + if (string.IsNullOrEmpty(adUnit)) + { + _showFailedCallback?.Invoke(-3, "adUnit 为空"); + HCDebugger.LogError("adUnit 不能为空"); + return; + } + + if (!HCStaticParams.NativeAdUnitIDDictionary.Keys.Contains(adUnit)) + { + _showFailedCallback?.Invoke(-4, "广告id没有配置 " + adUnit); + HCDebugger.LogError("广告id没有配置"); + return; + } + + HCNativeInterface.Instance.ShowNative(pRect, pCam, pAdPos, adUnit, _showFailedCallback, _closeCallback); +#endif +// #else +// if (IsReviewModel() || IsAdUnitEmpty(HCStaticParams.NativeAdUnitID, ADType.Native) || HCTools.IsRemoveAds()) return; +// HCNativeInterface.Instance.ShowNative(pRect, pCam, pAdPos); +// #endif + } + + #endregion + + #region other + + public bool IsReviewModel() + { + HCDebugger.LogDebug("当前提审模式:" + HCAnalyticsManager.Instance.GetRemoteConfigStr(HCInnerStaticSting.HC_MODE_SWITCH_KEY, HCArraignmentModeType.Online.ToString())); + return HCAnalyticsManager.Instance.GetRemoteConfigStr(HCInnerStaticSting.HC_MODE_SWITCH_KEY, HCArraignmentModeType.Online.ToString()) == HCArraignmentModeType.Review.ToString(); + } + + + private bool IsAdUnitEmpty(string unitId, ADType type) + { + if (unitId == "") + { + HCDebugger.LogError(string.Format("请填写{0}广告位ID", type.ToString())); + return true; + } + + return false; + } + + private void PauseGame() + { + HCSDKManager.Instance.SetGameFocusListener?.Invoke(false); + + //if (Time.timeScale > 0f) m_oldTimeScale = Time.timeScale; + //if (m_oldVolume > 0f) m_oldVolume = AudioListener.volume; + //Time.timeScale = 0f; + //AudioListener.volume = 0f; + } + + private void ResumeGame() + { + HCSDKManager.Instance.SetGameFocusListener?.Invoke(true); + //Time.timeScale = m_oldTimeScale; + //AudioListener.volume = m_oldVolume; + } + + public void SetLogEnable(bool _enable) + { + plugin.SetLogEnable(_enable); + } + + public enum ADType + { + Banner, + + Intersitital, + + Reward, + + Native + } + + #endregion + } +} \ No newline at end of file diff --git a/Assets/HCMiniSdk/Scripts/Ads/HCAdsManager.cs.meta b/Assets/HCMiniSdk/Scripts/Ads/HCAdsManager.cs.meta new file mode 100644 index 00000000..a1b7ac46 --- /dev/null +++ b/Assets/HCMiniSdk/Scripts/Ads/HCAdsManager.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: 8677d02dcc6a04f2aa3a5d5dac140f97 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/HCMiniSdk/Scripts/Ads/HCIBaseAds.cs b/Assets/HCMiniSdk/Scripts/Ads/HCIBaseAds.cs new file mode 100644 index 00000000..cd2a0acb --- /dev/null +++ b/Assets/HCMiniSdk/Scripts/Ads/HCIBaseAds.cs @@ -0,0 +1,55 @@ +using System; +using System.Collections.Generic; + +namespace HC +{ + public abstract class HCIBaseAds + { + public Action> HCOnRewardedRevenue; + public Action> HCOnRewardedAdLoadedEvent; + public Action> HCOnRewardedAdLoadFailedEvent; + public Action> HCOnRewardedAdDisplayedEvent; + public Action> HCOnRewardedAdClickedEvent; + public Action, Dictionary> HCOnRewardedAdFailedToDisplayEvent; + public Action, Dictionary> HCOnRewardedAdReceivedRewardEvent; + + public Action> HCOnRewardedAdHiddenEvent; + + // callback + public Action> HCOnInterstitialLoadedEvent; + public Action> HCOnInterstitialLoadFailedEvent; + public Action, Dictionary> HCOnInterstitialAdFailedToDisplayEvent; + public Action> HCOnInterstitialClickedEvent; + public Action> HCOnInterstitialDisplayedEvent; + public Action> HCOnInterstitialHiddenEvent; + public Action> HCOnInterstitialRevenue; + + // callback + public Action> HCOnBannerAdLoadedEvent; + public Action> HCOnBannerAdLoadFailedEvent; + public Action> HCOnBannerAdClickedEvent; + public Action> HCOnBannerAdRevenuePaidEvent; + public Action> HCOnBannerAdExpandedEvent; + public Action> HCOnBannerAdCollapsedEvent; + public abstract void InitializeSdk(Action initCallback); + public abstract void LoadRewardedAd(string adUnitId); + public abstract bool IsRewardedAdReady(string adUnitId); + public abstract void ShowRewardedAd(string adUnitId); + + public abstract void LoadInterstitial(string adUnitId); + + public abstract bool IsInterstitialReady(string adUnitId); + + public abstract void ShowInterstitial(string adUnitId); + + public abstract void DestroyBanner(string adUnitId); + + public abstract void CreateBanner(string adUnitId); + + public abstract void ShowBanner(string adUnitId); + + public abstract void HideBanner(string adUnitId); + + public abstract void SetLogEnable(bool enable); + } +} \ No newline at end of file diff --git a/Assets/HCMiniSdk/Scripts/Ads/HCIBaseAds.cs.meta b/Assets/HCMiniSdk/Scripts/Ads/HCIBaseAds.cs.meta new file mode 100644 index 00000000..53dd734a --- /dev/null +++ b/Assets/HCMiniSdk/Scripts/Ads/HCIBaseAds.cs.meta @@ -0,0 +1,3 @@ +fileFormatVersion: 2 +guid: e8be7f7d1b114fc282e354e1d1a901a0 +timeCreated: 1699892818 \ No newline at end of file diff --git a/Assets/HCMiniSdk/Scripts/Ads/HCNativeAdUnit.cs b/Assets/HCMiniSdk/Scripts/Ads/HCNativeAdUnit.cs new file mode 100644 index 00000000..d8098eca --- /dev/null +++ b/Assets/HCMiniSdk/Scripts/Ads/HCNativeAdUnit.cs @@ -0,0 +1,24 @@ +using UnityEngine; + +namespace HC +{ + public class HCNativeAdUnit + { + public string AdUnit; + public int Rows; + public int Columns; + public TextAnchor Anchor; + public HCNativeAdUnit Fit; + public bool IsFull; + + public HCNativeAdUnit(string adUnit, int rows, int columns, TextAnchor anchor = TextAnchor.MiddleCenter, HCNativeAdUnit fit = null,bool isFull = false) + { + AdUnit = adUnit; + Rows = rows; + Columns = columns; + Anchor = anchor; + Fit = fit; + IsFull = isFull; + } + } +} \ No newline at end of file diff --git a/Assets/HCMiniSdk/Scripts/Ads/HCNativeAdUnit.cs.meta b/Assets/HCMiniSdk/Scripts/Ads/HCNativeAdUnit.cs.meta new file mode 100644 index 00000000..b57b4b3c --- /dev/null +++ b/Assets/HCMiniSdk/Scripts/Ads/HCNativeAdUnit.cs.meta @@ -0,0 +1,3 @@ +fileFormatVersion: 2 +guid: 7e0aa94dd7b54f1e8b299b97d8d25e3b +timeCreated: 1699869808 \ No newline at end of file diff --git a/Assets/HCMiniSdk/Scripts/Ads/Plugins.meta b/Assets/HCMiniSdk/Scripts/Ads/Plugins.meta new file mode 100644 index 00000000..f163feb7 --- /dev/null +++ b/Assets/HCMiniSdk/Scripts/Ads/Plugins.meta @@ -0,0 +1,3 @@ +fileFormatVersion: 2 +guid: f6592352a6e847ddbbe3abdbb5bb3db9 +timeCreated: 1699892836 \ No newline at end of file diff --git a/Assets/HCMiniSdk/Scripts/Ads/Plugins/HCWebGLAdPlugin.cs b/Assets/HCMiniSdk/Scripts/Ads/Plugins/HCWebGLAdPlugin.cs new file mode 100644 index 00000000..829450fa --- /dev/null +++ b/Assets/HCMiniSdk/Scripts/Ads/Plugins/HCWebGLAdPlugin.cs @@ -0,0 +1,136 @@ + + +using System; +using System.Collections.Generic; + +namespace HC.Plugins +{ + public class HCWebGLAdPlugin : HCIBaseAds + { + private Dictionary ConvertCallbackResult(int code, string msg, Dictionary ext) + { + ext ??= new Dictionary(); + ext["code"] = code; + ext["msg"] = msg; + ext["platform"] = "webgl"; + return ext; + } + + public override void InitializeSdk(Action initCallback) + { + HCWebGLSDKManager.Ads.InitializeSdk((statusCallback, adUnit, code, msg, ext) => + { + switch (statusCallback) + { + case HCADSstatuscallback.RewardedLoadSuccess: + HCOnRewardedAdLoadedEvent?.Invoke(adUnit, ConvertCallbackResult(code, msg, ext)); + break; + case HCADSstatuscallback.RewardedClose: + HCOnRewardedAdHiddenEvent?.Invoke(adUnit, ConvertCallbackResult(code, msg, ext)); + break; + case HCADSstatuscallback.RewardedLoadFailed: + HCOnRewardedAdLoadFailedEvent?.Invoke(adUnit, ConvertCallbackResult(code, msg, ext)); + break; + case HCADSstatuscallback.RewardedShowSuccess: + HCOnRewardedAdDisplayedEvent?.Invoke(adUnit, ConvertCallbackResult(code, msg, ext)); + break; + case HCADSstatuscallback.RewardedShowFailed: + HCOnRewardedAdFailedToDisplayEvent?.Invoke(adUnit, ConvertCallbackResult(code, msg, ext), ConvertCallbackResult(code, msg, ext)); + break; + case HCADSstatuscallback.InterstitialLoadSuccess: + HCOnInterstitialLoadedEvent?.Invoke(adUnit, ConvertCallbackResult(code, msg, ext)); + break; + case HCADSstatuscallback.InterstitialLoadFailed: + HCOnInterstitialLoadFailedEvent?.Invoke(adUnit, ConvertCallbackResult(code, msg, ext)); + break; + case HCADSstatuscallback.InterstitialClose: + HCOnInterstitialHiddenEvent?.Invoke(adUnit, ConvertCallbackResult(code, msg, ext)); + break; + case HCADSstatuscallback.InterstitialShowSuccess: + HCOnInterstitialDisplayedEvent?.Invoke(adUnit, ConvertCallbackResult(code, msg, ext)); + break; + case HCADSstatuscallback.InterstitialShowFailed: + HCOnInterstitialAdFailedToDisplayEvent?.Invoke(adUnit, ConvertCallbackResult(code, msg, ext), ConvertCallbackResult(code, msg, ext)); + break; + case HCADSstatuscallback.BannerLoadFailed: + HCOnBannerAdLoadFailedEvent?.Invoke(adUnit, ConvertCallbackResult(code, msg, ext)); + break; + case HCADSstatuscallback.BannerLoadSuccess: + HCOnBannerAdLoadedEvent?.Invoke(adUnit, ConvertCallbackResult(code, msg, ext)); + break; + case HCADSstatuscallback.BannerResize: + break; + case HCADSstatuscallback.BannerDestroySuccess: + break; + case HCADSstatuscallback.BannerDestroyFailed: + break; + case HCADSstatuscallback.BannerShowSuccess: + break; + case HCADSstatuscallback.BannerShowFailed: + break; + case HCADSstatuscallback.BannerHideSuccess: + break; + case HCADSstatuscallback.BannerHideFailed: + break; + default: + throw new ArgumentOutOfRangeException(nameof(statusCallback), statusCallback, null); + } + }); + initCallback?.Invoke(true); + } + + public override void LoadRewardedAd(string adUnitId) + { + HCWebGLSDKManager.Ads.RewardedLoad(adUnitId); + } + + public override bool IsRewardedAdReady(string adUnitId) + { + return HCWebGLSDKManager.Ads.IsRewardedAdReady(adUnitId); + } + + public override void ShowRewardedAd(string adUnitId) + { + HCWebGLSDKManager.Ads.ShowRewardedAd(adUnitId); + } + + public override void LoadInterstitial(string adUnitId) + { + HCWebGLSDKManager.Ads.LoadInterstitial(adUnitId); + } + + public override bool IsInterstitialReady(string adUnitId) + { + return HCWebGLSDKManager.Ads.IsInterstitialReady(adUnitId); + } + + public override void ShowInterstitial(string adUnitId) + { + HCWebGLSDKManager.Ads.ShowInterstitial(adUnitId); + } + + public override void DestroyBanner(string adUnitId) + { + HCWebGLSDKManager.Ads.DestroyBanner(adUnitId); + } + + public override void CreateBanner(string adUnitId) + { + HCWebGLSDKManager.Ads.CreateBanner(adUnitId); + } + + public override void ShowBanner(string adUnitId) + { + HCWebGLSDKManager.Ads.ShowBanner(adUnitId); + } + + public override void HideBanner(string adUnitId) + { + HCWebGLSDKManager.Ads.HideBanner(adUnitId); + } + + public override void SetLogEnable(bool enable) + { + } + } +} \ No newline at end of file diff --git a/Assets/HCMiniSdk/Scripts/Ads/Plugins/HCWebGLAdPlugin.cs.meta b/Assets/HCMiniSdk/Scripts/Ads/Plugins/HCWebGLAdPlugin.cs.meta new file mode 100644 index 00000000..a192b34f --- /dev/null +++ b/Assets/HCMiniSdk/Scripts/Ads/Plugins/HCWebGLAdPlugin.cs.meta @@ -0,0 +1,3 @@ +fileFormatVersion: 2 +guid: f0e125d5f2fc43a480aa15028d168fad +timeCreated: 1699892885 \ No newline at end of file diff --git a/Assets/HCMiniSdk/Scripts/Analytics.meta b/Assets/HCMiniSdk/Scripts/Analytics.meta new file mode 100644 index 00000000..b19cfbc4 --- /dev/null +++ b/Assets/HCMiniSdk/Scripts/Analytics.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: ae40c683486c04fc0b06a9acc503df7b +folderAsset: yes +DefaultImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/HCMiniSdk/Scripts/Analytics/HCAnalyticsManager.cs b/Assets/HCMiniSdk/Scripts/Analytics/HCAnalyticsManager.cs new file mode 100644 index 00000000..8cedac81 --- /dev/null +++ b/Assets/HCMiniSdk/Scripts/Analytics/HCAnalyticsManager.cs @@ -0,0 +1,412 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using HC.Plugins; + +namespace HC +{ + public class HCAnalyticsManager : HCSingleton + { + private bool m_isInitialized = false; + + private Dictionary plugins; + + public Action> RemoteConfigListen; + + + protected override void OnInstanceCreate() + { + base.OnInstanceCreate(); + + plugins = new Dictionary + { +#if UNITY_WEBGL || WEBGL_BYTEDANCE + [TrackEventPlatform.WebGL] = HCWebGL.Instance, +#endif + [TrackEventPlatform.HC] = HCAnalytics.Instance, + }; +#if UNITY_WEBGL && WEBGL_WX + if (!(string.IsNullOrEmpty(HCStaticParams.TDAppId) || string.IsNullOrEmpty(HCStaticParams.TDServerUrl))) + { + plugins.Add(TrackEventPlatform.TD, HCTDAnalyticsWebGL.Instance); + } +#elif (UNITY_ANDROID && TE_DISABLE_ANDROID_JAVA) || UNITY_IOS || (UNITY_WEBGL && WEBGL_BYTEDANCE) + if (!(string.IsNullOrEmpty(HCStaticParams.TDAppId) || string.IsNullOrEmpty(HCStaticParams.TDServerUrl))) + { + plugins.Add(TrackEventPlatform.TD, HCTDAnalyticsUnity.Instance); + } +#endif + + HCDebugger.LogDebug($"analytics plugins = {plugins.Count}"); + } + + public HCIBaseAnalytics GetAnalyticsPlugin(TrackEventPlatform platform) + { + return plugins.GetValueOrDefault(platform, null); + } + + public void InitializeSdk() + { + if (m_isInitialized) return; + PrepareDeviceID(); + + foreach (var plugin in plugins.Values) + { + plugin.InitializeSdk(); + } + + m_isInitialized = true; + } + + #region 广告收益上报事件 + + public void TrackRevenueEvent(Dictionary param) + { + foreach (var plugin in plugins.Values) + { + plugin.TrackAdRevenue(HCInnerStaticSting.HC_Ad_Impression, param); + } + } + + #endregion + + #region deviceID + + private void PrepareDeviceID() + { + string deviceID = HCTools.GetPlayerPrefsString(HCAccountManager.Instance.staticSaveKey_DeviceID); + if (string.IsNullOrEmpty(deviceID)) + { + deviceID = HCNativeInterface.Instance.GetDeviceID(); + if (string.IsNullOrEmpty(deviceID)) + { + deviceID = System.Guid.NewGuid().ToString(); + } + + HCTools.SavePlayerPrefsString(HCAccountManager.Instance.staticSaveKey_DeviceID, deviceID); + SetSuperProperties(new Dictionary() { { "device_id", deviceID } }); + } + } + + #endregion + + + public string GetRemoteConfigStr(string _key, string _defaultValue) + { + foreach (var plugin in plugins.Values.Where(plugin => plugin.ContainsRemoteConfigKey(_key))) + { + return plugin.GetRemoteConfigStr(_key, _defaultValue); + } + + return _defaultValue; + } + + public int GetRemoteConfigInt(string _key, int _defaultValue) + { + foreach (var plugin in plugins.Values.Where(plugin => plugin.ContainsRemoteConfigKey(_key))) + { + return plugin.GetRemoteConfigInt(_key, _defaultValue); + } + + return _defaultValue; + } + + public bool GetRemoteConfigBool(string _key, bool _defaultValue) + { + foreach (var plugin in plugins.Values.Where(plugin => plugin.ContainsRemoteConfigKey(_key))) + { + return plugin.GetRemoteConfigBool(_key, _defaultValue); + } + + return _defaultValue; + } + + + public void SetSuperProperties(Dictionary _mPoperties) + { + foreach (var plugin in plugins.Values) + { + plugin.SetSuperProperties(_mPoperties); + } + } + + public void SetUserProperties(Dictionary _mPoperties) + { + foreach (var plugin in plugins.Values) + { + plugin.UserSet(_mPoperties); + } + } + + public void SetUserId(string _userId) + { + foreach (var plugin in plugins.Values) + { + plugin.Login(_userId); + } + } + + public void UserSetOnce(Dictionary properties) + { + foreach (var plugin in plugins.Values) + { + plugin.UserSetOnce(properties); + } + } + + public void SetLogEnable(bool _enable) + { + foreach (var plugin in plugins.Values) + { + plugin.SetLogEnable(_enable); + } + } + + #region track event + + public void TrackEvent(string _eventName, TrackEventPlatform _trackEventPlatform = TrackEventPlatform.All) + { + TrackEvent(_eventName, new Dictionary(), _trackEventPlatform); + } + + public void TrackEvent(string _eventName, Dictionary _eventDic, TrackEventPlatform _trackEventPlatform = TrackEventPlatform.All) + { + _eventDic ??= new Dictionary(); + + _eventDic = _eventDic.Concat(GetCommonAttribute()).ToDictionary(postParK => postParK.Key, PostParV => PostParV.Value); + + if (_trackEventPlatform == TrackEventPlatform.All) + { + foreach (var analytics in plugins.Values) + { + analytics.TrackEvent(_eventName, _eventDic); + } + } + else + { + if (plugins.TryGetValue(_trackEventPlatform, out var plugin)) + { + plugin.TrackEvent(_eventName, _eventDic); + } + } + } + + public void TrackEvent(string _eventName, string _key01, object _value01, TrackEventPlatform _trackEventPlatform = TrackEventPlatform.All) + { + TrackEvent(_eventName, new Dictionary { { _key01, _value01 } }, _trackEventPlatform); + } + + public void TrackEvent(string _eventName, string _key01, object _value01, string _key02, object _value02, TrackEventPlatform _trackEventPlatform = TrackEventPlatform.All) + { + TrackEvent(_eventName, new Dictionary { { _key01, _value01 }, { _key02, _value02 } }, _trackEventPlatform); + } + + #endregion + + #region reward btn + + public void LogRewardBtnShow(string _pos) + { + TrackEvent(HCInnerStaticSting.HC_RV_Button_Show, new Dictionary() { { HCInnerStaticSting.HC_Position, _pos } }); + } + + public void LogRewardBtnClick(string _pos) + { + TrackEvent(HCInnerStaticSting.HC_RV_Button_Click, new Dictionary() { { HCInnerStaticSting.HC_Position, _pos } }); + } + + #endregion + + #region Iap event + + public void IAPBtnShow(string productName, string productID, string currency, int price) + { + var args = new Dictionary(); + args.Add("IAP", productName); + args.Add("ID", productID); + args.Add("Currency", currency); + args.Add("Price", price); + TrackEvent(HCInnerStaticSting.HC_IAP_Button_Show, args); + } + + public void IAPBtnClick(string productName, string productID, string currency, int price, string gameExtra) + { + var args = new Dictionary(); + args.Add("IAP", productName); + args.Add("ID", productID); + args.Add("Currency", currency); + args.Add("Price", price); +#if UNITY_IOS + args.Add("payment_type", "Appstore"); +#else + args.Add("payment_type", "GooglePlay"); +#endif + args.Add("payment_num", gameExtra); + TrackEvent(HCInnerStaticSting.HC_IAP_Button_Click, args); + } + + public void IAPSuccess(string productName, string productID, string orderID, string currency, int price, string gameExtra, int balance = 0, int restoreOrders = 0) + { + var args = new Dictionary(); + args.Add("IAP", productName); + args.Add("ID", productID); + args.Add("Currency", currency); + args.Add("Price", price); + args.Add("order_id", orderID); + args.Add("is_first", HCTools.GetPlayerPrefsInt(HCInnerStaticSting.HC_First_Purchase, 0) == 0); +#if UNITY_IOS + args.Add("payment_type", "Appstore"); +#elif UNITY_ANDROID + args.Add("payment_type", "GooglePlay"); +#elif UNITY_WEBGL && WEBGL_WX + args.Add("payment_type", "wechat"); +#elif UNITY_WEBGL && WEBGL_BYTEDANCE + args.Add("payment_type", "douyin"); +#else + args.Add("payment_type", "other"); +#endif + args.Add("payment_num", gameExtra); + args.Add("balance", balance); + args.Add("restoreOrders", restoreOrders); + TrackEvent(HCInnerStaticSting.HC_IAP_Success, args); + + float fPrice = price * 1.0f; + + fPrice = fPrice + HCTools.GetPlayerPrefsFloat("PURCHASE_PRICE", 0.0f); + HCTools.SavePlayerPrefsFloat("PURCHASE_PRICE", fPrice); + + int payTimes = HCTools.GetPlayerPrefsInt("PAY_TIME", 0) + 1; + HCTools.SavePlayerPrefsInt("PAY_TIME", payTimes); + + + SetUserProperties(new Dictionary() { { "total_pay_amount", fPrice }, { "total_pay_times", payTimes } }); + HCTools.SavePlayerPrefsInt(HCInnerStaticSting.HC_First_Purchase, 1); + + SetSuperProperties(new Dictionary() { { "pay_times", payTimes } }); + + FirstPurchase(); + } + + public void IAPChannelSuccess(string productName, string productID, string orderID, string currency, int price, string gameExtra) + { + var args = new Dictionary(); + args.Add("IAP", productName); + args.Add("ID", productID); + args.Add("Currency", currency); + args.Add("Price", price); + args.Add("order_id", orderID); + args.Add("is_first", HCTools.GetPlayerPrefsInt(HCInnerStaticSting.HC_First_Purchase, 0) == 0); +#if UNITY_IOS + args.Add("payment_type", "Appstore"); +#elif UNITY_ANDROID + args.Add("payment_type", "GooglePlay"); +#elif UNITY_WEBGL && WEBGL_WX + args.Add("payment_type", "wechat"); +#elif UNITY_WEBGL && WEBGL_BYTEDANCE + args.Add("payment_type", "douyin"); +#else + args.Add("payment_type", "other"); +#endif + args.Add("payment_num", gameExtra); + TrackEvent(HCInnerStaticSting.HC_IAP_Channel_Success, args); + } + + public void IAPFail(string productName, string productID, string orderID, string currency, int price, string gameExtra, string failReason, int restoreOrders = 0) + { + var args = new Dictionary(); + args.Add("IAP", productName); + args.Add("ID", productID); + args.Add("currency_type", currency); + args.Add("pay_amount", price); + args.Add("order_id", orderID); + args.Add("restoreOrders", restoreOrders); +#if UNITY_IOS + args.Add("payment_type", "Appstore"); +#elif UNITY_ANDROID + args.Add("payment_type", "GooglePlay"); +#elif UNITY_WEBGL && WEBGL_WX + args.Add("payment_type", "wechat"); +#elif UNITY_WEBGL && WEBGL_BYTEDANCE + args.Add("payment_type", "douyin"); +#else + args.Add("payment_type", "other"); +#endif + args.Add("payment_num", gameExtra); + args.Add("fail_reason", failReason); + TrackEvent(HCInnerStaticSting.HC_IAP_Fail, args); + } + + public void IAPChannelFail(string productName, string productID, string orderID, string currency, int price, string gameExtra, string failReason) + { + var args = new Dictionary(); + args.Add("IAP", productName); + args.Add("ID", productID); + args.Add("currency_type", currency); + args.Add("pay_amount", price); + args.Add("order_id", orderID); +#if UNITY_IOS + args.Add("payment_type", "Appstore"); +#elif UNITY_ANDROID + args.Add("payment_type", "GooglePlay"); +#elif UNITY_WEBGL && WEBGL_WX + args.Add("payment_type", "wechat"); +#elif UNITY_WEBGL && WEBGL_BYTEDANCE + args.Add("payment_type", "douyin"); +#else + args.Add("payment_type", "other"); +#endif + args.Add("payment_num", gameExtra); + args.Add("fail_reason", failReason); + TrackEvent(HCInnerStaticSting.HC_IAP_Channel_Fail, args); + } + + public void FirstPurchase() + { + UserSetOnce(new Dictionary() { { "first_pay_time", HCTimeTools.FormatDateTime(HCTimeTools.GetCurrentTimestamp(), "yyyy 年 M 月 d 日 HH:mm:ss.fff") } }); + } + + #endregion + + #region common attribute + + /// + /// 公共事件属性 + /// + private Dictionary commonAttributeDic = new Dictionary { }; + + public Dictionary GetCommonAttribute() + { + commonAttributeDic ??= new Dictionary(); + + if (commonAttributeDic.Count != 0) return commonAttributeDic; + commonAttributeDic = new Dictionary + { + { "is_new", GetIntervalDays() == 0 ? "Y" : "N" }, + { "D_2", GetAttributeDayValue(2) }, + { "D_3", GetAttributeDayValue(3) }, + { "D_7", GetAttributeDayValue(7) }, + { "D_15", GetAttributeDayValue(15) }, + { "D_30", GetAttributeDayValue(30) }, + { "D_45", GetAttributeDayValue(45) }, + { "D_60", GetAttributeDayValue(60) }, + { "Group", GetRemoteConfigStr("AddGroup", "") }, + { "unity_sdk_version", HCNativeInterface.SDKVersion } + }; + + return commonAttributeDic; + } + + private string GetAttributeDayValue(int day) + { + return (day - 1) <= GetIntervalDays() ? "Y" : "N"; + } + + public static int GetIntervalDays() + { + var firstTime = HCTools.GetPlayerPrefsInt(HCTools.FIRST_TIME_OPEN_GAME); + return HCTimeTools.GetDaysBetweenTimestamps(firstTime, HCTimeTools.GetCurrentTimestamp()); + } + + #endregion + } +} \ No newline at end of file diff --git a/Assets/HCMiniSdk/Scripts/Analytics/HCAnalyticsManager.cs.meta b/Assets/HCMiniSdk/Scripts/Analytics/HCAnalyticsManager.cs.meta new file mode 100644 index 00000000..e2aace84 --- /dev/null +++ b/Assets/HCMiniSdk/Scripts/Analytics/HCAnalyticsManager.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: aa2dd84abfdd047c4bf1b48288cf393f +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/HCMiniSdk/Scripts/Analytics/HCIBaseAnalytics.cs b/Assets/HCMiniSdk/Scripts/Analytics/HCIBaseAnalytics.cs new file mode 100644 index 00000000..121cbeac --- /dev/null +++ b/Assets/HCMiniSdk/Scripts/Analytics/HCIBaseAnalytics.cs @@ -0,0 +1,23 @@ +using System.Collections.Generic; +using JetBrains.Annotations; + +namespace HC +{ + public interface HCIBaseAnalytics + { + void InitializeSdk(); + TrackEventPlatform GetTrackEventPlatform(); + bool ContainsRemoteConfigKey(string key); + string GetRemoteConfigStr(string key, string defaultValue); + int GetRemoteConfigInt(string key, int defaultValue); + bool GetRemoteConfigBool(string key, bool defaultValue); + void SetUserId(string userId); + void TrackEvent(string eventName, [CanBeNull] Dictionary eventDic = null); + void TrackAdRevenue(string eventName, Dictionary dictionary); + void SetSuperProperties(Dictionary mPoperties); + void UserSet(Dictionary mPoperties); + void Login(string userId); + void UserSetOnce(Dictionary properties); + void SetLogEnable(bool enable); + } +} \ No newline at end of file diff --git a/Assets/HCMiniSdk/Scripts/Analytics/HCIBaseAnalytics.cs.meta b/Assets/HCMiniSdk/Scripts/Analytics/HCIBaseAnalytics.cs.meta new file mode 100644 index 00000000..05bf3288 --- /dev/null +++ b/Assets/HCMiniSdk/Scripts/Analytics/HCIBaseAnalytics.cs.meta @@ -0,0 +1,3 @@ +fileFormatVersion: 2 +guid: 6dd74eb6d1884b7080b9e8854d00584c +timeCreated: 1699601048 \ No newline at end of file diff --git a/Assets/HCMiniSdk/Scripts/Analytics/HCInnerStaticString.cs b/Assets/HCMiniSdk/Scripts/Analytics/HCInnerStaticString.cs new file mode 100644 index 00000000..bf68c59f --- /dev/null +++ b/Assets/HCMiniSdk/Scripts/Analytics/HCInnerStaticString.cs @@ -0,0 +1,220 @@ +using System.Collections; +using System.Collections.Generic; +using UnityEngine; + +namespace HC +{ + public static class HCInnerStaticSting + { + // adjust + public static string HC_ADJUST_NETWORK = "ADJUST_NETWORK"; + + + // events + public static string HC_RV_Start_Load = "RV_Start_Load"; + + public static string HC_Ad_Impression = "ad_impression"; + + public static string HC_RV_Loaded = "RV_Loaded"; + + public static string HC_Time = "Time"; + + public static string HC_RV_Fail_Loaded = "RV_Fail_Loaded"; + + public static string HC_RV_Button_Show = "RV_Button_Show"; + + public static string HC_RV_Button_Click = "RV_Button_Click"; + + public static string HC_RV_AchieveShow_Match = "RV_AchieveShow_Match"; + + public static string HC_RV_Show = "RV_Show"; + + public static string HC_RV_LoadingShow = "RV_LoadingShow"; + + public static string HC_RV_LoadingClose = "RV_LoadingClose"; + + public static string HC_RV_ShowFail = "RV_ShowFail"; + + public static string HC_RV_ShowFail_Not_Ready = "RV_ShowFail_Not_Ready"; + + public static string HC_IV_Start_Load = "IV_Start_Load"; + + public static string HC_IV_Loaded = "IV_Loaded"; + + public static string HC_IV_Fail_Loaded = "IV_Fail_Loaded"; + + public static string HC_IV_Show = "IV_Show"; + public static string HC_IV_Close = "HC_IV_Close"; + + public static string HC_IV_LoadingShow = "IV_LoadingShow"; + + public static string HC_IV_LoadingClose = "IV_LoadingClose"; + + public static string HC_IV_ShowFail = "IV_ShowFail"; + + public static string HC_IV_ShowFail_Not_Ready = "IV_ShowFail_Not_Ready"; + + public static string HC_IV_ShowFail_Rule_Limit = "IV_ShowFail_Rule_Limit"; + + public static string HC_IV_AchieveShow = "IV_AchieveShow"; + + public static string HC_IV_Position = "IV_Position"; + + public static string HC_Position = "Position"; + + public static string HC_IV_Type = "IV_Type"; + + public static string HC_IV_AchieveShow_Match = "IV_AchieveShow_Match"; + + public static string HC_NA_Start_Load = "NA_Start_Load"; + + public static string HC_NA_Loaded = "NA_Loaded"; + + public static string HC_NA_Fail_Loaded = "NA_Fail_Loaded"; + + public static string HC_NA_ShowFail = "NA_ShowFail"; + + public static string HC_NA_ShowFail_Not_Ready = "NA_ShowFail_Not_Ready"; + + public static string HC_NA_Position = "NA_Position"; + + public static string HC_NA_Show = "NA_Show"; + + public static string HC_NA_AchieveShow_Match = "NA_AchieveShow_Match"; + + public static string HC_SP_Start_Load = "SP_Start_Load"; + + public static string HC_SP_Loaded = "SP_Loaded"; + + public static string HC_SP_Fail_Loaded = "SP_Fail_Loaded"; + + public static string HC_SP_ShowFail = "SP_ShowFail"; + + public static string HC_SP_ShowFail_Not_Ready = "SP_ShowFail_Not_Ready"; + + public static string HC_SP_Position = "SP_Position"; + + public static string HC_SP_Show = "SP_Show"; + + public static string HC_SP_AchieveShow_Match = "SP_AchieveShow_Match"; + + public static string HC_Login_CreateTKUserid = "Login_CreateTKUserid"; + + public static string HC_Account = "Account"; + + public static string HC_Login_CreateTKUserid_Success = "Login_CreateTKUserid_Success"; + + public static string HC_Login_CreateTKUserid_Fail = "Login_CreateTKUserid_Fail"; + + public static string HC_Login_Enter = "Login_Enter"; + + public static string HC_Login_Success = "Login_Success"; + + public static string HC_Login_Fail = "Login_Fail"; + + public static string HC_Login_Enter_Success = "Login_Enter_Success"; + + public static string HC_Login_Enter_Fail = "Login_Enter_Fail"; + + public static string HC_Click_Bind = "Click_Bind"; + + public static string HC_Click_Bind_Success = "Click_Bind_Success"; + + public static string HC_Click_Bind_Conflict = "Click_Bind_Conflict"; + + public static string HC_Click_Bind_Fail = "Click_Bind_Fail"; + + public static string HC_Click_Bind_Login_Success = "Click_Bind_Login_Success"; + + public static string HC_Click_Bind_Login_Fail = "Click_Bind_Login_Fail"; + + public static string HC_Delete_Account_Page = "Delete_Account_Page"; + + public static string HC_Click_Delete_Account = "Click_Delete_Account"; + + public static string HC_Cancel_Delete_Account = "Cancel_Delete_Account"; + + public static string HC_Delete_Account_Success = "Delete_Account_Success"; + + public static string HC_Delete_Account_Fail = "Delete_Account_Fail"; + + public static string HC_Logout_Success = "Logout_Success"; + + public static string HC_Logout_Fail = "Logout_Fail"; + + public static string HC_IAP_Button_Show = "IAP_Button_Show"; + + public static string HC_IAP_Button_Click = "IAP_Button_Click"; + + // 服务器支付成功 + public static string HC_IAP_Success = "IAP_Success"; + + // 服务器支付失败 + public static string HC_IAP_Fail = "IAP_Fail"; + + // 渠道支付成功 + public static string HC_IAP_Channel_Success = "IAP_Channel_Success"; + + // 渠道支付失败 + public static string HC_IAP_Channel_Fail = "IAP_Channel_Fail"; + + + + public static string HC_First_Purchase = "First_purchase"; + + public static string HC_IAP = "IAP"; + + public static string HC_ID = "ID"; + + public static string HC_order_id = "order_id"; + + public static string HC_Currency = "Currency"; + + public static string HC_Price = "Price"; + + public static string HC_Adjust_init = "adjust_init"; + + public static string HC_Adjust_CallInfo = "adjust_CallInfo"; + + public static string HC_Adjust_Check_Start = "adjust_Check_Start"; + + public static string HC_Adjust_Get_Tye_X = "adjust_Get_Tye_X"; + + public static string HC_Adjust_Get_Success = "adjust_Get_Success"; + + public static string HC_Adjust_Get_Promote = "adjust_Get_Promote"; + + // ads + public static string HC_REVIEW_MODE = "Online"; + + public static string HC_MODE_SWITCH_KEY = "Mode_Switch"; + + public static string HC_SKIP_LEVEL = "skipLevel"; + + public static string HC_FIRST_SHOW = "hasFirstShowIV"; + + public static string HC_TYPE = "type"; + + public static string HC_OVER_LEVEL = "overLevel"; + + public static string HC_INTERVAL = "interval"; + + public static string HC_INTER_RULES= "inter_ad_rules"; + + public static string HC_INTER_RULES_Remote = "INTER_AD_RULES"; + + public static string HC_INTER_RULES_DEFAULT_VALUE = "[{\"type\":\"0\",\"overLevel\":\"0\",\"interval\":\"5\",\"skipLevel\":\"1\",\"IVShowTime\":\"0.0\"},{\"type\":\"1\",\"overLevel\":\"0\",\"interval\":\"5\",\"skipLevel\":\"1\",\"IVShowTime\":\"0.0\"}]"; + + + public static string HC_WECHAT_PAY_ERROR = "wechat_pay_error"; + public static string HC_WECHAT_PAY_OPEN_CUSTOMER_SERVICE_FAIL = "wechat_pay_open_customer_service_fail"; + public static string HC_WECHAT_PAY_OPEN_CUSTOMER_SERVICE_SUCCESS = "wechat_pay_open_customer_service_success"; + + public static string HC_WECHAT_PAY_CREATE_ORDER_ID = "wechat_pay_create_order_id"; + public static string HC_WECHAT_PAY_CREATE_ORDER_ID_SUCCESS = "wechat_pay_create_order_id_success"; + public static string HC_WECHAT_PAY_CREATE_ORDER_ID_FAIL = "wechat_pay_create_order_id_fail"; + + public static string HC_WECHAT_PAY_CANCEL = "wechat_pay_cancel"; + + } +} diff --git a/Assets/HCMiniSdk/Scripts/Analytics/HCInnerStaticString.cs.meta b/Assets/HCMiniSdk/Scripts/Analytics/HCInnerStaticString.cs.meta new file mode 100644 index 00000000..98e517df --- /dev/null +++ b/Assets/HCMiniSdk/Scripts/Analytics/HCInnerStaticString.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: c3345c404dc8f4571b0a992d78201a6e +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/HCMiniSdk/Scripts/Analytics/Plugins.meta b/Assets/HCMiniSdk/Scripts/Analytics/Plugins.meta new file mode 100644 index 00000000..2ec9644f --- /dev/null +++ b/Assets/HCMiniSdk/Scripts/Analytics/Plugins.meta @@ -0,0 +1,3 @@ +fileFormatVersion: 2 +guid: 4b70745006b14a9ca623ccb10a1bdd61 +timeCreated: 1699601141 \ No newline at end of file diff --git a/Assets/HCMiniSdk/Scripts/Analytics/Plugins/HCAnalytics.cs b/Assets/HCMiniSdk/Scripts/Analytics/Plugins/HCAnalytics.cs new file mode 100644 index 00000000..054a0f10 --- /dev/null +++ b/Assets/HCMiniSdk/Scripts/Analytics/Plugins/HCAnalytics.cs @@ -0,0 +1,90 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using HC.MiniJSON; + +namespace HC.Plugins +{ + public class HCAnalytics : HCSingleton, HCIBaseAnalytics + { + private Dictionary config; + + + protected override void OnInstanceCreate() + { + base.OnInstanceCreate(); + config = new Dictionary(); + } + + public void InitializeSdk() + { + HCServer.Instance.AppConfig((code, msg, appConfig) => + { + if (code != 0) return; + var appConfigContent = appConfig.content; + if (string.IsNullOrEmpty(appConfigContent)) return; + var contentData = (Dictionary)Json.Deserialize(appConfigContent); + config = contentData; + + HCAnalyticsManager.Instance.RemoteConfigListen?.Invoke(TrackEventPlatform.HC, config); + }); + } + + public TrackEventPlatform GetTrackEventPlatform() + { + return TrackEventPlatform.HC; + } + + public bool ContainsRemoteConfigKey(string key) + { + return config.Keys.Contains(key); + } + + public string GetRemoteConfigStr(string key, string defaultValue) + { + return config.TryGetValue(key, out var value) ? Convert.ToString(value) : defaultValue; + } + + public int GetRemoteConfigInt(string key, int defaultValue) + { + return config.TryGetValue(key, out var value) ? Convert.ToInt32(value) : defaultValue; + } + + public bool GetRemoteConfigBool(string key, bool defaultValue) + { + return config.TryGetValue(key, out var value) ? Convert.ToBoolean(value) : defaultValue; + } + + public void SetUserId(string userId) + { + } + + public void TrackEvent(string eventName, Dictionary eventDic = null) + { + } + + public void TrackAdRevenue(string eventName, Dictionary dictionary) + { + } + + public void SetSuperProperties(Dictionary mPoperties) + { + } + + public void UserSet(Dictionary mPoperties) + { + } + + public void Login(string userId) + { + } + + public void UserSetOnce(Dictionary properties) + { + } + + public void SetLogEnable(bool enable) + { + } + } +} \ No newline at end of file diff --git a/Assets/HCMiniSdk/Scripts/Analytics/Plugins/HCAnalytics.cs.meta b/Assets/HCMiniSdk/Scripts/Analytics/Plugins/HCAnalytics.cs.meta new file mode 100644 index 00000000..82943752 --- /dev/null +++ b/Assets/HCMiniSdk/Scripts/Analytics/Plugins/HCAnalytics.cs.meta @@ -0,0 +1,3 @@ +fileFormatVersion: 2 +guid: b635875140544bb792e41ba0b796168d +timeCreated: 1699805827 \ No newline at end of file diff --git a/Assets/HCMiniSdk/Scripts/Analytics/Plugins/HCTDAnalyticsUnity.cs b/Assets/HCMiniSdk/Scripts/Analytics/Plugins/HCTDAnalyticsUnity.cs new file mode 100644 index 00000000..132a4ffe --- /dev/null +++ b/Assets/HCMiniSdk/Scripts/Analytics/Plugins/HCTDAnalyticsUnity.cs @@ -0,0 +1,161 @@ +#if UNITY_ANDROID || UNITY_IOS || WEBGL_BYTEDANCE + +using System.Collections.Generic; +using ThinkingAnalytics; +using ThinkingData.Analytics; + +namespace HC.Plugins +{ + public class HCTDAnalyticsUnity : HCSingleton, HCIBaseAnalytics + { + public void InitializeSdk() + { + if (string.IsNullOrEmpty(HCStaticParams.TDAppId) || string.IsNullOrEmpty(HCStaticParams.TDServerUrl)) + { + HCDebugger.LogError($"[HCTDAnalytics] 初始化失败,HCStaticParams.TDAppId = {HCStaticParams.TDAppId} HCStaticParams.TDServerUrl = {HCStaticParams.TDServerUrl}"); + return; + } + + TDAnalytics.Init(HCStaticParams.TDAppId, HCStaticParams.TDServerUrl); + TDAnalytics.EnableAutoTrack(TDAutoTrackEventType.All); + TDAnalytics.EnableLog(false); + +#if WEBGL_BYTEDANCE + SetSuperProperties(HCWebGLSDKManager.AppInfo.GetBaseInfo()); +#endif + + var tdFirstEventModel = new TDFirstEventModel("new_device") + { + Properties = new Dictionary + { + ["status"] = 1 + } + }; + TDAnalytics.Track(tdFirstEventModel); +#if WEBGL_BYTEDANCE + // // 首次启动,微信的onShow回调已经执行,需要单独上报一个 start 事件 + TrackStart(); + + StarkSDKSpace.StarkSDK.API.GetStarkAppLifeCycle().OnShowWithDict += e => { TrackStart(); }; + StarkSDKSpace.StarkSDK.API.GetStarkAppLifeCycle().OnHide += TrackEnd; +#endif + } + + private static void TrackStart() + { + TDAnalytics.Track("ta_mg_show"); + TDAnalytics.TimeEvent("ta_mg_hide"); + } + + private static void TrackEnd() + { + TDAnalytics.Track("ta_mg_hide"); + TDAnalytics.Flush(); + } + + public TrackEventPlatform GetTrackEventPlatform() + { + return TrackEventPlatform.TD; + } + + public bool ContainsRemoteConfigKey(string key) + { + return false; + } + + public string GetRemoteConfigStr(string key, string defaultValue) + { + return defaultValue; + } + + public int GetRemoteConfigInt(string key, int defaultValue) + { + return defaultValue; + } + + public bool GetRemoteConfigBool(string key, bool defaultValue) + { + return defaultValue; + } + + public void SetUserId(string userId) + { + if (string.IsNullOrEmpty(HCStaticParams.TDAppId) || string.IsNullOrEmpty(HCStaticParams.TDServerUrl)) + { + return; + } + + TDAnalytics.Login(userId); + } + + public void TrackEvent(string eventName, Dictionary eventDic = null) + { + if (string.IsNullOrEmpty(HCStaticParams.TDAppId) || string.IsNullOrEmpty(HCStaticParams.TDServerUrl)) + { + return; + } + + eventDic ??= new Dictionary(); + TDAnalytics.Track(eventName, eventDic); + } + + public void TrackAdRevenue(string eventName, Dictionary eventDic) + { + } + + public void SetSuperProperties(Dictionary eventDic) + { + if (string.IsNullOrEmpty(HCStaticParams.TDAppId) || string.IsNullOrEmpty(HCStaticParams.TDServerUrl)) + { + return; + } + + eventDic ??= new Dictionary(); + TDAnalytics.SetSuperProperties(eventDic); + } + + public void UserSet(Dictionary eventDic) + { + if (string.IsNullOrEmpty(HCStaticParams.TDAppId) || string.IsNullOrEmpty(HCStaticParams.TDServerUrl)) + { + return; + } + + eventDic ??= new Dictionary(); + TDAnalytics.UserSet(eventDic); + } + + public void Login(string userId) + { + if (string.IsNullOrEmpty(HCStaticParams.TDAppId) || string.IsNullOrEmpty(HCStaticParams.TDServerUrl)) + { + return; + } + + TDAnalytics.Login(userId); + } + + public void UserSetOnce(Dictionary eventDic) + { + if (string.IsNullOrEmpty(HCStaticParams.TDAppId) || string.IsNullOrEmpty(HCStaticParams.TDServerUrl)) + { + return; + } + + eventDic ??= new Dictionary(); + TDAnalytics.UserSetOnce(eventDic); + } + + public void SetLogEnable(bool enable) + { + if (string.IsNullOrEmpty(HCStaticParams.TDAppId) || string.IsNullOrEmpty(HCStaticParams.TDServerUrl)) + { + return; + } + + TDAnalytics.EnableLog(enable); + } + } +} + +#endif \ No newline at end of file diff --git a/Assets/HCMiniSdk/Scripts/Analytics/Plugins/HCTDAnalyticsUnity.cs.meta b/Assets/HCMiniSdk/Scripts/Analytics/Plugins/HCTDAnalyticsUnity.cs.meta new file mode 100644 index 00000000..a88eb5eb --- /dev/null +++ b/Assets/HCMiniSdk/Scripts/Analytics/Plugins/HCTDAnalyticsUnity.cs.meta @@ -0,0 +1,3 @@ +fileFormatVersion: 2 +guid: 59180f68a0ee4649806978c1d94127e3 +timeCreated: 1707050776 \ No newline at end of file diff --git a/Assets/HCMiniSdk/Scripts/Analytics/Plugins/HCTDAnalyticsWebGL.cs b/Assets/HCMiniSdk/Scripts/Analytics/Plugins/HCTDAnalyticsWebGL.cs new file mode 100644 index 00000000..63b995b2 --- /dev/null +++ b/Assets/HCMiniSdk/Scripts/Analytics/Plugins/HCTDAnalyticsWebGL.cs @@ -0,0 +1,147 @@ +#if UNITY_WEBGL + +using System.Collections.Generic; + +namespace HC.Plugins +{ + public class HCTDAnalyticsWebGL : HCSingleton, HCIBaseAnalytics + { + public void InitializeSdk() + { + CallNative("InitializeSdk"); +#if WEBGL_WX + HCSDKManager.Instance.GetUserInfo(result => + { + if (result.Code == WxUserInfo.CODE_SUCCESS) + { + TrackWxUserInfo(result); + } + }); +#endif + } + +#if WEBGL_WX + public void TrackWxUserInfo(WxUserInfo result) + { + UserSet(new Dictionary + { + ["user_AvatarUrl"] = result.AvatarUrl, + ["user_City"] = result.City, + ["user_Country"] = result.Country, + ["user_Gender"] = result.Gender, + ["user_Language"] = result.Language, + ["user_NickName"] = result.NickName, + ["user_Province"] = result.Province, + }); + } +#endif + + + public TrackEventPlatform GetTrackEventPlatform() + { + return TrackEventPlatform.TD; + } + + public bool ContainsRemoteConfigKey(string key) + { + return false; + } + + public string GetRemoteConfigStr(string key, string defaultValue) + { + return defaultValue; + } + + public int GetRemoteConfigInt(string key, int defaultValue) + { + return defaultValue; + } + + public bool GetRemoteConfigBool(string key, bool defaultValue) + { + return defaultValue; + } + + public void SetUserId(string userId) + { + CallNative("SetUserId", new Dictionary + { + ["userId"] = userId + }); + } + + public void TrackEvent(string eventName, Dictionary eventDic = null) + { + eventDic ??= new Dictionary(); + eventDic["eventName"] = eventName; + CallNative("TrackEvent", eventDic); + } + + public void TrackAdRevenue(string eventName, Dictionary eventDic) + { + eventDic ??= new Dictionary(); + eventDic["eventName"] = eventName; + CallNative("TrackAdRevenue", eventDic); + } + + public void SetSuperProperties(Dictionary eventDic) + { + eventDic ??= new Dictionary(); + CallNative("SetSuperProperties", eventDic); + } + + public void UserSet(Dictionary eventDic) + { + eventDic ??= new Dictionary(); + CallNative("UserSet", eventDic); + } + + public void Login(string userId) + { + var eventDic = new Dictionary + { + ["userId"] = userId + }; + CallNative("Login", eventDic); + } + + public void UserSetOnce(Dictionary eventDic) + { + eventDic ??= new Dictionary(); + CallNative("UserSetOnce", eventDic); + } + + public void SetLogEnable(bool enable) + { + var eventDic = new Dictionary + { + ["enable"] = enable + }; + CallNative("SetLogEnable", eventDic); + } + + + private string CallNative(string methodName, Dictionary args = null) + { +#if UNITY_EDITOR + HCDebugger.LogDebug($"[CallNative] methodName = {methodName} args = {MiniJSON.Json.Serialize(args)}"); +#else + args ??= new Dictionary(); + var requestDict = new Dictionary(); + requestDict["cmd"] = "HCTDAnalytics"; + requestDict["methodName"] = methodName; + requestDict["args"] = args; + var requestMsg = MiniJSON.Json.Serialize(requestDict); + HCWxTools.UnityToWxMiniGame(requestMsg); +#endif + return ""; + } + + public string GetDistinctId() + { + return CallNative("GetDistinctId"); + } + } +} + +#endif \ No newline at end of file diff --git a/Assets/HCMiniSdk/Scripts/Analytics/Plugins/HCTDAnalyticsWebGL.cs.meta b/Assets/HCMiniSdk/Scripts/Analytics/Plugins/HCTDAnalyticsWebGL.cs.meta new file mode 100644 index 00000000..98f77bbc --- /dev/null +++ b/Assets/HCMiniSdk/Scripts/Analytics/Plugins/HCTDAnalyticsWebGL.cs.meta @@ -0,0 +1,3 @@ +fileFormatVersion: 2 +guid: cb515a17fd9d40e984cedf3a50669ef0 +timeCreated: 1705893801 \ No newline at end of file diff --git a/Assets/HCMiniSdk/Scripts/Analytics/Plugins/HCWebGL.cs b/Assets/HCMiniSdk/Scripts/Analytics/Plugins/HCWebGL.cs new file mode 100644 index 00000000..eea32f1d --- /dev/null +++ b/Assets/HCMiniSdk/Scripts/Analytics/Plugins/HCWebGL.cs @@ -0,0 +1,72 @@ +#if UNITY_WEBGL || WEBGL_BYTEDANCE +using System.Collections.Generic; + +namespace HC.Plugins +{ + public class HCWebGL : HCSingleton, HCIBaseAnalytics + { + public void InitializeSdk() + { + } + + public TrackEventPlatform GetTrackEventPlatform() + { + return TrackEventPlatform.WebGL; + } + + public bool ContainsRemoteConfigKey(string key) + { + return false; + } + + public string GetRemoteConfigStr(string key, string defaultValue) + { + return defaultValue; + } + + public int GetRemoteConfigInt(string key, int defaultValue) + { + return defaultValue; + } + + public bool GetRemoteConfigBool(string key, bool defaultValue) + { + return defaultValue; + } + + public void SetUserId(string userId) + { + } + + public void TrackEvent(string eventName, Dictionary eventDic = null) + { + HCWebGLSDKManager.Analytics.TrackEvent(eventName, eventDic); + } + + public void TrackAdRevenue(string eventName, Dictionary dictionary) + { + TrackEvent(eventName, dictionary); + } + + public void SetSuperProperties(Dictionary mPoperties) + { + } + + public void UserSet(Dictionary mPoperties) + { + } + + public void Login(string userId) + { + } + + public void UserSetOnce(Dictionary properties) + { + } + + public void SetLogEnable(bool enable) + { + } + } +} +#endif \ No newline at end of file diff --git a/Assets/HCMiniSdk/Scripts/Analytics/Plugins/HCWebGL.cs.meta b/Assets/HCMiniSdk/Scripts/Analytics/Plugins/HCWebGL.cs.meta new file mode 100644 index 00000000..09cacd51 --- /dev/null +++ b/Assets/HCMiniSdk/Scripts/Analytics/Plugins/HCWebGL.cs.meta @@ -0,0 +1,3 @@ +fileFormatVersion: 2 +guid: e3ff4a9e0f9c44968daeae2e33ae3c16 +timeCreated: 1699807529 \ No newline at end of file diff --git a/Assets/HCMiniSdk/Scripts/Analytics/TrackEventPlatform.cs b/Assets/HCMiniSdk/Scripts/Analytics/TrackEventPlatform.cs new file mode 100644 index 00000000..2ab263da --- /dev/null +++ b/Assets/HCMiniSdk/Scripts/Analytics/TrackEventPlatform.cs @@ -0,0 +1,15 @@ +namespace HC +{ + /// + /// 统计上报到哪些平台 + /// + public enum TrackEventPlatform + { + All, + Firebase, + TD, + Adjust, + HC, + WebGL, + } +} \ No newline at end of file diff --git a/Assets/HCMiniSdk/Scripts/Analytics/TrackEventPlatform.cs.meta b/Assets/HCMiniSdk/Scripts/Analytics/TrackEventPlatform.cs.meta new file mode 100644 index 00000000..394ce4db --- /dev/null +++ b/Assets/HCMiniSdk/Scripts/Analytics/TrackEventPlatform.cs.meta @@ -0,0 +1,3 @@ +fileFormatVersion: 2 +guid: 11b6b2f9d1244458846d7f1fcdb51549 +timeCreated: 1699460608 \ No newline at end of file diff --git a/Assets/Plugins/ByteGame/com.bytedance.starksdk/Editor.meta b/Assets/HCMiniSdk/Scripts/Editor.meta similarity index 77% rename from Assets/Plugins/ByteGame/com.bytedance.starksdk/Editor.meta rename to Assets/HCMiniSdk/Scripts/Editor.meta index df761fea..9f456091 100644 --- a/Assets/Plugins/ByteGame/com.bytedance.starksdk/Editor.meta +++ b/Assets/HCMiniSdk/Scripts/Editor.meta @@ -1,5 +1,5 @@ fileFormatVersion: 2 -guid: c1c81f12ad1f54a85b1eefb3410c561c +guid: 33da667fb23034afe8433c0286a3ac25 folderAsset: yes DefaultImporter: externalObjects: {} diff --git a/Assets/HCMiniSdk/Scripts/Editor/HCToolEditor.cs b/Assets/HCMiniSdk/Scripts/Editor/HCToolEditor.cs new file mode 100644 index 00000000..b1160840 --- /dev/null +++ b/Assets/HCMiniSdk/Scripts/Editor/HCToolEditor.cs @@ -0,0 +1,263 @@ +using System; +using System.Collections.Generic; +using System.IO; +using UnityEditor; +using UnityEngine; + +#if WEBGL_WX +using WeChatWASM; +#endif + +namespace HC.Scripts.Editor +{ + public class HCToolEditor + { + [MenuItem("HCMiniSDK/Clear Datas")] + public static void ClearDatas() + { + PlayerPrefs.DeleteAll(); + } + + [MenuItem("HCMiniSDK/Douyin Game Build")] + public static void DouyinGameBuild() + { + + } +#if WEBGL_WX + [MenuItem("HCMiniSDK/WX Game Build")] + public static void WxGameBuild() + { + var startText = "// hcmini sdk"; + + var config = UnityUtil.GetEditorConf(); + var mingGameRoot = config.ProjectConf.DST; + + UpdateGameJsCode(mingGameRoot, startText); + CopyUmengSDK(mingGameRoot, startText); + UpdateWxJsCode(mingGameRoot, startText); + Debug.Log("修改微信小游戏工程成功."); + } + + + private static void CopyUmengSDK(string mingGameRoot, string startText) + { + var umaSDkJsPath = Path.Combine(mingGameRoot, "minigame", "utils", "uma.min.js"); + var hachiminiSDkJsPath = Path.Combine(mingGameRoot, "minigame", "utils", "hachimini.js"); + var tdanalyticsSDkJsPath = Path.Combine(mingGameRoot, "minigame", "utils", "tdanalytics.mg.wx.min.js"); + + if (File.Exists(umaSDkJsPath)) + { + Debug.LogError($"uma sdk exit : {umaSDkJsPath}"); + return; + } + + var umamin = FindFilePath("uma.min"); + + Debug.Log(umamin); + + var folderPath = Path.GetDirectoryName(umaSDkJsPath); + if (folderPath != null && !Directory.Exists(folderPath)) + { + Directory.CreateDirectory(folderPath); + Console.WriteLine("文件夹创建成功!"); + } + + File.Copy(umamin, umaSDkJsPath); + if (!(string.IsNullOrEmpty(HCStaticParams.TDAppId) || string.IsNullOrEmpty(HCStaticParams.TDServerUrl))) + { + File.Copy(FindFilePath("hachimini"), hachiminiSDkJsPath); + File.Copy(FindFilePath("tdanalytics.mg.wx.min"), tdanalyticsSDkJsPath); + Debug.Log("tdanalytics"); + } + } + + private static string FindFilePath(string fileName) + { + var guids = AssetDatabase.FindAssets(fileName); + var jsFilePath = ""; + + if (guids.Length > 0) + { + jsFilePath = AssetDatabase.GUIDToAssetPath(guids[0]); + } + + return jsFilePath; + } + + private static void UpdateWxJsCode(string mingGameRoot, string startText) + { + var codeJsPath = Path.Combine(mingGameRoot, "minigame", "game.js"); + var readLines = File.ReadLines(codeJsPath); + var isFirstRow = true; + var isWrite = true; + var codeLines = new List(); + + foreach (var line in readLines) + { + if (isFirstRow) + { + isFirstRow = false; + if (startText.Equals(line)) + { + Debug.LogError("已经修改过了,不在修改了。"); + return; + } + + codeLines.Add(startText + "\n"); + codeLines.Add(line); + continue; + } + + + if (line.StartsWith("function") && isWrite) + { + isWrite = false; + codeLines.Add("\n"); + codeLines.Add("import uma from './utils/uma.min.js'"); + codeLines.Add("uma.init({"); + codeLines.Add(" appKey: '" + HCStaticParams.UMENG_ID + "',"); + codeLines.Add(" useOpenid: false, // default true"); + codeLines.Add(" debug: false"); + codeLines.Add("})"); + codeLines.Add(""); + codeLines.Add("wx.uma = uma;"); + codeLines.Add("\n"); + codeLines.Add("\n"); + +#if UNITY_WEBGL + if (!(string.IsNullOrEmpty(HCStaticParams.TDAppId) || string.IsNullOrEmpty(HCStaticParams.TDServerUrl))) + { + codeLines.Add($@" +import HaichiMini from './utils/hachimini'; +HaichiMini.init('{HCStaticParams.TDAppId}','{HCStaticParams.TDServerUrl}'); +wx.HaichiMini = HaichiMini; +"); + } + + codeLines.Add("var new_device = wx.getStorageSync('new_device');"); + codeLines.Add("if(!new_device){"); + codeLines.Add("var new_device_data = {};"); + codeLines.Add("if(wx.HaichiMini){"); + codeLines.Add("wx.HaichiMini.trackEvent('new_device', new_device_data);"); + codeLines.Add("new_device_data['ss_distinct_id'] = wx.HaichiMini.getDistinctId();"); + codeLines.Add("}"); + codeLines.Add("if(wx.uma){"); + codeLines.Add("wx.uma.trackEvent('new_device', new_device_data);"); + codeLines.Add("}"); + codeLines.Add("wx.setStorageSync('new_device', true);"); + codeLines.Add("}"); + + + codeLines.Add("\n"); + codeLines.Add("wx.reportEvent('hcinit',{})"); + codeLines.Add("\n"); +#endif + } + + string code = @" +const toukaType = e.type; +const toukaData = e.data; +const toukaCostTimeMs = toukaData.costTimeMs; +const toukaIsHighPerformance = toukaData.isHighPerformance; +const toukaIsVisible = toukaData.isVisible; +const toukaLoadDataPackageFromSubpackage = toukaData.loadDataPackageFromSubpackage; +const toukaNeedDownloadDataPackage = toukaData.needDownloadDataPackage; +const toukaRunTimeMs = toukaData.runTimeMs; +const toukaUseCodeSplit = toukaData.useCodeSplit; + +const eventData = { + ""type"": toukaType, + ""costTimeMs"": toukaCostTimeMs, + ""isHighPerformance"": toukaIsHighPerformance, + ""isVisible"": toukaIsVisible, + ""loadDataPackageFromSubpackage"": toukaLoadDataPackageFromSubpackage, + ""needDownloadDataPackage"": toukaNeedDownloadDataPackage, + ""runTimeMs"": toukaRunTimeMs, + ""useCodeSplit"": toukaUseCodeSplit +}; + +eventData['wx_version'] = wx.getAccountInfoSync().miniProgram.version; +eventData['wx_model'] = wx.getSystemInfoSync().model; +eventData['wx_brand'] = wx.getSystemInfoSync().brand; +eventData['wx_language'] = wx.getSystemInfoSync().language; +eventData['wx_system'] = wx.getSystemInfoSync().system; +eventData['wx_platform'] = wx.getSystemInfoSync().platform; +eventData['wx_env_version'] = wx.getAccountInfoSync().miniProgram.envVersion; + +if (e.type === launchEventType.launchPlugin) { + wx.uma.trackEvent(""launchEventType.launchPlugin"", eventData); + if(wx.HaichiMini) wx.HaichiMini.trackEvent(""launchEventType_launchPlugin"", eventData); + wx.reportEvent('launchEventType.launchPlugin'.toLowerCase().replace('.','_'),eventData); +} +if (e.type === launchEventType.loadWasm) { + wx.uma.trackEvent(""launchEventType.loadWasm"", eventData); + if(wx.HaichiMini) wx.HaichiMini.trackEvent(""launchEventType_loadWasm"", eventData); + wx.reportEvent('launchEventType.loadWasm'.toLowerCase().replace('.','_'),eventData); +} +if (e.type === launchEventType.compileWasm) { + wx.uma.trackEvent(""launchEventType.compileWasm"", eventData); + if(wx.HaichiMini) wx.HaichiMini.trackEvent(""launchEventType_compileWasm"", eventData); + wx.reportEvent('launchEventType.compileWasm'.toLowerCase().replace('.','_'),eventData); +} +if (e.type === launchEventType.loadAssets) { + wx.uma.trackEvent(""launchEventType.loadAssets"", eventData); + if(wx.HaichiMini) wx.HaichiMini.trackEvent(""launchEventType_loadAssets"", eventData); + wx.reportEvent('launchEventType.loadAssets'.toLowerCase().replace('.','_'),eventData); +} +if (e.type === launchEventType.readAssets) { + wx.uma.trackEvent(""launchEventType.readAssets"", eventData); + if(wx.HaichiMini) wx.HaichiMini.trackEvent(""launchEventType_readAssets"", eventData); + wx.reportEvent('launchEventType.readAssets'.toLowerCase().replace('.','_'),eventData); +} +if (e.type === launchEventType.prepareGame) { + wx.uma.trackEvent(""launchEventType.prepareGame"", eventData); + if(wx.HaichiMini) wx.HaichiMini.trackEvent(""launchEventType_prepareGame"", eventData); + wx.reportEvent('launchEventType.prepareGame'.toLowerCase().replace('.','_'),eventData); +} +"; + codeLines.Add(line); + if (line.Contains("onLaunchProgress")) + { + codeLines.Add("\n"); + codeLines.Add(code + "\n"); + codeLines.Add("\n"); + } + } + + File.WriteAllLines(codeJsPath, codeLines); + Debug.Log($"wx 代码写入成功 {codeJsPath}"); + } + + private static void UpdateGameJsCode(string mingGameRoot, string startText) + { + var unityJsPath = Path.Combine(mingGameRoot, "minigame", "webgl.wasm.framework.unityweb.js"); + + // Read the existing text from the file + var existingText = File.ReadAllText(unityJsPath); + + if (existingText.StartsWith(startText)) + { + Debug.LogError("已经保存过了"); + return; + } + + var guids = AssetDatabase.FindAssets("hcmini-sdk"); + var jsFilePath = ""; + + if (guids.Length > 0) + { + jsFilePath = AssetDatabase.GUIDToAssetPath(guids[0]); + } + + Debug.Log(jsFilePath); + + + // Combine the new text and existing text + var combinedText = startText + Environment.NewLine + File.ReadAllText(jsFilePath) + Environment.NewLine + existingText; + + // Write the combined text back to the file + File.WriteAllText(unityJsPath, combinedText); + } +#endif + } +} \ No newline at end of file diff --git a/Assets/HCMiniSdk/Scripts/Editor/HCToolEditor.cs.meta b/Assets/HCMiniSdk/Scripts/Editor/HCToolEditor.cs.meta new file mode 100644 index 00000000..655ff412 --- /dev/null +++ b/Assets/HCMiniSdk/Scripts/Editor/HCToolEditor.cs.meta @@ -0,0 +1,3 @@ +fileFormatVersion: 2 +guid: 1a7c1d662b514861979c8a6faa4efbe2 +timeCreated: 1699884691 \ No newline at end of file diff --git a/Assets/HCMiniSdk/Scripts/Editor/hcmini-sdk.js b/Assets/HCMiniSdk/Scripts/Editor/hcmini-sdk.js new file mode 100644 index 00000000..3889f7b6 --- /dev/null +++ b/Assets/HCMiniSdk/Scripts/Editor/hcmini-sdk.js @@ -0,0 +1,173 @@ +/** + * wx call unity + * @param cmd cmd + * @param content content + * @constructor + */ +function WxCallUnity(cmd, content) { + GameGlobal.Module.SendMessage("HCWxTools", "OnWxCallUnity", cmd + "#@#" + content); +} + +function _WxCallUnity(cmd, adPostion, adUnit, code, msg) { + let result = { + "cmd": cmd, + "adPostion": adPostion, + "adUnit": adUnit, + "code": code, + "msg": msg, + }; + WxCallUnity(cmd, JSON.stringify(result)) +} + +var tdId = null; +function UnityToWxMiniGame(reqStr) { + if(wx.HaichiMini && !tdId){ + var temp = wx.HaichiMini.getDistinctId(); + if(temp && temp!=tdId){ + tdId = temp; + WxCallUnity("getDistinctId", tdId); + } + } + let res = JSON.parse(reqStr); + let cmd = res["cmd"]; + switch (cmd) { + case "LoadNative": + LoadNative(res["adUnit"], res); + break + case "RemoveNative": + RemoveNative(res["adUnit"], res); + break + case "ShowNative": + ShowNative(res["adUnit"], res); + break + case "DestroyNative": + DestroyNative(res["adUnit"], res); + break + case "isShow": + return isShow(res["adUnit"], res); + break + case "umeng": + umeng(res["eventName"], res["data"], res); + break + case "HCTDAnalytics": + if(wx.HaichiMini){ + return wx.HaichiMini.HCTDAnalytics(res); + } + break + } + + return ""; +} + +function umeng(eventName, data, res) { + if(data){ + data["wx_version"] = wx.getAccountInfoSync().miniProgram.version; + data["wx_model"] = wx.getSystemInfoSync().model; + data["wx_brand"] = wx.getSystemInfoSync().brand; + data["wx_language"] = wx.getSystemInfoSync().language; + data["wx_system"] = wx.getSystemInfoSync().system; + data["wx_platform"] = wx.getSystemInfoSync().platform; + data["wx_env_version"] = wx.getAccountInfoSync().miniProgram.envVersion; + } + wx.uma.trackEvent(eventName, data); +} + +let dic = {} + +function isShow(adUnit, res) { + let nativeAd = dic[adUnit]; + return nativeAd && nativeAd.isShow(); +} + +function LoadNative(adUnit, res) { + if (!res.top || !res.left || !res.width) { + _WxCallUnity("onError", res.adPostion, res.adUnit, -99, "res is null") + return; + } + let style = { + top: res.top, + left: res.left, + width: res.width, + fixed: res._fixed, + }; + + let nativeAd = wx.createCustomAd({ + adUnitId: adUnit, + style: style + }); + nativeAd.onLoad(() => { + _WxCallUnity("onLoad", res.adPostion, res.adUnit, 0, "") + }) + nativeAd.onClose(closeRes => { + console.log('关闭原生模板广告' + adUnit, closeRes, res); + _WxCallUnity("onClose", res.adPostion, res.adUnit, 0, "") + }); + nativeAd.onError(err => { + // console.log('原生模板CustomAd 广告加载失败:' + adUnit, err); + _WxCallUnity("onError", res.adPostion, res.adUnit, err.errCode, err.errMsg) + }); + nativeAd.onHide(() => { + // console.log('隐藏原生模板广告' + adUnit, res); + _WxCallUnity("onHide", res.adPostion, res.adUnit, 0, "") + }); + + dic[adUnit] = nativeAd + _WxCallUnity("newNativeAdObject", res.adPostion, res.adUnit, 0, ""); +} + +function RemoveNative(adUnit, res) { + let nativeAd = dic[adUnit]; + if (nativeAd) { + nativeAd.hide() + .then(() => { + _WxCallUnity("onHideSuccess", res.adPostion, res.adUnit, 0, "") + }) + .catch(err => { + _WxCallUnity("onHideFail", res.adPostion, res.adUnit, err.errCode, err.errMsg) + }); + } else { + _WxCallUnity("onHideFail", res.adPostion, res.adUnit, -98, "native ad don't exit!") + } +} + +function DestroyNative(adUnit, res) { + let nativeAd = dic[adUnit]; + if (nativeAd) { + nativeAd.destroy() + .then(() => { + _WxCallUnity("onDestroySuccess", res.adPostion, res.adUnit, 0, "") + }) + .catch(err => { + _WxCallUnity("onDestroyFail", res.adPostion, res.adUnit, err.errCode, err.errMsg) + }); + } else { + _WxCallUnity("onDestroyFail", res.adPostion, res.adUnit, -97, "native ad don't exit!") + } +} + + +function ShowNative(adUnit, res) { + let nativeAd = dic[adUnit]; + + if (nativeAd && nativeAd.isDestroy) { + console.log("native ad 被销毁,或者不存在", nativeAd); + _WxCallUnity("onShowFail", res.adPostion, res.adUnit, -97, "native destroy"); + _WxCallUnity("onDestroy", res.adPostion, res.adUnit, -97, "native destroy - 1"); + return; + } + + if (nativeAd.isDestroyed()) { + // 通常是点击不感兴趣被关闭的 + _WxCallUnity("onShowFail", res.adPostion, res.adUnit, -97, "native destroy"); + _WxCallUnity("onDestroy", res.adPostion, res.adUnit, -95, "native destroy - 2"); + return; + } + nativeAd.show() + .then(() => { + _WxCallUnity("onShowSuccess", res.adPostion, res.adUnit, 0, "") + }) + .catch(err => { + _WxCallUnity("onShowFail", res.adPostion, res.adUnit, err.errCode, err.errMsg) + }); + +} \ No newline at end of file diff --git a/Assets/HCMiniSdk/Scripts/Editor/hcmini-sdk.js.meta b/Assets/HCMiniSdk/Scripts/Editor/hcmini-sdk.js.meta new file mode 100644 index 00000000..bdf7d410 --- /dev/null +++ b/Assets/HCMiniSdk/Scripts/Editor/hcmini-sdk.js.meta @@ -0,0 +1,3 @@ +fileFormatVersion: 2 +guid: 091afc5e309c4800b36a8c2ab0bf8caf +timeCreated: 1699846127 \ No newline at end of file diff --git a/Assets/HCMiniSdk/Scripts/Editor/sdk.meta b/Assets/HCMiniSdk/Scripts/Editor/sdk.meta new file mode 100644 index 00000000..4ea50078 --- /dev/null +++ b/Assets/HCMiniSdk/Scripts/Editor/sdk.meta @@ -0,0 +1,3 @@ +fileFormatVersion: 2 +guid: 9d7cac6703a14be88f4791c71a19f9aa +timeCreated: 1701832195 \ No newline at end of file diff --git a/Assets/HCMiniSdk/Scripts/Editor/sdk/utils.meta b/Assets/HCMiniSdk/Scripts/Editor/sdk/utils.meta new file mode 100644 index 00000000..08753f80 --- /dev/null +++ b/Assets/HCMiniSdk/Scripts/Editor/sdk/utils.meta @@ -0,0 +1,3 @@ +fileFormatVersion: 2 +guid: dca6f3ed13be45e182551366fcc3befd +timeCreated: 1701832195 \ No newline at end of file diff --git a/Assets/HCMiniSdk/Scripts/Editor/sdk/utils/hachimini.js b/Assets/HCMiniSdk/Scripts/Editor/sdk/utils/hachimini.js new file mode 100644 index 00000000..e901de23 --- /dev/null +++ b/Assets/HCMiniSdk/Scripts/Editor/sdk/utils/hachimini.js @@ -0,0 +1,111 @@ +"use strict"; +var TDAnalytics = require("./tdanalytics.mg.wx.min.js"); + +function init(appId, ServerUrl) { + // TA SDK 配置对象 + var config = { + appId: appId, // 项目 APP ID + serverUrl: ServerUrl, // 上报地址 + enableLog: false, + autoTrack: { + appShow: true, // 自动采集 ta_mg_show + appHide: true, // 自动采集 ta_mg_hide + } + }; + // 初始化 + TDAnalytics.init(config); + + // 添加微信的基础属性, 有一些td没加上 + var eventData = {}; + eventData['wx_version'] = wx.getAccountInfoSync().miniProgram.version; + eventData['wx_model'] = wx.getSystemInfoSync().model; + eventData['wx_brand'] = wx.getSystemInfoSync().brand; + eventData['wx_language'] = wx.getSystemInfoSync().language; + eventData['wx_system'] = wx.getSystemInfoSync().system; + eventData['wx_platform'] = wx.getSystemInfoSync().platform; + eventData['wx_env_version'] = wx.getAccountInfoSync().miniProgram.envVersion; + TDAnalytics.setSuperProperties(eventData); +} + +function HCTDAnalytics(req) { + if (req["cmd"] != "HCTDAnalytics") { + return; + } + delete req.cmd; + const methodName = req["methodName"]; + + const args = req["args"]; + switch (methodName) { + case "InitializeSdk": + break; + case "SetUserId": + TDAnalytics.login(args["userId"]); + break; + case "TrackEvent": + const eventName = args["eventName"] + delete args.methodName; + delete args.eventName; + TDAnalytics.track({ + eventName: eventName, // 事件名称 + properties: args //事件属性 + }); + break; + case "TrackAdRevenue": + break; + case "SetSuperProperties": + delete args.methodName; + TDAnalytics.setSuperProperties(args);//设置公共事件属性 + break; + case "UserSet": + delete args.methodName; + TDAnalytics.userSet({ + properties: args + });//设置公共事件属性 + break; + case "Login": + TDAnalytics.login(args["userId"]); + break; + case "UserSetOnce": + delete args.methodName; + TDAnalytics.userSetOnce({ + properties: args + }); + break; + case "SetLogEnable": + break; + case "GetDistinctId": + return TDAnalytics.getDistinctId(); + } + return ""; +} + +function trackEvent(eventName, args) { + if (eventName == "new_device") { + TDAnalytics.trackFirst({ + "eventName":eventName, + }) + + console.log("new_device") + return + } + TDAnalytics.track({ + eventName: eventName, // 事件名称 + properties: args //事件属性 + }); + +} +function getDistinctId() { + return TDAnalytics.getDistinctId(); +} + + + +var HaichiMini = { + init, + HCTDAnalytics, + trackEvent, + getDistinctId, +} + +wx.HaichiMini = HaichiMini; +module.exports = HaichiMini; \ No newline at end of file diff --git a/Assets/HCMiniSdk/Scripts/Editor/sdk/utils/hachimini.js.meta b/Assets/HCMiniSdk/Scripts/Editor/sdk/utils/hachimini.js.meta new file mode 100644 index 00000000..53131d78 --- /dev/null +++ b/Assets/HCMiniSdk/Scripts/Editor/sdk/utils/hachimini.js.meta @@ -0,0 +1,3 @@ +fileFormatVersion: 2 +guid: b8144dd3353143e99ff4ec3ed8148670 +timeCreated: 1705918819 \ No newline at end of file diff --git a/Assets/HCMiniSdk/Scripts/Editor/sdk/utils/tdanalytics.mg.wx.min.js b/Assets/HCMiniSdk/Scripts/Editor/sdk/utils/tdanalytics.mg.wx.min.js new file mode 100644 index 00000000..2f34606b --- /dev/null +++ b/Assets/HCMiniSdk/Scripts/Editor/sdk/utils/tdanalytics.mg.wx.min.js @@ -0,0 +1 @@ +"use strict";function _typeof(e){return(_typeof="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(e){return typeof e}:function(e){return e&&"function"==typeof Symbol&&e.constructor===Symbol&&e!==Symbol.prototype?"symbol":typeof e})(e)}function _classCallCheck(e,t){if(!(e instanceof t))throw new TypeError("Cannot call a class as a function")}function _defineProperties(e,t){for(var n=0;n>6|192,63&s|128):String.fromCharCode(s>>12|224,s>>6&63|128,63&s|128),null!==o&&(i>18&63,n=r>>12&63,i=r>>6&63,r=63&r,u[o++]=a.charAt(t)+a.charAt(n)+a.charAt(i)+a.charAt(r),se.length)&&e.substr(0,t.length)===t},endsWith:function(e,t){return!(!t||0===e.length||t.length>e.length)&&e.substring(e.length-t.length)===t},assign:function(e){if(null==e)throw new TypeError("Cannot convert undefined or null to object");for(var t=Object(e),n=1;n>>6)+P(128|63&t):P(224|t>>>12&15)+P(128|t>>>6&63)+P(128|63&t);var t=65536+1024*(e.charCodeAt(0)-55296)+(e.charCodeAt(1)-56320);return P(240|t>>>18&7)+P(128|t>>>12&63)+P(128|t>>>6&63)+P(128|63&t)}function T(e){var t=[0,2,1][e.length%3],e=e.charCodeAt(0)<<16|(1>>18),D.charAt(e>>>12&63),2<=t?"=":D.charAt(e>>>6&63),1<=t?"=":D.charAt(63&e)].join("")}function k(e){return e.replace(x,w).replace(/[\s\S]{1,3}/g,T)}function R(e){switch(e.length){case 4:var t=((7&e.charCodeAt(0))<<18|(63&e.charCodeAt(1))<<12|(63&e.charCodeAt(2))<<6|63&e.charCodeAt(3))-65536;return P(55296+(t>>>10))+P(56320+(1023&t));case 3:return P((15&e.charCodeAt(0))<<12|(63&e.charCodeAt(1))<<6|63&e.charCodeAt(2));default:return P((31&e.charCodeAt(0))<<6|63&e.charCodeAt(1))}}function U(e){var t=e.length,n=t%4,e=(0>>16),P(e>>>8&255),P(255&e)]).length-=[0,0,2,1][n];return e.join("")}function b(e){return e.replace(/[\s\S]{1,4}/g,U).replace(M,R)}var D="ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/",L=function(e){for(var t={},n=0,i=e.length;n=this.maxListener?console.error("监听器的最大数量是%d,您已超出限制",this.maxListener):n[e]instanceof Array?-1===n[e].indexOf(t)&&n[e].push(t):n[e]=[].concat(t)};G.prototype.emit=function(e){var t=Array.prototype.slice.call(arguments);t.shift();var n=this.listeners;n[e]instanceof Array&&n[e].forEach(function(e){e.apply(null,t)})};G.prototype.listeners=function(e){return this.listeners[e]};G.prototype.setMaxListeners=function(e){this.maxListener=e};G.prototype.removeListener=function(e,t){var n=this.listeners,t=(n[e]||[]).indexOf(t);0<=t&&n[e].splice(t,1)};G.prototype.removeAllListener=function(e){this.listeners[e]=[]};G.prototype.once=function(n,i){var r=this;this.on(n,function e(){var t=Array.prototype.slice.call(arguments);i.apply(null,t);r.removeListener(n,e)})};var F=new G,q=0,H=1,Y=Object.create(null),W=null,J=!1,B={minFetchIntervalSeconds:43200};function X(e){e&&y.each(e,function(e){Y[e.k]=e})}function z(){var t=this;this.STORAGE_NAME=null;F.on(q,function(e){a().v("云配初始化开始...");t.init(e)})}z.prototype={setDefaultValues:function(e){J&&y.isObject(e)&&y.each(e,function(e,t){Y[t]&&Y[t].v||(Y[t]={v:e})})},getValue:function(t){a().v("从配置项中读取 value, 当前配置为: ",Y);a().v("待读取的 key : ",t);try{if(!J)return;var e=Y[t]||{};a().v("读取相应配置ing..., 结果为: ",e);if(y.isNumber(e.e)&&y.isNumber(e.g)){a().v("读取到相应配置, 开始数据上报...");!function(e){var t={appkey:h().appKey(),sdkType:u.getSdkType(),expId:e&&e.e,groupId:e&&e.g,clientTs:Date.now(),key:e&&e.k,value:e&&e.v,umid:d().getId()};try{u.request({url:v.ABLOG_URL,method:"POST",data:[t],success:function(e){e&&200===e.statusCode?a().v("上传数据成功",t):a().w("ablog 请求成功, 返回结果异常 ",e)},fail:function(e){a().w("ablog 请求数据错误 ",t,e)}})}catch(e){a().w("urequest 调用错误",e)}}(e)}return e.v}catch(e){a().w("getValue error, key: ",t)}},active:function(e){try{if(!J)return;var t,n;e&&e.params&&(t=e.params);e&&e.callback&&(n=e.callback);a().v("激活配置项: ",t);if(t){a().v("本地已缓存的配置项: ",Y);X(t);a().v("合并后的配置项: ",Y);n&&n(Y);a().v("active 结束")}else{a().v("配置项为空!! 读取本地配置...");u.getStorage(this.STORAGE_NAME,function(e){if(e){X((e=y.JSONDecode(e)||{}).params);a().v("当前本地配置项为: ",Y);n&&n(Y);a().v("active 结束")}else a().v("当前本地配置项为空, 退出激活")})}}catch(e){a().w("SDK active 错误",e)}},init:function(e){if(e.appKey){W=e.appKey;this.STORAGE_NAME="um_remote_config_{{"+W+"}}"}if(W)if(J)a().w("SDK 已经初始化, 请避免重复初始化");else{J=!0;this.setOptions(e);this.active()}else a().err("请检查您的小程序 appKey, appKey 不能为空")},setOptions:function(e){if(y.isObject(e)){e=e.minFetchIntervalSeconds;y.isNumber(e)&&(B.minFetchIntervalSeconds=Math.max(e,5))}},fetch:function(e){if(J&&this.STORAGE_NAME){var i,r;e&&e.active&&(i=e.active);e&&e.callback&&(r=e.callback);var o=this;u.getStorage(this.STORAGE_NAME,function(e){a().v("开始读缓存 data is ",e);if((e=y.JSONDecode(e)||{}).params&&e.ts&&Date.now()-e.ts<1e3*B.minFetchIntervalSeconds){a().v("缓存数据存在, 并且本次触发时间距离上次fetch触发时间未超过 fetch 时间间隔, 无需 fetch");r&&r(e.params)}else K(function(t){a().v("缓存数据不存在, 构建 fetch body :",t);try{u.request({url:v.FETCH_URL,method:"POST",data:t,success:function(e){if(e&&200===e.statusCode&&e.data&&e.data.cc){a().v("fetch 请求成功, 响应数据: ",e.data);var t=Object.create(null);y.each(e.data.cc,function(e){t[e.k]=e});var n={ts:Date.now(),params:t};a().v("开始缓存 fetch 请求的云配置结果...");u.setStorage(o.STORAGE_NAME,y.JSONEncode(n),function(e){a().v("缓存云配置成功, 缓存数据为: ",n);a().v("缓存云配置成功, 成功消息为: ",e);a().v("云配拉取数据是否自动激活: ",i);if(e&&i){a().v("激活云配置...");o.active({params:t,callback:r})}})}else{a().w("fetch 请求成功,返回结果异常 ",e.data);r&&r()}},fail:function(e){a().w("fetch请求数据错误 ",t,e);r&&r()}})}catch(e){a().w("urequest调用错误",e)}})})}}};var Q,Z=function(){return Q=Q||new $};function $(){var t=!1,n=null,i=[];this.addPageStart=function(e){if(e&&!t){n={ts:Date.now(),path:e,page_name:e};t=!0}};this.addPageEnd=function(e){if(t&&e&&n&&e===n.page_name){e=Date.now()-n.ts;n.duration=Math.abs(e);i.push(n);n=null;t=!1}};this.get=function(){return i};this.getCurrentPage=function(){return n};this.clear=function(){i.length=0}}var ee={};function te(){return function(e){var t,n=[];for(t in e)"_um_ssrc"!==t&&"_um_sts"!==t&&n.push(t+"="+e[t]);return n.join("&")}(ee)}var ne,ie,re,oe=(ie=[],function(){return ne=ne||new se});function se(){return{add:function(e,t){a().v("share origin: %o",e);var n={title:e&&e.title,path:e&&e.path&&e.path.split("?")[0],_um_sts:Date.now()};n.path&&1s.SESSION_INTERVAL){t=!0;!function(e){try{var t=(we||{}).options||{},n=p.assign({},function(e){var t,n={};for(t in e)0===t.indexOf("_um_")&&(n[t]=e[t]);a().v("query: ",e);a().v("_um_params: ",n);return n}(e.query));n.path=e.path||t.path;n.scene=e.scene?u.getPlatform()+"_"+e.scene:t.scene;t=e.referrerInfo;t&&(n.referrerAppId=t.appId);a().v("session options: ",n);t=n[s.UM_SSRC];t&&oe().setShareSource(t);t=Date.now();we={id:p.getRandomStr(10)+t,start_time:t,options:n}}catch(e){a().e("生成新session失败: ",e)}}(e);a().v("开始新的session(%s): ",we.id,we)}else a().v("延续上一次session(%s): %s ",we.id,n.toLocaleTimeString(),we);return t},pause:function(){!function(){if(we){var e=new Date;we.end_time=e.getTime();"number"!=typeof we.duration&&(we.duration=0);we.duration=we.end_time-Ne;A().set(s.CURRENT_SESSION,we);a().v("退出会话(%s): %s ",we.id,e.toLocaleTimeString(),we)}}()},getCurrentSessionId:function(){return(we||{}).id},getCurrentSession:function(){return we},cloneCurrentSession:function(){return p.clone(we)}}}function Re(e){var t=null;switch(e){case Se.HALF_SESSION:t=function(){var e=null,t=Te().cloneCurrentSession();t&&(e={header:{st:"1"},analytics:{sessions:[t]}});return e}();break;case Se.CLOSE_SESSION:t=function(){var e=null,t={},n=Te().cloneCurrentSession();if(n){var i=Z().get(),r=oe().get();Array.isArray(i)&&i.length&&(n.pages=p.clone(i));Array.isArray(r)&&r.length&&(n.shares=p.clone(r));Z().clear();oe().clear();t.sessions=[n]}n=de().getEkvs();if(n){t.ekvs=p.clone(n);de().clear()}(t.sessions||t.ekvs)&&(e={analytics:t});return e}();break;case Se.EKV:t=function(){var e=null,t=de().getEkvs();if(t){e={analytics:{ekvs:p.clone(t)}};de().clear()}return e}()}return t}var Ue={sessions:"sn",ekvs:"e",active_user:"active_user"},be={sdk_type:"sdt",access:"ac",access_subtype:"acs",device_model:"dm",language:"lang",device_type:"dt",device_manufacturer:"dmf",device_name:"dn",platform_version:"pv",id_type:"it",font_size_setting:"fss",os_version:"ov",device_manuid:"did",platform_sdk_version:"psv",device_brand:"db",appkey:"ak",_id:"id",id_tracking:"itr",imprint:"imp",sdk_version:"sv",resolution:"rl",testToken:"ttn"},De={uuid:"ud",unionid:"und",openid:"od",anonymousid:"nd",alipay_id:"ad",device_id:"dd",userid:"puid"};function Le(e){return{h:function(e,t){var n=Pe(e,t);e&&e.id_tracking&&(n[t.id_tracking||"id_tracking"]=Pe(e.id_tracking,De));return n}(e.header,be),a:function(e,t){var n={};if(e)for(var i in e)e[i]&&(n[t[i]]=e[i]);return n}(e.analytics,Ue)}}function Pe(e,t){var n,i={};for(n in e)t[n]?i[t[n]]=e[n]:i[n]=e[n];return i}var xe=re="";function Me(n,i,r,e){Ee.instance().setIdType(d().getIdType());Ee.instance().setIdTracking(d().getIdTracking());var t=d().getUserId();t&&n.analytics&&(n.analytics.active_user={puid:t,provider:d().getProvider()});t=p.clone(Ee.instance().get());n.header=p.assign(t,n.header,{ts:Date.now(),testToken:xe,traceId:p.getRandomStr(10)+Date.now()+p.getRandomStr(9)});var t=Le(n),o=O.stringify(t),t={url:s.LOG_URL,method:"POST",data:C.encode(o),success:function(e){var t=e.code||e.status||e.statusCode;if(200===t||413===t){a().i("数据发送成功: ",n,o);!function(e){if(e){Ee.instance().setItem(s.IMPRINT,e);V.set(e);V.save();a().v("imprint: ",V.getImpObj());V.getItem("ttn_invalid")&&(xe="")}}((e.data||{}).imprint);"function"==typeof i&&i(e)}else{a().w("数据发送失败: ",o);"function"==typeof r&&r()}},fail:function(e){a().w("超时: ",o);"function"==typeof r&&r()},complete:function(){"function"==typeof e&&e()}};u.request(p.assign(t,{header:{"Content-Type":t=u.getSdkType()+"/json","Msg-Type":t}}))}function Ce(e){var t=e,n=[];this.enqueue=function(e){"number"==typeof t&&this.size()>=t&&this.dequeue();n.push(e)};this.dequeue=function(){return n.shift()};this.front=function(){return n[0]};this.isEmpty=function(){return 0===n.length};this.clear=function(){n.length=0};this.size=function(){return n.length};this.items=function(){return n};this.print=function(){console.log(n.toString())}}var Ve,je,Ke,Ge,Fe=(Ve=we=Ne=Ae=ve=ne=Q=null,je=!(fe=[]),Ke=[],Ge=new Ce(50),function(){return Ve=Ve||new Ye});function qe(t){var e=Ge.front();if(e)Me(e,function(){Ge.dequeue();qe(t)},function(){var e=Ge.dequeue();e&&!e.noCache&&Ke.push(e);qe(t)});else{!function(){Ke.forEach(function(e){Ge.enqueue(e)});Ke.length=0}();t()}}function He(e){if(d().getId())if(je)a().i("队列正在发送中");else{je=!0;qe(function(){je=!1;"function"==typeof e&&e()})}else{a().i("获取id标识失败,暂缓发送");"function"==typeof e&&e()}}function Ye(){this.send=function(e,t,n){e?this.add(e,t,function(){He(n)}):He(n)};this.add=function(e,t,n){!function e(t,n,i){if(Ee.instance().isLoaded()){n=n||{};var r=Re(t);if(r){var o=Ee.instance().getRealtimeFields();r.header=p.assign({},r.header,o);r.noCache=n.noCache;Ge.enqueue(r)}"function"==typeof i&&i()}else setTimeout(function(){e(t,n,i)},100)}(e,t,n)};this.load=function(){var e=A().get(s.REQUESTS);e&&e.length&&e.forEach(function(e){Ge.enqueue(e)});A().remove(s.REQUESTS)};this.save=function(){A().set(s.REQUESTS,p.clone(Ge.items()));Ge.clear()}}var We,Je=(We=null,function(){return We=We||new Be});function Be(){this.update=function(){u.getUserInfo(function(t){if(t){var e=A().get(s.USER_INFO);e&&p.deepEqual(t,e)||function(t,n){var e=h().appKey(),i=u.getSdkType(),r=d().getId(),o=d().getIdType();if(!(e&&i&&r&&o))return;o={ak:h().appKey(),sdt:u.getSdkType(),uin:t.nickName,uia:t.avatar,uig:t.gender,uit:t.country,uip:t.province,uic:t.city,uil:t.language,id:d().getId(),it:d().getIdType()},o=JSON.stringify(o);o=C.encode(o);u.request({url:s.USERINFO_URL,method:"POST",header:{"content-type":"application/x-www-form-urlencoded"},data:"ui="+o,success:function(e){a().v("用户信息上传成功: ",t);n&&n(e&&e.data&&200===e.data.code)},fail:function(){a().e("用户信息上传失败: ",t);n&&n(!1)}})}(t,function(e){e&&A().set(s.USER_INFO,t)})}})}}function Xe(e,t){this.id=e;this.ts=Date.now();var n=typeof t;if("string"==n&&t)this[e]=t;else if("object"==n)for(var i in t)!{}.hasOwnProperty.call(t,i)||(this[i]=t[i])}function ze(){var r=!1,n=!1,o=0;this.init=function(e){a().v("sdk version: "+s.IMPL_VERSION);r?a().v("Lib重复实例化"):A().load(function(){a().v("cache初始化成功: ",A().getAll());!function(){d().setUseOpenid&&d().setUseOpenid(h().useOpenid());d().init(function(){Ee.instance().init();a().v("Header初始化成功")})}();r=!0;"function"==typeof e&&e();a().tip("SDK集成成功")})};this.resume=function(e){if(r&&!n){a().v("showOptions: ",e);var t;n=!0;h().enableVerify()&&e&&e.query&&(t=e.query._ttn,xe=t||xe);this._resume(e)}};this._resume=function(e){Fe().load();var t=Te().resume(e),e=Te().getCurrentSessionId();de().setSessionId(e);t&&Fe().add(Se.HALF_SESSION,{},function(){d().setUseOpenid&&d().setUseOpenid(h().useOpenid());if(h().useOpenid()&&h().autoGetOpenid()&&!d().getId()){a().v("get id async");!function t(n,i){if(d().getId()||n<=0)return;d().getOpenIdAsync(h().appKey(),function(e){if(e){a().v("获取id成功");Fe().send()}else{a().v("获取openid失败,启动重试,剩余可用次数",n-1);setTimeout(function(){t(n-1,i)},i)}})}(10,3e3)}else{a().v("session auto send");Fe().send()}})};this.pause=function(e){if(r){n=!1;o=0;Te().pause();h().uploadUserInfo()&&Je().update();Fe().send(Se.CLOSE_SESSION,{},function(){Fe().save();A().save();a().v("cache save success");"function"==typeof e&&e()})}};this.setOpenid=function(e){a().v("setOpenId: %s",e);d().setOpenid(e);Fe().send()};this.setUnionid=function(e){a().v("setUnionid: %s",e);d().setUnionid(e)};this.setUserid=function(e,t){a().v("setUserid: %s",e,t);d().setUserid(e,t)};this.setAnonymousid=function(e){a().v("setAnonymousId: %s",e);d().setAnonymousid(e);Fe().send()};this.setAppVersion=function(e){e&&"string"!=typeof e?a().w("setAppVersion方法只接受字符串类型参数"):Ee.instance().setAppVersion(e)};this.setAlipayUserid=function(e){if(e&&"string"!=typeof e)a().w("setAlipayUserid方法只接受字符串类型参数");else{a().v("setAlipayUserid: %s",e);d().setAlipayUserid(e)}};this.setSuperProperty=function(e){if(e&&"string"!=typeof e)a().w("超级属性只支持字符串类型");else{var t=this;if(Ee.instance().getSuperProperty()!==e){Ee.instance().setSuperProperty(e);t.pause(function(){t.resume()})}}};this.trackEvent=function(e,t){if(r){a().v("event: ",e,t);if(function(e,t){if(e&&"string"==typeof e){var n=["id","ts","du"],i={};n.forEach(function(e){i[e]=1});if(i[e])a().e("eventId不能与以下保留字冲突: "+n.join(","));else if(e.length>s.MAX_EVENTID_LENGTH)a().e("The maximum length of event id shall not exceed "+s.MAX_EVENTID_LENGTH);else{if(!t||"object"==typeof t&&!Array.isArray(t)||"string"==typeof t){if("object"==typeof t){var r,o=0;for(r in t)if({}.hasOwnProperty.call(t,r)){if(r.length>s.MAX_PROPERTY_KEY_LENGTH){a().e("The maximum length of property key shall not exceed "+s.MAX_PROPERTY_KEY_LENGTH);return}if(o>=s.MAX_PROPERTY_KEYS_COUNT){a().e("The maximum count of properties shall not exceed "+s.MAX_PROPERTY_KEYS_COUNT);return}if(i[r]){a().e("属性中的key不能与以下保留字冲突: "+n.join(","));return}o+=1}}return 1}a().e("please check trackEvent properties. properties should be string or object(not include Array)")}}else a().e('please check trackEvent id. id should be "string" and not null')}(e,t)){var n=new Xe(e,t);de().addEvent(n);var i=!!xe,e=i?0:s.EVENT_SEND_DEFAULT_INTERVAL,t=Date.now();if(n=t,e=e,"number"!=typeof o||"number"!=typeof e||(o<=0||e=$e.length||e){e&&function(){var e="https://umini.shujupie.com";s.LOG_URL=s.LOG_URL.replace(e,$e[et]);s.GET_OPENID_URL=s.GET_OPENID_URL.replace(e,$e[et]);s.USERINFO_URL=s.USERINFO_URL.replace(e,$e[et])}();e&&a().v("命中可用服务",$e[et]);e||a().tip_w("未命中可用服务")}else u.request({url:$e[t]+"/uminiprogram_logs/ckdh",success:function(e){200===(e.code||e.status||e.statusCode)&&e.data&&200===e.data.code?tt((et=t)+1,!0):tt(t+1,!1)},fail:function(){tt(t+1,!1)}})}({init:function(e){setTimeout(function(){tt(0,!1)},e)}}).init(3e3);var nt=new Ze,it={_inited:!1,init:function(e){if(this._inited)a().v("已经实例过,请避免重复初始化");else if(e)if(e.appKey){"boolean"!=typeof e.useOpenid&&(e.useOpenid=!0);h().set(e);a().setDebug(e.debug);this._inited=!0;var t=this;F.emit(q,e);try{var n=new ze;a().v("成功创建Lib对象");n.init(function(){a().v("Lib对象初始化成功");nt.installApi(t,n);a().v("安装Lib接口成功");F.emit(H,e)})}catch(e){a().w("创建Lib对象异常: "+e)}}else a().err("请确保传入正确的appkey");else a().err("请正确设置相关信息!")}};try{nt.installApi(it,null)}catch(e){a().w("uma赋值异常: ",e)}wx.onShow(function(e){a().v("game onShow: ",e);t=e.query,ee=t;var t;it.resume(e,!0)});wx.onHide(function(){a().v("game onHide");it.pause()});var rt=it.init;it.init=function(e){if(e&&e.useOpenid){a().tip_w("!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!");a().tip_w("您选择了使用openid进行统计,请确保使用setOpenid回传openid或通过设置autoGetOpenid为true,并在友盟后台设置secret由友盟帮您获取");a().tip_w("!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!")}rt.call(it,e)};_=new z;!function(e,t,n){if("object"==typeof e){if("string"==typeof t&&t.length)e[t]=n;else for(var i in n)if({}.hasOwnProperty.call(n,i)){if(e[i]){a().v("方法已定义,无法注入此插件方法: ",i);return}n[i]&&(e[i]=function(){n[i](arguments)})}}else a().v("插件安装失败,宿主对象不能为空")}(it,"rc",_);wx.uma=it;module.exports=it; diff --git a/Assets/HCMiniSdk/Scripts/Editor/sdk/utils/uma.min.js.meta b/Assets/HCMiniSdk/Scripts/Editor/sdk/utils/uma.min.js.meta new file mode 100644 index 00000000..3bc652e9 --- /dev/null +++ b/Assets/HCMiniSdk/Scripts/Editor/sdk/utils/uma.min.js.meta @@ -0,0 +1,3 @@ +fileFormatVersion: 2 +guid: a1988d9113ff4c408b04fb27b6a553ab +timeCreated: 1701832195 \ No newline at end of file diff --git a/Assets/HCMiniSdk/Scripts/HCNative.meta b/Assets/HCMiniSdk/Scripts/HCNative.meta new file mode 100644 index 00000000..3afa1724 --- /dev/null +++ b/Assets/HCMiniSdk/Scripts/HCNative.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: cc0a107326b2a4ec785cccb43013e643 +folderAsset: yes +DefaultImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/HCMiniSdk/Scripts/HCNative/Plugins.meta b/Assets/HCMiniSdk/Scripts/HCNative/Plugins.meta new file mode 100644 index 00000000..cc342562 --- /dev/null +++ b/Assets/HCMiniSdk/Scripts/HCNative/Plugins.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: c0aad42bdc23b4463ae1c87c3a446304 +folderAsset: yes +DefaultImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/HCMiniSdk/Scripts/HCNative/Plugins/CustomSDK.jslib b/Assets/HCMiniSdk/Scripts/HCNative/Plugins/CustomSDK.jslib new file mode 100644 index 00000000..cd4c50fd --- /dev/null +++ b/Assets/HCMiniSdk/Scripts/HCNative/Plugins/CustomSDK.jslib @@ -0,0 +1,12 @@ +mergeInto(LibraryManager.library, { + JsUnityToWxMiniGame: function (args) { + var res = UnityToWxMiniGame(Pointer_stringify(args)); + if(!res){ + res = ""; + } + var bufferSize = lengthBytesUTF8(res || '') + 1; + var buffer = _malloc(bufferSize); + stringToUTF8(res, buffer, bufferSize); + return buffer; + } +}); diff --git a/Assets/HCMiniSdk/Scripts/HCNative/Plugins/CustomSDK.jslib.meta b/Assets/HCMiniSdk/Scripts/HCNative/Plugins/CustomSDK.jslib.meta new file mode 100644 index 00000000..3a3249ea --- /dev/null +++ b/Assets/HCMiniSdk/Scripts/HCNative/Plugins/CustomSDK.jslib.meta @@ -0,0 +1,3 @@ +fileFormatVersion: 2 +guid: dd35a1256ded4d9eae1b78ef13a91b56 +timeCreated: 1701185979 \ No newline at end of file diff --git a/Assets/HCMiniSdk/Scripts/HCNative/Scripts.meta b/Assets/HCMiniSdk/Scripts/HCNative/Scripts.meta new file mode 100644 index 00000000..7e126147 --- /dev/null +++ b/Assets/HCMiniSdk/Scripts/HCNative/Scripts.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: a5781758029ef44d39792da193602046 +folderAsset: yes +DefaultImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/HCMiniSdk/Scripts/HCNative/Scripts/HCNativeCallback.cs b/Assets/HCMiniSdk/Scripts/HCNative/Scripts/HCNativeCallback.cs new file mode 100644 index 00000000..398654b1 --- /dev/null +++ b/Assets/HCMiniSdk/Scripts/HCNative/Scripts/HCNativeCallback.cs @@ -0,0 +1,37 @@ +using System; +using System.Collections.Generic; + +namespace HC +{ + public class HCNativeCallback + { + public static Dictionary> CallbackAction = new Dictionary>(); + + // Login result callback + public static Action mLoginCallback = null; + + // Logout callback + public static Action mLogoutCallback = null; + + + public static void RegisterAction(int code, Action action) + { + if (!CallbackAction.ContainsKey(code)) + { + CallbackAction[code] = action; + } + else + { + CallbackAction[code] += action; + } + } + + public static void UnRegisterAction(int code, Action action) + { + if (CallbackAction.ContainsKey(code)) + { + CallbackAction[code] -= action; + } + } + } +} \ No newline at end of file diff --git a/Assets/HCMiniSdk/Scripts/HCNative/Scripts/HCNativeCallback.cs.meta b/Assets/HCMiniSdk/Scripts/HCNative/Scripts/HCNativeCallback.cs.meta new file mode 100644 index 00000000..917a50f9 --- /dev/null +++ b/Assets/HCMiniSdk/Scripts/HCNative/Scripts/HCNativeCallback.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: 459b7c25dc0d948b291e88e0c66ff8e3 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/HCMiniSdk/Scripts/HCNative/Scripts/HCNativeInterface.cs b/Assets/HCMiniSdk/Scripts/HCNative/Scripts/HCNativeInterface.cs new file mode 100644 index 00000000..012d43b0 --- /dev/null +++ b/Assets/HCMiniSdk/Scripts/HCNative/Scripts/HCNativeInterface.cs @@ -0,0 +1,127 @@ +using System; +using System.Collections; +using System.Collections.Generic; +using UnityEngine; + +namespace HC +{ + /// + /// TKG Native SDK interface call + /// + public abstract class HCNativeInterface + { + private static IHCNative _instance; + + public const string SDKVersion = "2.0.13"; + + public static IHCNative Instance + { + get + { + if (_instance == null) + { + +#if UNITY_WEBGL || WEBGL_BYTEDANCE + _instance = HCNativeInterfaceWXMini.Instance; +#else + _instance = new HCNativeInterfaceDefault(); +#endif + } + + return _instance; + } + } + + public string GetDeviceID() + { + HCDebugger.LogDebug("DEVICE 01"); + string thirdDeviceID = _instance.GetDeviceID(); + HCDebugger.LogDebug("DEVICE 02"+thirdDeviceID); + return thirdDeviceID; + } + + + public void Login(HCLoginType _loginType, + Action _loginResultCallback = null) + { + _instance.Login(_loginType, _loginResultCallback); + } + + public void Logout(Action _logoutCallback = null) + { + _instance.Logout(_logoutCallback); + } + + public void Shake(int _shakeType, float _intensity = 1) + { + _instance.Shake(_shakeType,_intensity); + } + + public void ShowToast(string _toast) + { + _instance.ShowToast(_toast); + } + + public void RemoveNative() + { + _instance.RemoveNative(); + } + + public bool IsNativeAdReady() + { + return _instance.IsNativeAdReady(); + } + + public void ShowNative(RectTransform pRect, Camera pCam = null, string pAdPos = "",string adUnit = "", Action _showFailedCallback = null, Action _closeCallback = null) + { + _instance.ShowNative(pRect, pCam, pAdPos, adUnit, _showFailedCallback, _closeCallback); + } + + public void LoadNative(string adUnit) + { + _instance.LoadNative(adUnit); + } + } + + public interface IHCNative + { + #region login + + void Login(HCLoginType _loginType, + Action _loginResultCallback = null); + + void Logout(Action _logoutCallback = null); + + #endregion + + #region review + + void NativeReview(); + + #endregion + + #region deviceID + + string GetDeviceID(); + + #endregion + + #region 震动 + void Shake(int _shakeType, float _intensity = 1); + #endregion + + #region toast + void ShowToast(string _toast); + #endregion + + #region native ad + void LoadNative(string adUnit); + + void RemoveNative(string adUnit = null); + + bool IsNativeAdReady(string adUnit = null); + + void ShowNative(RectTransform pRect, Camera pCam = null, string pAdPos = "",string adUnit = null, Action _showFailedCallback = null, Action _closeCallback = null); + #endregion + } +} diff --git a/Assets/HCMiniSdk/Scripts/HCNative/Scripts/HCNativeInterface.cs.meta b/Assets/HCMiniSdk/Scripts/HCNative/Scripts/HCNativeInterface.cs.meta new file mode 100644 index 00000000..7dd0d800 --- /dev/null +++ b/Assets/HCMiniSdk/Scripts/HCNative/Scripts/HCNativeInterface.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: f4c012a1fad2a458eaa20818b27ab2ee +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/HCMiniSdk/Scripts/HCNative/Scripts/HCNativeInterfaceDefault.cs b/Assets/HCMiniSdk/Scripts/HCNative/Scripts/HCNativeInterfaceDefault.cs new file mode 100644 index 00000000..09bd1ae4 --- /dev/null +++ b/Assets/HCMiniSdk/Scripts/HCNative/Scripts/HCNativeInterfaceDefault.cs @@ -0,0 +1,70 @@ +using System; +using System.Collections; +using System.Collections.Generic; +using UnityEngine; + +namespace HC +{ + public class HCNativeInterfaceDefault : HCSingleton, IHCNative + { + public string GetDeviceID() + { + return ""; + } + + public void Login(HCLoginType _loginType, Action _loginResultCallback = null) + { + LoginInfo loginInfo = new LoginInfo(); + loginInfo.loginStatus = HCLoginStatus.LOGIN_STATUS_SUCC; + loginInfo.userInfo = new UserInfo(); + loginInfo.userInfo.userID = "qwe456"; + loginInfo.userInfo.loginType = HCLoginType.LOGIN_BY_GOOGLE; + _loginResultCallback(loginInfo); + } + + public void Logout(Action _logoutCallback = null) + { + + } + + + + public void LoadNative(string adUnit) + { + + } + + + public bool IsNativeAdReady(string adUnit = null) + { + return false; + } + + public void ShowNative(RectTransform pRect, Camera pCam = null, string pAdPos = "", string adUnit = null, Action _showFailedCallback = null, Action _closeCallback = null) + { + + } + + public void RemoveNative(string adUnit = null) + { + + } + + public void NativeReview() + { + + } + + + public void Shake(int _shakeType, float _intensity = 1) + { + } + + + + public void ShowToast(string _toast) + { + } + } +} + diff --git a/Assets/HCMiniSdk/Scripts/HCNative/Scripts/HCNativeInterfaceDefault.cs.meta b/Assets/HCMiniSdk/Scripts/HCNative/Scripts/HCNativeInterfaceDefault.cs.meta new file mode 100644 index 00000000..502d3399 --- /dev/null +++ b/Assets/HCMiniSdk/Scripts/HCNative/Scripts/HCNativeInterfaceDefault.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: 479151351fa9048ccadb3c5964dd70be +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/HCMiniSdk/Scripts/HCNative/Scripts/HCNativeInterfaceWXMini.cs b/Assets/HCMiniSdk/Scripts/HCNative/Scripts/HCNativeInterfaceWXMini.cs new file mode 100644 index 00000000..ba8c34cc --- /dev/null +++ b/Assets/HCMiniSdk/Scripts/HCNative/Scripts/HCNativeInterfaceWXMini.cs @@ -0,0 +1,105 @@ +#if UNITY_WEBGL || WEBGL_BYTEDANCE + +using System; +using UnityEngine; + +namespace HC +{ + public class HCNativeInterfaceWXMini : HCSingleton, IHCNative + { + public void Login(HCLoginType _loginType, Action _loginResultCallback = null) + { + HCWebGLSDKManager.Account.Login(result => + { + var resultExt = result.ext; + var nickName = ""; + var avatarUrl = ""; + if (resultExt != null) + { + if (resultExt.TryGetValue("nickName", out var value)) + { + nickName = (string)value; + } + + if (resultExt.TryGetValue("avatarUrl", out var value2)) + { + avatarUrl = (string)value2; + } + } + + _loginResultCallback?.Invoke(new LoginInfo + { + loginMsg = result.msg, + loginStatus = result.code == 0 ? HCLoginStatus.LOGIN_STATUS_SUCC : HCLoginStatus.LOGIN_STATUS_FAILED, + userInfo = new UserInfo + { + email = "", + loginType = _loginType, + nickName = nickName, + photoUrl = avatarUrl, + token = result.token, + userID = result.userId + } + }); + }); + } + + public void Logout(Action _logoutCallback = null) + { + _logoutCallback?.Invoke(); + } + + public void NativeReview() + { + } + + public string GetDeviceID() + { + return ""; + } + + public void Shake(int _shakeType, float _intensity = 1) + { + HCWebGLSDKManager.Base.Vibrate(_shakeType, _intensity); + } + + public void ShowToast(string _toast) + { + } + + public void LoadNative(string adUnit) + { + HCWebGLSDKManager.Ads.LoadNative(adUnit); + } + + public void RemoveNative(string adUnit = null) + { + HCWebGLSDKManager.Ads.RemoveNative(adUnit); + } + + public bool IsNativeAdReady(string adUnit = null) + { + return HCWebGLSDKManager.Ads.IsNativeAdReady(adUnit); + } + + public void ShowNative(RectTransform pRect, Camera pCam = null, string pAdPos = "", string adUnit = null, Action _showFailedCallback = null, Action _closeCallback = null) + { + if (pRect == null) + { + HCWebGLSDKManager.Ads.ShowNative(adUnit, 0, 0, Screen.width, Screen.height, pAdPos, _showFailedCallback, _closeCallback); + } + else + { + Vector3[] tWorldCorners = new Vector3[4]; + pRect.GetWorldCorners(tWorldCorners); + Vector2 tTopLeft = RectTransformUtility.WorldToScreenPoint(pCam, tWorldCorners[1]); + Vector2 tBottomRight = RectTransformUtility.WorldToScreenPoint(pCam, tWorldCorners[3]); + float tWidth = Mathf.Abs(tBottomRight.x - tTopLeft.x); + float tHeight = Mathf.Abs(tBottomRight.y - tTopLeft.y); + //tTopLeft.x, Screen.height - tTopLeft.y, tWidth, tHeight, pAdPos + HCWebGLSDKManager.Ads.ShowNative(adUnit, tTopLeft.x, Screen.height - tTopLeft.y, tWidth, tHeight, pAdPos, _showFailedCallback, _closeCallback); + } + } + } +} +#endif \ No newline at end of file diff --git a/Assets/HCMiniSdk/Scripts/HCNative/Scripts/HCNativeInterfaceWXMini.cs.meta b/Assets/HCMiniSdk/Scripts/HCNative/Scripts/HCNativeInterfaceWXMini.cs.meta new file mode 100644 index 00000000..3d453492 --- /dev/null +++ b/Assets/HCMiniSdk/Scripts/HCNative/Scripts/HCNativeInterfaceWXMini.cs.meta @@ -0,0 +1,3 @@ +fileFormatVersion: 2 +guid: ecd9e131b4ac4b0ca1d64da4345f8637 +timeCreated: 1699527703 \ No newline at end of file diff --git a/Assets/HCMiniSdk/Scripts/HCSDKManager.cs b/Assets/HCMiniSdk/Scripts/HCSDKManager.cs new file mode 100644 index 00000000..30c35428 --- /dev/null +++ b/Assets/HCMiniSdk/Scripts/HCSDKManager.cs @@ -0,0 +1,570 @@ +using System; +using System.Collections; +using System.Collections.Generic; +using HC; +using UnityEngine; +#if USE_IAP +using UnityEngine.Purchasing; +#endif + +public partial class HCSDKManager : HCSingleton +{ + // 内购回调 + public Action OnPurchaseDone; + + // 恢复购买回调 + public Action OnRestoreDone; + + // 游戏暂停/恢复声音回调 + public Action SetGameFocusListener; + + // Adjust归因回调 + public Action OnUserSourceListenerCallback; + + + private bool isInit = false; + + /// + /// 初始化SDK + /// + /// + public void InitializeSdk(Action _initCallback = null) + { + if (isInit) return; + HCAdsManager.Instance.InitializeSdk(); + HCAnalyticsManager.Instance.InitializeSdk(); + SensitiveManager.Instance.InitializeSdk(); + isInit = true; + _initCallback?.Invoke(); + if (!HCTools.HasKey(HCTools.FIRST_TIME_OPEN_GAME)) + { + HCTools.SavePlayerPrefsInt(HCTools.FIRST_TIME_OPEN_GAME, (int)HCTimeTools.GetCurrentTimestamp()); + } + } + + #region Ads + + /// + /// 播放激励视频广告 + /// + /// 激励视频广告点位 + /// 激励视频关闭回调 + /// 激励视频展示失败回调 + public void ShowRewardedAd(HCRVPositionName _adPos, Action _rewardCallback = null, Action _showFailedCallback = null, bool _useSDKToast = true) + { + HCAdsManager.Instance.ShowRewardedAd(_adPos, _rewardCallback, _showFailedCallback, _useSDKToast); + } + + /// + /// 展示插屏广告 + /// + /// 插屏点位 + /// 插屏关闭回调 + public void ShowInterstitial(HCIVPositionName _adPos, HCIVADType _IvType = HCIVADType.IV1, Action _closeCallback = null) + { + HCAdsManager.Instance.ShowInterstitial(_adPos, _IvType, _closeCallback); + } + + /// + /// 插屏广告是否准备好 + /// + /// + public bool IsInterstitialReady() + { + return HCAdsManager.Instance.IsInterstitialReady(); + } + + /// + /// 激励视频广告是否准备好 + /// + /// + public bool IsRewardedAdReady() + { + return HCAdsManager.Instance.IsRewardedAdReady(); + } + + /// + /// 展示banner + /// + public void ShowBanner() + { + HCAdsManager.Instance.ShowBanner(); + } + + /// + /// 隐藏banner + /// + public void HideBanner() + { + HCAdsManager.Instance.HideBanner(); + } + + public bool IsNativeAdReady(string adUnit = "") + { + return HCAdsManager.Instance.IsNativeReady(adUnit); + } + + public void ShowNative(RectTransform pRect, Camera pCam = null, string pAdPos = "", string adUnit = "", Action _showFailedCallback = null, Action _closeCallback = null) + { + HCAdsManager.Instance.ShowNative(pRect, pCam, pAdPos, adUnit, _showFailedCallback, _closeCallback); + } + + public void RemoveNative(string adUnit = "") + { + HCAdsManager.Instance.RemoveNative(adUnit); + } + + #endregion + + + #region Analytics + + /// + /// Log Event + /// + /// + /// 上报平台,all 包含firebase/数数 + public void LogEvent(string _eventSort, TrackEventPlatform _trackEventPlatform = TrackEventPlatform.All) + { + HCAnalyticsManager.Instance.TrackEvent(_eventSort, _trackEventPlatform); + } + + /// + /// Log Event + /// + /// + /// + /// + /// 上报平台,all 包含firebase/数数 + public void LogEvent(string _eventSort, string _key, object _value, TrackEventPlatform _trackEventPlatform = TrackEventPlatform.All) + { + HCAnalyticsManager.Instance.TrackEvent(_eventSort,_key,_value, _trackEventPlatform); + } + + /// + /// Log Event + /// + /// + /// + /// + /// + /// + /// 上报平台,all 包含firebase/数数 + public void LogEvent(string _eventSort, string _key01, object _value01, string _key02, object _value02, TrackEventPlatform _trackEventPlatform = TrackEventPlatform.All) + { + HCAnalyticsManager.Instance.TrackEvent(_eventSort, _key01, _value01, _key02, _value02, _trackEventPlatform); + } + + /// + /// + /// + /// + /// + /// 上报平台,all 包含firebase/数数 + public void LogEvent(string _eventSort, Dictionary _eventDic, TrackEventPlatform _trackEventPlatform = TrackEventPlatform.All) + { + HCAnalyticsManager.Instance.TrackEvent(_eventSort, _eventDic, _trackEventPlatform); + } + +#endregion + +#region review + + /// + /// 评论 + /// + public void Review() + { + HCNativeInterface.Instance.NativeReview(); + } + +#endregion + + +#region + + /// + /// + /// + /// 在线参数key + /// 在线参数默认值 + /// + public string GetRemoteConfigStr(string _key, string _defaultValue) + { +#if !UNITY_EDITOR + return HCAnalyticsManager.Instance.GetRemoteConfigStr(_key,_defaultValue); +#else + return _defaultValue; +#endif + } + + /// + /// + /// + /// 在线参数key + /// 在线参数默认值 + /// + public int GetRemoteConfigInt(string _key, int _defaultValue) + { +#if !UNITY_EDITOR + return HCAnalyticsManager.Instance.GetRemoteConfigInt(_key, _defaultValue); +#else + return _defaultValue; +#endif + } + + /// + /// + /// + /// 在线参数key + /// 在线参数默认值 + /// + public bool GetRemoteConfigBool(string _key, bool _defaultValue) + { +#if !UNITY_EDITOR + return HCAnalyticsManager.Instance.GetRemoteConfigBool(_key, _defaultValue); +#else + return _defaultValue; +#endif + } + +#endregion + +#region other + + public void SetUserSourceListenerCallback(Action OnUserSourceListenerCallbackAction) + { + OnUserSourceListenerCallback = OnUserSourceListenerCallbackAction; + } + + public void Shake(int _shakeType, float _intensity = 1) + { +#if !UNITY_EDITOR + HCNativeInterface.Instance.Shake(_shakeType, _intensity); + +#endif + } + + public void ShowToast(string _msg) + { +#if !UNITY_EDITOR + HCNativeInterface.Instance.ShowToast(_msg); +#endif + } + + /// + /// 设置公共事件属性 + /// + /// + public void SetSuperProperties(Dictionary _mPoperties) + { + HCAnalyticsManager.Instance.SetSuperProperties(_mPoperties); + } + + /// + /// 设置用户属性 + /// + /// + public void SetUserProperties(Dictionary _mPoperties) + { + HCAnalyticsManager.Instance.SetUserProperties(_mPoperties); + } + + public void SetLogEnable(bool _enable) + { +#if !UNITY_EDITOR + HCOtherConfigs.IsDebugLog = _enable; + HCAdsManager.Instance.SetLogEnable(_enable); + HCAnalyticsManager.Instance.SetLogEnable(_enable); +#endif + } + + public void LogRewardBtnShow(string _pos) + { +#if !UNITY_EDITOR + HCAnalyticsManager.Instance.LogRewardBtnShow(_pos); +#endif + } + +#endregion + +#region IAP + + + /// + /// 购买商品回调 + /// orderID, productName, productID, purchaseResult, gameExtra + /// + /// 返回 + public void SetOnPurchaseDone(Action onPurchaseDoneAction) + { + OnPurchaseDone = onPurchaseDoneAction; + } +#if USE_IAP + + + /// + /// 获取 AppStore/Google Play 上所有配置的商品; + /// + /// 返回所有商品信息 + /// ex: + /// Product[0].metadata.localizedTitle + /// Product[0].metadata.localizedPriceString + /// Product[0].metadata.localizedDescription + /// Product[0].metadata.isoCurrencyCode + public void OnGetProductsInfo(Action onGetProductsInfo) + { + HCPurchaseManager.Instance.OnGetProductsInfo += onGetProductsInfo; + } + + + /// + /// 根据商品ID获取商品信息 + /// + /// 商品ID + /// 返回商品信息 + public Product GetProductInfoByID(string productID) + { + return HCPurchaseManager.Instance.GetProductInfoByID(productID); + } + + + /// + /// 获取带货币符号价格字符串 + /// + /// 商品ID + /// 返回带货币符号字符串 + public string GetPriceByID(string productID) + { + return HCPurchaseManager.Instance.GetPriceByID(productID); + } + + /// + /// 点击购买方法 + /// + /// 商品SKU + /// 商品名称 + /// 游戏拓展参数 + public void BuyProductByID(string productId, string enProductName, string gameExtraParam = "") + { + HCPurchaseManager.Instance.BuyProductByID(productId, enProductName, gameExtraParam); + } + + /// + /// 动态添加商品ID + /// + /// Product IDs + /// bool Is it added successfully string Additional Information + public void AddProducts(Dictionary products) + { + HCPurchaseManager.Instance.AddProducts(products); + } + + /// + /// 恢复购买 + /// + public void RestorePurchases() + { + HCPurchaseManager.Instance.RestorePurchases(); + } + + public void SetRestoreDone(Action onRestoreDoneAction) + { + OnRestoreDone = onRestoreDoneAction; + } + + /// + /// IAP 按钮展示 + /// + /// 商品名称 + /// 商品ID + public void LogIAPBtnShow(string productName, string productId) + { + var productInfo = GetProductInfoByID(productId); + var currency = ""; + var price = ""; + if (productInfo != null) + { + currency = productInfo.metadata.isoCurrencyCode; + price = productInfo.metadata.localizedPriceString; + } +#if !UNITY_EDITOR + HCAnalyticsManager.Instance.IAPBtnShow(productName, productId, currency, price); +#endif + } +#endif + +#endregion + +#region 用户登录 + + /// + /// User Login + /// + /// 登录类型 + /// 登录回调Action + public void Login(HCLoginType _loginType, Action _loginResultCallback = null) + { +#if WEBGL_WX + HCDebugger.LogWarning($"微信小游戏只支持微信登陆,默认会把所有传入过来的登陆类型修改为 HCLoginType.LOGIN_BY_WECHAT_MINI_GAME 类型,Editor下会使用游客登陆来模拟微信登陆。当前传入的类型[{_loginType}]"); + _loginType = HCLoginType.LOGIN_BY_WECHAT_MINI_GAME; +#endif +#if WEBGL_BYTEDANCE + HCDebugger.LogWarning($"抖音小游戏只支持抖音登陆,默认会把所有传入过来的登陆类型修改为 HCLoginType.LOGIN_BY_BYTEDANCE 类型,Editor下会使用游客登陆来模拟抖音登陆。当前传入的类型[{_loginType}]"); + _loginType = HCLoginType.LOGIN_BY_BYTEDANCE; +#endif +#if UNITY_WEBGL && UNITY_EDITOR + _loginType = HCLoginType.LOGIN_BY_GUESTER; +#endif + + HCAccountManager.Instance.Login(_loginType, _loginResultCallback); + } + + /// + /// 自动根据上次登陆的类型进行登陆,登陆失败需要跳转到登陆界面。 + /// + /// + public void AutoLogin(Action _loginResultCallback = null) + { + HCAccountManager.Instance.AutoLogin(_loginResultCallback); + } + + /// + /// 获取当前账号类型。 用于显示绑定界面。 + /// + /// + public HCLoginType GetAccountType() + { + return HCAccountManager.Instance.GetAccountType(); + } + + /// + /// 是否可以自动登陆 + /// + /// + public bool IsCanAutoLogin() + { + return HCAccountManager.Instance.IsCanAutoLogin(); + } + + /// + /// Logout + /// + /// + public void Logout(Action _logoutCallback = null) + { + HCAccountManager.Instance.Logout(_logoutCallback); + } + + /// + /// Obtain a list of login channels, + /// and the game displays the obtained login list for users to choose to log in. + /// + /// available login channels + public List AvailableLoginChannelList() + { + return HCAccountManager.Instance.AvailableLoginChannelList(); + } + + /// + /// user actively deletes account. + /// + /// Return the deleted userId. If the game needs to record it, you can operate it in the action. + /// + /// code Delete userId + public void DeleteAccount(Action deleteAccountCallback = null) + { + HCAccountManager.Instance.DeleteAccount(deleteAccountCallback); + } + + /// + /// Social account binding for Guester. + /// 游客绑定社交账号 + /// + /// 游戏发起社交账号的绑定: + /// 根据 Action中的BindAccountStatus判断 + /// 如果 BindAccountStatus == BindAccountStatus.BIND_CODE_SUCC + /// 需要判断userId和当前userId是否一致,如果不一致,需要切换账号,或者重启游戏。如果一致,无需操作。 + /// 如果 BindAccountStatus == BindAccountStatus.BIND_CODE_SELECT + /// 这个是因为第三方账号已经被绑定过了,string[] 中将会返回已经绑定的userId,和当前userId,游戏需要展示出来提供给玩家选择, + /// 玩家选择完成后,需要将选中的userId通过调用ForceBindAccount接口,进行强制绑定。 + /// + /// 其情况,游戏做相应操作 + /// + /// + /// + /// + /// 社交账号类型 + /// 是否强制绑定 + /// 绑定的userId + /// 回调的信息 + private void BindAccount(HCLoginType type, HCBindType isForce = HCBindType.NO_FORCE, string userId = "", + Action + bindAccountCallback = null) + { + HCAccountManager.Instance.BindAccount(type, isForce, userId, bindAccountCallback); + } + + private HCLoginType bindLoginType = HCLoginType.LOGIN_BY_GUESTER; + + /// + /// Social account binding for Guester. + /// + /// 情况一 : bindAccountStatusEnum == BindAccountStatus.BIND_CODE_SUCC 绑定成功 + /// 绑定成功的时候,需要获取 userId和当前userId是否一致, 如果不一致,需要重新切换到新的userId账号上来。 (切换账号) + /// 情况二 : BindAccountStatus == BindAccountStatus.BIND_CODE_SELECT 社交账号已经绑定了其他账号 (社交账号已经在其他设备上登陆) + /// 需要获取到userIdList 里面的userId列表,获取到userId对应的角色/关卡信息,展示出来供玩家选择。 玩家选择完成之后调用 `ForceBindAccount` 接口将选中的userId传递进去,进行强制绑定 + /// ⚠️ 如果选择的是当前账号强制绑定,那么社交账号原有的账号将会被删除 + /// 如果选择的是社交账号关联的账号,那么当前账号将会被删除 + /// + /// + /// + /// 社交账号类型 + /// bindAccountStatusEnum, loginTypeEnum, _msg, _userId, _token, _email,_displayName, _photoUrl, userIdList + public void BindAccount(HCLoginType type, + Action + bindAccountCallback = null) + { + bindLoginType = type; + BindAccount(type, isForce: HCBindType.NO_FORCE, userId: "", bindAccountCallback); + } + + public void ForceBindAccount(string userId, Action + bindAccountCallback = null) + { + BindAccount(bindLoginType, HCBindType.FORCE, userId, bindAccountCallback); + } + + /// + /// 获取当前用户信息 + /// + /// + public HC.UserInfo GetCurrAccountInfo() + { + return HCAccountManager.Instance.GetCurrUserInfo(); + } + +#endregion + + /// + /// + /// + /// 文本内容 + /// 类型1:昵称,2:对话 + /// 是否可用,true:可用,false 不可用 + public void CheckSensitiveWords(string text, SensitiveType type,Action action) + { + if (string.IsNullOrEmpty(text)) + { + action(new SensitiveCheckResult() + { + HasSensitive = false, + Text = text + }); + + return; + } + + SensitiveManager.Instance.CheckSensitiveWords(text, type, action); + } +} \ No newline at end of file diff --git a/Assets/HCMiniSdk/Scripts/HCSDKManager.cs.meta b/Assets/HCMiniSdk/Scripts/HCSDKManager.cs.meta new file mode 100644 index 00000000..f2af01ee --- /dev/null +++ b/Assets/HCMiniSdk/Scripts/HCSDKManager.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: e2a3cbc4bcc44402c9ff9fa342b2a337 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/HCMiniSdk/Scripts/Other.meta b/Assets/HCMiniSdk/Scripts/Other.meta new file mode 100644 index 00000000..cc6c3600 --- /dev/null +++ b/Assets/HCMiniSdk/Scripts/Other.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: ad8b10adcaab24b6cac6fc4edf34907e +folderAsset: yes +DefaultImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/HCMiniSdk/Scripts/Other/HCConvertUtils.cs b/Assets/HCMiniSdk/Scripts/Other/HCConvertUtils.cs new file mode 100644 index 00000000..0ff487a8 --- /dev/null +++ b/Assets/HCMiniSdk/Scripts/Other/HCConvertUtils.cs @@ -0,0 +1,87 @@ +using System; + +namespace HC +{ + public class HCConvertUtils + { + public static string BytesToHexString(byte[] bytes, bool isUpperCase) + { + if (bytes == null) + return ""; + + char[] hexDigits = isUpperCase ? HEX_DIGITS_UPPER : HEX_DIGITS_LOWER; + int len = bytes.Length; + if (len == 0) + return ""; + + char[] ret = new char[len << 1]; + for (int i = 0, j = 0; i < len; i++) + { + ret[j++] = hexDigits[bytes[i] >> 4 & 0x0f]; + ret[j++] = hexDigits[bytes[i] & 0x0f]; + } + + return new string(ret); + } + + public static byte[] HexStringToBytes(string hexString) + { + if (IsSpace(hexString)) + return new byte[0]; + + int len = hexString.Length; + if (len % 2 != 0) + { + hexString = "0" + hexString; + len = len + 1; + } + + char[] hexBytes = hexString.ToUpper().ToCharArray(); + byte[] ret = new byte[len >> 1]; + for (int i = 0; i < len; i += 2) + { + ret[i >> 1] = (byte)(HexToDec(hexBytes[i]) << 4 | HexToDec(hexBytes[i + 1])); + } + + return ret; + } + + public static bool IsSpace(string s) + { + if (s == null) + return true; + + for (int i = 0, len = s.Length; i < len; ++i) + { + if (!char.IsWhiteSpace(s[i])) + { + return false; + } + } + + return true; + } + + private static int HexToDec(char hexChar) + { + if (hexChar >= '0' && hexChar <= '9') + { + return hexChar - '0'; + } + else if (hexChar >= 'A' && hexChar <= 'F') + { + return hexChar - 'A' + 10; + } + else + { + throw new ArgumentException(); + } + } + + private static readonly char[] HEX_DIGITS_UPPER = + { '0', '1', '2', '3', '4', '5', '6', '7', '8', '9', 'A', 'B', 'C', 'D', 'E', 'F' }; + + private static readonly char[] HEX_DIGITS_LOWER = + { '0', '1', '2', '3', '4', '5', '6', '7', '8', '9', 'a', 'b', 'c', 'd', 'e', 'f' }; + } +} \ No newline at end of file diff --git a/Assets/HCMiniSdk/Scripts/Other/HCConvertUtils.cs.meta b/Assets/HCMiniSdk/Scripts/Other/HCConvertUtils.cs.meta new file mode 100644 index 00000000..6fe3c90d --- /dev/null +++ b/Assets/HCMiniSdk/Scripts/Other/HCConvertUtils.cs.meta @@ -0,0 +1,3 @@ +fileFormatVersion: 2 +guid: b8d4761d8f6d42379ed07e0592556742 +timeCreated: 1698892087 \ No newline at end of file diff --git a/Assets/HCMiniSdk/Scripts/Other/HCDebugger.cs b/Assets/HCMiniSdk/Scripts/Other/HCDebugger.cs new file mode 100644 index 00000000..6b9b51aa --- /dev/null +++ b/Assets/HCMiniSdk/Scripts/Other/HCDebugger.cs @@ -0,0 +1,41 @@ +using UnityEngine; +using System.Collections; + +namespace HC +{ + public class HCDebugger : MonoBehaviour + { + public static void LogDebug(string content) + { + if (HCOtherConfigs.IsDebugLog) + { + Debug.Log(string.Format("【HCSDK】 {0}", content)); +#if UNITY_IOS + HCNativeInterfaceiOS.Instance.Log(string.Format("【HCSDK】 {0}", content)); +#endif + } + } + + public static void LogWarning(string content) + { + if (HCOtherConfigs.IsDebugLog) + { + Debug.LogWarning(string.Format("【HCSDK】 {0}", content)); + } + } + + public static void LogError(string content) + { + if (HCOtherConfigs.IsDebugLog) + { + Debug.LogError(string.Format("【HCSDK Error】 {0}", content)); + } + } + + public static void SetUnityLogger(bool _logEnable) + { + Debug.unityLogger.logEnabled = _logEnable; + } + } +} + diff --git a/Assets/HCMiniSdk/Scripts/Other/HCDebugger.cs.meta b/Assets/HCMiniSdk/Scripts/Other/HCDebugger.cs.meta new file mode 100644 index 00000000..339b9e7a --- /dev/null +++ b/Assets/HCMiniSdk/Scripts/Other/HCDebugger.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: 88002c9e3d65e464d837fad58feaa367 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/HCMiniSdk/Scripts/Other/HCExtensions.cs b/Assets/HCMiniSdk/Scripts/Other/HCExtensions.cs new file mode 100644 index 00000000..0fdfcd0d --- /dev/null +++ b/Assets/HCMiniSdk/Scripts/Other/HCExtensions.cs @@ -0,0 +1,18 @@ +using System.Collections.Generic; + +namespace HC +{ + public static class HCExtensions + { + public static void AddIfNotExists(this IDictionary dictionary, TKey key, TValue value) + { + if (!dictionary.ContainsKey(key)) + dictionary.Add(key, value); + } + + public static TValue GetValue(this IDictionary dictionary, TKey key, TValue defalut) + { + return dictionary.TryGetValue(key, out var value) ? value : defalut; + } + } +} \ No newline at end of file diff --git a/Assets/HCMiniSdk/Scripts/Other/HCExtensions.cs.meta b/Assets/HCMiniSdk/Scripts/Other/HCExtensions.cs.meta new file mode 100644 index 00000000..d97023c0 --- /dev/null +++ b/Assets/HCMiniSdk/Scripts/Other/HCExtensions.cs.meta @@ -0,0 +1,3 @@ +fileFormatVersion: 2 +guid: 0447da4ed81e4c269cd8b3d88ba97973 +timeCreated: 1699770183 \ No newline at end of file diff --git a/Assets/HCMiniSdk/Scripts/Other/HCInfoUtils.cs b/Assets/HCMiniSdk/Scripts/Other/HCInfoUtils.cs new file mode 100644 index 00000000..b10cd947 --- /dev/null +++ b/Assets/HCMiniSdk/Scripts/Other/HCInfoUtils.cs @@ -0,0 +1,117 @@ +using System.Collections.Generic; +using UnityEngine; + +namespace HC +{ + public class HCInfoUtils + { + public static string GetLanguage() + { +#if UNITY_WEBGL || WEBGL_BYTEDANCE + return HCWebGLSDKManager.AppInfo.GetLanguage(); +#else + return HCLanguageUtils.GetLanguageCode(Application.systemLanguage); +#endif + } + + public static string GetAppVersionCode() + { + return HCTools.GetVersionCode(); + } + + public static object GetAppVersion() + { +#if UNITY_WEBGL || WEBGL_BYTEDANCE + return HCWebGLSDKManager.AppInfo.GetVersion(); +#else + return Application.version; +#endif + } + + public static object GetDeviceType() + { +#if UNITY_ANDROID && !WEBGL_BYTEDANCE + return "Android"; +#elif UNITY_IOS + return "iPhone"; +#elif UNITY_WEBGL || WEBGL_BYTEDANCE + return "webgl"; +#else + return "PC"; +#endif + } + + public static string GetChannel() + { +#if UNITY_ANDROID && !WEBGL_BYTEDANCE + return "googleplay"; +#elif UNITY_IOS + return "AppStore"; +#elif UNITY_WEBGL && WEBGL_WX + return "wechat"; +#elif WEBGL_BYTEDANCE + return "douyin"; +#else + return "Other"; +#endif + } + + public static string GetPlatform() + { +#if UNITY_ANDROID && !WEBGL_BYTEDANCE + return "android"; +#elif UNITY_IOS + return "iOS"; +#elif UNITY_WEBGL || WEBGL_BYTEDANCE + return HCWebGLSDKManager.AppInfo.GetPlatform(); +#else + return "Other"; +#endif + } + + public static string GetBundleID() + { +#if UNITY_WEBGL || WEBGL_BYTEDANCE + return HCWebGLSDKManager.AppInfo.GetBundleID(); +#else + return ""; +#endif + } + + public static string GetModel() + { +#if UNITY_WEBGL || WEBGL_BYTEDANCE + return HCWebGLSDKManager.AppInfo.GetModel(); +#else + return ""; +#endif + } + + public static string GetBrand() + { +#if UNITY_WEBGL || WEBGL_BYTEDANCE + return HCWebGLSDKManager.AppInfo.GetBrand(); +#else + return ""; +#endif + } + + public static string GetSystemName() + { +#if UNITY_WEBGL || WEBGL_BYTEDANCE + return HCWebGLSDKManager.AppInfo.GetSystemName(); +#else + return ""; +#endif + } + + public static Dictionary GetBaseInfo() + { + var dictionary = new Dictionary(); +#if UNITY_WEBGL || WEBGL_BYTEDANCE + return HCWebGLSDKManager.AppInfo.GetBaseInfo(); +#endif + return dictionary; + } + } +} \ No newline at end of file diff --git a/Assets/HCMiniSdk/Scripts/Other/HCInfoUtils.cs.meta b/Assets/HCMiniSdk/Scripts/Other/HCInfoUtils.cs.meta new file mode 100644 index 00000000..05dbbedf --- /dev/null +++ b/Assets/HCMiniSdk/Scripts/Other/HCInfoUtils.cs.meta @@ -0,0 +1,3 @@ +fileFormatVersion: 2 +guid: 7a87c61104f747a39492a4e992caa773 +timeCreated: 1699597853 \ No newline at end of file diff --git a/Assets/HCMiniSdk/Scripts/Other/HCInput.cs b/Assets/HCMiniSdk/Scripts/Other/HCInput.cs new file mode 100644 index 00000000..d747a84f --- /dev/null +++ b/Assets/HCMiniSdk/Scripts/Other/HCInput.cs @@ -0,0 +1,87 @@ +using UnityEngine; +using UnityEngine.EventSystems; +using UnityEngine.UI; + +#if WEBGL_WX && !UNITY_EDITOR +using WeChatWASM; +#endif + +namespace HCMiniSdk.Scripts.Other +{ + public class HCInput : MonoBehaviour, IPointerClickHandler, IPointerExitHandler + { + private InputField input; + private bool isShowKeyboard = false; + + private void Start() + { + input = gameObject.GetComponent(); + } + + public void OnPointerClick(PointerEventData eventData) + { +#if WEBGL_WX && !UNITY_EDITOR + ShowKeyboard(); +#endif + } + + public void OnPointerExit(PointerEventData eventData) + { +#if WEBGL_WX && !UNITY_EDITOR + if (!input.isFocused) + { + HideKeyboard(); + } +#endif + } + +#if WEBGL_WX && !UNITY_EDITOR + public void OnInput(OnKeyboardInputListenerResult v) + { + if (input.isFocused) + { + input.text = v.value; + } + } + + public void OnConfirm(OnKeyboardInputListenerResult v) + { + HideKeyboard(); + } + + public void OnComplete(OnKeyboardInputListenerResult v) + { + input.text = v.value; + HideKeyboard(); + } + + private void ShowKeyboard() + { + if (isShowKeyboard) return; + WX.ShowKeyboard(new ShowKeyboardOption() + { + defaultValue = $"{input.text}", + maxLength = 1024, + confirmType = "go" + }); + + //绑定回调 + WX.OnKeyboardConfirm(OnConfirm); + WX.OnKeyboardComplete(OnComplete); + WX.OnKeyboardInput(OnInput); + isShowKeyboard = true; + } + + private void HideKeyboard() + { + if (!isShowKeyboard) return; + WX.HideKeyboard(new HideKeyboardOption()); + //删除掉相关事件监听 + WX.OffKeyboardInput(OnInput); + WX.OffKeyboardConfirm(OnConfirm); + WX.OffKeyboardComplete(OnComplete); + isShowKeyboard = false; + } +#endif + } +} \ No newline at end of file diff --git a/Assets/HCMiniSdk/Scripts/Other/HCInput.cs.meta b/Assets/HCMiniSdk/Scripts/Other/HCInput.cs.meta new file mode 100644 index 00000000..18a9d709 --- /dev/null +++ b/Assets/HCMiniSdk/Scripts/Other/HCInput.cs.meta @@ -0,0 +1,3 @@ +fileFormatVersion: 2 +guid: 75b1af924b324371ae9fdce2a490d481 +timeCreated: 1706142711 \ No newline at end of file diff --git a/Assets/HCMiniSdk/Scripts/Other/HCLanguageUtils.cs b/Assets/HCMiniSdk/Scripts/Other/HCLanguageUtils.cs new file mode 100644 index 00000000..bf18d774 --- /dev/null +++ b/Assets/HCMiniSdk/Scripts/Other/HCLanguageUtils.cs @@ -0,0 +1,60 @@ +using System.Collections.Generic; +using UnityEngine; + +namespace HC +{ + public class HCLanguageUtils + { + private static Dictionary languageCodeMap = new Dictionary() + { + { SystemLanguage.Afrikaans, "af" }, + { SystemLanguage.Arabic, "ar" }, + { SystemLanguage.Basque, "eu" }, + { SystemLanguage.Belarusian, "be" }, + { SystemLanguage.Bulgarian, "bg" }, + { SystemLanguage.Catalan, "ca" }, + { SystemLanguage.Chinese, "zh" }, + { SystemLanguage.ChineseSimplified, "zh-CN" }, + { SystemLanguage.ChineseTraditional, "zh-TW" }, + { SystemLanguage.Czech, "cs" }, + { SystemLanguage.Danish, "da" }, + { SystemLanguage.Dutch, "nl" }, + { SystemLanguage.English, "en" }, + { SystemLanguage.Estonian, "et" }, + { SystemLanguage.Faroese, "fo" }, + { SystemLanguage.Finnish, "fi" }, + { SystemLanguage.French, "fr" }, + { SystemLanguage.German, "de" }, + { SystemLanguage.Greek, "el" }, + { SystemLanguage.Hebrew, "he" }, + { SystemLanguage.Hungarian, "hu" }, + { SystemLanguage.Icelandic, "is" }, + { SystemLanguage.Indonesian, "id" }, + { SystemLanguage.Italian, "it" }, + { SystemLanguage.Japanese, "ja" }, + { SystemLanguage.Korean, "ko" }, + { SystemLanguage.Latvian, "lv" }, + { SystemLanguage.Lithuanian, "lt" }, + { SystemLanguage.Norwegian, "no" }, + { SystemLanguage.Polish, "pl" }, + { SystemLanguage.Portuguese, "pt" }, + { SystemLanguage.Romanian, "ro" }, + { SystemLanguage.Russian, "ru" }, + { SystemLanguage.SerboCroatian, "sr" }, + { SystemLanguage.Slovak, "sk" }, + { SystemLanguage.Slovenian, "sl" }, + { SystemLanguage.Spanish, "es" }, + { SystemLanguage.Swedish, "sv" }, + { SystemLanguage.Thai, "th" }, + { SystemLanguage.Turkish, "tr" }, + { SystemLanguage.Ukrainian, "uk" }, + { SystemLanguage.Vietnamese, "vi" }, + { SystemLanguage.Unknown, "" } + }; + + public static string GetLanguageCode(SystemLanguage language) + { + return languageCodeMap.TryGetValue(language, out var code) ? code : language.ToString(); + } + } +} \ No newline at end of file diff --git a/Assets/HCMiniSdk/Scripts/Other/HCLanguageUtils.cs.meta b/Assets/HCMiniSdk/Scripts/Other/HCLanguageUtils.cs.meta new file mode 100644 index 00000000..209beffc --- /dev/null +++ b/Assets/HCMiniSdk/Scripts/Other/HCLanguageUtils.cs.meta @@ -0,0 +1,3 @@ +fileFormatVersion: 2 +guid: 1e8cc655aba447a29cbcb18400f72eec +timeCreated: 1699597406 \ No newline at end of file diff --git a/Assets/HCMiniSdk/Scripts/Other/HCSingleton.cs b/Assets/HCMiniSdk/Scripts/Other/HCSingleton.cs new file mode 100644 index 00000000..1d23e2c4 --- /dev/null +++ b/Assets/HCMiniSdk/Scripts/Other/HCSingleton.cs @@ -0,0 +1,41 @@ +using UnityEngine; +using System.Collections; + +namespace HC +{ + public class HCSingleton : MonoBehaviour where T : MonoBehaviour + { + private static T _instance; + + public static T Instance + { + get + { + if (null == _instance) + { + _instance = Object.FindObjectOfType(typeof(T)) as T; + if (null != _instance) return _instance; + + GameObject container = new GameObject + { + name = typeof(T).ToString() + }; + container.hideFlags = HideFlags.HideInHierarchy; + _instance = container.AddComponent(typeof(T)) as T; + Object.DontDestroyOnLoad(container); + } + return _instance; + } + } + + private void Awake() + { + OnInstanceCreate(); + } + + protected virtual void OnInstanceCreate() + { + + } + } +} \ No newline at end of file diff --git a/Assets/HCMiniSdk/Scripts/Other/HCSingleton.cs.meta b/Assets/HCMiniSdk/Scripts/Other/HCSingleton.cs.meta new file mode 100644 index 00000000..be57df2d --- /dev/null +++ b/Assets/HCMiniSdk/Scripts/Other/HCSingleton.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: bff72135ed82848acb91aa807212e257 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/HCMiniSdk/Scripts/Other/HCTimeTools.cs b/Assets/HCMiniSdk/Scripts/Other/HCTimeTools.cs new file mode 100644 index 00000000..4ab8f25d --- /dev/null +++ b/Assets/HCMiniSdk/Scripts/Other/HCTimeTools.cs @@ -0,0 +1,34 @@ +using System; + +namespace HC +{ + public static class HCTimeTools + { + // 获取当前时间戳 + public static long GetCurrentTimestamp() + { + return DateTimeOffset.UtcNow.ToUnixTimeSeconds(); + } + + // 获取两个时间戳相差的天数 + public static int GetDaysBetweenTimestamps(long timestamp1, long timestamp2) + { + var dateTimeOffset = DateTimeOffset.FromUnixTimeSeconds(timestamp1); + var dateTime1 = dateTimeOffset.LocalDateTime; + var dateTimeOffset2 = DateTimeOffset.FromUnixTimeSeconds(timestamp2); + var dateTime2 = dateTimeOffset2.LocalDateTime; + var date1 = dateTime1.Date; + var date2 = dateTime2.Date; + return (date2 - date1).Days; + } + + // 格式化时间为指定格式的字符串 + public static string FormatDateTime(long timestamp, string format) + { + var dateTimeOffset = DateTimeOffset.FromUnixTimeSeconds(timestamp); + var dateTime = dateTimeOffset.LocalDateTime; + var formattedDateTime = dateTime.ToString(format); + return formattedDateTime; + } + } +} \ No newline at end of file diff --git a/Assets/HCMiniSdk/Scripts/Other/HCTimeTools.cs.meta b/Assets/HCMiniSdk/Scripts/Other/HCTimeTools.cs.meta new file mode 100644 index 00000000..63055f24 --- /dev/null +++ b/Assets/HCMiniSdk/Scripts/Other/HCTimeTools.cs.meta @@ -0,0 +1,3 @@ +fileFormatVersion: 2 +guid: cc3f60c865cf4ed590a0ced32c4e59a6 +timeCreated: 1698243163 \ No newline at end of file diff --git a/Assets/HCMiniSdk/Scripts/Other/HCTools.cs b/Assets/HCMiniSdk/Scripts/Other/HCTools.cs new file mode 100644 index 00000000..b1b356d6 --- /dev/null +++ b/Assets/HCMiniSdk/Scripts/Other/HCTools.cs @@ -0,0 +1,125 @@ +using System; +using System.Collections; +using System.Collections.Generic; +using UnityEditor; +using UnityEngine; + +namespace HC { + public class HCTools + { + public static string SS_DISTINCT_ID = "ss_distinct_id"; + private const string HC_PREFIX = "HC_"; + private const string Remove_Ads = HC_PREFIX + "_" + "RemoveAds"; + + public const string FIRST_TIME_OPEN_GAME = "first_time_open_game"; + + public static bool IsRemoveAds() + { + return GetPlayerPrefsInt(Remove_Ads, 0) == 1; + } + + public static void SetRemoveAds() + { + SavePlayerPrefsInt(Remove_Ads, 1); + } + + public static float GetPlayerPrefsFloat(string _key, float _dValue = 0.0f) + { + float value = PlayerPrefs.GetFloat(string.Format("{0}{1}", HC_PREFIX, _key), _dValue); + return value; + } + + public static void SavePlayerPrefsFloat(string _key, float _nValue) + { + PlayerPrefs.SetFloat(string.Format("{0}{1}", HC_PREFIX, _key), _nValue); + PlayerPrefs.Save(); + } + + public static int GetPlayerPrefsInt(string _key, int _dValue = 0) + { + int value = PlayerPrefs.GetInt(string.Format("{0}{1}", HC_PREFIX, _key), _dValue); + return value; + } + + public static void SavePlayerPrefsInt(string _key, int _nValue) + { + PlayerPrefs.SetInt(string.Format("{0}{1}", HC_PREFIX, _key), _nValue); + PlayerPrefs.Save(); + } + + public static string GetPlayerPrefsString(string _key, string _dValue = "") + { + string value = PlayerPrefs.GetString(string.Format("{0}{1}", HC_PREFIX, _key), _dValue); + return value; + } + + public static void SavePlayerPrefsString(string _key, string _nValue) + { + PlayerPrefs.SetString(string.Format("{0}{1}", HC_PREFIX, _key), _nValue); + PlayerPrefs.Save(); + } + + public static bool IfFirstCheckPlayerPrefs(string _key) + { + var isFirstClick = PlayerPrefs.GetInt(_key, 0) == 0; + PlayerPrefs.SetInt(_key, 1); + PlayerPrefs.Save(); + return isFirstClick; + } + + public static bool HasKey(string key) + { + return PlayerPrefs.HasKey($"{HC_PREFIX}{key}"); + } + + + public static void DeleteKey(string key) + { + PlayerPrefs.DeleteKey($"{HC_PREFIX}{key}"); + } + + public static bool IsChinese() + { + bool isZh = true; + string languageStr = Application.systemLanguage.ToString(); + if (languageStr.CompareTo("ChineseSimplified") == 0 + || languageStr.CompareTo("ChineseTraditional") == 0 + || languageStr.CompareTo("Chinese") == 0) + { + isZh = true; + } + else + { + isZh = false; + } + + return isZh; + } + + /// + /// todo 待替换为从原生层获取的 + /// + /// + public static string GetVersionCode() + { +#if UNITY_ADNROID + return GetAndroidVersionCode(); +#elif UNITY_IOS + return HCNativeInterfaceiOS.Instance.GetBuildVersionCode() ; +#endif + return ""; + } + + private static int GetAndroidVersionCode() + { + AndroidJavaClass contextCls = new AndroidJavaClass("com.unity3d.player.UnityPlayer"); + AndroidJavaObject context = contextCls.GetStatic("currentActivity"); + AndroidJavaObject packageMngr = context.Call("getPackageManager"); + string packageName = context.Call("getPackageName"); + AndroidJavaObject packageInfo = + packageMngr.Call("getPackageInfo", packageName, 0); + return packageInfo.Get("versionCode"); + } + + } +} \ No newline at end of file diff --git a/Assets/HCMiniSdk/Scripts/Other/HCTools.cs.meta b/Assets/HCMiniSdk/Scripts/Other/HCTools.cs.meta new file mode 100644 index 00000000..f8ad621a --- /dev/null +++ b/Assets/HCMiniSdk/Scripts/Other/HCTools.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: b541a1e4832974756a2a0d7a60dce715 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/HCMiniSdk/Scripts/Other/HCXXTEA.cs b/Assets/HCMiniSdk/Scripts/Other/HCXXTEA.cs new file mode 100644 index 00000000..f0505523 --- /dev/null +++ b/Assets/HCMiniSdk/Scripts/Other/HCXXTEA.cs @@ -0,0 +1,145 @@ +using System; + +namespace HC +{ + /// + /// XXTEA 加密算法的摘要说明 + /// + /// https://www.cnblogs.com/gfsov/archive/2007/12/06/984952.html + /// + public class HCXXTEA + { + public static Byte[] Encrypt(Byte[] Data, Byte[] Key) + { + if (Data.Length == 0) + { + return Data; + } + + return ToByteArray(Encrypt(ToUInt32Array(Data, true), ToUInt32Array(Key, false)), false); + } + + public static Byte[] Decrypt(Byte[] Data, Byte[] Key) + { + if (Data.Length == 0) + { + return Data; + } + + return ToByteArray(Decrypt(ToUInt32Array(Data, false), ToUInt32Array(Key, false)), true); + } + + public static UInt32[] Encrypt(UInt32[] v, UInt32[] k) + { + Int32 n = v.Length - 1; + if (n < 1) + { + return v; + } + + if (k.Length < 4) + { + UInt32[] Key = new UInt32[4]; + k.CopyTo(Key, 0); + k = Key; + } + + UInt32 z = v[n], y = v[0], delta = 0x9E3779B9, sum = 0, e; + Int32 p, q = 6 + 52 / (n + 1); + while (q-- > 0) + { + sum = unchecked(sum + delta); + e = sum >> 2 & 3; + for (p = 0; p < n; p++) + { + y = v[p + 1]; + z = unchecked(v[p] += (z >> 5 ^ y << 2) + (y >> 3 ^ z << 4) ^ (sum ^ y) + (k[p & 3 ^ e] ^ z)); + } + + y = v[0]; + z = unchecked(v[n] += (z >> 5 ^ y << 2) + (y >> 3 ^ z << 4) ^ (sum ^ y) + (k[p & 3 ^ e] ^ z)); + } + + return v; + } + + public static UInt32[] Decrypt(UInt32[] v, UInt32[] k) + { + Int32 n = v.Length - 1; + if (n < 1) + { + return v; + } + + if (k.Length < 4) + { + UInt32[] Key = new UInt32[4]; + k.CopyTo(Key, 0); + k = Key; + } + + UInt32 z = v[n], y = v[0], delta = 0x9E3779B9, sum, e; + Int32 p, q = 6 + 52 / (n + 1); + sum = unchecked((UInt32)(q * delta)); + while (sum != 0) + { + e = sum >> 2 & 3; + for (p = n; p > 0; p--) + { + z = v[p - 1]; + y = unchecked(v[p] -= (z >> 5 ^ y << 2) + (y >> 3 ^ z << 4) ^ (sum ^ y) + (k[p & 3 ^ e] ^ z)); + } + + z = v[n]; + y = unchecked(v[0] -= (z >> 5 ^ y << 2) + (y >> 3 ^ z << 4) ^ (sum ^ y) + (k[p & 3 ^ e] ^ z)); + sum = unchecked(sum - delta); + } + + return v; + } + + private static UInt32[] ToUInt32Array(Byte[] Data, Boolean IncludeLength) + { + Int32 n = (((Data.Length & 3) == 0) ? (Data.Length >> 2) : ((Data.Length >> 2) + 1)); + UInt32[] Result; + if (IncludeLength) + { + Result = new UInt32[n + 1]; + Result[n] = (UInt32)Data.Length; + } + else + { + Result = new UInt32[n]; + } + + n = Data.Length; + for (Int32 i = 0; i < n; i++) + { + Result[i >> 2] |= (UInt32)Data[i] << ((i & 3) << 3); + } + + return Result; + } + + private static Byte[] ToByteArray(UInt32[] Data, Boolean IncludeLength) + { + Int32 n; + if (IncludeLength) + { + n = (Int32)Data[Data.Length - 1]; + } + else + { + n = Data.Length << 2; + } + + Byte[] Result = new Byte[n]; + for (Int32 i = 0; i < n; i++) + { + Result[i] = (Byte)(Data[i >> 2] >> ((i & 3) << 3)); + } + + return Result; + } + } +} \ No newline at end of file diff --git a/Assets/HCMiniSdk/Scripts/Other/HCXXTEA.cs.meta b/Assets/HCMiniSdk/Scripts/Other/HCXXTEA.cs.meta new file mode 100644 index 00000000..54818f55 --- /dev/null +++ b/Assets/HCMiniSdk/Scripts/Other/HCXXTEA.cs.meta @@ -0,0 +1,3 @@ +fileFormatVersion: 2 +guid: 26d2dbc3f9544679883195c0d7c68924 +timeCreated: 1698884401 \ No newline at end of file diff --git a/Assets/HCMiniSdk/Scripts/Other/MiniJSON.cs b/Assets/HCMiniSdk/Scripts/Other/MiniJSON.cs new file mode 100644 index 00000000..3c000935 --- /dev/null +++ b/Assets/HCMiniSdk/Scripts/Other/MiniJSON.cs @@ -0,0 +1,630 @@ +/* + * Copyright (c) 2013 Calvin Rien + * + * Based on the JSON parser by Patrick van Bergen + * http://techblog.procurios.nl/k/618/news/view/14605/14863/How-do-I-write-my-own-parser-for-JSON.html + * + * Simplified it so that it doesn't throw exceptions + * and can be used in Unity iPhone with maximum code stripping. + * + * Permission is hereby granted, free of charge, to any person obtaining + * a copy of this software and associated documentation files (the + * "Software"), to deal in the Software without restriction, including + * without limitation the rights to use, copy, modify, merge, publish, + * distribute, sublicense, and/or sell copies of the Software, and to + * permit persons to whom the Software is furnished to do so, subject to + * the following conditions: + * + * The above copyright notice and this permission notice shall be + * included in all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, + * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. + * IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY + * CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, + * TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE + * SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + */ + +using System; +using System.Collections; +using System.Collections.Generic; +using System.IO; +using System.Text; + + +namespace HC.MiniJSON +{ + // Example usage: + // + // using UnityEngine; + // using System.Collections; + // using System.Collections.Generic; + // using MiniJSON; + // + // public class MiniJSONTest : MonoBehaviour { + // void Start () { + // var jsonString = "{ \"array\": [1.44,2,3], " + + // "\"object\": {\"key1\":\"value1\", \"key2\":256}, " + + // "\"string\": \"The quick brown fox \\\"jumps\\\" over the lazy dog \", " + + // "\"unicode\": \"\\u3041 Men\u00fa sesi\u00f3n\", " + + // "\"int\": 65536, " + + // "\"float\": 3.1415926, " + + // "\"bool\": true, " + + // "\"null\": null }"; + // + // var dict = Json.Deserialize(jsonString) as Dictionary; + // + // Debuger.Log("deserialized: " + dict.GetType()); + // Debuger.Log("dict['array'][0]: " + ((List) dict["array"])[0]); + // Debuger.Log("dict['string']: " + (string) dict["string"]); + // Debuger.Log("dict['float']: " + (double) dict["float"]); // floats come out as doubles + // Debuger.Log("dict['int']: " + (long) dict["int"]); // ints come out as longs + // Debuger.Log("dict['unicode']: " + (string) dict["unicode"]); + // + // var str = Json.Serialize(dict); + // + // Debuger.Log("serialized: " + str); + // } + // } + + /// + /// This class encodes and decodes JSON strings. + /// Spec. details, see http://www.json.org/ + /// + /// JSON uses Arrays and Objects. These correspond here to the datatypes IList and IDictionary. + /// All numbers are parsed to doubles. + /// + public static class Json + { + /// + /// Parses the string json into a value + /// + /// A JSON string. + /// An List<object>, a Dictionary<string, object>, a double, an integer,a string, null, true, or false + public static object Deserialize(string json) + { + // save the string for debug information + if (json == null) + { + return null; + } + + return Parser.Parse(json); + } + + sealed class Parser : IDisposable + { + const string WORD_BREAK = "{}[],:\""; + + public static bool IsWordBreak(char c) + { + return Char.IsWhiteSpace(c) || WORD_BREAK.IndexOf(c) != -1; + } + + enum TOKEN + { + NONE, + CURLY_OPEN, + CURLY_CLOSE, + SQUARED_OPEN, + SQUARED_CLOSE, + COLON, + COMMA, + STRING, + NUMBER, + TRUE, + FALSE, + NULL + }; + + StringReader json; + + Parser(string jsonString) + { + json = new StringReader(jsonString); + } + + public static object Parse(string jsonString) + { + using (var instance = new Parser(jsonString)) + { + return instance.ParseValue(); + } + } + + public void Dispose() + { + json.Dispose(); + json = null; + } + + Dictionary ParseObject() + { + Dictionary table = new Dictionary(); + + // ditch opening brace + json.Read(); + + // { + while (true) + { + switch (NextToken) + { + case TOKEN.NONE: + return null; + case TOKEN.COMMA: + continue; + case TOKEN.CURLY_CLOSE: + return table; + default: + // name + string name = ParseString(); + if (name == null) + { + return null; + } + + // : + if (NextToken != TOKEN.COLON) + { + return null; + } + + // ditch the colon + json.Read(); + + // value + table[name] = ParseValue(); + break; + } + } + } + + List ParseArray() + { + List array = new List(); + + // ditch opening bracket + json.Read(); + + // [ + var parsing = true; + while (parsing) + { + TOKEN nextToken = NextToken; + + switch (nextToken) + { + case TOKEN.NONE: + return null; + case TOKEN.COMMA: + continue; + case TOKEN.SQUARED_CLOSE: + parsing = false; + break; + default: + object value = ParseByToken(nextToken); + + array.Add(value); + break; + } + } + + return array; + } + + object ParseValue() + { + TOKEN nextToken = NextToken; + return ParseByToken(nextToken); + } + + object ParseByToken(TOKEN token) + { + switch (token) + { + case TOKEN.STRING: + return ParseString(); + case TOKEN.NUMBER: + return ParseNumber(); + case TOKEN.CURLY_OPEN: + return ParseObject(); + case TOKEN.SQUARED_OPEN: + return ParseArray(); + case TOKEN.TRUE: + return true; + case TOKEN.FALSE: + return false; + case TOKEN.NULL: + return null; + default: + return null; + } + } + + string ParseString() + { + StringBuilder s = new StringBuilder(); + char c; + + // ditch opening quote + json.Read(); + + bool parsing = true; + while (parsing) + { + if (json.Peek() == -1) + { + parsing = false; + break; + } + + c = NextChar; + switch (c) + { + case '"': + parsing = false; + break; + case '\\': + if (json.Peek() == -1) + { + parsing = false; + break; + } + + c = NextChar; + switch (c) + { + case '"': + case '\\': + case '/': + s.Append(c); + break; + case 'b': + s.Append('\b'); + break; + case 'f': + s.Append('\f'); + break; + case 'n': + s.Append('\n'); + break; + case 'r': + s.Append('\r'); + break; + case 't': + s.Append('\t'); + break; + case 'u': + var hex = new char[4]; + + for (int i = 0; i < 4; i++) + { + hex[i] = NextChar; + } + + s.Append((char)Convert.ToInt32(new string(hex), 16)); + break; + } + + break; + default: + s.Append(c); + break; + } + } + + return s.ToString(); + } + + object ParseNumber() + { + string number = NextWord; + + if (number.IndexOf('.') == -1) + { + long parsedInt; + Int64.TryParse(number, out parsedInt); + return parsedInt; + } + + double parsedDouble; + Double.TryParse(number, out parsedDouble); + return parsedDouble; + } + + void EatWhitespace() + { + while (json.Peek() != -1) + { + if (Char.IsWhiteSpace(PeekChar)) + json.Read(); + else + break; + } + } + + char PeekChar + { + get { return Convert.ToChar(json.Peek()); } + } + + char NextChar + { + get { return Convert.ToChar(json.Read()); } + } + + string NextWord + { + get + { + StringBuilder word = new StringBuilder(); + + while (json.Peek() != -1) + { + if (!IsWordBreak(PeekChar)) + { + word.Append(NextChar); + } + else + { + break; + } + } + + return word.ToString(); + } + } + + TOKEN NextToken + { + get + { + EatWhitespace(); + + if (json.Peek() == -1) + { + return TOKEN.NONE; + } + + switch (PeekChar) + { + case '{': + return TOKEN.CURLY_OPEN; + case '}': + json.Read(); + return TOKEN.CURLY_CLOSE; + case '[': + return TOKEN.SQUARED_OPEN; + case ']': + json.Read(); + return TOKEN.SQUARED_CLOSE; + case ',': + json.Read(); + return TOKEN.COMMA; + case '"': + return TOKEN.STRING; + case ':': + return TOKEN.COLON; + case '0': + case '1': + case '2': + case '3': + case '4': + case '5': + case '6': + case '7': + case '8': + case '9': + case '-': + return TOKEN.NUMBER; + } + + switch (NextWord) + { + case "false": + return TOKEN.FALSE; + case "true": + return TOKEN.TRUE; + case "null": + return TOKEN.NULL; + } + + return TOKEN.NONE; + } + } + } + + /// + /// Converts a IDictionary / IList object or a simple type (string, int, etc.) into a JSON string + /// + /// A Dictionary<string, object> / List<object> + /// A JSON encoded string, or null if object 'json' is not serializable + public static string Serialize(object obj) + { + return Serializer.Serialize(obj); + } + + sealed class Serializer + { + StringBuilder builder; + + Serializer() + { + builder = new StringBuilder(); + } + + public static string Serialize(object obj) + { + var instance = new Serializer(); + + instance.SerializeValue(obj); + + return instance.builder.ToString(); + } + + void SerializeValue(object value) + { + IList asList; + IDictionary asDict; + string asStr; + + if (value == null) + { + builder.Append("null"); + } + else if ((asStr = value as string) != null) + { + SerializeString(asStr); + } + else if (value is bool) + { + builder.Append((bool)value ? "true" : "false"); + } + else if ((asList = value as IList) != null) + { + SerializeArray(asList); + } + else if ((asDict = value as IDictionary) != null) + { + SerializeObject(asDict); + } + else if (value is char) + { + SerializeString(new string((char)value, 1)); + } + else + { + SerializeOther(value); + } + } + + void SerializeObject(IDictionary obj) + { + bool first = true; + + builder.Append('{'); + + foreach (object e in obj.Keys) + { + if (!first) + { + builder.Append(','); + } + + SerializeString(e.ToString()); + builder.Append(':'); + + SerializeValue(obj[e]); + + first = false; + } + + builder.Append('}'); + } + + void SerializeArray(IList anArray) + { + builder.Append('['); + + bool first = true; + + foreach (object obj in anArray) + { + if (!first) + { + builder.Append(','); + } + + SerializeValue(obj); + + first = false; + } + + builder.Append(']'); + } + + void SerializeString(string str) + { + builder.Append('\"'); + + char[] charArray = str.ToCharArray(); + foreach (var c in charArray) + { + switch (c) + { + case '"': + builder.Append("\\\""); + break; + case '\\': + builder.Append("\\\\"); + break; + case '\b': + builder.Append("\\b"); + break; + case '\f': + builder.Append("\\f"); + break; + case '\n': + builder.Append("\\n"); + break; + case '\r': + builder.Append("\\r"); + break; + case '\t': + builder.Append("\\t"); + break; + default: + int codepoint = Convert.ToInt32(c); + if ((codepoint >= 32) && (codepoint <= 126)) + { + builder.Append(c); + } + else + { + builder.Append("\\u"); + builder.Append(codepoint.ToString("x4")); + } + + break; + } + } + + builder.Append('\"'); + } + + void SerializeOther(object value) + { + // NOTE: decimals lose precision during serialization. + // They always have, I'm just letting you know. + // Previously floats and doubles lost precision too. + if (value is float) + { + builder.Append(((float)value).ToString("R")); + } + else if (value is int + || value is uint + || value is long + || value is sbyte + || value is byte + || value is short + || value is ushort + || value is ulong) + { + builder.Append(value); + } + else if (value is double + || value is decimal) + { + builder.Append(Convert.ToDouble(value).ToString("R")); + } + else + { + SerializeString(value.ToString()); + } + } + } + } +} \ No newline at end of file diff --git a/Assets/HCMiniSdk/Scripts/Other/MiniJSON.cs.meta b/Assets/HCMiniSdk/Scripts/Other/MiniJSON.cs.meta new file mode 100644 index 00000000..abcf0bf6 --- /dev/null +++ b/Assets/HCMiniSdk/Scripts/Other/MiniJSON.cs.meta @@ -0,0 +1,3 @@ +fileFormatVersion: 2 +guid: f0e39e79b8ae4adcae1a7a905ce8ad70 +timeCreated: 1699967576 \ No newline at end of file diff --git a/Assets/HCMiniSdk/Scripts/Sensitive.meta b/Assets/HCMiniSdk/Scripts/Sensitive.meta new file mode 100644 index 00000000..6ed56824 --- /dev/null +++ b/Assets/HCMiniSdk/Scripts/Sensitive.meta @@ -0,0 +1,3 @@ +fileFormatVersion: 2 +guid: 5878d8f80ad441109787efcdc9672f3e +timeCreated: 1706086809 \ No newline at end of file diff --git a/Assets/HCMiniSdk/Scripts/Sensitive/Resources.meta b/Assets/HCMiniSdk/Scripts/Sensitive/Resources.meta new file mode 100644 index 00000000..50023944 --- /dev/null +++ b/Assets/HCMiniSdk/Scripts/Sensitive/Resources.meta @@ -0,0 +1,3 @@ +fileFormatVersion: 2 +guid: f02fdce9789e41e7a8d64f54305fedd3 +timeCreated: 1706086772 \ No newline at end of file diff --git a/Assets/HCMiniSdk/Scripts/Sensitive/Resources/sensitivewords.txt b/Assets/HCMiniSdk/Scripts/Sensitive/Resources/sensitivewords.txt new file mode 100644 index 00000000..0f37e4fa --- /dev/null +++ b/Assets/HCMiniSdk/Scripts/Sensitive/Resources/sensitivewords.txt @@ -0,0 +1,37658 @@ +屄 +操 +肏 +艹 +2b +2屄 +2逼 +3p +⑥④ +8嘎 +9评 +AV +a片 +b毛 +g产 +g匪 +g片 +j8 +jb +JJ +j巴 +k粉 +sb +sm +一党 +一黨 +三挫 +三陪 +上你 +上妳 +上床 +下体 +下流 +下賤 +下贱 +下體 +不举 +专制 +专政 +丝袜 +丝足 +丫的 +中共 +中珙 +乏仑 +乏伦 +乏囵 +乏抡 +乏沦 +乏纶 +乏论 +乏轮 +乐淫 +乔石 +九评 +习氏 +买春 +买枪 +买肾 +乱交 +乱伦 +乱奸 +乱轮 +乳交 +乳头 +乳射 +乳尖 +乳尻 +乳峰 +乳房 +乳晕 +乳暈 +乳沟 +乳溝 +乳爆 +乳罩 +乳霸 +乳頭 +亂交 +亂倫 +二B +二屄 +二逼 +互淫 +亡党 +亡共 +亡国 +交媾 +交欢 +交配 +亮屄 +亮穴 +人兽 +人妖 +人妻 +人弹 +人渣 +仑功 +他妈 +他娘 +他媽 +代開 +伍凡 +伐仑 +伐伦 +伐囵 +伐抡 +伐沦 +伐论 +伐轮 +伟哥 +伦公 +伦功 +伦攻 +伪币 +伪钞 +伱妈 +体位 +体奸 +作愛 +作爱 +你妈 +你姥 +你娘 +你媽 +佳薇 +侖功 +供产 +借种 +倫功 +倭国 +倭寇 +假币 +假钞 +做愛 +做爱 +做雞 +做鴨 +做鸡 +做鸭 +偷情 +偷拍 +偷欢 +偷电 +偷窥 +偷精 +偷腥 +催情 +傻× +傻b +傻x +傻冒 +傻卵 +傻叉 +傻吊 +傻子 +傻屄 +傻批 +傻比 +傻臂 +傻逼 +僵贼 +党棍 +內射 +內衣 +內褲 +全裸 +八九 +八嘎 +六四 +共产 +共党 +共匪 +共惨 +共狗 +共贼 +共铲 +兼之 +兼值 +兼执 +兼直 +兼职 +兽交 +兽奸 +兽欲 +内射 +内衣 +内裤 +再奸 +最淫 +军刺 +军妓 +冰毒 +冰砖 +凌辱 +几8 +几八 +几叭 +几吧 +几巴 +処女 +出台 +出轨 +击毙 +刘淇 +刘荻 +初夜 +刹笔 +剑奴 +劉淇 +办怔 +功友 +加q +加v +加叩 +加寇 +加扣 +加抠 +加蔻 +加薇 +勃起 +勾引 +包养 +包夜 +包射 +包皮 +匕首 +北韩 +卖b +卖号 +卖币 +卖春 +卖枪 +卖比 +卖淫 +卖精 +卖肝 +卖肾 +卖身 +卖逼 +卖骚 +博彩 +博訊 +博讯 +卧底 +卧槽 +卧艹 +厕奴 +去死 +双乳 +双筒 +双臀 +双飞 +反g +反党 +反共 +反黨 +发仑 +发伦 +发囵 +发情 +发抡 +发春 +发沦 +发浪 +发纶 +发论 +发轮 +发骚 +受奴 +口4 +口8 +口交 +口射 +口技 +口活 +口淫 +口爆 +口硬 +叫床 +叫春 +召妓 +台毒 +台独 +台獨 +叶群 +吃屎 +吃精 +合欢 +吊大 +同床 +后庭 +后穴 +吗b +吗啡 +吗比 +吗的 +吗逼 +吞精 +含乳 +含屌 +吳儀 +吳德 +吴仪 +吴德 +吸毒 +吸精 +吹潮 +吹箫 +吹箭 +吹簫 +呻吟 +品穴 +哒赖 +唑仑 +售枪 +售肾 +啪友 +喬石 +喵的 +喷尿 +喷精 +嗎b +嗎啡 +嗎比 +嗎的 +嗎逼 +嗑药 +嘿咻 +噴精 +国母 +国贼 +國賊 +土共 +土枪 +圣战 +圣水 +坐台 +坐爱 +坐脸 +垡仑 +垡伦 +垡囵 +垡抡 +垡沦 +垡纶 +垡论 +垡轮 +垮台 +垮臺 +堕淫 +墮淫 +壮阳 +处女 +处男 +外围 +外遇 +外阴 +外陰 +夜情 +夜淫 +大乳 +大奶 +大屌 +大法 +大逼 +大麻 +天葬 +太监 +太監 +失身 +夹紧 +女乃 +女也 +女人 +女优 +女優 +女女 +女奴 +女尔 +女尻 +女屄 +女干 +女幹 +女良 +女装 +女馬 +女马 +奴性 +奶交 +奶头 +奶子 +奶疼 +奶罩 +奶頭 +奸他 +奸你 +奸她 +奸尸 +奸幼 +奸情 +奸暴 +奸杀 +奸染 +奸污 +奸淫 +她妈 +好色 +妈b +妈个 +妈批 +妈比 +妈的 +妈逼 +妓女 +妓男 +妓院 +妳娘 +姘头 +姘頭 +姦情 +姦汙 +姦淫 +姫辱 +娇喘 +娇臀 +娘b +娘比 +娘的 +娼妇 +娼妓 +娼淫 +婊子 +媚药 +媽B +媽比 +媽的 +媽逼 +嫐屄 +嫖妓 +嫖娼 +嫖客 +嫖鸡 +嫩b +嫩女 +嫩奶 +嫩屄 +嫩穴 +嫩縫 +嫩缝 +嫩臀 +嫩逼 +嫩阴 +嫩鮑 +嫩鲍 +学潮 +学运 +學潮 +它妈 +宏志 +宏法 +官匪 +寇4 +寇8 +射了 +射交 +射你 +射奶 +射爽 +射精 +射顏 +射颜 +專制 +專政 +小B +小平 +小穴 +小逼 +尖值 +尻屄 +屁眼 +屁精 +屁股 +屄屄 +屄毛 +屄赋 +屌大 +屌毛 +屠城 +岳武 +左轮 +巨乳 +巨奶 +巨屌 +巨騷 +巨骚 +师涛 +干他 +干你 +干她 +干妳 +干尼 +干您 +干我 +干死 +干炮 +干爽 +干砲 +干穴 +干逼 +平反 +幹他 +幹你 +幹她 +幹妳 +幹死 +幹炮 +幹砲 +幹穴 +幹逼 +幼交 +幼女 +幼妓 +幼逼 +幾八 +幾叭 +幾巴 +床伴 +床照 +底裤 +废物 +康生 +开房 +开苞 +弓驽 +张杰 +弩枪 +強姦 +強暴 +弹夹 +强奸 +强暴 +彩宝 +彭冲 +彭真 +後庭 +思潮 +性交 +性伴 +性吧 +性器 +性奴 +性媾 +性学 +性息 +性愛 +性欲 +性爱 +性病 +性瘾 +性福 +性虎 +性虐 +性趣 +性霸 +恋尸 +恋童 +恋足 +恶党 +恶警 +情妇 +情欲 +情色 +愛液 +慧网 +戈扬 +我奸 +我干 +我幹 +我操 +我日 +我考 +我色 +我艹 +我草 +我靠 +戒严 +戳比 +戳逼 +房事 +手弩 +手枪 +手淫 +扒光 +扒屄 +扒穴 +打泡 +打炮 +打砲 +扣4 +扣8 +扣穴 +找女 +找骚 +找鸡 +把妹 +抓胸 +抠4 +抠8 +抠穴 +抡功 +抽插 +拐卖 +拔屄 +招妓 +招嫖 +招雞 +招鸡 +择民 +拱铲 +拳交 +挑情 +捅B +捅他 +捅你 +捅她 +捅我 +捅比 +捅逼 +捆绑 +换偶 +换妻 +掄功 +掰屄 +掰穴 +揉乳 +揉奶 +插b +插他 +插你 +插奶 +插她 +插妳 +插我 +插插 +插暴 +插比 +插穴 +插进 +插進 +插逼 +插阴 +插陰 +換妻 +握乳 +援交 +搔逼 +搞B +搞你 +搞她 +搞死 +搞比 +摳穴 +摸你 +摸奶 +摸胸 +摸逼 +撩骚 +撸管 +操b +操他 +操你 +操她 +操妳 +操妻 +操婊 +操它 +操射 +操屄 +操我 +操操 +操死 +操比 +操烂 +操爛 +操爽 +操穴 +操肏 +操肿 +操腫 +操蛋 +操逼 +操雞 +操鸡 +操黑 +支那 +攻台 +放荡 +放蕩 +政f +政付 +政俯 +政变 +政腐 +政變 +文爱 +文胸 +方毅 +无码 +日b +日他 +日你 +日入 +日啊 +日她 +日屄 +日您 +日批 +日死 +日比 +日烂 +日爽 +日结 +日翻 +日蛋 +日逼 +早泄 +早洩 +昏药 +春宫 +春梦 +春药 +春葯 +春藥 +晚娘 +晨勃 +普京 +智障 +暴乱 +暴乳 +暴亂 +暴动 +暴動 +暴奸 +暴干 +暴幹 +暴恐 +暴政 +暴淫 +暴菊 +曰你 +曰曰 +曹你 +替考 +有码 +朱德 +机8 +机八 +机叭 +机吧 +机巴 +机掰 +杀b +杀光 +杀它 +杀毙 +杀警 +杂种 +李希 +李录 +李禄 +李鵬 +李鹏 +村奴 +林彪 +枪械 +枪模 +枪毙 +柯碱 +柴玲 +校鸡 +梅毒 +機八 +機吧 +機巴 +欠干 +欠幹 +欠操 +欠日 +欲女 +欲火 +歇逼 +正府 +歪逼 +死刑 +死逼 +殃视 +母奸 +毒品 +毒豺 +毒販 +毒贩 +毒龙 +比样 +毛乳 +毛共 +毛妓 +毛淫 +毛片 +民殇 +民猪 +民运 +民運 +民阵 +气枪 +气狗 +氣槍 +求操 +求欢 +求精 +求肾 +求裸 +汉奸 +江派 +江贼 +江青 +汪岷 +汪洋 +汽枪 +沈彤 +沙比 +沦公 +沦功 +沦攻 +河殇 +泓志 +法仑 +法伦 +法功 +法囵 +法愣 +法抡 +法掄 +法沦 +法淪 +法綸 +法纶 +法论 +法輪 +法轮 +泡友 +波推 +波胆 +波霸 +泼妇 +泽东 +泽民 +洗钱 +洪传 +洪吟 +洪志 +活好 +流淫 +浓精 +浪叫 +浪女 +浪妇 +浪妓 +浪婦 +浪穴 +浪逼 +浴女 +涛哥 +涩情 +淩辱 +淪功 +淫B +淫书 +淫乱 +淫亂 +淫亵 +淫人 +淫传 +淫僧 +淫儿 +淫兽 +淫叫 +淫图 +淫圖 +淫女 +淫奴 +淫奸 +淫妇 +淫妞 +淫妹 +淫妻 +淫姐 +淫威 +淫娃 +淫姬 +淫娘 +淫婦 +淫媚 +淫屄 +淫店 +淫情 +淫戏 +淫才 +淫星 +淫書 +淫样 +淫棍 +淫樣 +淫欲 +淫母 +淫毛 +淫民 +淫水 +淫汁 +淫河 +淫洞 +淫流 +淫浆 +淫浪 +淫液 +淫湿 +淫漿 +淫照 +淫玩 +淫痴 +淫癡 +淫秽 +淫穢 +淫穴 +淫窝 +淫精 +淫糜 +淫网 +淫肉 +淫腔 +淫色 +淫荡 +淫蕩 +淫虐 +淫虫 +淫蜜 +淫蟲 +淫记 +淫语 +淫貨 +淫賤 +淫货 +淫贱 +淫贼 +淫逼 +淫靡 +淫骚 +淫魔 +深喉 +混蛋 +湿了 +湿穴 +滕武 +满狗 +滥交 +滥比 +滥逼 +滴蜡 +漏B +漏乳 +漏胸 +漏逼 +漢奸 +潮吹 +潮喷 +潮噴 +激插 +濕穴 +濫B +濫交 +濫比 +濫逼 +灭共 +灭日 +炮友 +炸弹 +炸药 +烂b +烂人 +烂屄 +烂屌 +烂比 +烂货 +烂逼 +煞笔 +煞筆 +煞逼 +熊炎 +熊焱 +熟女 +熟妇 +熟婦 +熟母 +爆乳 +爆奶 +爆操 +爆草 +爆菊 +爛B +爛比 +爛貨 +爛逼 +爱欲 +爱液 +爱爱 +爽图 +爽穴 +特码 +特马 +犬交 +犯賤 +犯贱 +犯践 +犯踐 +狂干 +狂插 +狂搞 +狂操 +狗B +狗屁 +狗干 +狗幹 +狗操 +狗日 +狗比 +狗逼 +独裁 +狼友 +猎枪 +猎槍 +猖妓 +猛干 +猛插 +猥亵 +猥琐 +猥褻 +獨裁 +獵槍 +獸交 +獸奸 +獸欲 +玉乳 +玉体 +玉穴 +玉茎 +王丹 +王毅 +王震 +玩穴 +玩逼 +珈扣 +珐仑 +珐伦 +珐囵 +珐抡 +珐沦 +珐纶 +珐论 +珐轮 +甲苯 +电棍 +男优 +男奴 +男妓 +男根 +男鸭 +畜生 +疆独 +疆獨 +疯插 +症腐 +痴汉 +瘟比 +發倫 +發掄 +發淪 +發綸 +發論 +白丝 +白洁 +白痴 +白癡 +白砒 +白粉 +监职 +盗撮 +盛雪 +直刀 +真钞 +睪丸 +睾丸 +码报 +砍死 +砒霜 +砝仑 +砝伦 +砝囵 +砝抡 +砝沦 +砝纶 +砝论 +砝轮 +砲友 +破处 +破處 +破鞋 +磕彰 +磕炮 +磕药 +磕藥 +禁春 +禁果 +禁片 +禽兽 +禽獸 +私处 +私處 +秃鹰 +秒射 +穴口 +穴啪 +穴淫 +穴爽 +穴紧 +穷b +穷逼 +窑子 +笨屄 +笨比 +笨逼 +筏仑 +筏囵 +筏抡 +筏沦 +筏纶 +筏论 +筏轮 +簧片 +粉屄 +粉穴 +精子 +精液 +精虫 +精蟲 +素女 +紧穴 +絲襪 +綸功 +緊穴 +红志 +约x +约泡 +约炮 +约爱 +纶功 +缠绵 +缺性 +罂粟 +罌粟 +罚仑 +罚伦 +罚囵 +罚抡 +罚沦 +罚纶 +罢工 +罩杯 +美乳 +美女 +美穴 +美腿 +美臀 +美逼 +群P +群交 +群奸 +群射 +耀邦 +老b +老习 +老比 +老逼 +老鸨 +耿飙 +耿飚 +聊性 +聖戰 +肉具 +肉唇 +肉壶 +肉慾 +肉棍 +肉棒 +肉欲 +肉洞 +肉穴 +肉縫 +肉缝 +肉茎 +肉莖 +肉逼 +肏你 +肏屄 +肏死 +肏穴 +肛交 +肛屄 +肛栓 +肛門 +肛门 +肥臀 +肥逼 +胡瘟 +胴体 +胸罩 +胸蓷 +胸部 +脑残 +脚交 +脚奴 +脚虐 +脱光 +脱衣 +腐败 +腚眼 +腳交 +腾武 +臀沟 +臀蓷 +臀部 +臧独 +自慰 +自残 +自焚 +臭b +臺獨 +舔b +舔奶 +舔屄 +舔脚 +舔腳 +舔荫 +舔逼 +舔阴 +舞女 +色医 +色友 +色女 +色情 +色惑 +色慾 +色戒 +色欲 +色淫 +色狗 +色狼 +色猫 +色色 +色诱 +色貓 +色逼 +色降 +色鬼 +艳事 +艳情 +艳母 +艳照 +艹你 +苏荣 +草你 +草榴 +荡女 +荡妇 +荡妹 +荭志 +菊暴 +菊爆 +菊穴 +菊门 +菜B +菜逼 +菲彩 +葬独 +蒙独 +蒙獨 +蒹之 +蒹只 +蒹直 +蒹职 +蔻4 +蔻8 +蕩女 +蕩妹 +蕩婦 +薄熙 +藏毒 +藏独 +藏獨 +藤武 +虐肛 +虐阳 +處女 +虹志 +蜜液 +蜜穴 +血比 +血逼 +行房 +行淫 +被干 +被幹 +被插 +被操 +装b +装屄 +装逼 +裸体 +裸图 +裸女 +裸照 +裸聊 +裸舞 +裸陪 +西独 +誘姦 +調教 +警匪 +论公 +论功 +论攻 +诱奸 +调情 +调教 +谢非 +豔照 +豪乳 +貞操 +買春 +賀龍 +賣B +賣幣 +賣比 +賣淫 +賣號 +賣逼 +賣騷 +賤人 +賤種 +賤貨 +賤逼 +贡挡 +贩毒 +贪官 +贪淫 +贫乳 +贱b +贱人 +贱妇 +贱比 +贱种 +贱货 +贱逼 +贺龙 +赌具 +赌博 +赌术 +赌波 +赌球 +赌马 +赤匪 +走光 +走肾 +超市 +超速 +足交 +践货 +跳刀 +跳蛋 +蹂躏 +軍妓 +輪公 +輪功 +輪奸 +輪姦 +輪攻 +輪暴 +车震 +轮公 +轮功 +轮大 +轮奸 +轮干 +轮操 +轮攻 +轮暴 +轮盘 +辦證 +辱师 +达癞 +达賴 +达赖 +近平 +迦葳 +迦薇 +迫奸 +迷奸 +迷药 +迷藥 +迷魂 +退党 +退黨 +造反 +造愛 +造爱 +逼奸 +逼样 +逼樣 +逼毛 +逼痒 +逼癢 +達賴 +達赖 +遗精 +邢铮 +邪党 +酥穴 +酥胸 +释欲 +釋欲 +野战 +金瓶 +钞票 +钢叉 +钱达 +铅弹 +错逼 +開碼 +開苞 +闳志 +阀仑 +阀伦 +阀囵 +阀抡 +阀沦 +阀纶 +阀论 +阳具 +阳痿 +阳精 +阳萎 +阴b +阴唇 +阴囊 +阴屄 +阴户 +阴核 +阴毛 +阴水 +阴液 +阴穴 +阴精 +阴締 +阴缔 +阴茎 +阴莖 +阴蒂 +阴道 +阴部 +阴门 +陆肆 +陈希 +陈毅 +陪睡 +陪聊 +陰唇 +陰囊 +陰屄 +陰戶 +陰核 +陰毛 +陰水 +陰精 +陰締 +陰茎 +陰莖 +陰蒂 +陰道 +陰部 +陰門 +陳毅 +陽具 +陽痿 +陽精 +陽萎 +雏妓 +雜種 +雞8 +雞八 +雞叭 +雞吧 +雞女 +雞奸 +雞巴 +雞掰 +雞芭 +雞院 +雞雞 +雷汞 +雷管 +霰弹 +露b +露乳 +露屄 +露毛 +露点 +露穴 +露逼 +露點 +青楼 +青樓 +鞑子 +韓正 +韩正 +顏射 +颜射 +颜骑 +风骚 +食屎 +食精 +饥渴 +騰武 +騷B +騷乳 +騷包 +騷卵 +騷女 +騷妹 +騷妻 +騷媽 +騷屄 +騷批 +騷棍 +騷棒 +騷母 +騷比 +騷水 +騷洞 +騷浪 +騷穴 +騷貨 +騷逼 +騷雞 +騾幹 +马的 +骑他 +骑你 +骑她 +骚B +骚乳 +骚冰 +骚包 +骚卵 +骚嘴 +骚女 +骚妇 +骚妈 +骚妹 +骚妻 +骚屄 +骚情 +骚批 +骚棍 +骚棒 +骚母 +骚比 +骚水 +骚洞 +骚浪 +骚眼 +骚穴 +骚聊 +骚货 +骚贱 +骚逼 +骚鸡 +骡干 +高潮 +髙潮 +鮑彤 +鲍彤 +鲍戈 +鲍筒 +鴉片 +鶏8 +鶏女 +鶏奸 +鷄巴 +鸟巢 +鸡8 +鸡八 +鸡叭 +鸡吧 +鸡女 +鸡奸 +鸡巴 +鸡店 +鸡掰 +鸡芭 +鸡院 +鸡鸡 +鸦片 +鸭店 +麻古 +麻果 +麻烟 +麻谷 +黃片 +黃菊 +黄图 +黄片 +黄琦 +黄菊 +黑屄 +黑庄 +黑逼 +黑鬼 +齐墨 +齷齪 +龌龊 +龜头 +龜奴 +龜頭 +龟头 +龟奴 +龟頭 +18禁 +1叶情 +1叶青 +1夜情 +1夜晴 +1掖情 +1本道 +1液情 +1耶清 +1页晴 +1页青 +2奶大 +2级片 +2逼靠 +38淫 +3d肉 +3呆婊 +3唑仑 +3唑纶 +3棱刀 +3级片 +3陪女 +4事件 +4我周 +4级片 +54式 +5毛党 +6。4 +64事 +64式 +64枪 +69式 +6合彩 +6合采 +6和采 +77式 +77枪 +89学 +89年 +92式 +92枪 +av女 +av棒 +av片 +av狼 +a片网 +BB弹 +BB枪 +CAO +cnm +e乐博 +e夜情 +fa轮 +fku +flg +fl功 +fuk +gcd +gc党 +hjt +h动漫 +H動漫 +h漫画 +h电影 +j8靠 +jb靠 +ji女 +jzm +kao +kk粉 +K他命 +MM屄 +NMD +nnd +s找m +s调情 +TMD +voa +vpn +wtf +xjp +x卧底 +ze民 +zi杀 +一四我 +一夜情 +一夜欢 +一夜歡 +一本道 +一貫道 +一贯道 +一通功 +丁关根 +丁子霖 +丁字裤 +丁關根 +丁香社 +七灵派 +万润南 +万艾可 +三八淫 +三唑仑 +三級片 +三级片 +三角裤 +三陪女 +上个床 +上中央 +上分器 +上门激 +下三滥 +下三濫 +下三烂 +下三爛 +下法轮 +不爱党 +不雅照 +与狗性 +专卖枪 +专用弩 +世维会 +丘垂贞 +丛林刀 +东京热 +东伊运 +东洋屄 +东突厥 +丝袜保 +丝袜妹 +丝袜恋 +丝袜网 +丝袜美 +两国论 +两夜情 +严家其 +严家祺 +丽春苑 +中共裁 +中共黑 +主神教 +久游网 +乌兰夫 +乌头碱 +乐透码 +乖乖水 +乖乖粉 +乖乖药 +乙肟威 +九评共 +习主席 +习仲勋 +习大大 +习太上 +习太子 +习明泽 +习晋平 +习近平 +习进平 +习远平 +买假币 +买假钞 +买冰毒 +买到枪 +买春堂 +买猎枪 +买真枪 +买砒霜 +买肾源 +买铊盐 +乱伦小 +乱伦类 +二奶大 +于浩成 +互撸娃 +五套功 +五毛们 +五毛党 +亚无码 +亞無碼 +产党共 +人体艺 +人兽情 +仓井空 +他ㄇ的 +他吗的 +他嗎的 +他妈地 +他妈的 +他妈靠 +他娘的 +他媽地 +他媽的 +他馬的 +他马的 +付申奇 +代办各 +代您考 +代血浆 +代讨债 +代追债 +令家党 +令狐安 +令计划 +任不寐 +任你淫 +任弼时 +任自元 +仿真枪 +仿真狗 +会暖床 +会深喉 +伞兵刀 +伦理片 +伪政府 +伯希来 +伯莱塔 +伴我淫 +伽我徽 +何家栋 +何德普 +何清涟 +何祚庥 +余秋里 +余英时 +余远辉 +作弊器 +作情人 +你他妈 +你全家 +你吗b +你大爷 +你大爺 +你妈比 +你妈的 +你妈逼 +你姥姥 +你娘的 +你媽比 +你媽的 +你媽逼 +你是雞 +你是鴨 +你是鸡 +你是鸭 +你祖宗 +你老母 +你色吗 +你色嗎 +你馬的 +你马的 +你麻痹 +供产档 +供产谠 +供铲傥 +供铲党 +供铲裆 +供铲谠 +依夜情 +侯德健 +俞正声 +俞正聲 +倪志福 +假bi +假庆林 +假文凭 +假言正 +假车牌 +做ai +做啊爱 +做爱否 +做爱图 +做爱小 +做言正 +偷听器 +偷情網 +偷情网 +偷窥网 +偷電器 +催情女 +催情水 +催情液 +催情男 +催情粉 +催情药 +催情藥 +催泪弹 +催眠水 +傻B靠 +傻逼靠 +僵賊民 +僵贼民 +元极功 +充气娃 +克他命 +克千术 +党主席 +党产共 +党后萎 +全能神 +全色网 +兩國論 +八九学 +八九年 +八九民 +公产党 +公媳乱 +六?四 +六。四 +六合彩 +六合采 +六四事 +兰博刀 +共*党 +共c党 +共x党 +共产党 +共产觉 +共惨党 +共残党 +共残裆 +共產黨 +共贪党 +共鏟黨 +共铲党 +关卓中 +兼职3 +兼职q +兼职加 +兼职口 +兼职叩 +兼职女 +兼职家 +兼职寇 +兼职扣 +兼职抠 +兼职男 +兼职蔻 +军刀网 +军用枪 +冰淫传 +凌沧洲 +凸点装 +出售枪 +出售肾 +刘云山 +刘伯承 +刘华清 +刘奇葆 +刘宾雁 +刘少奇 +刘延东 +刘志军 +刘文雄 +刘方仁 +刘晓波 +刘永川 +刘永清 +刘连昆 +利他林 +别他吗 +制幻剂 +制手枪 +制服狩 +制服诱 +刻章办 +割包皮 +劉伯承 +劉少奇 +劉延東 +劉曉波 +劉雲山 +办假证 +办文凭 +办本科 +办驾照 +加v信 +加wx +加威讯 +加我q +加薇y +劣等人 +包pi +包二奶 +包你射 +包你爽 +包女友 +包射网 +北川瞳 +北高联 +十八禁 +午夜极 +半刺刀 +华国锋 +华惠棋 +华藏功 +卖k粉 +卖假币 +卖公文 +卖手枪 +卖手铐 +卖护照 +卖枪支 +卖猎枪 +卖砒霜 +卖肝源 +卖肾源 +卖肾网 +卖言正 +卖证件 +卖铊盐 +卖驾照 +卖骨髓 +南蛮子 +南蠻子 +博伊刀 +博彩娱 +卡宾枪 +卡巴刀 +卡西酮 +卢西德 +印钞机 +压无码 +原装弹 +去中央 +去他妈 +去你妈 +去她妈 +去妳妈 +双十节 +双姝艳 +反对党 +反政府 +发@仑 +发@伦 +发@抡 +发@沦 +发@纶 +发@论 +发@轮 +发*仑 +发*伦 +发*抡 +发*沦 +发*纶 +发*论 +发*轮 +发^仑 +发^伦 +发^抡 +发^沦 +发^纶 +发^论 +发^轮 +发~仑 +发~伦 +发~抡 +发~沦 +发~纶 +发~论 +发~轮 +发$仑 +发$伦 +发$抡 +发$沦 +发$纶 +发$论 +发$轮 +发伦功 +发伦工 +发廊女 +发抡功 +发正念 +发牌绝 +发票出 +发论公 +发论功 +发论工 +发轮功 +受虐狂 +变局策 +口交靠 +口手枪 +口活好 +古柯叶 +古柯碱 +只谈性 +叫m春 +叫v床 +叫小姐 +叫自慰 +可卡因 +可待因 +台du +台湾国 +台湾狗 +台湾独 +台湾猪 +台灣国 +台灣國 +台灣狗 +台独靠 +台联党 +台聯黨 +叶剑英 +叶青纯 +司徒华 +司法黑 +司马璐 +叼你妈 +叼你媽 +吃大便 +吃女婴 +吃妹妹 +吃雞巴 +吃鸡巴 +同性爱 +后入式 +后庭花 +后庭诱 +吕京花 +吕秀莲 +吗啡片 +吗啡碱 +吗的靠 +听话水 +听话药 +吳官正 +吳邦囯 +吳邦國 +吴仁华 +吴学灿 +吴学璨 +吴学谦 +吴宏达 +吴官正 +吴定富 +吴弘达 +吴方城 +吴百益 +吴邦囯 +吴邦国 +吴野渡 +吸毒犯 +呂秀蓮 +告洋状 +周天法 +周小川 +周恩來 +周恩来 +周永康 +周锋锁 +呼喊派 +和狗交 +和狗性 +品色堂 +哄铲谠 +唐柏桥 +售三棱 +售五四 +售假币 +售假证 +售假钞 +售假钱 +售健卫 +售公文 +售军用 +售冰毒 +售单管 +售子弹 +售左轮 +售手枪 +售护照 +售枪支 +售步枪 +售氯胺 +售火药 +售热武 +售猎枪 +售纯度 +售肾源 +售虎头 +售证件 +售驾照 +售麻醉 +啊无卵 +啪欲强 +喂奶门 +喵喵药 +嗑药女 +嗯嗯撸 +嘻嘻撸 +四事件 +四我周 +四级片 +回民暴 +回民猪 +回良玉 +国家妓 +国统会 +國 賊 +土炸弹 +圣女峰 +圣殿教 +坐台的 +型手枪 +塞你娘 +塞你母 +塞你爸 +士的宁 +壮阳健 +壮阳药 +处女膜 +外•挂 +外~挂 +外围女 +外围码 +多夜情 +多次郎 +多維網 +多维网 +夜夜情 +夜激情 +大j8 +大sb +大乱交 +大乳头 +大乳頭 +大亂交 +大傻b +大冰砖 +大力丸 +大卫教 +大卵子 +大咪咪 +大咸湿 +大奶乃 +大奶头 +大奶妈 +大奶子 +大妓院 +大尺度 +大法轮 +大波妹 +大泽惠 +大淫棍 +大湿胸 +大纪元 +大纪园 +大肉棒 +大胸妹 +大胸弟 +大花逼 +大血比 +大血逼 +大衛教 +大记元 +大阳具 +大雞巴 +大鶏巴 +大鸡巴 +大鸡鸡 +大麻油 +大麻烟 +大麻脂 +天按门 +天朝特 +天案们 +天案门 +天灭中 +天黯门 +太色了 +失忆水 +失忆粉 +失忆药 +失意药 +失身水 +失身粉 +夹维希 +奇淫散 +奥巴马 +奧巴馬 +女上式 +女上门 +女之惑 +女人费 +女伟哥 +女公关 +女友坊 +女技师 +女教师 +女死囚 +女激情 +女白领 +女神教 +女秘书 +奴事件 +奴畜抄 +奸成瘾 +她妈地 +她妈的 +她妈靠 +她媽地 +她媽的 +她馬的 +她马的 +好啪友 +妃悠爱 +妇包夜 +妇销魂 +妈个b +妈个比 +妈个逼 +妈了逼 +妈妈色 +妈的b +妈的靠 +妈逼靠 +妓女靠 +妞上门 +妳妈的 +妳娘的 +妳媽的 +妳馬的 +妳马的 +妹上门 +妹妹穴 +妹按摩 +妹的穴 +妻色网 +姐上门 +姐兼职 +姐包夜 +姚依林 +姚文元 +姚月谦 +姜折民 +姜春云 +姫野爱 +姬胜德 +娘个比 +娘個比 +娘饿比 +婊zi +婊子靠 +婚外恋 +婚外情 +婚外戀 +婴儿汤 +媽個B +媽個比 +媽的B +嫩bb +嫩鮑魚 +嫩鲍鱼 +孔摄像 +孙大千 +孙大发 +孙政才 +孙春兰 +孟建柱 +学生妹 +学生鸡 +学自联 +學生妹 +它妈地 +它妈的 +它媽地 +它媽的 +宇明网 +安全套 +安纳咖 +宋书元 +宋任穷 +宋楚瑜 +宋祖英 +定情粉 +实际神 +寂寞女 +富国者 +寻欢阁 +导爆索 +导航狗 +封从德 +将则民 +射 精 +射网枪 +尉健行 +小B样 +小B樣 +小g奶 +小jj +小乳头 +小乳頭 +小冰砖 +小卵子 +小卵泡 +小嫩逼 +小日本 +小比样 +小比樣 +小泉彩 +小泽圆 +小浪货 +小淫女 +小淫穴 +小瘪3 +小瘪三 +小癟三 +小肉穴 +小色哥 +小雞巴 +小雞雞 +小騷比 +小騷貨 +小骚妹 +小骚比 +小骚货 +小骚逼 +小鸡巴 +小鸡鸡 +小龙女 +少妇穴 +尘诱2 +就去日 +就去色 +就爱插 +就要色 +尼克松 +屌在抖 +屌巨大 +屎你娘 +屎妳娘 +属灵教 +岭奖网 +崔情水 +崔情粉 +工产党 +工产谠 +工字牌 +工自联 +左轮狗 +巨jj +巨乳片 +巴克刀 +巴雷特 +希特勒 +带套套 +干x娘 +干他妈 +干你妈 +干你妹 +干你娘 +干你良 +干全家 +干她妈 +干妳妈 +干妳娘 +干妳马 +干姐姐 +干嫂子 +干您娘 +干拎娘 +干机掰 +干死你 +干淫洞 +干的爽 +干骚女 +平可夫 +平小邓 +平特码 +平近习 +幹x娘 +幹你娘 +幹你媽 +幹你良 +幹全家 +幹妳娘 +幹妳媽 +幹妳馬 +幹您娘 +幹拎娘 +幹機掰 +幹死你 +幹的爽 +乡巴佬 +幼幼论 +幼色网 +幼香閣 +幼香阁 +床上戏 +床上聊 +庞建国 +廖承志 +开他敏 +开山刀 +弓弩网 +弓弩网 +张万年 +张伟国 +张伯笠 +张先玲 +张博树 +张又侠 +张国清 +张培莉 +张宏堡 +张小平 +张廷发 +张德江 +张志清 +张春桥 +张春贤 +张昭富 +张晓平 +张潮阳 +张澜澜 +张萬年 +张立昌 +张闻天 +张高丽 +張万年 +張宏堡 +張德江 +張萬年 +張立昌 +強姦你 +強姦犯 +弹簧刀 +强 奸 +强奸丸 +强奸你 +强奸水 +强奸犯 +强暴粉 +强暴药 +当情人 +彭丽媛 +彭德怀 +彭德懷 +徐向前 +徐才厚 +徐水良 +徐炳松 +徐邦秦 +得得撸 +微交易 +志洪李 +快乐丸 +快操我 +快色吧 +思巢网 +急需嫖 +性交图 +性交圖 +性交片 +性交男 +性交課 +性交课 +性交靠 +性伙伴 +性伴侣 +性体验 +性冲动 +性冷淡 +性发育 +性启蒙 +性和谐 +性器具 +性奴会 +性奴會 +性幻想 +性幻觉 +性技巧 +性挑逗 +性教官 +性无能 +性服务 +性派对 +性渴望 +性游戏 +性無能 +性爱图 +性爱日 +性猛男 +性玩偶 +性生活 +性用品 +性福情 +性福源 +性网站 +性虐待 +性行为 +性论坛 +性诱惑 +性酒吧 +性需求 +性飢渴 +性饥渴 +性骚扰 +性高潮 +总书记 +总竖鸡 +总输记 +恋母癖 +恋足癖 +情1夜 +情夜1 +情欲结 +惩贪难 +想上你 +想偷情 +想干你 +想日你 +想爱爱 +想舌忝 +意加寇 +意加扣 +意加抠 +意加蔻 +愚民政 +愛女人 +慈悲功 +慕绥新 +慰安妇 +慰安婦 +懆您妈 +懆您娘 +戈博刀 +成人图 +成人文 +成人片 +成人网 +成人聊 +成克杰 +我周容 +我和她 +我咧干 +我就色 +我慰性 +我扣扣 +我操你 +我操穴 +我操靠 +我日你 +我日靠 +我是猪 +我有网 +我的穴 +我艹你 +我要色 +我该死 +戴维教 +戴耀廷 +房峰辉 +手弓弩 +手拉狙 +手木仓 +手榴弹 +扌由插 +扎卡维 +打台湾 +打手枪 +打手槍 +打死人 +打野炮 +打飛機 +打飞机 +批判邓 +找p友 +找妓女 +找小姐 +找少妇 +找性爱 +找情人 +找援交 +找枪手 +找洋妞 +找炮友 +找美女 +找肾源 +找鸡婆 +找麻古 +抢劫药 +护士穴 +抽一插 +拉霸机 +拍肩型 +拍肩粉 +拔出来 +招女支 +招小姐 +拟涛哥 +拱产谠 +按摩女 +按摩棒 +挑豆豆 +挡中央 +挡坦克 +挤乳汁 +振动棒 +捅死你 +捕鱼机 +换夫妻 +推油按 +插3p +插4p +插5p +插6p +插8p +插9p +插gm +插你妈 +插你娘 +插你媽 +插你爸 +插后庭 +插妹妹 +插嫩穴 +插嫩逼 +插小姐 +插小穴 +插屁屁 +插屁眼 +插後庭 +插死你 +插死她 +插淫屄 +插深些 +插的深 +插穴图 +插进去 +插阴茎 +援交女 +援交妹 +援交网 +搖头丸 +搖頭丸 +搞媛交 +搞死你 +搞破鞋 +摇头丸 +摇头水 +摇头玩 +摇頭丸 +摩洛客 +摩门教 +摸jj +摸咪咪 +摸奶门 +摸阴蒂 +摸陰蒂 +撒泡尿 +撸撸侠 +撸撸网 +操78 +操bb +操XX +操丫的 +操了嫂 +操他妈 +操你嘴 +操你奶 +操你妈 +操你妹 +操你姐 +操你娘 +操你媽 +操你爸 +操冰毒 +操博讯 +操吹箫 +操大B +操大屄 +操大法 +操大逼 +操她妈 +操妳妈 +操妳娘 +操妳媽 +操妹妹 +操婊子 +操嫂嫂 +操嫂子 +操嫩穴 +操它妈 +操小穴 +操布什 +操戳你 +操打炮 +操护士 +操抽插 +操插你 +操插妳 +操操他 +操操你 +操操比 +操操蛋 +操操逼 +操春药 +操机掰 +操死你 +操死她 +操母狗 +操比毛 +操波霸 +操美女 +操草妈 +操藏独 +操表姐 +操赤匪 +操车臣 +操达赖 +操逼样 +操逼毛 +操陈功 +操陈毅 +擠乳汁 +擦你妈 +支联会 +支那猪 +收购肾 +政fu +政府操 +敌敌畏 +散弹枪 +斯大林 +斯鑫良 +新唐人 +新搪人 +新生網 +新生网 +新疆国 +新疆國 +新疆独 +新金瓶 +方励之 +无官正 +无政府 +无毛穴 +无码专 +无码片 +无网界 +日b么 +日X妈 +日他娘 +日你妈 +日你妹 +日你娘 +日你媽 +日你爸 +日朱骏 +日死你 +日死狼 +明心网 +明思网 +明慧網 +明慧网 +昏睡药 +昏迷剂 +昏迷药 +易丹轩 +易叶情 +昝愛宗 +昝爱宗 +星月服 +春宫图 +普提功 +暗访包 +曹刚川 +曹剛川 +曹长青 +曾培炎 +曾庆紅 +曾庆红 +曾慶紅 +曾慶红 +曾荫权 +曾道人 +替考试 +有偿肾 +朝河兰 +朝鲜冰 +本拉丹 +本拉登 +本无码 +朱嘉明 +朱容基 +朱容雞 +朱容鸡 +朱明国 +朱海仑 +朱溶剂 +朱熔基 +朱狨基 +朱荣基 +朱鎔基 +朱镕基 +朱镕鸡 +朱颜血 +朴鸣呼 +机霸大 +杀它仗 +李 录 +李 禄 +李 祿 +李 錄 +李一平 +李作鹏 +李先念 +李克強 +李克强 +李兰菊 +李大钊 +李宏志 +李宏旨 +李宏智 +李宏治 +李屠夫 +李岚清 +李崇禧 +李嵐清 +李庆华 +李庆安 +李建国 +李建國 +李德生 +李总理 +李恩潮 +李旺阳 +李春城 +李月鸟 +李洪X +李洪宽 +李洪志 +李洪智 +李洪痣 +李淑娴 +李源潮 +李瑞环 +李瑞環 +李登輝 +李登辉 +李磕墙 +李立国 +李紅志 +李紅智 +李红志 +李红智 +李红痔 +李远哲 +李鐵映 +李铁映 +李锡铭 +李長春 +李长春 +李鸿志 +李鸿忠 +李鸿智 +李鹏* +杜世成 +杜冷丁 +杜导斌 +杜智富 +来复枪 +来插我 +来爽我 +来福枪 +来福猎 +杨尚昆 +杨建利 +杨得志 +杨月清 +杨汝岱 +杨洁篪 +杨焕宁 +杨白冰 +東京熱 +東洋屄 +松岛枫 +林伯渠 +林佳龙 +林保华 +林慎立 +林重谟 +林黄菊 +果聊网 +枪专卖 +枪出售 +枪子弹 +枪械制 +枪的制 +枪的参 +枪订购 +枪货到 +枪销售 +柔胸粉 +柔阴术 +柯建铭 +柯賜海 +柯赐海 +栗战书 +格斗刀 +档中央 +梁光烈 +梁擎墩 +梅花屄 +梅花网 +梦精爱 +榨干你 +模型枪 +樱之潮 +欠人骑 +欢乐丸 +欧阳懿 +正悟网 +正見網 +正见网 +武士刀 +死全家 +死刑过 +殪夜情 +段义和 +毒蛇钻 +毒龙钻 +毛2b +毛2屄 +毛2逼 +毛XX +毛zd +毛zx +毛万税 +毛三陪 +毛乔石 +毛乳交 +毛乳头 +毛乳房 +毛二B +毛二屄 +毛二逼 +毛他妈 +毛他爹 +毛伱妈 +毛你妈 +毛你姥 +毛你娘 +毛你爸 +毛倭国 +毛倭寇 +毛傻B +毛傻卵 +毛傻吊 +毛傻子 +毛傻屄 +毛傻比 +毛傻逼 +毛六四 +毛共匪 +毛共狗 +毛军妓 +毛刘淇 +毛则东 +毛卖B +毛卖国 +毛卖比 +毛卖淫 +毛卖逼 +毛厕东 +毛厕洞 +毛去死 +毛反共 +毛反动 +毛反华 +毛发伦 +毛发抡 +毛发骚 +毛口交 +毛叫床 +毛台独 +毛后庭 +毛吗啡 +毛吴仪 +毛夜情 +毛太监 +毛太祖 +毛奶子 +毛奸你 +毛奸淫 +毛妈比 +毛妈的 +毛妈逼 +毛妓女 +毛妓院 +毛姣西 +毛嫖客 +毛嫩b +毛学潮 +毛射精 +毛小穴 +毛干你 +毛廁洞 +毛强奸 +毛彭真 +毛性交 +毛性欲 +毛性爱 +毛情色 +毛我干 +毛我操 +毛我日 +毛手淫 +毛拉登 +毛换妻 +毛日你 +毛昏药 +毛普京 +毛机8 +毛机巴 +毛李鹏 +毛林彪 +毛民运 +毛江八 +毛江猪 +毛江青 +毛法功 +毛法轮 +毛泽东 +毛泽東 +毛洪志 +毛淫叫 +毛淫娃 +毛淫欲 +毛淫毛 +毛淫水 +毛淫秽 +毛淫荡 +毛淫货 +毛淫贱 +毛淫靡 +毛澤东 +毛澤東 +毛烂B +毛烂屄 +毛烂屌 +毛烂比 +毛烂货 +毛烂逼 +毛煞逼 +毛特码 +毛狂操 +毛狗b +毛狗屁 +毛狗屎 +毛狗操 +毛狗日 +毛王震 +毛疆独 +毛睾丸 +毛破鞋 +毛禁书 +毛精子 +毛精液 +毛老逼 +毛肉棍 +毛肉棒 +毛肉洞 +毛肉穴 +毛肉缝 +毛肛交 +毛肛门 +毛致用 +毛色情 +毛蒙独 +毛虐待 +毛賊東 +毛贱人 +毛贱货 +毛贱逼 +毛贺龙 +毛贼东 +毛轮功 +毛轮奸 +毛迷药 +毛退党 +毛遮洞 +毛邪教 +毛阳具 +毛阴唇 +毛阴户 +毛阴核 +毛阴毛 +毛阴水 +毛阴茎 +毛阴蒂 +毛阴道 +毛阴部 +毛食屎 +毛骚B +毛骚货 +毛骚逼 +毛骡干 +毛鸡8 +毛鸡八 +毛鸡叭 +毛鸡奸 +毛鸡巴 +毛鸡掰 +毛鸡鸡 +毛鸦片 +毛黄菊 +毛龟头 +民主墙 +民主潮 +民泽江 +气木仓 +气枪弹 +气枪网 +气枪阀 +氢弹手 +氢氟酸 +氯氨酮 +氯胺酮 +求交配 +求哥插 +求姐脱 +求爆插 +求被搞 +汉 奸 +江zm +江z民 +江丑闻 +江人马 +江八条 +江八條 +江八点 +江八點 +江则民 +江則民 +江嫡系 +江宰民 +江家帮 +江戏子 +江戲子 +江折民 +江择民 +江擇民 +江核心 +江梳头 +江棋生 +江沢民 +江泽慧 +江泽民 +江流氓 +江浙民 +江浙闽 +江澤民 +江独裁 +江猪媳 +江獨裁 +江病危 +江祸心 +江系人 +江绵恒 +江老贼 +江者民 +江蛤蟆 +江豬媳 +江賊民 +江责民 +江贼民 +江锦恒 +汤光中 +汪东兴 +汽油弹 +沈德咏 +沈昌功 +沙菲片 +河 殇 +河 殤 +法@仑 +法@伦 +法@侖 +法@倫 +法@抡 +法@掄 +法@沦 +法@淪 +法@綸 +法@纶 +法@論 +法@论 +法@輪 +法@轮 +法*仑 +法*伦 +法*侖 +法*倫 +法*功 +法*抡 +法*掄 +法*沦 +法*淪 +法*綸 +法*纶 +法*論 +法*论 +法*輪 +法*轮 +法^仑 +法^伦 +法^侖 +法^倫 +法^抡 +法^掄 +法^沦 +法^淪 +法^綸 +法^纶 +法^論 +法^论 +法^輪 +法^轮 +法~仑 +法~伦 +法~侖 +法~倫 +法~抡 +法~掄 +法~沦 +法~淪 +法~綸 +法~纶 +法~論 +法~论 +法~輪 +法~轮 +法$仑 +法$伦 +法$侖 +法$倫 +法$抡 +法$掄 +法$沦 +法$淪 +法$綸 +法$纶 +法$論 +法$论 +法$輪 +法$轮 +法0功 +法1轮 +法lg +法L功 +法o功 +法x功 +法一轮 +法仑公 +法仑共 +法仑功 +法仑工 +法仑攻 +法伦功 +法侖功 +法囵功 +法埨功 +法婨功 +法尼林 +法崘功 +法惀功 +法抡功 +法某功 +法棆功 +法沦功 +法溣功 +法碖功 +法磮功 +法稐功 +法耣功 +法能功 +法腀功 +法芲功 +法菕功 +法蜦功 +法论公 +法论共 +法论功 +法论工 +法论攻 +法谪功 +法踚功 +法輪功 +法车仑 +法轮义 +法轮会 +法轮佛 +法轮公 +法轮共 +法轮功 +法轮工 +法轮攻 +法轮村 +法錀功 +法陯功 +法鯩功 +法黁功 +波推龙 +泼尼松 +洪 吟 +洪哲胜 +活摘器 +流淫水 +浪妹网 +海乐神 +海洛因 +海绵体 +涛共产 +液体炸 +淫兽学 +淫图区 +淫图穴 +淫女穴 +淫妹妹 +淫姐姐 +淫少妇 +淫屄儿 +淫影片 +淫影院 +淫情女 +淫护士 +淫播网 +淫教师 +淫民堂 +淫狼心 +淫电影 +淫窝窝 +淫色阁 +淫荡网 +淫贴图 +淫间道 +淫騷妹 +淫驢屯 +淫驴屯 +淫骚妹 +淫魔舞 +深喉冰 +清华帮 +温jb +温云松 +温假保 +温假饱 +温元凯 +温加保 +温加宝 +温加饱 +温家保 +温家堡 +温家宝 +温家寳 +温家寶 +温家某 +温影帝 +游锡坤 +湖淫娘 +湖紧掏 +溜冰妹 +溫傢寳 +溫加寶 +溫家宝 +溫家寶 +滕文生 +滚床单 +滚那吗 +滾那嗎 +漏阴癖 +漢 奸 +潜水刀 +潜规则 +激情夜 +激情妹 +激情淫 +激情炮 +激情短 +激情色 +灨你娘 +火箭筒 +灭中共 +炮棒棒 +炸学校 +炸广州 +炸弹教 +炸立交 +炸药制 +炸药配 +炸超市 +炸鸟巢 +炼大法 +烟感器 +热兵器 +热比娅 +無毛穴 +焦国标 +煎直q +煎直加 +煎直口 +煎直家 +煎直寇 +煎直扣 +煎直抠 +煎直蔻 +煞笔靠 +熟女镇 +燃烧弹 +燃烧瓶 +爆乳娘 +爆你菊 +爆发骚 +爆浴照 +爆炸物 +爆菊花 +爱与性 +爱他死 +爱内萌 +爱女人 +爱幼阁 +爱插入 +爱操操 +爱良窝 +爱草逼 +爱车震 +爽1晚 +爽mm +爽图网 +牌技网 +特码网 +狄玉明 +狗东西 +狗娘养 +狗日的 +狗日靠 +狗杂种 +狗腿刀 +狗雜種 +狠狠射 +狠狠撸 +独裁者 +猎木仓 +猎枪网 +猎枪销 +猛干添 +猪容基 +猪容鸡 +猪聋畸 +猫则东 +猫泽东 +猫贼洞 +玄女经 +玉女盟 +玉蒲团 +玉蒲團 +王3运 +王三运 +王东明 +王乐泉 +王兆国 +王兆國 +王八蛋 +王军涛 +王力雄 +王喜斌 +王岐山 +王希哲 +王建平 +王怀忠 +王樂泉 +王沪宁 +王洪文 +王润生 +王炳章 +王立军 +王维林 +王若望 +王超华 +王进东 +玩女人 +玩蛋蛋 +现场脱 +珐轮功 +瓜娃子 +瓜婆娘 +甜嫩穴 +生殖器 +生鸦片 +用手枪 +甩头丸 +田修思 +田凤山 +田紀云 +田紀雲 +田纪云 +田纪雲 +甲庆林 +甲苯2 +申维辰 +电击器 +电击枪 +男公关 +瘟假报 +瘟假饱 +瘟假鸨 +瘟加饱 +瘟家宝 +瘟总理 +發@侖 +發@淪 +發@輪 +發*侖 +發*淪 +發*輪 +發^侖 +發^倫 +發^掄 +發^綸 +發^論 +發^輪 +發~侖 +發~倫 +發~掄 +發~淪 +發~綸 +發~論 +發~輪 +發$侖 +發$淪 +發$輪 +發倫功 +發掄功 +發正念 +發論功 +白恩培 +白癜疯 +白癫疯 +白虎妹 +百凤宫 +百家乐 +百性阁 +监听头 +监听宝 +监听王 +盛光祖 +看JJ +看空间 +真他妈 +真善忍 +真理教 +着涛哥 +石更了 +砍死你 +破处门 +硝酸钡 +硬大长 +视解密 +神經病 +神经病 +祼聊网 +福寿膏 +萬淫堂 +秃鹰汽 +秦光荣 +秦基伟 +程铁军 +穴痒么 +窃听器 +窝窝客 +窩窩客 +站街女 +等屁民 +答案包 +简易炸 +简直q +简直加 +简直口 +简直家 +简直寇 +简直扣 +简直抠 +简直蔻 +简肇栋 +简鸿章 +粉紅穴 +粉红穴 +粗肉洞 +粥永康 +精想射 +精液浴 +精神病 +紅燈區 +紅衛兵 +素女心 +素女经 +給你爽 +總書記 +红卫兵 +红灯区 +红矾钠 +红降汞 +约pa +级电影 +纪登奎 +给你爽 +统一教 +缣埴家 +罂粟壳 +罂粟籽 +罗志明 +罗文嘉 +罗福助 +罗荣桓 +美z女 +美女夜 +美女穴 +美沙酮 +美騷婦 +美骚妇 +群p图 +群交网 +群奸暴 +群阴会 +群陰會 +羽月希 +習近平 +翘臀妹 +老婊子 +老毛子 +老瘪3 +老瘪三 +老癟三 +老虎机 +老騷比 +老騷貨 +老骚比 +老骚货 +考前答 +考试枪 +聂荣臻 +聊斋艳 +聊湿你 +聊湿吗 +联系叩 +联系抠 +聖女峰 +聶榮臻 +肉便器 +肉棍子 +肉蒲团 +肉蒲團 +肖中特 +肖亚庆 +肘永康 +肛交网 +肟吸威 +肟杀威 +肟菌酯 +肩迷药 +肾源网 +胡jt +胡j涛 +胡乔木 +胡启立 +胡喬木 +胡妖邦 +胡惊涛 +胡春华 +胡景涛 +胡景濤 +胡紧套 +胡紧掏 +胡紧涛 +胡緊套 +胡緊掏 +胡緊濤 +胡绩伟 +胡耀帮 +胡耀邦 +胡进涛 +胡錦涛 +胡錦淘 +胡錦滔 +胡錦濤 +胡锦涛 +胡锦淘 +胡锦滔 +胡锦濤 +胯下屌 +胺吗啡 +脫內褲 +脫衣舞 +脱内裤 +脱衣舞 +脱衣艳 +脱裤门 +腿玩年 +自慰器 +自慰用 +自由门 +臭机8 +臭机八 +臭鸡八 +臭鸡吧 +臭鸡巴 +致幻剂 +致幻劑 +臺湾國 +臺灣國 +臺灣狗 +舔 b +舔jb +舔你逼 +舔屁眼 +舔插摸 +舔醒你 +舔雞巴 +舔鸡巴 +色中色 +色人阁 +色哥哥 +色大姐 +色大嫂 +色妹妹 +色婷婷 +色小说 +色弟弟 +色影院 +色情片 +色情狂 +色情类 +色情靠 +色成人 +色播器 +色特工 +色狼居 +色狼窝 +色狼网 +色狼谷 +色电影 +色视频 +色空寺 +色窝窝 +色窩窩 +色网址 +色老2 +色老3 +色老大 +色老头 +色老妈 +色老汉 +色聊网 +色色岛 +色迷城 +色鸡巴 +艳照門 +艳照门 +艳舞女 +艷照門 +艷照门 +艾未未 +芬太尼 +芮杏文 +花青甙 +苍井空 +苍老师 +苍老湿 +苍蝇水 +苍蝇粉 +苏南成 +苏振华 +苏晓康 +苏树林 +苏盈贵 +苏绍智 +苏贞昌 +苯丙胺 +苯乙酸 +范燕琼 +范长龙 +茳泽民 +茳澤民 +草bi +草他妈 +草你丫 +草你吗 +草你妈 +草你娘 +草你媽 +草她妈 +草拟吗 +草拟妈 +草擬媽 +草榴网 +草泥马 +草肟威 +菊花洞 +華國鋒 +萨达姆 +董元辰 +董必武 +董贱华 +蒂巴因 +蒋彦永 +蒋捷连 +蒋洁敏 +蒙古独 +蒙尘药 +蒙汗药 +蔡崇国 +蔣彥永 +薄1波 +薄一波 +薄熙来 +薑春雲 +薩達姆 +藏du +藏妇会 +藏婦會 +藏暴乱 +藏独立 +藏独靠 +藏青会 +藏青會 +藜芦碱 +藤井彩 +虎牙刀 +虐之恋 +蜘蛛刀 +蝴蝶刀 +蝴蝶逼 +衣果聊 +袁家军 +被中共 +被打死 +被立王 +袭近平 +装B靠 +装屄呢 +装弹甲 +装枪套 +装逼呢 +装逼靠 +裆中央 +裸l聊 +裸聊妹 +裸聊网 +裸舞视 +襙美女 +西藏国 +西藏國 +西藏独 +要够骚 +要射了 +要泄了 +要爱爱 +要色色 +观淫癖 +讓你操 +让你操 +让你爽 +许万平 +许世友 +许其亮 +许宗衡 +许家屯 +许良英 +论文代 +诛9族 +详请抠 +谜奸药 +谢选骏 +谭作人 +谭绍文 +豔照門 +豬容基 +賀國強 +賈慶林 +賤bi +賴昌星 +贛您娘 +贡产谠 +购枪网 +贱bi +贷借款 +费良勇 +贺卫方 +贺国强 +贺过墙 +贾庆林 +赌博机 +赌博粉 +赌博药 +赌恒指 +赌球网 +赖士葆 +赖昌星 +赛他娘 +赛你娘 +赛后骚 +赛她娘 +赛妳娘 +赣您娘 +赤西凉 +走私车 +赵乐际 +赵品潞 +赵紫阳 +赵维山 +赶你娘 +起爆器 +起爆药 +超声波 +足交片 +足脚交 +足腳交 +践踏我 +跳跳蛋 +蹂躏我 +蹋纳税 +輪子功 +轉法輪 +转法论 +转法轮 +轮子功 +轮手枪 +轮法功 +轮盘机 +轮盘赌 +轴永康 +辛灏年 +辛灝年 +辦毕业 +辽宁女 +远志明 +连惠心 +连胜德 +迟浩田 +迦威吧 +迦薇芯 +迷奸粉 +迷奸药 +迷幻型 +迷幻水 +迷幻药 +迷幻藥 +迷情水 +迷情粉 +迷情药 +迷昏口 +迷昏药 +迷昏藥 +迷歼药 +迷魂党 +迷魂药 +迷魂藥 +迷魂香 +递纸死 +逗妇乳 +速取证 +逼孕套 +逼逼园 +遲浩田 +避孕套 +避孕膜 +邓xp +邓小平 +邓小瓶 +邓晓平 +邓朴方 +邓玉娇 +邓矮子 +邓笑贫 +邓质方 +邓颖超 +那吗B +那吗逼 +那嗎B +那嗎逼 +邱会作 +邹家华 +郑恩宠 +郑筱萸 +郑运鹏 +郝海东 +郭伯雄 +郭声琨 +郭岩华 +郭金龙 +鄒家華 +鄧小平 +鄧朴方 +鄧穎超 +酒色网 +酣乐欣 +酱猪媳 +醉迷药 +醉钢枪 +醋酸汞 +醋酸酐 +醬豬媳 +采花堂 +采花网 +里藏春 +金尧如 +金日成 +金正恩 +金正日 +金瓶梅 +金道铭 +銷魂洞 +錢 達 +錢其琛 +针刺死 +钢珠枪 +钦本立 +钱 达 +钱其琛 +钻石冰 +铃木麻 +销魂洞 +锇酸酐 +镜丽子 +长治筋 +长濑爱 +門服務 +门安天 +门徒会 +门按摩 +门服务 +阎明复 +防暴枪 +防身枪 +阴唇劫 +阴茎夹 +阿片烟 +阿芙蓉 +陈一咨 +陈一谘 +陈伯达 +陈同海 +陈唐山 +陈子明 +陈宣良 +陈川平 +陈希同 +陈敏尔 +陈文清 +陈水扁 +陈永贵 +陈独秀 +陈破空 +陈绍基 +陈良宇 +陈锡联 +陪你睡 +陳希同 +陳水扁 +陶驷驹 +隐窝窝 +隱窩窩 +集体淫 +集體淫 +雷明顿 +震动棒 +露胸图 +露阴照 +露陰照 +青楼吧 +靠你妈 +靠你媽 +韓桂芝 +韦国清 +韩东方 +韩国狗 +韩杼滨 +韩桂芝 +韩联潮 +顶帖器 +顶贴机 +项小吉 +领导人 +風豔閣 +风尘劫 +风艳阁 +风骚女 +飞叶子 +食女婴 +食捻屎 +饥渴男 +饭岛爱 +馒头屄 +駛你娘 +駛你母 +駛你爸 +騷B賤 +騷妹妹 +騷姐姐 +騷姨媽 +马亚莲 +马永成 +驶你娘 +驶你母 +驶你爸 +验征玛 +骚b图 +骚B贱 +骚g女 +骚女人 +骚妹妹 +骚姐姐 +骚姨妈 +骚屄儿 +骚浪贱 +骚淫女 +骚美女 +骚货图 +骚蹄子 +骚逼女 +骚阿姨 +高仿枪 +高仿证 +高勤荣 +高压狗 +高文谦 +高智晟 +高治联 +高級逼 +高级逼 +高自联 +鬼叫春 +鬼輪奸 +鬼輪姦 +鬼轮奸 +魏京生 +魏新生 +鸡巴靠 +鸡鸭恋 +鸦片液 +鸦片渣 +鸳鸯合 +鸿图记 +麦角酸 +麦角醇 +麻仓忧 +麻古冰 +麻将透 +麻果丸 +麻果配 +麻痹的 +麻醉弹 +麻醉枪 +麻醉槍 +麻醉箭 +麻醉药 +麻醉藥 +麻黃素 +麻黄碱 +麻黄素 +麻黄草 +黄b色 +黄义交 +黄兴国 +黄剑辉 +黄图哥 +黄慈萍 +黄松有 +黄永胜 +黄色片 +黎安友 +黎智英 +黎阳评 +黑五类 +黑毛屄 +黑火药 +黑索今 +黑索金 +黑鲍娇 +默克尔 +龙虎机 +龜兒子 +龟儿子 +龟孙子 +瀬咲るな +《争鸣》 +《动向》 +08县长 +08宪章 +0售麻古 +0售麻果 +18淫书 +18禁入 +1ye情 +1中1台 +1党专制 +1党专政 +1党执政 +1党独裁 +1党私利 +1刻春宵 +1千1夜 +1响春梦 +1国两制 +1夜の情 +1夜夫妻 +1夜性趣 +1夜情群 +1夜春宵 +1夜消魂 +1夜激情 +1夜爽身 +1夜缠绵 +1夜销魂 +1夜风流 +1夜风骚 +1宿8次 +1射青天 +1晚5次 +1柱擎天 +1炮之缘 +1炮惊人 +1炮而红 +1肖中特 +1面做爱 +2奶大赛 +2奶夺位 +2穴中出 +2逼老逼 +35美女 +3D轮盘 +3p图片 +3p性爱 +3p淫女 +3p炮图 +3P炮圖 +3p艳照 +3个代婊 +3个呆婊 +3去仑功 +3去车仑 +3度诱惑 +3棱军刀 +3棱刮刀 +3棱刺刀 +3棱刺枪 +3棱尖刀 +3棱跳刀 +3水法轮 +3级影片 +3级电影 +3美挑情 +3配小姐 +4号白粉 +4川独立 +4度诱惑 +4海龙女 +54手枪 +54手狗 +5月35 +5月樱唇 +5码吹潮 +64之前 +64之后 +64事件 +64以前 +64以后 +64信息 +64动乱 +64動亂 +64学潮 +64屠城 +64屠杀 +64平反 +64平暴 +64惨案 +64散步 +64时期 +64正名 +64民运 +64真相 +64纪念 +64运动 +64风波 +6合彩券 +6合彩网 +6和谐4 +⑥四运动 +6月4日 +6河蟹4 +75事件 +7尺大乳 +7级床震 +8?9靠 +80色区 +89事件 +89六四 +89动乱 +89動亂 +89学潮 +89学运 +89學潮 +89政治 +89暴乱 +89暴亂 +89死难 +89民运 +89运动 +89風波 +89风波 +9城情色 +9阴争茎 +av下载 +av两性 +av人妻 +AV女优 +av影视 +av影院 +av快播 +av成人 +av文档 +av电影 +av直播 +av视频 +av种子 +av素人 +av网址 +av貼圖 +av贴图 +av资源 +av麻将 +a片下载 +a片基地 +a片视频 +a片种子 +a片网址 +a片试看 +a级大片 +a级情片 +a级电影 +big吊 +bt情色 +bt成人 +BT淫穴 +BT激情 +bt黄色 +C4炸药 +caob +cao你 +cha你 +DICK +dl喇嘛 +e世博彩 +falu +fa轮功 +FL大法 +fuck +gan你 +gay片 +ghb水 +ghb液 +GM美国 +GM美國 +g点高潮 +h片网址 +h色小说 +h色网站 +ISIS +jia币 +jiba +jz女模 +k粉qq +k粉专卖 +k粉买卖 +k粉价格 +k粉供应 +k粉出售 +k粉出货 +k粉到货 +k粉制作 +k粉合成 +k粉批发 +k粉提供 +k粉牙签 +k粉电话 +k粉订购 +k粉货源 +k粉配方 +k粉钻石 +k粉销售 +Mai骚 +mdma +mm上门 +mm丝秀 +mm兼职 +MM嫩穴 +mm破处 +mm裸聊 +mm走光 +nmsl +OOXX +qq卖肾 +qq裸聊 +sm1族 +sm交友 +sm作品 +sm器具 +sm图片 +sm女王 +sm工具 +sm捆绑 +SM援交 +sm游戏 +sm滴蜡 +sm玩法 +SM用品 +sm男奴 +sm网站 +SM舔穴 +sm調教 +sm调教 +sm资讯 +TMD靠 +XXOO +yin荡 +yue炮 +zha弹 +zha药 +ㄙㄞ你娘 +ㄙㄞ你母 +一ye情 +一丝不挂 +一中一台 +一党专制 +一党专政 +一党执政 +一党独裁 +一党私利 +一夜性網 +一夜激情 +一码中特 +一肖中特 +一边一国 +一邊一國 +一面做愛 +一黨專制 +一黨獨裁 +丁丁1凉 +丁腈供应 +丁腈批发 +丁腈提供 +丁腈直销 +丁腈销售 +丁醛肟威 +丁香成人 +丁香社区 +丁香社區 +七五事件 +万年男处 +三个代婊 +三个呆婊 +三個代婊 +三個呆婊 +三去仑功 +三去車仑 +三去車侖 +三去车仑 +三去车侖 +三棱军刀 +三棱刮刀 +三棱刺刀 +三棱尖刺 +三棱跳刀 +三水法轮 +三级电影 +上床求欢 +上海垮台 +上海独立 +上海龙凤 +上门丝袜 +上门保健 +上门包夜 +上门妓女 +上门妹妹 +上门小姐 +上门性息 +上门我们 +上门按摩 +上门特服 +上门调教 +上饶卖肾 +下我v信 +下流地带 +下流地帶 +下流高校 +下载黄片 +下面很硬 +不再情牵 +不得不贱 +不玩了靠 +与鸭共舞 +专业报仇 +专制政权 +专卖k粉 +专卖假币 +专卖假钱 +专卖军刀 +专卖冰毒 +专卖冰砖 +专卖大麻 +专卖弓弩 +专卖手弩 +专卖手铐 +专卖气枪 +专卖汽枪 +专卖猎枪 +专卖猎狗 +专卖白砒 +专卖白粉 +专卖砍刀 +专卖砒霜 +专卖缅古 +专卖肾脏 +专卖臊冰 +专卖跳刀 +专卖铅弹 +专卖麻古 +专卖麻果 +专销汽枪 +且大且粗 +世界之门 +丙腈供应 +丙腈批发 +丙腈提供 +丙腈直销 +丙腈销售 +业余淫侠 +业力回报 +丛林直刀 +东亚病夫 +东北独立 +东方心经 +东方闪电 +东条英机 +东森电视 +东热空姐 +东突暴动 +东突独立 +东突组织 +丝妹兼职 +丝袜公社 +丝袜内射 +丝袜写真 +丝袜制服 +丝袜性交 +丝袜按摩 +丝袜淫妇 +丝袜色图 +丝袜诱惑 +丝袜足交 +丝袜高跟 +丝足按摩 +丝足诱惑 +两个中国 +两岸战争 +两性小说 +两性狂情 +两腿之间 +个邪的党 +中共任用 +中共保命 +中共封网 +中共封锁 +中共帝国 +中共帮凶 +中共当局 +中共恐惧 +中共权斗 +中共洗脑 +中共独裁 +中共腐败 +中共解体 +中共退党 +中共邪党 +中共邪教 +中共黑帮 +中出无码 +中出颜射 +中华民国 +中华民國 +中华联邦 +中国zf +中国之春 +中国人权 +中国分裂 +中国当局 +中国楼凤 +中国洋奴 +中國分裂 +中央zf +中央澄清 +中央领导 +中央黑幕 +中条美华 +中色影院 +中華民国 +中華民國 +丰唇艳姬 +丰满少妇 +丰满熟妇 +丰胸美体 +丹增嘉措 +为女服务 +为性而亡 +久久情色 +乙基吗啡 +乙醚供应 +九龙论坛 +习总书记 +习总日记 +买77式 +买乌头碱 +买仿真枪 +买到冰毒 +买卖假币 +买卖假证 +买卖假钱 +买卖军刺 +买卖军枪 +买卖冰毒 +买卖手弩 +买卖手枪 +买卖手铐 +买卖枪支 +买卖气枪 +买卖汽枪 +买卖白冰 +买卖白粉 +买卖真枪 +买卖砍刀 +买卖腰刀 +买卖臊冰 +买卖骚本 +买春军团 +买春网站 +买肾中介 +买肾信息 +买麻醉枪 +乱交图片 +乱交视频 +乱交系列 +乱交音频 +乱伦合集 +乱伦国产 +乱伦图区 +乱伦小说 +乱伦影片 +乱伦影院 +乱伦快播 +乱伦性事 +乱伦情欲 +乱伦日韩 +乱伦欧美 +乱伦淫图 +乱伦淫女 +乱伦淫母 +乱伦淫穴 +乱伦熟女 +乱伦父女 +乱伦视频 +乱伦禁书 +乱伦系列 +乱伦群交 +乱伦都市 +乳交中出 +乳交之霸 +乳交口交 +乳交图片 +乳交无码 +乳交视频 +乳此丝袜 +乳此丰满 +乳此动人 +乳此動人 +乳此多娇 +乳此絲襪 +乳此豐滿 +乳此迷人 +乳波臀娘 +乳波臀浪 +亂倫熟女 +了件渔袍 +二奶大赛 +二穴中出 +云雨欲魔 +互舔淫穴 +五套功法 +亚洲a片 +亚洲内射 +亚洲女优 +亚洲嫩苞 +亚洲性爱 +亚洲性虐 +亚洲情色 +亚洲成人 +亚洲无码 +亚洲有码 +亚洲淫图 +亚洲淫娃 +亚洲淫色 +亚洲激情 +亚洲美女 +亚洲色图 +亚洲色情 +亚洲色片 +亚洲色站 +亚洲黄站 +亚砷酸钠 +亚砷酸钾 +亞洲性虐 +亞洲有碼 +亞洲淫图 +亞洲淫娃 +亞洲瘋情 +亡党亡国 +亡共者胡 +交个性友 +交合之夜 +交换人妻 +交换夫妻 +交換夫妻 +交易赌博 +亲共分子 +亲共媒体 +亲吻小屄 +亲情淫乱 +人体写真 +人体炸弹 +人体艺术 +人兽性交 +人兽杂交 +人大代婊 +人妖妹妹 +人妖性爱 +人妖杂交 +人妻av +人妻mm +人妻不伦 +人妻中出 +人妻乱伦 +人妻交换 +人妻交換 +人妻做爱 +人妻内射 +人妻出台 +人妻性交 +人妻榨乳 +人妻激情 +人妻熟女 +人妻熟妇 +人妻系列 +人妻肛交 +人妻自拍 +人妻色誘 +人妻色诱 +人妻阴穴 +人工少女 +人性本色 +人民政腐 +人肉搜索 +人肉炸弹 +人造阳具 +仁科百华 +从后插入 +从裸开始 +他NND +他奶奶的 +他奶娘的 +他妈的靠 +代人了仇 +代人收债 +代办发票 +代办文凭 +代办签证 +代办证件 +代办驾照 +代开税票 +代理假币 +代理发票 +代理票据 +代生孩子 +代购手枪 +令狐援女 +以茎制洞 +以茎治洞 +以茎至洞 +仯妇笣液 +仯妇龅亱 +仿制手枪 +仿真假钞 +仿真手枪 +仿钞出售 +伊力哈木 +伊扎布特 +优博娱乐 +传九促三 +传九退三 +传授赌技 +传送答案 +伦理电影 +伪币出售 +伪装美女 +伪钞专卖 +伪钞出售 +伪钞直销 +伪钞送货 +伪麻黄素 +伸入蜜穴 +伽我卫星 +住家舞男 +体透视镜 +体验sm +体验性爱 +作各种证 +作弊工具 +作爱聚会 +你2大爷 +你二大爷 +你二大爺 +你他妈的 +你他媽的 +你他馬的 +你他马的 +你她馬的 +你她马的 +你妈了妹 +你妈死了 +你姥姥的 +你娘卡好 +你它妈的 +你它媽的 +你它馬的 +你它马的 +你爷爷的 +你爺爺的 +你老母的 +佳个威型 +佳我威信 +供应g水 +供应k粉 +供应丁腈 +供应丙腈 +供应乳腈 +供应假币 +供应公文 +供应军刀 +供应军刺 +供应冰毒 +供应冰砖 +供应冰糖 +供应刺刀 +供应大麻 +供应子弹 +供应弓弩 +供应手弩 +供应手枪 +供应护照 +供应木仓 +供应枪支 +供应枪械 +供应枪模 +供应气枪 +供应气狗 +供应氰气 +供应汽枪 +供应炸药 +供应猎刀 +供应猎枪 +供应猎狗 +供应白冰 +供应白砒 +供应白粉 +供应砍刀 +供应砒霜 +供应砷酸 +供应秃鹰 +供应纯冰 +供应缅古 +供应肾源 +供应腰刀 +供应臊冰 +供应言正 +供应警棍 +供应证件 +供应跳刀 +供应连弩 +供应铀毒 +供应驾照 +供应骚冰 +供应鸟枪 +供应麻古 +供应麻果 +供应麻谷 +供应黄冰 +侮辱藏人 +便携雷管 +俏臀摄魄 +俏臀攝魄 +修炼大法 +借腹生子 +倩女艳谭 +倩女销魂 +假rmb +假军官证 +假币qq +假币专卖 +假币买卖 +假币代理 +假币供应 +假币假钞 +假币出售 +假币批发 +假币提供 +假币销售 +假比出售 +假结婚证 +假证出售 +假证制作 +假证办理 +假钞qq +假钞专卖 +假钞交易 +假钞供应 +假钞出售 +假钞卖买 +假钞批发 +假钞换钱 +假钞提供 +假钞模具 +假钞模版 +假钞电话 +假钞销售 +假钱qq +假钱专卖 +假钱买卖 +假钱代理 +假钱供应 +假钱出售 +假钱批发 +假钱销售 +做假文凭 +做假言正 +做假证件 +做假车牌 +做军人证 +做军官证 +做台小妞 +做台小姐 +做国安证 +做士兵证 +做工作证 +做愛自拍 +做愛電影 +做爱包爽 +做爱图片 +做爱大全 +做爱技巧 +做爱插入 +做爱母子 +做爱淫图 +做爱游戏 +做爱爽图 +做爱电影 +做爱视频 +做爱组图 +做爱自拍 +做爱表情 +做爱表演 +做爱裸聊 +做爱阴蒂 +做爱阿姨 +做爱高潮 +做行驶证 +做记者证 +做驾驶证 +做高仿证 +停车坐爱 +偷啪dv +偷情乱伦 +偷情宝鉴 +偷情家族 +偷情滋味 +偷情男女 +偷拍做爱 +偷拍幼幼 +偷拍性爱 +偷拍美穴 +偷拍自拍 +偷拍裸照 +偷操嫂嫂 +偷窃偷拍 +偷窥图片 +偷窥拍摄 +偷窥无罪 +偷窥有罪 +偷窥社区 +偷窥迷情 +偷窺圖片 +催情喷雾 +催情女用 +催情男用 +催情系列 +催情药水 +催眠迷药 +充气娃娃 +先奸后杀 +光复民国 +免費A片 +免费A片 +免费q币 +免费色站 +党内危机 +党内权争 +党内权力 +党前干劲 +党风日下 +入穴一游 +入穴一遊 +入联公投 +內射美婦 +全家死光 +全家死绝 +全裸女优 +兩腿之間 +八九事件 +八九学潮 +八九学运 +八九學潮 +八九學運 +八九政治 +八九民运 +八九民運 +八九風波 +八九风波 +公产王朝 +公审李鹏 +公審李鵬 +公车被干 +六4散步 +六HE彩 +六合彩券 +六和谐四 +六四之前 +六四之后 +六四之後 +六四事件 +六四以前 +六四以后 +六四以後 +六四信息 +六四动乱 +六四動亂 +六四學潮 +六四屠城 +六四屠杀 +六四屠殺 +六四平反 +六四平暴 +六四正名 +六四民运 +六四民運 +六四点击 +六四真相 +六四运动 +六四運動 +六四風波 +六四风波 +六四點擊 +六月四日 +六河蟹四 +六百度四 +六肆平反 +共产专制 +共产党靠 +共产王朝 +共慿主义 +共残主义 +共青团派 +关灯睡你 +兼zhi +兼只招聘 +兼直招聘 +兼职mm +兼职上门 +兼职公关 +兼职女郎 +兼职妹妹 +兼职娚妓 +兼职学妹 +兼职学生 +兼职小姐 +兼职按摩 +兼职援交 +兼职服务 +兼职模特 +兼职男妓 +兼职白领 +兼职美女 +兼职美眉 +兼职裸聊 +兼职陪睡 +兽交图片 +兽交小说 +兽交幼片 +兽交电影 +兽性诱惑 +内争人权 +内射嫩逼 +内射小姐 +内射少妇 +内射无码 +内射熟女 +内射视频 +内射美妇 +内射群交 +内衣丝袜 +冈崎美女 +册那娘比 +最新假钞 +最新性息 +最新无码 +最新有码 +最新熟女 +最新黄站 +最淫官员 +军刀专卖 +军刀供应 +军刀出售 +军刀批发 +军刀提供 +军刀收购 +军刀直销 +军刀销售 +军刺专卖 +军刺出售 +军刺批发 +军刺提供 +军刺枪刺 +军刺订购 +军刺购买 +军刺转让 +军刺销售 +军品刺刀 +军委主席 +军枪专卖 +军枪枪支 +军用刺刀 +军用匕首 +军用手枪 +农夫导航 +农民运动 +冰古销售 +冰妹服务 +冰毒qq +冰毒买卖 +冰毒供应 +冰毒出售 +冰毒出货 +冰毒到货 +冰毒制法 +冰毒提供 +冰毒电话 +冰毒订购 +冰毒货源 +冰毒配方 +冰毒销售 +冰砖出售 +冰砖出货 +冰砖到货 +冰砖合成 +冰砖订购 +冰砖配方 +冰砖销售 +冲锋枪弹 +凌辱人妻 +凌辱女友 +凌辱董卿 +凯度顿珠 +凲轵莮妓 +出台小妹 +出台小姐 +出台打炮 +出台按摩 +出台援交 +出售k粉 +出售乙醚 +出售伪币 +出售伪钞 +出售假币 +出售假证 +出售假钞 +出售假钱 +出售军刀 +出售军刺 +出售军狗 +出售冰毒 +出售冰砖 +出售刺刀 +出售匕首 +出售发票 +出售器官 +出售大麻 +出售子弹 +出售弓弩 +出售弹药 +出售心脏 +出售战刀 +出售手枪 +出售手枪 +出售手狗 +出售护照 +出售枪具 +出售枪弹 +出售枪支 +出售枪模 +出售枪管 +出售此号 +出售步枪 +出售毒品 +出售气枪 +出售气枪 +出售气狗 +出售汔枪 +出售汽枪 +出售汽狗 +出售火枪 +出售火药 +出售炸药 +出售炸药 +出售狗管 +出售猎枪 +出售猎枪 +出售猎狗 +出售甩刀 +出售男婴 +出售白冰 +出售真枪 +出售短枪 +出售答案 +出售纯冰 +出售肾源 +出售肾脏 +出售腰刀 +出售账号 +出售跳刀 +出售迷魂 +出售钞票 +出售雷汞 +出售雷管 +出售麻古 +出售麻果 +出墙红杏 +出成绩付 +出现暴动 +出轨诱惑 +刀具专卖 +刀具直销 +分裂中国 +分裂中國 +分裂分子 +分裂国家 +分裂國家 +刘胡兰问 +判处死刑 +制作k粉 +制作冰毒 +制作炸药 +制作猎枪 +制式枪支 +制服上门 +制服丝袜 +制服人妻 +制服美妇 +制服誘惑 +制服诱惑 +制服软妹 +制服迷情 +制证定金 +制造冰毒 +刺刀专卖 +刺刀买卖 +刺刀出售 +刺刀批发 +刻章办证 +剃刀淫魔 +前凸后翘 +前凸後翹 +前田优希 +前田阳菜 +剑指天下 +剩女不淑 +力骗中央 +办假证件 +办假证证 +办假车牌 +办假驾照 +办理公文 +办理文凭 +办理本科 +办理言正 +办理证书 +办证假证 +办证刻章 +办高利贷 +加我qq +加我v芯 +劣等民族 +动漫a片 +动漫h片 +动漫色图 +勃大精深 +勃大茎深 +勃朗宁刀 +勃起视频 +勾魂少妇 +勾魂少婦 +勿忘64 +勿忘草屄 +包养mm +包养情妇 +包养鸭子 +包夜小妹 +包夜打炮 +包夜服务 +包娼包赌 +包射视频 +包爽包射 +包爽爆射 +包脱包射 +匕首转让 +北京之春 +北京兼职 +北京当局 +北京性息 +北京政权 +北京独立 +北京美女 +北京风波 +北京黑幕 +北朝鲜冰 +十8和谐 +十年动乱 +十年動亂 +千禧弘法 +千首观阴 +午夜女郎 +午夜影院 +午夜情人 +午夜情郎 +午夜成人 +午夜淫声 +午夜激情 +午夜爽片 +午夜电影 +午夜销魂 +半骚半软 +华南教会 +卖乌头碱 +卖假文凭 +卖假言正 +卖假证件 +卖假车牌 +卖假驾照 +卖党求荣 +卖军人证 +卖军官证 +卖国安证 +卖士兵证 +卖工作证 +卖开山刀 +卖户口本 +卖春网站 +卖枪qq +卖海洛因 +卖淫嫖娼 +卖热武器 +卖硝酸铊 +卖肝中介 +卖肾qq +卖肾信息 +卖行驶证 +卖记者证 +卖身份证 +卖钢珠枪 +卖银行卡 +卖驾驶证 +卖高仿证 +南乃彩花 +博彩网络 +占领中环 +占领台湾 +卡巴军刀 +印尼事件 +印尼屠华 +卿本佳人 +厕所偷拍 +厕所盗摄 +原味丝袜 +原味内衣 +原味内裤 +原味絲襪 +原纱央莉 +原装气枪 +原装猎枪 +去你妈的 +去你媽的 +又粗又短 +又鳥女幹 +又鸟女干 +及川奈央 +双刃尖刀 +双峰微颤 +双氢吗啡 +双面女友 +双飞服务 +双飞美女 +双龙入洞 +反中游行 +反共传单 +反共复清 +反共言论 +反华示威 +反对两会 +反攻大陆 +反攻大陸 +发@@仑 +发@@伦 +发@@抡 +发@@沦 +发@@纶 +发@@论 +发@@轮 +发**仑 +发**伦 +发**抡 +发**沦 +发**纶 +发**论 +发**轮 +发^^仑 +发^^伦 +发^^抡 +发^^沦 +发^^纶 +发^^论 +发^^轮 +发~~仑 +发~~伦 +发~~抡 +发~~沦 +发~~纶 +发~~论 +发~~轮 +发$$仑 +发$$伦 +发$$抡 +发$$沦 +发$$纶 +发$$论 +发$$轮 +发廊性息 +发情春药 +发生关系 +发生暴动 +发票代开 +发贴工具 +叔嫂偷欢 +叔嫂奸情 +叔嫂肉欲 +受辱禁处 +变性晓薇 +口交专区 +口交器具 +口交图片 +口交放尿 +口交无码 +口交美图 +口內爆射 +口内爆射 +口含鸡巴 +口含龟头 +口活图片 +口爆中出 +口爆内射 +口爆吞精 +古柯买卖 +另类群交 +另类色图 +只求1夜 +只求快感 +只爱色色 +叫床呻吟 +台制假币 +台海危机 +台海大战 +台海统一 +台湾万岁 +台湾分裂 +台湾岛国 +台湾建国 +台湾总统 +台湾民国 +台湾民國 +台湾独立 +台湾獨立 +台湾秃鹰 +台湾色网 +台湾色魔 +台湾论坛 +台灣民国 +台灣民國 +台灣獨立 +台独万岁 +台独分子 +台獨分子 +司考答案 +叼叼幼女 +吃酒乱性 +合成k粉 +合成冰毒 +合欢宝典 +同城性息 +同城换妻 +同城裸聊 +同城陪睡 +同性交友 +名刀批发 +后入多爽 +后入插菊 +后庭专区 +后庭诱惑 +向党挑衅 +吞精颜射 +吞精騷妹 +吞精骚妹 +含着龟头 +听话药水 +吮吸小穴 +吮吸肉棒 +吸吮肉棒 +吸精少女 +吸精痴女 +吸舔取精 +吾尔凯西 +吾尔开希 +吾尔开西 +吾爾開希 +吾爾開西 +周6性吧 +周六性吧 +周末同床 +和你缠绵 +和尚把妹 +咪咪图片 +咪咪圖片 +咪咪情色 +咪咪淫色 +咪咪色情 +咪咪色界 +咪达唑仑 +咬着龟头 +哥也色网 +唐刀批发 +唛可奈因 +售一元硬 +售假护照 +售假文凭 +售假硬币 +售假言正 +售假证件 +售假车牌 +售军人证 +售军官证 +售国安证 +售士兵证 +售套牌车 +售工作证 +售弹簧刀 +售户口本 +售枪qq +售行驶证 +售警官证 +售警察证 +售记者证 +售走私车 +售身份证 +售钢珠枪 +售驾驶证 +售高仿证 +商务陪护 +啜乳左右 +啥是b呀 +善解人衣 +喜欢少妇 +喜欢猛男 +喜欢裸男 +喷精3p +喷雾迷药 +嘉味星吧 +嘿咻嘿咻 +器大活好 +器官贩卖 +四川独立 +四川獨立 +四海龙女 +回忆64 +回忆六四 +回民暴动 +回民暴動 +回汉冲突 +国wu院 +国产av +国产h片 +国产乱伦 +国产偷拍 +国产口交 +国产嫖娼 +国产情色 +国产无码 +国产毛片 +国产肛交 +国产骚货 +国外毛片 +国家主席 +国家吞得 +国家总理 +国家软弱 +国模南南 +国模白灵 +国模私拍 +国模程程 +国模羊羊 +国际投注 +国际特赦 +國家主席 +國家總理 +國產AV +國產偷拍 +國產嫖娼 +國產騷貨 +土制炸药 +土匪政府 +圣女传奇 +圣战不息 +圣战组织 +圣泉学淫 +在哪做鸡 +在室舞男 +在线下注 +在线博彩 +在线淫穴 +在线祼聊 +在线裸聊 +在线赌博 +在线赌场 +在线赌球 +在线黄片 +地下先烈 +地下刊物 +地下情人 +地下赌博 +地下钱庄 +地方召会 +地狱召唤 +坐台少爷 +坐我鞭上 +基地组织 +堕落警察 +塑胶炸弹 +塞你老师 +塞你老母 +增大增粗 +壮阳保健 +壮阳葆旔 +处女出售 +处女夜记 +处女导航 +处女小穴 +处女开包 +处女开瓜 +处女开苞 +处女心经 +处女思春 +处女情结 +处女诱惑 +处女陪睡 +处子之作 +处子之身 +处男嫖妓 +复印件制 +夏日狂情 +夕树舞子 +外围赌球 +外国做爱 +外蒙回归 +多人乱交 +多人性愛 +多人性爱 +多人换妻 +多人群交 +多党执政 +多維新聞 +多维新闻 +多黨執政 +夜勤病栋 +夜夜啪啪 +夜夜风情 +夜店头牌 +夜店小姐 +夜情成人 +夜情社区 +夜色导航 +夜色王朝 +夜色贵族 +夜诱娘子 +大 紀元 +大 纪元 +大6av +大6a片 +大6援交 +大6无码 +大力日逼 +大圆满法 +大型色站 +大型黄站 +大堀香奈 +大奶美逼 +大奶騷女 +大奶骚女 +大学骚乱 +大屌3p +大庆工潮 +大批贪官 +大法弟子 +大波粉B +大波騷婦 +大波骚妇 +大生殖器 +大粗鸡巴 +大胆少女 +大腿舔食 +大膽少女 +大赦国际 +大陆AV +大陆当局 +大鸡巴爽 +大麻出售 +大麻提供 +大麻树脂 +大麻订购 +大麻销售 +大黑鹰弩 +天国乐团 +天天情色 +天灭中共 +太安炸药 +夫妇乐园 +夫妻3p +夫妻乱交 +夫妻亂交 +夫妻交换 +夫妻多p +夫妻爽片 +夫妻自拍 +央视无耻 +夹she +夹腿自慰 +奇淫寶鑒 +套弄鸡巴 +女人和狗 +女人屄图 +女人是海 +女人的b +女人的洞 +女任职名 +女优中出 +女优娃娃 +女优炮图 +女优爽图 +女优种子 +女优陪服 +女同bt +女同性爱 +女基督派 +女士服务 +女夹脚式 +女女淫乐 +女奴上门 +女奴调教 +女尤名器 +女干3亏 +女干三亏 +女幹三虧 +女性器具 +女机械人 +女王奴隶 +女用器具 +女神国际 +女鬼倩影 +奴隶调教 +奴隷调教 +奴隸調教 +奶大屄肥 +奶头真红 +奶挺臀翘 +奶挺臀翹 +奸夫淫妇 +奸淫嫂嫂 +奸淫护士 +奸淫掳掠 +奸淫电影 +奸淫电车 +奸淫空姐 +她NND +她奶奶的 +她的诱惑 +好大阴户 +好想出轨 +好挺好硬 +好紧的屄 +好紧的穴 +好色淑女 +好骚综合 +如月可怜 +妈个老比 +妈了个逼 +妈卖妈屁 +妈妈的穴 +妈妈美穴 +妈浪女骚 +妈菊花穴 +妒火焚情 +妓女包夜 +妓女日记 +妓女自拍 +妓术总奸 +妖媚熟母 +妖艳贱货 +妖艷醫生 +妙手神织 +妩媚挑逗 +妳她妈的 +妳她媽的 +妳老母的 +妹妞露穴 +妹妹上门 +妹妹做爱 +妹妹兼职 +妹妹叫床 +妹妹吸精 +妹妹嫩穴 +妹妹小穴 +妹妹很紧 +妹妹服务 +妹妹淫图 +妹妹爽图 +妹妹的屄 +妹妹阴毛 +妹妹陰毛 +妹妹騷圖 +妹妹骚图 +妹妹黄站 +妻子小穴 +姊的淫腔 +姐姐的屄 +姐弟淫乱 +姐弟销魂 +姦夫淫婦 +姦淫電車 +娇娇师娘 +娇艳人生 +姬咲无码 +娘了个比 +娥眉气枪 +娱乐博彩 +娱乐透视 +婊子养的 +婚外初夜 +婬乱军团 +婷婷淫色 +媚药少年 +媚藥少年 +媽個老比 +嫂嫂我要 +嫂嫂淫穴 +嫂嫂的穴 +嫖妓指南 +嫖妓系列 +嫖娼视频 +嫖娼自拍 +嫩b电影 +嫩流插肉 +嫩穴搔穴 +嫩穴狂插 +嫩穴肉縫 +嫩穴肉缝 +嫩逼淫水 +嫵媚挑逗 +子弹专卖 +子弹供应 +子弹出售 +学生乳交 +学生包夜 +学生暴动 +学生服务 +学生淫图 +学生领袖 +学百度潮 +它NND +宅女社区 +宇宙主佛 +宇宙大法 +守护美女 +安西优子 +宗教压迫 +官人我要 +官僚主义 +官匪1家 +官匪一家 +官员别墅 +官商勾结 +官商暴利 +官官皆贪 +官逼民反 +定购假币 +定购假钱 +实学历文 +实钱赌博 +宫下杏奈 +宫崎由麻 +家庭乱交 +家庭乱伦 +家有艳妻 +家用卫星 +宾馆女郎 +宾馆小姐 +宾馆群p +寂寞少妇 +寂寞春宵 +寂寞的淫 +寂寞美女 +寂寞自摸 +寂寞难耐 +密室淫行 +密穴贴图 +富婆找鸭 +对日强硬 +寻1页情 +寻pao +寻甸冰毒 +导航处女 +导航色站 +封面女郎 +射你1嘴 +射你1脸 +射你嘴里 +射妓总奸 +射就服你 +射精影院 +射进小穴 +小女嫩穴 +小妹上门 +小妹出台 +小妹按摩 +小妹裸聊 +小姐上门 +小姐价格 +小姐会所 +小姐信息 +小姐兼职 +小姐出台 +小姐包夜 +小姐性息 +小姐性爱 +小姐按摩 +小姐援交 +小姐服务 +小姐裸聊 +小姨子穴 +小姨的穴 +小平无奈 +小平转世 +小平遗嘱 +小平遗言 +小森美王 +小穴好爽 +小穴好紧 +小穴流出 +小穴淫图 +小穴被插 +小穴里流 +小逼崽子 +小骚bb +尐妇苞夜 +少女之心 +少女交友 +少女初夜 +少女发春 +少女图片 +少女换衣 +少女援交 +少女日记 +少女禁地 +少女被插 +少妇中出 +少妇偷情 +少妇兼职 +少妇包夜 +少妇按摩 +少妇淫穴 +少妇白洁 +少妇自慰 +少妇自拍 +少妇自淫 +少婦偷情 +少年阿宾 +少爷招聘 +就去品色 +就去色色 +就去誘惑 +就去诱惑 +就要上你 +尸蛊艳谭 +尼可待因 +尽情纵欲 +屁股按摩 +屄屄特写 +屄屄特寫 +屌穴专区 +屠杀学生 +山中艳潭 +山中艳谭 +山野情债 +工口游戏 +工字狗粮 +工字皮碗 +工资日结 +巧淫奸戏 +巧淫奸戲 +巨乳ol +巨乳人妻 +巨乳素人 +巨乳诱惑 +巨炮肉穴 +巨骚综合 +巫毒娃娃 +己酮肟威 +巴东烈女 +布卖淫女 +帅同社区 +帅哥服务 +希望之声 +希望之聲 +帝国夜色 +带套肛交 +帮人怀孕 +帶套肛交 +干 淫洞 +干你全家 +干你妈B +干你妈逼 +干你媽b +干你媽逼 +干你老母 +干你老比 +干出淫水 +干妳老母 +干小蜜洞 +干死GM +干死客服 +干洋妞穴 +干炮插穴 +平反64 +平反六四 +平反陆肆 +幹你妈b +幹你妈逼 +幹你媽b +幹你媽逼 +幹你老母 +幹你老比 +幹妳老母 +幹死GM +幹死客服 +乡野情梦 +幻想玉女 +幼交a片 +幼交乱伦 +幼交同志 +幼女a片 +幼女口交 +幼女嫩穴 +幼女嫩逼 +幼女开雹 +幼女性交 +幼女无码 +幼女淫图 +幼女狗交 +幼女玩性 +幼女群交 +幼女颜射 +幼幼同志 +幼幼极品 +幼幼电影 +幼幼秘书 +幼幼色图 +幼幼诱女 +幼幼调教 +幼齿口交 +幼齿援交 +床上写真 +床上功夫 +床上妓师 +床上明骚 +床上诱惑 +床上运动 +庐江全裸 +庐江群p +庐江艳照 +庐江裸照 +应召女郎 +康熙艳潭 +廁所偷拍 +廓尔喀刀 +开心见性 +开房视频 +开房自拍 +开放女人 +开苞价格 +开除党籍 +异见人士 +异议人士 +弓努专卖 +弓弩专卖 +弓弩专营 +弓弩供应 +弓弩出售 +弓弩制作 +弓弩图纸 +弓弩批发 +弓弩直销 +弓弩论坛 +弓弩论坛 +弓弩销售 +弓月杏里 +弓虽女干 +弓雖女幹 +引起暴动 +弟大勿勃 +弟大物勃 +张开双腿 +弩弓官网 +弩机图纸 +弩的图纸 +強制浣腸 +強姦處女 +強淫女優 +弹簧跳刀 +弹药专卖 +弹药买卖 +弹药出售 +弹药配方 +强制浣肠 +强制深喉 +强奸乱伦 +强奸你妹 +强奸处女 +强奸小穴 +强奸小说 +强奸少妇 +强奸护士 +强奸视屏 +强奸美女 +强暴sm +强暴电影 +强权政府 +强淫女优 +彩弹汽枪 +彩票预测 +影子政府 +御花王朝 +快乐AV +快插吧快 +快播av +快播a片 +快播女优 +快播成人 +快播毛片 +快播颜射 +快樂AV +快活成性 +思巢公寓 +急求k粉 +急需卖肾 +性之图吧 +性书大亨 +性交做爱 +性交内射 +性交吞精 +性交图库 +性交图片 +性交实拍 +性交无码 +性交淫图 +性交無碼 +性交电影 +性交视频 +性交美图 +性交自拍 +性交贴图 +性保健品 +性俱乐部 +性吧有你 +性女传奇 +性奴养成 +性奴调教 +性学教授 +性工作者 +性息qq +性息上门 +性息中国 +性息出售 +性息咨询 +性息服务 +性息论坛 +性愛圖庫 +性愛圖片 +性愛插穴 +性愛擂臺 +性感乳娘 +性感女人 +性感妖娆 +性感妖嬈 +性感服务 +性感海茶 +性感肉丝 +性感肉絲 +性感裸聊 +性感誘惑 +性感诱惑 +性感骚b +性战擂台 +性戰擂臺 +性欲冷淡 +性欲天堂 +性欲太旺 +性欲很强 +性欲旺盛 +性欲机器 +性欲熏心 +性爱a片 +性爱世代 +性爱之后 +性爱乱伦 +性爱交易 +性爱写真 +性爱动漫 +性爱动画 +性爱图库 +性爱图片 +性爱套图 +性爱女优 +性爱娃娃 +性爱导航 +性爱小说 +性爱录像 +性爱影院 +性爱护士 +性爱插穴 +性爱擂台 +性爱文学 +性爱日记 +性爱档案 +性爱毛片 +性爱派对 +性爱淫图 +性爱漫画 +性爱电影 +性爱视频 +性爱群交 +性爱聊天 +性爱联盟 +性爱自拍 +性爱裸聊 +性爱陪聊 +性爱频道 +性生活片 +性癖日记 +性福天堂 +性福影院 +性福综合 +性福联盟 +性虎色網 +性虎色网 +性趣相投 +性趣高手 +总会美女 +恋之欲室 +恐怖主义 +恐怖主義 +恐怖份子 +恐怖分子 +恐怖组织 +恐怖袭击 +恥辱醫護 +恶女总裁 +恶女戏夫 +悼念64 +悼念六四 +情人奴奴 +情敌色戒 +情欲之爱 +情欲关系 +情欲城市 +情欲王朝 +情欲肉店 +情理乱伦 +情色5月 +情色a片 +情色BT +情色交友 +情色信息 +情色卡通 +情色图片 +情色基地 +情色天崖 +情色妹妹 +情色导航 +情色導航 +情色影院 +情色快播 +情色性息 +情色成人 +情色文学 +情色文學 +情色服务 +情色毛片 +情色游戏 +情色电影 +情色男女 +情色网游 +情色网站 +情色美眉 +情色聊天 +情色论坛 +情见于色 +情趣内衣 +情趣性趣 +情趣用品 +惹火自拍 +惹火身材 +意者加寇 +意者加扣 +意者加抠 +意者加蔻 +愛妻淫穴 +愛液橫流 +感观王国 +慢性毒药 +戈博军刀 +成人av +成人a片 +成人BT +成人dv +成人h网 +成人下载 +成人专区 +成人书库 +成人乱伦 +成人偷拍 +成人写真 +成人动画 +成人卡通 +成人图片 +成人圖片 +成人基地 +成人夜话 +成人套图 +成人导航 +成人小說 +成人小说 +成人影视 +成人影視 +成人影院 +成人性吧 +成人性爱 +成人情色 +成人文学 +成人文學 +成人无码 +成人淫伦 +成人淫图 +成人游戏 +成人漫画 +成人漫畫 +成人激情 +成人炮图 +成人用品 +成人电影 +成人百強 +成人百强 +成人短片 +成人社区 +成人社區 +成人视频 +成人網站 +成人网游 +成人网站 +成人联盟 +成人自拍 +成人色情 +成人色片 +成人色站 +成人色网 +成人裸图 +成人裸聊 +成人論壇 +成人论坛 +成人贴图 +成人资源 +成人软件 +成人電影 +成人黄片 +成人黄站 +成美雪菜 +我xx你 +我为卿狂 +我你老板 +我做骚妻 +我和处长 +我和姐姐 +我和少妇 +我好想做 +我妳老爸 +我就去色 +我很持久 +我搞台独 +我方公司 +我日你妈 +我是歌手 +我是王妃 +我有婚姻 +我淫我色 +我爱我色 +我爱色吧 +我爱裸聊 +我的天下 +我的奋斗 +我的西域 +我薇僚哦 +我虽死去 +我要官人 +我要性交 +我要色图 +戒色是空 +战术军刀 +战术军刺 +战术刀具 +战术匕首 +战术折刀 +戳那吗B +戳那吗比 +戳那吗逼 +戳那嗎逼 +户外军刀 +房山请愿 +手弩专卖 +手弩买卖 +手弩供应 +手弩出售 +手弩制作 +手弩图纸 +手弩批发 +手弩直销 +手弩转让 +手弩销售 +手抢专卖 +手抢出售 +手抢到货 +手机监听 +手枪买卖 +手枪出售 +手枪批发 +手枪现货 +手枪销售 +手狗专卖 +手狗出售 +手狗直销 +手狗订购 +手铐批发 +手驽配件 +扒了猛矸 +扒光猛干 +扒开嫩穴 +扒开小穴 +打倒中共 +打倒朱镕 +打倒李鹏 +打倒罗干 +打炮服务 +打炮高手 +打野战去 +打飞机专 +扮开嫩穴 +批发k粉 +批发丁腈 +批发丙腈 +批发假币 +批发假钞 +批发假钱 +批发军刀 +批发军刺 +批发冰毒 +批发冰砖 +批发刀具 +批发匕首 +批发名刀 +批发吗啡 +批发唐刀 +批发大麻 +批发弹药 +批发手弩 +批发枪支 +批发汽枪 +批发狗管 +批发白砒 +批发砍刀 +批发砒霜 +批发缅古 +批发肾源 +批发臊冰 +批发药弩 +批发警棍 +批发警衔 +批发跳刀 +批发连弩 +批发迷药 +批发麻古 +批发麻果 +批发麻谷 +批林批孔 +找1夜情 +找mm干 +找个情人 +找人曰我 +找做爱人 +找妹妹干 +找学生妹 +找色女人 +把你睡服 +把邓小平 +投注博彩 +投注娱乐 +折刀专卖 +折叠狗售 +抢其火炬 +护士无码 +护士淫乱 +护士爽图 +护士诱惑 +抵制中共 +抵制李鹏 +抽B淫穴 +抽你丫的 +抽叉姐姐 +抽插内射 +抽插呻吟 +抽插婷婷 +抽插小穴 +抽插淫水 +拉萨事件 +拍肩迷药 +拐卖儿童 +拐卖婴儿 +拒廉变腐 +拔屄自拍 +招嫖电话 +招聘公主 +持久力好 +持久度高 +挂牌禽兽 +按摩包夜 +按摩小姐 +按摩性息 +按摩服务 +挨了1炮 +挨了一炮 +挺入阴道 +挺进小穴 +捆绑调教 +捏你奶子 +捏你雞巴 +捏你鶏巴 +捏你鸡巴 +换妻乱交 +换妻大会 +换妻快播 +换妻杂交 +换妻派对 +换妻游戏 +换妻电影 +换妻群交 +换届隐忧 +捷克左轮 +控诉世博 +推翻独裁 +掰开嫩穴 +掰穴打洞 +提供k粉 +提供乳交 +提供假币 +提供军刀 +提供军刺 +提供冰毒 +提供匕首 +提供大麻 +提供小姐 +提供援交 +提供枪弩 +提供枪械 +提供步枪 +提供毒品 +提供汽枪 +提供猎枪 +提供短枪 +提供肾源 +提供裸聊 +提供言正 +提供跳刀 +提供驾照 +提供麻古 +提供麻谷 +插 3p +插 4p +插 8p +插 9p +插 小姐 +插你全家 +插你奶奶 +插你妈逼 +插你爷爷 +插你爺爺 +插你祖宗 +插你老母 +插入內射 +插入内射 +插入嫩穴 +插入穴爽 +插入蜜穴 +插妹妹图 +插的好爽 +插着淫穴 +插穴手淫 +插穴止痒 +插穴止癢 +插穴淫图 +插老师穴 +插那吗B +插那吗比 +插那吗逼 +插那嗎逼 +換妻大會 +換妻雜交 +援交qq +援交上门 +援交信息 +援交包夜 +援交妹妹 +援交小姐 +援交打炮 +援交电话 +援交视频 +援交自拍 +援交薄码 +援交薄碼 +援交骚妇 +援助交易 +援助交际 +搔穴自慰 +搭讪诱奸 +摸你全身 +摸你雞巴 +摸你鶏巴 +摸你鸡巴 +摸摸大腿 +撕si袜 +撸撸影院 +操b影院 +操B指南 +操mm穴 +操你全家 +操你大爷 +操你奶奶 +操你妈屄 +操你妈的 +操你妈靠 +操你媽的 +操你爷爷 +操你祖宗 +操你老妈 +操你老娘 +操你老母 +操催情药 +操吃大便 +操大波波 +操女人穴 +操妳全家 +操妳祖宗 +操小姐b +操小姐穴 +操小姨子 +操屄快播 +操屄淫图 +操布莱尔 +操成人片 +操插gm +操插你妈 +操插深些 +操操gM +操操XX +操操你妈 +操曹刚川 +操烂骚妇 +操烂骚货 +操破苍穹 +操穴喷水 +操穴插逼 +操穴贴图 +操美女穴 +操臭化西 +操草你妈 +操草拟妈 +操薄一波 +操表妹操 +操财政部 +操迟浩田 +操逼免费 +操逼影院 +操逼电影 +操那吗B +操那吗比 +操那吗逼 +操那嗎逼 +操陈希同 +操陈晓宁 +操陈水扁 +操陈至立 +操陈良宇 +支持达賴 +支持达赖 +支持達賴 +收购肾脏 +收费女王 +收费激情 +收费祼聊 +收费裸聊 +攻占台湾 +攻官小姐 +放线菌酮 +放荡少妇 +放荡熟女 +放荡青春 +放蕩少婦 +放蕩熟女 +政府无能 +政府無能 +政府软弱 +政治封锁 +政治打击 +政治阴谋 +政治风波 +教室无码 +教师无码 +散花天女 +敬候佳阴 +文凭代办 +文爱性聊 +文爱电爱 +新全讯网 +新型毒品 +新球博彩 +新疆75 +新疆分裂 +新疆暴乱 +新疆独立 +新疆獨立 +新疆砍人 +新疆骚乱 +新约教会 +新金瓶梅 +无套内射 +无套口交 +无套自拍 +无界浏览 +无码av +无码a片 +无码H漫 +无码丝袜 +无码中出 +无码体验 +无码做爱 +无码光碟 +无码内射 +无码写真 +无码动漫 +无码口交 +无码床照 +无码彩图 +无码快播 +无码性爱 +无码成人 +无码无套 +无码淫女 +无码淫漫 +无码漫画 +无码炮图 +无码电影 +无码真军 +无码种子 +无码精品 +无码精选 +无码肛交 +无码色片 +无码裸聊 +无码长片 +无耻语录 +无需刷卡 +无颜美女 +日X 妈 +日X 媽 +日你9城 +日你九城 +日你全家 +日你奶奶 +日你妈靠 +日你没够 +日你爷爷 +日你爺爺 +日你祖宗 +日你老娘 +日你老母 +日你逼逼 +日日av +日月图库 +日月气功 +日本av +日本h色 +日本万岁 +日本女优 +日本妹妹 +日本幼交 +日本情色 +日本成人 +日本插穴 +日本援交 +日本无码 +日本有码 +日本有碼 +日本淫图 +日本淫妞 +日本淫色 +日本熟母 +日本美女 +日本美眉 +日本色情 +日本騷貨 +日本骚货 +日本鬼子 +日理万妓 +日野美沙 +日韩AV +日韩乱伦 +日韩女尤 +日韩无码 +日韩有码 +日韩淫女 +日韩白虎 +旧床新友 +早泄克星 +明慧周报 +明星淫图 +明星淫圖 +明星走光 +星崎未来 +春夏之交 +春水情色 +春水横溢 +春药供应 +春药批发 +春药提供 +春药直销 +春药订购 +春药销售 +普斯普剂 +智取其乳 +暗夜情魔 +暧昧神雕 +暴力执法 +暴力虐待 +暴劫倾情 +暴王淫妃 +暴走烈女 +月泊西眉 +有偿买肾 +有偿捐肝 +有偿捐肾 +有偿收肾 +有偿服务 +有偿献肾 +有奶不1 +有奶不一 +有容奶大 +有性乐趣 +有意加q +有意加寇 +有意加扣 +有意加抠 +有意加蔻 +有意家q +有求必硬 +有波必应 +有码性爱 +有麻果买 +服务上门 +服务天使 +服务小姐 +望月加奈 +木下柚花 +木下若菜 +本?拉登 +本.拉登 +本。拉登 +本人卖肾 +本土无码 +本土無碼 +朱闲基传 +杀人卖尸 +杀你1家 +杀你一家 +杀你全家 +杂种操的 +权贵集团 +李大轮子 +李月月鳥 +李月月鸟 +李洪志靠 +杏林春梦 +杨佳杀警 +杨海举报 +极乐酷刑 +极品乱伦 +极品人妻 +极品太女 +极品奶妹 +极品校花 +极品波神 +极品波霸 +极品炮图 +极品白虎 +极品色医 +极品色妃 +极品诱惑 +极品骚女 +极品黑丝 +极度兽性 +极度诱惑 +极度香艳 +极欲燃烧 +東亞病夫 +東北獨立 +東條英機 +東熱空姐 +東突組織 +果聊qq +果聊免费 +枪决女犯 +枪弹出售 +枪支买卖 +枪支出售 +枪支批发 +枪支销售 +枪械买卖 +枪械出售 +枪械图纸 +枪模专卖 +枪淫少妇 +枪硬情浓 +枪管出售 +桃色情人 +桃色电影 +桃色经纪 +桃色香居 +桥本杏子 +梦网洪志 +森奈奈子 +極品奶妹 +極品波神 +極品波霸 +極品白虎 +極品黑絲 +楼凤小姐 +楼凤性息 +楼凤陪睡 +模特包夜 +模特裸聊 +横山美雪 +欧女乱欲 +欧洲无码 +欧洲色图 +欧美AV +欧美a片 +欧美bt +欧美h片 +欧美乱伦 +欧美做爱 +欧美内射 +欧美大乳 +欧美女同 +欧美女色 +欧美情色 +欧美援交 +欧美无码 +欧美有码 +欧美淫图 +欧美淫色 +欧美激情 +欧美白虎 +欧美自拍 +欧美色图 +欧美色片 +欧美骚货 +欲仙欲死 +欲仙欲浪 +欲女初生 +欲望性欲 +欲望法则 +欲望解析 +欲海双艳 +欲火焚身 +欲火难眠 +欲火难耐 +欲火龙珠 +欲黄大d +歐美大乳 +步枪专卖 +步枪供应 +步枪出售 +步枪转让 +步枪销售 +武力镇压 +武士直刀 +武装镇压 +武逆干坤 +死亡笔记 +死刑枪毙 +死刑缓期 +殴美性爱 +殺你一家 +殺你全家 +毋忘64 +母女双飞 +母女雙飛 +母子乱伦 +母子交欢 +母子交歡 +母子做爱 +母子奸情 +母子姦情 +毒品出售 +毒品配方 +毒品销售 +毒的制作 +毒的配方 +毒龍舔腳 +毒龙舔脚 +毛1夜情 +毛3唑仑 +毛3级片 +毛3陪女 +毛6合彩 +毛一夜情 +毛一贯道 +毛三唑仑 +毛三级片 +毛三陪女 +毛他妈的 +毛他母亲 +毛他祖宗 +毛他马的 +毛你大爷 +毛你妈的 +毛你妈逼 +毛你老母 +毛俞正声 +毛僵贼民 +毛六?四 +毛六。四 +毛六合彩 +毛共产党 +毛刘云山 +毛刘少奇 +毛华国锋 +毛南蛮子 +毛反政府 +毛反革命 +毛发伦功 +毛发抡功 +毛发正念 +毛发论公 +毛发论功 +毛叫小姐 +毛可卡因 +毛可待因 +毛台湾国 +毛叶剑英 +毛吕秀莲 +毛吗啡片 +毛吗啡碱 +毛吴官正 +毛吴邦国 +毛回良玉 +毛国务院 +毛圣女峰 +毛塞你娘 +毛塞你母 +毛塞你爸 +毛多维社 +毛多维网 +毛太子党 +毛她妈的 +毛妳妈的 +毛妳娘的 +毛妳马的 +毛宋楚瑜 +毛宋祖英 +毛尉健行 +毛小乳头 +毛小日本 +毛小鸡鸡 +毛岸英问 +毛希特勒 +毛干你妈 +毛干你娘 +毛干拎娘 +毛干死你 +毛乡巴佬 +毛建设部 +毛强奸犯 +毛性无能 +毛性虐待 +毛想上你 +毛我操你 +毛我日你 +毛摇头丸 +毛摇头玩 +毛摩门教 +毛斯大林 +毛新唐人 +毛新生网 +毛日他娘 +毛日你妈 +毛日你娘 +毛明慧网 +毛李先念 +毛李宏志 +毛李宏旨 +毛李岚清 +毛李洪志 +毛李瑞环 +毛李登辉 +毛李红志 +毛李铁映 +毛李长春 +毛李鹏* +毛死全家 +毛毛XX +毛毛主席 +毛毛厕洞 +毛毛泽东 +毛毛贼东 +毛江主席 +毛江八点 +毛江戏子 +毛江折民 +毛江择民 +毛江核心 +毛江泽民 +毛江独裁 +毛江猪媳 +毛江贼民 +毛法西斯 +毛法轮功 +毛泽东靠 +毛海洛因 +毛温加宝 +毛温家保 +毛温家宝 +毛温总理 +毛片下载 +毛片在线 +毛片影讯 +毛片影院 +毛片视讯 +毛片种子 +毛片网址 +毛片网站 +毛狗日的 +毛王乐泉 +毛王兆国 +毛王八蛋 +毛王岐山 +毛生鸦片 +毛田纪云 +毛监听王 +毛神经病 +毛穴贴图 +毛窃听器 +毛红卫兵 +毛肉棍子 +毛胜蒋败 +毛胡乔木 +毛胡紧套 +毛胡紧掏 +毛胡紧涛 +毛胡耀邦 +毛胡锦涛 +毛胡锦淘 +毛萨达姆 +毛董贱华 +毛蒋中正 +毛蒋介石 +毛蒋经国 +毛蒙尘药 +毛贺国强 +毛贾庆林 +毛迷奸药 +毛迷歼药 +毛迷魂药 +毛郭伯雄 +毛酱猪媳 +毛金日成 +毛金正日 +毛钱其琛 +毛靠你妈 +毛鸦片液 +毛鸦片渣 +毛麦角酸 +毛麻醉药 +毛黎阳评 +毛龟儿子 +毛龟孙子 +民主女神 +民族冲突 +民运人士 +民运分子 +民间修宪 +气枪专卖 +气枪买卖 +气枪价格 +气枪出售 +气枪图纸 +气枪直销 +气枪膛线 +气枪订购 +气枪购买 +气枪销售 +气狗买卖 +气狗出售 +气狗直销 +水去車仑 +水去車侖 +水去车仑 +水去车侖 +水城奈绪 +氵去车仑 +永利高网 +求女男妓 +求性关系 +汔枪供应 +汔枪出售 +汔枪批发 +汔枪提供 +汔枪订购 +汔枪销售 +江ze民 +江已病危 +江总病危 +江泽民靠 +江派人马 +江湖淫娘 +江系人马 +江胡内斗 +污力女友 +汽枪qq +汽枪买卖 +汽枪交易 +汽枪价格 +汽枪出售 +汽枪提供 +汽枪组装 +汽枪订购 +汽枪购买 +汽枪转让 +汽枪销售 +汽狗出售 +沁园春血 +沃尔开西 +沒有人權 +沟女物语 +没有人权 +河蟹社会 +治疗性病 +沾满了淫 +泄欲罢了 +法@@仑 +法@@伦 +法@@侖 +法@@倫 +法@@抡 +法@@掄 +法@@沦 +法@@淪 +法@@綸 +法@@纶 +法@@論 +法@@论 +法@@輪 +法@@轮 +法**仑 +法**伦 +法**侖 +法**倫 +法**抡 +法**掄 +法**沦 +法**淪 +法**綸 +法**纶 +法**論 +法**论 +法**輪 +法**轮 +法^^仑 +法^^伦 +法^^侖 +法^^倫 +法^^抡 +法^^掄 +法^^沦 +法^^淪 +法^^綸 +法^^纶 +法^^論 +法^^论 +法^^輪 +法^^轮 +法~~仑 +法~~伦 +法~~侖 +法~~倫 +法~~抡 +法~~掄 +法~~沦 +法~~淪 +法~~綸 +法~~纶 +法~~論 +法~~论 +法~~輪 +法~~轮 +法$$仑 +法$$伦 +法$$侖 +法$$倫 +法$$抡 +法$$掄 +法$$沦 +法$$淪 +法$$綸 +法$$纶 +法$$論 +法$$论 +法$$輪 +法$$轮 +法lun +法輪大法 +法车仑功 +法轮佛法 +法轮功靠 +法轮大法 +泡沫经济 +波动少女 +泥马之歌 +泰国淫乐 +洋妞包夜 +洋妞援交 +洋妞服务 +洗浴小姐 +洗肠射尿 +洗腸射尿 +洞小口紧 +洞房不败 +洞抽少妇 +洞茎结合 +洪荒魔尊 +活体卖肾 +活体取肾 +活大器粗 +活好裆下 +活摘器官 +流亡藏人 +流血事件 +浑圆豪乳 +浪女淫水 +浪妇阿姨 +浪妹社区 +浪妻淫女 +浴室乱伦 +浴室亂倫 +浴室自拍 +浴火情潮 +海外民运 +海豹m9 +涉嫌抄袭 +涩女日记 +涪陵楼凤 +液体炸弹 +液体炸药 +液态毒品 +淘金盈网 +淫 电影 +淫b内射 +淫B浪女 +淫B浪穴 +淫丝荡袜 +淫乱书生 +淫乱人妻 +淫乱军团 +淫乱图片 +淫乱小穴 +淫乱小说 +淫乱少妇 +淫乱工作 +淫乱护士 +淫乱潮吹 +淫乱熟女 +淫乱狂穴 +淫乱电影 +淫乱秘史 +淫乱美乳 +淫乱诊所 +淫亂工作 +淫亂潮吹 +淫亂熟女 +淫亂軍團 +淫人师表 +淫兴肉棒 +淫兽学园 +淫叫不断 +淫叫好爽 +淫叫快干 +淫叫快插 +淫叫抽插 +淫叫抽送 +淫叫淫声 +淫叫玩弄 +淫叫用力 +淫叫肉棒 +淫叫肉缝 +淫叫舒服 +淫叫舔弄 +淫叫要丢 +淫叫阳具 +淫唇肉棒 +淫唇鸡巴 +淫图下载 +淫图乱伦 +淫图嫩穴 +淫图炮图 +淫图色情 +淫声浪语 +淫声系列 +淫大玳婊 +淫女信息 +淫女刮毛 +淫女吃尿 +淫女喷精 +淫女媚娘 +淫女小穴 +淫女幼b +淫女性息 +淫女教师 +淫女浪妻 +淫女浪穴 +淫女淫洞 +淫女炮图 +淫女炮圖 +淫女老师 +淫女论坛 +淫女露穴 +淫奸医生 +淫奸处女 +淫奸姐姐 +淫奸护士 +淫奸电影 +淫奸美女 +淫奸表妹 +淫奸表姐 +淫妇口交 +淫妇自慰 +淫妻乱交 +淫妻交换 +淫妻交換 +淫妻浪女 +淫妻电影 +淫妻的穴 +淫妻荡妇 +淫妻阿美 +淫娃淫穴 +淫婦自慰 +淫小妹妹 +淫小电影 +淫师荡母 +淫師蕩母 +淫态毕露 +淫态淫水 +淫性肉棒 +淫情贴图 +淫战群p +淫戰群P +淫才摇篮 +淫欲世家 +淫欲东洋 +淫欲城堡 +淫欲日本 +淫欲江湖 +淫欲肉体 +淫欲飞飞 +淫母乱伦 +淫母记忆 +淫水4溅 +淫水4益 +淫水丝袜 +淫水四溅 +淫水四濺 +淫水四益 +淫水嫩穴 +淫水愛液 +淫水横流 +淫水横溢 +淫水橫流 +淫水橫溢 +淫水涟涟 +淫水漣漣 +淫水爱液 +淫水狂喷 +淫水狂流 +淫水直流 +淫水絲襪 +淫水翻腾 +淫水翻騰 +淫水自乐 +淫洞贴图 +淫液下留 +淫液带出 +淫液横流 +淫液流入 +淫液肉棒 +淫液肉缝 +淫淫电影 +淫爱视频 +淫獸學園 +淫电影网 +淫男乱女 +淫秽下载 +淫秽口交 +淫秽图片 +淫秽视频 +淫穴兽交 +淫穴嫩穴 +淫穴小说 +淫穴影院 +淫穴淫水 +淫穴电影 +淫穴美图 +淫穴肉棒 +淫穴自拍 +淫穴贴吧 +淫穴贴图 +淫穴通道 +淫穴骚水 +淫笑看护 +淫笑肉棒 +淫絲蕩襪 +淫聲浪語 +淫肉誘惑 +淫肉诱惑 +淫色专区 +淫色圣徒 +淫色在线 +淫色基地 +淫色大片 +淫色套图 +淫色导航 +淫色影院 +淫色王朝 +淫色电影 +淫色论坛 +淫色貼圖 +淫色贴图 +淫艳双乳 +淫艳狂喷 +淫荡公主 +淫荡口交 +淫荡套动 +淫荡女生 +淫荡女警 +淫荡家教 +淫荡小说 +淫荡少妇 +淫荡师母 +淫荡护士 +淫荡文学 +淫荡校园 +淫荡校妓 +淫荡母子 +淫荡炮图 +淫荡照片 +淫荡父女 +淫荡痴女 +淫荡视频 +淫荡空姐 +淫荡美女 +淫荡美妇 +淫荡老师 +淫荡肉棒 +淫荡警察 +淫荡贵妇 +淫荡阿姨 +淫蕩貴婦 +淫虫电影 +淫語痴女 +淫語連連 +淫语痴女 +淫语连连 +淫賤少女 +淫贱少女 +淫阴贴图 +淫领时尚 +淫魔暴行 +淫魔都市 +深入到底 +深喉口爆 +深喉射精 +深喉服务 +深愛色色 +深爱色色 +深纯弄潮 +清场内幕 +清晰內射 +清晰内射 +清海师父 +渊盖苏文 +温家宝靠 +温州黄站 +港制假币 +湖边春梦 +湿身诱惑 +滚圆大乳 +滚那吗B +漂流欲室 +潮吹专辑 +潮吹大片 +潮吹女王 +潮吹无码 +潮喷无码 +激凸走光 +激情2夜 +激情3p +激情MM +激情之女 +激情交友 +激情伦理 +激情内射 +激情午夜 +激情图片 +激情套图 +激情女优 +激情妓院 +激情密约 +激情寻欢 +激情导航 +激情小說 +激情小说 +激情少妇 +激情幽会 +激情影视 +激情性爱 +激情打炮 +激情服务 +激情淫片 +激情淫穴 +激情淫窟 +激情淫色 +激情潮喷 +激情潮噴 +激情猛男 +激情电影 +激情电话 +激情的夜 +激情视频 +激情視頻 +激情素人 +激情网站 +激情美穴 +激情聊天 +激情肛交 +激情自拍 +激情色情 +激情艳女 +激情艳照 +激情裸体 +激情裸聊 +激情裸體 +激情论坛 +激情貼圖 +激情贴图 +激情電影 +濕身誘惑 +瀬咲るな +灌满精液 +灌滿精液 +火枪专卖 +火枪出售 +火枪提供 +火枪销售 +火药专卖 +火药供应 +火药制作 +火药批发 +火药配方 +火辣写真 +火辣图片 +火辣圖片 +火辣寫真 +灭亡中国 +灯草和尚 +炒作公司 +炒股国歌 +炒股泪歌 +炮友之家 +炮管笔直 +炸dan +炸yao +炸弹遥控 +炸弹配方 +炸药专卖 +炸药出售 +炸药出售 +炸药制作 +炸药的制 +炸药配方 +点色论坛 +烂游戏靠 +烈女斗夫 +热情s妇 +热情少妇 +热情骚妇 +無套內射 +無套自拍 +無碼h漫 +無碼做愛 +無碼彩圖 +無碼淫女 +無碼淫漫 +無碼炮圖 +無碼無套 +無碼精選 +無碼絲襪 +無碼長片 +無碼電影 +無碼體驗 +熟女上门 +熟女中出 +熟女乱交 +熟女乱伦 +熟女亂倫 +熟女性交 +熟女护士 +熟女炮图 +熟女解压 +熟女護士 +熟女顏射 +熟女颜射 +熟妇人妻 +熟妇骚器 +熟婦人妻 +熟婦騷器 +燕玲論壇 +燕玲论坛 +爆乳人妻 +爆乳写真 +爆乳服务 +爆乳求搓 +爆乳狂搓 +爱e液情 +爱你1晚 +爱城论坛 +爱大jj +爱妻淫穴 +爱巢滴水 +爱梨无码 +爱欲狂潮 +爱液横流 +爱的乱伦 +爱的捆绑 +爱的肉体 +爱的肢解 +爱花沙也 +爽女美图 +爽完就走 +爽死我了 +特区爱奴 +特殊服务 +特甲少女 +特码推介 +特码论坛 +狂乳激揺 +狂人日妓 +狂插不射 +狂插儿媳 +狂插嫩穴 +狂插小穴 +狂插浪穴 +狂插淫洞 +狂插空姐 +狂插肥穴 +狂操小姐 +狂操小穴 +狂操空姐 +狂欲幻影 +狂爱色情 +狗娘养的 +狗娘養的 +狗屁专家 +狗操卖逼 +狗狼养的 +狗狼養的 +狗管专卖 +狗管价格 +狗腿弯刀 +狠狠地肏 +狩猎用弩 +独立台湾 +独自偷欢 +独裁政治 +狼友天堂 +狼友论坛 +狼客娱乐 +猎刀供应 +猎刀转让 +猎枪qq +猎枪出售 +猎枪出货 +猎枪到货 +猎枪子弹 +猎枪批发 +猎枪提供 +猎枪散弹 +猎枪电话 +猎枪直销 +猎枪真枪 +猎枪订购 +猎枪论坛 +猎枪转让 +猎枪销售 +猛干 添 +猛戳阴穴 +猛插表姐 +猛操狂射 +猥琐图片 +玄女心经 +玉体横陈 +玉女心經 +玉女心经 +玉女聊斋 +玉足训练 +王子淫传 +玛雅社区 +玩女大王 +玩女无罪 +玩弄艳尸 +玩穴潮吹 +现代激情 +现在的党 +现金投注 +现金梭哈 +现金棋牌 +珐.輪功 +珐工力学 +瑞丽公司 +璐璐情史 +甜性涩爱 +生奸內射 +生奸内射 +生徒胸触 +生徒胸觸 +生肖中特 +甩卖汽枪 +田凤山。 +田螺艳鬼 +由爱可奈 +甲卡西酮 +电棍专卖 +电狗批发 +电狗订购 +电狗销售 +电脑危情 +电色情棒 +电话资源 +电车之狼 +男上女下 +男人性息 +男同会所 +男女不限 +男女交欢 +男女交歡 +男女公关 +男女蒲典 +男妓女娼 +男娼起义 +男子会所 +男性器具 +男根增长 +男淫宝贝 +男用器具 +男盗女娼 +男跪女后 +番木鳖碱 +疯插港姐 +疯狂求欢 +疯狂裸聊 +病房情事 +痞子治国 +痴女吸精 +痴女护士 +痴女護士 +痴情女人 +痴情女子 +痴汉电车 +痴男发威 +發@@倫 +發@@掄 +發@@綸 +發@@論 +發**倫 +發**掄 +發**綸 +發**論 +發^^倫 +發^^掄 +發^^綸 +發^^論 +發~~侖 +發~~倫 +發~~掄 +發~~淪 +發~~綸 +發~~論 +發~~輪 +發$$倫 +發$$掄 +發$$綸 +發$$論 +白丝美女 +白冰供应 +白嫩妹妹 +白嫩騷婦 +白嫩骚妇 +白日宣淫 +白浆4溅 +白浆四溅 +白液四溅 +白液四濺 +白漿四濺 +白砒批发 +白粉专卖 +白粉买卖 +白粉供应 +白粉出货 +白粉到货 +白粉卖买 +白粉提供 +白粉直销 +白粉订购 +白粉购买 +白粉配方 +白粉销售 +白虎嫩B +白虎小穴 +白虎少妇 +白虎少婦 +白虎阴穴 +白虎陰穴 +白衣行动 +白衣行動 +白领裸聊 +白鸟美玲 +百姓冤沉 +百家博彩 +百撸社区 +皇冠代理 +皇冠投注 +皇家轮盘 +皮箱炸弹 +盗取密码 +盘古乐队 +直刀专卖 +直销k粉 +直销丁腈 +直销丙腈 +直销乙醚 +直销伪钞 +直销假币 +直销假钞 +直销军刀 +直销军刺 +直销冰砖 +直销刺刀 +直销匕首 +直销吗啡 +直销手弩 +直销手铐 +直销枪刺 +直销气枪 +直销汽枪 +直销狗管 +直销猎枪 +直销白粉 +直销缅古 +直销腰刀 +直销臊冰 +直销警号 +直销警帽 +直销警灯 +直销警衔 +直销跳刀 +直销连弩 +直销迷药 +直销雷管 +直销麻果 +直销麻谷 +直销黄冰 +省港流莺 +看棋软件 +看棋软体 +看片神器 +看牌軟體 +看高潮屋 +真人服务 +真人果聊 +真人激情 +真人视频 +真人祼聊 +真人色片 +真人裸聊 +真人轮盘 +真城丽美 +真实偷拍 +真实淫妻 +真实自拍 +真枪专卖 +真枪改装 +真枪销售 +真空失身 +真鎗出售 +真钱下注 +真钱投注 +真钱斗地 +真钱赌博 +真钱轮盘 +睾大阴俊 +矢车菊甙 +矢野沙纪 +知道64 +短信群发 +短刀出售 +石首事件 +砍刀供应 +砍刀出售 +砍刀批发 +砍刀提供 +砒霜供应 +砒霜批发 +砒霜提供 +破处偷拍 +破处视频 +破处自拍 +破柱求奸 +砷酸供应 +砷酸销售 +硅烷炸弹 +硝化甘油 +硝酸甘油 +硬币供应 +硬给你看 +确吉尼玛 +社会黑暗 +视屏激情 +视讯做爱 +视频偷拍 +视频性爱 +视频果聊 +视频祼聊 +视频自拍 +视频裸聊 +神吊大狭 +神的教会 +神韵艺术 +祼聊表演 +禁室培欲 +禁宫风云 +禁忌游戏 +禁忌试玩 +禁房艳奇 +禁断少女 +禁网禁片 +离弃供谠 +私密写真 +私房写真 +秃鹰气枪 +秃鹰汽狗 +秃鹰电话 +秃鹰订购 +称供污圆 +空姐性交 +空姐无码 +空房诱奸 +突厥斯坦 +突然勃起 +窃听器材 +窃听软件 +窝囊中国 +窥淫狂者 +童顏巨乳 +童颜巨乳 +第4色网 +简易炸弹 +简易炸药 +米奇影视 +粉嫩小洞 +粉嫩小穴 +粉嫩淫臀 +粉尘女子 +粉穴嫩逼 +粉紅愛液 +粉红爱液 +粉臀红痕 +粗制吗啡 +粗大持久 +精品军刺 +精品夫妻 +精品炮图 +精子射在 +精液榨取 +精童欲女 +精美女包 +糖糖小穴 +素人援交 +素女心经 +紧缚凌辱 +紧身美臀 +紫阳软禁 +絲襪寫真 +絲襪淫婦 +絲襪足交 +絲襪高跟 +經典炮圖 +緊縛淩辱 +红尘诱惑 +红楼绮梦 +红楼遗秘 +红海葱甙 +红色恐怖 +红色角落 +红鱼政权 +约pao +约p平台 +约个炮嫂 +约袍加q +纪念64 +纪念六四 +纪念文革 +纯冰销售 +纯属挑逗 +纯属爱爱 +纯缅麻古 +纵情兵团 +纵情欲海 +纵欲淫乱 +纵欲过度 +纵欲返古 +线上投注 +练功群众 +组装手枪 +经典炮图 +给你吃精 +给我豹豹 +绝对女神 +绝色淫妃 +绝艳规条 +绞尽乳汁 +统独论坛 +续金瓶梅 +维族灭绝 +绿色伟哥 +缅古专卖 +缅古供应 +缅古批发 +缅古销售 +缩紧后庭 +罂粟出售 +罐装性奴 +网上博彩 +网上情色 +网上梭哈 +网上赌钱 +网操熟女 +网络封锁 +网络炒作 +网购汽枪 +美乳人妻 +美乳斗艳 +美乳淫屄 +美乳美穴 +美乳艳娘 +美乳艷娘 +美乳鬥豔 +美国之音 +美国处女 +美國之音 +美女av +美女上门 +美女中出 +美女人体 +美女做爱 +美女兼职 +美女兽交 +美女兽欲 +美女写真 +美女出台 +美女同居 +美女后宫 +美女吞精 +美女外约 +美女外送 +美女嫩穴 +美女性交 +美女成人 +美女按摩 +美女插穴 +美女操逼 +美女服务 +美女洗刷 +美女淫图 +美女淫穴 +美女潮吹 +美女激情 +美女电影 +美女真人 +美女视频 +美女祼聊 +美女肉体 +美女色图 +美女色情 +美女艺术 +美女裸体 +美女裸图 +美女裸舞 +美女诱惑 +美女贴吧 +美女走光 +美女足交 +美女露鲍 +美女骑士 +美女高潮 +美女鲍鱼 +美妙人妇 +美尻中出 +美尻套图 +美幼专区 +美眉兼职 +美眉服务 +美神ルナ +美腿丝足 +美臀夹阴 +美臀嫰穴 +美艳人妻 +美艳少妇 +羔羊医生 +群交乱舞 +群交亂舞 +群交图片 +群交暴力 +群交派对 +群交视频 +群体性事 +群发软件 +群奸乱交 +群奸亂交 +群奸輪射 +群奸轮射 +群魔色舞 +羽田未来 +翘臀嫩穴 +翘臀嫩逼 +翹臀嫩穴 +翹臀嫩逼 +翻墙工具 +翻墙访问 +翻墙软件 +老女嫩B +老少乱伦 +老少亂倫 +老师小穴 +老汉推车 +考前答案 +考后付款 +耻悦人妻 +耻辱轮奸 +聊斋惊艳 +聊斋艳蛇 +聊斋艳谭 +聊齋艷譚 +职业情人 +联系vx +聖泉學淫 +肉丝裤袜 +肉乳特刊 +肉体接触 +肉感炮友 +肉棒8寸 +肉棒好粗 +肉棒嫩逼 +肉棒插入 +肉棒插穴 +肉棒深插 +肉棒高潮 +肉欲乐园 +肉欲恒生 +肉缝嫩嫩 +肉香色欲 +肏妹妹屄 +肏姐姐屄 +肛交a片 +肛交专区 +肛交中出 +肛交体位 +肛交动漫 +肛交口交 +肛交图片 +肛交无码 +肛交服务 +肛交电影 +肛交视屏 +肛交视频 +肛交美图 +肛栓母狗 +肛門噴水 +肛門拳交 +肛门喷水 +肛门拳交 +肛门是邻 +肝源供求 +肝源肾源 +肝脏中介 +股股下流 +肥穴姐姐 +肥穴自拍 +肮脏美学 +育部女官 +肾源中介 +肾源价格 +肾源供应 +肾源出售 +胡总书记 +胡江争斗 +胡江内斗 +胡派人马 +胡锦涛靠 +胯下凶器 +胯下呻吟 +胯下失守 +胯下微凉 +胯下舔蛋 +胴体迷情 +胸大有罪 +胸涛乳浪 +胸濤乳浪 +脱亚入世 +脱氧麻黄 +脱衣女郎 +脱衣少女 +脱衣少妇 +脱衣舞女 +脱衣舞娘 +脱衣舞男 +脱衣表演 +脱衣裸聊 +腋毛美女 +腐败中国 +腰刀专卖 +腰刀买卖 +腰刀供应 +腰刀出售 +腰刀批发 +腰刀转让 +腰刀销售 +腰细胸大 +膣内射精 +自fen +自sha +自制地雷 +自制左轮 +自制弩弓 +自制弩机 +自制手弩 +自制手枪 +自制汽枪 +自制炸弹 +自制炸药 +自制雷管 +自动群发 +自慰技法 +自慰抠穴 +自慰摳穴 +自慰直播 +自慰视频 +自慰高潮 +自拍人妻 +自拍做爱 +自拍内射 +自拍口交 +自拍干炮 +自拍性爱 +自拍换妻 +自拍插穴 +自拍淫照 +自拍炮图 +自拍美穴 +自拍论坛 +自插小穴 +自摸寂寞 +自杀手册 +自杀指南 +自由亚州 +自由亚洲 +自由亞州 +自由亞洲 +自由时报 +自由西藏 +至淫绝地 +臺灣島國 +臺灣建國 +臺灣民国 +臺灣民國 +臺灣獨立 +臺灣總統 +舔到你射 +舔她小穴 +航星洗涤 +色97愛 +色97爱 +色中狂狼 +色吧亚洲 +色吧社区 +色哥导航 +色图下载 +色图专区 +色图黄片 +色域h网 +色女陪聊 +色女露点 +色屋图片 +色情3级 +色情a片 +色情久久 +色情乱伦 +色情信息 +色情动漫 +色情图库 +色情图片 +色情大片 +色情导航 +色情小说 +色情工厂 +色情工廠 +色情影片 +色情文学 +色情无码 +色情服务 +色情武侠 +色情淫图 +色情游戏 +色情漫画 +色情电影 +色情男女 +色情短片 +色情视频 +色情網站 +色情网站 +色情自白 +色情表演 +色情裸聊 +色情論壇 +色情论坛 +色情魔攻 +色播成人 +色播资源 +色文小说 +色欲天使 +色欲惊魂 +色欲档案 +色欲狂魔 +色欲王朝 +色欲追魂 +色淫成人 +色淫电影 +色片下载 +色狗成人 +色狗电影 +色狼基地 +色狼小說 +色狼小说 +色狼电影 +色狼論壇 +色狼论坛 +色猫影院 +色男淫女 +色界论坛 +色窝窝网 +色站大全 +色站导航 +色站网址 +色网地址 +色网导航 +色网联盟 +色聊服务 +色色基地 +色色婷婷 +色色影视 +色色快播 +色色成人 +色色炮图 +色色社区 +色色综合 +色色网站 +色色论坛 +色虫影院 +色解脱脱 +色酷全书 +色鬼投胎 +色魔杀手 +艳体缠绵 +艳妃偷夫 +艳妇淫女 +艳情之事 +艳情小说 +艳星诱惑 +艳母淫臀 +艳照下载 +艳舞女郎 +艳舞淫业 +艳舞爽情 +艳降勾魂 +艷情小說 +艷舞淫業 +艾司唑仑 +芦名未帆 +花城雏妓 +花心天子 +花样性交 +苏东解体 +苏家屯集 +苝亰兼职 +苞夜咑炮 +苯丙胺类 +苯基甲酮 +苯基硫醇 +苹果日报 +茎侯佳阴 +茎候佳阴 +草你大爷 +草你妈靠 +草你祖宗 +草榴地址 +草榴影院 +草榴社区 +草的你妈 +草的你媽 +草莓牛奶 +草逼人生 +荒淫无度 +荒野浪妻 +荡妇口交 +荡妇贞魂 +荡母淫儿 +莖候佳陰 +莞式服务 +莫达非尼 +落聊玩吗 +董存瑞说 +董存瑞问 +蒙古回归 +蒙古独立 +蒙古獨立 +蒙古鞑子 +蒙汗药粉 +蒹只招聘 +蒹直招聘 +蓝色情迷 +蔷薇妖娆 +蕾丝寻t +薄谷开来 +藏刀销售 +藏娇寡妇 +蘋果日報 +虎骑成人 +虐恋花园 +處女開包 +虾碌情圣 +蛤蟆转世 +蜜穴贴图 +蝴蝶甩刀 +螺女挑情 +血洗京城 +血腥清场 +血色京机 +血色京畿 +街头扒衣 +街拍美臀 +衣x果聊 +袒胸露乳 +被指抄袭 +袭胸女士 +裆的干部 +裙下风光 +裙内偷拍 +裸体做爱 +裸体写真 +裸体少妇 +裸体淫女 +裸体激情 +裸体视频 +裸体群聊 +裸体聊天 +裸体裸聊 +裸体陪聊 +裸女震撼 +裸照图片 +裸聊专区 +裸聊交友 +裸聊入口 +裸聊合法 +裸聊妹妹 +裸聊宝贝 +裸聊平台 +裸聊快播 +裸聊激情 +裸聊爆射 +裸聊视频 +裸聊网址 +裸聊网站 +裸聊美女 +裸聊聊天 +裸聊表演 +裸聊论坛 +裸聊酒吧 +裸足脚交 +裸露自拍 +裸體少婦 +西厢艳谭 +西山会议 +西方美女 +西洋美女 +西苑风月 +西藏事件 +西藏分裂 +西藏天葬 +西藏独立 +西藏獨立 +要射精了 +见缝插屌 +观阴大师 +观音法门 +解体中共 +解决台湾 +解密软件 +解开内衣 +解放tw +解锁姿势 +言论自由 +記念64 +記念六四 +誘惑視頻 +調教虐待 +警匪1家 +警匪一家 +警察殴打 +警方包庇 +警服销售 +警枪出售 +警棍买卖 +警棍销售 +警用手枪 +護士誘惑 +计生风暴 +订购k粉 +订购军刺 +订购大麻 +订购气枪 +订购电狗 +订购腰刀 +订购迷药 +订购雷管 +订购麻古 +订购麻果 +让你性动 +记号扑克 +记念64 +记念六四 +讲法传功 +访问找我 +证件办理 +证到付款 +证生成器 +语过舔情 +诱惑1夜 +诱惑套图 +诱惑爽图 +诱惑视频 +诱惑骚妹 +诱色uu +调教人妻 +调教性奴 +调教爱奴 +调教虐待 +谭作人案 +豔婦淫女 +豪乳荡妇 +賓館女郎 +賣党求榮 +賽你老母 +賽妳阿母 +财政是爹 +财色兼偷 +贪官也辛 +贪污腐败 +贪腐财富 +贪色夫人 +购买假币 +购买唐刀 +购买枪支 +购买汽枪 +购买真枪 +购肾电话 +购蒙汗药 +贱货吴敏 +贴身欲女 +贼jb大 +赌博专用 +赌博投注 +赌球平台 +赛你老母 +赛妳阿母 +赤色战士 +赤裸天使 +赤裸激情 +赤裸狂奔 +赤裸羔羊 +赤裸迷情 +赤足惊魂 +赫鲁晓夫 +走光偷拍 +超常科学 +超毛大鮑 +超毛大鲍 +超火司机 +超爽乱伦 +超爽艳图 +超級乐者 +超級樂者 +超級舞者 +超级乐者 +超级仙医 +超级公子 +超级农民 +超级大屌 +超级女警 +超级学生 +超级官迷 +超级异能 +超级教师 +超级樂者 +超级淫图 +超级禽兽 +超级舞男 +超级舞者 +超英赶美 +超虐高h +超越红墙 +越做越爱 +越骚越爱 +足交图片 +足球下注 +足球投注 +跨下呻吟 +跨下放荡 +跳刀专卖 +跳刀出售 +跳刀批发 +跳刀提供 +跳刀直销 +跳刀转让 +跳刀销售 +身寸米青 +輪奸內射 +輪流執政 +车仑大法 +车仑女干 +车仑工力 +车模包夜 +转让军刀 +转让军刺 +转让匕首 +转让手弩 +转让汽枪 +转让狗管 +转让猎刀 +转让猎枪 +转让跳刀 +轮奸内射 +轮暴致死 +轮流执政 +软弱外交 +软弱的国 +轻微sm +辣妹包夜 +辣手激情 +辱我中华 +边做边爱 +辽阳工潮 +达赖喇嘛 +近亲相奸 +近親相奸 +近親相姦 +进京抓女 +进口军枪 +进口气枪 +进攻台湾 +远程偷拍 +连弩出售 +连弩批发 +连弩直销 +连続失禁 +迪里夏提 +迷奸照片 +迷奸视频 +迷奸系列 +迷奸药丸 +迷奸药水 +迷幻蘑菇 +迷情东莞 +迷欲侠女 +迷色陷阱 +迷药供应 +迷药批发 +迷药电话 +追查国际 +追查國際 +逃亡艳旅 +逅庭诱惑 +逆行射精 +透视眼镜 +透视软件 +递进民主 +通用娼妇 +通用娼婦 +逢8必灾 +逢9必乱 +逢九必乱 +逢八必灾 +逢床作戏 +連続失禁 +週六性吧 +逼你老母 +逼爽导航 +逼逼痒痒 +達賴喇嘛 +遗嘱小平 +那吗瘟比 +那吗老比 +那嗎瘟比 +那嗎老比 +那娘瘟比 +那娘老比 +那娘錯比 +邪恶漫画 +邪恶的党 +郎当男妓 +郎心如铁 +都市乱伦 +都市春潮 +都市迷情 +都当小姐 +都进中央 +酒后乱性 +酒店援交 +酥胸誘惑 +酥胸诱惑 +酸羟亚胺 +醉卧红尘 +重庆楼凤 +重铬酸钠 +野外性交 +野战砍刀 +金弓国狗 +金枪不倒 +金槍不倒 +金泽文子 +金瓶双艳 +金瓶梅1 +金瓶梅2 +金瓶梅3 +金瓶梅4 +金瓶梅5 +金瓶艳史 +金逼镶钻 +針孔偷拍 +鋘售假币 +针孔偷拍 +针孔摄像 +针孔摄象 +针扎事件 +钢弩改装 +钢珠弓弩 +钢珠手枪 +钻石冰糖 +铅弹销售 +铊盐供应 +铊盐出售 +铊盐批发 +铭记印尼 +销售g水 +销售k粉 +销售丁腈 +销售丙腈 +销售假币 +销售假证 +销售假钞 +销售冰古 +销售冰毒 +销售冰砖 +销售匕首 +销售台秃 +销售大麻 +销售子弹 +销售弓弩 +销售弹药 +销售手枪 +销售木仓 +销售枪支 +销售步枪 +销售气枪 +销售汽枪 +销售炸药 +销售猎弩 +销售猎枪 +销售电狗 +销售短狗 +销售砒霜 +销售砷酸 +销售秃鹰 +销售缅古 +销售跳刀 +销售迷药 +销售铅弹 +销售铊盐 +销售雷管 +销售麻古 +销售麻果 +销魂1晚 +错那吗B +错那吗比 +错那吗逼 +镇压学生 +长枪出售 +阳江仿刀 +阴你而湿 +阴唇阴道 +阴小撕大 +阴小湿大 +阴户抽插 +阴茎助勃 +阴茎增大 +阴茎增长 +阴蒂治夷 +阴道图片 +阴道好紧 +阴道深处 +阴部特写 +阴阜高耸 +阿川阳志 +阿扁万岁 +阿扁萬歲 +阿普唑仑 +阿波罗网 +陆肆运动 +陈方安生 +陪聊裸体 +陰道圖片 +陰部特寫 +陰阜高聳 +陸肆真相 +随便玩我 +随性缠绵 +集体性爱 +集体自杀 +集體性愛 +雇佣杀手 +雙峰微顫 +雞巴暴脹 +雨宫真贵 +雪山狮子 +雪腿玉胯 +零八宪章 +雷人女官 +雷人提案 +雷管qq +雷管专卖 +雷管供应 +雷管出售 +雷管制造 +雷管销售 +震死他们 +震源药柱 +青天白日 +青空小夏 +靓女主播 +靓穴美女 +非常男妓 +韩国a片 +韩国援交 +韶关事件 +顏射自拍 +颜射口爆 +颜射少妇 +颜射自拍 +風騷欲女 +風騷淫蕩 +风流情妇 +风流艳事 +风骚侍女 +风骚少妇 +风骚护士 +风骚欲女 +风骚淫荡 +风骚艳妇 +飞凤春宵 +饥渴少妇 +饥饿难耐 +香料精灵 +香港总彩 +香港明报 +香港民主 +香港沦陷 +香港淫穴 +香港独立 +香港马会 +香烟迷药 +香艳文学 +香艳色艺 +駛你老母 +騷B熟女 +騷女叫春 +騷婦掰B +騷婦露逼 +騷小浪女 +騷浪人妻 +騷浪美女 +马勒戈壁 +马德卖官 +马拉戈壁 +马钱子碱 +驶你老母 +骆冰淫传 +骚B熟女 +骚冰供应 +骚女qq +骚女叫春 +骚女裸聊 +骚妇掰B +骚妇激情 +骚妇露逼 +骚妹爽图 +骚妹自拍 +骚妹裸聊 +骚妹阴道 +骚姐乱伦 +骚小浪女 +骚屄贴图 +骚浪人妻 +骚浪美女 +骚穴怒放 +骚穴淫液 +骚穴贴图 +骚逼喷水 +骚逼小姨 +骯髒美學 +高丽棒子 +高价售肾 +高价求肾 +高价肾源 +高仿人皮 +高仿纸币 +高官互调 +高官子女 +高干子女 +高息贷款 +高梨风花 +高氯酸铵 +高清a片 +高清h片 +高清性愛 +高清性爱 +高清无码 +高清炮图 +高潮喷精 +高潮白浆 +高潮白漿 +高潮集錦 +高潮集锦 +高麗棒子 +鬼畜輪奸 +鬼畜轮奸 +魅惑巨乳 +魏东死亡 +魔刀丽影 +鲇川千里 +鲘庭诱惑 +鲜嫩蜜穴 +鸟枪专卖 +鸡吧插进 +鸡奸系列 +鸡婆服务 +鸡巴小穴 +鸡巴暴胀 +鸡巴淫穴 +鸡巴猛插 +鸡巴阴核 +鸡店服务 +鸡情果聊 +鸭之1族 +鸿利国际 +鹿城娱乐 +鹿城黄站 +麥司卡林 +麦司卡林 +麻古专卖 +麻古买卖 +麻古供应 +麻古出售 +麻古出货 +麻古到货 +麻古合成 +麻古批发 +麻古提供 +麻古果子 +麻古电话 +麻古订购 +麻古配方 +麻古销售 +麻果0售 +麻果出售 +麻果批发 +麻果货源 +麻果配方 +麻生香月 +麻谷qq +麻谷专卖 +麻谷出货 +麻谷到货 +麻谷批发 +麻谷提供 +麻谷订购 +麻谷配方 +麻谷销售 +麻醉乙醚 +麻醉钢枪 +黃色圖片 +黃色小說 +黃色影視 +黃色文學 +黃色漫畫 +黃色網站 +黃色電影 +黃金聖水 +黄s网站 +黄冰出售 +黄海事件 +黄片下载 +黄片种子 +黄片网站 +黄网图片 +黄网导航 +黄色a片 +黄色图片 +黄色大片 +黄色小说 +黄色影视 +黄色文学 +黄色漫画 +黄色照片 +黄色电影 +黄色网站 +黄菊遗孀 +黄金圣水 +黑丝内射 +黑丝无码 +黑丝熟女 +黑人大屌 +黑彩代理 +黑星女侠 +黑火药的 +黑狱圣女 +黑窑奴役 +黑道女友 +齐天大性 +龙与女仆 +龟头插进 +使劲抽插 +用力抽插 +18岁少女 +18岁淫乱 +18成人网 +18歲少女 +18歲淫亂 +18禁a片 +18禁游戏 +18进成人 +1989年 +1u夜g情 +1个色男人 +1元嫖鸡费 +1夜7次郎 +1夜9次郎 +1夜十次狼 +1夜情上门 +1夜情交友 +1夜情信息 +1夜情同城 +1夜情性息 +1夜情服务 +1夜情猎场 +1夜情聊天 +1夜情论坛 +1夜的激情 +1对1裸聊 +1月夜留精 +1本道av +1本道bt +1本道影院 +1本道成人 +1本道电影 +1本道视频 +1炮到天明 +1炮泯恩仇 +1炮解千愁 +1生酒色网 +1秒射更多 +1裤裆杀气 +1起干骚妹 +1起看a片 +2乙酰吗啡 +2奶的贡献 +2手弩买卖 +2手弩出售 +2手弩转让 +2硝基甲苯 +2穴性玩具 +2类ghb +2逼 老逼 +301事件 +314事件 +33博彩网 +365情色 +38集团军 +3d玉蒲团 +3u娱乐城 +3健弓弩网 +3去车仑功 +3唑仑qq +3唑仑专卖 +3唑仑出货 +3唑仑到货 +3唑仑合成 +3唑仑商城 +3唑仑批发 +3唑仑提供 +3唑仑订购 +3唑仑配方 +3唑仑销售 +3唑纶出售 +3夫妻下载 +3夫妻开房 +3棱军刀网 +3棱刀供应 +3棱刀批发 +3棱刀订购 +3棱刀转让 +3棱刀销售 +3班仆人派 +3硝基甲苯 +3级小电影 +3级激情片 +3级片地址 +3级片种子 +3级片网址 +3级片韩国 +425事件 +426社论 +4事件89 +4号维园见 +54式图纸 +54枪专卖 +54枪销售 +55日妹妹 +56式刺刀 +56式枪刺 +58包养网 +5月35日 +5月3十5 +5月三十五 +5连发汽枪 +6.4事件 +6.4纪念 +6.4运动 +6。4事件 +628事件 +64参加者 +64回忆录 +64大屠杀 +64式销售 +64文化祭 +64杀学生 +64死难者 +64穿黑衣 +64资料馆 +69式房山 +6合彩下注 +6合彩代理 +6合彩公司 +6合彩内参 +6合彩特码 +6合彩网址 +6合彩网站 +6合彩论坛 +6月4纪念 +6氢大麻酚 +777黄站 +77式转让 +7孔狗腿刀 +7月军刀网 +7色成人网 +89年学生 +8平方事件 +92式销售 +92枪专卖 +93夜之女 +95博彩通 +97激情网 +9jiu评 +9ping +9评共产党 +av亚洲妹 +av伦理片 +av小电影 +av快播网 +av成人网 +av播放器 +av狼社区 +av直播网 +a片在线看 +A片大放送 +a片播放器 +a片群英汇 +a片连连看 +bb弹出售 +bb弹批发 +bb弹销售 +bb枪专卖 +Biao子 +boxun +BT色工厂 +cao你妈 +d80军刺 +DIY核弹 +e乐博官网 +e夜情交友 +e夜情电话 +e夜情论坛 +f a 輪 +falun +flg妈批 +flg旗帜 +fuck靠 +fuck骚 +ghb专卖 +GHB原液 +ghb提供 +ghb销售 +gong党 +high粉 +high药 +h动漫下载 +h动漫图片 +h动漫快播 +h漫画下载 +jian你 +jian职 +jj大而弯 +king粉 +ktv小姐 +k他命5号 +k粉冰出售 +MM的小穴 +mo你全身 +mo你鸡巴 +ok1夜情 +ok娱乐城 +one页情 +ons性息 +pcb抄板 +pcp出售 +pcp配件 +qq3唑仑 +qq军刀网 +qq办驾照 +qq卖猎枪 +qq售冰毒 +qq摇头丸 +qq有冰毒 +qq海乐神 +qq秃鹰枪 +qq裸聊女 +qq酣乐欣 +q激情裸聊 +sex裸聊 +sm爱好者 +taidu +tnt出售 +tnt制作 +tnt配方 +vpn代理 +vpn翻墙 +xiao平 +X到喷屎尿 +X到噴屎尿 +x卧底下载 +x卧底官网 +ㄙㄞ你老母 +一夜九次郎 +一通健康法 +丁字裤翘臀 +丁字裤诱惑 +丁字褲翹臀 +丁香成人网 +七孔狗腿刀 +万法归一功 +三去车仑功 +三极试看片 +三班仆人派 +三硝基甲苯 +三级,影片 +三级,电影 +三级小电影 +上原保奈美 +上原舞种子 +上床不说爱 +上海气枪网 +上海龙凤网 +上门性交网 +上门性服务 +上门找小姐 +上门援交女 +上门援交妹 +下半身爱你 +下载淫电影 +下面有点痒 +下面给你吃 +不文女学堂 +专业制假证 +专业办假证 +专业弓弩网 +专业找逼操 +专供摇头丸 +专供赵氏弩 +专做假证件 +专办假证件 +专卖ghb +专卖丛林刀 +专卖假币q +专卖假文凭 +专卖兰博刀 +专卖军用弩 +专卖冰牙签 +专卖古可叶 +专卖古柯叶 +专卖可卡因 +专卖可待因 +专卖喵喵药 +专卖安纳咖 +专卖山奈钾 +专卖开山刀 +专卖弹簧刀 +专卖打鸟枪 +专卖摇头丸 +专卖散弹枪 +专卖枪械网 +专卖气动枪 +专卖氯胺酮 +专卖沙菲片 +专卖海乐神 +专卖海洛因 +专卖狙击枪 +专卖狩猎刀 +专卖狩猎弩 +专卖电警棍 +专卖美沙酮 +专卖苍蝇水 +专卖蜘蛛刀 +专卖赌博粉 +专卖赵氏弩 +专卖迷幻水 +专卖迷幻药 +专卖酣乐欣 +专卖野战刀 +专卖野营刀 +专卖钢珠狗 +专卖防暴枪 +专卖阳江刀 +专卖麦角酸 +专卖麻黄碱 +专售迷晕药 +世博娱乐城 +世峰爱bt +丙烯醛供应 +丙烯醛批发 +丙烯醛直销 +丙烯醛销售 +丛林刀专卖 +丛林刀供应 +丛林刀出售 +丛林刀提供 +丛林刀直销 +丛林刀转让 +丛林刀销售 +丛林开山刀 +东京热图库 +东京热影视 +东京热成人 +东京热无码 +东北xx网 +东森新闻网 +东突厥斯坦 +丝袜女qq +丝袜的诱惑 +丝袜聊天室 +两腿之间问 +两面都有胶 +中gong +中共的罪恶 +中共的血旗 +中共邪毒素 +中华会娱乐 +中华弓弩网 +中南海内幕 +中南海内斗 +中南海秘闻 +中南海黑幕 +中国人民党 +中国共产党 +中国共和党 +中国军刀网 +中国复兴党 +中国威胁论 +中国弓弩网 +中国弓驽网 +中国性爱城 +中国新民党 +中国民主党 +中国气枪网 +中国的人权 +中国的陷阱 +中国至宪党 +中国被瓜分 +中國共產黨 +中國性愛城 +中文搜性网 +中正纪念歌 +丹鼎艳修录 +为了性和钱 +为党不为国 +为淫民服务 +主席李世民 +久久情色网 +乌头碱供应 +乌头碱提供 +乌头碱直销 +乌头碱销售 +乐博娱乐城 +乖乖水买卖 +乖乖水直销 +乖乖水配方 +乖乖药供应 +乖乖药出售 +乖乖药批发 +乖乖药订购 +乖乖药购买 +乖乖药销售 +乙烯砜供应 +乙烯砜批发 +乙烯砜提供 +乙烯砜直销 +乙烯砜销售 +乙硼烷供应 +乙硼烷批发 +乙硼烷直销 +乙硼烷销售 +乙酸铊供应 +乙酸铊直销 +九ping +九十三运动 +九評共產黨 +九评共产党 +买54手枪 +买假币qq +买假币假钞 +买假身份证 +买假钱qq +买冰毒qq +买卖2手弩 +买卖3唑仑 +买卖乖乖水 +买卖仿真枪 +买卖可待因 +买卖大冰砖 +买卖大黑鹰 +买卖失忆水 +买卖小冰砖 +买卖开山刀 +买卖弹簧刀 +买卖枪qq +买卖氯胺酮 +买卖狙击弩 +买卖白牙签 +买卖秦氏弩 +买卖苍蝇粉 +买卖赵氏弩 +买卖迷幻水 +买卖迷幻药 +买卖酣乐欣 +买卖野战刀 +买卖钢珠枪 +买卖钻石冰 +买卖麻醉枪 +买卖黄牙签 +买考前答案 +买肾卖肾网 +买肾源qq +买麻果k粉 +乱交在线看 +乱伦之淫穴 +乱伦小荡妇 +乱伦熟女网 +乱情马窝村 +乱论处女网 +亂倫熟女網 +二十四事件 +二奶大奖赛 +云南情蛊药 +亚太正悟网 +亚洲3p图 +亚洲3级片 +亚洲se图 +亚洲太阳城 +亚洲情色区 +亚洲情色网 +亚洲成人片 +亚洲成人网 +亚洲插穴图 +亚洲无码区 +亚洲无码片 +亚洲淫影院 +亚洲淫色图 +亚洲淫色网 +亚洲激情片 +亚洲激情网 +亚洲电影区 +亚洲美女总 +亚洲色图网 +亚洲色妹妹 +亚洲色情片 +亚洲色电影 +亚洲贴图区 +亚硝酰乙氧 +亞洲情色網 +交友裸聊q +交换姐妹花 +人与兽性交 +人体艺术网 +人兽交图片 +人兽交短片 +人兽群交网 +人士谢长发 +人头豆腐汤 +人妻4部曲 +人妻俱乐部 +人妻兽虐曲 +人妻激情片 +人妻送友骑 +人宇特能功 +人帅j8大 +人民在流泪 +人民币恶搞 +人民币梭哈 +人皮高跟鞋 +人肉叉烧包 +亿博娱乐城 +从后面被干 +仓井空电影 +仓持茜bt +仓持茜无码 +仓木杏种子 +仓老师种子 +他妈是国税 +代办会计证 +代办假文凭 +代办假证书 +代办军官证 +代办证qq +代办身份证 +代办驾驶证 +代办高仿证 +代开加油票 +代开房产税 +代理假证书 +仿品军刺网 +仿真人民币 +仿真手拉鸡 +仿真来复枪 +仿真枪QQ +仿真枪专卖 +仿真枪买卖 +仿真枪供应 +仿真枪出售 +仿真枪到货 +仿真枪售卖 +仿真枪提供 +仿真枪改装 +仿真枪械网 +仿真枪模型 +仿真枪订购 +仿真枪销售 +仿真狗出售 +伊人情色网 +伊斯兰运动 +会计证代办 +伟哥也疯狂 +伯莱塔销售 +伽我徽聊吧 +何 德 普 +佛展千手法 +佛怀煽仇录 +作ོ嗳ོv +作者萨达姆 +你的2我懂 +你的肉棒干 +你的逼真紧 +使劲插我啊 +供应2手弩 +供应3唑仑 +供应3棱刀 +供应54枪 +供应77式 +供应92式 +供应bb弹 +供应bb枪 +供应丛林刀 +供应乌头碱 +供应乖乖粉 +供应乖乖药 +供应仿真枪 +供应伞兵刀 +供应保米磷 +供应假文凭 +供应假言正 +供应假证件 +供应假车牌 +供应催情水 +供应催情粉 +供应催情药 +供应兰博刀 +供应军人证 +供应军官证 +供应军用刀 +供应军警服 +供应冰牙签 +供应化学冰 +供应博伊刀 +供应可卡因 +供应听话药 +供应士兵证 +供应大冰砖 +供应大黑鹰 +供应失忆水 +供应小冰砖 +供应山奈钾 +供应工作证 +供应开山刀 +供应异丁腈 +供应弹簧刀 +供应强暴药 +供应战术刀 +供应户口本 +供应手拉鸡 +供应手木仓 +供应摇头丸 +供应摇头糖 +供应敌敌畏 +供应散弹枪 +供应散弹狗 +供应斩马刀 +供应杜冷丁 +供应毒杀芬 +供应毒菌锡 +供应毒鼠强 +供应气动狗 +供应气木仓 +供应气枪弹 +供应气步枪 +供应气短狗 +供应氯胺酮 +供应氰化钙 +供应氰化镉 +供应汽步枪 +供应汽长狗 +供应沙菲片 +供应法尼林 +供应海乐神 +供应海洛因 +供应狩猎弩 +供应猎木仓 +供应电雷管 +供应白牙签 +供应砷化氢 +供应砷酸汞 +供应硝酸汞 +供应硝酸铊 +供应秃鹰枪 +供应红矾钠 +供应红降汞 +供应罂粟壳 +供应美沙酮 +供应花青甙 +供应藜芦碱 +供应蝇毒磷 +供应蝴蝶刀 +供应行驶证 +供应警官服 +供应记者证 +供应赌博药 +供应赭曲毒 +供应赵氏弩 +供应迷幻水 +供应迷幻药 +供应迷情水 +供应迷情粉 +供应迷情药 +供应迷昏药 +供应迷晕药 +供应迷魂粉 +供应酣乐欣 +供应醋酸汞 +供应野战刀 +供应钢珠枪 +供应钻石冰 +供应锇酸酐 +供应长治筋 +供应高仿证 +供应高压狗 +供应麦角酸 +供应麦角醇 +供应麻醉枪 +供应麻醉箭 +供应麻黄碱 +供应麻黄素 +供应黄牙签 +供应黑火药 +供应黑索金 +侳嗳こ享受 +俄罗斯轮盘 +保健女上门 +信号拦截器 +信用卡套现 +信用卡提现 +俺去也av +倩女云雨情 +假发票出售 +假币假钞q +假币免定金 +假文凭供应 +假文凭制作 +假文凭办理 +假文凭批发 +假文凭提供 +假硬币qq +假硬币买卖 +假硬币供应 +假硬币批发 +假硬币直销 +假硬币销售 +假结婚证q +假证书出售 +假证件供应 +假证件出售 +假证办理网 +假钞卖qq +假钞换真钱 +假钞销售网 +假阳具插穴 +假陽具插穴 +做会计师证 +做假军官证 +做假户口本 +做假结婚证 +做假身份证 +做军车套牌 +做国外文凭 +做学历证书 +做愛寫真集 +做我的情人 +做毕业文凭 +做爱69式 +做爱全过程 +做爱写真集 +做爱小电影 +做爱美女图 +做爱聊天室 +做资质证书 +做车辆牌照 +偷啪,dv +偷情 乱伦 +偷情保护令 +偷拍1自拍 +偷拍打野战 +偷试隔墙花 +偷食女学生 +催情口香糖 +催情水出售 +催情水销售 +催情液专卖 +催情液买卖 +催情液供应 +催情液批发 +催情液直销 +催情液订购 +催情液购买 +催情液销售 +催情粉专卖 +催情粉出售 +催情药专卖 +催情药供应 +催泪喷射器 +催眠水订购 +催眠迷幻药 +傻B江核心 +免費偷窺網 +免賛淫电影 +免费偷窥网 +免费处女聊 +免费小淫虫 +免费淫水流 +免费淫电影 +免费激情网 +免费爽电影 +免费看a片 +免费试看片 +党内言事潮 +党在玩社会 +党就是咱妈 +党政1把手 +党是反宇宙 +党的喉舌死 +全家死光光 +全范围教会 +全裸视频秀 +全裸聊天室 +全裸野鸳鸯 +公审江泽民 +公審江澤民 +六。四事件 +六4穿黑衣 +六四25年 +六四参加者 +六四參加者 +六四周年祭 +六四回忆录 +六四回憶錄 +六四文化祭 +六四死难者 +六四死難者 +六四资料馆 +六氢大麻酚 +兰博刀专卖 +共1产1党 +共一产一党 +共产党专制 +共产党烂逼 +共产党腐败 +共和国之怒 +共和国卫士 +关注公众号 +兴妇av吧 +养1窝专家 +兼职女上门 +兼职女援交 +兼职女教师 +兼职妹上门 +兽交另类网 +兽性新人类 +内地援交妹 +内射超熟妇 +内服迷魂药 +冊那娘餓比 +册那娘饿比 +再用力插啊 +再试初夜情 +最大最色情 +最新1本道 +最新se站 +最新人妻斩 +最新版假币 +最淫熟女网 +军刀专卖网 +军刀批发网 +军刀直销网 +军刺军品网 +军刺批发网 +军品军刀网 +军品军刺网 +军官证出售 +军官证办理 +军官证样本 +军用丛林刀 +军用小口径 +军用弩qq +军用弩专卖 +军用弩出售 +军用弩批发 +军用弩转让 +军用枪支买 +军用枪支卖 +军用枪支售 +军用潜水刀 +军用阻击弩 +军警服直销 +军警服销售 +冠军娱乐城 +冰du出售 +冰K粉出售 +冰毒出售q +冰毒的价格 +冰牙签qq +冰牙签专卖 +冰牙签供应 +冰牙签提供 +冰麻古出售 +冰麻古销售 +冲那翼无码 +冴木椋无码 +冷兵器专卖 +凌辱大奶妹 +凯子钓裸女 +出售2手弩 +出售38枪 +出售3唑仑 +出售3唑伦 +出售3棱刀 +出售77式 +出售bb弹 +出售bb枪 +出售qi枪 +出售x卧底 +出售三棱刀 +出售丛林刀 +出售仿真枪 +出售作弊器 +出售信用卡 +出售假bi +出售假护照 +出售假文凭 +出售假硬币 +出售假证书 +出售假钞票 +出售催情水 +出售兰博刀 +出售军官证 +出售军用弩 +出售军用枪 +出售冰du +出售冰牙签 +出售古柯叶 +出售可卡因 +出售听话药 +出售咖啡因 +出售土手枪 +出售土炸弹 +出售土炸药 +出售失忆水 +出售失忆药 +出售失身水 +出售安纳咖 +出售导爆索 +出售左轮枪 +出售巴雷特 +出售开心水 +出售开锁枪 +出售弹簧刀 +出售手拉狗 +出售手木仓 +出售手榴弹 +出售打猎枪 +出售摇头丸 +出售摇头糖 +出售散弹枪 +出售散弹狗 +出售朝鲜冰 +出售枪qq +出售此号靠 +出售武士刀 +出售毕业证 +出售气动枪 +出售气动狗 +出售气弹枪 +出售气手枪 +出售气手狗 +出售气木仓 +出售气枪阀 +出售气步枪 +出售气狙狗 +出售氯氨酮 +出售氯胺酮 +出售汽枪弹 +出售汽步枪 +出售沙菲片 +出售海洛因 +出售火药枪 +出售烟雾弹 +出售热武器 +出售爆破剂 +出售狙击弩 +出售狙击枪 +出售狩猎弩 +出售狩猎枪 +出售猎l枪 +出售猎木仓 +出售电击枪 +出售电动鸡 +出售电雷管 +出售白冰糖 +出售白牙签 +出售秃鹰管 +出售罂粟碱 +出售美沙酮 +出售肾qq +出售自制枪 +出售致癌药 +出售虎牙刀 +出售蜘蛛刀 +出售蝴蝶刀 +出售警官证 +出售警察证 +出售账号靠 +出售起爆器 +出售身份证 +出售进口枪 +出售迷幻水 +出售迷幻药 +出售迷昏药 +出售迷魂烟 +出售酣乐欣 +出售野战刀 +出售钢珠枪 +出售钻石冰 +出售铅弹枪 +出售铅弹狗 +出售银行卡 +出售锡锋枪 +出售长治筋 +出售阻击枪 +出售风城枪 +出售驾驶证 +出售高仿枪 +出售高仿证 +出售麦角酸 +出售麦角醇 +出售麻醉枪 +出售麻黄碱 +出售麻黄素 +出售黄牙签 +出售黑火药 +出轨txt +刀具专卖店 +刀具专卖网 +刀具直销网 +刀剑批发网 +利博娱乐城 +利澳现金网 +别他妈的装 +别动要射拉 +制作假证书 +制作氯胺酮 +制作燃烧弹 +制十军刺卖 +制幻剂出售 +制服的诱惑 +刻章办假证 +办假学历证 +办假学生证 +办假导游证 +办假房产证 +办假文凭证 +办假毕业证 +办假离婚证 +办假结婚证 +办假警官证 +办假证qq +办假证件q +办假身份证 +办公室性欲 +办公室无码 +办公室淫乱 +办公室调情 +办理假文凭 +办理假言正 +办理假证件 +办理假车牌 +办理军人证 +办理军官证 +办理国安证 +办理士兵证 +办理行驶证 +办理记者证 +办理驾驶证 +办理高仿证 +办自考文凭 +办证公司网 +办证工作室 +办高仿证件 +加勒比巨乳 +加薇039 +加骚妹qq +动漫av片 +动漫性爱图 +努尔白克力 +勃朗宁军刀 +勃起吧少年 +勾魂夜合花 +勾魂蛇魔女 +包你爽到射 +包夜1条龙 +包夜性交易 +匕首专卖店 +匕首专卖网 +化学冰牙签 +北京援交妹 +北岛优下载 +北川瞳无码 +十8大人事 +千僖金瓶梅 +午夜成人场 +午夜淫电影 +午夜淫虎网 +午夜激情片 +华宝娱乐城 +单身求姐脱 +单身男女群 +卖3唑仑片 +卖3箭汽枪 +卖92手枪 +卖B发论公 +卖k粉qq +卖k粉手机 +卖k粉电话 +卖QQ号码 +卖仿真手枪 +卖仿真枪模 +卖会计师证 +卖假人民币 +卖假军官证 +卖假币qq +卖假户口本 +卖假结婚证 +卖假身份证 +卖冰毒qq +卖冰毒手机 +卖冰毒电话 +卖冰砖qq +卖冰砖手机 +卖冰砖电话 +卖合成k粉 +卖国外文凭 +卖学历证书 +卖左轮手枪 +卖毕业文凭 +卖毕业证书 +卖白粉qq +卖白粉手机 +卖白粉电话 +卖秃鹰汽枪 +卖考前答案 +卖肝源qq +卖肝脏qq +卖肾源qq +卖肾脏qq +卖资质证书 +卖车辆牌照 +卖进口汽狗 +卖金钟气枪 +卖铅弹气枪 +卖骨髓收肾 +卖高压气枪 +卖麻古qq +卖麻古手机 +卖麻古电话 +卖麻果qq +卖麻谷qq +卖麻谷手机 +卖麻谷电话 +南佳也无码 +南佳也种子 +南家茜bt +南家茜无码 +南方军刀网 +南智子无码 +南波杏种子 +博9娱乐网 +博彩qq群 +博彩乐透乐 +博彩太阳城 +博彩娱乐场 +博彩娱乐网 +卡拉娱乐网 +历史的伤口 +原一九五七 +原千寻种子 +原子弹制作 +原子弹清单 +原砷酸供应 +原藜芦碱a +厦门大游行 +去宾馆夜谈 +去氧麻黄碱 +去甲麻黄素 +又猛插几下 +友田彩也香 +双氢可待因 +反对共产党 +反恐委员会 +反社会主义 +反革命暴乱 +反革命暴亂 +发仑da发 +发情小公狗 +发轮功陈果 +变色的花朵 +口到你吐奶 +口服迷昏药 +古月金帛涛 +古柯碱供应 +古柯碱提供 +古都光种子 +另类熟女图 +可卡因qq +可卡因专卖 +可卡因买卖 +可卡因供应 +可卡因出售 +可卡因提供 +可卡因直销 +可卡因购买 +可卡因销售 +可待因供应 +可待因出售 +可待因批发 +可待因提供 +可待因销售 +台湾伦乱网 +台湾共产党 +台湾共合国 +台湾共和国 +台湾情色網 +台湾情色网 +台湾成人网 +台湾淫色网 +台湾版假币 +台湾精仿枪 +台灣倫亂網 +叶丽美无码 +叶丽美种子 +叶月蓝bt +司法造冤案 +各种姿势上 +各类军用枪 +合成氯胺酮 +吉村彩种子 +同城1夜情 +同城e夜情 +同志女论坛 +名刀网出售 +听话水专卖 +听话水出售 +听话水电话 +听话水订购 +听话水销售 +听话药买卖 +听话药供应 +听话药出售 +听话药批发 +听话药提供 +听话药购买 +听话药销售 +吳 宏 達 +吳 方 城 +吳 百 益 +吸我1个吻 +吸精小少女 +周恩来后悔 +周恩来忏悔 +周恩来自责 +周碧清子女 +周迅的女儿 +和妹妹做爱 +和妹妹肏屄 +和妹妹肏穴 +和姐姐插穴 +和姐姐淫穴 +和姐姐肏屄 +和婶婶做爱 +和嫂嫂淫穴 +和小平散步 +和尚淫事录 +和平请愿书 +和条友做爱 +和记娱乐城 +和阿姨乱伦 +和阿姨作爱 +和阿姨做爱 +和阿姨淫穴 +咪咪情色网 +咪咪爱社区 +咪咪爱论坛 +咪咪的诱惑 +咪咪色色网 +品色堂h片 +品色堂网址 +哎吔女朋友 +哥哥插影院 +哥要插影院 +哪有迷药卖 +哪里买军刺 +哪里卖军刺 +哪里找小姐 +哭泣的女人 +唐人电视台 +唐人電視臺 +唐刀专卖网 +唐朝豪放女 +唐福珍死亡 +售1元硬币 +售会计师证 +售假军官证 +售假户口本 +售假结婚证 +售假身份证 +售假钞qq +售军用手枪 +售军车套牌 +售各式气枪 +售学历证书 +售安乐死药 +售手枪QQ +售毕业文凭 +售毕业证书 +售精仿军刀 +售考前答案 +售考试答案 +售资质证书 +售车辆牌照 +善吻胯下唇 +喜欢后入呢 +喪服妻欲望 +喵喵药供应 +喵喵药出售 +喵喵药合成 +喵喵药批发 +喵喵药提供 +喵喵药直销 +喵喵药订购 +喷雾型迷药 +喷雾蒙汗药 +嗨约吗茄q +嘻嘻色影院 +四二六社論 +四二六社论 +四号维园见 +回民吃猪肉 +国产a片网 +国产乱伦片 +国产手拉长 +国产手拉鸡 +国外成人网 +国外破处门 +国家已沉睡 +国家领导人 +国民党万岁 +國家領導人 +國民黨萬歲 +土炸弹qq +土炸药成份 +土炸药配方 +土炸药销售 +圣女修道院 +圣淫乱学院 +在线6合彩 +在线摸奶秀 +在线淫影院 +在线淫电影 +在线百家乐 +在线看a片 +在线看毛片 +在线看黄片 +在线老虎机 +在线裸聊网 +在线赌博网 +地高辛供应 +地高辛批发 +地高辛提供 +地高辛直销 +地高辛销售 +城麻美种子 +处女性开苞 +处女的关系 +处女的诱惑 +处女阴道库 +备精欢淫你 +夏树唯无码 +夜夜做新郎 +夜夜打飞机 +夜总会公主 +夜总会小姐 +夜敲寡妇门 +夜晚入你体 +夜晚姘妇家 +夜来香社区 +夜袭怡红院 +夜话紫禁城 +大 紀 元 +大6无码片 +大FA弟子 +大丑风流记 +大乱交bt +大众博彩网 +大众娱乐城 +大众成人网 +大冰砖专卖 +大冰砖出售 +大冰砖出货 +大冰砖到货 +大冰砖合成 +大冰砖提供 +大冰砖订购 +大冰砖配方 +大冰砖销售 +大叔我爱你 +大学生包夜 +大学生无码 +大尺度套图 +大尺度私拍 +大法修炼者 +大波女校会 +大波妹上门 +大泽惠种子 +大田茜bt +大田茜无码 +大粗时间久 +大肉棒好粗 +大肉棒插我 +大色逼电影 +大西洋博彩 +大阴唇姐姐 +大马士革刀 +大鸡巴好粗 +大鸡巴小穴 +大黑鹰买卖 +大黑鹰供应 +大黑鹰促销 +大黑鹰销售 +天天任我淫 +天天干影院 +天天干贴图 +天天色综合 +天安門一代 +天安門事件 +天安門坦克 +天安門屠城 +天安門屠殺 +天安門慘案 +天安門時報 +天安門檔案 +天安門殘案 +天安門母親 +天安門流血 +天安门1代 +天安门一代 +天安门事件 +天安门坦克 +天安门学生 +天安门屠城 +天安门屠杀 +天安门惨案 +天安门文件 +天安门时报 +天安门档案 +天安门残案 +天安门母亲 +天安门流血 +天安门真相 +天按門事件 +天按门事件 +天海优无码 +天父的儿女 +太王四神记 +太阳城博彩 +太阳城开户 +太阳城梭哈 +夫妻俱乐部 +夫妻俱樂部 +夫妻玩6p +失忆性行为 +失忆水专卖 +失忆水供应 +失忆水提供 +失忆水购买 +失忆水销售 +失忆粉供应 +失忆粉批发 +失忆粉提供 +失忆粉直销 +失忆粉订购 +失忆粉购买 +失贞的都市 +失身水出售 +失身水销售 +套号毕业证 +奥nmd运 +奥你妈的运 +女人也疯狂 +女儿温如春 +女医肉奴隶 +女士俱乐部 +女学生乳交 +女学生嫩B +女学生按摩 +女性自尉器 +女技师服务 +女教师赤版 +女教師赤版 +女白领按摩 +女神的诡计 +女被人家搞 +奸淫俏媳妇 +奸淫女家教 +奸淫女老师 +奸淫好舒服 +奸淫少妇穴 +奸淫护士穴 +好大的肉棒 +好大的阴唇 +好大的阴户 +好嫩的屄啊 +好嫩的阴户 +好小小骚穴 +好爽哟插穴 +好硬的肉棒 +好粗好舒服 +好紧好多水 +好紧的小穴 +好紧的屄啊 +好紧的阴户 +好紧的阴道 +好肥的阴户 +好舒服好爽 +好舒服小穴 +好舒服舔穴 +好色色导航 +好长的肉棒 +好骚妹影视 +好骚妹影院 +如来逗妇乳 +妈妈嫩穴痒 +妓女性服务 +妓女的口号 +妖界淫游记 +妹妹我要射 +妹妹淫水流 +妹妹激情网 +妹妹爱上我 +妹妹的嫩屄 +妹妹的阴户 +妹妹的阴蒂 +妹妹美图网 +妹妹骚电影 +妹芐h面痒 +妻子的小洞 +妻诱之情趣 +姐夫的荣耀 +姐姐口交网 +姐姐吹逼逼 +姐姐的小屄 +姐姐的小穴 +姐姐的肥穴 +姐姐的阴户 +姐姐被轮奸 +姐的嫩阴道 +姑姑的淫水 +威兴识下挂 +威哉我汉军 +娘两腿之间 +娜鲁湾论坛 +娱乐赌博城 +婷婷5色天 +婷婷激情网 +嫌疑人突死 +嫩穴 搔穴 +子女任职名 +学chao +学位证出售 +学位证办理 +学生妹全套 +学生妹包夜 +学生妹坐台 +学生妹开房 +学生妹服务 +学生妹果聊 +学生妹陪睡 +学生妹高潮 +宁王府成人 +宁王府淫色 +安纳咖出售 +宋朝俯卧撑 +官人我要1 +官人我要2 +官员因涉黑 +宝马女局长 +宫间葵无码 +家庭乱伦片 +家族大乱交 +宿舍拍艳照 +寂寞找人干 +寂寞男泡女 +密云找小姐 +富婆来爱爱 +寻凤楼论坛 +寻找1夜情 +寻找夜夜情 +寻找林昭墓 +寻视频女友 +导爆索出售 +导爆索批发 +导爆索销售 +寿绫乃全集 +寿绫乃种子 +射了还说要 +射了還說要 +射入你阴道 +射入阴道里 +射屌英雄传 +射的她满脸 +射钉弹改装 +射钉枪改气 +射钉枪改装 +射雕淫女传 +小冰砖qq +小冰砖买卖 +小冰砖出售 +小冰砖出货 +小冰砖到货 +小冰砖合成 +小冰砖订购 +小冰砖配方 +小冰砖销售 +小口径汽枪 +小女花不弃 +小姐全攻略 +小姐最便宜 +小姐多少钱 +小姐威客网 +小姐打飛機 +小姐打飞机 +小姐找服务 +小姐欲脱裤 +小姐灌的浆 +小姨子小穴 +小嫩穴贴图 +小平不耐烦 +小平的预言 +小平讲英语 +小日本疯了 +小林爱bt +小林瞳种子 +小森诗无码 +小池絵美子 +小泉彩种子 +小泉系无码 +小泉純一郎 +小泉纯一郎 +小泽圆种子 +小淫虫电影 +小穴流淫水 +小穴里抽插 +小色哥导航 +小骚洞蜜穴 +小骚逼影院 +少女bb图 +少女乱伦片 +少女体验官 +少女俱乐部 +少女发育图 +少女潘金莲 +少女迷情药 +少妇 淫穴 +少妇操尿穴 +少妇潘金莲 +少妇被操穴 +尼泊尔弯刀 +局长梁继平 +山奈钾批发 +山心恨bt +川岛和津实 +工字气枪网 +工字牌气狗 +左旋麻黄素 +巨乳俏女医 +巨乳俏女醫 +巨乳女教师 +巨乳女教師 +布拉格男妓 +帝豪娱乐城 +常德援交妹 +干1炮av +干丰满少妇 +干你1万年 +干保姆小穴 +干妈妈的爽 +干妹妹小穴 +干姐姐小穴 +干小姐小穴 +干少妇小穴 +干插我的穴 +干死狂插操 +干爹的龟头 +干的妈好爽 +干空姐小穴 +干美女小穴 +干老师小穴 +干老师的穴 +干部怕退休 +干阿姨小穴 +乡村野疯狂 +幼交片下载 +幼女小嫩穴 +幼幼兽交图 +幼幼片下载 +幼男搞幼女 +广东找洋妞 +床上你懂得 +床上永动机 +床上的故事 +床上的缠绵 +床上能力强 +床上见分晓 +床上销魂照 +庐江县裸照 +廓尔喀军刀 +廓尔喀弯刀 +开他敏直销 +开山刀买卖 +开山刀供应 +开山刀出售 +开山刀批发 +开山刀直销 +开山刀订购 +开山刀销售 +开平,受辱 +开平,轮奸 +开心成人网 +开心水出售 +开心色播网 +异丁腈供应 +异丁腈批发 +异丁腈提供 +异丁腈直销 +异丁腈销售 +弓弩专卖店 +弓弩专卖网 +弓弩买卖网 +弓弩狩猎网 +弓弩直销网 +弓弩麻醉箭 +弓弩麻醉镖 +张 伟 国 +张 宏 堡 +张 志 清 +张 昭 富 +张培莉女士 +弩用麻醉箭 +張 伯 笠 +張 偉 國 +張 宏 堡 +張 志 清 +張 昭 富 +弹簧刀专卖 +弹簧刀买卖 +弹簧刀出售 +弹簧刀匕首 +弹簧刀批发 +弹簧刀提供 +弹簧刀直销 +弹簧刀转让 +强jian +强力拍肩粉 +强奸女老师 +强征建官员 +强效催情液 +强效听话药 +强效失忆药 +强效失意药 +强暴药供应 +强暴药出售 +强暴药批发 +强暴药提供 +强暴药销售 +当官靠后台 +彩票选号机 +德晋娱乐城 +快乐丸出售 +快插我淫穴 +快播av片 +快播av站 +快播a片网 +快播幼交片 +快播情色网 +快播援交片 +快播色情片 +快来插肉穴 +快活林导航 +快活林黄站 +快活谷论坛 +怒干大骚女 +思春期诱惑 +性交电影网 +性伦乱小说 +性信息交友 +性免费电影 +性兴奋女友 +性功能障碍 +性吧发布器 +性奴集中营 +性感骚主播 +性时最可靠 +性暴力图片 +性暴力视频 +性服务qq +性欲极强女 +性爱 图库 +性爱 电影 +性爱5月天 +性爱5月花 +性爱动画片 +性爱电影网 +性爱直播间 +性爱视频网 +性爱美女图 +性爱聊天室 +性爱裸聊室 +性爱裸聊网 +性爱魔法师 +性的漂流者 +性福5月天 +恋上小姨子 +恩华3唑仑 +恩华三唑仑 +恶搞人民币 +悲哀的熟女 +情欲奸岳母 +情欲小爱人 +情欲按摩院 +情色 信息 +情色,论坛 +情色5月天 +情色6月天 +情色伦理片 +情色小电影 +情色小视频 +情色小说网 +情色履历书 +情色总动员 +情色成人网 +情色海岸线 +情色淫电影 +情色电影院 +情色综合网 +情色聊天室 +惊天桃色劫 +惊爆激情夜 +惊现5女尸 +想带绿帽子 +意者加我寇 +意者加我扣 +意者加我抠 +意者加我蔻 +成人 性爱 +成人5月天 +成人av网 +成人a游戏 +成人dvd +成人h动漫 +成人h小说 +成人h漫画 +成人偷拍网 +成人午夜场 +成人午夜片 +成人娱乐网 +成人导航网 +成人小游戏 +成人小电影 +成人小说吧 +成人性爱区 +成人性社区 +成人情色片 +成人情色网 +成人操电影 +成人无码区 +成人无码片 +成人游戏网 +成人激情图 +成人激情网 +成人电影网 +成人电影院 +成人视频秀 +成人聊天室 +成人色情片 +成人色情网 +成人色播网 +成人色网站 +成人裸体秀 +成人贴图区 +成人贴图站 +成人黄色片 +成人黄色网 +我上了舅妈 +我为性疯狂 +我也要泄了 +我们自杀吧 +我含着阴茎 +我和久美子 +我和小姨子 +我和小姨淫 +我和老板娘 +我在黑暗中 +我家伙很大 +我已经硬了 +我想问总理 +我操啦综合 +我操淫姐网 +我是g和m +我是大魔王 +我是大魔鬼 +我淫我色网 +我爱吃大鸟 +我爱大胸妹 +我爱小姨子 +我爱幼幼论 +我爱开心网 +我爱狐狸精 +我爱色色吧 +我要嫖女人 +我要性交网 +我要泄了喔 +战乱的星系 +战术狗腿刀 +户外军刀网 +户外刀专卖 +房山找小姐 +手工弩出售 +手拉awp +手拉狗专卖 +手拉狗出售 +手拉鸡专卖 +手拉鸡出售 +手拉鸡改装 +手拉鸡订购 +手拉鸡论坛 +手木仓qq +手木仓专卖 +手木仓转让 +手木仓销售 +手机,窃听 +手机x卧底 +手机变号器 +手机截听器 +手机接听器 +手机监听器 +手机监听王 +手机窃听器 +手机自慰网 +手枪制作图 +手枪气枪猎 +手枪的结构 +手枪销售网 +手狗专卖网 +扒开嫩阴道 +打倒共产党 +打倒江主席 +打倒江泽民 +打倒温家宝 +打倒胡锦涛 +打到共产党 +打鸟枪批发 +打鸟枪提供 +打鸟枪购买 +批发3唑仑 +批发丙烯醛 +批发丛林刀 +批发乌头碱 +批发乖乖水 +批发乙烯砜 +批发乙硼烷 +批发仿真枪 +批发假硬币 +批发催情液 +批发兰博刀 +批发军用刀 +批发军用弩 +批发冰牙签 +批发卡西酮 +批发反恐弩 +批发古柯叶 +批发古柯碱 +批发可卡因 +批发可待因 +批发听话药 +批发喵喵药 +批发地高辛 +批发失忆水 +批发失忆药 +批发安纳咖 +批发小冰砖 +批发开山刀 +批发异丁腈 +批发弹簧刀 +批发强奸水 +批发打鸟枪 +批发拍肩粉 +批发散弹枪 +批发气动狗 +批发气手枪 +批发气木仓 +批发气步枪 +批发氯乙酸 +批发氯磺酸 +批发求生刀 +批发汽步枪 +批发汽短狗 +批发汽长狗 +批发海乐神 +批发海洛因 +批发烯丙胺 +批发狙击弩 +批发狙击枪 +批发狩猎刀 +批发狩猎弩 +批发甲基肼 +批发白牙签 +批发砷化氢 +批发碘甲烷 +批发磷化锌 +批发礼花弹 +批发秃鹰枪 +批发红矾钠 +批发红降汞 +批发美沙酮 +批发虎牙刀 +批发蝴蝶刀 +批发赵氏弩 +批发起爆药 +批发连发枪 +批发迷魂水 +批发迷魂粉 +批发酣乐欣 +批发醋酸汞 +批发野战刀 +批发钻石冰 +批发长治筋 +批发麦角醇 +批发麻古粉 +批发麻黄碱 +批发麻黄素 +批发黑火药 +找1个情人 +找1夜晴网 +找3陪小姐 +找个污妹搞 +找人报仇网 +找啊姨爱爱 +找女人来操 +找女人过夜 +找小妹出台 +找小妹服务 +找小姐qq +找小姐信息 +找小姐出台 +找小姐服务 +找小姐电话 +找小姐美女 +找服务美女 +找洋妞1夜 +找洋妞找鸡 +找美女上门 +找酒店小姐 +找长期小姐 +找骚女妹妹 +抄股市大底 +抓奶龙抓手 +投注赌博网 +折刀专卖网 +折叠狗QQ +抠插磨蹭穴 +护士24点 +抬抬女事件 +抵制共产党 +抵制朱镕基 +抵制江泽民 +抵制温家宝 +抵制胡锦涛 +抽插到高潮 +抽插大淫穴 +抽插小淫穴 +拉你进洞房 +拍肩粉专卖 +拍肩粉销售 +拍肩醉迷药 +按摩援交妹 +挥发型迷药 +换妻qq群 +换妻俱乐部 +换妻群交群 +掌心雷出售 +接任证监会 +掰开少女穴 +掰穴皮卡丘 +揉搓淫骚穴 +提供3棱刀 +提供ppk +提供丛林刀 +提供乌头碱 +提供乖乖粉 +提供乖乖药 +提供乙烯砜 +提供仿真枪 +提供假文凭 +提供假言正 +提供假证件 +提供假车牌 +提供催情水 +提供催情粉 +提供催情药 +提供军人证 +提供军官证 +提供军警服 +提供冰牙签 +提供古柯碱 +提供可卡因 +提供听话水 +提供听话药 +提供喵喵药 +提供国安证 +提供士兵证 +提供大冰砖 +提供失忆药 +提供平头刀 +提供开心水 +提供异丁腈 +提供强暴药 +提供性服务 +提供手拉鸡 +提供手木仓 +提供打飞机 +提供打鸟枪 +提供援交妹 +提供摇头丸 +提供散弹枪 +提供散弹狗 +提供气动狗 +提供气木仓 +提供气步枪 +提供氧化铊 +提供氯胺酮 +提供汽步枪 +提供汽短狗 +提供汽长狗 +提供沙菲片 +提供海乐神 +提供海洛因 +提供狩猎弩 +提供猎木仓 +提供电雷管 +提供磷化锌 +提供秃鹰枪 +提供美沙酮 +提供羰基镍 +提供致幻剂 +提供芬太尼 +提供蒙汗药 +提供蜘蛛刀 +提供蝴蝶刀 +提供行驶证 +提供记者证 +提供赌博粉 +提供赌博药 +提供迷奸药 +提供迷幻药 +提供迷情水 +提供迷情粉 +提供迷情药 +提供迷魂水 +提供迷魂粉 +提供迷魂药 +提供酣乐欣 +提供醋酸铊 +提供野战刀 +提供钢珠枪 +提供钻石冰 +提供长治筋 +提供高仿证 +提供麦角酸 +提供麦角醇 +提供麻黄碱 +提供麻黄素 +提供黄牙签 +插入大肉棒 +插入穴 爽 +插处女bb +插妹妹小穴 +插妹妹淫屄 +插妹妹电影 +插妹妹综合 +插妻子小穴 +插姐妹小穴 +插姐姐嫩穴 +插婷婷小穴 +插小穴射了 +插小穴插我 +插小穴肉缝 +插少女阴道 +插屄好舒服 +插得好爽啊 +插淫女小穴 +插淫妇骚穴 +插白洁小穴 +插的好舒服 +插的我好爽 +插穴好舒服 +插逼清晰图 +援交俱乐部 +援交女上门 +援交女教师 +援交女服务 +援交妹qq +援交妹上门 +援交妹包夜 +援交学生妹 +搔妹妹黄站 +摇头丸qq +摇头丸专供 +摇头丸专卖 +摇头丸价格 +摇头丸出售 +摇头丸出货 +摇头丸到货 +摇头丸合成 +摇头丸提供 +摇头丸直销 +摇头丸订购 +摇头丸配方 +摇头丸销售 +摇头糖供应 +摇头糖出货 +摇头糖到货 +摇头糖合成 +摇头糖订购 +摇头糖配方 +摇头糖销售 +摸nai门 +摸擦小肥穴 +撅起大白腚 +撸撸射影院 +操bibi +操mm嫩穴 +操mm穴交 +操丰满小穴 +操最爱的人 +操出售假币 +操出售手枪 +操出售枪支 +操医生小穴 +操女人嫩穴 +操妹妹湿穴 +操姐姐的穴 +操少妇嫩穴 +操屄自慰器 +操得直叫爽 +操成人电影 +操护士的穴 +操抽你丫的 +操操你妈屄 +操日本淫女 +操浪妻淫女 +操淫荡好爽 +操淫荡少妇 +操淫荡护士 +操淫荡空姐 +操烂你的逼 +操粗制吗啡 +操草的你妈 +操达赖喇嘛 +操逼你老母 +攀上女领导 +支援果敢族 +收单管猎狗 +收肾买卖肾 +收费裸聊室 +改装射钉枪 +放荡的女人 +政府为可恶 +政府太无耻 +政府救楼市 +政治局常委 +政策来捣鬼 +救囯集中淫 +救度众生说 +教你做炸药 +教师奴隶化 +散弹枪买卖 +散弹枪出售 +散弹狗出售 +文凭代办网 +文化大革命 +新星娱乐城 +新潮女空姐 +新疆打砸抢 +新疆的畜生 +新葡京娱乐 +无声爆破剂 +无声猫出售 +无毛美少女 +无界浏览器 +无码h动漫 +无码动画片 +无码卡通区 +无码小处女 +无码色电影 +无码裸女图 +无线,监听 +无网界流览 +无网界浏览 +无限窃听器 +日久贱人心 +日你妈啦屄 +日你妈啦逼 +日加撸导航 +日博365 +日日色影院 +日本3级片 +日本乱伦片 +日本性爱片 +日本情色片 +日本成人网 +日本无修正 +日本暴淫网 +日本淫电影 +日本激情淫 +日本激情片 +日韩无码区 +日韩无码片 +日高司无码 +早坂瞳种子 +时尚女记者 +昆仑女神功 +昆字上下念 +昆山援交妹 +明升m88 +明星裸体照 +明镜出版社 +昏迷药出售 +易发百家乐 +星光伴我淫 +春妹性乐园 +春宫豪放女 +春满梦工厂 +春色激情网 +春野樱无码 +是我的性痒 +晚年周恩來 +晚年周恩来 +暴行白书女 +暴行白書女 +曾 庆 红 +曾 慶 紅 +曾道人特码 +替人报仇网 +月咲忍无码 +月宫套图社 +有偿肾服务 +有点小骚味 +有贺凉无码 +有贺凉种子 +朝河兰种子 +木村茜无码 +未亡人柔肌 +未成年接客 +本地办文凭 +杀知识分子 +李 旺 阳 +李 旺 陽 +李 洪 志 +李 淑 娴 +李 淑 嫻 +李宗瑞种子 +李意珍女儿 +李洪志阿扁 +杜冷丁qq +杜冷丁专卖 +杜冷丁买卖 +杜冷丁供应 +杜冷丁出售 +杜冷丁批发 +杨野的禁脔 +极品性虐待 +极品无码网 +東北xx網 +松岛枫bt +松岛枫合集 +松岛枫无码 +松岛枫电影 +松岛枫种子 +松田瞳种子 +林心如毛片 +枪械专卖店 +枪械专卖网 +枪模专卖网 +树若菜无码 +树若菜种子 +校园群芳记 +桃井望种子 +桑拿娱乐网 +梦中的女孩 +梶田樱无码 +植物冰出售 +楼凤信息网 +楼凤性息网 +樱井彩种子 +樱井茜无码 +樱朱音种子 +橘凉子无码 +橘凉子种子 +橘未稀种子 +欢乐性今宵 +欧洲成人网 +欧洲无码片 +欧洲色电影 +欧美se图 +欧美乱伦片 +欧美女同片 +欧美性爱片 +欧美成人片 +欧美无码区 +欧美色图区 +欧美色图网 +欧美色漫图 +欲望电影院 +欲海天龙传 +欲淫妻调教 +欲色成人网 +欲购手拉鸡 +欽 本 立 +歡樂性今宵 +正义党论坛 +正品蝴蝶刀 +武士刀专卖 +武林淫乱史 +死区是党权 +残虐女刑史 +段义和指示 +母女狩猎者 +母子乱乱论 +毕业证出售 +毛1中1台 +毛1党专制 +毛3个代婊 +毛3个呆婊 +毛3去车仑 +毛64事件 +毛64真相 +毛一中一台 +毛一党专制 +毛一国两制 +毛三个代婊 +毛三个呆婊 +毛三去车仑 +毛世界日报 +毛东亚病夫 +毛东突组织 +毛两腿之间 +毛主席复活 +毛买卖枪支 +毛乳波臀浪 +毛人体炸弹 +毛以茎至洞 +毛你2大爷 +毛你二大爷 +毛你姥姥的 +毛你爷爷的 +毛六四事件 +毛六四真相 +毛共产主义 +毛共青团员 +毛军国主义 +毛分裂祖国 +毛十年动乱 +毛卖党求荣 +毛卖国求荣 +毛去你妈的 +毛台湾民国 +毛台湾独立 +毛四川独立 +毛回民暴动 +毛国家主席 +毛国家民委 +毛基地组织 +毛塞你老师 +毛塞你老母 +毛多维新闻 +毛奸夫淫妇 +毛妈卖妈屁 +毛妳老母的 +毛妹妹淫色 +毛妹妹黄站 +毛官商勾结 +毛官逼民反 +毛对日强硬 +毛希望之声 +毛干你妈b +毛干你妈逼 +毛干妳老母 +毛弓虽女干 +毛恐怖主义 +毛恐怖份子 +毛我妳老爸 +毛投毒杀人 +毛新疆独立 +毛日本鬼子 +毛枪决女犯 +毛枪支弹药 +毛欲火焚身 +毛水去车仑 +毛法轮大法 +毛泽东侄子 +毛泽东复活 +毛淫语连连 +毛激情电影 +毛燕玲论坛 +毛看棋软件 +毛看牌软件 +毛社会主义 +毛窃听器材 +毛美国之音 +毛色情服务 +毛色情电影 +毛苹果日报 +毛蒙古独立 +毛西藏天葬 +毛西藏独立 +毛警匪一家 +毛透视眼镜 +毛透视软件 +毛邓小故事 +毛阴小撕大 +毛青天白日 +毛驶你老母 +毛高丽棒子 +毛高校暴乱 +毛麻醉钢枪 +毛黄色电影 +民主还专政 +气动狗qq +气动狗供应 +气动狗出售 +气动狗批发 +气动狗提供 +气动狗直销 +气动狗订购 +气动狗购买 +气动狗销售 +气手枪专卖 +气手枪买卖 +气手枪出售 +气手枪销售 +气手狗专卖 +气手狗出售 +气抢专卖网 +气木仓专卖 +气木仓供应 +气木仓出售 +气木仓批发 +气木仓提供 +气木仓直销 +气木仓订购 +气木仓转让 +气木仓销售 +气枪专卖店 +气枪专卖网 +气枪专销网 +气枪弹供应 +气枪直销网 +气枪迷魂药 +气枪销售网 +气步枪供应 +气步枪出售 +气步枪批发 +气步枪提供 +气步枪直销 +气步枪订购 +气步枪购买 +气步枪转让 +气步枪销售 +气狗专卖店 +气狗粮出售 +气狗网专卖 +氧化铊批发 +氧化铊直销 +氧化铊销售 +氯胺酮qq +氯胺酮专卖 +氯胺酮价格 +氯胺酮供应 +氯胺酮出售 +氯胺酮出货 +氯胺酮到货 +氯胺酮提供 +氯胺酮电话 +氯胺酮订购 +氯胺酮配方 +氯胺酮销售 +氰化钠专卖 +永利娱乐场 +永利高网址 +永远的处女 +求年炮同居 +求美女床上 +求购子弹壳 +求购手拉鸡 +求购氯胺酮 +汇丰娱乐城 +江core +江择min +江氏政治局 +江泽民江8 +江泽民江贼 +江派和胡派 +江湖 淫娘 +江湖淫香录 +江湖艳情录 +江猪江猪媳 +汽手枪出售 +汽手枪提供 +汽手枪销售 +汽手狗专卖 +汽木仓供应 +汽枪专卖店 +汽枪专营店 +汽枪免定金 +汽枪原理图 +汽步枪买卖 +汽步枪供应 +汽步枪出售 +汽步枪批发 +汽步枪提供 +汽步枪直销 +汽步枪订购 +汽步枪购买 +汽步枪转让 +汽步枪销售 +汽短狗批发 +汽短狗提供 +汽短狗直销 +汽短狗订购 +汽短狗购买 +汽短狗转让 +汽车解码器 +汽长狗批发 +汽长狗提供 +汽长狗直销 +汽长狗订购 +汽长狗购买 +汽长狗转让 +汽长狗销售 +沙菲片供应 +沙菲片出售 +沙菲片批发 +沙菲片提供 +沙菲片直销 +沙菲片购买 +沙菲片销售 +河井樱无码 +泉星香无码 +法 轮 功 +法.轮.功 +法(輪)功 +法(轮)功 +法*輪*功 +法*轮*功 +法1轮1功 +法lun功 +法一轮一功 +法十輪十功 +法十轮十功 +法西藏主义 +法车仑工力 +法轮大法靠 +波多野结衣 +洞房的滋味 +活好不粘人 +流崎裕无码 +流氓风流录 +浅仓舞种子 +测拉式气枪 +浪妹社区网 +浪穴大肉棍 +海luo因 +海乐神qq +海乐神专卖 +海乐神出售 +海乐神批发 +海乐神销售 +海洛因qq +海洛因专卖 +海洛因供应 +海洛因出售 +海洛因出货 +海洛因到货 +海洛因合成 +海洛因提供 +海洛因直销 +海洛因订购 +海洛因配方 +海洛因销售 +海立方娱乐 +消滅共產黨 +消灭共产党 +淑女征服者 +淘宝办文凭 +淫の方程式 +淫乱5月天 +淫乱俱乐部 +淫乱爽电影 +淫人色欲社 +淫人阁社区 +淫叫好舒服 +淫叫要泄了 +淫和尚社区 +淫哥哥影视 +淫哥哥影院 +淫图新社区 +淫城乱伦屋 +淫声系列片 +淫女 幼B +淫女俱乐部 +淫女吃鸡巴 +淫女嫩穴图 +淫女小电影 +淫女穴影院 +淫女自慰片 +淫女贴图区 +淫奸女图片 +淫奸女护士 +淫奸女教师 +淫奸妹妹穴 +淫奸姐姐穴 +淫奸嫂子穴 +淫奸小姨子 +淫奸小电影 +淫奸少女穴 +淫奸少妇穴 +淫奸护士穴 +淫奸美女穴 +淫奸阿姨穴 +淫妇潘金莲 +淫妹妹电影 +淫妹妹贴图 +淫妻爱好者 +淫妻罗曼史 +淫娃终结者 +淫影院论坛 +淫护士小说 +淫护士电影 +淫术炼金士 +淫欧美淫暴 +淫民俱乐部 +淫民影院网 +淫洞 贴图 +淫液流入穴 +淫电影a片 +淫电影网站 +淫电影论坛 +淫视频下载 +淫秽小电影 +淫穴内好痒 +淫穴大鸡巴 +淫穴夹好爽 +淫穴淫水流 +淫穴电影网 +淫穴里骚水 +淫美贴图区 +淫色5月天 +淫色五月天 +淫色俱乐部 +淫色全免费 +淫色成人网 +淫色搔女网 +淫色电影网 +淫色电影院 +淫色贴图网 +淫色阁成人 +淫荡5月天 +淫荡俱乐部 +淫荡口交妹 +淫荡女医生 +淫荡女护士 +淫荡女教师 +淫荡好舒服 +淫荡小护士 +淫荡少女穴 +淫荡少妇穴 +淫荡护士穴 +淫荡插小穴 +淫荡教师穴 +淫荡的奸淫 +淫荡的嫂子 +淫荡的小穴 +淫荡的靓女 +淫荡穴淫洞 +淫荡美少女 +淫荡老师穴 +淫荡自慰器 +淫荡迷情药 +淫骚穴电影 +深喉口到蛋 +深圳找小姐 +深圳援交女 +深芳野种子 +添穴两腿间 +清海无上师 +渡濑晶全集 +渡濑晶种子 +温 元 凯 +温jia宝 +温暖你的逼 +港产无码片 +港台成人戏 +湘女嫁新疆 +湘女戴庆媛 +湿了还说要 +湿润的花蕊 +湿透的内裤 +溫 元 凱 +滑湿小屄洞 +滚那吗瘟比 +滚那吗老比 +滚那吗错比 +滾那嗎老比 +潘金莲全传 +潘金莲导航 +潘金莲综合 +潜规则社区 +潮吹满天飞 +澳门博彩网 +澳门新葡京 +激情 电影 +激情,图片 +激情,电影 +激情丶4射 +激情乱伦性 +激情乱伦片 +激情交叉夜 +激情倮聊网 +激情小浪穴 +激情小王子 +激情小电影 +激情开心网 +激情性爱片 +激情成人网 +激情淫bb +激情淫影片 +激情淫影院 +激情淫文章 +激情淫电影 +激情淫穴小 +激情淫贴图 +激情片下载 +激情玩穴网 +激情网网址 +激情聊天室 +激情裸聊室 +激情裸聊秀 +激情裸聊网 +濕了還說要 +濕透的內褲 +瀬名樱无码 +灌肠自慰器 +火药枪买卖 +火药枪出售 +火药枪销售 +火药的配方 +炮打中宣部 +炸zf大楼 +炸弹的配方 +炸药的制作 +炸药的成分 +炸药的配方 +点对点裸聊 +無毛美少女 +無碼小處女 +熟女乱伦网 +熟女俱乐部 +熟女的悲哀 +熟女网爱记 +燃烧弹制作 +燃烧弹制造 +燃烧弹配方 +燃烧瓶制作 +爆乳女教师 +爆乳裸聊网 +爆破剂供应 +爆破剂出售 +爆破剂批发 +爆破剂销售 +爱bb影院 +爱上色妹妹 +爱在两腿间 +爱我请来访 +爱神之传奇 +爱笑的女孩 +爱舔小色男 +爱香里bt +爱香里无码 +爱香里电驴 +爽死你淫图 +片桐优无码 +牛逼色综合 +特码6合彩 +狂插 嫩穴 +狂插 浪穴 +狂插 肥穴 +狂插喷爱液 +狂插处女穴 +狂插妹妹穴 +狂插嫂子穴 +狂插学生妹 +狂插小嫩穴 +狂插小浪妹 +狂插小浪穴 +狂插少妇穴 +狂插性器具 +狂插护士穴 +狂插秘书穴 +狂插美女穴 +狂插老师穴 +狂插荡护士 +狂插阿姨穴 +狂操你全家 +狂操少妇逼 +狂操淫荡女 +狂爱性接触 +狗b新光明 +狗屁证监会 +狙击弩批发 +狙击弩销售 +狙击枪价格 +狙击枪出售 +狩猎刀专卖 +狩猎刀供应 +狩猎刀销售 +狩猎弩专卖 +狩猎弩供应 +狩猎弩出售 +狩猎弩批发 +狩猎弩直销 +狩猎弩订购 +狩猎弩转让 +狩猎枪出售 +独立台湾会 +独自去偷欢 +狼友av网 +狼友淫图片 +狼友登6器 +狼友阁论坛 +狼吻夜惊魂 +狼客情色网 +狼客成人网 +狼客黄色网 +狼族娱乐网 +猎刀专卖店 +猎木仓qq +猎木仓专卖 +猎木仓转让 +猎木仓销售 +猎枪|真枪 +猎枪专卖店 +猎枪出售枪 +猎枪制造图 +猎枪真枪买 +猎枪真枪卖 +猎枪结构图 +猎枪销售网 +猎艳江湖梦 +猎豹小手弩 +猎豹弩专卖 +猛插小嫩穴 +獨立臺灣會 +玉女白菊花 +玉蒲团bt +王书记艳照 +王只准宠我 +王民生群p +王民生艳照 +玩3p色链 +现代激情片 +现在的政府 +现役看护妇 +现金投注网 +现金百家乐 +现金龙虎斗 +現役看護婦 +瑞士迷你枪 +甩卖仿真枪 +田丸爱全集 +田丸爱种子 +甲基可可碱 +甲基肼供应 +甲基肼批发 +甲基肼提供 +甲基肼直销 +甲基肼销售 +甲基苯丙胺 +甲基麻黄素 +甲氧麻黄酮 +电击枪供应 +电击枪出售 +电手狗出售 +电棍仿真枪 +电狗仿真枪 +电话拦截器 +电雷管出售 +电驴1本道 +町山茜无码 +畲祥林冤案 +疯狂的抽插 +疾病业债说 +痛批政法委 +痴汉是犯罪 +白咲舞无码 +白嫩美女穴 +白牙签qq +白牙签买卖 +白牙签出售 +白牙签批发 +白牙签提供 +白牙签直销 +白牙签订购 +白石瞳种子 +白磷燃烧弹 +白粉海洛因 +白金娱乐城 +白鸟樱无码 +白鸟樱种子 +百家乐真钱 +百家乐赌博 +百家乐转盘 +百家博彩网 +百家性黄站 +百性阁论坛 +百行教师贱 +皇冠博彩网 +皇冠娱乐城 +皇冠投注网 +皇冠注投网 +皇冠百家乐 +皇冠网赌球 +皇冠赌博网 +皇冠赌球网 +皇冠足球网 +盐酸哌替啶 +盐酸曲马多 +盐酸氯胺酮 +盐酸羟亚胺 +盐酸麻黄碱 +盐酸麻黄素 +盛雪辛灏年 +直出弹簧刀 +直播脱衣服 +直销3唑仑 +直销3棱刀 +直销bb弹 +直销bb枪 +直销丙烯醛 +直销乌头碱 +直销乖乖水 +直销乖乖药 +直销乙烯砜 +直销乙硼烷 +直销催情水 +直销催情液 +直销催情粉 +直销军用刀 +直销军警服 +直销冰牙签 +直销古柯碱 +直销可卡因 +直销可待因 +直销听话水 +直销听话药 +直销喵喵药 +直销地高辛 +直销安纳咖 +直销小冰砖 +直销开他敏 +直销开山刀 +直销异丁腈 +直销弹簧刀 +直销战术刀 +直销户外刀 +直销手木仓 +直销摇头丸 +直销朝鲜冰 +直销毕业证 +直销气动狗 +直销气步枪 +直销氧化铊 +直销氯乙酸 +直销氯磺酸 +直销氯胺酮 +直销汽枪网 +直销汽步枪 +直销汽猎枪 +直销汽短狗 +直销汽长狗 +直销海乐神 +直销液态冰 +直销烯丙胺 +直销狙击弩 +直销狩猎弩 +直销猎木仓 +直销甲基肼 +直销白牙签 +直销砷化氢 +直销碘甲烷 +直销磷化锌 +直销秃鹰枪 +直销美沙酮 +直销羰基镍 +直销苍蝇水 +直销蒙汗药 +直销赌博粉 +直销赵氏弩 +直销迷幻水 +直销迷情粉 +直销迷情药 +直销迷魂水 +直销迷魂烟 +直销迷魂粉 +直销酣乐欣 +直销醋酸汞 +直销野战刀 +直销钢珠枪 +直销钻石冰 +直销长治筋 +直销麦角酸 +直销麻黄碱 +直销麻黄素 +直销黄牙签 +相户爱全集 +相泽梦全集 +相泽梦种子 +相田凉无码 +看b加胃信 +看免费a片 +看妹妹脱光 +真、善、忍 +真n善n忍 +真人娱乐城 +真人脱衣秀 +真人裸聊网 +真人赌球网 +真实自拍片 +真木今日子 +真树樱无码 +真钱买假钱 +真钱博彩网 +真钱扎金花 +真钱斗地主 +真钱游戏网 +真钱百家乐 +真龙娱乐城 +眯眯俱乐部 +着护士的胸 +短信接收器 +短信群发器 +石川优无码 +砷化氢供应 +砷化氢批发 +砷化氢直销 +硕大的肉棒 +硕大的龟头 +硝酸胺炸药 +硝酸铵出售 +硬大黑粗长 +碘甲烷供应 +碘甲烷批发 +碘甲烷直销 +碘甲烷销售 +磷化锌供应 +磷化锌批发 +磷化锌提供 +磷化锌直销 +礼花弹批发 +视频性爱网 +视频摸奶秀 +视频裸y聊 +视频裸体秀 +神州忏悔录 +神通加持法 +神风大乱交 +神鬼18妓 +祼聊聊天室 +私人服务器 +私处的秘密 +秃鹰支付宝 +秃鹰枪qq +秃鹰枪专卖 +秃鹰枪供应 +秃鹰枪批发 +秃鹰枪提供 +秃鹰枪直销 +秃鹰枪订购 +秃鹰枪购买 +秃鹰枪销售 +秃鹰气枪网 +秋元希无码 +秦氏弩买卖 +秦氏弩出售 +秦氏弩提供 +秦氏弩购买 +空中民主墙 +空天使全集 +窝囊的中国 +竖山爱bt +站立式性交 +笠木忍无码 +笠木忍种子 +第1次3p +第1爽图区 +第2炮半价 +第4色快播 +第4色成人 +筱原凉种子 +简易炸药包 +简易燃烧弹 +粉嫩小淫穴 +粉嫩的小沟 +粉嫩的洞洞 +粗……肉洞 +粗大的肉棒 +粗大的龟头 +粗肉棒阴户 +粗鸡巴嫩穴 +精仿身份证 +精品性交图 +精品钢珠枪 +精子提供者 +精液喷入穴 +紅 燈 區 +素人俱乐部 +素女,自拍 +紧紧的小穴 +給處女開苞 +红太祖本纪 +红朝谎言录 +红楼 绮梦 +红楼春上春 +红潮谎言录 +红矾钠供应 +红矾钠批发 +红色的小穴 +红降汞供应 +红降汞批发 +红降汞提供 +约火包平台 +约看小黄片 +纪念赵紫阳 +纯情小处男 +纵情兵团眼 +纸包梦惊魂 +纹舞兰种子 +纽扣摄像机 +线上老虎机 +线上赌博城 +绀堂司无码 +经典3级片 +经营汽狙狗 +给处女开苞 +继母的爱液 +绫波凉无码 +绫波凉种子 +罂粟粉供应 +罂粟粉批发 +罂粟花出售 +网上老虎机 +网上赌博机 +网上问总理 +网游之亵渎 +网络6合彩 +网络赌博机 +美咲唯bt +美咲唯全集 +美咲唯无码 +美咲唯电驴 +美国迷幻水 +美女 淫穴 +美女1笑散 +美女b毛图 +美女伴我游 +美女全脱图 +美女包夜了 +美女图片网 +美女很寂寞 +美女捰聊网 +美女李万姬 +美女极品穴 +美女校花裸 +美女求包养 +美女满足你 +美女穴自拍 +美女约炮网 +美女聊天室 +美女脱衣图 +美女色导航 +美女色电影 +美女裸聊室 +美女裸聊网 +美女野球拳 +美女鸡吧图 +美少女中潮 +美少女包夜 +美少女麻雀 +美巨乳自慰 +美沙酮供应 +美沙酮出售 +美沙酮批发 +美沙酮提供 +美沙酮直销 +美沙酮订购 +美版玉蒲团 +美腿小护士 +羔羊大律师 +羟亚胺出售 +群丑闹中华 +群交电影网 +群发广告机 +羰基镍供应 +羰基镍提供 +羰基镍直销 +羰基镍销售 +老婆爱上我 +老师我要射 +老师的小穴 +老师的淫液 +老猎枪出售 +老猎枪销售 +而卧来的搜 +聊天室裸聊 +聊斋花弄月 +肉体的恶魔 +肉棍干騷婦 +肉棍干骚妇 +肉棒 高潮 +肉棒好大啊 +肉棒好粗啊 +肉棒好粗插 +肉棒小浪穴 +肉棒插入嘴 +肉棒插入肉 +肉棒插淫水 +肉棒插肉缝 +肉棒插蜜穴 +肉欲按摸师 +肉淫器吞精 +肉缝 嫩嫩 +肉缝小肉穴 +肉色连裤袜 +肏妹妹淫屄 +肏屄好舒服 +肏我的小屄 +肏烂你的屄 +肏穴好舒服 +肛jiao +肛交巨乳妹 +肝肾源买卖 +肥嫩的阴唇 +肥嫩的阴穴 +肥嫩的阴部 +肥美的阴唇 +肾源中介网 +肾源天下网 +胡椒醛出售 +胯下有神器 +胴体的诱惑 +胺吗啡出售 +脱氧麻黄素 +脱衣聊天室 +脱衣裸聊网 +自制土炸弹 +自制土炸药 +自制大土炮 +自制手枪买 +自制手枪卖 +自制手枪售 +自制枪买卖 +自制枪出售 +自制枪销售 +自制烟雾弹 +自制燃烧弹 +自制燃烧瓶 +自制电雷管 +自拍乱伦片 +自由写作奖 +至尊娱乐城 +至尊百家乐 +致命女人心 +臺灣共和國 +臺灣共產黨 +舌头很厉害 +舐她的小穴 +舔哥哥鸡巴 +舔她的花蕊 +舔弄大阴唇 +舔弄小鸡鸡 +舔我的龟头 +舔舔更高潮 +舔蜜穴好爽 +舔阴自慰器 +舞男真面目 +舞铃笙3女 +色中色a片 +色中色地址 +色中色社区 +色中色网站 +色中骚综合 +色人阁成人 +色人阁网址 +色农夫影院 +色博5月天 +色哥哥影院 +色哥哥论坛 +色图片网站 +色女脱衣秀 +色妹妹影院 +色妹妹成人 +色妹妹淫穴 +色妹妹电影 +色妹妹裸聊 +色悠悠成仁 +色情 导航 +色情1级片 +色情2级片 +色情3级片 +色情4情妹 +色情5月天 +色情人与兽 +色情声讯台 +色情小游戏 +色情小电影 +色情成人网 +色情武侠片 +色情电子书 +色情电影网 +色情直播室 +色情聊天室 +色成人社区 +色播电影网 +色欲与纯情 +色欲居导航 +色狐狸网址 +色狗狗影院 +色狼5月天 +色狼中的浪 +色狼俱乐部 +色狼友综合 +色狼导航网 +色狼窝av +色狼窝下载 +色狼窝在线 +色狼窝小说 +色电影下载 +色百合导航 +色网址大全 +色网址导航 +色网址联盟 +色老头论坛 +色老汉av +色老汉导航 +色聊聊天室 +色色5月天 +色色人体图 +色色播电影 +色色淫情网 +色诱影院网 +色酷色影院 +色魔裸聊网 +色鸡巴电影 +艳女销魂泪 +艳照门全集 +艳照门大全 +艳照门视频 +艹句永曰曰 +花和尚影院 +花和尚社区 +苍井空bt +苍井空下载 +苍井空乳交 +苍井空全集 +苍井空电驴 +苍井空种子 +苍井空网盘 +苍井葵无码 +苍蝇性药水 +苍蝇水供应 +苍蝇水提供 +苍蝇水直销 +苍蝇水订购 +苍蝇水销售 +苍蝇粉供应 +苍蝇粉出售 +苍蝇粉批发 +苍蝇粉提供 +苍蝇粉直销 +苍蝇粉订购 +苍蝇粉购买 +苍蝇粉销售 +若林蕾无码 +若野爱bt +茉莉花革命 +草你娘的怼 +草榴导航网 +草榴社区网 +荡女诉心声 +药物毒品类 +莲妓艳情史 +萩原舞下载 +董存瑞他妈 +董存瑞来电 +蒋公纪念歌 +蒋大彬群p +蒋彦永上书 +蒙汗药专卖 +蒙汗药买卖 +蒙汗药出售 +蒙汗药提供 +蒙汗药直销 +蒙汗药订购 +蒙汗药配方 +蓝盾百家乐 +蔣彥永上書 +薰樱子无码 +薰樱子种子 +藤浦惠种子 +虎尾模型枪 +虎牙刀专卖 +虎骑成人网 +蜘蛛刀专卖 +蜘蛛刀出售 +蜘蛛刀提供 +蜜桃成熟时 +蜜糖俏女佣 +蜡烛烧阴茎 +蝴蝶刀专卖 +蝴蝶刀价格 +蝴蝶刀供应 +蝴蝶刀出售 +蝴蝶刀批发 +蝴蝶刀直销 +蝴蝶刀订购 +蝴蝶谷黄站 +血是在广场 +血染的风采 +血洒天安门 +血洗天安門 +血洗天安门 +血灑天安門 +表舅妈与我 +袖珍手枪买 +袖珍手枪卖 +袖珍手枪售 +袖珍麻醉枪 +被女人玩弄 +裆下很忧郁 +裙中性运动 +裤裆有杀气 +裸q聊现场 +裸体插淫穴 +裸体激情秀 +裸体聊天室 +裸体聊天网 +裸体陪聊天 +裸着体聊天 +裸聊yy号 +裸聊俱乐部 +裸聊女qq +裸聊性伴侣 +裸聊网视频 +裸聊聊天室 +裸身玩自摸 +西点军刀网 +西田茜无码 +西藏,独立 +要爽就找我 +观看淫电影 +解体的命运 +解放军镇压 +解放軍鎮壓 +討伐中宣部 +警官证供应 +警察证出售 +警用品供应 +警用小口径 +警用枪出售 +订购3棱刀 +订购丛林刀 +订购乖乖水 +订购仿真枪 +订购催情液 +订购冰牙签 +订购双管猎 +订购古柯叶 +订购可待因 +订购听话药 +订购喵喵药 +订购大冰砖 +订购安纳咖 +订购打鸟枪 +订购摇头丸 +订购气动狗 +订购气木仓 +订购氯胺酮 +订购水果冰 +订购汽步枪 +订购汽短狗 +订购汽长狗 +订购海乐神 +订购爆破剂 +订购狙击枪 +订购狩猎弩 +订购秃鹰枪 +订购美沙酮 +订购蒙汗药 +订购虎牙刀 +订购迷幻药 +订购迷情粉 +订购迷情药 +订购迷魂烟 +订购迷魂香 +订购醋酸铊 +订购野战刀 +订购钢珠枪 +订购长治筋 +订购阻击弩 +订购麻醉枪 +订购麻黄碱 +讨伐中宣部 +证件制作网 +诱惑女教师 +诱惑裸聊网 +谁与她同床 +调查婚外情 +谷露影院网 +豪情夜生活 +賣B發論公 +败类马洪亮 +贩卖摇头丸 +购买仿真枪 +购买假币网 +购买假文凭 +购买可卡因 +购买射击枪 +购买木邦刀 +购买气动狗 +购买气步枪 +购买汽手枪 +购买汽步枪 +购买汽长狗 +购买海洛因 +购买狙击枪 +购买秃鹰枪 +购买赌博粉 +购买迷幻药 +购买迷昏药 +购买银行卡 +贯通两极法 +贱妇汤加丽 +赌博粉专卖 +赌博粉供应 +赌博粉批发 +赌博粉提供 +赌博粉销售 +赌博药供应 +赌博药出售 +赌博药批发 +赌博药提供 +赌博药直销 +赌博药订购 +赌博药销售 +赌场在线网 +赌城快活女 +赌球娱乐城 +赤裸性游戏 +赤裸聊天室 +赵 紫 阳 +赵氏弩专卖 +赵氏弩买卖 +赵氏弩供应 +赵氏弩出售 +赵氏弩批发 +赵氏弩销售 +赵颖艾未未 +起爆药出售 +起爆药制作 +起爆药批发 +起爆药销售 +超强护士团 +超极品教师 +超正学生妹 +超级照相机 +超速性快感 +趙 紫 陽 +足本玉蒲团 +足球,博彩 +身份证出售 +身份证生成 +輪奸大美女 +转让2手弩 +转让3棱刀 +转让bb弹 +转让bb枪 +转让丛林刀 +转让兰博刀 +转让军用刀 +转让军用弩 +转让军警服 +转让大砍刀 +转让开山刀 +转让弹簧刀 +转让战术刀 +转让手木仓 +转让气动狗 +转让气木仓 +转让气步枪 +转让汽步枪 +转让汽短狗 +转让汽长狗 +转让猎木仓 +转让秃鹰枪 +转让秦氏弩 +转让蝴蝶刀 +转让野战刀 +转让钢珠枪 +转让麻醉枪 +轮奸大美女 +轮奸女警察 +轮盘百家乐 +辦公室淫亂 +达米宣教会 +进口枪出售 +连环百家乐 +迷奸小姨子 +迷奸小电影 +迷奸水专卖 +迷奸粉买卖 +迷奸药出售 +迷幻水买卖 +迷幻水供应 +迷幻水出售 +迷幻水批发 +迷幻水提供 +迷幻水直销 +迷幻水订购 +迷幻水购买 +迷幻水销售 +迷幻药qq +迷幻药供应 +迷幻药出售 +迷幻药批发 +迷幻药销售 +迷情乖乖水 +迷情水交易 +迷情水供应 +迷情水出售 +迷情水批发 +迷情水销售 +迷情粉供应 +迷情粉出售 +迷情粉提供 +迷情粉直销 +迷情粉订购 +迷情粉购买 +迷情粉销售 +迷情药供应 +迷情药批发 +迷情药提供 +迷情药直销 +迷情药订购 +迷情药购买 +迷情药配方 +迷昏药买卖 +迷昏药供应 +迷昏药销售 +迷晕药供应 +迷晕药批发 +迷晕药直销 +迷晕药购买 +迷晕药销售 +迷离的嫂嫂 +迷香药供应 +迷香药批发 +迷香药提供 +迷香药直销 +迷香药订购 +迷香药购买 +迷香药销售 +迷魂水出货 +迷魂水到货 +迷魂水订购 +迷魂烟供应 +迷魂烟批发 +迷魂烟提供 +迷魂烟直销 +迷魂烟订购 +迷魂烟购买 +迷魂粉出货 +迷魂粉到货 +迷魂粉订购 +迷魂药出售 +迷魂药出货 +迷魂药到货 +迷魂药品卖 +迷魂药水1 +迷魂药订购 +迷魂药配方 +迷魂药香烟 +迷魂香专卖 +迷魂香买卖 +迷魂香供应 +迷魂香批发 +迷魂香提供 +迷魂香直销 +迷魂香订购 +迷魂香购买 +迷魂香销售 +退dang +退出党团队 +退出共产党 +选国家主席 +速效迷奸药 +遊戲發獎員 +邓 笑 贫 +邓颖超日记 +郝金安冤案 +郭 岩 华 +郭 岩 華 +都市品香录 +鄧 笑 貧 +酣乐欣专卖 +酣乐欣买卖 +酣乐欣供应 +酣乐欣出售 +酣乐欣批发 +酣乐欣提供 +酣乐欣直销 +酣乐欣销售 +酸甘油炸药 +醉笑卧乡野 +醋酸汞批发 +醋酸铊供应 +醋酸铊直销 +重亚硒酸钠 +重返天安门 +野战刀批发 +野战刀提供 +野战刀直销 +野战刀转让 +野营军刀网 +野营刀专卖 +野营生存刀 +金宝博滚球 +金属彷真枪 +金属手拉机 +金属手拉鸡 +金彩娱乐城 +金毛学生妹 +金瓶梅下载 +金瓶梅禁传 +针孔摄像头 +针孔摄像机 +针孔摄象机 +钢珠左轮枪 +钢珠弩出售 +钢珠枪qq +钢珠枪专卖 +钢珠枪买卖 +钢珠枪供应 +钢珠枪出售 +钢珠枪直销 +钢珠枪订购 +钢珠枪转让 +钢珠枪销售 +钢珠枪预订 +钻石冰出售 +钻石冰出货 +钻石冰订购 +钻石冰销售 +铃木麻奈美 +铅弹枪出售 +银河娱乐场 +银行卡专卖 +银行卡买卖 +银行卡复制 +销售3唑仑 +销售3棱刀 +销售92式 +销售cs狗 +销售ppk +销售x卧底 +销售丙烯醛 +销售丛林刀 +销售乌头碱 +销售乖乖水 +销售乙烯砜 +销售乙硼烷 +销售人民币 +销售仿真枪 +销售假文凭 +销售假硬币 +销售假钞票 +销售催情水 +销售冰古毒 +销售卡西酮 +销售反恐弩 +销售古柯叶 +销售可待因 +销售听话水 +销售喵喵药 +销售土炸药 +销售地高辛 +销售大冰砖 +销售失忆水 +销售安乐死 +销售安纳咖 +销售左轮枪 +销售开山刀 +销售异丁腈 +销售弓弩弦 +销售弹簧刀 +销售手木仓 +销售手榴弹 +销售摇头丸 +销售散弹枪 +销售散弹狗 +销售气手枪 +销售气木仓 +销售气枪阀 +销售氧化铊 +销售氯乙酸 +销售氯磺酸 +销售氯胺酮 +销售氰化钾 +销售汽手狗 +销售汽步枪 +销售沙菲片 +销售海乐神 +销售烯丙胺 +销售狙击弩 +销售狙击枪 +销售狩猎刀 +销售狩猎弩 +销售猎木仓 +销售甲基肼 +销售砷化氢 +销售磷化锌 +销售秃鹰枪 +销售秃鹰管 +销售秦氏弩 +销售羰基镍 +销售致癌药 +销售芬太尼 +销售苍蝇水 +销售蒂巴因 +销售蝴蝶刀 +销售警官证 +销售警察证 +销售警用刀 +销售赌博药 +销售起爆器 +销售身份证 +销售迷情药 +销售迷昏药 +销售迷魂水 +销售迷魂粉 +销售迷魂香 +销售酣乐欣 +销售醋托啡 +销售野战刀 +销售钢珠弩 +销售钢珠枪 +销售长治筋 +销售防暴枪 +销售雷鸣登 +销售驾驶证 +销售麦角酸 +销售麻醉枪 +销售麻黄碱 +销售麻黄素 +销售黑索金 +镜丽子种子 +长治筋买卖 +长治筋供应 +长治筋出售 +长治筋批发 +长治筋提供 +长治筋直销 +长治筋订购 +长治筋购买 +长治筋销售 +长泽梓种子 +长濑爱种子 +闪光弹制作 +防暴枪买卖 +防暴枪批发 +防暴枪订购 +防暴枪销售 +阳江刀具网 +阴唇好嫩啊 +阴穴新玩法 +阴茎插小穴 +阴道好紧啊 +阴道好肥啊 +阿姨的小穴 +阿普唑仑片 +附近曰薇芯 +陪睡的女人 +陰穴新玩法 +隐形,耳机 +隐形摄像机 +雇佣杀手网 +雇打手qq +雇杀手qq +雇杀手报仇 +雨宫琴种子 +雪山狮子旗 +雪白的肥臀 +雷明登猎狗 +雷明顿出售 +雷明顿销售 +青天白日旗 +青木琳种子 +青楼十2房 +青海无上师 +青蛙们献血 +静态爆破剂 +韓 東 方 +韓 聯 潮 +韩 东 方 +韩 联 潮 +预订醋酸铊 +颠覆,中共 +风流1夜情 +风流艳世录 +风骚女秘书 +风骚小护士 +风骚小阿姨 +飞易vpn +饭岛惠种子 +饭岛爱bt +饭岛爱种子 +饱暖思淫欲 +香山圣种子 +香港6合彩 +香港6和采 +香港ghb +香港激情夜 +香烟型迷药 +香蕉粗又硬 +驱妖女仆队 +驾驶证代办 +骗到党中央 +骗到国务院 +骗奸女邻居 +骚b学生妹 +骚妹妹爽片 +骚姐乱伦网 +骚姐姐爽片 +骚屄娘们儿 +骚淫女论坛 +骚的性感的 +骚老师电影 +高价收肾源 +高价收肾脏 +高仿人民币 +高仿学位证 +高仿户口本 +高仿毕业证 +高仿真枪网 +高仿证qq +高仿证代办 +高仿证供应 +高仿身份证 +高压狗QQ +高效3唑仑 +高清av片 +高级应招女 +高纯度冰砖 +高见凉种子 +高野瞳合集 +魏 新 生 +鸟巢最少死 +鸡吧菊花穴 +鸡巴插嫩穴 +鸡巴插小穴 +鸡巴插进穴 +鸭子找女人 +鸿运娱乐城 +鹿城黄站图 +麦角乙二胺 +麦角胺批发 +麦角胺提供 +麦角酸qq +麦角酸供应 +麦角酸出售 +麦角酸出货 +麦角酸到货 +麦角酸直销 +麦角酸订购 +麦角酸购买 +麦角酸配方 +麦角酸销售 +麦角醇供应 +麦角醇销售 +麻古的配方 +麻木堇无码 +麻果k粉买 +麻醉枪专卖 +麻醉枪出售 +麻醉枪销售 +麻醉药出售 +麻黄碱批发 +麻黄碱提取 +麻黄碱销售 +麻黄素qq +麻黄素买卖 +麻黄素供应 +麻黄素出售 +麻黄素出货 +麻黄素到货 +麻黄素批发 +麻黄素订购 +麻黄素配方 +麻黄素销售 +黄se图片 +黄se小说 +黄se电影 +黄se网址 +黄se网站 +黄牙签专卖 +黄牙签买卖 +黄牙签出售 +黄牙签批发 +黄牙签提供 +黄牙签直销 +黄牙签订购 +黄电影下载 +黄色,电影 +黄色3级片 +黄色av片 +黄色三级片 +黄色动漫图 +黄色小电影 +黄色小说网 +黄色成人网 +黄色激情片 +黄色电影网 +黄色的女人 +黄色裸聊网 +黄骚冰供应 +黑暗的社会 +黑木耳裸聊 +黑火药供应 +黑火药出售 +黑火药制作 +黑火药制造 +黑火药成分 +黑火药比例 +黑火药爆炸 +黑火药配方 +黑火药配比 +黑火药销售 +黑索今供应 +黑索金供应 +黑索金制作 +黑诱惑痴女 +黑鹰弩专卖 +黑鹰弩出售 +齐藤司无码 +龙凤419 +龙博娱乐城 +龙战士传说 +龙虎斗网站 +龟头插小穴 +0售k粉qq +0售汽枪配件 +16dy图库 +18av影院 +18dy免费 +18dy影院 +18dy村妓 +18dy桃色 +18dy电影 +18色情动漫 +1989事件 +1代女皇艳史 +1元假币出售 +1元假币销售 +1元假钱出售 +1元假钱销售 +1元激情电影 +1元硬币供应 +1夜情ons +1夜情交友网 +1夜情俱乐部 +1夜情聊天室 +1夜情裸聊室 +1夜情裸聊网 +1夜激情网站 +1夜速战速决 +1本道avi +1本道电影网 +1次性福就好 +1点色成人网 +1色志乃无码 +1起啪啪啪啪 +1起干妹妹网 +1边1国独裁 +1逼情色情网 +2异酸甲苯酯 +2手大黑鹰弩 +2手弓弩出售 +2手弓弩设备 +2手弓弩转让 +339乘元功 +360博彩通 +365情色网 +365赌球网 +366娱乐城 +38淫成人网 +3d性爱游戏 +3d性爱电影 +3d成人游戏 +3d成人电影 +3p乱交图片 +3p美女图片 +3去车仑工力 +3唑仑专卖店 +3唑仑片qq +3唑仑片专卖 +3唑仑片价格 +3唑仑片供应 +3唑仑片提供 +3唑仑迷魂药 +3宫里绪无码 +3对夫妇换妻 +3对夫妻淫照 +3对夫妻群p +3对夫妻裸照 +3棱军刀专卖 +3棱军刀买卖 +3棱军刀供应 +3棱军刀批发 +3棱军刀提供 +3棱军刀直销 +3棱军刀订购 +3棱军刺专卖 +3棱军刺买卖 +3棱军刺供应 +3棱军刺批发 +3棱军刺直销 +3棱军刺转让 +3棱军刺销售 +3棱刀具专卖 +3棱刀具买卖 +3棱刀具供应 +3棱刀具出售 +3棱刀具批发 +3棱刀具提供 +3棱刀具直销 +3棱刀具销售 +3棱刮刀供应 +3棱刮刀出售 +3棱刮刀批发 +3棱刮刀提供 +3棱刮刀订购 +3棱刮刀购买 +3棱刮刀销售 +3棱刺刀批发 +3棱尖刀专卖 +3棱尖刀买卖 +3棱尖刀供应 +3棱尖刀批发 +3棱尖刀提供 +3棱尖刀直销 +3棱尖刀订购 +3棱尖刀购买 +3步倒麻醉箭 +3田爱表无码 +3硝基2甲苯 +3箭气枪qq +3箭气枪供应 +3箭气枪出售 +3箭气枪到货 +3箭气枪批发 +3箭气枪提供 +3箭气枪电话 +3箭气枪直销 +3箭气枪订购 +3箭气枪购买 +3箭气枪销售 +3箭气狗专卖 +3箭气狗出售 +3箭气狗提供 +3箭汽枪专卖 +3箭汽枪出售 +3箭汽枪直销 +3箭汽枪销售 +3级影片下载 +3级淫水写真 +3陪视频裸聊 +45mm狗粮 +4号白冰出售 +4号白粉出售 +4号白粉销售 +51淫色导航 +527我爱妻 +52异性社区 +52淫色导航 +53淫色导航 +54式枪专卖 +54手枪qq +54手枪专卖 +54手枪买卖 +54手枪价格 +54手枪供应 +54手枪出售 +54手枪出让 +54手枪售出 +54手枪批发 +54手枪提供 +54手枪直销 +54手枪订购 +54手枪销售 +54手狗买卖 +54手狗出售 +54手狗销售 +54枪支专卖 +54枪支买卖 +54枪支出售 +54枪支销售 +54气枪买卖 +54短狗专卖 +56军刺专卖 +56军刺供应 +5元假币直销 +610办公室 +610洗脑班 +6425周年 +64内部日记 +64学生运动 +64学生领袖 +64手枪专卖 +64手枪买卖 +64手枪出售 +64手枪订购 +64手枪销售 +64民主运动 +64短狗专卖 +654k改火 +68插穴色网 +69人体艺术 +6合同彩开奖 +6合彩下注网 +6合彩娱乐网 +6合彩现金网 +6月4日纪念 +70天大事记 +77手枪专卖 +77手枪出售 +77手枪批发 +77手枪提供 +77手枪订购 +77手枪购买 +77手枪销售 +77枪支出售 +77猎枪出售 +8090性爱 +81军刺专卖 +89年的斗争 +89民主运动 +8的平方事件 +90后黄色片 +911博彩通 +92式枪专卖 +92手枪专卖 +92手枪出售 +92手枪销售 +92手狗出售 +92枪支出售 +97式防暴枪 +97色色导航 +999日本妹 +99情色论坛 +aaa级黄图 +ak军刺订购 +av下载地址 +av下载网站 +av亚洲色图 +av伦理电影 +av做爱换妻 +av动漫下载 +av动漫在线 +av在线影院 +av在线观看 +av天堂影院 +av女优影片 +av女优杏子 +av女优种子 +av影片下载 +av影片种子 +av快播下载 +av快播电影 +av性本色网 +av性爱电影 +av成人下载 +av成人影院 +av成人电影 +av成人视频 +av无码下载 +av无码影院 +av无码爽片 +av无码视频 +av欧美影院 +av激情电影 +av电影导航 +av种子下载 +av高清视频 +a片下载地址 +a片下载网站 +a片下载链接 +a片在线影院 +a片基地网址 +a片快播影院 +a片无码下载 +a片电影网址 +a片电驴下载 +a片网址下载 +a片网站地址 +a片迅雷种子 +bb体育投注 +bt成人无码 +bt淫色电影 +bt淫色贴图 +bt激情无码 +bt色情工厂 +c4制作方法 +C4塑胶炸药 +c4炸弹配方 +c4炸药直销 +cdjp李鹏 +cocain +d9军刺供应 +d9军刺军刀 +d9军刺出售 +ddk迷奸药 +DIY原子弹 +diy燃烧弹 +diy燃烧瓶 +ed2k无码 +e利博娱乐城 +e夜情俱乐部 +e夜情聊天室 +fa lun +falun功 +fofg妈的 +fuck万税 +fuck上你 +fuck上妳 +fuck他妈 +fuck他爹 +fuck倭国 +fuck倭寇 +fuck傻b +fuck傻卵 +fuck傻吊 +fuck傻子 +fuck傻屄 +fuck傻比 +fuck傻逼 +fuck卖国 +fuck台办 +fuck台独 +fuck台联 +fuck吴仪 +fuck售号 +fuck外挂 +fuck天皇 +fuck太监 +fuck孙文 +fuck射精 +fuck小泉 +fuck小穴 +fuck性交 +fuck性爱 +fuck我干 +fuck我操 +fuck我日 +fuck手淫 +fuck推油 +fuck新党 +fuck是鸡 +fuck氵去 +fuck温馨 +fuck煞逼 +fuck特码 +fuck王刚 +fuck王昊 +fuck王震 +fuck石进 +fuck私服 +fuck系统 +fuck网管 +fuck舔西 +fuck色情 +fuck退党 +fuck邪教 +fuck食屎 +fuck鲜族 +fx气皇专卖 +fx气皇出售 +gay网导航 +ghb水出售 +ghb水销售 +g片免费下载 +heroin +h动漫图片网 +h动漫快播网 +h日本动漫h +h片下载qq +h片网站qq +jia币出售 +jia币销售 +jj插入嫩穴 +kk情色交友 +k粉4号出售 +k粉买卖qq +k粉价格qq +k粉供应qq +k粉出售qq +k粉出售电话 +k粉制作工艺 +k粉制造技术 +k粉制造过程 +k粉售卖qq +k粉批发qq +k粉提供qq +k粉猪肉出售 +k粉联系qq +k粉购买qq +k粉送货qq +k粉送货上门 +k粉销售qq +k粉麻古批发 +k粉麻果qq +lsd迷幻药 +luo聊qq +luo聊表演 +m3长刺专卖 +m9军刀专卖 +m9军刀批发 +m9长刺专卖 +meinv穴 +mm上门爱爱 +mm兼职服务 +mm按摩服务 +mm收费视频 +mm激情视屏 +mm激情视频 +mm的小嫩穴 +mm视频裸聊 +mm脱衣裸聊 +mm被干小穴 +mm裸聊qq +mo擦小肥穴 +mt虎牙专卖 +ooxx人妻 +pcp支付宝 +pcp气枪网 +pcp汽枪网 +petn制作 +petn制取 +petn合成 +pp点点激情 +qq专卖假钞 +qq专卖吗啡 +qq专卖手铐 +qq专卖猎枪 +qq专卖跳刀 +qq专卖麻古 +qq买卖k粉 +qq买卖军刺 +qq买卖冰毒 +qq买卖手枪 +qq买卖麻古 +qq交友裸聊 +qq代办发票 +qq代办证件 +qq代办驾照 +qq代开税票 +qq仿真气枪 +qq供应k粉 +qq供应假币 +qq供应假证 +qq供应军刀 +qq供应军刺 +qq供应冰毒 +qq供应冰砖 +qq供应吗啡 +qq供应大麻 +qq供应弓弩 +qq供应春药 +qq供应枪支 +qq供应猎刀 +qq供应白冰 +qq供应白砒 +qq供应白粉 +qq供应砷酸 +qq供应肾源 +qq供应迷药 +qq供应铊盐 +qq供应麻古 +qq供应麻果 +qq供应麻谷 +qq假币买卖 +qq假币出售 +qq假币销售 +qq假证办理 +qq假钞专卖 +qq假钞买卖 +qq假钞出售 +qq假钞销售 +qq假钱批发 +qq免费裸聊 +qq军刀直销 +qq军刀订购 +qq军刺提供 +qq军刺购买 +qq冰毒买卖 +qq冰毒出售 +qq冰毒批发 +qq冰毒销售 +qq出售k粉 +qq出售假币 +qq出售假证 +qq出售假钞 +qq出售假钱 +qq出售军刀 +qq出售军刺 +qq出售冰毒 +qq出售冰砖 +qq出售匕首 +qq出售发票 +qq出售吗啡 +qq出售地雷 +qq出售大麻 +qq出售弓弩 +qq出售手枪 +qq出售手狗 +qq出售春药 +qq出售枪管 +qq出售步枪 +qq出售气枪 +qq出售汽枪 +qq出售猎枪 +qq出售白冰 +qq出售真枪 +qq出售砍刀 +qq出售纯冰 +qq出售警服 +qq出售迷药 +qq出售铊盐 +qq出售鞭炮 +qq出售骚冰 +qq出售麻古 +qq出售麻果 +qq制作k粉 +qq制作冰毒 +qq制办假证 +qq办假证书 +qq办假证件 +qq办假驾照 +qq办理假证 +qq包夜热线 +qq卖散弹狗 +qq卖热武器 +qq发票代开 +qq在线裸聊 +qq大麻批发 +qq妓女上门 +qq妓女服务 +qq成人电影 +qq手狗专卖 +qq批发军刀 +qq批发军刺 +qq批发吗啡 +qq批发春药 +qq批发枪支 +qq批发猎枪 +qq批发白粉 +qq批发砍刀 +qq批发警服 +qq批发跳刀 +qq批发雷管 +qq批发麻古 +qq批发麻果 +qq提供k粉 +qq提供假证 +qq提供军刺 +qq提供冰毒 +qq提供大麻 +qq提供春药 +qq提供汽枪 +qq提供砍刀 +qq提供迷药 +qq提供麻古 +qq提供麻果 +qq援交上门 +qq气狗专卖 +qq汽枪供应 +qq汽枪出售 +qq汽枪提供 +qq激情裸聊 +qq炸药配方 +qq猎枪买卖 +qq白粉出售 +qq白粉批发 +qq白粉销售 +qq直销k粉 +qq直销乙醚 +qq直销假币 +qq直销军刺 +qq直销匕首 +qq直销吗啡 +qq直销大麻 +qq直销春药 +qq直销麻古 +qq真人祼聊 +qq真人裸聊 +qq视频做爱 +qq视频性爱 +qq视频裸聊 +qq线上裸聊 +qq缅古销售 +qq美女裸聊 +qq自慰视频 +qq裸体视频 +qq裸体陪聊 +qq裸聊视频 +qq裸聊网站 +qq裸聊美女 +qq裸聊色女 +qq警服销售 +qq警棍销售 +qq订购k粉 +qq订购军刀 +qq订购军刺 +qq订购冰毒 +qq订购冰砖 +qq订购吗啡 +qq订购春药 +qq订购白粉 +qq订购麻古 +qq订购麻谷 +qq证件制作 +qq购买春药 +qq购买猎枪 +qq购买白粉 +qq跳刀直销 +qq转让汽枪 +qq转让猎枪 +qq迷药批发 +qq铅弹模具 +qq铊盐出售 +qq销售k粉 +qq销售假币 +qq销售假证 +qq销售假钞 +qq销售假钱 +qq销售冰毒 +qq销售冰砖 +qq销售吗啡 +qq销售大麻 +qq销售弓弩 +qq销售手枪 +qq销售春药 +qq销售枪支 +qq销售气枪 +qq销售汽枪 +qq销售火铳 +qq销售猎枪 +qq销售白粉 +qq销售缅古 +qq销售雷管 +qq销售鞭炮 +qq销售骚冰 +qq销售麻古 +qq销售麻果 +qq销售麻谷 +qq雇佣杀手 +qq高压气枪 +qq麻古出售 +qq麻古销售 +qq麻果出售 +qq麻果批发 +qq麻果销售 +qvod成人 +sex聊天室 +se色成人网 +sm后庭器具 +sm女王调教 +sm性虐大片 +sm新图作品 +sm无码内射 +tnt的制作 +urban靠 +xb综合影院 +xing伴侣 +x卧底专业版 +x卧底增强版 +x卧底官方网 +x卧底破解版 +x卧底第4代 +zangdu +zhadan +zhayao +メ淫大代表i +丁硫环磷供应 +丁硫环磷批发 +丁硫环磷直销 +丁腈供应qq +丁香亚洲成人 +丁香成人社区 +丁香成人网站 +丁香成人色区 +丁香成人色图 +丁香成人论坛 +万盛哪找小姐 +万维读者论坛 +万能开锁钥匙 +三三九乘元功 +三棱军刺专卖 +三步倒麻醉箭 +三箭气枪出售 +上村志保无码 +上海丝袜按摩 +上海异人娼馆 +上网文凭代办 +上门丝足按摩 +上门保健服务 +上门做爱qq +上门做爱服务 +上门全套包夜 +上门包夜服务 +上门妓女qq +上门妓女服务 +上门妓女电话 +上门小姐电话 +上门性息服务 +上门性爱服务 +上门按摩小姐 +上门援交qq +上门援交信息 +上门援交婊子 +上门援交美女 +上门援交鸡婆 +上门服务妓女 +上门服务性息 +上门服务按摩 +上门特殊服务 +上门男同按摩 +上门男同服务 +上门陪睡qq +上门陪睡服务 +上门陪睡电话 +下压气枪批发 +下届总理人选 +下载av影片 +下载av电影 +下载a片网址 +下载a片网站 +下载乱伦小说 +下载亚洲色片 +下载大6色片 +下载成人影片 +下载成人视频 +下载无码av +下载日韩色片 +下载欧美色片 +下载毛片地址 +下载色情影片 +下载黄片网址 +下载黄片网站 +下载黄色动漫 +下面1直难受 +不像我让你打 +不扣钮的女孩 +不注册淫电影 +不注册看艳片 +不能使劲捏奶 +不良少女日记 +不谈情只谈性 +丑陋的中国人 +专业代人了仇 +专业仿真气枪 +专业出售k粉 +专业出售冰毒 +专业制作文凭 +专业办证qq +专业办证公司 +专业发票出售 +专业定制马刀 +专业批发警棍 +专业报仇qq +专业报仇公司 +专业杀手qq +专业狩猎气枪 +专业经销假钞 +专业美国秃鹰 +专业英国骚本 +专业销售气枪 +专买肾源qq +专买肾脏qq +专供猎豹弓弩 +专办高仿证件 +专卖3唑仑片 +专卖3棱军刀 +专卖3棱军刺 +专卖3棱刀具 +专卖3棱刺刀 +专卖3棱尖刀 +专卖64手枪 +专卖92手枪 +专卖ghb水 +专卖k粉qq +专卖仿真军刺 +专卖仿真手枪 +专卖仿真枪模 +专卖仿真步枪 +专卖仿真气枪 +专卖仿真汽枪 +专卖假人民币 +专卖假币qq +专卖假钞qq +专卖假钱qq +专卖健卫步枪 +专卖军刀qq +专卖军品刀具 +专卖军用刺刀 +专卖军用匕首 +专卖军用弓弩 +专卖冰毒qq +专卖冰砖qq +专卖出售弓弩 +专卖匕首qq +专卖匕首刀具 +专卖北朝鲜冰 +专卖单管猎枪 +专卖双刃尖刀 +专卖双管猎枪 +专卖吗啡qq +专卖喷雾迷药 +专卖国产汽枪 +专卖国产秃鹰 +专卖大麻qq +专卖工字气枪 +专卖左轮手枪 +专卖左轮手狗 +专卖弓弩qq +专卖弓弩之家 +专卖弓弩器材 +专卖慢性毒药 +专卖战术折刀 +专卖战术直刀 +专卖战神弓弩 +专卖户外刀具 +专卖手弩qq +专卖手铐qq +专卖枪械模型 +专卖步枪配件 +专卖汽狗狗粮 +专卖狙击弓弩 +专卖狙击气枪 +专卖狩猎弓弩 +专卖猎枪霰弹 +专卖猎豹弓弩 +专卖甲卡西酮 +专卖砍刀qq +专卖硝甲西泮 +专卖秃鹰气枪 +专卖秃鹰汽枪 +专卖秦氏弓弩 +专卖简易炸弹 +专卖缅古qq +专卖肝源qq +专卖肝脏qq +专卖肾源qq +专卖肾脏qq +专卖自制手枪 +专卖英国骚本 +专卖蝴蝶刀具 +专卖蝴蝶跳刀 +专卖警察手铐 +专卖警用电棍 +专卖赵氏弓弩 +专卖进口弓弩 +专卖进口气枪 +专卖进口汽枪 +专卖进口汽狗 +专卖迷奸药水 +专卖迷药qq +专卖金钟气枪 +专卖钢珠弓弩 +专卖钻石冰糖 +专卖铅弹qq +专卖铅弹气枪 +专卖销售弓弩 +专卖防身电棍 +专卖阳江刀具 +专卖阿普唑仑 +专卖高仿假钱 +专卖高仿军刺 +专卖高仿文凭 +专卖高仿汽枪 +专卖高压气枪 +专卖麻古qq +专卖麻古果子 +专卖麻果qq +专卖黄白牙签 +专用发票代开 +专销高压汽枪 +世界经济导报 +丙腈供应qq +东京无码下载 +东京热avi +东京热成人网 +东京热精选辑 +东土耳其斯坦 +东突解放组织 +东莞上门服务 +丝袜上门性息 +丝袜上门按摩 +丝袜上门服务 +丝袜妹妹兼职 +丝袜妹妹服务 +丝袜小姐qq +丝袜小姐按摩 +丝袜按摩qq +丝袜按摩服务 +丝袜无码bt +丝足上门qq +丝足性交上门 +丢解放军的脸 +两性淫乱地址 +两性淫乱贴图 +两性激情电影 +丫就不会入党 +中共十8人选 +中共十8布局 +中共政治游戏 +中共权利斗争 +中共权力斗争 +中华人民正邪 +中南海恩仇录 +中国64真相 +中国复兴论坛 +中国娱乐黄站 +中国就快消亡 +中国已经亡了 +中国应当复仇 +中国弓弩专卖 +中国弓弩直销 +中国弩弓专卖 +中国弱智现象 +中国恐怖组织 +中国成人论坛 +中国气枪销售 +中国没有自由 +中国泛蓝联盟 +中国淫女论坛 +中国股市荒诞 +中国贱射淫行 +中国过渡政府 +中央派系斗争 +中山爱里无码 +中山里菜无码 +中岛京子种子 +中森蓝子种子 +中河原椿无码 +中西里菜下载 +中里优奈种子 +中里爱菜全集 +中里爱菜种子 +临海小姐上门 +主营台版假币 +主营台版假钞 +主营高仿假币 +主营高仿假钞 +乃原深雪种子 +久保路里无码 +乐天堂娱乐城 +乐天堂赌博网 +乖乖药水出售 +乙伊耶香无码 +乙川纱良无码 +乙酸亚铊供应 +乙酸亚铊批发 +乙酸亚铊提供 +乙酸亚铊直销 +乙酸亚铊销售 +乙酸苯汞供应 +乙酸苯汞批发 +乙酸苯汞直销 +乙酸苯汞销售 +乙醚供应qq +书记群p艳照 +买卖3棱军刀 +买卖3棱军刺 +买卖3棱刀具 +买卖3棱刮刀 +买卖3棱尖刀 +买卖54手枪 +买卖54手狗 +买卖54枪支 +买卖64手枪 +买卖77手枪 +买卖92手枪 +买卖k粉qq +买卖仿真假钞 +买卖仿真手枪 +买卖仿真步枪 +买卖假人民币 +买卖假币qq +买卖假钞qq +买卖假钱qq +买卖假钱电话 +买卖兰博刀具 +买卖军用刺刀 +买卖军用枪支 +买卖冰毒qq +买卖冰砖qq +买卖原装秃鹰 +买卖双刃尖刀 +买卖双管猎枪 +买卖国产汽枪 +买卖大学文凭 +买卖弹簧跳刀 +买卖慢性毒药 +买卖战术折刀 +买卖手弩qq +买卖手枪配件 +买卖枪支qq +买卖枪支套件 +买卖气枪qq +买卖气枪子弹 +买卖狙击步狗 +买卖狙击汽枪 +买卖狩猎气枪 +买卖猎刀qq +买卖猎枪qq +买卖猎枪子弹 +买卖眼镜蛇弩 +买卖砍刀qq +买卖秃鹰套件 +买卖秃鹰汽枪 +买卖组装枪支 +买卖美秃套件 +买卖考前答案 +买卖职称证书 +买卖臊冰qq +买卖自制手枪 +买卖自制枪支 +买卖蝴蝶甩刀 +买卖蝴蝶跳刀 +买卖警察枪支 +买卖警用手枪 +买卖警用电棍 +买卖进口汽枪 +买卖迷幻香烟 +买卖迷魂药水 +买卖钻石冰砖 +买卖铅弹qq +买卖骚本配件 +买卖高仿假币 +买卖高仿军刺 +买卖鹰牌猎枪 +买卖麻古果子 +买卖麻果qq +买摇头丸配方 +买银行卡qq +乱交视频下载 +乱伦之淫穴网 +乱伦之淫骚穴 +乱伦人妻视频 +乱伦小说下载 +乱伦小说电影 +乱伦强奸小说 +乱伦强奸视频 +乱伦性交图片 +乱伦性交电影 +乱伦情色电影 +乱伦成人电影 +乱伦电影下载 +乱伦群交影片 +乱伦群交电影 +乱伦色情电影 +乱伦都市制服 +乱伦黄色电影 +乱淫美女自慰 +乱淫自拍图片 +乳交视频下载 +乳化炸药出售 +乳房小穴鸡巴 +井上佑香无码 +亚州成人社区 +亚州成人网站 +亚洲av下载 +亚洲av影讯 +亚洲av无码 +亚洲av激情 +亚洲av视讯 +亚洲av视频 +亚洲a片地址 +亚洲bt无码 +亚洲g片下载 +亚洲免费黄网 +亚洲双穴插入 +亚洲幼女援交 +亚洲性交图片 +亚洲性交电影 +亚洲性交美图 +亚洲性爱图片 +亚洲性爱视讯 +亚洲性爱美图 +亚洲情色rv +亚洲情色下载 +亚洲情色套图 +亚洲情色影院 +亚洲情色无码 +亚洲情色淫穴 +亚洲情色视讯 +亚洲情色综合 +亚洲成人动漫 +亚洲成人图片 +亚洲成人影视 +亚洲成人无码 +亚洲成人激情 +亚洲成人电影 +亚洲成人视讯 +亚洲成人色图 +亚洲成人色站 +亚洲成人黄片 +亚洲无码a片 +亚洲无码原创 +亚洲无码合集 +亚洲无码视频 +亚洲无码种子 +亚洲无码色图 +亚洲有马下载 +亚洲极品a片 +亚洲淫穴电影 +亚洲淫色网站 +亚洲激情av +亚洲激情bt +亚洲激情妹妹 +亚洲激情帖图 +亚洲激情影院 +亚洲激情淫洞 +亚洲激情淫穴 +亚洲激情论坛 +亚洲群交图片 +亚洲自由之声 +亚洲色情图片 +亚洲色情影院 +亚洲色情视讯 +亚洲色片下载 +亚洲色站大全 +亚洲风暴情色 +亚砷酸钠供应 +亚砷酸钠批发 +亚砷酸钠提供 +亚砷酸钠直销 +亚砷酸钠销售 +亚砷酸钾供应 +亚砷酸钾批发 +亚砷酸钾提供 +亚砷酸钾直销 +亚砷酸钾销售 +交友约p平台 +交换淫妻游戏 +交换淫妻电影 +交易假币qq +交警警服销售 +人体炸弹教程 +人傻波大b紧 +人兽性交影片 +人兽性交视频 +人妖av下载 +人妻乱伦视频 +人妻大奶熟女 +人妻无码下载 +人妻耻悦旅行 +人民不敢说话 +人民币百家乐 +人美b嫩图文 +仁科百华种子 +今夜你等着爽 +付费裸体聊天 +仙鹤气枪出售 +代人了仇qq +代人了仇了事 +代人了仇出气 +代制假身份证 +代办仿真假证 +代办假军官证 +代办假毕业证 +代办假警官证 +代办假证qq +代办假证公司 +代办假证电话 +代办假资格证 +代办假驾驶证 +代办博士学历 +代办发票qq +代办发票公司 +代办各类假证 +代办各类公证 +代办各类文凭 +代办各类证件 +代办国外学位 +代办国外文凭 +代办大专文凭 +代办户口qq +代办户口落户 +代办本科文凭 +代办真实学历 +代办证件qq +代办证件公司 +代办资格证书 +代办驾照价格 +代办高仿文凭 +代办高仿证书 +代办高仿证件 +代开房租发票 +代开税票qq +代理发票qq +代理发票公司 +代理发票服务 +代理台湾假币 +代理朝鲜假币 +代购手机间谍 +仲村知夏bt +仲村知夏全集 +仲村知夏无码 +仲村知夏电驴 +仲西纱香无码 +仿品军刺出售 +仿真仿真手枪 +仿真仿美秃鹰 +仿真假钞买卖 +仿真假钱出售 +仿真军刺专卖 +仿真军刺出售 +仿真军刺批发 +仿真军刺提供 +仿真军刺直销 +仿真军刺转让 +仿真军刺销售 +仿真军用枪支 +仿真手枪qq +仿真手枪供应 +仿真手枪批发 +仿真手枪直销 +仿真手枪订购 +仿真手枪转让 +仿真手枪销售 +仿真手狗转让 +仿真枪支付宝 +仿真枪械qq +仿真枪械专卖 +仿真枪械出售 +仿真枪械批发 +仿真枪模qq +仿真枪模专营 +仿真枪模出售 +仿真枪模出货 +仿真枪模到货 +仿真枪模电话 +仿真枪模订购 +仿真枪模转让 +仿真枪模销售 +仿真步枪专卖 +仿真气枪qq +仿真气枪供应 +仿真气枪出售 +仿真气枪出货 +仿真气枪到货 +仿真气枪批发 +仿真气枪提供 +仿真气枪电话 +仿真气枪订购 +仿真气枪转让 +仿真气枪销售 +仿真气枪预订 +仿真气狗专卖 +仿真气狗供应 +仿真汽枪专卖 +仿真汽枪供应 +仿真汽枪出售 +仿真汽枪批发 +仿真汽枪提供 +仿真汽枪直销 +仿真汽枪订购 +仿真汽枪购买 +仿真汽枪转让 +仿真汽枪销售 +仿真汽狗出售 +仿真狗专卖店 +仿真猎枪专卖 +仿真电狗批发 +仿真短狗qq +仿真警服专卖 +仿真警服直销 +仿真证件制作 +仿真长枪qq +仿真长狗qq +仿美秃鹰qq +仿美秃鹰出售 +仿美秃鹰订购 +仿造假身份证 +伊沙也加种子 +伊泽凉子无码 +优博娱乐qq +伟德亚洲赌博 +传授炸药配方 +伦乱小说大全 +伦理淫穴小说 +伪钞直销qq +伸入姐姐裙内 +伺候你1晚上 +住宿发票代开 +佐佐木空无码 +佐藤麻衣种子 +体育现金投注 +作弊接收设备 +作弊设备出售 +你办事我放心 +你操得我更爽 +你敢不敢狂草 +你的嫩穴好粗 +你的小穴好紧 +你的穴太紧了 +你说我说论坛 +供应1元假币 +供应3唑仑片 +供应3棱军刀 +供应3棱军刺 +供应3棱刀具 +供应3棱刮刀 +供应3棱刺刀 +供应3棱尖刀 +供应3棱毒刺 +供应3氯化砷 +供应3箭气枪 +供应3箭汽枪 +供应5连猎枪 +供应64手枪 +供应77手枪 +供应77猎枪 +供应92手枪 +供应c4炸药 +供应d9军刺 +供应fm2粉 +供应fx气皇 +供应ghb水 +供应k2香料 +供应k粉qq +供应k粉麻果 +供应丁硫环磷 +供应丁腈qq +供应丙腈qq +供应丙酮氰醇 +供应乙酸亚铊 +供应乙酸苯汞 +供应乙醚qq +供应亚砷酸钠 +供应亚砷酸钾 +供应仿制警服 +供应仿真军刀 +供应仿真军刺 +供应仿真手枪 +供应仿真枪械 +供应仿真枪模 +供应仿真步枪 +供应仿真气枪 +供应仿真汽枪 +供应仿真长狗 +供应仿美秃鹰 +供应会计师证 +供应伪钞qq +供应假人民币 +供应假军官证 +供应假币qq +供应假户口本 +供应假结婚证 +供应假证qq +供应假身份证 +供应假钞qq +供应假钱qq +供应健卫步枪 +供应健康肾源 +供应催情药水 +供应兰博刀具 +供应最新假钱 +供应军刀qq +供应军刺qq +供应军刺军刀 +供应军用刺刀 +供应军用匕首 +供应军用手枪 +供应军警装备 +供应军车套牌 +供应冰毒qq +供应冰毒出售 +供应冰毒成品 +供应冰砖qq +供应刀具qq +供应匕首qq +供应北朝鲜冰 +供应单管猎枪 +供应原装秃鹰 +供应双刃尖刀 +供应台湾秃鹰 +供应各类假证 +供应吗啡qq +供应听话药水 +供应喷雾迷药 +供应固体炸药 +供应国产手枪 +供应国产气狗 +供应国产汽枪 +供应国产秃鹰 +供应国外文凭 +供应土制炸药 +供应大麻qq +供应大黑鹰弩 +供应女性数据 +供应娥眉气枪 +供应子弹模具 +供应学历证书 +供应安乐死药 +供应山猪气枪 +供应工字气枪 +供应工字汽枪 +供应左轮手枪 +供应左轮短狗 +供应开山砍刀 +供应弓弩qq +供应弩捕狗箭 +供应弹簧刀具 +供应弹簧跳刀 +供应慢性毒药 +供应战术折刀 +供应战术直刀 +供应户外军刀 +供应户外刀具 +供应户外名刀 +供应户外砍刀 +供应手弩qq +供应手枪子弹 +供应手枪枪管 +供应手狗qq +供应打猎弓弩 +供应执勤警服 +供应放线菌酮 +供应新款假币 +供应春药qq +供应枪支qq +供应正品军刀 +供应毕业文凭 +供应毕业证书 +供应气枪qq +供应气枪配件 +供应氟乙酸胺 +供应氟乙酸钠 +供应氧氯化磷 +供应氯化亚砷 +供应氰化金钾 +供应氰甲汞胍 +供应氰胍甲汞 +供应水晶冰毒 +供应汽枪qq +供应汽枪配件 +供应治安警服 +供应海豹m9 +供应液体炸弹 +供应溴氰菊酯 +供应烟花鞭炮 +供应狗腿砍刀 +供应狩猎气枪 +供应猎刀qq +供应猎枪qq +供应猎枪子弹 +供应猎枪底火 +供应猎枪手枪 +供应现役军刀 +供应甲卡西酮 +供应甲氰菊酯 +供应甲藻毒素 +供应番木鳖碱 +供应白冰qq +供应白砒qq +供应白粉qq +供应矢车菊甙 +供应砍刀qq +供应砒霜qq +供应破氧毒素 +供应砷酸qq +供应砷酸氢汞 +供应硫酸亚铊 +供应碳酸亚铊 +供应秃鹰图纸 +供应秃鹰气枪 +供应秃鹰汽枪 +供应秦氏弓弩 +供应窃听软件 +供应简易炸弹 +供应精品军刀 +供应红海葱甙 +供应纯缅麻古 +供应绿瓦瓦管 +供应绿皮瓦管 +供应缅古qq +供应美国军刀 +供应美国秃鹰 +供应美秃套件 +供应羟基乙腈 +供应考前答案 +供应肾源qq +供应腰刀qq +供应臊冰qq +供应英国骚本 +供应莫达非尼 +供应蓖麻毒素 +供应虎头猎枪 +供应蝴蝶刀具 +供应蝴蝶甩刀 +供应蝴蝶跳刀 +供应袖珍手枪 +供应警察装备 +供应警帽电话 +供应警服电话 +供应警服警衔 +供应警械装备 +供应警用手枪 +供应警用棍刀 +供应警用电棍 +供应资质证书 +供应赭曲毒素 +供应赵氏弓弩 +供应车辆牌照 +供应进口弓弩 +供应进口枪模 +供应进口气枪 +供应进口气狗 +供应进口汽枪 +供应进口汽狗 +供应迷奸药水 +供应迷情药水 +供应迷药qq +供应重铬酸钠 +供应野营刀具 +供应野营猎刀 +供应野营砍刀 +供应金属气枪 +供应金钟气枪 +供应钢珠弓弩 +供应钢珠汽枪 +供应钢珠猎狗 +供应钻石冰糖 +供应铀毒qq +供应铅弹模具 +供应铅弹气枪 +供应铅弹汽枪 +供应铅弹鸟枪 +供应铊盐qq +供应防卫刀具 +供应防身武器 +供应阳江砍刀 +供应雷管qq +供应马拉硫磷 +供应马钱子碱 +供应骚冰qq +供应高仿假币 +供应高仿假钞 +供应高仿军刺 +供应高仿手枪 +供应高仿气枪 +供应高仿汽枪 +供应高仿真枪 +供应高仿纸币 +供应高仿警服 +供应高仿证书 +供应高仿钞票 +供应高压气枪 +供应高爆炸药 +供应麻古qq +供应麻古果子 +供应麻果qq +供应麻果丸子 +供应黄冰qq +供应黄曲霉素 +供应黄白牙签 +供应黄色炸药 +侵犯国外专利 +便宜冰毒买卖 +保健按摩服务 +保证你打飞机 +倚天屠龙别记 +假人民币qq +假人民币专卖 +假人民币供应 +假人民币批发 +假人民币提供 +假人民币直销 +假人民币销售 +假币专卖qq +假币买卖qq +假币供应qq +假币假钱买卖 +假币公司qq +假币出售qq +假币出售电话 +假币卖买定金 +假币批发qq +假币批发电话 +假币提供qq +假币直销qq +假币联系电话 +假币进口技术 +假币销售qq +假毕业证代办 +假毕业证办理 +假警官证qq +假警官证销售 +假证代办qq +假证代理qq +假证件出售q +假证公司qq +假证制作qq +假证制作公司 +假证办理qq +假证办理公司 +假证办理网站 +假证快速办理 +假身份证代办 +假身份证出售 +假身份证办理 +假身份证销售 +假钞买卖qq +假钞交换qq +假钞供应qq +假钞公司qq +假钞出售qq +假钞出售电话 +假钞提供qq +假钞销售qq +假钱专卖qq +假钱买卖qq +假钱交易qq +假钱供应qq +假钱假币出售 +假钱公司qq +假钱出售qq +假钱出售价格 +假钱出售电话 +假钱批发qq +假钱批发出售 +假钱批发电话 +假钱提供qq +假钱送货电话 +假钱销售qq +假驾驶证qq +假驾驶证办理 +做为裆的干部 +做假文凭qq +做军官证样本 +做爱mm游戏 +做爱rmvb +做爱图片偷拍 +做爱在线观看 +做爱技巧交流 +做爱插得更深 +做爱极品图片 +做爱淫乱小说 +做爱现场直播 +做爱视频下载 +做爱聊天视频 +做英语等级证 +做高仿学位证 +做高仿户口本 +做高仿身份证 +健卫步枪qq +健卫步枪出货 +健卫步枪到货 +健卫步枪电话 +健卫步枪订购 +健卫汽抢出售 +偷拍av女优 +偷拍真人做爱 +偷拍视频下载 +偷拍走光美女 +偷拍饥渴情侣 +偷窥盗摄系列 +偷窥迷奸拍照 +催情药水供应 +催情药水出售 +催情药水批发 +催情药水提供 +催情药水直销 +催情药水订购 +催情药水购买 +催情药水销售 +催情迷幻春药 +催情迷情香水 +催眠催情香水 +儿子淫奸姐姐 +儿子的大肉棒 +元老兰提沃德 +充气娃娃之恋 +充气娃娃出售 +光月夜也无码 +光月夜也种子 +免定金汽狙狗 +免注册淫电影 +免费a片下载 +免费a片在线 +免费a片观看 +免费bb电影 +免费g片下载 +免费二级域名 +免费午夜爽片 +免费午夜电影 +免费在线a片 +免费女a片段 +免费强奸电影 +免费性爱电影 +免费成人a片 +免费成人图片 +免费成人影片 +免费成人电影 +免费成人视频 +免费成人网站 +免费成人美女 +免费日本a片 +免费淫乱电影 +免费淫奸女片 +免费淫爆影片 +免费淫电影网 +免费淫色影院 +免费淫色电影 +免费淫色论坛 +免费淫色贴图 +免费激情影院 +免费激情电影 +免费激情视频 +免费激情裸聊 +免费激情论坛 +免费痴女吸精 +免费看淫电影 +免费视频裸聊 +免费色情图片 +免费色情小说 +免费色情电影 +免费色情视频 +免费裸聊qq +免费裸聊网址 +免费黄色淫秽 +免费黄色电影 +兔妹妹贴图区 +党是为了欺骗 +党校安插亲信 +兜售沙漠之鹰 +全免费淫电影 +全刃军刺出售 +全国出售枪支 +全套包夜服务 +全套少妇服务 +全家不得好死 +全色网说a片 +全裸性感熟女 +全裸激情表演 +全都插进去了 +全都男盗女娼 +公仆真是笨蛋 +公司发票代开 +公安制服批发 +公安制服直销 +公检法是流氓 +公车淫奸妹妹 +公车淫奸姐姐 +六四25周年 +六四内部日记 +六四学生领袖 +六四學生領袖 +兰博军刀出售 +兰博军刀批发 +兰博军刀转让 +兰博刀具买卖 +兰博刀具供应 +兰博刀具出售 +兰博刀具提供 +兰桂情色帝国 +共产党的报应 +共产党的末日 +共度1夜美好 +关口良子无码 +兼职上门服务 +兼职妹妹上门 +兼职妹妹服务 +兼职学生妹妹 +兼职小妹qq +兼职小姐qq +兼职小姐上门 +兼职小姐包夜 +兼职小姐服务 +兼职楼凤qq +兼职白领qq +兼职美女上门 +兼职美女包夜 +兼职鸭子qq +兽交在线播放 +兽交幼交爽片 +兽用猎枪出售 +内射美人秘书 +内藤花苗种子 +冈崎美女种子 +冈田里奈无码 +冒险中国黄站 +最新av电影 +最新亚洲无码 +最新亚洲色图 +最新假币出售 +最新假币销售 +最新假钱价格 +最新假钱出售 +最新假钱批发 +最新娱乐黄站 +最新少妇白洁 +最新弓弩销售 +最新强暴电影 +最新情色电影 +最新日本av +最新日本无码 +最新欧美无码 +最新欧美色片 +最新素人av +最新色站地址 +最新色站导航 +最新高清美女 +最纯的钻石冰 +军刀专卖qq +军刀专卖军刺 +军刀专卖电话 +军刀买卖qq +军刀供应qq +军刀军刺甩棍 +军刀出售qq +军刀匕首直销 +军刀批发qq +军刀批发商城 +军刀甩棍销售 +军刀电棍销售 +军刀直刀专卖 +军刀直销qq +军刀订购qq +军刀销售qq +军刺专卖qq +军刺出售qq +军刺批发qq +军刺订购qq +军刺销售qq +军品刀具专卖 +军品刀具供应 +军品刀具批发 +军品刺刀出售 +军品刺刀定购 +军品刺刀批发 +军品刺刀提供 +军品刺刀直销 +军品刺刀转让 +军品刺刀销售 +军品销售公司 +军工配件组装 +军民血腥冲突 +军用54专卖 +军用54出售 +军用54销售 +军用77专卖 +军用77出售 +军用77销售 +军用刀具专卖 +军用刀具供应 +军用刀具出售 +军用刀具批发 +军用刺刀专卖 +军用刺刀买卖 +军用刺刀出售 +军用刺刀批发 +军用刺刀批售 +军用刺刀销售 +军用匕首qq +军用匕首专卖 +军用匕首出售 +军用匕首批发 +军用匕首提供 +军用匕首转让 +军用匕首销售 +军用弓弩公司 +军用弓弩批发 +军用弓弩订购 +军用弓弩转让 +军用弩弓直销 +军用手枪qq +军用手枪专卖 +军用手枪买卖 +军用手枪供应 +军用手枪出售 +军用手枪出货 +军用手枪到货 +军用手枪批发 +军用手枪提供 +军用手枪电话 +军用手枪订购 +军用手枪转让 +军用手枪销售 +军用手狗出售 +军用折刀出售 +军用折刀销售 +军用枪专卖店 +军用枪支出售 +军用枪支提供 +军用枪支销售 +军用步枪出售 +军用步枪销售 +军用砍刀专卖 +军用砍刀批发 +军用雷管出售 +军警用具批发 +农夫色站导航 +农村人乱伦事 +农村淫乱视频 +冰古销售qq +冰毒k粉批发 +冰毒专卖qq +冰毒买卖qq +冰毒交易qq +冰毒供应qq +冰毒出售qq +冰毒制作qq +冰毒制作工艺 +冰毒制作方法 +冰毒制造配方 +冰毒原料出售 +冰毒原料销售 +冰毒合成方法 +冰毒成品供应 +冰毒批发qq +冰毒批发交易 +冰毒提供qq +冰毒牙签qq +冰毒牙签出售 +冰毒特价出售 +冰毒现货供应 +冰毒直销qq +冰毒联系qq +冰毒联系电话 +冰毒订购qq +冰毒送货上门 +冰毒配方qq +冰毒配方出售 +冰毒配方销售 +冰毒销售qq +冰毒麻古供应 +冰火全套服务 +冰砖专卖qq +冰砖买卖qq +冰砖送货上门 +冰糖销售qq +冰钻供应qq +冲田杏梨种子 +冴岛奈绪种子 +冴木丽美无码 +冷钢刀具专卖 +冷钢刀具直销 +凉风杏菜无码 +凌辱兽txt +减护爱里无码 +出卖3棱尖刀 +出售1体直刀 +出售1元假币 +出售1元硬币 +出售2手手狗 +出售2手气枪 +出售3唑仑片 +出售3棱军刀 +出售3棱军刺 +出售3棱刀具 +出售3棱刮刀 +出售3棱刺刀 +出售3棱尖刀 +出售3箭气枪 +出售3箭气狗 +出售4号白粉 +出售54手抢 +出售54手枪 +出售56军刺 +出售56枪刺 +出售64手枪 +出售77手枪 +出售77猎枪 +出售81军刺 +出售92手枪 +出售95枪刺 +出售ak军刀 +出售ak军刺 +出售c4炸药 +出售d9军刺 +出售fx气皇 +出售ghb水 +出售jia币 +出售k粉qq +出售k粉教程 +出售k粉猪肉 +出售k粉电话 +出售m1枪刺 +出售下压气枪 +出售下压气狗 +出售个人自拍 +出售乙醚3唑 +出售乙醚qq +出售乙醚教程 +出售乳化炸药 +出售仿真假钱 +出售仿真军刀 +出售仿真军刺 +出售仿真手枪 +出售仿真手狗 +出售仿真枪械 +出售仿真枪模 +出售仿真步枪 +出售仿真气枪 +出售仿真汽枪 +出售仿真电狗 +出售仿美秃鹰 +出售伪钞qq +出售假rmb +出售假人民币 +出售假学位证 +出售假币qq +出售假币假钱 +出售假币扣扣 +出售假币模具 +出售假币电话 +出售假币网站 +出售假户口本 +出售假证qq +出售假资格证 +出售假身份证 +出售假钞qq +出售假钞模具 +出售假钞模版 +出售假钞电话 +出售假钞高仿 +出售假钱qq +出售假钱电话 +出售健卫步枪 +出售兰博刀具 +出售最新假币 +出售最新假钱 +出售军刀qq +出售军刀军品 +出售军刺qq +出售军刺军刀 +出售军品军刀 +出售军品刺刀 +出售军用匕首 +出售军用商品 +出售军用弓弩 +出售军用手枪 +出售军用手狗 +出售军用折刀 +出售军用枪械 +出售军用猎刀 +出售军用砍刀 +出售冰毒qq +出售冰毒供应 +出售冰毒成品 +出售冰毒教程 +出售冰砖qq +出售冰砖信息 +出售冰砖教程 +出售冰糖牙签 +出售制式军刀 +出售刺刀qq +出售匕首qq +出售北朝鲜冰 +出售单发手狗 +出售单发气枪 +出售单管猎枪 +出售卧底软件 +出售原装猎枪 +出售原装秃鹰 +出售原装骚本 +出售双筒猎枪 +出售双管猎枪 +出售发票电话 +出售叛逆者枪 +出售台湾秃鹰 +出售各种k粉 +出售各种气枪 +出售各类假证 +出售各类猎狗 +出售各类雷管 +出售合成k粉 +出售听话药水 +出售国产手枪 +出售国产手狗 +出售国产气狗 +出售塑胶炸药 +出售外国枪模 +出售大麻qq +出售大黑鹰弩 +出售女性数据 +出售女性资料 +出售女用春药 +出售女警制服 +出售娥眉气枪 +出售子弹qq +出售子弹模具 +出售定时炸弹 +出售尼可待因 +出售山猪气枪 +出售工字气枪 +出售工字狗粮 +出售工字皮碗 +出售左轮手枪 +出售左轮手狗 +出售左轮短狗 +出售左轮配件 +出售开刃军刀 +出售开刃匕首 +出售开刃跳刀 +出售开山砍刀 +出售弓弩qq +出售弹簧跳刀 +出售微型手枪 +出售微型汽枪 +出售成品冰毒 +出售战术军刀 +出售战术折刀 +出售战神弓弩 +出售户外刀具 +出售户外砍刀 +出售户撒刀王 +出售手机卧底 +出售手机改号 +出售手机间谍 +出售手枪qq +出售手枪价格 +出售手枪图纸 +出售手枪子弹 +出售手枪枪管 +出售手枪电话 +出售手枪配件 +出售手狗qq +出售手狗狗粮 +出售手狗配件 +出售批量冰毒 +出售批量麻果 +出售拍肩迷药 +出售斗角式枪 +出售普斯普剂 +出售枪弹qq +出售枪支qq +出售枪支套件 +出售枪支子弹 +出售格斗靴刀 +出售步枪qq +出售步枪子弹 +出售比赛手狗 +出售毕业文凭 +出售毛瑟刺刀 +出售民用雷管 +出售气枪qq +出售气枪套件 +出售气枪子弹 +出售气枪枪管 +出售气枪电话 +出售气枪配件 +出售气枪铅弹 +出售气狗qq +出售气狗狗粮 +出售水胶炸药 +出售汔枪电话 +出售汽gou +出售汽枪0件 +出售汽枪qq +出售汽枪配件 +出售汽枪铅弹 +出售汽狗qq +出售汽狗狗粮 +出售沙漠之鹰 +出售海豹m9 +出售液体炸弹 +出售火枪游戏 +出售炸弹配方 +出售炸药QQ +出售炸药电话 +出售炸药配方 +出售炸药雷管 +出售特警匕首 +出售狙击步狗 +出售狙击气枪 +出售狙击汽枪 +出售狩猎气枪 +出售狩猎气狗 +出售猎枪qq +出售猎枪子弹 +出售猎枪底火 +出售猎枪电话 +出售猎枪霰弹 +出售猎狗qq +出售猛虎军刀 +出售现役军刀 +出售瓦斯手枪 +出售瓦斯手狗 +出售甲卡西酮 +出售电子炸弹 +出售白冰k粉 +出售白冰qq +出售白冰果子 +出售白冰牙签 +出售白粉qq +出售白粉教程 +出售白黄牙签 +出售眼镜蛇弩 +出售短信改号 +出售砍刀qq +出售砍刀信息 +出售砖石冰毒 +出售硝化甘油 +出售硝铵炸药 +出售秃鹰qq +出售秃鹰图纸 +出售秃鹰套件 +出售秃鹰手枪 +出售秃鹰气枪 +出售秃鹰汽枪 +出售秃鹰皮碗 +出售突击步枪 +出售窃听软件 +出售答案qq +出售简易炸弹 +出售粉笔炸弹 +出售精仿军刃 +出售精品军刀 +出售纯冰qq +出售纯冰钻石 +出售纯冰黄冰 +出售绿白牙签 +出售缅古配方 +出售缅甸麻古 +出售美国秃鹰 +出售肾源专卖 +出售自制土枪 +出售自制手枪 +出售自制手狗 +出售自制炸弹 +出售自制猎枪 +出售自制雷管 +出售英国骚本 +出售莫达非尼 +出售虎头猎枪 +出售虎牙军刀 +出售蝴蝶刀具 +出售蝴蝶折刀 +出售蝴蝶甩刀 +出售蝴蝶跳刀 +出售袖珍手枪 +出售警号qq +出售警用刀具 +出售警用匕首 +出售警用器材 +出售警用手枪 +出售警用枪械 +出售警用棍刀 +出售警用电棒 +出售警用警棍 +出售警用钢叉 +出售走私军火 +出售走私手枪 +出售走私步枪 +出售走私猎枪 +出售走私砂枪 +出售赵氏弓弩 +出售跳刀qq +出售转轮手枪 +出售过机假币 +出售过机假钞 +出售过机假钱 +出售进口弓弩 +出售进口手狗 +出售进口枪支 +出售进口枪模 +出售进口气枪 +出售进口气狗 +出售进口汽狗 +出售连发猎枪 +出售迫击炮弹 +出售迷幻药物 +出售迷情药水 +出售迷药qq +出售迷魂香水 +出售迷魂香烟 +出售追风弓弩 +出售野营军刀 +出售野营刀具 +出售野营砍刀 +出售金属枪模 +出售金属气枪 +出售金钟气狗 +出售金钟汽枪 +出售钢弹气枪 +出售钢珠子弹 +出售钢珠气枪 +出售钢珠汽枪 +出售钢珠猎狗 +出售钢珠长狗 +出售钻石冰毒 +出售铅弹qq +出售铅弹气枪 +出售铅弹鸟枪 +出售铵梯炸药 +出售银行数据 +出售销售气枪 +出售锡牌汽枪 +出售锡锋气枪 +出售防身手狗 +出售防身武器 +出售防身气狗 +出售阿普唑仑 +出售陶瓷刀具 +出售雷汞qq +出售雷管qq +出售雷管炸药 +出售鞭炮qq +出售韩版假币 +出售骚本气枪 +出售高仿人皮 +出售高仿假币 +出售高仿假钱 +出售高仿军刺 +出售高仿文凭 +出售高仿气枪 +出售高仿汽枪 +出售高仿真枪 +出售高仿硬币 +出售高仿纸币 +出售高仿警服 +出售高仿证书 +出售高仿钞票 +出售高压步枪 +出售高压气枪 +出售高压气狗 +出售高压汽枪 +出售高压鸟枪 +出售高纯k粉 +出售鸟枪qq +出售麻古4号 +出售麻古k粉 +出售麻古qq +出售麻古冰糖 +出售麻古教程 +出售麻古果子 +出售麻古猪肉 +出售麻古配方 +出售麻果qq +出售麻果配方 +出售麻谷qq +出售麻谷教程 +出售麻醉l枪 +出售黄白牙签 +出售黑市枪支 +刀具专卖qq +刀具直销qq +刀具直销电话 +刘志军罢免掉 +删帖炒作公司 +制作3箭气枪 +制作k粉批发 +制作k粉方法 +制作仿真枪模 +制作仿真气枪 +制作假学位证 +制作假户口本 +制作假警官证 +制作假证qq +制作假驾驶证 +制作健卫步枪 +制作军用手枪 +制作冰毒方法 +制作台湾秃鹰 +制作左轮手枪 +制作汽车炸药 +制作火药方法 +制作火药流程 +制作火药配方 +制作炸弹方法 +制作炸药qq +制作炸药配方 +制作硝化甘油 +制作秃鹰汽枪 +制作简易弓弩 +制作简易弓弩 +制作简易炸弹 +制作简易炸药 +制作美国秃鹰 +制作虎头猎枪 +制作虚假证件 +制作进口气枪 +制作金钟气枪 +制作铅弹气枪 +制作雷管方法 +制作高仿护照 +制作高仿文凭 +制作高仿证书 +制作高仿证件 +制作高压气枪 +制作麻古方法 +制式军刀专卖 +制造假身份证 +制造冰毒配方 +制造缅古合成 +刺刀出售qq +刻章假证qq +刻章办证公司 +前原佑子种子 +力斯曼弩买卖 +力斯曼弩供应 +力斯曼弩批发 +力斯曼弩转让 +力斯曼弩销售 +办假文凭qq +办假证件qq +办毕业证文凭 +办理仿真证件 +办理会计师证 +办理假会计证 +办理假军官证 +办理假学位证 +办理假学生证 +办理假户口办 +办理假户口本 +办理假房产证 +办理假残疾证 +办理假毕业证 +办理假离婚证 +办理假等级证 +办理假结婚证 +办理假证公司 +办理假证刻章 +办理假资格证 +办理假身份证 +办理假驾驶证 +办理军车套牌 +办理各种假证 +办理各种文凭 +办理国外文凭 +办理学历文凭 +办理学历证书 +办理学士学位 +办理文凭qq +办理本科文凭 +办理本科证书 +办理毕业文凭 +办理毕业证书 +办理真身份证 +办理职称证书 +办理认证学位 +办理认证证书 +办理资质证书 +办理车辆牌照 +办理高仿证书 +办理高仿证件 +办理高校文凭 +办职称证qq +办证刻章公司 +办证服务公司 +办驾驶证qq +办高仿毕业证 +办高仿证qq +加油机干扰器 +加纳朝美种子 +动漫av下载 +动漫性爱视频 +动漫激情淫色 +勃不起斯懦夫 +包夜全套服务 +包夜打炮服务 +包夜按摩qq +包射包爽视频 +匕首专卖qq +匕首买卖qq +匕首刀具批发 +匕首猎刀出售 +匕首猎刀批发 +北乃优子无码 +北京上门保健 +北京上门按摩 +北京妓女上门 +北京市委黑幕 +北京帮人复仇 +北京找援交妹 +北京按摩服务 +北京警灯专卖 +北原梨奈无码 +北川沙香无码 +北方尽出祸害 +北朝鲜冰销售 +北条麻妃无码 +北条麻妃种子 +北美自由论坛 +医疗发票代开 +十8淫妹电影 +十大丑陋人物 +十大无耻发言 +十大欠抽人物 +十年动乱石进 +千田爱纱无码 +午夜影院成人 +午夜性爱惊魂 +午夜情色电影 +午夜成人a片 +午夜成人影院 +午夜成人爽片 +午夜成人电影 +午夜激情剧场 +午夜激情妹妹 +午夜激情电影 +午夜激情美穴 +午夜激情频道 +午夜爽片下载 +午夜爽片快播 +华人博彩平台 +华人色站导航 +华侨人娱乐城 +华通时事论坛 +单管平式出售 +单管猎枪专卖 +单管猎枪买卖 +单管猎枪出售 +单管猎枪制造 +单管猎枪销售 +单管猎狗出售 +单管立式出售 +卖3唑仑qq +卖3唑仑手机 +卖3唑仑电话 +卖3箭牌气枪 +卖cfx气枪 +卖仿真枪qq +卖假冒身份证 +卖军官证样本 +卖刀网军刀网 +卖大冰砖qq +卖大冰砖手机 +卖大冰砖电话 +卖女最快服务 +卖小冰砖qq +卖小冰砖手机 +卖小冰砖电话 +卖居民户口本 +卖工字牌汽枪 +卖摇头丸qq +卖摇头丸手机 +卖摇头丸电话 +卖摇头丸配方 +卖氯胺酮qq +卖氯胺酮手机 +卖氯胺酮电话 +卖海洛因qq +卖海洛因手机 +卖海洛因电话 +卖淫女全过程 +卖白牙签qq +卖肾服务qq +卖英语等级证 +卖迷魂水qq +卖迷魂水手机 +卖迷魂水电话 +卖迷魂粉qq +卖迷魂粉手机 +卖迷魂粉电话 +卖迷魂药qq +卖迷魂药手机 +卖迷魂药电话 +卖钢珠枪QQ +卖钻石冰qq +卖钻石冰手机 +卖钻石冰电话 +卖高仿学位证 +卖高仿户口本 +卖高仿身份证 +卖麦角酸qq +卖麦角酸手机 +卖麦角酸电话 +卖麻黄素qq +卖麻黄素手机 +卖麻黄素电话 +卖黄牙签qq +南条彩奈种子 +博彩来娱乐城 +博彩网址导航 +博彩返现平台 +卡巴军刀出售 +卧底软件官网 +厕所偷拍淫图 +厕所盗摄美女 +原创亚洲无码 +原创欧美无码 +原纱央莉种子 +原装仿真气枪 +原装娥眉气枪 +原装狩猎气枪 +原装秃鹰qq +原装秃鹰专卖 +原装秃鹰气枪 +原装秃鹰直销 +原装竞技气枪 +原装英国骚本 +原装锡峰气枪 +厨房制作炸弹 +去甲伪麻黄碱 +县委书记换妻 +县委书记群p +县长之女率众 +又大又嫩的屄 +又大又嫩的穴 +又大又肥的屄 +又嫩又紧的屄 +又嫩又紧的穴 +又深又紧的穴 +又紧又嫩的屄 +又肥又大的穴 +又肥又紧的屄 +又长粗的肉棒 +又骚又大的屄 +又骚又淫的屄 +及川奈央种子 +友崎亚希种子 +友田真希种子 +双刃尖刀买卖 +双刃尖刀供应 +双刃尖刀出售 +双刃尖刀批发 +双刃尖刀提供 +双刃尖刀直销 +双刃尖刀订购 +双刃尖刀销售 +双管猎枪专卖 +双管猎枪买卖 +双管猎枪出售 +双管猎枪批发 +双管猎枪销售 +双管猎狗专卖 +双腿间做出爱 +双腿间的禁地 +反party +反对共产主义 +发廊小姐包夜 +发票代开qq +发票咨询qq +变态轮奸淫图 +口交性交自拍 +口服型昏迷药 +另类色情图片 +叩头处处破费 +叫晶晶的女孩 +可以嘉我薇信 +可可粉苯丙胺 +可爱卡通小穴 +可爱女友糖糖 +可视视频聊天 +可要向党交心 +台湾18成人 +台湾午夜色情 +台湾应该独立 +台湾性爱电影 +台湾成人电影 +台湾成人网站 +台湾成人骚b +台湾有权独立 +台湾淫色电影 +台湾秃鹰qq +台湾秃鹰出售 +台湾秃鹰出货 +台湾秃鹰到货 +台湾秃鹰制造 +台湾秃鹰图纸 +台湾秃鹰批发 +台湾秃鹰提供 +台湾秃鹰电话 +台湾秃鹰直销 +台湾秃鹰订购 +台湾秃鹰转让 +台湾秃鹰销售 +台湾自由联盟 +台湾色色导航 +台版假币qq +台版假币批发 +台版假币电话 +台版假钞出售 +台版假钞销售 +叶山小姬无码 +叶山美湖种子 +叶志穗的种子 +叶月千穗种子 +司马璐回忆录 +吃下1群妖男 +各式气枪出售 +各种枪支出售 +各种自拍偷拍 +各种艳照诱惑 +各种证件代办 +各类军用枪支 +各类猎狗销售 +合成淫色贴图 +合肥上门按摩 +吉井爱美种子 +吉井美希种子 +吉村寿桃无码 +吉村彩夏种子 +吉泽明步种子 +吉泽朝美种子 +吉野纱利无码 +吉野里沙无码 +同乐城娱乐城 +同人av下载 +同城裸聊qq +同城裸聊视频 +同城裸聊网址 +同城裸聊网站 +同志导航交友 +同志色情网址 +同性恋俱乐部 +名刀专卖网站 +后庭花txt +后藤美纪种子 +吗啡专卖qq +吗啡出售qq +吗啡提供qq +吗啡直销qq +吗啡订购qq +吗啡销售qq +含着他的龟头 +含肉棒插小穴 +听话药水供应 +听话药水出售 +听话药水批发 +听话药水提供 +听话药水直销 +听话药水订购 +听话药水购买 +听话药水销售 +吸精痴女护士 +吻你丶胯下唇 +告全体线民书 +和亲姐姐作爱 +和奸成瘾下载 +和妈妈玩插穴 +和妹妹玩插穴 +咪咪色域h网 +品色激情电影 +哇嘎成人社区 +哈瑞斯娱乐城 +哥先脱尓随意 +哥哥使劲插我 +哥哥我爽晕了 +哥哥的大肉棒 +哪有催情水卖 +哪有迷奸水卖 +哪里买催情药 +哪里小姐服务 +哪里有买枪的 +哪里有枪出售 +哪里有气枪卖 +哪里有爽片看 +哪里有钢珠枪 +唐朝禁宫风云 +售军官证样本 +售居民户口本 +售枪购买手枪 +售氰化物qq +售海乐神司 +售英语等级证 +售香港ghb +售高仿学位证 +售高仿户口本 +售高仿身份证 +啊阿姨要泄了 +喜欢舔你下面 +喜欢虐待女人 +喜欢裸身的你 +喝你水和你睡 +喷雾型迷魂药 +喷雾迷药供应 +喷雾迷药出售 +喷雾迷药批发 +喷雾迷药提供 +喷雾迷药直销 +喷雾迷药订购 +喷雾迷药购买 +喷雾迷药销售 +嘴唇吸小肉缝 +嘿咻高清无码 +回族人吃猪肉 +回民人吃猪肉 +团购弓弩qq +国产av电影 +国产a片下载 +国产se情片 +国产双飞推油 +国产幼交视频 +国产强奸少妇 +国产手狗专卖 +国产手狗订购 +国产模特私拍 +国产毛片下载 +国产气枪专卖 +国产气枪供应 +国产气枪出售 +国产气枪提供 +国产气枪销售 +国产汽枪qq +国产汽枪专卖 +国产汽枪供应 +国产汽枪出售 +国产汽枪销售 +国产秃鹰专卖 +国产秃鹰出售 +国产秃鹰批发 +国产秃鹰提供 +国产秃鹰直销 +国产秃鹰购买 +国产秃鹰转让 +国产色片下载 +国产裸模写真 +国产黄片下载 +国内肾源出售 +国外av小姐 +国外a片电影 +国外文凭制作 +国家是1条狗 +国模私拍套图 +圈套给周总理 +土制炸弹出售 +土制炸弹配方 +土制炸药供应 +土炸药的制法 +圣灵重建教会 +在线av播放 +在线a片影院 +在线a片观看 +在线乱伦激情 +在线代办假证 +在线体育投注 +在线博彩qq +在线博彩公司 +在线博彩平台 +在线博彩网站 +在线性爱小说 +在线情色视频 +在线成人影院 +在线成人电影 +在线梭哈平台 +在线淫洞影院 +在线淫色电影 +在线激情爽片 +在线激情电影 +在线激情裸聊 +在线现金博彩 +在线皇冠投注 +在线真人娱乐 +在线真钱博彩 +在线真钱平台 +在线真钱赌博 +在线视频裸聊 +在线祼聊表演 +在线网络博彩 +在线裸体陪聊 +在线裸女聊天 +在线裸聊qq +在线裸聊视频 +在线观看a片 +在线赌博平台 +在线赌博网站 +在线赌钱投注 +在线赌钱网站 +在线轮盘博彩 +在线黄片网址 +在线黄色电影 +地方政府瞒报 +地方政府衭干 +地沟油炒的菜 +地税发票qq +地税发票代开 +坐台小姐兼职 +坚持杀萨达姆 +坦克压大学生 +堤沙耶香无码 +堤莎也加种子 +塑胶炸药制作 +增值发票代开 +声讨相关部门 +处女2奶包养 +处女上门包夜 +处女包夜性息 +处女嫩穴奸淫 +处女小穴阴毛 +处女开苞信息 +处女开苞服务 +处女开苞视频 +处女援交qq +处女援交性息 +处女援交服务 +处女援交电话 +处女服务qq +处女流水淫图 +处女破处直播 +处女裸聊做爱 +夏娃的性诱惑 +夏木美夕种子 +夏树里沙无码 +夏目朱音无码 +夕树舞子种子 +外国人体艺术 +外国小姐上门 +外国小姐服务 +外国文凭代办 +多人博彩网络 +夜夜色娱乐网 +夜寂寞俱乐部 +夜店兼职女郎 +夜晚寂寞难耐 +夜色撩人社区 +夜色淫女导航 +夜色王朝社区 +夜行性情欲魔 +大5码情色网 +大6av下载 +大6av影讯 +大6av影院 +大6av视讯 +大6av视频 +大6免费黄站 +大6娱乐黄站 +大6嫩模写真 +大6性爱视讯 +大6性爱美图 +大6情色视讯 +大6成人av +大6成人a片 +大6成人视讯 +大6气枪专卖 +大6色情影片 +大6色情视讯 +大6鹿城黄站 +大6黄网导航 +大jb想艹b +大专文凭代办 +大专文凭出售 +大东方娱乐城 +大中华情色网 +大乱交avi +大众成人网站 +大力插大鸡巴 +大学生找包养 +大家乐博彩网 +大浦安娜全集 +大浦安娜种子 +大片黄色网站 +大石彩香种子 +大纪元新闻网 +大胆日本爽图 +大赢家娱乐城 +大连找学生妹 +大量伪币出售 +大量假钞批发 +大马士革军刀 +大鸡吧插妹妹 +大鸡吧操小逼 +大鸡巴太棒了 +大鸡巴小浪穴 +大鸡巴干妹妹 +大鸡巴插小穴 +大鸡巴插少妇 +大麻供应qq +大麻出售qq +大麻批发qq +大麻批发电话 +大麻提供qq +大麻提供电话 +大麻销售qq +大黑鹰弓弩网 +大黑鹰弩专卖 +大黑鹰弩打折 +大黑鹰弩改装 +大黑鹰弩转让 +天天免费成人 +天天娱乐时空 +天安門大屠殺 +天安门大屠杀 +天安门录像带 +天安门录影带 +天府广场集会 +天然素人无码 +天鹰高压气枪 +太安炸药配方 +太恩炸药制作 +太爽了大鸡巴 +太阳城娱乐网 +太阳城现金网 +夫妇乐园下载 +夫妻互换对搞 +夫妻作爱电影 +夫妻午夜爽片 +夫妻成长日记 +夹得我好舒服 +奇淫的老板娘 +套弄鸡巴浪叫 +奥克托今供应 +女人被干小穴 +女优写真套图 +女医生风情史 +女奴sm服务 +女子车内意外 +女学生的耻蜜 +女巨乳女教师 +女性数据供应 +女性生殖内分 +女总裁爱上我 +女王招奴qq +女王滴蜡调教 +女监狱男管教 +女职工张美霞 +女领导男秘书 +奴隶少女新娘 +奴颜婢膝之陡 +她妈的金日成 +她的小屄不紧 +她的阴道好紧 +她的阴道真紧 +好大的阴户啊 +好想射点什么 +好硬的大肉棒 +好粗大的肉棒 +好粗的大肉棒 +好紧的阴道啊 +好舒服奸淫操 +如何推翻中共 +如意坊娱乐城 +如月可怜种子 +妈好象党中央 +妈妈屄好痒呀 +妈的穴让你插 +妓女上门qq +妓女上门信息 +妓女上门援交 +妓女上门电话 +妓女全套服务 +妓女包夜上门 +妓女包夜信息 +妓女服务qq +妞妞基地在线 +妞妞成人基地 +妹妹mm激情 +妹妹上门援交 +妹妹小穴好紧 +妹妹援交上门 +妹妹爽快死了 +妹妹的大阴户 +妹妹的嫩阴唇 +妹妹的嫩阴户 +妹妹的小嫩穴 +妹妹的小淫穴 +妹妹的小阴户 +妹妹的穴好紧 +妹妹社区淫色 +妹川尚子种子 +姊姊的小骚屄 +姐姐的嫩阴唇 +姐姐的嫩阴户 +姐姐的肥阴唇 +姐姐的肥阴户 +姐弟乱伦下载 +姐弟淫乱小说 +姐弟淫穴小说 +姐弟激情淫乱 +姐弟激情淫秽 +姐弟激情淫色 +姨妈的肥阴唇 +娇妻超市被奸 +娇嫩的小阴核 +娈童电影下载 +姬胜德 总参 +娥眉气枪出售 +娥眉气枪直销 +娥眉气枪转让 +娥眉气枪销售 +娱乐赌博投注 +婊子援交qq +婷婷口含鸡巴 +婷婷成人社区 +婷婷淫女小说 +婷婷淫色贴图 +婷婷激情小说 +婷婷激情淫液 +婷婷色情网站 +嫩b弓虽女干 +嫩模漏点自拍 +嫩穴任我插爽 +嫩穴小穴花心 +嫩穴极品阴蒂 +嫩穴肉棒肉缝 +嫩肉嫩肉大腿 +嫩肉穴口舌头 +子女任职名单 +子弹专卖qq +子弹出售qq +子弹模具qq +子弹模具专卖 +孤岛情色王朝 +学生妹妹上门 +学生妹妹兼职 +学生妹援交q +学生援交qq +宁波上门小姐 +安徽书记艳照 +安徽庐江艳照 +安里佑加种子 +完全性爱调查 +完全自杀手册 +官员宾馆群p +官员宾馆艳照 +官员群p照片 +官员群p艳照 +官员艳照下载 +定制人皮面具 +定额发票代开 +宜春院色情网 +宝贝在线裸聊 +实录强奸视频 +宫下真纪种子 +宫内久美无码 +宫泽优奈无码 +家庭乱伦小说 +家庭乱伦影片 +家庭乱伦视频 +家庭乱抡a片 +家族乱伦巨片 +宾馆6p艳照 +宾馆上门服务 +寂寞少妇裸聊 +富婆包养服务 +对共产党清算 +对准桃源洞口 +寺嶋小春种子 +寺田弥生无码 +寻找援交服务 +寻肉便器1只 +射进去喷出来 +射进妈妈里面 +射钉枪改猎枪 +射雕淫女传9 +尊尚会娱乐城 +尊贵异性按摩 +小伙子大jb +小区圈地基站 +小受受找老公 +小哥哥来捆绑 +小嘴吐出龟头 +小妹上门qq +小妹上门援交 +小妹援交qq +小妹援交上门 +小妹援交信息 +小妹援交电话 +小妹服务电话 +小妹特殊服务 +小姐qq裸聊 +小姐上门ml +小姐上门qq +小姐上门保健 +小姐上门做爱 +小姐上门全套 +小姐上门兼职 +小姐上门包夜 +小姐上门口交 +小姐上门服务 +小姐上门爱爱 +小姐上门特色 +小姐上门电话 +小姐保健上门 +小姐全套信息 +小姐全套服务 +小姐兼职上门 +小姐兼职服务 +小姐出台qq +小姐出台包夜 +小姐出台服务 +小姐包夜按摩 +小姐包夜服务 +小姐性息qq +小姐性息大全 +小姐性息服务 +小姐援交qq +小姐援交信息 +小姐援交服务 +小姐服务上门 +小姐楼凤信息 +小姐破处价格 +小姐联系电话 +小姨的嫩阴道 +小室友里种子 +小屄又湿又滑 +小川沙织无码 +小平料事如神 +小柳智美无码 +小森美王种子 +小池亚弥种子 +小泉彩d种子 +小泉硝子无码 +小泉麻由种子 +小泽菜穗种子 +小浪穴大鸡巴 +小猎人弓弩网 +小皮鞭啪啪啪 +小穴套着鸡巴 +小穴好棒好爽 +小穴好爽菊穴 +小穴插的紧紧 +小穴流出汁液 +小邪女荡妖传 +小骚bb自拍 +小骚屄儿妹妹 +小骚穴好舒服 +小骚货水真多 +少女18岁色 +少女初夜爽片 +少女初夜色片 +少女包夜爽片 +少女小姐上门 +少女床上自拍 +少女援交qq +少女援交视频 +少女激情自拍 +少女迷奸药水 +少妇sm上门 +少妇上门qq +少妇上门援交 +少妇上门激情 +少妇丝袜上门 +少妇做爱小说 +少妇出台qq +少妇出台服务 +少妇包夜qq +少妇包夜上门 +少妇包夜全套 +少妇性爱自拍 +少妇房中自淫 +少妇援交qq +少妇无码高清 +少妇淫乱小说 +少妇激情电影 +少妇激情陪聊 +少妇白洁下载 +少妇白洁全本 +少妇白洁全集 +少妇视频裸聊 +少妇色情导航 +少妇被鸡吧操 +少妇裸聊qq +少妇野外淫穴 +少妇风骚视频 +少妇高清无码 +少年大宝全本 +少年大宝全集 +少年阿宾系列 +尼2氢可待因 +尼二氢可待因 +尼姑落魄做台 +尼泊尔军刀卖 +尼泊尔狗腿刀 +局长被打致死 +山停爱子无码 +山口玲子种子 +山崎亚美下载 +山本早纪无码 +山猪气枪供应 +川村沙雪无码 +川村理沙无码 +川村理沙种子 +川村蓝子种子 +川滨奈美种子 +工口情色动漫 +工口情色图片 +工口情色小说 +工口情色游戏 +工口情色漫画 +工口情色视频 +工字气枪qq +工字气枪专卖 +工字气枪供应 +工字气枪出售 +工字气枪提供 +工字气枪转让 +工字气枪销售 +工字汽枪专卖 +工字汽枪出售 +工字汽枪直销 +工字汽枪销售 +工资每日结算 +左轮手枪qq +左轮手枪专卖 +左轮手枪出售 +左轮手枪出货 +左轮手枪到货 +左轮手枪制造 +左轮手枪图纸 +左轮手枪批发 +左轮手枪电话 +左轮手枪直销 +左轮手枪结构 +左轮手枪订购 +左轮手枪转让 +左轮手枪销售 +左轮手狗专卖 +左轮手狗出售 +左轮手狗转让 +巨乳av女优 +市井静香无码 +帖谴责奥巴马 +常盘优子种子 +常盘樱子无码 +常盘樱子种子 +干姐好好服侍 +干小姨子小穴 +干淫穴好舒服 +干阿姨的骚穴 +幼交乱伦qq +幼交电影快播 +幼交电影种子 +幼交色情电影 +幼女av视频 +幼女性爱视频 +幼女情色论坛 +幼幼之家论坛 +幼幼兽交电影 +幼幼无码电影 +幼幼色情图片 +幼幼色情电影 +幼幼黄色电影 +广告发票代开 +广场上的鲜血 +广州上门按摩 +广田墨音无码 +庐江6p下载 +庐江书记群p +庐江县艳照门 +庐江官员群p +庐江宾馆群p +庐江群p照片 +庐江群p种子 +庐江群p艳照 +庐江艳照下载 +庐江艳照全套 +庐江艳照图片 +庐江艳照套图 +庐江艳照种子 +庐江裸照下载 +庐江裸照图片 +庐江裸照视频 +庐江门不雅照 +庐江高清艳照 +庶女攻略完结 +延迟增长爽死 +开刃匕首供应 +开刃匕首批发 +开印钞机还债 +开平女中学生 +开心8娱乐城 +开粉红小阴唇 +开锁工具批发 +异性丝足按摩 +异黄樟素销售 +弓弩专卖qq +弓弩专卖店网 +弓弩专卖电话 +弓弩供应qq +弓弩出售qq +弓弩出售电话 +弓弩制作方法 +弓弩商城专卖 +弓弩器材专卖 +弓弩批发qq +弓弩有限公司 +弓弩特许经销 +弓弩狩猎专卖 +弓弩直销qq +弓弩直销中心 +弓弩营销中心 +弓弩设备专卖 +弓弩配件专卖 +弓弩销售qq +弓月杏里种子 +弟弟淫奸姐姐 +弟弟的大肉棒 +张开的小阴唇 +弩弓官网qq +弩机制作图纸 +弩枪销售qq +弩的制作图纸 +弩的制作方法 +弩的制作流程 +弩的图纸qq +弹簧刀专卖店 +弹簧刀具专卖 +弹簧刀具供应 +弹簧刀具出售 +弹簧刀具销售 +弹簧匕首出售 +弹簧跳刀供应 +弹簧跳刀出售 +弹簧跳刀批发 +弹簧跳刀提供 +弹簧跳刀直销 +弹簧跳刀订购 +弹簧跳刀购买 +弹簧跳刀转让 +弹簧跳刀销售 +弹落入中国境 +强奸3十6计 +强奸rmvb +强奸处女学妹 +强奸妈妈肉缝 +强奸物语逢乃 +强奸电影网站 +强奸视频下载 +强奸系列精品 +强奸网络小说 +强奸迅雷下载 +强行强拆为耻 +当今3大扯蛋 +当街将人打死 +当街殴打致死 +当面交易公文 +当面交易护照 +当面交易言正 +当面交易证件 +当面交易驾照 +当面办证交易 +徐州冰毒出售 +徐州找学生妹 +微型手枪提供 +德州扑克开户 +志贺友惠无码 +快播av下载 +快播av无码 +快播av电影 +快播av色站 +快播a片影院 +快播亚洲a片 +快播亚洲毛片 +快播伦理电影 +快播大6毛片 +快播性交无码 +快播情色电影 +快播成人a片 +快播成人地址 +快播成人毛片 +快播成人电影 +快播成人视频 +快播成人黄片 +快播日本无码 +快播日本电影 +快播日韩a片 +快播淫乱a片 +快播淫爱视频 +快播痴汉电车 +快播色情视频 +快播色情种子 +快播色片av +快播高清a片 +快活林情色网 +快速代办假证 +快速刻章办证 +快速办理假证 +快速办理文凭 +快速办理驾照 +快速和我同居 +怎样制作炸药 +怒了国家的法 +怒香港女记者 +急需肝源qq +性与爱的斗牛 +性也是1种爱 +性交图库下载 +性交图片下载 +性交影片下载 +性交游戏下载 +性交真人示范 +性交视频下载 +性交视频在线 +性吧最新地址 +性吧最新网址 +性吧春暖花开 +性娱情色导航 +性开放俱乐部 +性感美女淫穴 +性感裸聊qq +性欲喘息教师 +性海浪子系列 +性爱av下载 +性爱a片下载 +性爱偷拍视频 +性爱写真视频 +性爱写真美图 +性爱女神论坛 +性爱小说下载 +性爱录像下载 +性爱成人小说 +性爱成人录像 +性爱无码下载 +性爱服务上门 +性爱游戏下载 +性爱游戏在线 +性爱激情视频 +性爱电影下载 +性爱电影种子 +性爱视频下载 +性爱视频偷拍 +性爱视频导航 +性爱色图基地 +性爱色情图库 +性爱色网地址 +性爱裸聊论坛 +性爱陪聊视频 +性福来的太快 +性福的肥皂炮 +性福综合论坛 +性虎色情导航 +总理全家福照 +总理才提协调 +恋之欲室下载 +恐怖分子被抓 +恐怖分子逃逸 +悠悠成人社区 +悠游字在13 +悬赏兼职发帖 +情色a片下载 +情色a片种子 +情色动漫下载 +情色小说下载 +情色小说阅读 +情色成人基地 +情色成人大全 +情色成人论坛 +情色漫画下载 +情色激情论坛 +情色电影下载 +情色电影导航 +情色电影网站 +情色视频聊天 +情色艺术天空 +想做爱综合网 +想被我ri吗 +想要做爱综合 +感受你的收缩 +慢性毒药专卖 +慢性毒药批发 +慢性毒药直销 +成人av下载 +成人av大片 +成人av电影 +成人a片下载 +成人bt种子 +成人h漫网站 +成人qq裸聊 +成人qvod +成人yy裸聊 +成人yy频道 +成人两性电影 +成人乱伦视频 +成人亚洲无码 +成人交流入口 +成人仿真抽插 +成人伦理网站 +成人做爱录像 +成人做爱视频 +成人充气娃娃 +成人免费影院 +成人免费电影 +成人免费祼聊 +成人全裸艳照 +成人动漫bt +成人动漫电影 +成人动漫种子 +成人动漫系列 +成人动画下载 +成人午夜剧场 +成人午夜影院 +成人午夜性交 +成人午夜激情 +成人午夜电影 +成人午间影院 +成人单机游戏 +成人国产电影 +成人图片导航 +成人在线影院 +成人在线电影 +成人在线短片 +成人在线视频 +成人在线裸聊 +成人夫妻电影 +成人小说下载 +成人小说浏览 +成人小说论坛 +成人小说阅读 +成人影片下载 +成人影片地址 +成人影视下载 +成人影视快播 +成人快播a片 +成人快播h片 +成人快播电影 +成人性交录像 +成人性交电影 +成人性交视频 +成人性交网站 +成人性爱录像 +成人性爱游戏 +成人性爱电影 +成人性爱视频 +成人情色卡通 +成人情色导航 +成人情色小说 +成人情色电影 +成人情色社区 +成人情色视讯 +成人情色网站 +成人情色贴图 +成人收费裸聊 +成人文学下载 +成人文学抽插 +成人无码a片 +成人无码动漫 +成人无码快播 +成人无码电影 +成人无码电驴 +成人无码高清 +成人日本电影 +成人暴露色图 +成人欧美无码 +成人欧美电影 +成人淫乱小说 +成人淫秽小说 +成人淫穴导航 +成人游戏下载 +成人漫画下载 +成人漫画系列 +成人漫画论坛 +成人激情午夜 +成人激情图库 +成人激情图片 +成人激情导航 +成人激情小说 +成人激情影院 +成人激情性爱 +成人激情电影 +成人激情网址 +成人激情网站 +成人激情论坛 +成人爽片下载 +成人电影下载 +成人电影地址 +成人电影导航 +成人电影快播 +成人电影种子 +成人电影网站 +成人电影论坛 +成人社区地址 +成人社区网址 +成人视频下载 +成人视频在线 +成人视频种子 +成人视频网站 +成人视频聊天 +成人视频裸聊 +成人种子下载 +成人线上短片 +成人绿色网址 +成人网址导航 +成人网站导航 +成人聊天网站 +成人色情a片 +成人色情动漫 +成人色情图片 +成人色情导航 +成人色情游戏 +成人色情漫画 +成人色情社区 +成人色情视讯 +成人色情视频 +成人色情网站 +成人色情论坛 +成人色情频道 +成人色片下载 +成人色站导航 +成人裸聊qq +成人裸聊入口 +成人裸聊在线 +成人裸聊平台 +成人裸聊服务 +成人裸聊电话 +成人裸聊视频 +成人裸聊网址 +成人裸聊网站 +成人论坛地址 +成人论坛导航 +成人贴图网站 +成人资源下载 +成人资源分享 +成人高清电影 +成人高清视频 +成人黄色小说 +成人黄色影院 +成人黄色游戏 +成人黄色电影 +成人黄色网站 +成品冰毒出售 +成品冰砖批发 +成都美女上门 +我下面给你吃 +我也要泄了喔 +我再派兵去砸 +我和妹妹肏穴 +我和姐姐肏穴 +我和小姨淫穴 +我和少妇做爱 +我和我的女人 +我威亻言吧吧 +我想p你想吗 +我想和姐姐做 +我想要你懂的 +我方公司密件 +我是鹏的母亲 +我有个大几8 +我淫我色导航 +我淫我色网站 +我爱我色网址 +我的wg岁月 +我的博客网址 +我的小穴好爽 +我的放荡生活 +我的教师生涯 +我的极品老婆 +我的淫荡老师 +我的演员女友 +我的缠绵往事 +我的美女后宫 +我的美女大人 +我的美女情劫 +我的美艳岳母 +我的肾很强大 +我的警花老婆 +我的青年岁月 +我的鸟羽兄弟 +我站在中石油 +我要卖肾qq +我跟妹妹肏穴 +我身边的美女 +战术军刀出售 +战术军刀提供 +战术军刀销售 +战术折刀供应 +战术折刀订购 +战术直刀专卖 +战术直刀出售 +战术直刀批发 +战术直刀销售 +战术砍刀出售 +战神国际娱乐 +户外军刀qq +户外军刀出售 +户外军刀批发 +户外军刀销售 +户外刀具qq +户外刀具买卖 +户外刀具供应 +户外刀具出售 +户外刀具商城 +户外刀具直销 +户外刀具销售 +户外砍刀供应 +户外砍刀出售 +户外砍刀批发 +户外砍刀提供 +户外露胸舔鲍 +手伸到两腿间 +手分开嫩肉缝 +手工刀奴专卖 +手弩买卖qq +手弩供应qq +手弩出售qq +手弩提供qq +手弩销售qq +手机,定位器 +手机卧底qq +手机卧底下载 +手机卧底官网 +手机现金下注 +手机监听官网 +手机监听软件 +手机窃听软件 +手机遥控炸弹 +手机黄色网站 +手枪买卖手枪 +手枪供应qq +手枪制造图纸 +手枪子弹专卖 +手枪子弹供应 +手枪子弹出售 +手枪子弹提供 +手枪子弹订购 +手枪子弹销售 +手枪提供qq +手枪枪管供应 +手枪枪管出售 +手枪枪管批发 +手枪枪管提供 +手枪见面交易 +手枪配件专卖 +手枪配件供应 +手枪配件提供 +手枪配件销售 +手枪阻击枪买 +手枪阻击枪卖 +手狗专卖qq +手狗子弹供应 +手狗子弹出售 +手铐批发qq +扎卡维是英雄 +扒开你的胸罩 +扒开她的嫩穴 +打倒共产主义 +打炮援交服务 +打造单槽苗刀 +打鸟气枪出售 +打鸟气枪销售 +打鸟汽枪qq +打鸟汽枪专卖 +打鸟汽枪供应 +打鸟汽枪出售 +打鸟汽枪批发 +打鸟汽枪提供 +打鸟汽枪直销 +打鸟汽枪订购 +打鸟汽枪转让 +打鸟汽枪销售 +批发3唑仑片 +批发3棱军刀 +批发3棱刀具 +批发3棱刮刀 +批发3棱尖刀 +批发3箭气枪 +批发3箭汽枪 +批发54手枪 +批发d9军刺 +批发ghb水 +批发g水qq +批发k粉qq +批发k粉冰毒 +批发k粉白粉 +批发丁硫环磷 +批发万利达弩 +批发下压气枪 +批发乙酸亚铊 +批发乙酸苯汞 +批发亚砷酸钠 +批发亚砷酸钾 +批发仿真军刺 +批发仿真手枪 +批发仿真步枪 +批发仿真汽枪 +批发仿真警服 +批发仿美秃鹰 +批发供应k粉 +批发供应冰毒 +批发供应冰砖 +批发供应白粉 +批发供应麻古 +批发供应麻谷 +批发假币qq +批发假币电话 +批发假身份证 +批发假钞qq +批发假钱qq +批发假钱电话 +批发兰博军刀 +批发兰博刀具 +批发最新假钱 +批发军刺qq +批发军用刺刀 +批发军用匕首 +批发军用弓弩 +批发军用手枪 +批发军用直刀 +批发冰毒qq +批发冰砖qq +批发出售假币 +批发刀具qq +批发匕首qq +批发北朝鲜冰 +批发原装秃鹰 +批发双刃尖刀 +批发双管猎枪 +批发台版假币 +批发国产气枪 +批发国产秃鹰 +批发大麻qq +批发安乐死药 +批发小飞狼弩 +批发左轮手枪 +批发左轮短狗 +批发弓弩qq +批发弹簧刀具 +批发弹簧跳刀 +批发慢性毒药 +批发成品冰砖 +批发战术折刀 +批发战术砍刀 +批发户外刀具 +批发户外砍刀 +批发手机间谍 +批发手枪枪管 +批发手铐电话 +批发打鸟木仓 +批发打鸟汽枪 +批发提供冰毒 +批发放线菌酮 +批发春药qq +批发正品军刀 +批发气步木仓 +批发氟乙酸钠 +批发氧氯化磷 +批发求生刀具 +批发汽枪子弹 +批发汽枪配件 +批发溴氰菊酯 +批发炸药材料 +批发牙签果子 +批发狗腿砍刀 +批发狙击弓弩 +批发狩猎气枪 +批发猎弩qq +批发猎枪qq +批发猎枪霰弹 +批发猎豹弓弩 +批发现役军刀 +批发甲卡西酮 +批发甲氰菊酯 +批发甲藻毒素 +批发番木鳖碱 +批发白粉qq +批发真身份证 +批发砍刀qq +批发破氧毒素 +批发硝甲西泮 +批发硫酸亚铊 +批发硬币qq +批发碳酸亚铊 +批发秃鹰汽枪 +批发秃鹰膛线 +批发秃鹰配件 +批发精品军刀 +批发绿皮瓦管 +批发缅古qq +批发美国秃鹰 +批发美秃套件 +批发羟基乙腈 +批发臊冰qq +批发自制烟花 +批发英国骚本 +批发莫达非尼 +批发虎头猎枪 +批发蝴蝶刀具 +批发蝴蝶甩刀 +批发蝴蝶跳刀 +批发警徽电话 +批发警服qq +批发警服电话 +批发警械装备 +批发警棍qq +批发警棍电话 +批发警用匕首 +批发警用电棍 +批发警衔电话 +批发警衔警服 +批发赭曲毒素 +批发赵氏弓弩 +批发进口弓弩 +批发进口汽枪 +批发进口汽狗 +批发迷幻蘑菇 +批发迷药qq +批发野营军刀 +批发野营刀具 +批发野营猎刀 +批发野营砍刀 +批发金属气枪 +批发钢珠弓弩 +批发钢珠气枪 +批发钢珠汽枪 +批发钻石冰糖 +批发铅弹模具 +批发铅弹汽枪 +批发铅弹鸟枪 +批发阳江军刺 +批发阳江砍刀 +批发马拉硫磷 +批发马钱子碱 +批发高仿人皮 +批发高仿假币 +批发高仿假钞 +批发高仿假钱 +批发高仿军刺 +批发高仿手枪 +批发高仿气枪 +批发高仿汽枪 +批发高仿警服 +批发高压气枪 +批发高纯k粉 +批发麻古qq +批发麻古果子 +批发麻果qq +批发麻谷qq +批发黄曲霉素 +批发黄白牙签 +批评政府帖子 +批量销售手枪 +找个妞来炮我 +找学生妹上门 +找学生妹出台 +找学生妹服务 +找寂寞夜女友 +找富婆找鸭子 +找服务学生妹 +把肉棒抽出来 +把肉茎舔干净 +投注博彩网站 +抗议中共当局 +折刀专卖qq +折原诗织无码 +折叠手弩配件 +护士mm乱淫 +报警者被击毙 +抵制北京奥运 +抽插仿真器具 +抽插淫荡人妻 +拍肩型昏迷药 +拍肩型迷幻剂 +拍肩迷药qq +拍肩迷药供应 +拍肩迷药出售 +拍肩迷药批发 +拍肩迷药提供 +拍肩迷药直销 +拍肩迷药订购 +拍肩迷药购买 +拍肩迷药销售 +拒绝不了骚的 +持久有力猛男 +指压推油丝袜 +按摩上门服务 +按摩包夜服务 +按摩小妹上门 +按摩小姐兼职 +按摩男女全套 +挡不住的风情 +挺动我的下体 +捅进她的阴道 +捆着我绑着我 +捞金博彩论坛 +换夫妻txt +换妻乱交地址 +换妻同性群p +换妻游戏快播 +换妻群交qq +换妻群交视频 +掰开mm嫩穴 +掰开她的小穴 +掰开嫩穴淫液 +揉阴核与嫩肉 +提供1元假币 +提供3棱军刀 +提供3棱刀具 +提供3棱刮刀 +提供3棱刺刀 +提供3棱尖刀 +提供3箭气枪 +提供54手枪 +提供54手狗 +提供92手枪 +提供fx气皇 +提供ghb水 +提供k粉qq +提供下压气枪 +提供乙基吗啡 +提供乙酸亚铊 +提供亚砷酸钠 +提供亚砷酸钾 +提供仿真军刺 +提供仿真手枪 +提供仿真枪械 +提供仿真枪模 +提供仿真步枪 +提供仿真气枪 +提供仿真汽枪 +提供仿真电狗 +提供仿真警服 +提供仿美秃鹰 +提供假军官证 +提供假币qq +提供假户口本 +提供假结婚证 +提供假证qq +提供假身份证 +提供假钞qq +提供假钱qq +提供健卫步枪 +提供催情药水 +提供兰博军刀 +提供兰博刀具 +提供军人证件 +提供军刀qq +提供军刀军刺 +提供军刺qq +提供军品刺刀 +提供军用刀具 +提供军用刺刀 +提供军用匕首 +提供军用弓弩 +提供军用手枪 +提供军车套牌 +提供冰毒qq +提供冰毒现货 +提供冰毒配方 +提供冰砖qq +提供冰钻qq +提供制毒工具 +提供匕首qq +提供北朝鲜冰 +提供单管猎枪 +提供双刃尖刀 +提供双氢吗啡 +提供双管猎枪 +提供口交服务 +提供台湾秃鹰 +提供吗啡qq +提供固体炸药 +提供国产秃鹰 +提供国外文凭 +提供大斩马刀 +提供大麻qq +提供大黑鹰弩 +提供女性数据 +提供女用春药 +提供娥眉气枪 +提供学历证书 +提供尼可待因 +提供工字气枪 +提供工字汽枪 +提供左轮手枪 +提供左轮手狗 +提供左轮短狗 +提供弹簧跳刀 +提供战术折刀 +提供战术砍刀 +提供户外军刀 +提供户外刀具 +提供户外砍刀 +提供手枪配件 +提供打鸟木仓 +提供打鸟汽枪 +提供折叠手弩 +提供援交qq +提供援交服务 +提供放线菌酮 +提供杀手服务 +提供正品军刺 +提供步枪qq +提供步枪子弹 +提供步枪配件 +提供毕业文凭 +提供毕业证书 +提供气枪qq +提供气枪子弹 +提供气枪配件 +提供气枪铅弹 +提供氟乙酸钠 +提供氢吗啡酮 +提供汽枪子弹 +提供汽枪配件 +提供汽枪钢珠 +提供汽枪铅弹 +提供海豹m9 +提供激情裸聊 +提供激情陪聊 +提供猎枪qq +提供猎枪子弹 +提供猎枪手枪 +提供猎枪霰弹 +提供番木鳖碱 +提供白粉qq +提供真人裸聊 +提供砍刀qq +提供砒霜qq +提供硅烷炸弹 +提供硝胺炸药 +提供硫酸亚铊 +提供碳酸亚铊 +提供秃鹰图纸 +提供秃鹰套件 +提供秃鹰气枪 +提供秃鹰汽枪 +提供秃鹰配件 +提供窃听软件 +提供罂粟种子 +提供美国秃鹰 +提供美女裸聊 +提供美秃套件 +提供肛交服务 +提供肾源qq +提供肾源信息 +提供肾源电话 +提供自制手枪 +提供良家性息 +提供虎头猎枪 +提供蝴蝶甩刀 +提供蝴蝶跳刀 +提供袖珍手枪 +提供裸聊服务 +提供警用手枪 +提供警用棍刀 +提供警用电棍 +提供足交服务 +提供车辆牌照 +提供进口枪支 +提供进口气枪 +提供进口汽狗 +提供进口真枪 +提供迷幻蘑菇 +提供迷情药水 +提供迷药qq +提供重铬酸钠 +提供野营军刀 +提供野营刀具 +提供金属气枪 +提供金钟气枪 +提供钢珠气枪 +提供钢珠汽枪 +提供钢珠猎狗 +提供铅弹模具 +提供铅弹气枪 +提供铅弹汽枪 +提供阿普唑仑 +提供马拉硫磷 +提供马钱子碱 +提供高仿假钞 +提供高仿军刺 +提供高仿手枪 +提供高仿气枪 +提供高仿汽枪 +提供高仿警服 +提供高仿证书 +提供高仿钞票 +提供高压气枪 +提供高压汽枪 +提供鹰枪货源 +提供麻古qq +提供麻古配方 +提供麻谷qq +提供黄白牙签 +插入妈妈肉缝 +插入妹妹穴中 +插入姐姐蜜穴 +插入穴爽死了 +插如妈妈肉穴 +插妈妈的小穴 +插嫩穴淫水流 +插小穴的快感 +插干姐姐好爽 +插护士穴真爽 +插校花聊天室 +插淫穴的快感 +插烂她的小屄 +插烂妹妹小屄 +插的妈妈好爽 +插的姐姐好爽 +插穴射喷精液 +插穴美穴好爽 +插进小穴嫩穴 +插进小穴射了 +援交上门qq +援交信息qq +援交信息电话 +援交全套服务 +援交女生热线 +援交妹妹服务 +援交妹性服务 +援交婊子qq +援交小妹服务 +援交小妹电话 +援交小姐qq +援交小姐包夜 +援交小姐服务 +援交小姐电话 +援交少女qq +援交打炮qq +援交服务qq +援交服务热线 +援交服务电话 +援交美女上门 +援交美女外送 +援交美女服务 +援交鸡婆qq +搜狐攻击腾讯 +搞外遇的大雕 +搞完不再见面 +操你8辈祖宗 +操呀经典综合 +操大fa弟子 +操大东亚共荣 +操大奶淫穴网 +操护士穴真爽 +操日本淫女穴 +操淫女穴贴图 +操淫荡妹妹穴 +操淫荡护士穴 +操滥妳那骚穴 +支持台湾独立 +收售迷药春药 +收购活体肾脏 +收购肾源肝源 +收费裸聊qq +改号软件直销 +改火654k +放线菌酮供应 +放线菌酮批发 +放线菌酮提供 +放线菌酮直销 +放线菌酮销售 +放荡少女少妇 +放荡少妇宾馆 +政党玩弄社会 +政府忽悠百姓 +故山爱表无码 +教师禁断接吻 +斯文女生偷人 +新1本道下载 +新中国3十年 +新唐人电视台 +新山爱里种子 +新情色海岸线 +新普京娱乐城 +新注册送彩金 +新疆75事件 +新疆恐怖分子 +新皇冠娱乐城 +方便联系vx +旅社女服务生 +无上师电视台 +无人性的政权 +无毒av影院 +无码av影院 +无码a片下载 +无码a片种子 +无码做爱淫图 +无码卡通a片 +无码国产a片 +无码国产毛片 +无码性交电影 +无码性交视频 +无码性爱套图 +无码性爱电影 +无码成人影片 +无码成人影院 +无码成人电影 +无码直接下载 +无码美女炮图 +无码高清h片 +无码高清看片 +无码黄片种子 +无限窃听软件 +日吉亚衣bt +日吉亚衣全集 +日吉亚衣种子 +日本av之旅 +日本av女优 +日本av电影 +日本av色片 +日本g片下载 +日本人妻网站 +日本免费黄站 +日本兽交内射 +日本军刀专卖 +日本女优大片 +日本女优种子 +日本巨乳淫女 +日本幼女合集 +日本幼幼合集 +日本性爱图库 +日本性爱图片 +日本性爱爽片 +日本性爱电影 +日本性爱视频 +日本情色电影 +日本情色论坛 +日本成人av +日本成人乱伦 +日本成人动漫 +日本成人影视 +日本成人游戏 +日本成人漫画 +日本成人激情 +日本成人视讯 +日本成人网站 +日本推荐无码 +日本无码3p +日本无码av +日本无码a片 +日本无码bt +日本无码动漫 +日本无码援交 +日本无码系列 +日本无码迅雷 +日本淫穴电影 +日本淫色电影 +日本淫色贴图 +日本淫荡女孩 +日本淫荡妹妹 +日本淫荡孕妇 +日本淫荡少妇 +日本淫荡电影 +日本激情动漫 +日本激情淫穴 +日本激情淫色 +日本激情爽片 +日本激情电影 +日本爽片下载 +日本美女图库 +日本色情图片 +日本色片下载 +日本色片网址 +日本顶级淫女 +日本顶级淫片 +日本香香裸体 +日本高清毛片 +日本黄色电影 +日野美沙种子 +日韩av下载 +日韩av影讯 +日韩av影院 +日韩av视讯 +日韩av视频 +日韩a片视频 +日韩性爱爽片 +日韩性爱视讯 +日韩成人爽片 +日韩成人电影 +日韩成人视讯 +日韩成人视频 +日韩无码色片 +日韩极品a片 +日韩毛片地址 +日韩淫女电影 +日韩激情电影 +日韩群交图片 +日韩色情视讯 +日韩色情网站 +日韩色片下载 +日韩色片地址 +日韩黄片下载 +早川早纪无码 +明升88赌博 +明星自拍做爱 +星崎未来种子 +星崎衣那无码 +星野杏里种子 +星野流宇无码 +星野流宇种子 +春城娱乐淫窝 +春夏自由论坛 +春药供应qq +春药购买qq +普通发票代开 +更新无码av +曾道人神算通 +月荷这个女人 +月野静子无码 +有偿买肾qq +有偿买肾电话 +有偿供应肾源 +有偿卖肾qq +有偿卖肾电话 +有偿售肾qq +有偿捐献肝肾 +有偿捐肝qq +有偿捐肾价格 +有偿捐赠肾脏 +有偿提供肾源 +有偿提供肾脏 +有偿收养小孩 +有偿收肾电话 +有偿购肾qq +有偿送养男孩 +有声性爱小说 +有声成人小说 +有声色情小说 +有快感你就喊 +有意的茄扣扣 +有缘者我违心 +望月星来无码 +望月璐亚无码 +朝仓志穗无码 +朝冈実岭种子 +朝版假币qq +朝美穗香新片 +朝美穗香种子 +朝美雾唯种子 +朝鲜版人民币 +木田彩水种子 +朱镕基,腐败 +机打发票代开 +机打发票出售 +杉山亚来全集 +杉本彩佳无码 +杉本沙香无码 +杉浦亚美种子 +杉浦美由种子 +李克强接班人 +杏野小夜无码 +杏野留丽无码 +来约吧伺候你 +杨丽娜的屁眼 +极品做爱套图 +极品少妇人妻 +极品性感尤物 +极品成人电影 +极品日韩爽片 +极品激情影院 +极品激情电影 +极品熟女服务 +极品美女服务 +极品美女秘书 +极品色片下载 +林心如做爱网 +林心如淫电影 +林心如特级片 +林由美香种子 +果敢汉人开战 +枪弹出售qq +枪支专卖qq +枪支弹药出售 +枪支弹药购买 +枪支弹药销售 +枪支订购热线 +枪支配件出售 +枪支销售qq +枪械制造图纸 +枪械制造方法 +枪械模型转让 +枪械模型销售 +枸橼酸芬太尼 +查看庐江艳照 +柳田弥生种子 +标准炸弹教程 +校园激情淫色 +校园风流邪神 +核弹头的制造 +桃色激情电影 +桑拿丝袜诱惑 +桑拿房玩小姐 +棒阴道好痒痒 +森下理音种子 +森原由纪种子 +森町心美种子 +楠真由美种子 +楼凤上门打炮 +楼凤上门援交 +楼凤信息大全 +楼凤兼职性息 +楼凤小姐qq +楼凤性息大全 +榊原洋子无码 +模特上门包夜 +模特上门援交 +模特全套包夜 +模特兼职小姐 +模特出台服务 +横山早苗无码 +樱井亚美种子 +樱井优子种子 +樱井凉子无码 +樱井凉子种子 +樱井彩美种子 +樱井美里无码 +樱井莉亚无码 +樱井风花种子 +欠爆的野菊花 +欢欢娱乐时空 +欢迎李朋同志 +欧洲bt无码 +欧洲成人影视 +欧洲成人电影 +欧洲色情图片 +欧美3p图片 +欧美av下载 +欧美av影讯 +欧美av影院 +欧美av视讯 +欧美av视频 +欧美av种子 +欧美a片下载 +欧美bt种子 +欧美se情片 +欧美两性淫乱 +欧美乱淫贴图 +欧美做爱炮图 +欧美兽交下载 +欧美女同bt +欧美性交图片 +欧美性交热图 +欧美性交猛图 +欧美性交色图 +欧美性爱下载 +欧美性爱图库 +欧美性爱图片 +欧美性爱爽片 +欧美性爱视讯 +欧美性爱视频 +欧美性爱色片 +欧美情色图片 +欧美情色影片 +欧美情色电影 +欧美情色视讯 +欧美情色视频 +欧美成人av +欧美成人动漫 +欧美成人在线 +欧美成人导航 +欧美成人小说 +欧美成人性爱 +欧美成人无码 +欧美成人电影 +欧美成人社区 +欧美成人视讯 +欧美成人黄片 +欧美无码下载 +欧美无码光碟 +欧美无码原创 +欧美无码快播 +欧美无码援交 +欧美无码爽片 +欧美无码色片 +欧美毛片地址 +欧美淫色贴图 +欧美激情性爱 +欧美激情淫色 +欧美激情爽片 +欧美破处视频 +欧美美女套图 +欧美色图下载 +欧美色情图片 +欧美色情电影 +欧美色情视讯 +欧美色情网址 +欧美色情网站 +欧美色片下载 +欧美色片在线 +欧美色片地址 +欧美色片快播 +欧美高清炮图 +欧美黄色电影 +欲女视频裸聊 +欺负民用车辆 +正品先锋军刀 +正品军刺出售 +正品军刺提供 +正戴上的套套 +正规发票代开 +正规肾源中介 +步qiang +步枪供应qq +步枪出售qq +步枪子弹供应 +步枪子弹出售 +步枪子弹提供 +步枪子弹订购 +步枪子弹销售 +步枪提供qq +步枪配件直销 +武藤早纪无码 +殴打死大学生 +母子乱伦小说 +母子乱伦自拍 +母子乱淫贴图 +毕业证书专卖 +毕业证书制作 +毛主席的嫡孙 +毛人民大会堂 +毛佛展千手法 +毛反恐委员会 +毛台湾共产党 +毛台湾共和国 +毛国民党万岁 +毛天安门1代 +毛天安门事件 +毛天安门屠杀 +毛天安门档案 +毛妹妹贴图区 +毛强效失意药 +毛无界浏览器 +毛晚年周恩来 +毛江core +毛游戏宫理员 +毛游戏管理员 +毛湿透的内裤 +毛激情小电影 +毛片下载地址 +毛片在线观看 +毛狂操你全家 +毛独立台湾会 +毛短信群发器 +毛神通加持法 +毛色情小电影 +毛身份生成器 +毛黄色小电影 +民主不能等待 +民用雷管出售 +气gou专卖 +气gun专卖 +气枪专卖qq +气枪专卖商城 +气枪专卖电话 +气枪买卖qq +气枪价格qq +气枪供应qq +气枪制作图纸 +气枪制造图纸 +气枪子弹销售 +气枪指定销售 +气枪提供qq +气枪枪管专卖 +气枪狗粮专卖 +气枪联系QQ +气枪联系电话 +气枪膛线图纸 +气枪配件专区 +气枪配件专卖 +气枪配件出售 +气枪配件直销 +气枪配件销售 +气枪钢珠批发 +气枪铅弹qq +气枪铅弹专卖 +气枪铅弹出售 +气枪铅弹批发 +气枪铅弹提供 +气枪铅弹直销 +气枪铅弹销售 +气枪销售qq +气狗出售qq +气狗配件出售 +气狗高压气枪 +氟乙酸钠供应 +氟乙酸钠提供 +氟乙酸钠直销 +氟乙酸钠销售 +氧氯化磷供应 +氧氯化磷批发 +氧氯化磷直销 +氧氯化磷销售 +水原朋美无码 +水原朋美种子 +水原珠绪无码 +水咲凉子无码 +水咲凉子种子 +水嫩粉穴内射 +水岛早苗无码 +水岛纱月无码 +水泽りの无码 +水胶炸药专卖 +水胶炸药出售 +水野春树种子 +水野爱里无码 +水野礼子种子 +氵去车仑工力 +氷咲东子无码 +氷咲东子种子 +氷咲沙弥无码 +永利高投注网 +求购3唑仑片 +求购仿真气枪 +求购子炮弹壳 +求购手拉短狗 +江8点江独裁 +江氏政治委员 +江泽慧江泽林 +江湖淫娘下载 +江蛤蟆江核心 +江贼民江折民 +汤川爱菜无码 +汽gou专卖 +汽gou出售 +汽gou批发 +汽gou销售 +汽枪专卖qq +汽枪专卖商城 +汽枪专卖热线 +汽枪制造图纸 +汽枪子弹专卖 +汽枪子弹供应 +汽枪子弹出售 +汽枪子弹提供 +汽枪弹簧配件 +汽枪打猎qq +汽枪提供qq +汽枪看货付款 +汽枪联系qq +汽枪订购qq +汽枪购买qq +汽枪转让qq +汽枪配件专卖 +汽枪配件专营 +汽枪配件供应 +汽枪配件出售 +汽枪配件批发 +汽枪配件提供 +汽枪配件直销 +汽枪配件销售 +汽枪铅弹供应 +汽枪铅弹出售 +汽枪铅弹销售 +汽枪销售qq +汽枪验货付款 +汽狗出售qq +汽狗狗粮专卖 +汽狗狗粮批发 +汽狗高压汽枪 +汽车炸弹制作 +汽车炸药制作 +沈昌人体科技 +沙漠之鹰专卖 +沙漠之鹰出售 +沙漠之鹰销售 +没事偷着射儿 +河合梨音无码 +河野利奈无码 +法lun大法 +法轮gong +波多野结衣吧 +波霸乳交器具 +注册激情电影 +泷泽萝拉bt +泷泽萝拉的爱 +泽井理沙无码 +泽山凉子无码 +洋妞上门按摩 +洋妞上门服务 +洋妞特服上门 +洗浴小妹包夜 +流出大量淫水 +流氓燕的日记 +浅仓志麻无码 +济南小姐援交 +浪漫激情邂逅 +浪穴肉缝嫩穴 +浴室大战走起 +海乐神专卖网 +海豹m9出售 +海豹m9销售 +液体炸弹买卖 +液体炸弹供应 +液体炸弹制作 +液体炸弹提供 +液体炸弹配方 +液体炸药出售 +液体炸药配方 +淄博的性产业 +淘宝阿普唑仑 +淫乱乳交qq +淫乱姐姐小说 +淫乱小说下载 +淫乱护士电影 +淫乱插穴好爽 +淫乱电影下载 +淫乱男女全集 +淫乱的女老板 +淫乱视频下载 +淫乱群交视频 +淫乱色情小说 +淫乱金发美女 +淫乳皇txt +淫人情色导航 +淫人阁播放器 +淫人阁电影网 +淫兽学园下载 +淫叫好爽用力 +淫叫好痒用力 +淫叫快速抽插 +淫叫性器乱伦 +淫叫用力你干 +淫女乱伦小说 +淫女制服诱惑 +淫女教师小说 +淫女疯狂偷情 +淫奸mm电影 +淫奸啊好舒服 +淫奸处女电影 +淫奸处女论坛 +淫奸女同事穴 +淫奸女教师穴 +淫奸妹妹电影 +淫奸妹妹的屄 +淫奸妹妹论坛 +淫奸姐姐小说 +淫奸姐姐电影 +淫奸姐姐论坛 +淫奸小姨子穴 +淫奸小姨电影 +淫奸小姨论坛 +淫奸少女电影 +淫奸少女论坛 +淫奸少妇电影 +淫奸少妇论坛 +淫奸护士小说 +淫奸护士论坛 +淫奸教师论坛 +淫奸秘书电影 +淫奸表姐论坛 +淫奸阿姨电影 +淫奸阿姨论坛 +淫妹妹导航网 +淫妹阴毛小穴 +淫妻交换小说 +淫妻交换电影 +淫妻交换视频 +淫妻浪女小说 +淫姐姐电影网 +淫欲城堡下载 +淫民导航网址 +淫民色址导航 +淫水大量流出 +淫水留入穴中 +淫液沾满阴道 +淫液顺着肉棒 +淫狼av社区 +淫猫朴综合站 +淫秽bt电影 +淫穴技术分析 +淫穴摩擦龟头 +淫穴贴图论坛 +淫色bb贴图 +淫色制服mm +淫色大片下载 +淫色妹妹导航 +淫色宝贝导航 +淫色电影下载 +淫色电影种子 +淫色电影网站 +淫色电影论坛 +淫色网址导航 +淫色网站导航 +淫色贴图导航 +淫色贴图小说 +淫色贴图论坛 +淫色释放贴图 +淫色阁成人网 +淫荡世界影院 +淫荡女医生穴 +淫荡少妇白洁 +淫荡少妇系列 +淫荡有声小说 +淫荡母子好爽 +淫荡熟女人妻 +淫荡爆乳影院 +淫荡痴女贴图 +淫荡美女医生 +淫荡黄蓉系列 +淫虎大型色站 +淫虎成人导航 +淫语痴女性欲 +淫魔舞会下载 +深圳兼职妹妹 +深圳小姐上门 +深圳小姐按摩 +深圳按摩服务 +深田凉子无码 +混蛋神风流史 +温切斯特直销 +温家宝,腐败 +温州鹿城娱乐 +温泉室的男女 +港台av影讯 +港台av影院 +港台av视讯 +港台av视频 +港台性爱视讯 +港台成人视频 +港台色情视讯 +港版假币qq +湿了还说不要 +湿润的嫩穴中 +湿淋淋的阴道 +溴氰菊酯供应 +溴氰菊酯批发 +溴氰菊酯直销 +溴氰菊酯销售 +满洲第三帝国 +满清十大酷刑 +满足你的快感 +满足性欲女人 +漂亮小姐服务 +潮吹女王下载 +澳门3d轮盘 +澳门在线赌场 +激情3p乱伦 +激情av影院 +激情av电影 +激情a片下载 +激情乱交视频 +激情免费电影 +激情免费裸聊 +激情最新网址 +激情动漫成人 +激情午夜毛片 +激情午夜电影 +激情在线裸聊 +激情床戏下载 +激情影片网站 +激情性爱图片 +激情性爱现场 +激情成人乐园 +激情成人午夜 +激情成人图片 +激情成人在线 +激情成人影院 +激情成人淫片 +激情成人游戏 +激情成人电影 +激情成人视频 +激情成人裸聊 +激情淫女小穴 +激情淫少女穴 +激情淫洞小说 +激情淫洞网站 +激情淫穴导航 +激情淫穴小妹 +激情淫穴小站 +激情淫穴小说 +激情淫穴影院 +激情淫穴网站 +激情淫色下载 +激情淫色小穴 +激情淫色故事 +激情淫色文章 +激情淫色游戏 +激情淫色电影 +激情淫色电视 +激情淫色视屏 +激情淫色组图 +激情淫色网站 +激情淫色自拍 +激情淫色论坛 +激情淫色贴图 +激情淫贴图网 +激情玩穴电影 +激情电影种子 +激情真人捰聊 +激情真人视频 +激情真人裸聊 +激情真人陪聊 +激情视频下载 +激情视频交友 +激情视频在线 +激情视频聊天 +激情视频裸聊 +激情网址导航 +激情网站地址 +激情美女视频 +激情美女祼聊 +激情美女聊天 +激情聊天视频 +激情裸体视频 +激情裸体群聊 +激情裸女陪聊 +激情裸聊qq +激情裸聊平台 +激情裸聊服务 +激情裸聊视频 +激情裸聊网址 +激情裸聊网站 +激情裸聊聊天 +激情陪聊qq +激情骚女视频 +激情黄色在线 +激情黄色影片 +激情黄色电影 +濑户由衣种子 +火药配方比例 +炸弹制作方法 +炸药供应qq +炸药制作方法 +炸药制造过程 +炸药当面交易 +炸药生产工艺 +炸药生产流程 +炸药看货付款 +炸药自制方法 +炸药装置制作 +炸药配方制作 +炸药配方大全 +烟花批发qq +烟花爆竹专营 +烟花爆竹出售 +烟花爆竹批发 +烟花鞭炮专卖 +烟雾弹的配方 +焚烧中国国旗 +熟女乱伦联盟 +熟女亚洲无码 +熟女护士乱舞 +熟尻好色袜裤 +燃烧弹diy +燃烧瓶diy +燃烧瓶的制作 +爆乳人妻下载 +爆乳家庭教师 +爆乳痴女诱惑 +爆炸装置制作 +爆竹批发qq +爱上你的屁股 +爱上师娘的床 +爱做爱综合网 +爱原莉央无码 +爱叶亚希全集 +爱叶亚希种子 +爱吃b毛小姐 +爱国运动正名 +爱在大腿之间 +爱就操成人网 +爱川香里无码 +爱梨无码下载 +爱爱激情电影 +爱逼爱操影院 +父女姐弟淫乱 +父女激情淫色 +爸干得你舒服 +爽片观看方法 +牙签冰毒qq +牛b的萨达姆 +牛人自制炸弹 +牧田良美无码 +特码开奖qq +特码推介网站 +特码推荐网站 +特种弓弩专卖 +狂插妹妹小穴 +狂插日本少妇 +狂插林心如穴 +狂插淫穴淫水 +狂插男根胶囊 +狂插美女老师 +狂插美少女穴 +狂插鸡巴狂插 +狂操大奶淫妇 +狂操搔逼妈妈 +狂操空姐嫩穴 +狗屁民族政策 +狙击弓弩供应 +狙击弓弩出售 +狙击弓弩批发 +狙击弓弩直销 +狙击弓弩销售 +狙击步狗专卖 +狙击步狗买卖 +狙击步狗供应 +狙击步狗出售 +狙击步狗批发 +狙击步狗直销 +狙击步狗销售 +狙击气枪专卖 +狙击气枪出售 +狙击汽枪出售 +狙击汽枪销售 +狙击汽狗出售 +狡猾的风水师 +狩猎器材弓弩 +狩猎弓弩专卖 +狩猎弓弩出售 +狩猎弓弩提供 +狩猎弓弩直销 +狩猎弩专卖网 +狩猎枪支销售 +狩猎气枪专卖 +狩猎气枪买卖 +狩猎气枪供应 +狩猎气枪出售 +狩猎气枪批发 +狩猎气枪提供 +狩猎气枪订购 +狩猎气枪购买 +狩猎气狗专卖 +独立中文笔会 +狼友黄站导航 +狼客成人电影 +狼客成人网站 +猎刀专业批发 +猎刀供应qq +猎刀军品专卖 +猎刀军品出售 +猎枪买卖qq +猎枪交易qq +猎枪供应qq +猎枪出售/枪 +猎枪出售qq +猎枪制造图纸 +猎枪哪里有卖 +猎枪子弹供应 +猎枪子弹出售 +猎枪子弹提供 +猎枪子弹销售 +猎枪底火成分 +猎枪底火配方 +猎枪弹药出售 +猎枪手枪买卖 +猎枪手枪出售 +猎枪批发qq +猎枪批发电话 +猎枪提供qq +猎枪提供霰弹 +猎枪真枪出售 +猎枪老牌网站 +猎枪订购qq +猎枪转让qq +猎枪销售qq +猎枪霰弹专卖 +猎狗专卖qq +猎豹弓弩专供 +猎豹弓弩供应 +猎豹弓弩出售 +猎豹弓弩批发 +猎豹弓弩网站 +猎豹弓弩转让 +猛男狂干美女 +猛舔她的肥穴 +猥亵女童事件 +王子淫传下载 +王民生3P照 +王民生不雅照 +王民生群p图 +王民生群p照 +王者弓弩专卖 +现代情色小说 +现代艳帝传奇 +现在的共产党 +现场做爱直播 +现场视频裸聊 +现金博彩网站 +现金在线下注 +现金娱乐投注 +现金投注网站 +现金棋牌网站 +现金游戏平台 +珐(工力)学 +琪琪色原网站 +琴乃夕夏种子 +瑞丰国际赌博 +瑞典色情女奴 +璧山小姐上门 +瓦斯手狗专卖 +瓦斯手狗出售 +瓦斯手狗订购 +生命树的分叉 +生孩子没屁眼 +用刀横向切腹 +用力刺激小穴 +用力扣进小穴 +用英语问小平 +甲卡西酮供应 +甲卡西酮出售 +甲卡西酮出货 +甲卡西酮到货 +甲卡西酮批发 +甲卡西酮提供 +甲卡西酮直销 +甲卡西酮订购 +甲卡西酮配方 +甲卡西酮销售 +甲基安非他命 +甲基安非他明 +甲基甲卡西酮 +甲氰菊酯供应 +甲氰菊酯批发 +甲氰菊酯直销 +甲氰菊酯销售 +甲硝西泮出售 +甲藻毒素供应 +甲藻毒素批发 +甲藻毒素直销 +甲藻毒素销售 +电子雷管出售 +电棍专卖qq +电棍销售qq +电狗专卖qq +电狗铅弹出售 +电狗铅弹销售 +电狗销售电话 +电话出售假币 +电话出售假钞 +电话出售假钱 +电话叫援交妹 +电话批发假钞 +电话猎枪子弹 +电话销售假币 +电车痴汉种子 +男人操逼视频 +男人若妻梦交 +男同av下载 +男同上门会所 +男同成人视讯 +男士养生找我 +男女激情图片 +男女激情淫乱 +男女激情电影 +男妓上门服务 +男男激情影院 +番木鳖碱供应 +番木鳖碱批发 +番木鳖碱提供 +番木鳖碱直销 +番木鳖碱销售 +疯狂姐姐淫穴 +疯狂少妇自拍 +疯狂抽插嫩穴 +痒想不想帮我 +瘟总再杆5年 +白井利奈无码 +白冰黄冰qq +白粉供应qq +白粉出售qq +白粉批发qq +白粉批发交易 +白粉提供qq +白粉购买qq +白粉送货上门 +白粉销售qq +白粉麻古供应 +白粉麻古出售 +白肌美女琴也 +白虎妹与黑人 +白领上门按摩 +白领援交服务 +百乐门娱乐城 +百元假币直销 +百元假钞出售 +百家乐888 +百家性大型色 +百家性淫网站 +皇冠代理网址 +皇冠国际足球 +皇冠在线代理 +皇冠在线投注 +皇冠备用网址 +皇冠投注平台 +皇冠投注网站 +皇冠赌球投注 +皇冠足球投注 +盐羟亚胺出售 +盐酸吗啡供应 +盐酸吗啡出售 +盐酸吗啡提供 +盐酸吗啡销售 +盐酸曲马多片 +监听软件下载 +盘口高额返水 +盲女72小时 +直刀匕首直销 +直播明星援交 +直操她嘴射精 +直销1元硬币 +直销3棱军刀 +直销3棱军刺 +直销3棱刀具 +直销3棱刮刀 +直销3棱刺刀 +直销3棱尖刀 +直销3箭气枪 +直销3箭汽枪 +直销54手枪 +直销ghb水 +直销k粉qq +直销丁硫环磷 +直销下压气枪 +直销中国军刀 +直销乙酸亚铊 +直销乙酸苯汞 +直销乙醚qq +直销亚砷酸钠 +直销交警警服 +直销仿真军刀 +直销仿真手枪 +直销仿真汽枪 +直销仿真警服 +直销仿美秃鹰 +直销伪钞qq +直销假人民币 +直销假币qq +直销假毕业证 +直销假钞qq +直销公安制服 +直销兰博刀具 +直销军刀qq +直销军品刺刀 +直销军用刺刀 +直销军用匕首 +直销军用弩弓 +直销军用手枪 +直销军用猎刀 +直销冰毒qq +直销冰砖qq +直销刺刀qq +直销匕首qq +直销北朝鲜冰 +直销单管猎枪 +直销双刃尖刀 +直销双管猎枪 +直销双管猎狗 +直销台湾秃鹰 +直销听话药水 +直销国产气枪 +直销国产汽枪 +直销国产秃鹰 +直销大黑鹰弩 +直销女警制服 +直销安乐死药 +直销工字气枪 +直销工字汽枪 +直销左轮手枪 +直销左轮短狗 +直销弓弩qq +直销微型汽枪 +直销慢性毒药 +直销户外刀具 +直销手铐qq +直销打鸟汽枪 +直销拍肩迷药 +直销放线菌酮 +直销春药qq +直销正品军刺 +直销气枪qq +直销气枪配件 +直销气枪铅弹 +直销氟乙酸钠 +直销氧氯化磷 +直销汽枪0件 +直销汽枪子弹 +直销汽枪配件 +直销溴氰菊酯 +直销狙击弓弩 +直销狙击气枪 +直销狙击汽枪 +直销狩猎弓弩 +直销狩猎汽枪 +直销猎枪qq +直销猎豹弓弩 +直销甲卡西酮 +直销甲氰菊酯 +直销甲藻毒素 +直销番木鳖碱 +直销白粉qq +直销破氧毒素 +直销硝甲西泮 +直销硫酸亚铊 +直销碳酸亚铊 +直销秃鹰气枪 +直销秃鹰汽枪 +直销秃鹰汽狗 +直销秃鹰猎枪 +直销秃鹰配件 +直销绿皮瓦管 +直销缅古qq +直销美国秃鹰 +直销美秃套件 +直销羟基乙腈 +直销臊冰qq +直销英国骚本 +直销虎头猎枪 +直销蝴蝶跳刀 +直销警察手铐 +直销警察肩章 +直销警徽电话 +直销警服警衔 +直销警用刀具 +直销警用棍刀 +直销警用电棍 +直销警用肩章 +直销警用设备 +直销警用钢叉 +直销赭曲毒素 +直销赵氏弩弓 +直销进口气枪 +直销进口汽枪 +直销进口汽狗 +直销迷奸药丸 +直销迷幻药水 +直销迷幻蘑菇 +直销迷情药水 +直销迷昏药水 +直销迷药qq +直销重铬酸钠 +直销金属气枪 +直销钢珠弓弩 +直销钢珠气枪 +直销钢珠汽枪 +直销钻石冰糖 +直销铅弹模具 +直销铅弹气枪 +直销铅弹汽枪 +直销铅弹鸟枪 +直销阿普唑仑 +直销马拉硫磷 +直销马钱子碱 +直销骚本汽枪 +直销高仿人皮 +直销高仿假钱 +直销高仿军刺 +直销高仿气枪 +直销高仿汽枪 +直销高仿警服 +直销高压步枪 +直销高压气枪 +直销高压汽枪 +直销麻古qq +直销麻古果子 +直销麻果qq +直销麻谷qq +直销黄冰qq +直销黄曲霉素 +相原夏海种子 +相原梨花种子 +相原留美无码 +相叶沙织无码 +相崎琴音无码 +相川まみ无码 +相泽优香无码 +看片儿加薇信 +真人做爱qq +真人做爱视频 +真人博彩网站 +真人在线裸聊 +真人在线赌博 +真人在线赌球 +真人在线麻将 +真人德州扑克 +真人性交视频 +真人性爱视频 +真人收费裸聊 +真人激情裸聊 +真人现金博彩 +真人现金棋牌 +真人现金赌博 +真人真钱麻将 +真人视频做爱 +真人视频性爱 +真人视频祼聊 +真人视频裸聊 +真人视频髁聊 +真人祼聊qq +真人网络赌场 +真人美女裸聊 +真人荷官博彩 +真人裸体聊天 +真人裸体陪聊 +真人裸聊服务 +真人裸聊社区 +真人裸聊视频 +真人裸聊网站 +真人赌博网站 +真城丽美种子 +真实学历办理 +真实淫乱现场 +真空度测试仪 +真身份证出售 +真钱,百家乐 +真钱博彩导航 +真钱娱乐平台 +真钱娱乐游戏 +真钱德州扑克 +真钱棋牌导航 +真钱棋牌游戏 +真钱棋牌网站 +真钱网络赌博 +真钱赌博qq +真钱赌博网站 +真钱赌球投注 +真钱骰宝娱乐 +矢泽洋子无码 +矢田凉子无码 +矢野琴美无码 +短狗销售qq +短篇乱伦小说 +石山梨华种子 +石川爱理bt +石川爱理无码 +石川路亚无码 +石川铃华无码 +石田智美无码 +石绘未季种子 +砂光甩刀qq +砍刀供应qq +砍刀出售qq +砍刀匕首专卖 +砍刀批发qq +砍刀批发电话 +砍刀提供qq +砒霜供应qq +破氧毒素批发 +破氧毒素直销 +砷酸供应qq +硝化甘油合成 +硝化甘油配方 +硝甘炸药出售 +硝甲西泮专卖 +硝甲西泮出售 +硝甲西泮销售 +硝胺炸药出售 +硝铵炸药配方 +硫酸亚铊供应 +硫酸亚铊批发 +硫酸亚铊提供 +硫酸亚铊直销 +硫酸亚铊销售 +碳酸亚铊供应 +碳酸亚铊批发 +碳酸亚铊提供 +碳酸亚铊直销 +碳酸亚铊销售 +磁电雷管出售 +磨蹭阴道阴毛 +礼炮批发qq +社会主义灭亡 +视频luo聊 +视频做爱推荐 +视频做爱聊天 +视频性爱qq +视频成人裸聊 +视频激情裸聊 +视频美女裸聊 +视频裸体聊天 +视频裸聊qq +视频裸聊网站 +神州传播协会 +神田梨沙无码 +神谷沙织无码 +神谷沙织种子 +神谷诗织无码 +禁播a片电话 +禁播色情动漫 +禁播黄片电话 +私售猎枪子弹 +私售秃鹰汽枪 +私售虎头猎枪 +私售进口枪支 +私售销售气枪 +私售麻醉l枪 +私家侦探服务 +秃鹰套件买卖 +秃鹰套件出售 +秃鹰套件图纸 +秃鹰套件批发 +秃鹰套件提供 +秃鹰手枪出售 +秃鹰手枪直销 +秃鹰手枪销售 +秃鹰气枪出售 +秃鹰气枪提供 +秃鹰气枪直销 +秃鹰气枪购买 +秃鹰气枪转让 +秃鹰气枪销售 +秃鹰汽枪qq +秃鹰汽枪专卖 +秃鹰汽枪买卖 +秃鹰汽枪供应 +秃鹰汽枪出售 +秃鹰汽枪出货 +秃鹰汽枪到货 +秃鹰汽枪图纸 +秃鹰汽枪批发 +秃鹰汽枪提供 +秃鹰汽枪电话 +秃鹰汽枪直销 +秃鹰汽枪订购 +秃鹰汽枪转让 +秃鹰汽枪销售 +秃鹰汽狗出售 +秃鹰组装图纸 +秃鹰结构图纸 +秃鹰配件qq +秃鹰配件专区 +秃鹰配件出售 +秃鹰配件电话 +秃鹰配件直销 +秋元优奈种子 +秋吉志帆无码 +秋川沙良无码 +秋本优奈种子 +秋濑留美无码 +秋菜里子种子 +秋野志穗无码 +秘书的大乱交 +秘密调教凌辱 +秦式弓弩供应 +秦氏弓弩专供 +秦氏弓弩专卖 +秦氏弓弩专营 +秦氏弓弩批发 +秦氏弓弩提供 +秦氏弓弩直销 +税收发票代开 +穴口挤出淫水 +穴太紧了插进 +穴门美女图库 +空姐在线裸聊 +空巢留守村妇 +空白发票代开 +空白发票出售 +突击步枪出售 +突击步枪销售 +窃听器材专卖 +窝窝色网之家 +童颜和谐巨乳 +童颜巨乳新片 +竹本里绪无码 +竹野由里无码 +第1次操表姐 +第1色情基地 +第4色男人网 +第5代领导人 +筿原真女种子 +筿原麻美种子 +简易导弹制作 +简易炸弹专卖 +简易炸弹供应 +简易炸弹出售 +简易炸弹制作 +简易炸弹提供 +简易炸药出售 +简易炸药制作 +简直家兼职寇 +粗肉棒大鸡巴 +粗长的大肉棒 +精品气狗专卖 +精品直刀系列 +精子淫穴淫液 +精液中出bt +精液喷射小穴 +精液喷涌而出 +精液射入穴中 +精液射入花心 +精装情不自禁 +素人av影视 +素人av影讯 +素人av视讯 +素人成人影讯 +素人成人视讯 +紧致小穴抽插 +紫外灯验钞笔 +红嫩的小肉穴 +红灯区在哪里 +红灯区的常客 +红蜘蛛迷奸药 +红财神娱乐城 +纯冰出售qq +纯冰销售qq +纯洁的性骚动 +纯爷们x影院 +纱月结花种子 +线上现金下注 +线上现金娱乐 +线上真人视频 +线上真钱赌博 +线上裸聊qq +线上赌博游戏 +线上轮盘博彩 +绀野沙织无码 +组装手枪专卖 +组装手枪提供 +组装枪支买卖 +经典乱伦av +经典成人电影 +经营仿真气枪 +经营电动长狗 +经营英国骚本 +结城杏奈种子 +给总理支1招 +绝色网吧惊变 +绫见志穗全集 +绫见志穗无码 +绫见志穗种子 +维族学生狂殴 +绵恒异议人士 +绿皮瓦管专卖 +绿色成人网站 +绿藜芦生物碱 +缅古供应qq +缅古批发qq +缅古送货上门 +缅古销售qq +缅甸麻古出售 +缅甸麻古销售 +罂粟出售qq +罂粟种子销售 +网上办假文凭 +网上博彩娱乐 +网上售毕业证 +网上在线赌场 +网上性交qq +网上气枪订购 +网上汽枪订购 +网上现金游戏 +网上现金赌场 +网上真人梭哈 +网上真钱娱乐 +网上真钱赌博 +网上真钱轮盘 +网上真钱麻将 +网上订购气枪 +网上订购汽枪 +网上赌博游戏 +网上赌钱qq +网上赌钱娱乐 +网络博彩qq +网络在线赌场 +网络情色小说 +网络炒作培训 +网络现金博彩 +网络现金赌钱 +网络皇家赌城 +网络真人博彩 +网络真人赌博 +网络真人赌场 +网络真钱赌博 +网络真钱赌场 +网络私彩赌博 +网络赌博平台 +网络赌博网址 +网络赌场qq +网络足球投注 +美乳看护学生 +美咲留衣无码 +美咲留衣种子 +美国军刀出售 +美国成人网站 +美国文凭代办 +美国秃鹰qq +美国秃鹰出售 +美国秃鹰到货 +美国秃鹰批发 +美国秃鹰提供 +美国秃鹰电话 +美国秃鹰直销 +美国秃鹰订购 +美国秃鹰转让 +美国色情基地 +美女av图片 +美女qq裸聊 +美女qq裸舞 +美女上门做爱 +美女上门兼职 +美女上门口交 +美女上门按摩 +美女上门援交 +美女上门服务 +美女上门爱爱 +美女上门肛交 +美女主持脱衣 +美女倒提金方 +美女免费裸聊 +美女兼职上门 +美女出台包夜 +美女出台服务 +美女包夜按摩 +美女包夜援交 +美女口交视频 +美女多多影院 +美女性交真图 +美女性爱视频 +美女性爱美图 +美女打炮服务 +美女护士被奸 +美女援交qq +美女援交服务 +美女援交电话 +美女极品嫩穴 +美女沙滩换衣 +美女淫水狂流 +美女激情a片 +美女激情视频 +美女激情聊天 +美女激情裸聊 +美女激情陪聊 +美女特殊服务 +美女直播做爱 +美女直播软件 +美女看穴裸聊 +美女视频短片 +美女视频聊天 +美女视频裸聊 +美女肛交视频 +美女自慰视频 +美女裸体聊天 +美女裸聊qq +美女裸聊视频 +美女裸聊网址 +美女裸聊网站 +美女裸聊自慰 +美妻淫妓系列 +美少妇的哀羞 +美眉全套服务 +美空超级美女 +美竹凉子无码 +美竹凉子种子 +美腿美穴大屌 +美里未梨种子 +羟基乙腈供应 +羟基乙腈批发 +羟基乙腈直销 +羟基乙腈销售 +群交av下载 +群交影片下载 +群交插入影院 +群交视频下载 +群众包围政府 +翻手男覆手女 +翻身改做小姐 +老师被干小穴 +老牌秃鹰气枪 +考前出售答案 +考前答案供应 +考前答案提供 +职业杀手qq +职称证书制作 +肉体上的安慰 +肉棍嫩穴肉洞 +肉棍狂插嫩穴 +肉棍狂插阴精 +肉棒乱伦肉洞 +肉棒全部插入 +肉棒压着阴蒂 +肉棒好舒服喔 +肉棒快速抽插 +肉棒抽插不要 +肉棒抽插小穴 +肉棒挤入蜜穴 +肉棒插入嫩穴 +肉棒插入子宫 +肉棒插入小穴 +肉棒插入浪穴 +肉棒插入穴中 +肉棒插入肉洞 +肉棒插入肉穴 +肉棒插入肉缝 +肉棒插入阴户 +肉棒插入阴道 +肉棒插入骚穴 +肉棒插进美穴 +肉棒插进蜜穴 +肉棒淫水嫩穴 +肉棒深入花心 +肉棒狂插嫩穴 +肉棒猛烈拔插 +肉棒用力肉缝 +肉棒的抽插啊 +肉棒直插花心 +肉棒肉洞肉缝 +肉棒舌头蜜穴 +肉棒进入肉洞 +肉棒里插肉洞 +肉棒顶到花心 +肉棒顶开阴唇 +肉洞肉棒肉缝 +肉缝分开大腿 +肉缝蜜穴肉棒 +肉蒲团txt +肛交全套服务 +肛交在线观看 +肛交视频下载 +肝脏价格qq +股民不是人民 +股民信息出售 +股民电话资源 +肾源中介qq +肾源中介公司 +肾源买卖qq +肾源价格qq +肾源供应qq +肾源信息供应 +肾源出售qq +肾源提供中介 +肾源联系qq +肾源肝源中介 +胡锦涛,腐败 +脱衣激情聊天 +脱衣裸聊qq +腰刀专卖qq +腰刀批发qq +自制c4教程 +自制冰毒教程 +自制冰毒方法 +自制土枪出售 +自制地雷方法 +自制塑料炸弹 +自制太安炸药 +自制弩机方法 +自制手枪qq +自制手枪专卖 +自制手枪买卖 +自制手枪仿真 +自制手枪供应 +自制手枪出售 +自制手枪图纸 +自制手枪提供 +自制手枪直销 +自制手枪订购 +自制手枪销售 +自制手狗出售 +自制枪支销售 +自制枪械出售 +自制枪械销售 +自制气枪出售 +自制气枪图纸 +自制火药流程 +自制炸弹供应 +自制炸弹教程 +自制炸药出售 +自制炸药方法 +自制炸药流程 +自制炸药配方 +自制猎枪销售 +自制礼炮电话 +自制简易手枪 +自制简易炸药 +自制巡航导弹 +自制钢珠汽枪 +自制雷管教程 +自动跳刀专卖 +自由亚洲电台 +自由民主论坛 +至尊情色王朝 +舌头舔小肉缝 +舌头舔着阴核 +舌头舔进阴道 +舔吮她的阴唇 +舔她的小洞洞 +舞岛美织种子 +舞田奈美种子 +色av色影院 +色mm的嫩穴 +色mm穴激情 +色中色导航网 +色中色电影网 +色人阁新网址 +色吧成人娱乐 +色咪咪色导航 +色哥链综合站 +色天堂18禁 +色女乳房阴道 +色女陪聊qq +色妞成人基地 +色妹妹情色网 +色妹妹成人网 +色妹妹成人论 +色情3p电影 +色情av下载 +色情bt影片 +色情动漫下载 +色情动漫在线 +色情图片下载 +色情在线影院 +色情在线电影 +色情娱乐导航 +色情导航导航 +色情小说下载 +色情帝国黄站 +色情影片下载 +色情影视基地 +色情成人游戏 +色情成人社区 +色情成人网站 +色情成人聊天 +色情武侠小说 +色情淫乱电影 +色情游戏下载 +色情电影专区 +色情电影大全 +色情视频下载 +色情视频聊天 +色情网址大全 +色情网站导航 +色情草榴社区 +色戒情爱影院 +色桥人体艺术 +色淫嬉女媳站 +色片下载地址 +色片在线地址 +色片在线直播 +色狗中文娱乐 +色狗成人影院 +色狗成人快播 +色狗成人电影 +色狼友综合网 +色狼窝成人网 +色狼窝电影院 +色狼网址导航 +色狼集中营网 +色猫情色论坛 +色窝窝网之家 +色站在线观看 +色站排行导航 +色聊服务qq +色色成人影视 +色色成人影院 +色色成人激情 +色色电影网站 +色鬼师异界行 +艳情短片小说 +艳照种子下载 +艳照种子全套 +艳照门完整版 +艳舞女郎资源 +花与蛇地狱篇 +花心大型色站 +花心成人论坛 +苍蝇粉出售q +苍蝇粉销售q +若奥纱美无码 +若林树里种子 +若菜濑奈无码 +苯甲基芽子堿 +英国骚本供应 +英国骚本出售 +英国骚本批发 +英国骚本提供 +英国骚本直销 +英国骚本订购 +英国骚本转让 +英国骚本销售 +茗字就威幸呺 +草榴最新网址 +草榴地址发布 +草榴成人导航 +草榴社区qq +草榴社区网址 +荡妖艳女医生 +菊川沙织无码 +菲律宾百家乐 +萌萌裸聊视频 +萝莉爆乳幼齿 +萝莉美女综合 +董cun瑞问 +蒙古分裂分子 +蓝井路加无码 +蓝光亚洲av +蓝光日本无码 +藏春阁全免费 +藤乃弥生无码 +藤北彩香无码 +藤原史步无码 +藤原杏面无码 +藤崎彩花种子 +藤泽翔子无码 +藤田亮子无码 +藤谷诗织无码 +虎头双管直销 +虎头牌猎枪出 +虎头猎枪qq +虎头猎枪供应 +虎头猎枪出售 +虎头猎枪出货 +虎头猎枪到货 +虎头猎枪制造 +虎头猎枪图纸 +虎头猎枪批发 +虎头猎枪提供 +虎头猎枪电话 +虎头猎枪订购 +虎头猎枪销售 +蜜汁舔穴塞入 +蜜穴肉棒肉缝 +蝴蝶刀专卖网 +蝴蝶刀具供应 +蝴蝶刀具批发 +蝴蝶折刀出售 +蝴蝶甩刀买卖 +蝴蝶甩刀代理 +蝴蝶甩刀供应 +蝴蝶甩刀出售 +蝴蝶甩刀批发 +蝴蝶甩刀提供 +蝴蝶甩刀直销 +蝴蝶甩刀订做 +蝴蝶甩刀订购 +蝴蝶甩刀购买 +蝴蝶甩刀销售 +蝴蝶谷中文网 +蝴蝶谷淫图片 +蝴蝶谷激情网 +蝴蝶谷色情网 +蝴蝶谷色色网 +蝴蝶跳刀专卖 +蝴蝶跳刀买卖 +蝴蝶跳刀供应 +蝴蝶跳刀出售 +蝴蝶跳刀批发 +蝴蝶跳刀提供 +蝴蝶跳刀直销 +蝴蝶跳刀销售 +血溅人民天堂 +表演bb喷水 +袖珍手枪专卖 +袖珍手枪供应 +袖珍手枪出售 +袖珍手枪销售 +裸体激情聊天 +裸体视频qq +裸体视频网站 +裸体视频聊天 +裸体聊天视频 +裸体聊天网址 +裸体聊天网站 +裸体陪聊qq +裸女视频qq +裸女视频聊天 +裸女视频陪聊 +裸女聊天qq +裸聊qq聊天 +裸聊交友qq +裸聊交友网址 +裸聊做爱表演 +裸聊小姐qq +裸聊快播qq +裸聊成人视频 +裸聊真人激情 +裸聊视讯妹妹 +裸聊视频qq +裸聊视频下载 +裸聊视频平台 +裸聊视频网址 +裸聊视频网站 +裸聊视频表演 +裸聊美女qq +裸聊美女网址 +裸聊表演qq +裸聊软件下载 +西班牙催情水 +西班牙苍蝇水 +西班牙苍蝇粉 +西田美沙种子 +西秋爱菜无码 +西野纱雪无码 +要干我操内射 +警号订购qq +警察肩章销售 +警徽供应qq +警徽制作qq +警徽销售qq +警服专卖qq +警服供应电话 +警服常服供应 +警服批发电话 +警服电棒专卖 +警服警衔批发 +警服警衔直销 +警服销售qq +警棍专卖电话 +警棍买卖qq +警棍供应电话 +警棍出售qq +警棍订购电话 +警棍销售电话 +警用刀具出售 +警用刀具订购 +警用匕首买卖 +警用匕首批发 +警用匕首销售 +警用手枪专卖 +警用手铐供应 +警用手铐批发 +警用手铐提供 +警用服装批发 +警用棍刀出售 +警用棍刀销售 +警用电棍qq +警用电棍专卖 +警用电棍买卖 +警用电棍供应 +警用电棍出售 +警用电棍提供 +警用电棍订购 +警用电棍销售 +警用肩章销售 +警用钢叉出售 +警衔专卖电话 +警衔供应电话 +警衔出售qq +警衔批发电话 +警衔销售电话 +订购1体直刀 +订购3唑仑片 +订购3棱军刀 +订购3棱刮刀 +订购3棱尖刀 +订购3箭气枪 +订购54式枪 +订购64手枪 +订购77手枪 +订购ak军刺 +订购ghb水 +订购k粉qq +订购下压气枪 +订购仿真手枪 +订购仿真步枪 +订购仿真汽枪 +订购仿美秃鹰 +订购催情药水 +订购全刃军刺 +订购兰博刀具 +订购军刀qq +订购军刀军刺 +订购军用刺刀 +订购冰砖qq +订购北朝鲜冰 +订购原装秃鹰 +订购原装骚本 +订购双刃尖刀 +订购台湾秃鹰 +订购吗啡qq +订购喷雾迷药 +订购国产气枪 +订购国秃qq +订购大麻qq +订购大黑鹰弩 +订购工字狗粮 +订购弹簧跳刀 +订购慢性毒药 +订购战术折刀 +订购手枪子弹 +订购打鸟汽枪 +订购春药qq +订购步枪子弹 +订购步枪配件 +订购气枪qq +订购狩猎弓弩 +订购狩猎气枪 +订购猎豹弓弩 +订购眼镜蛇弩 +订购秃鹰气枪 +订购秃鹰猎枪 +订购秃鹰配件 +订购绿皮瓦管 +订购罂粟种子 +订购苯基丙酮 +订购英国骚本 +订购蝴蝶甩刀 +订购警用刀具 +订购警用电棍 +订购赌博迷药 +订购赵氏弓弩 +订购进口气枪 +订购迷幻蘑菇 +订购迷药qq +订购迷魂香烟 +订购金属气枪 +订购钢珠气枪 +订购钢珠汽枪 +订购钻石冰糖 +订购铅弹模具 +订购铅弹汽枪 +订购铅弹鸟枪 +订购阿普唑仑 +订购高仿军刺 +订购高仿手枪 +订购高仿气枪 +订购高仿汽枪 +订购高仿警服 +订购高压气枪 +订购麻古qq +订购麻古果子 +订购黄白牙签 +证件办理qq +证件印章制作 +证监会不作为 +诚信出售k粉 +诚信出售冰毒 +诚信出售气狗 +诚信办理文凭 +话在肉身显现 +诱人美眉裸聊 +诱惑ai情妇 +说艳门男女爽 +诺贝尔和平奖 +调教sm服务 +调教男奴信息 +调查中国证监 +谷川理沙无码 +财务发票代开 +财税发票代开 +购买3棱刮刀 +购买3棱尖刀 +购买3箭气枪 +购买77手枪 +购买仿真枪模 +购买仿真汽枪 +购买仿美秃鹰 +购买假币qq +购买冰毒qq +购买冰砖qq +购买国产气枪 +购买国产秃鹰 +购买学历qq +购买弹簧跳刀 +购买文凭qq +购买春药qq +购买枪支QQ +购买气枪专卖 +购买汽枪qq +购买汽枪配件 +购买沙漠之鹰 +购买狩猎气枪 +购买秃鹰气枪 +购买秃鹰汽枪 +购买自爆材料 +购买英国骚本 +购买蝴蝶甩刀 +购买警察手铐 +购买警察装备 +购买警用电棍 +购买跳刀qq +购买钢珠气枪 +购买钢珠汽枪 +购买铅弹模具 +购买铅弹汽枪 +购买铅弹鸟枪 +购买高仿手枪 +购买高仿气枪 +购买高仿汽枪 +购买麻果qq +贱女人淫护士 +贵阳上门小姐 +资格证书制作 +赌博娱乐投注 +赌博娱乐网址 +赤裸天使成人 +赭曲毒素供应 +赭曲毒素批发 +赭曲毒素直销 +赭曲毒素销售 +赵式弓弩专卖 +赵氏弓弩专卖 +赵氏弓弩供应 +赵氏弓弩出售 +赵氏弓弩批发 +赵氏弓弩直销 +赵氏弓弩转让 +赵氏弓弩销售 +赵氏弩弓出售 +赵氏弩弓直销 +赵氏猎鹰销售 +赵紫阳的道路 +超爽午夜剧场 +超爽性爱电影 +超级禽兽下载 +超级翻墙组合 +越之极品色女 +足球投注网址 +足球投注网站 +足球真钱投注 +足球赌博网站 +践踏中国女性 +跳刀专卖qq +跳刀买卖qq +跳刀出售qq +跳刀销售qq +身下胯下可否 +身份证生成器 +躺僧吸舔取精 +转卖54手枪 +转让2手军刀 +转让3棱军刀 +转让3棱军刺 +转让3棱刀具 +转让3棱刮刀 +转让3棱尖刀 +转让3箭气枪 +转让3箭汽枪 +转让54手枪 +转让ak军刺 +转让下压气枪 +转让二手刀具 +转让仿真军刺 +转让仿真手枪 +转让仿真手狗 +转让仿真枪模 +转让仿真汽枪 +转让全新弓弩 +转让兰博军刀 +转让兰博刀具 +转让军品刺刀 +转让军用匕首 +转让力斯曼弩 +转让原装秃鹰 +转让双刃尖刀 +转让台湾秃鹰 +转让国产气枪 +转让国产汽枪 +转让国产秃鹰 +转让大黑鹰弩 +转让娥眉气枪 +转让工字气枪 +转让工字汽枪 +转让开刃军刀 +转让戈博军刀 +转让户外名刀 +转让手拉短狗 +转让打鸟汽枪 +转让新开山刀 +转让气枪铅弹 +转让汽枪qq +转让狙击汽枪 +转让猎枪qq +转让秃鹰气枪 +转让秃鹰汽枪 +转让秃鹰配件 +转让绿皮瓦管 +转让美秃套件 +转让自制手枪 +转让自制步枪 +转让英国骚本 +转让虎头猎枪 +转让蝴蝶甩刀 +转让蝴蝶跳刀 +转让赵氏弓弩 +转让转轮手枪 +转让进口汽枪 +转让进口汽狗 +转让金属气枪 +转让金钟气枪 +转让钢珠气枪 +转让钢珠汽枪 +转让铅弹模具 +转让铅弹气枪 +转让铅弹汽枪 +转让铅弹鸟枪 +转让骚本汽枪 +转让高仿军刺 +转让高仿手枪 +转让高仿气枪 +转让高仿汽枪 +转让高压气枪 +转让高压汽枪 +轮奸做爱高潮 +轮奸视频下载 +轮盘博彩平台 +辽宁雇佣杀手 +迅雷3级影片 +迅雷日本无码 +过机假钞出售 +过机假钞销售 +过机版人民币 +过滤软件之争 +还是党的国家 +进口匕首专卖 +进口原装美秃 +进口弓弩专卖 +进口弓弩供应 +进口弓弩出售 +进口弓弩批发 +进口弓弩提供 +进口弓弩转让 +进口弓弩销售 +进口弩弓专卖 +进口弩弓提供 +进口手枪专卖 +进口步枪专卖 +进口步枪供应 +进口步枪批发 +进口步枪提供 +进口步枪直销 +进口步枪订购 +进口步枪购买 +进口步枪转让 +进口气枪qq +进口气枪专卖 +进口气枪供应 +进口气枪出售 +进口气枪出货 +进口气枪到货 +进口气枪电话 +进口气枪直销 +进口气枪网站 +进口气枪订购 +进口气枪转让 +进口气枪销售 +进口气枪预定 +进口气狗专卖 +进口气狗出售 +进口气狗销售 +进口汽枪qq +进口汽枪供应 +进口汽枪直销 +进口汽枪销售 +进口汽狗专卖 +进口汽狗买卖 +进口汽狗供应 +进口汽狗批发 +进口汽狗提供 +进口汽狗转让 +进口猎枪专卖 +进口真枪出售 +进口秃鹰qq +进口秃鹰销售 +远程弓努专卖 +远藤悠美无码 +远野小春种子 +连发猎枪专卖 +连发猎枪销售 +连发猎狗专卖 +迷失少女天堂 +迷奸全套种子 +迷奸双胞妹妹 +迷奸药水供应 +迷奸药水出售 +迷奸药水批发 +迷奸药水提供 +迷奸香水出售 +迷幻药出供应 +迷幻药水出售 +迷幻药水销售 +迷幻药香烟型 +迷幻蘑菇批发 +迷幻蘑菇提供 +迷幻蘑菇直销 +迷幻蘑菇订购 +迷幻香烟出售 +迷幻香烟购买 +迷幻香烟销售 +迷情药水供应 +迷情药水提供 +迷情药水销售 +迷药供应qq +迷药出售qq +迷魂香水出售 +迷魂香水销售 +迷魂香烟专卖 +迷魂香烟供应 +迷魂香烟批发 +迷魂香烟提供 +迷魂香烟直销 +迷魂香烟订购 +迷魂香烟销售 +逃亡艳旅下载 +通用发票代开 +速效催眠香水 +那晚く涐佷爽 +郑州弓弩专卖 +都市春潮下载 +配制太恩炸药 +酒井若叶无码 +酒井路奈无码 +酒店上门服务 +酒店发票出售 +酒店小姐服务 +酷刑对待中国 +里有汽枪出售 +重庆上门按摩 +重庆兼职妹妹 +重庆兼职美女 +重庆冰毒出售 +重铬酸钠供应 +重铬酸钠批发 +重铬酸钠提供 +重铬酸钠直销 +重铬酸钠销售 +野外军刀专卖 +野性家庭教师 +野战狗粮专卖 +野战电狗专卖 +野营军刀专卖 +野营军刀买卖 +野营军刀供应 +野营军刀出售 +野营军刀批发 +野营军刀提供 +野营军刀销售 +野营刀具专卖 +野营刀具供应 +野营刀具出售 +野营刀具提供 +野营刀具直销 +野营刀具转让 +野营刀具销售 +野营猎刀专卖 +野营砍刀专卖 +野营砍刀批发 +金井梨里无码 +金亚洲总代理 +金华小姐上门 +金发白虎女模 +金子里沙无码 +金宝博赌球网 +金属仿真枪网 +金属气枪批发 +金属气枪提供 +金属气枪直销 +金属气枪订购 +金属气枪转让 +金属气枪销售 +金弓电狗销售 +金泽文子种子 +金泽明子bt +金泽明子无码 +金泽蓝子全集 +金瓶梅txt +金瓶梅情色网 +金瓶梅的巨著 +金皇冠娱乐城 +金盾博彩平台 +金苍蝇催情水 +金融派系倾轧 +金钟气枪qq +金钟气枪供应 +金钟气枪出售 +金钟气枪出货 +金钟气枪到货 +金钟气枪制造 +金钟气枪图纸 +金钟气枪提供 +金钟气枪电话 +金钟气枪订购 +金钟气枪转让 +金马博彩娱乐 +钢弹气枪销售 +钢珠专用手弩 +钢珠弓弩qq +钢珠弓弩专卖 +钢珠弓弩供应 +钢珠弓弩出售 +钢珠弓弩提供 +钢珠弓弩直销 +钢珠弓弩销售 +钢珠弩专卖网 +钢珠气枪专卖 +钢珠气枪供应 +钢珠气枪出售 +钢珠气枪提供 +钢珠气枪直销 +钢珠气枪订购 +钢珠气枪购买 +钢珠气枪销售 +钢珠汽枪供应 +钢珠汽枪批发 +钢珠汽枪提供 +钢珠汽枪直销 +钢珠汽枪订购 +钢珠汽枪购买 +钢珠汽枪转让 +钢珠汽枪销售 +钢珠狗粮批发 +钻石冰糖qq +钻石冰糖专卖 +钻石冰糖出售 +钻石冰糖提供 +钻石冰糖销售 +铀毒qq批发 +铀毒批发qq +铃木志穗无码 +铃木爱理bt +铃木爱理无码 +铃木爱里无码 +铅弹批发qq +铅弹模具qq +铅弹模具供应 +铅弹模具出售 +铅弹模具批发 +铅弹模具提供 +铅弹模具直销 +铅弹模具订购 +铅弹模具购买 +铅弹模具转让 +铅弹模具销售 +铅弹气枪qq +铅弹气枪出售 +铅弹气枪出货 +铅弹气枪到货 +铅弹气枪电话 +铅弹气枪直销 +铅弹气枪订购 +铅弹气枪转让 +铅弹气枪销售 +铅弹汽枪供应 +铅弹汽枪出售 +铅弹汽枪批发 +铅弹汽枪直销 +铅弹汽枪订购 +铅弹汽枪购买 +铅弹鸟枪供应 +铅弹鸟枪批发 +铅弹鸟枪提供 +铅弹鸟枪直销 +铅弹鸟枪订购 +铅弹鸟枪购买 +铅弹鸟枪销售 +铊盐供应qq +铊盐出售qq +铊盐批发qq +铝热剂燃烧弹 +铵梯炸药出售 +铵油炸药出售 +银行卡复制器 +销售1体直刀 +销售1元假币 +销售1元硬币 +销售3棱军刀 +销售3棱军刺 +销售3棱刀具 +销售3棱刮刀 +销售3棱刺刀 +销售3棱尖刀 +销售3箭气枪 +销售3箭汽枪 +销售54手枪 +销售54枪支 +销售77猎枪 +销售92手枪 +销售ak军刀 +销售co2狗 +销售cp99 +销售d9军刺 +销售fx气皇 +销售ghb水 +销售jia币 +销售k粉qq +销售m300 +销售万利达弩 +销售乙基吗啡 +销售乙酸亚铊 +销售乙酸苯汞 +销售亚砷酸钠 +销售亚砷酸钾 +销售交警警服 +销售仿制警服 +销售仿真假钞 +销售仿真假钱 +销售仿真军刀 +销售仿真军刺 +销售仿真手枪 +销售仿真枪械 +销售仿真枪模 +销售仿真步枪 +销售仿真气枪 +销售仿真汽枪 +销售仿美秃鹰 +销售假人民币 +销售假币qq +销售假币模具 +销售假币网站 +销售假毕业证 +销售假证qq +销售假钞qq +销售假钱qq +销售健卫步枪 +销售公安制服 +销售兰博刀具 +销售军刀qq +销售军刀军刺 +销售军刺qq +销售军用54 +销售军用刺刀 +销售军用弓弩 +销售军用手枪 +销售军用折刀 +销售军用猎刀 +销售冰古qq +销售冰毒qq +销售冰砖qq +销售匕首qq +销售匕首刀具 +销售北朝鲜冰 +销售单管猎枪 +销售原装秃鹰 +销售去甲吗啡 +销售双刃尖刀 +销售双氢吗啡 +销售台湾秃鹰 +销售台版假币 +销售台秃qq +销售右吗拉胺 +销售吗啡qq +销售吗啡电话 +销售吗啡联系 +销售听话药水 +销售喷雾迷药 +销售国产手枪 +销售国产气狗 +销售国产汽枪 +销售地索吗啡 +销售塑胶炸弹 +销售大麻qq +销售大黑鹰弩 +销售女性数据 +销售娥眉气枪 +销售子弹qq +销售子弹模具 +销售尼可吗啡 +销售尼可待因 +销售工字气枪 +销售左轮手枪 +销售左轮短狗 +销售异美沙酮 +销售弓弩qq +销售弓弩之家 +销售弩狩猎网 +销售战术军刀 +销售战术折刀 +销售户外刀具 +销售手弩qq +销售手枪qq +销售手枪子弹 +销售手枪配件 +销售手狗配件 +销售拍肩迷药 +销售捷克左轮 +销售放线菌酮 +销售新版假币 +销售春药qq +销售普斯普剂 +销售有机溶剂 +销售枪支qq +销售枪支套件 +销售枪支弹药 +销售步枪qq +销售步枪子弹 +销售步枪配件 +销售毕业文凭 +销售气枪qq +销售氟乙酸钠 +销售氢吗啡酮 +销售氢吗啡醇 +销售氧氯化磷 +销售水晶冰毒 +销售汽gou +销售汽枪0件 +销售汽枪qq +销售汽枪子弹 +销售汽枪配件 +销售汽枪铅弹 +销售海豹m9 +销售溴氰菊酯 +销售狙击弓弩 +销售狙击步枪 +销售狙击步狗 +销售狙击气枪 +销售狙击汽枪 +销售狩猎弓弩 +销售猎弩qq +销售猎枪qq +销售猎枪子弹 +销售猎枪底火 +销售猎枪手枪 +销售猎枪霰弹 +销售猎豹弓弩 +销售现役军刀 +销售瑞芬太尼 +销售瓦斯手枪 +销售甲氰菊酯 +销售甲藻毒素 +销售电狗qq +销售番木鳖碱 +销售白粉qq +销售百元假钞 +销售盐羟亚胺 +销售短狗qq +销售碳酸亚铊 +销售秃鹰图纸 +销售秃鹰汽枪 +销售秃鹰皮碗 +销售秃鹰配件 +销售秦氏弓弩 +销售窃听器材 +销售窃听软件 +销售纯古冰毒 +销售绿皮瓦管 +销售缅古qq +销售缅甸麻古 +销售美国军刀 +销售美国秃鹰 +销售羟基乙腈 +销售考试答案 +销售自制手雷 +销售舒芬太尼 +销售苯基丙酮 +销售英国骚本 +销售虎头双管 +销售虎头猎枪 +销售蝴蝶刀具 +销售蝴蝶甩刀 +销售蝴蝶跳刀 +销售袖珍手枪 +销售警察肩章 +销售警服qq +销售警服常服 +销售警用匕首 +销售警用棍刀 +销售警用电棍 +销售警用肩章 +销售贝齐米特 +销售赭曲毒素 +销售跳刀qq +销售跳刀电话 +销售过机假钞 +销售运动步枪 +销售进口匕首 +销售进口弓弩 +销售进口气枪 +销售进口气狗 +销售进口汽枪 +销售进口秃鹰 +销售连发手枪 +销售连发猎枪 +销售迷情药水 +销售迷药qq +销售追风弓弩 +销售重铬酸钠 +销售野营军刀 +销售野营刀具 +销售金属枪模 +销售金属气枪 +销售金钟气枪 +销售金钟汽枪 +销售钢弹气枪 +销售钢珠弓弩 +销售钢珠手弩 +销售钢珠气枪 +销售钢珠汽枪 +销售钢珠猎狗 +销售钻石冰糖 +销售铅弹模具 +销售铅弹气枪 +销售铅弹汽枪 +销售铊盐qq +销售锡牌汽枪 +销售锡锋气枪 +销售防身弓弩 +销售阿普唑仑 +销售阿芬太尼 +销售雷管qq +销售马拉硫磷 +销售马钱子碱 +销售骚本气枪 +销售高仿人皮 +销售高仿假币 +销售高仿假钞 +销售高仿军刺 +销售高仿文凭 +销售高仿气枪 +销售高仿汽枪 +销售高仿真枪 +销售高仿钞票 +销售高压气枪 +销售高压汽枪 +销售高纯k粉 +销售高纯度冰 +销售麻古qq +销售麻古果子 +销售麻古配方 +销售麻谷qq +销售麻醉箭弩 +锡峰气枪出售 +锡锋气枪出售 +锡锋汽枪专卖 +锡锋汽枪出售 +镜花风月春降 +镜花风月系列 +长乐坊娱乐城 +长期出售手枪 +长篇乱伦小说 +长谷川泉种子 +长谷川瞳种子 +防卫刀具专卖 +防卫刀具直销 +防卫甩棍出售 +防卫电棍出售 +防身刀具专卖 +防身器材专卖 +防身弓努专卖 +防身手枪出售 +防身手枪销售 +防身手狗出售 +防身气狗出售 +阳江军刀批发 +阳江刀具专卖 +阳江刀具军品 +阳江刀具甩卖 +阳江刀具直销 +阴唇上摩擦着 +阴唇口含鸡巴 +阴唇黏液流下 +阴精喷向龟头 +阴茎插入肉洞 +阴道夹的好紧 +阿兵哥艳遇录 +阿兵哥言语录 +阿姨的大阴唇 +阿姨的穴好爽 +阿姨的肥阴唇 +阿庆淫传系列 +阿普唑仑批发 +阿樱的悄悄话 +陪聊裸女qq +隐形,摄像机 +隐瞒征召女兵 +隐蔽式摄像机 +集团出售手枪 +雇佣杀手qq +雇佣杀手电话 +雏乃椿美无码 +雏妓上门qq +雨宫沙纪无码 +雨宫琴音无码 +雨宫琴音种子 +雪村沙郁无码 +雪野弥生无码 +雪野弥生种子 +雷管供应qq +雷管出售qq +雷管制作工艺 +雷管制作方法 +雷管当面交易 +雷管炸药qq +雷管炸药出售 +雷管看货付款 +雷管销售qq +露西亚的情人 +青木沙罗无码 +青木沙罗种子 +青木绘里种子 +青田早纪无码 +靓妹仔之失贞 +鞭炮专卖qq +韩国3级电影 +韩国成人av +韩国成人影视 +韩国成人频道 +韩国无码援交 +韩日无码色片 +音野早纪无码 +顶级激情裸聊 +顶进她的花蕊 +预定大黑鹰弩 +预订仿真气枪 +预订进口气枪 +领导忽悠百姓 +颠覆,共产党 +颠覆,朱镕基 +颠覆,温家宝 +颠覆,胡锦涛 +颠覆中国政权 +颠覆国家政权 +风尘劫txt +风间由美种子 +风骚人体艺术 +风骚侍女下载 +餐饮发票出售 +饥渴的性与爱 +饭岛杏里bt +香水型迷奸药 +香港ghb水 +香港GHB粉 +香港惠泽社群 +香港无码电影 +香港激情淫穴 +香港激情论坛 +香港顶极淫片 +香港顶级淫片 +香烟型昏迷药 +香烟型迷幻剂 +香烟迷药供应 +香烟迷药订购 +马拉硫磷供应 +马拉硫磷批发 +马拉硫磷提供 +马拉硫磷直销 +马拉硫磷销售 +马钱子碱供应 +马钱子碱批发 +马钱子碱提供 +马钱子碱直销 +马钱子碱销售 +骆冰淫传下载 +骐丰桦丰胸仪 +骚冰供应qq +骚冰出售qq +骚冰提供qq +骚女在线裸聊 +骚女淫频乐园 +骚妇成人电影 +骚妹妹裸聊网 +骚屄淫水泛滥 +骚本气枪出售 +骚本气枪直销 +骚本气枪销售 +骚本气狗专卖 +骚本汽枪直销 +骚本汽枪转让 +高价收养女孩 +高价收养小孩 +高价收肾qq +高价购肾qq +高价购肾电话 +高价领养女孩 +高仿人皮销售 +高仿假币主营 +高仿假币出售 +高仿假币批发 +高仿假币提供 +高仿假币销售 +高仿假证qq +高仿假证代办 +高仿假钞专卖 +高仿假钞主营 +高仿假钞供应 +高仿假钞直销 +高仿假钞销售 +高仿假钱qq +高仿假钱专卖 +高仿假钱买卖 +高仿假钱供应 +高仿假钱批发 +高仿假钱提供 +高仿假钱直销 +高仿军刺买卖 +高仿军刺供应 +高仿军刺批发 +高仿军刺提供 +高仿手枪出售 +高仿手枪提供 +高仿手枪购买 +高仿手枪销售 +高仿文凭代办 +高仿文凭办理 +高仿枪专卖店 +高仿气枪专卖 +高仿气枪供应 +高仿气枪批发 +高仿气枪提供 +高仿气枪直销 +高仿气枪订购 +高仿气枪购买 +高仿气枪销售 +高仿汽枪专卖 +高仿汽枪供应 +高仿汽枪出售 +高仿汽枪批发 +高仿汽枪提供 +高仿汽枪直销 +高仿汽枪订购 +高仿汽枪购买 +高仿汽枪转让 +高仿汽枪销售 +高仿真枪出售 +高仿真枪批发 +高仿真枪提供 +高仿真枪销售 +高仿硬币出售 +高仿警服供应 +高仿警服出售 +高仿警服提供 +高仿警服销售 +高仿证件代办 +高仿证件公司 +高仿证件出售 +高仿证件办理 +高仿证件销售 +高假仿人民币 +高偿收养儿童 +高偿收养婴儿 +高偿领养婴儿 +高压气动枪网 +高压气枪qq +高压气枪买卖 +高压气枪供应 +高压气枪出售 +高压气枪出货 +高压气枪到货 +高压气枪提供 +高压气枪电话 +高压气枪直销 +高压气枪订购 +高压气枪转让 +高压气枪销售 +高压气狗出售 +高压汽枪专卖 +高压汽枪供应 +高压汽枪出售 +高压汽枪提供 +高压汽枪直销 +高压汽枪订购 +高压汽枪转让 +高压汽枪销售 +高压电棍专卖 +高尔夫娱乐城 +高桥理沙无码 +高桥理沙种子 +高梨吉美无码 +高清av下载 +高清av百种 +高清av种子 +高清a片下载 +高清床戏下载 +高清性交电影 +高清性爱电影 +高清成人a片 +高清成人影视 +高清成人电影 +高清无码种子 +高清裸聊qq +高清裸聊现场 +高清裸聊视频 +高爆炸药出售 +高端私密交友 +高纯度99冰 +高纯度冰订购 +高纯度奶油冰 +高考考前答案 +高鸟阳子无码 +魔女天妖全集 +鲇川亚美种子 +鲇川智美无码 +鲶川沙纪无码 +鸟枪专卖qq +鸟枪出售qq +鸟枪销售qq +鸡吧1柱擎天 +鸡吧插到嫩穴 +鸡吧插进肉穴 +鸡婆上门打炮 +鸡婆上门服务 +鸡婆包夜qq +鸡婆包夜信息 +鸡婆包夜电话 +鸡婆服务qq +鸡婆服务信息 +鸡巴嫩穴嫩肉 +鸡巴嫩穴淫荡 +鸡巴对准淫穴 +鸡巴抽插好爽 +鸡巴插入肉洞 +鸡巴插入花心 +鸡巴插入蜜穴 +鸡巴插死我了 +鸡巴插进小穴 +鸡巴磨得舒服 +鸡巴蜜穴高潮 +鸡巴顶开花瓣 +鸡鸡插入穴嫩 +鸭子上门按摩 +鸿利国际qq +鹿城免费黄站 +鹿城大型黄站 +鹿城娱乐情色 +鹿城黄站bt +鹿城黄站小说 +鹿鼎记性事传 +麦司卡林供应 +麦角新碱销售 +麦角胺麦角酸 +麻古4号供应 +麻古4号出售 +麻古专卖qq +麻古买卖qq +麻古交易qq +麻古价格qq +麻古供应qq +麻古冰妹qq +麻古冰毒销售 +麻古出售qq +麻古制作工艺 +麻古批发qq +麻古批发交易 +麻古提供qq +麻古果子出售 +麻古果子销售 +麻古特价出售 +麻古白粉出售 +麻古直销qq +麻古送货上门 +麻古配方出售 +麻古销售qq +麻宫淳子种子 +麻果专卖qq +麻果买卖qq +麻果出售qq +麻果制作配方 +麻果批发qq +麻果提供qq +麻果直销qq +麻果订购qq +麻果货源量大 +麻果购买qq +麻果配方qq +麻果销售qq +麻生早苗无码 +麻生早苗种子 +麻生绘美种子 +麻谷送货上门 +麻谷销售qq +麻黄碱制冰毒 +麻黄素供应商 +麻黄素羟亚胺 +黄海暗杀事件 +黄片下载地址 +黄片下载种子 +黄片无码下载 +黄白牙签qq +黄白牙签专卖 +黄白牙签提供 +黄网情色社区 +黄色yy频道 +黄色做爱小说 +黄色做爱电影 +黄色免费电影 +黄色动漫下载 +黄色动漫图片 +黄色动漫快播 +黄色动漫电影 +黄色动漫视频 +黄色卡通图片 +黄色大片下载 +黄色小说下载 +黄色小说网站 +黄色影片下载 +黄色成人图片 +黄色成人网站 +黄色淫乱电影 +黄色淫穴电影 +黄色激情爱图 +黄色激情电影 +黄色激情论坛 +黄色炸药出售 +黄色电影下载 +黄色视频聊天 +黄色网站大全 +黄色网站链接 +黄金城娱乐场 +黄金城娱乐城 +黑崎扇菜无码 +黑崎扇菜种子 +黑市军刀专卖 +黑市刀具qq +黑市刀具出售 +黑市卖肾qq +黑市肾源供应 +黑木麻衣无码 +黑火药的制作 +黑火药的成分 +黑火药的配方 +黑索金的制作 +黑袜美女狂舞 +黑鹰弓弩专卖 +龙虎豹宋书元 +龟头压挤阴道 +龟头对准菊门 +龟头对准阴道 +龟头抽插小穴 +龟头插入少妇 +龟头插入肉缝 +龟头插入蜜穴 +龟头插入阴唇 +龟头插进阴户 +龟头狂插肉洞 +龟头粗壮赤红 +龟头花心骚屄 +龟头顶开阴户 +0售工字牌汽枪 +115网盘av +12号猎枪独弹 +17厘米的诱惑 +18dy淫间道 +18岁少女破处 +18男人摸摸b +18禁情色电影 +18禁成人游戏 +18禁游戏下载 +18禁游戏合集 +18禁色情电影 +1989天安门 +1个体位干翻你 +1代淫后txt +1代精仿身份证 +1代高仿身份证 +1元假硬币专卖 +1元假硬币买卖 +1元假硬币供应 +1元假硬币出售 +1元假硬币批发 +1元假硬币直销 +1元假硬币销售 +1夜几次才满足 +1夜情上门服务 +1夜情交友聊天 +1夜情成人社区 +1夜情成人论坛 +1夜情服务qq +1夜情艳照美女 +1夜情裸聊网址 +1夜情论坛网址 +1对1裸聊视频 +1本道av影讯 +1本道av视频 +1本道ed2k +1本道qvod +1本道rmvb +1本道最美女优 +1本道午夜电影 +1本道性爱视讯 +1本道性爱视频 +1本道成人影讯 +1本道成人视讯 +1本道成人视频 +1本道无码合集 +1本道松下美里 +1本道视频播放 +1本道迅雷下载 +1本道高清无码 +1炮不行就两炮 +1起操逼影视网 +2008年灾年 +2012操鸡巴 +222se图片 +2乙基酰胺发抡 +2代精仿身份证 +2代身份证出售 +2手军用弩出售 +2甲基安非他明 +322攻台作战 +33bbb走光 +365情色小说 +365成人网站 +365成人贴图 +365淫色贴图 +366成人网站 +367成人网站 +368成人网站 +3d肉蒲团下载 +3d肉蒲团种子 +3不反对执政党 +3利达弓弩供应 +3利达弓弩出售 +3利达弓弩批发 +3利达弓弩直销 +3利达弓弩销售 +3唑仑专卖qq +3唑仑供应qq +3唑仑供货qq +3唑仑出售qq +3唑仑售价qq +3唑仑批发qq +3唑仑直销qq +3唑仑订购qq +3唑仑送货上门 +3国首脑去打猎 +3夫妻视频下载 +3夫妻高清艳照 +3棱军刺刀供应 +3棱军刺刀出售 +3浦沙耶香无码 +3箭气枪制造图 +3箭牌气枪销售 +3箭牌汽枪qq +3箭牌汽枪供应 +3箭牌汽枪出售 +3箭牌汽枪出货 +3箭牌汽枪到货 +3箭牌汽枪制造 +3箭牌汽枪图纸 +3箭牌汽枪提供 +3箭牌汽枪电话 +3箭牌汽枪私售 +3箭牌汽枪订购 +3箭牌汽枪销售 +3级片下载地址 +3级片电影下载 +3级片网站地址 +3陪女上门服务 +3陪女全套服务 +3陪女出台服务 +3陪女包夜电话 +3陪女援交电话 +3陪女服务qq +3陪女服务电话 +3陪女联系qq +3陪女联系电话 +412色情综合 +4a4a点cc +4氢大麻酚供应 +4海龙女txt +54式图纸出售 +54式图纸销售 +54式手枪专卖 +54式手枪买卖 +54式手枪出售 +54式手枪提供 +54式手枪订购 +54式手狗出售 +54式枪支出售 +54式枪支销售 +54手木仓出售 +54手木仓订购 +54手木仓销售 +54手枪结构图 +54自制枪qq +54钢珠枪买卖 +56式军刺qq +56式军刺专卖 +56式军刺供应 +56式军刺出售 +56式军刺批发 +56式军刺提供 +56式军刺直销 +56式军刺订购 +56式军刺转让 +56式军刺销售 +56式军枪供应 +56式刺刀供应 +56式刺刀提供 +588澳门博彩 +5十岚纱罗无码 +5月天成人电影 +5连发猎枪专卖 +5连发猎枪出售 +5连发猎枪销售 +610办公室靠 +64仿真枪专卖 +64仿真枪出售 +64式手枪qq +64式手枪专卖 +64式手枪出售 +64式手枪提供 +64式手枪直销 +64式手枪订购 +64式手枪销售 +64式手狗专卖 +64式手狗出售 +64式手狗直销 +64式手狗订购 +64式枪支出售 +64式枪支销售 +64式销售qq +64手木仓供应 +64手木仓批发 +64手木仓订购 +64手木仓转让 +6合彩公司qq +6合彩在线下注 +6合彩在线投注 +6合彩开奖时间 +6合彩投注平台 +6合彩报码网址 +6合彩特码开奖 +6合彩特码论坛 +6合彩现金投注 +6合彩网上开户 +6合彩资料图库 +6月4日大学生 +77b手枪供应 +77b手枪提供 +77b手枪销售 +77仿真枪专卖 +77仿真枪出售 +77式专卖qq +77式出售qq +77式手枪买卖 +77式手枪供应 +77式手枪出售 +77式手枪销售 +77式手枪预订 +77式枪出销售 +77式短狗销售 +77式销售qq +7十年后的劫难 +7连发猎枪专卖 +7连发猎枪出售 +81式军刺批发 +81式刺刀供应 +88博彩娱乐城 +88娱乐城赌博 +88真人娱乐城 +89学潮大屠杀 +89年春夏之交 +90后露点自拍 +92仿真枪专卖 +92仿真枪出售 +92式手枪出售 +92式手枪销售 +92式手狗出售 +92式手狗批发 +92式手狗直销 +92式销售qq +92式销售电话 +95博彩通qq +99真人娱乐城 +a4u人体艺术 +aaaa级电影 +ATOM弹制造 +av女优苍井空 +av快播成人网 +av成人电影网 +av电视棒供应 +av电视棒出售 +av电视棒批发 +av电视棒直销 +av美女小视频 +awp配件供应 +awp配件出售 +awp配件批发 +awp配件提供 +awp配件直销 +awp配件订购 +awp配件销售 +bb体育娱乐城 +bing毒出售 +C4炸药的成分 +caonima +cfx气枪出售 +cfx气枪提供 +cfx气枪销售 +Cocaine +dick吕秀莲 +diy塑料炸弹 +ed2k肉蒲团 +e世博线上娱乐 +ffx气枪出售 +ffx气枪销售 +fing霸qq +fing霸专卖 +fing霸提供 +fing霸销售 +flg妈b发抡 +fuck4人帮 +fuck他妈的 +fuck他母亲 +fuck他祖宗 +fuck他马的 +fuck信访局 +fuck兴奋剂 +fuck十8摸 +fuck卫生部 +fuck受虐狂 +fuck台湾党 +fuck台湾国 +fuck台湾狗 +fuck司法部 +fuck吴官正 +fuck吴邦国 +fuck唐家璇 +fuck售id +fuck售软件 +fuck商务部 +fuck圣女峰 +fuck外专局 +fuck外交部 +fuck外汇局 +fuck天安门 +fuck太子党 +fuck威而柔 +fuck威而钢 +fuck孙中山 +fuck孙逸仙 +fuck宋楚瑜 +fuck宋祖英 +fuck审计署 +fuck尉健行 +fuck小乳头 +fuck小日本 +fuck小肉粒 +fuck小鸡鸡 +fuck希拉克 +fuck希特勒 +fuck乡巴佬 +fuck想上你 +fuck我操你 +fuck我日你 +fuck文化部 +fuck文物局 +fuck斯大林 +fuck新义安 +fuck新光明 +fuck新华社 +fuck新唐人 +fuck新生网 +fuck新闻办 +fuck杀人犯 +fuck死gd +fuck死gm +fuck死全家 +fuck水利部 +fuck洗脑班 +fuck温加宝 +fuck温家保 +fuck温家宝 +fuck温总理 +fuck王8蛋 +fuck王乐泉 +fuck王兆国 +fuck王太华 +fuck王宝森 +fuck王岐山 +fuck生春袋 +fuck生鸦片 +fuck田纪云 +fuck社科院 +fuck神经病 +fuck统计局 +fuck铁道部 +fuck食捻屎 +fuck驶你公 +fuck驶你娘 +fuck驶你母 +fuck驶你爸 +g点我找的很准 +high水批发 +high粉出售 +high粉出货 +high粉到货 +high粉订购 +high粉配方 +high粉销售 +high药专卖 +high药出售 +high药批发 +high药直销 +high药销售 +h电影下载qq +k7娱乐城开户 +king粉出售 +king粉出货 +king粉到货 +king粉合成 +king粉订购 +king粉配方 +king粉销售 +kk娱乐城网站 +k粉摇头丸出售 +k粉的制作方法 +k粉的制作过程 +lsd供应qq +lsd出售qq +lsd销售qq +luo聊妹qq +luo聊表演秀 +meimei穴 +meinv嫩穴 +meinv插穴 +meinv淫图 +meinv淫穴 +meinv潮吹 +minghui +mm1夜情视频 +mm激情穴贴图 +mm的胸罩脱下 +mm的诱人双峰 +mm视频聊天室 +mm穴激情小说 +mm翘臀诱惑图 +mm脱的光视频 +mm被人插图片 +mm露底见毛图 +paper64 +pcp新贵专卖 +pcp新贵出售 +pcp气枪出售 +pcp汽枪供应 +pcp汽枪出售 +pcp汽枪批发 +pcp汽枪提供 +pcp汽枪直销 +pcp汽枪订购 +pcp汽枪购买 +pcp汽枪转让 +pcp汽枪销售 +pcp秃鹰价格 +pcp秃鹰出售 +pcp配件qq +pcp配件买卖 +pcp配件供应 +pcp配件出售 +pcp配件批发 +pcp配件提供 +pcp配件直销 +pcp配件订购 +pcp配件转让 +pcp配件销售 +pcz山猪买卖 +pcz山猪出售 +pcz山猪销售 +petn的合成 +petn的配方 +qq1夜情交友 +qq2手弩转让 +qq3唑仑买卖 +qq3唑仑供应 +qq3唑仑出售 +qq3唑仑批发 +qq3唑仑直销 +qq3唑仑订购 +qq3唑仑销售 +qq54枪销售 +qq专业办假证 +qq专办假证书 +qq专卖乖乖药 +qq专卖假文凭 +qq专卖假硬币 +qq专卖假证件 +qq专卖兰博刀 +qq专卖军用弩 +qq专卖安纳咖 +qq专卖弹簧刀 +qq专卖手木仓 +qq专卖打鸟枪 +qq专卖昏迷药 +qq专卖气动狗 +qq专卖气木仓 +qq专卖气步枪 +qq专卖海乐神 +qq专卖猎木仓 +qq专卖电警棍 +qq专卖秃鹰枪 +qq专卖蝴蝶刀 +qq专卖迷幻水 +qq专卖迷情药 +qq专卖迷晕药 +qq专卖野战刀 +qq专卖阻击弩 +qq专卖麻醉枪 +qq专卖麻黄碱 +qq专卖黄牙签 +qq专售乖乖药 +qq专售迷晕药 +qq专售迷魂烟 +qq丛林刀专卖 +qq丛林刀出售 +qq丛林刀销售 +qq乖乖水专卖 +qq乖乖水买卖 +qq乖乖水直销 +qq买卖乖乖水 +qq买卖可待因 +qq买卖摇头丸 +qq买卖苍蝇水 +qq买卖苍蝇粉 +qq买卖迷香药 +qq买卖钢珠枪 +qq买卖银行卡 +qq买卖麻黄素 +qq买卖黄牙签 +qq代办会计证 +qq代办假文凭 +qq代办假证书 +qq代办假证件 +qq代办假驾照 +qq代办军官证 +qq代办毕业证 +qq代办等级证 +qq代办身份证 +qq仿真枪出售 +qq仿真枪批发 +qq仿真枪销售 +qq供应3唑仑 +qq供应3棱刀 +qq供应丛林刀 +qq供应乖乖水 +qq供应乖乖药 +qq供应假文凭 +qq供应假硬币 +qq供应假证件 +qq供应催情水 +qq供应催情液 +qq供应催情药 +qq供应军警服 +qq供应化学冰 +qq供应古柯叶 +qq供应可卡因 +qq供应可待因 +qq供应听话水 +qq供应听话药 +qq供应喵喵药 +qq供应大冰砖 +qq供应失忆水 +qq供应小冰砖 +qq供应开他敏 +qq供应弹簧刀 +qq供应强奸水 +qq供应打鸟枪 +qq供应拍肩粉 +qq供应摇头丸 +qq供应摇头糖 +qq供应杜冷丁 +qq供应气动狗 +qq供应气步枪 +qq供应氯胺酮 +qq供应氰化镉 +qq供应汽长狗 +qq供应狙击枪 +qq供应白牙签 +qq供应秃鹰枪 +qq供应秃鹰管 +qq供应红降汞 +qq供应美沙酮 +qq供应芬太尼 +qq供应苍蝇水 +qq供应苍蝇粉 +qq供应蒙汗药 +qq供应蝴蝶刀 +qq供应赌博粉 +qq供应赌博药 +qq供应迷奸粉 +qq供应迷幻水 +qq供应迷幻药 +qq供应迷情水 +qq供应迷情粉 +qq供应迷情药 +qq供应迷晕药 +qq供应迷魂水 +qq供应迷魂烟 +qq供应迷魂粉 +qq供应迷魂药 +qq供应迷魂香 +qq供应野战刀 +qq供应钢珠枪 +qq供应钻石冰 +qq供应阻击弩 +qq供应麦角酸 +qq供应麻黄碱 +qq供应麻黄素 +qq供应黄牙签 +qq假文凭专卖 +qq假文凭代办 +qq假文凭制作 +qq假文凭办理 +qq假证书专卖 +qq假证书代办 +qq假证书制作 +qq假证书办理 +qq假证件专卖 +qq假证件代办 +qq假证件出售 +qq假证件制作 +qq催情液批发 +qq催情液直销 +qq催情液订购 +qq催情液购买 +qq催情液销售 +qq兰博刀专卖 +qq军刀专卖网 +qq军官证出售 +qq军官证办理 +qq冰牙签供应 +qq出售3唑仑 +qq出售3棱刀 +qq出售77式 +qq出售丛林刀 +qq出售乖乖水 +qq出售乖乖药 +qq出售仿真枪 +qq出售假护照 +qq出售假文凭 +qq出售假硬币 +qq出售假证书 +qq出售假证件 +qq出售催情水 +qq出售催情液 +qq出售催情粉 +qq出售催情药 +qq出售催眠水 +qq出售兰博刀 +qq出售军官证 +qq出售匕首枪 +qq出售古柯叶 +qq出售可卡因 +qq出售听话水 +qq出售听话药 +qq出售哌替啶 +qq出售喵喵药 +qq出售大冰砖 +qq出售失忆水 +qq出售失忆药 +qq出售小冰砖 +qq出售左轮枪 +qq出售开他敏 +qq出售开山刀 +qq出售开心水 +qq出售弹簧刀 +qq出售拍肩粉 +qq出售摇头丸 +qq出售摇头糖 +qq出售昏睡药 +qq出售杜冷丁 +qq出售植物冰 +qq出售毕业证 +qq出售气手枪 +qq出售气木仓 +qq出售气步枪 +qq出售氰化钠 +qq出售氰化钾 +qq出售汽长狗 +qq出售沙菲片 +qq出售海乐神 +qq出售海洛因 +qq出售白牙签 +qq出售硝酸铊 +qq出售礼花弹 +qq出售致癌药 +qq出售苍蝇水 +qq出售蒙汗药 +qq出售蝴蝶刀 +qq出售警官证 +qq出售警察证 +qq出售赌博粉 +qq出售赌博药 +qq出售身份证 +qq出售迷奸粉 +qq出售迷奸药 +qq出售迷情水 +qq出售迷情药 +qq出售迷晕药 +qq出售迷魂烟 +qq出售迷魂香 +qq出售钢珠狗 +qq出售钻石冰 +qq出售银行卡 +qq出售长治筋 +qq出售阻击弩 +qq出售驾驶证 +qq出售麻古冰 +qq出售麻醉枪 +qq出售麻黄碱 +qq出售麻黄素 +qq出售黄牙签 +qq出售黑火药 +qq制作假文凭 +qq制作假驾照 +qq办假学位证 +qq办假户口本 +qq办假毕业证 +qq办假证服务 +qq办假身份证 +qq办理假文凭 +qq办理假证件 +qq办理假驾照 +qq办理军官证 +qq办理本科证 +qq办理行驶证 +qq卖77猎枪 +qq卖仿真枪模 +qq卖单管猎枪 +qq卖合成k粉 +qq卖娥眉气枪 +qq卖左轮手枪 +qq卖秃鹰汽枪 +qq卖虎头猎枪 +qq卖进口汽狗 +qq卖金钟气枪 +qq卖铅弹气枪 +qq卖高压气枪 +qq可卡因出售 +qq可待因专卖 +qq可待因批发 +qq可待因订购 +qq听话水订购 +qq喵喵药供应 +qq喵喵药提供 +qq大冰砖出售 +qq大冰砖销售 +qq失忆水提供 +qq失忆水销售 +qq妓女性服务 +qq开山刀出售 +qq开山刀销售 +qq异丁腈批发 +qq异丁腈销售 +qq弹簧刀专卖 +qq弹簧刀直销 +qq弹簧刀销售 +qq恩华3唑仑 +qq成人电视棒 +qq手拉狗出售 +qq批发3唑仑 +qq批发3棱刀 +qq批发tnt +qq批发乖乖水 +qq批发乖乖药 +qq批发催情液 +qq批发古柯碱 +qq批发可卡因 +qq批发可待因 +qq批发听话药 +qq批发喵喵药 +qq批发失忆水 +qq批发失忆药 +qq批发开他敏 +qq批发开山刀 +qq批发异丁腈 +qq批发弹簧刀 +qq批发手木仓 +qq批发拍肩粉 +qq批发昏迷药 +qq批发杜冷丁 +qq批发气动狗 +qq批发氯胺酮 +qq批发沙菲片 +qq批发狙击枪 +qq批发礼花弹 +qq批发秃鹰枪 +qq批发美沙酮 +qq批发苍蝇水 +qq批发苍蝇粉 +qq批发蒙汗药 +qq批发赌博粉 +qq批发赌博药 +qq批发迷幻水 +qq批发迷幻药 +qq批发迷情粉 +qq批发迷情药 +qq批发迷晕药 +qq批发迷魂水 +qq批发迷魂烟 +qq批发迷魂粉 +qq批发迷魂香 +qq批发钢珠弹 +qq批发钢珠枪 +qq批发阻击弩 +qq批发麻醉枪 +qq批发麻黄碱 +qq批发黄牙签 +qq提供3棱刀 +qq提供乖乖水 +qq提供乖乖药 +qq提供假硬币 +qq提供假证件 +qq提供催情水 +qq提供催情液 +qq提供古柯叶 +qq提供可卡因 +qq提供可待因 +qq提供听话水 +qq提供喵喵药 +qq提供失忆水 +qq提供失忆粉 +qq提供失忆药 +qq提供开他敏 +qq提供异丁腈 +qq提供性服务 +qq提供手木仓 +qq提供打鸟枪 +qq提供拍肩粉 +qq提供摇头丸 +qq提供杜冷丁 +qq提供气动狗 +qq提供气木仓 +qq提供气步枪 +qq提供汽步枪 +qq提供汽短狗 +qq提供海乐神 +qq提供海洛因 +qq提供猎木仓 +qq提供秃鹰枪 +qq提供红降汞 +qq提供美沙酮 +qq提供肩迷药 +qq提供苍蝇水 +qq提供苍蝇粉 +qq提供蒙汗药 +qq提供蝴蝶刀 +qq提供赌博粉 +qq提供赌博药 +qq提供迷幻水 +qq提供迷幻药 +qq提供迷情水 +qq提供迷情粉 +qq提供迷情药 +qq提供迷晕药 +qq提供迷魂烟 +qq提供迷魂香 +qq提供野战刀 +qq提供阻击弩 +qq提供麻古冰 +qq援交妹服务 +qq摇头丸出售 +qq摇头丸批发 +qq摇头丸直销 +qq摇头丸销售 +qq曲马多出售 +qq杜冷丁专卖 +qq杜冷丁买卖 +qq气动狗供应 +qq气动狗出售 +qq气动狗批发 +qq气动狗提供 +qq气动狗订购 +qq气动狗购买 +qq气动狗转让 +qq气动狗销售 +qq气枪弹供应 +qq氧化汞销售 +qq氯胺酮买卖 +qq氯胺酮出售 +qq氯胺酮批发 +qq氯胺酮直销 +qq氯胺酮订购 +qq氰化钠出售 +qq氰化钾出售 +qq汽手枪提供 +qq汽步枪买卖 +qq汽短狗出售 +qq汽短狗批发 +qq汽短狗提供 +qq汽短狗直销 +qq汽短狗订购 +qq汽短狗购买 +qq汽短狗转让 +qq汽短狗销售 +qq汽长狗专卖 +qq汽长狗供应 +qq汽长狗出售 +qq汽长狗批发 +qq汽长狗提供 +qq汽长狗订购 +qq汽长狗购买 +qq汽长狗转让 +qq沙菲片批发 +qq海乐神供应 +qq海乐神出售 +qq海乐神提供 +qq海乐神销售 +qq海洛因出售 +qq海洛因销售 +qq火药枪出售 +qq火药枪直销 +qq狙击弩销售 +qq狩猎弩出售 +qq猎木仓销售 +qq现金百家乐 +qq甲基苯丙胺 +qq白牙签出售 +qq白牙签提供 +qq直销3唑仑 +qq直销乖乖水 +qq直销乖乖药 +qq直销假硬币 +qq直销催情水 +qq直销催情液 +qq直销催情粉 +qq直销军用刀 +qq直销可卡因 +qq直销可待因 +qq直销听话药 +qq直销喵喵药 +qq直销失忆水 +qq直销失忆粉 +qq直销开他敏 +qq直销弹簧刀 +qq直销拍肩粉 +qq直销摇头丸 +qq直销杜冷丁 +qq直销气步枪 +qq直销汽步枪 +qq直销汽短狗 +qq直销秃鹰枪 +qq直销美沙酮 +qq直销苍蝇水 +qq直销苍蝇粉 +qq直销蒙汗药 +qq直销赌博粉 +qq直销赌博药 +qq直销迷幻水 +qq直销迷幻药 +qq直销迷情粉 +qq直销迷情药 +qq直销迷晕药 +qq直销迷魂烟 +qq直销迷魂香 +qq直销野战刀 +qq直销钢珠枪 +qq直销阻击弩 +qq直销麻醉枪 +qq直销麻黄碱 +qq真钱扎金花 +qq礼花弹批发 +qq礼花弹提供 +qq视频裸聊女 +qq秃鹰气步枪 +qq红降汞提供 +qq网上办假证 +qq美女色聊网 +qq羟亚胺出售 +qq胡椒醛出售 +qq苍蝇水供应 +qq苍蝇水提供 +qq苍蝇水订购 +qq苍蝇粉供应 +qq苍蝇粉出售 +qq苍蝇粉提供 +qq苍蝇粉直销 +qq苍蝇粉订购 +qq苍蝇粉销售 +qq虎牙刀专卖 +qq蝴蝶刀供应 +qq蝴蝶刀提供 +qq警官证供应 +qq警官证出售 +qq订购3唑仑 +qq订购3棱刀 +qq订购丛林刀 +qq订购乖乖水 +qq订购乖乖药 +qq订购催情液 +qq订购催眠水 +qq订购可待因 +qq订购听话药 +qq订购喵喵药 +qq订购大冰砖 +qq订购失忆粉 +qq订购小冰砖 +qq订购开他敏 +qq订购弹簧刀 +qq订购打鸟枪 +qq订购拍肩粉 +qq订购摇头丸 +qq订购摇头糖 +qq订购杜冷丁 +qq订购气动狗 +qq订购气步枪 +qq订购氯胺酮 +qq订购汽步枪 +qq订购海洛因 +qq订购白牙签 +qq订购秃鹰枪 +qq订购苍蝇水 +qq订购苍蝇粉 +qq订购蒙汗药 +qq订购赌博粉 +qq订购赌博药 +qq订购迷幻水 +qq订购迷幻药 +qq订购迷情粉 +qq订购迷情药 +qq订购迷晕药 +qq订购迷魂水 +qq订购迷魂烟 +qq订购迷魂粉 +qq订购迷魂药 +qq订购迷魂香 +qq订购野战刀 +qq订购钻石冰 +qq订购麦角酸 +qq订购麻黄碱 +qq订购麻黄素 +qq订购黄牙签 +qq购买乖乖水 +qq购买乖乖药 +qq购买可卡因 +qq购买听话药 +qq购买喵喵药 +qq购买失忆水 +qq购买失忆粉 +qq购买开他敏 +qq购买弹簧刀 +qq购买杜冷丁 +qq购买气动狗 +qq购买汽长狗 +qq购买苍蝇水 +qq购买苍蝇粉 +qq购买蒙汗药 +qq购买赌博粉 +qq购买赌博药 +qq购买迷幻药 +qq购买迷情粉 +qq购买迷情药 +qq购买迷晕药 +qq购买迷魂烟 +qq购买迷魂香 +qq购买麻醉枪 +qq赌博粉批发 +qq身份证出售 +qq转让丛林刀 +qq转让弹簧刀 +qq转让气动狗 +qq转让汽步枪 +qq转让汽短狗 +qq转让钢珠枪 +qq转让阻击弩 +qq转让麻醉枪 +qq进口弩转让 +qq进口弩销售 +qq迷幻水出售 +qq迷幻水批发 +qq迷幻水提供 +qq迷幻水直销 +qq迷幻水订购 +qq迷幻水购买 +qq迷幻水销售 +qq迷幻药出售 +qq迷幻药销售 +qq迷情水供应 +qq迷情水批发 +qq迷情水提供 +qq迷情药专卖 +qq迷情药买卖 +qq迷昏药供应 +qq迷昏药销售 +qq迷晕药批发 +qq迷晕药直销 +qq迷晕药销售 +qq迷香药供应 +qq迷香药批发 +qq迷香药提供 +qq迷香药直销 +qq迷香药订购 +qq迷香药销售 +qq迷魂烟批发 +qq迷魂烟提供 +qq迷魂烟直销 +qq迷魂香专卖 +qq迷魂香买卖 +qq酣乐欣专卖 +qq钢珠弩专卖 +qq银行卡买卖 +qq销售3唑仑 +qq销售3棱刀 +qq销售77式 +qq销售丛林刀 +qq销售乖乖水 +qq销售乖乖药 +qq销售仿真枪 +qq销售假护照 +qq销售假硬币 +qq销售假证件 +qq销售催情水 +qq销售催情液 +qq销售催情粉 +qq销售催情药 +qq销售军官证 +qq销售匕首枪 +qq销售古柯叶 +qq销售可卡因 +qq销售可待因 +qq销售听话水 +qq销售听话药 +qq销售喵喵药 +qq销售大冰砖 +qq销售失忆水 +qq销售失忆粉 +qq销售小冰砖 +qq销售开他敏 +qq销售开山刀 +qq销售异丁腈 +qq销售弹簧刀 +qq销售拍肩粉 +qq销售摇头丸 +qq销售摇头糖 +qq销售昏睡药 +qq销售杜冷丁 +qq销售气动狗 +qq销售氯胺酮 +qq销售氰化钾 +qq销售汽步枪 +qq销售汽长狗 +qq销售沙菲片 +qq销售海洛因 +qq销售白牙签 +qq销售硝酸铊 +qq销售礼花弹 +qq销售神仙水 +qq销售秃鹰枪 +qq销售秃鹰管 +qq销售苍蝇水 +qq销售苍蝇粉 +qq销售蒙汗药 +qq销售警官证 +qq销售警察证 +qq销售赌博粉 +qq销售赌博药 +qq销售进口弩 +qq销售迷奸药 +qq销售迷幻水 +qq销售迷幻药 +qq销售迷情水 +qq销售迷情粉 +qq销售迷情药 +qq销售迷晕药 +qq销售迷魂水 +qq销售迷魂烟 +qq销售迷魂粉 +qq销售迷魂药 +qq销售迷魂香 +qq销售野战刀 +qq销售钻石冰 +qq销售链条枪 +qq销售长治筋 +qq销售阻击弩 +qq销售驾驶证 +qq销售麦角酸 +qq销售麻醉枪 +qq销售麻黄碱 +qq销售麻黄素 +qq销售黄牙签 +qq阻击弩专卖 +qq阻击弩供应 +qq阻击弩出售 +qq阻击弩批发 +qq阻击弩提供 +qq阻击弩直销 +qq阻击弩订购 +qq阻击弩销售 +qq驾驶证代办 +qq驾驶证出售 +qq麻醉枪提供 +qq麻醉枪订购 +qq麻黄碱出售 +qq麻黄素供应 +qq麻黄素出售 +qq麻黄素提供 +qq麻黄素销售 +qvod幼交片 +qvod援交片 +qvod色播网 +q售盐酸氯胺酮 +rivals靠 +sex大型色站 +sex性吧有你 +sex成人聊天 +sex成人裸聊 +sex真人裸聊 +SIM卡复制器 +SIXFOUR +sm处女淫水图 +suck你妈的 +suicide +taiwan国 +tel出售假币 +tel出售假钞 +tel高压气枪 +tnt制作方法 +tnt制作配方 +TNT炸弹制作 +tnt炸药成分 +tnt炸药配方 +tt真人娱乐城 +tt线上娱乐城 +tuidang +xuechao +xxx高清影院 +x卧底官方网站 +x卧底官网qq +x卧底软件下载 +x卧底软件买卖 +x卧底软件供应 +x卧底软件出售 +x卧底软件官网 +x卧底软件销售 +x站激情聊天室 +zhengfu +一比一枪模专卖 +丁香成人社区网 +丁香花成人网站 +万利达弓弩买卖 +万利达弓弩出售 +万能开锁器qq +万能开锁器专卖 +万能开锁器供应 +万能开锁器出售 +万能开锁器批发 +万能开锁器提供 +万能开锁器直销 +万能开锁器销售 +万能开锁枪出售 +万豪国际娱乐城 +三利达弓弩军刀 +三利达弓弩直营 +三利达弓弩配件 +三步倒弩箭专卖 +三步倒药箭批发 +上告教委整死你 +上海气枪批发网 +上海气枪销售网 +上网办假证qq +上门保健性服务 +上门做爱女qq +上门包夜性服务 +上门性服务qq +上门援交女qq +上门援交妹电话 +上门服务找美女 +上骟省委党中央 +下载免费淫电影 +下载庐江艳照门 +下载成人情色片 +不卡免费淫电影 +不要再来招惹我 +不要跟我搞暧昧 +专业上海工字枪 +专业代办驾驶证 +专业做假证qq +专业出售迷幻药 +专业提供工字牌 +专供赵氏弩qq +专办毕业证qq +专卖1元假硬币 +专卖3唑仑qq +专卖54式手枪 +专卖56式军刺 +专卖64式手枪 +专卖77式手枪 +专卖92式手枪 +专卖fing霸 +专卖ghb原液 +专卖high药 +专卖king粉 +专卖pcp新贵 +专卖万能开锁器 +专卖丛林刀qq +专卖假文凭qq +专卖催情水qq +专卖兰博刀qq +专卖兰州弓弩网 +专卖军用弹簧刀 +专卖军用潜水刀 +专卖军用狙击弩 +专卖古柯叶qq +专卖可待因qq +专卖喵喵药qq +专卖大冰砖qq +专卖大黑鹰弓弩 +专卖安纳咖qq +专卖小口径手枪 +专卖小口径步枪 +专卖尼泊尔军刀 +专卖山奈钾qq +专卖工字牌汽枪 +专卖左旋麻黄素 +专卖左轮钢珠狗 +专卖度冷丁qq +专卖开山刀qq +专卖弓弩狩猎网 +专卖弹簧刀qq +专卖强效催情水 +专卖成人电视棒 +专卖户外狩猎弩 +专卖打鸟枪qq +专卖折叠手弓弩 +专卖折叠蝴蝶刀 +专卖散弹枪qq +专卖气动狗qq +专卖气步枪qq +专卖氯胺酮qq +专卖海乐神qq +专卖海洛因qq +专卖特警作战服 +专卖狙击气步枪 +专卖电警棍qq +专卖盐酸曲马多 +专卖盐酸氯胺酮 +专卖盐酸羟亚胺 +专卖秦氏弩qq +专卖粉末型迷药 +专卖美沙酮qq +专卖蒙汗药配方 +专卖蝴蝶刀qq +专卖赵氏弩qq +专卖进口气木仓 +专卖迷奸药qq +专卖迷奸药配方 +专卖迷幻水qq +专卖迷幻药qq +专卖迷魂药qq +专卖酣乐欣qq +专卖野战刀qq +专卖钢珠左轮狗 +专卖钢珠狗qq +专卖锡锋b51 +专卖锡锋牌汽枪 +专卖防身电警棍 +专卖阳江刀qq +专卖阻击弩qq +专卖香港3唑仑 +专卖驾驶证qq +专卖高仿4级证 +专卖高仿真假币 +专卖高压打鸟枪 +专卖高压气步枪 +专卖高压电击棒 +专卖高压电警棍 +专卖麦角酸qq +专卖麻黄碱qq +专卖麻黄素qq +专卖黄牙签qq +专售喷雾蒙汗药 +世界十大独裁者 +世界名刀批发网 +世界维吾尔大会 +丙烯醛供应qq +丛林军刀专卖网 +丛林刀专卖qq +丛林刀供应qq +丛林刀出售qq +丛林刀批发qq +丛林刀直销qq +丛林刀转让qq +丛林刀销售qq +东京淫视频下载 +东京热5月新片 +东京热av影讯 +东京热av视频 +东京热rmvb +东京热午夜电影 +东京热成人影片 +东京热成人影讯 +东京热成人视讯 +东京热无码电影 +东京热无码种子 +东突暴动和独立 +丝袜打飞机推油 +丝袜无码avi +丝袜欲痕txt +丝足上门性服务 +两胸之间的距爱 +两腿1夹几百块 +两腿间吸舔取精 +丽人人在线裸聊 +丧服妻欲望下载 +中共领导人黑幕 +中华养生益智功 +中华养生益智气 +中华昆仑女神功 +中南海权力斗争 +中南海波澜起伏 +中国军刀出售网 +中国古代性戏观 +中国官场情杀案 +中国式引咎辞职 +中国弓弩专卖网 +中国弓弩狩猎网 +中国户外刀具网 +中国是毛盾社会 +中国盲动的民族 +中国第1女保镖 +中国股市的悲哀 +中国请为我哭泣 +中国贪官在海外 +中央是谁的中央 +中山沙绪里无码 +中山领导流浪汉 +中握b50供应 +中握b50出售 +中握b50批发 +中握b50提供 +中握b50直销 +中握b50订购 +中握b50转让 +中握b50销售 +中握pcp专卖 +中文成人激情网 +丰禾国际娱乐城 +为了忘却的纪念 +乃南葵bt下载 +乌头碱供应qq +乌头碱批发qq +乐透世界娱乐城 +乖乖水专卖qq +乖乖水买卖qq +乖乖水出售qq +乖乖水批发qq +乖乖水直销qq +乖乖水订购qq +乖乖水配方提供 +乖乖药订购qq +乖乖药购买qq +乙烯砜供应qq +乙硼烷供应qq +习近平治国新书 +买卖1元假硬币 +买卖3唑仑qq +买卖54式手枪 +买卖64式手枪 +买卖77式手枪 +买卖pcp新贵 +买卖万利达弓弩 +买卖乖乖水qq +买卖仿真枪配件 +买卖催情口香糖 +买卖半自动步枪 +买卖反恐狙击弩 +买卖可待因qq +买卖台湾版假币 +买卖台湾版假钞 +买卖台湾版假钱 +买卖失忆水qq +买卖安乐死药物 +买卖小口径手枪 +买卖山奈钾qq +买卖工字牌汽枪 +买卖开山刀qq +买卖杜冷丁qq +买卖气动狗qq +买卖气动钢珠枪 +买卖氯胺酮qq +买卖海洛因qq +买卖甲基苯丙胺 +买卖盐酸哌替啶 +买卖盐酸羟亚胺 +买卖礼花弹qq +买卖秦氏弩qq +买卖老虎头猎枪 +买卖苍蝇水qq +买卖苍蝇粉qq +买卖虎头牌猎枪 +买卖赵氏弩qq +买卖身份证qq +买卖迷幻药qq +买卖迷香药qq +买卖野战刀qq +买卖银行卡qq +买卖高仿学位证 +买卖高仿毕业证 +买卖高仿真假币 +买卖高仿等级证 +买卖黄牙签qq +买手机窃听软件 +乱伦淫书成人网 +乱伦熟睡的姐姐 +二甲基安非他明 +云南情蛊药供应 +云南情蛊药批发 +云南情蛊药提供 +云南情蛊药直销 +云南情蛊药订购 +云南情蛊药购买 +云南情蛊药销售 +云鼎国际娱乐城 +云鼎娱乐城网站 +亚洲av片下载 +亚洲乱伦之淫穴 +亚洲成人av网 +亚洲成人俱乐部 +亚洲成人午夜场 +亚洲成人小电影 +亚洲成人情色网 +亚洲成人色情网 +亚洲成人贴图区 +亚洲无码原创区 +亚洲有码原创区 +亚洲淫色俱乐部 +亚洲激情淫影院 +亚洲激情淫电影 +亚洲激情淫贴图 +亚洲激情贴图区 +亚洲贴图区月宫 +亚硝酸乙酯供应 +亚硝酸乙酯批发 +亚硝酸乙酯提供 +亚硝酸乙酯直销 +亚硝酸乙酯销售 +京乃亚津沙种子 +人体艺术图片网 +人兽交在线播放 +人妻凌辱慰劳会 +人妻肛肉曲下载 +人民还当牛做马 +人类灭亡进程表 +仁波切上师西行 +今夜谁与你同眠 +仓木杏高清种子 +代做假证件qq +代制假冒身份证 +代办假学位证书 +代办假文凭qq +代办假等级证书 +代办假证书qq +代办假证件qq +代办假驾照qq +代办免考驾驶证 +代办军官证qq +代办增值税发票 +代办学士学位证 +代办学生证qq +代办户口本qq +代办房产证证明 +代办武警驾驶证 +代办毕业证qq +代办等级证qq +代办结婚证qq +代办身份证qq +代办高仿军官证 +代办高仿学位证 +代办高仿户口本 +代办高仿户口薄 +代办高仿毕业证 +代办高仿证qq +代办高仿资格证 +代办高仿驾驶证 +仿54手枪供应 +仿54手枪出售 +仿54手枪销售 +仿真人民币出售 +仿真人民币销售 +仿真手拉狗qq +仿真打鸟枪供应 +仿真来复枪销售 +仿真枪专卖qq +仿真枪买卖qq +仿真枪供应qq +仿真枪出售qq +仿真枪模制造图 +仿真枪气枪专卖 +仿真枪配件出售 +仿真枪配件销售 +仿真气手枪专卖 +仿真气木仓转让 +仿真气枪专卖店 +仿真汽长狗qq +仿真狗供应qq +仿真狗直销qq +仿真狙击抢直销 +仿真狙击枪qq +仿真狙击枪出售 +仿真金属枪专卖 +仿真金属枪批发 +仿真金属枪提供 +仿真金属枪直销 +仿真金属枪订购 +仿真金属枪购买 +仿真金属枪转让 +仿真阻击枪直销 +伊集院沙罗无码 +众明星乱淫禁书 +优博在线娱乐城 +伟德亚洲娱乐城 +你上我下好嗯啊 +你的大肉棒好粗 +你的大鸡巴好粗 +你的小穴好深啊 +你的小穴好温暖 +你的鸡巴用力干 +供应1元假硬币 +供应3唑仑qq +供应3棱刀qq +供应3箭牌汽枪 +供应54式图纸 +供应56式军刺 +供应64式手枪 +供应77b手枪 +供应92式手枪 +供应av电视棒 +供应awp配件 +供应cfx气枪 +供应ffx气枪 +供应high粉 +供应high药 +供应pcp新贵 +供应pcp汽枪 +供应pcp配件 +供应pcz山猪 +供应x卧底软件 +供应一比一枪模 +供应中握b50 +供应中握pcp +供应乌头碱qq +供应乖乖水qq +供应乖乖水配方 +供应乖乖药qq +供应亚硝酰乙氧 +供应亚硝酸乙酯 +供应人皮制面具 +供应仿真来复枪 +供应仿真枪qq +供应仿真枪配件 +供应仿真气木仓 +供应仿真狗qq +供应仿真狙击枪 +供应仿真金属枪 +供应假发票qq +供应假文凭qq +供应假硬币qq +供应假证件qq +供应假钞票qq +供应偏亚砷酸钾 +供应偏压砷酸钠 +供应催情液qq +供应催情粉qq +供应全氟异丁烯 +供应军官证qq +供应军官证样本 +供应军用54式 +供应军用77式 +供应军用开山刀 +供应军用折叠刀 +供应军用折叠弩 +供应军警服qq +供应化学冰qq +供应化学冰牙签 +供应北朝鲜冰毒 +供应原藜芦碱a +供应去氧麻黄碱 +供应去氧麻黄素 +供应双管平式枪 +供应古柯叶qq +供应可卡因qq +供应可待因qq +供应台湾版假钞 +供应台湾版假钱 +供应听话药qq +供应喵喵药qq +供应喵喵药电话 +供应喷雾蒙汗药 +供应士兵证qq +供应大黑鹰弓弩 +供应天然可卡因 +供应失忆粉qq +供应安乐死药物 +供应小口径手枪 +供应小口径步枪 +供应少女乖乖水 +供应尼泊尔军刀 +供应居民户口本 +供应山奈钾qq +供应峨眉牌汽枪 +供应工字牌气枪 +供应工字牌汽枪 +供应左旋麻黄素 +供应左轮钢珠狗 +供应开他敏qq +供应开刃虎牙刀 +供应开山刀qq +供应异丁腈qq +供应异氰酸苯酯 +供应弓弩麻醉箭 +供应弩用麻醉箭 +供应弹簧刀qq +供应成人dvd +供应成人电视棒 +供应打鸟枪qq +供应拍肩粉qq +供应挥发型迷药 +供应摇头丸qq +供应摇头丸配方 +供应摇头糖qq +供应改装发令枪 +供应改装射钉枪 +供应散弹枪qq +供应昏迷药qq +供应杜冷丁qq +供应棕曲霉毒素 +供应气动狗qq +供应气动钢珠枪 +供应气动铅弹枪 +供应气步枪qq +供应氯甲酸乙酯 +供应氯甲酸甲酯 +供应氯胺酮qq +供应氰化物qq +供应氰化镉qq +供应汽动钢珠枪 +供应汽车干扰器 +供应汽车拦截器 +供应汽车解码器 +供应沙菲片qq +供应海乐神qq +供应海洛因4号 +供应海洛因qq +供应火药枪qq +供应火药钢珠枪 +供应特警作战服 +供应狙击气步枪 +供应猎枪麻醉枪 +供应玻璃bb弹 +供应甲基丙烯腈 +供应甲基可可碱 +供应甲基磺酰氯 +供应甲基苯丙胺 +供应甲基麻黄素 +供应甲氧麻黄酮 +供应白牙签qq +供应盐酸哌替啶 +供应盐酸氯qq +供应盐酸羟亚胺 +供应盐酸麻黄碱 +供应盐酸麻黄素 +供应眼镜蛇弓努 +供应砷酸汞qq +供应硝酸胺炸药 +供应秃鹰pcp +供应秃鹰气步枪 +供应粉末型迷药 +供应精品蝴蝶刀 +供应罂粟壳qq +供应罂粟粉qq +供应美沙酮qq +供应肩迷药qq +供应苍蝇水qq +供应苍蝇粉qq +供应英语等级证 +供应蒙汗药qq +供应蒙汗药配方 +供应虎头牌猎枪 +供应蜘蛛刀qq +供应蝴蝶刀qq +供应赌博粉qq +供应赌博药qq +供应赭曲毒素a +供应赵氏弩qq +供应迷奸粉qq +供应迷奸药qq +供应迷幻水qq +供应迷幻药qq +供应迷情水qq +供应迷情粉qq +供应迷情药qq +供应迷晕药qq +供应迷香药qq +供应迷魂烟qq +供应迷魂药qq +供应迷魂香qq +供应酣乐欣qq +供应重亚硒酸钠 +供应野战刀qq +供应金属仿真狗 +供应针孔作弊器 +供应钢珠左轮狗 +供应钢珠枪qq +供应铅弹气动枪 +供应锡峰牌气枪 +供应锡锋牌汽枪 +供应长治筋qq +供应阻击弩qq +供应雷明登猎狗 +供应雷鸣登猎枪 +供应香港ghb +供应高仿假硬币 +供应高仿学位证 +供应高仿户口本 +供应高仿毕业证 +供应高仿真假币 +供应高仿真假钞 +供应高仿身份证 +供应高压打鸟枪 +供应高压气步枪 +供应鹰飞凌军刀 +供应麦角酸qq +供应麻醉枪qq +供应麻醉箭批发 +供应麻黄碱qq +供应麻黄碱原料 +供应麻黄碱电话 +供应麻黄素qq +供应麻黄素电话 +供应黄牙签qq +供应黑火药qq +供应黑索金qq +便宜出售警用枪 +保定办假身份证 +保证很像学生妹 +信不信我撞死你 +信用卡出售qq +修真之我是神偷 +倾城惑国女太监 +假学位证书供应 +假学位证书出售 +假学位证书办理 +假学位证书销售 +假币免定金送货 +假币公司tel +假币朝鲜版代理 +假文凭代办qq +假文凭代办公司 +假文凭供应qq +假文凭出售qq +假文凭办理qq +假文凭办理公司 +假文凭提供qq +假日国际娱乐城 +假硬币出售qq +假硬币批发qq +假硬币销售qq +假等级证书代办 +假等级证书办理 +假证书代办qq +假证书制作公司 +假证件专卖qq +假证件供应qq +假证件出售qq +假证件制作公司 +假证件制作电话 +假证件办理qq +假证件办理公司 +假证件提供qq +假证办理网qq +假钞买卖包过机 +假钞假币假钱q +假钞免定金送货 +假钞公司tel +假钞出售tel +假钞出售包过机 +假钱出售tel +假驾照代办qq +做爱789电影 +做爱不够十分钟 +做爱激情小电影 +做爱视频成人网 +做硝酸甘油炸药 +健卫步枪制造图 +偷情少妇txt +催情口香糖供应 +催情口香糖出售 +催情口香糖批发 +催情口香糖提供 +催情口香糖直销 +催情口香糖购买 +催情口香糖销售 +催情液出售qq +催情液提供qq +催情液直销qq +催情液销售qq +催情粉专卖qq +催情粉批发qq +催情粉订购qq +催情药专卖qq +催眠水出售qq +催眠水订购qq +儿子淫奸妈妈穴 +儿子淫奸姐姐穴 +儿子的肉棒好硬 +儿子粗大的肉棒 +免定金狩猎气枪 +免定金竞技气枪 +免定金英国骚本 +免定金锡峰气枪 +免注册淫色电影 +免费1夜情裸聊 +免费dse淫乱 +免费台湾激情片 +免费在线淫电影 +免费强奸淫电影 +免费性爱电影网 +免费成人电影网 +免费成人聊天室 +免费淫女a片段 +免费淫奸女a片 +免费淫电影a片 +免费淫电影下载 +免费淫电影网址 +免费淫电影网站 +免费淫电影论坛 +免费淫电影试看 +免费淫色情电影 +免费激情聊天室 +免费激情裸聊网 +免费真人裸聊网 +免费视讯裸聊网 +免费裸聊qq群 +免费裸聊聊天室 +免费观看淫电影 +免费黄b色电影 +党和人民对立了 +党的宗旨成空谈 +全免激情聊天室 +全免费淫色电影 +全球公审江泽民 +全球第1淫图城 +全裸校花级主播 +公务员6p床照 +公务员十大丑陋 +公车上干女司机 +公车淫奸女学生 +兰博ii号出售 +兰博刀专卖qq +兰博刀批发qq +共chang党 +共产主义的幽灵 +共产主义黑皮书 +共和国2049 +养个儿子做丈夫 +兼职全套援交妹 +兼职女上门qq +兼职女上门服务 +兼职学生妹上门 +兼职学生妹双飞 +兼职小姐性服务 +兼职援交妹上门 +兼职援交妹全套 +内裤奇缘txt +最强美乳初解禁 +最新1本道无码 +最新1本道种子 +最新东京热无码 +最新加勒比无码 +最新配信素人娘 +最淫成人贴图区 +最绿的1届政府 +军刀丛林刀专卖 +军刀丛林刀专售 +军刀丛林刀供应 +军刀匕首直销网 +军刀直刀军品网 +军刀网军刀专卖 +军品54式出售 +军品92式出售 +军官证出售qq +军官证办理qq +军用54式专卖 +军用刀具军品网 +军用十字弩直销 +军用开山刀专卖 +军用弓弩专卖店 +军用弓弩专卖网 +军用弩买卖qq +军用弩销售qq +军用弹簧刀供应 +军用弹簧刀直销 +军用弹簧刀销售 +军用手枪制造图 +军用手枪钢珠枪 +军用折叠刀供应 +军用折叠刀出售 +军用潜水刀专卖 +军用潜水刀批发 +军用狙击弩专卖 +军用狙击弩出售 +军用狙击弩直销 +军用狙击弩销售 +军用麻醉枪专卖 +军警服直销qq +军警服销售qq +农民伯伯乡下妹 +冬月枫种子下载 +冰毒出售tel +冰毒批发tel +冰毒的价格qq +冰毒的制作方法 +冰毒的制作过程 +冰毒的制作配方 +冰牙签供应qq +冰牙签出售qq +冰牙签提供qq +冰牙签销售qq +冲袋奶粉给党喝 +冷色情挑txt +冷钢刀具军品网 +冷钢刀具直销网 +凌家有女初为妾 +出售:高仿真枪 +出售1元假硬币 +出售1字开锁枪 +出售3利达弓弩 +出售3唑仑qq +出售3唑仑教程 +出售3唑仑电话 +出售3棱刀qq +出售3棱短匕首 +出售3硝基甲苯 +出售3硝基苯酚 +出售3箭牌汽枪 +出售3角牌气枪 +出售45气枪弹 +出售54式军狗 +出售54式手枪 +出售54式手狗 +出售54式汽狗 +出售54式真枪 +出售54枪qq +出售55气枪弹 +出售56式军刺 +出售56式刺刀 +出售5连发汽枪 +出售5连发猎枪 +出售63式军刺 +出售64仿真枪 +出售64式军狗 +出售64式手枪 +出售64式枪支 +出售77式军狗 +出售77式手枪 +出售92式手枪 +出售av电视棒 +出售awp配件 +出售bb瓦斯枪 +出售cfx气枪 +出售ffx气枪 +出售fing霸 +出售ghb原液 +出售high粉 +出售high药 +出售king粉 +出售k粉麻黄素 +出售M1911 +出售pcp新贵 +出售pcp气枪 +出售pcp汽枪 +出售pcp秃鹰 +出售pcp配件 +出售pcz山猪 +出售tnt炸药 +出售一比一枪模 +出售万利达弓弩 +出售万能开锁器 +出售下压款式枪 +出售丛林刀qq +出售中握b50 +出售中握pcp +出售乖乖水qq +出售乖乖水配方 +出售乖乖药qq +出售仿真人民币 +出售仿真手拉狗 +出售仿真来复枪 +出售仿真枪模具 +出售仿真枪配件 +出售仿真狙击枪 +出售仿真金属枪 +出售信号拦截器 +出售信用卡qq +出售信用卡资料 +出售假冒身份证 +出售假学历证书 +出售假币tel +出售假护照qq +出售假文凭qq +出售假硬币qq +出售假等级证书 +出售假证书qq +出售假证件qq +出售假钞票qq +出售假钱tel +出售健卫小口径 +出售催情口香糖 +出售催情液qq +出售催情粉qq +出售催情药qq +出售催情速溶片 +出售兰博刀qq +出售冒名信用卡 +出售军人证qq +出售军官证qq +出售军用54式 +出售军用64式 +出售军用开山刀 +出售军用弩qq +出售军用潜水刀 +出售军用狗54 +出售军用狙击弩 +出售冰毒tel +出售冰牙签qq +出售力思曼弓弩 +出售动物麻醉枪 +出售化学冰牙签 +出售北朝冰qq +出售半自动手枪 +出售半自动猎枪 +出售单发麻醉枪 +出售单管猎l枪 +出售博伊刀qq +出售原装猎l枪 +出售去氧麻黄碱 +出售去氧麻黄素 +出售双管平式枪 +出售古柯叶qq +出售可卡因qq +出售可待因qq +出售台湾版假币 +出售台湾版假钞 +出售台湾版假钱 +出售各式热兵器 +出售各种植物冰 +出售各类军用枪 +出售听话水qq +出售听话药qq +出售咖啡因qq +出售喵喵药qq +出售喷雾蒙汗药 +出售喷雾迷幻药 +出售喷雾迷情水 +出售土炸药qq +出售圣甲虫跳刀 +出售大冰砖qq +出售大冰砖教程 +出售大马士革刀 +出售失忆药qq +出售失身水qq +出售安乐死毒药 +出售安乐死迷药 +出售安眠药qq +出售安纳咖qq +出售小冰砖教程 +出售小口径手枪 +出售小口径枪械 +出售小口径步枪 +出售小口径猎枪 +出售少女催情粉 +出售尼泊尔军刀 +出售峨眉牌汽枪 +出售工字牌气枪 +出售工字牌汽枪 +出售工字牌汽狗 +出售左旋麻黄素 +出售左轮枪qq +出售左轮钢珠狗 +出售库尔喀弯刀 +出售开他敏qq +出售开刃3棱刀 +出售开刃弹簧刀 +出售开山刀qq +出售开山刀军刺 +出售开心水qq +出售式手枪qq +出售弹簧刀qq +出售弹簧刀匕首 +出售强暴药qq +出售微型冲锋枪 +出售快鹿牌气枪 +出售快鹿牌汽枪 +出售成人av片 +出售成人dvd +出售战术突击刀 +出售户外狩猎弩 +出售手拉awp +出售手木仓qq +出售手木仓子弹 +出售手机变号器 +出售手机窃听卡 +出售手枪消声器 +出售手榴弹qq +出售手汽枪qq +出售打鸟枪qq +出售执勤装警服 +出售折叠款式枪 +出售拍肩听话粉 +出售挥发性迷药 +出售摇头丸qq +出售摇头丸教程 +出售改装发令枪 +出售改装射钉枪 +出售散弹枪0件 +出售散弹枪qq +出售日本武士刀 +出售朝鲜冰qq +出售朝鲜版假币 +出售朝鲜版硬币 +出售杜冷丁qq +出售枪支0配件 +出售植物冰qq +出售植物冰牙签 +出售正宗斩马刀 +出售毕业证qq +出售气动铅弹枪 +出售气弹枪qq +出售气手枪qq +出售气手狗qq +出售气木仓qq +出售气枪瞄准器 +出售氯胺酮qq +出售氯胺酮教程 +出售氯胺酮电话 +出售汽步枪qq +出售汽车屏蔽器 +出售汽车干扰器 +出售汽车拦截器 +出售汽车解码器 +出售沙菲片qq +出售海乐神qq +出售海云武士刀 +出售海军突击刀 +出售海洛因4号 +出售海洛因qq +出售海洛因教程 +出售液体迷幻药 +出售溜冰壶qq +出售火药动力枪 +出售火药枪qq +出售火药钢珠枪 +出售烈性tnt +出售热缚纸假币 +出售燃烧弹配方 +出售爆破剂qq +出售狙击弩qq +出售狙击枪qq +出售狙击气步枪 +出售狩猎弩qq +出售猎木仓qq +出售猎枪麻醉枪 +出售猪肉白牙签 +出售玻璃bb弹 +出售瑞士迷你枪 +出售甲基苯丙胺 +出售甲子苯丙胺 +出售甲氧麻黄酮 +出售甲状旁腺源 +出售电动开锁枪 +出售白冰糖qq +出售白冰黄牙签 +出售白牙签qq +出售白牙签教程 +出售白牙签电话 +出售盐酸哌替啶 +出售盐酸曲马多 +出售盐酸羟亚胺 +出售盐酸麻黄碱 +出售硝酸胺炸药 +出售硝酸铊qq +出售礼花弹qq +出售礼花炮qq +出售秃鹰pcp +出售秃鹰枪qq +出售秃鹰气步枪 +出售粉末型迷药 +出售约会强暴粉 +出售罂粟碱qq +出售美军骑兵刀 +出售美军骑兵枪 +出售美沙酮qq +出售老板手机号 +出售考试作弊器 +出售耐特野战刀 +出售肩迷药qq +出售脱氧麻黄碱 +出售自制92式 +出售自制手木仓 +出售自制火药枪 +出售苍蝇水qq +出售苍蝇粉qq +出售蒙汗药配方 +出售虎头牌猎枪 +出售蜘蛛刀qq +出售蝴蝶刀qq +出售警官证qq +出售警服警用品 +出售警用催泪弹 +出售警用电击器 +出售赌博粉qq +出售走私冲锋枪 +出售走私狙击枪 +出售身份证qq +出售过机版假钞 +出售过机版假钱 +出售运动射击枪 +出售进口pcp +出售进口仿真枪 +出售进口催情水 +出售进口模型枪 +出售进口气木仓 +出售进口汽手狗 +出售进口狙击弩 +出售进口钢珠狗 +出售迷奸药qq +出售迷幻水qq +出售迷幻药qq +出售迷情催情粉 +出售迷魂水教程 +出售迷魂烟qq +出售迷魂粉教程 +出售迷魂药qq +出售迷魂药教程 +出售迷魂药配方 +出售迷魂香qq +出售酣乐欣qq +出售野战刀qq +出售野营开山刀 +出售金属仿真枪 +出售金属手拉机 +出售金属手拉鸡 +出售金属钢珠枪 +出售金身仿真枪 +出售针孔作弊器 +出售钢珠左轮狗 +出售钢珠枪qq +出售钢珠狗qq +出售钢管枪qq +出售钻石冰教程 +出售钻石冰电话 +出售铅弹气动枪 +出售银行信用卡 +出售银行卡qq +出售银行卡复制 +出售锡锋牌汽枪 +出售长治筋qq +出售防身麻醉枪 +出售阻击弩qq +出售阿普唑仑片 +出售雷明登猎狗 +出售驾驶证qq +出售骚本pcp +出售高仿4级证 +出售高仿假硬币 +出售高仿军官证 +出售高仿学位证 +出售高仿户口本 +出售高仿毕业证 +出售高仿真人皮 +出售高仿真假币 +出售高仿真假钞 +出售高仿真假钱 +出售高仿真枪支 +出售高仿真枪模 +出售高仿真硬币 +出售高仿真证件 +出售高仿真面具 +出售高压仿真枪 +出售高压打鸟枪 +出售高压气步枪 +出售高压电警棍 +出售高压钢珠狗 +出售高清晰假钞 +出售高纯度冰糖 +出售鹰飞凌军刀 +出售麦角酸qq +出售麦角酸教程 +出售麻古壶qq +出售麻醉狗qq +出售麻黄碱qq +出售麻黄素k粉 +出售麻黄素原料 +出售麻黄素教程 +出售麻黄素配方 +出售黄牙签qq +出售黄牙签教程 +出售黑曼巴弓弩 +出售黑火药qq +出轨女人txt +分开双腿来爱我 +刘亦菲母女逢春 +刘奇葆热门人选 +初流出ロリプリ +利盈在线娱乐城 +利高在线娱乐城 +别说话脱衣服吧 +制作3箭牌汽枪 +制作tnt炸药 +制作假学历证书 +制作假文凭qq +制作假文凭证书 +制作假证书qq +制作假证件qq +制作小口径步枪 +制作工字牌汽枪 +制作氯胺酮qq +制作氯胺酮方法 +制作火药的方法 +制作炸弹首先要 +制作燃烧弹方法 +制作燃烧瓶方法 +制作盐酸羟亚胺 +制作高仿军官证 +制作高仿户口本 +制作高仿毕业证 +制作黑火药方法 +制办假证件qq +制造燃烧弹方法 +制造燃烧瓶方法 +刻章办假证qq +剁饼子包夜服务 +剩女不淑txt +力斯曼弓弩供应 +办假2代身份证 +办假医师资格证 +办假学位证qq +办假学生证qq +办假毕业证qq +办假英语4级证 +办假英语6级证 +办假证公司qq +办假证刻章qq +办假身份证q证 +办假身份证件q +办假驾驶证qq +办大学文凭qq +办毕业证房产证 +办毕业证身份证 +办理仿真户口本 +办理仿真身份证 +办理假会计师证 +办理假冒身份证 +办理假学历证件 +办理假文凭qq +办理假文凭证书 +办理假毕业证书 +办理假证书qq +办理军官证qq +办理军官证样本 +办理学位证qq +办理学士学位证 +办理居民户口本 +办理本科证qq +办理毕业证qq +办理真实身份证 +办理英语等级证 +办理警官证qq +办理驾驶证qq +办理高仿军官证 +办理高仿学位证 +办理高仿户口本 +办理高仿毕业证 +办理高仿真证件 +办理高仿资格证 +办理高仿身份证 +办理高仿驾驶证 +办高仿假证qq +办高仿证件qq +加勒比av影讯 +加勒比av视讯 +加勒比午夜电影 +加勒比成人影讯 +加我微信看福利 +动画成人版下载 +劫后天府泪纵横 +勃朗宁军刀专卖 +勃朗宁军刀订购 +包夜性服务qq +包夜性服务电话 +匕首麻醉枪专卖 +匕首麻醉枪出售 +化学冰牙签出售 +北原多香子种子 +北村由里香无码 +北条麻妃1gb +十8小妹自拍网 +十8岁少女诱惑 +千亿国际娱乐城 +千术赌术大揭秘 +午夜免费爽电影 +午夜成人裸聊网 +午夜激情情色网 +午夜激情电影网 +半裸江山txt +华人正遭受战火 +华夏国际娱乐城 +单机版性爱游戏 +单管猎枪专卖店 +单管猎枪结构图 +卖1代假身份证 +卖2代假身份证 +卖45mm狗粮 +卖假1代身份证 +卖假2代身份证 +卖单管猎枪出售 +卖单管猎狗出售 +卖手机窃听软件 +卖淫女包夜电话 +卖淫女援交电话 +卖淫女特殊服务 +卖淫女联系电话 +卖甲卡西酮qq +卖甲卡西酮手机 +卖甲卡西酮电话 +卖身份证生成器 +卖迷魂药3唑仑 +南波杏电驴下载 +南波杏高清下载 +博彩乐透乐qq +博彩通天上人间 +博狗娱乐城赌博 +卡通美女淫乱图 +卧底软件企业版 +卧底软件破解版 +原子弹制作手册 +原子弹制作教程 +原子弹制作方法 +原装cfx气枪 +原装pcp气枪 +原装工字牌气枪 +原装西班牙气枪 +厦门办假毕业证 +去氧麻黄素出售 +去氧麻黄素配方 +去氧麻黄素销售 +去甲麻黄碱出售 +去甲麻黄碱销售 +县委书记群p照 +又大又嫩的阴户 +又大又硬的肉棒 +又大又硬的香蕉 +又大又粗的肉棒 +又大又紧的阴户 +又大又肥的阴道 +又嫩又紧的阴户 +又深又紧的阴户 +又硬又大的肉棒 +又硬又粗的肉棒 +又粗又大的肉棒 +又粗又硬的肉棒 +又粗又长的肉棒 +又粘又湿的阴户 +又紧又嫩的屄儿 +又肥又大的阴户 +又肥又嫩的阴户 +又肥又紧的屄儿 +又肥又紧的阴道 +又解开乳罩鸡巴 +又长又大的肉棒 +又顶到我的子宫 +友情气枪专卖网 +双氢可待因提供 +双管平式枪出售 +双飞meinv +反中共黑色暴力 +反屏蔽无线耳机 +反恐狙击弩买卖 +变态幼男插嫩屄 +口含住鸡巴精液 +口爆乳爆150 +古桃色联系qq +只要jj不要爱 +可以联席我威幸 +可以联席我威莘 +可以联席我威辛 +可卡因供应qq +可卡因出售qq +可卡因批发qq +可卡因提供qq +可卡因直销qq +可卡因订购qq +可卡因购买qq +可卡因销售qq +可待因专卖qq +可待因供应qq +可待因出售qq +可待因批发qq +可待因销售qq +可爱虎牙学生妹 +可过机假钱qq +台湾18岁成人 +台湾18成人网 +台湾19岁成人 +台湾20岁成人 +台湾免费淫电影 +台湾是主权国家 +台湾淫电影导航 +台湾版假币qq +台湾版假币买卖 +台湾版假币批发 +台湾版假币提供 +台湾版假币直销 +台湾版假币订购 +台湾版假钞买卖 +台湾版假钞批发 +台湾版假钞提供 +台湾版假钞直销 +台湾版假钞订购 +台湾版假钱买卖 +台湾版假钱批发 +台湾版假钱直销 +司法不公有冤案 +各种姿势各种嗨 +各类军用枪出售 +合成氯胺酮qq +合成盐酸羟亚胺 +同城ons夜情 +同城交友性交网 +同城美女1夜情 +同城裸聊qq群 +同城骚b1夜情 +同学的可爱女友 +同志上门性服务 +同志包夜性服务 +同性恋上门服务 +君岛爱迅雷下载 +含住我的小鸡鸡 +听着我们做爱吧 +听话水专卖qq +听话水出售qq +听话药出售qq +听话药订购qq +听话药购买qq +吸吮套弄了起来 +吸吮著我的阳具 +周恩来清誉背后 +和两勇男玩3p +和两勇男玩4p +和两勇男玩5p +和两勇男玩6p +和两勇男玩7p +和两勇男玩8p +和两勇男玩9p +和少妇做爱好爽 +和护士姐姐淫穴 +咖啡因出售qq +咪咪爱最新网址 +咪咪爱大型黄站 +咪咪爱网址大全 +咲田纱耶香无码 +品牌刀具专卖网 +品色堂最新地址 +品色堂收藏网址 +品色堂论坛地址 +哈尔滨小姐上门 +哥哥淫奸妹妹穴 +哥哥的猫耳女仆 +哥哥的肉棒好大 +哥哥粗大的肉棒 +哪里有出台小姐 +哪里有卖双管猎 +哪里有真枪出售 +哪里有真枪卖买 +唐人街情色导航 +售k粉麻果冰毒 +售兰博刀具qq +售高仿真人民币 +商丘色情mm网 +喂奶群众都看见 +喔我又要泄泄了 +喜欢白带的味道 +喵喵药供应qq +喵喵药出售qq +喵喵药批发qq +喵喵药提供qq +喵喵药直销qq +喵喵药订购qq +喵喵药送货上门 +喵喵药销售qq +喷潮而出的娇羞 +喷雾蒙汗药专售 +喷雾迷幻药供应 +喷雾迷幻药出售 +喷雾迷幻药批发 +喷雾迷幻药提供 +喷雾迷幻药直销 +喷雾迷幻药订购 +喷雾迷幻药销售 +喷雾迷情水批发 +喷雾迷情水提供 +喷雾迷情水直销 +喷雾迷情水订购 +喷雾迷情水购买 +喷雾迷情水销售 +嗨约呀茄扣聊吧 +器大活好还有钱 +国产夫妻淫电影 +国产气枪专卖网 +国产麻醉枪买卖 +国内外文凭代办 +国内外文凭认证 +国内天使做爱记 +国家总理诸葛亮 +国家道德的缺失 +图片不爽你砍我 +土制炸药的制作 +土制黑火药方法 +土屋加奈子无码 +土炸弹出售qq +土炸弹制作工艺 +土炸弹制作方法 +土炸弹制作视频 +土炸弹合成方法 +土炸药出售qq +土炸药销售qq +在线0售枪配件 +在线6合彩下注 +在线6合彩投注 +在线免费淫电影 +在线博彩娱乐城 +在线小淫虫电影 +在线操少妇电影 +在线淫电影网站 +在线激情淫电影 +在线现金6合彩 +在线百家乐qq +在线百家乐平台 +在线百家乐投注 +在线看淫色电影 +在线真人百家乐 +在线真钱百家乐 +在线观看淫电影 +地下裸模私拍照 +坂巻里绪菜无码 +坏坏老公别吃我 +坚挺持久咱不痿 +基督灵恩布道团 +塑料炸弹diy +增值税发票代开 +增值税发票出售 +处女契约txt +处女穴阴唇肉缝 +多功能折刀专卖 +夜夜色大型网站 +夜夜色大型黄站 +夜聊视频聊天室 +大6性美女淫穴 +大丑风流记下载 +大乱交rmvb +大众色情成人网 +大冰砖专卖qq +大冰砖买卖qq +大冰砖价格qq +大冰砖出售qq +大冰砖出售电话 +大冰砖提供qq +大冰砖送货上门 +大冰砖销售qq +大发真钱娱乐城 +大威力弓弩专卖 +大学生性爱自拍 +大学生援交qq +大富豪国际娱乐 +大母牛娱乐论坛 +大肉棒刺入肉穴 +大肉棒干进小穴 +大肉棒深深地插 +大量出售植物冰 +大量出售海洛因 +大量出售麦角酸 +大马士革刀专卖 +大鸡吧插人阴户 +大鸡吧插进阴道 +大鸡吧顶进小穴 +大鸡巴干进小穴 +大鸡巴干进花心 +大鸡巴插入肉穴 +大鸡巴插入肉缝 +大鸡巴插进小穴 +大鸡巴操小嫩逼 +大鸡巴操小骚逼 +大鸡巴狠插小穴 +大鸡巴用力地干 +大黑鹰弓弩专卖 +大黑鹰弓弩供应 +大黑鹰弓弩出售 +大黑鹰弓弩提供 +大黑鹰弓弩转让 +大龟头顶住花心 +天下恶官应丧魂 +天安们母亲运动 +天安门母亲运动 +天猫国际娱乐城 +天生我才必有用 +天生我材必有用 +太子娱乐城官网 +太子娱乐城开户 +太子娱乐城网址 +太舒服了淫肉穴 +太阳城亚洲开户 +太阳城在线娱乐 +太阳城娱乐博彩 +太阳城投注棋牌 +太阳城真人娱乐 +太阳城真人游戏 +太阳城网上娱乐 +夫妻不雅照种子 +夫妻性教育电影 +夫妻性爱纪录片 +夫妻激情自拍图 +夫妻群交俱乐部 +失忆水供应qq +失忆水出售qq +失忆水批发qq +失忆水提供qq +失忆水直销qq +失忆水订购qq +失忆水购买qq +失忆水销售qq +失忆粉订购qq +失忆粉购买qq +失忆药出售qq +失忆药批发qq +头像是你吧魏信 +头顶j8欲草天 +奈奈见沙织无码 +奈奈见沙织种子 +女主人罗姬马莉 +女体拷问研究所 +女做爱光盘亚洲 +女儿淫奸妈妈穴 +女公关上门服务 +女卫生间盗摄图 +女同志淫乱贴图 +女学生拍我该死 +女学生游击队员 +女性私处锻炼法 +女教师淫乱课堂 +女添男精狂射图 +奶油冰批发qq +奸杀美女大学生 +她的阴户好嫩啊 +她的阴道好深啊 +她的阴道好紧啊 +好深啊操我插我 +好爽顶得好深啊 +好莱坞黄片家族 +如何制作氯胺酮 +如何制硝化甘油 +如何改装射钉枪 +如何自制燃烧弹 +妈你的小穴好插 +妈妈你的穴好紧 +妈的骚穴操穴逼 +妈的骚穴痒死了 +妈要吃你的肉棒 +妓女上门性服务 +妓女全套性服务 +妓女性服务qq +妓女提供性服务 +妓女服务tel +妖娆魅惑抛美胸 +妹妹乱伦理淫穴 +妹妹嫩穴被狂插 +妹妹留步我插比 +妹妹的小屄好痒 +妹妹的屄好紧啊 +妹妹的穴好多水 +妹妹的阴道真紧 +妹岳奈津美种子 +妻子的淫乱生活 +姐姐嫁给我好吗 +姐姐的穴好大啊 +姐姐的穴好紧啊 +姐姐被插的好爽 +姐弟激情淫影片 +姚记娱乐城官网 +姚记娱乐城网站 +姨妢妕姺苼射你 +娇妻淫乱txt +娇嫩的蜜穴肉穴 +娇小鲜嫩的小屄 +娇淫青春之放纵 +姬岛瑠梨香种子 +娱乐城在线下注 +娱乐城注册送金 +娱乐城现金下注 +娱乐城线上下注 +娱乐性大型黄站 +婷婷激情俱乐部 +婷婷激情聊天室 +婷婷色情5月天 +嫩穴狂插还流水 +嫩穴里他的鸡巴 +孤街浪女很孤独 +学位证出售qq +学姐和我的故事 +学生上门性服务 +学生做兼职小姐 +学生妹上门按摩 +学生妹上门援交 +学生妹上门服务 +学生妹全套援交 +学生妹出台包夜 +学生妹出台服务 +学生妹包夜qq +学生妹在线裸聊 +学生妹按摩包夜 +学生妹援交qq +学生妹援交全套 +学生妹援交服务 +学生妹援交电话 +学生爱国者运动 +宁王府成人导航 +宁王府淫图导航 +宇佐美恭香种子 +安徽庐江艳照门 +完全免费淫电影 +官员们加官进爵 +官商警匪多勾结 +官场妖孽txt +宫下真纪子种子 +宫沢麻里子无码 +家有妖男小小受 +寂寞少妇等你x +寂寞自拍可裸聊 +富家女的男保姆 +寻找林昭的灵魂 +封堵省政府大门 +将阴茎尽根插入 +射进女儿的子宫 +射钉枪改装方法 +小冰砖出售qq +小冰砖送货上门 +小口径手枪专卖 +小口径手枪批发 +小口径手枪订购 +小口径步枪出售 +小口径步枪订购 +小口径步枪销售 +小口径气枪专卖 +小口径汽枪出售 +小口径汽枪销售 +小口径秃鹰沙漠 +小嘴吞吐的肉棒 +小型弓弩专卖店 +小姐1夜情服务 +小姐上门性服务 +小姐兼职女上门 +小姐兼职女全套 +小姐包夜性服务 +小姨子淫色导航 +小姨子爱液横流 +小姨子的小嫩屄 +小屄儿温暖滑嫩 +小岛沙耶香无码 +小情侣床战流出 +小泽圆种子下载 +小泽玛丽亚种子 +小泽玛利亚种子 +小穴不断被顶入 +小穴在上下套动 +小穴夹的我好紧 +小穴收缩颤抖著 +小穴被阴茎顶住 +小野今日子种子 +小野寺沙希无码 +小野寺沙希种子 +少女之心txt +少女乱伦av片 +少女催情粉供应 +少女催情粉批发 +少女催情粉提供 +少女催情粉直销 +少女催情粉订购 +少女催情粉购买 +少女催情粉销售 +少女激情聊天室 +少女被操喷精图 +少妇上门性服务 +少妇全套包夜q +少妇床上的激情 +少妇扒开阴道图 +少妇援交妹服务 +少妇淫图电影网 +少妇白洁txt +少妇的骚穴淫液 +少年阿宾txt +尼泊尔军刀qq +尼泊尔军刀专卖 +尼泊尔军刀供应 +尼泊尔军刀出售 +尼泊尔军刀批发 +尼泊尔军刀提供 +尼泊尔军刀直销 +尼泊尔军刀订购 +尼泊尔军刀转让 +尼泊尔军刀销售 +山奈钾买卖qq +山奈钾批发qq +山奈钾直销qq +山奈钾订购qq +山本梓无码下载 +山野情债txt +岛国动作片1样 +川岛和津实种子 +工业电雷管出售 +工业黑索今出售 +工商税务两条狼 +工字气枪专卖网 +工字气枪网qq +工字汽狗麻醉枪 +工字牌气枪qq +工字牌气枪出售 +工字牌气枪提供 +工字牌气枪订购 +工字牌气枪销售 +工字牌汽枪qq +工字牌汽枪专卖 +工字牌汽枪买卖 +工字牌汽枪供应 +工字牌汽枪出售 +工字牌汽枪出货 +工字牌汽枪到货 +工字牌汽枪制造 +工字牌汽枪图纸 +工字牌汽枪批发 +工字牌汽枪提供 +工字牌汽枪电话 +工字牌汽枪订购 +工字牌汽枪销售 +工程交给小日本 +左旋麻黄素供应 +左旋麻黄素出售 +左旋麻黄素出货 +左旋麻黄素到货 +左旋麻黄素合成 +左旋麻黄素批发 +左旋麻黄素提供 +左旋麻黄素直销 +左旋麻黄素订购 +左旋麻黄素购买 +左旋麻黄素配方 +左旋麻黄素销售 +左轮发令枪改造 +左轮手枪制造图 +左轮枪出售qq +左轮枪销售qq +左轮钢珠狗专卖 +左轮钢珠狗出售 +市内出售军用枪 +希崎洁西嘉bt +希崎洁西嘉全集 +希崎洁西嘉无码 +希崎洁西嘉电驴 +帝国幼幼集团军 +帮助妻子去偷情 +干妈妈的小穴穴 +干老师的穴好爽 +干进妹妹的小穴 +平井玛利亚种子 +平立式双管猎枪 +年代大饥荒纪实 +年收入赶超微软 +乡村乱伦txt +幼交图嫩女兽交 +幼交片下载qq +幼香阁最新地址 +幼香阁美幼专区 +广州3箭制造图 +广州找小姐服务 +广州找应招小姐 +广濑奈央美种子 +床上激情自拍图 +床上的淫荡少女 +庐江6p全套图 +庐江6p门事件 +庐江不雅照bt +庐江书记不雅照 +庐江何婷婷艳照 +庐江县官不雅照 +庐江县艳照群p +庐江官员不雅照 +庐江官员群p门 +庐江艳照门下载 +庐江艳照门套图 +庐江艳照门视频 +庐江艳照门种子 +度冷丁供应qq +开他敏供应qq +开他敏出售qq +开他敏批发qq +开他敏提供qq +开他敏直销qq +开他敏订购qq +开他敏购买qq +开他敏销售qq +开刃开山刀供应 +开山刀专卖qq +开山刀买卖qq +开山刀供应qq +开山刀出售qq +开山刀批发qq +开山刀直销qq +开山刀砍刀出售 +开山刀转让qq +开山刀销售qq +开建筑发票qq +开心水出售qq +异丁腈供应qq +异丁腈批发qq +异氰酸苯酯专卖 +弓弩一百专卖店 +弓弩专卖店qq +弓弩专卖网qq +弓弩的制作方法 +弟弟淫奸姐姐穴 +弟弟的肉棒好粗 +弟弟粗大的肉棒 +张开双腿菊花穴 +张锐因吸毒被捕 +弩机的制作方法 +弹簧刀专卖qq +弹簧刀买卖qq +弹簧刀供应qq +弹簧刀出售qq +弹簧刀批发qq +弹簧刀提供qq +弹簧刀直销qq +弹簧刀订购qq +弹簧刀销售qq +强奸meinv +强奸之制服诱惑 +强奸免费淫电影 +强奸美女小游戏 +强效催情水专卖 +归牛花满俯卧撑 +当面交易假文凭 +当面交易假言正 +当面交易假证件 +当面交易假车牌 +当面交易军人证 +当面交易军官证 +当面交易国安证 +当面交易士兵证 +当面交易工作证 +当面交易户口本 +当面交易行驶证 +当面交易记者证 +当面交易身份证 +当面交易驾驶证 +当面交易高仿证 +彭启荣和蔡发春 +德国开山刀专卖 +德版ppk供应 +忧木瞳无码下载 +快播亚洲av片 +快播大6av片 +快播成人av片 +快播成人伦理片 +快播成人情色网 +快播成人激情片 +快播成人色网址 +快播日韩av片 +快播港台av片 +快播色情片种子 +快速办假证qq +快速办理真文凭 +忻州找漂亮小姐 +怎么自制燃烧弹 +怎么购买迷情药 +怎样自制烟雾弹 +怜卿甘为身下奴 +怡红院色情电影 +急聘兼职打字员 +性吧地址发布器 +性吧网址发布器 +性奴岛的女人们 +性宝贝淫色导航 +性工作者十日谈 +性服务上门qq +性服务小姐qq +性欲喘息女教师 +性毒品和摇滚乐 +性爱影片在线看 +性爱片视频中心 +性爱电影在线看 +性福源亚洲激情 +性福皇后txt +总理夫人做生意 +总理夫人张培莉 +总裁女儿爱上我 +恩华3唑仑qq +情色小说txt +情色激情美女穴 +情色电影立即看 +情色阁最新网址 +想寻激情的帅哥 +愚弄百姓的旧招 +愚昧的藏族学生 +成人a片在线看 +成人h漫画下载 +成人专用播放器 +成人伦理色情片 +成人做爱聊天室 +成人免费黄电影 +成人午夜场影院 +成人在线裸聊网 +成人小说阅读网 +成人影下载地址 +成人性爱聊天室 +成人情色片下载 +成人情色电影网 +成人情色视频网 +成人收费裸聊室 +成人文学交流区 +成人毛片在线看 +成人激情午夜场 +成人激情小说网 +成人激情淫另类 +成人激情淫影院 +成人激情淫网站 +成人激情淫论坛 +成人激情爽电影 +成人激情片下载 +成人激情电影网 +成人激情聊天室 +成人激情聊天网 +成人激情脱衣秀 +成人爽片在线看 +成人爽电影网站 +成人版动画下载 +成人电影播放器 +成人电视棒qq +成人电视棒供应 +成人电视棒出售 +成人电视棒批发 +成人电视棒提供 +成人电视棒销售 +成人视讯聊天室 +成人视频聊天室 +成人网址发布器 +成人网站发布器 +成人网站排行榜 +成人网络电视棒 +成人色情图片网 +成人色情小游戏 +成人色情小说网 +成人色情电影网 +成人色情视频网 +成人裸体聊天室 +成人裸聊网qq +成人裸聊聊天室 +成人贴图区论坛 +成人资源发布站 +成人黄片在线看 +成人黄色3级片 +成人黄色小游戏 +成熟性感大美女 +我上小姨子小说 +我与网吧老板娘 +我含住他的阴茎 +我和姨在车上干 +我和我妹妹雯雯 +我和网吧老板娘 +我国法律太软弱 +我家相公是情兽 +我引台资入国库 +我心我色txt +我把艳姨给干了 +我抓台谍好助选 +我是9号来天国 +我是千斤大小姐 +我是弱受我怕谁 +我是王妃txt +我是超仔的妈妈 +我是鹏儿的妈妈 +我有精子你要么 +我湿淋淋的阴道 +我爱由我不由天 +我的v信paj +我的女友是2嫂 +我的妈妈李彤彤 +我的姐姐是美女 +我的小屄儿好痒 +我的性启蒙老师 +我的梦想在燃烧 +我的老婆是警花 +我的邻居很腹黑 +我要sm口交网 +我该死视频做爱 +战术突击刀专卖 +户外刀具军品网 +户外刀具批发网 +户外开山刀专卖 +所谓的政府部门 +手把手制作炸弹 +手把手教做炸弹 +手拉狗出售qq +手拉鸡专卖qq +手指抠肉洞肉缝 +手指拨弄着穴口 +手木仓专卖qq +手木仓配件专卖 +手机x卧底下载 +手机x卧底软件 +手机卡监听软件 +手机卧底x软件 +手机卧底监听器 +手机变号器qq +手机变号器批发 +手机监听1卡通 +手机监听器软件 +手机监听王下载 +手机窃听器专卖 +手机窃听器公司 +手机窃听器购买 +手机窃听器软件 +手枪专卖网qq +手枪的制造原理 +手枪的制造工艺 +手枪的制造方法 +手枪阻击枪出售 +扒开她两扇阴唇 +扒开她的嫩阴道 +扒开她的小穴穴 +扒开淫女的骚逼 +打倒中国共产党 +打劫得到的政府 +打狗弓弩3步倒 +打狗弓弩三步倒 +打鸟枪供应qq +打鸟枪出售qq +批发03式步枪 +批发1元假硬币 +批发3唑仑qq +批发3棱军刺刀 +批发3棱刀qq +批发54式手枪 +批发56式军刺 +批发64式手枪 +批发64手木仓 +批发6氢大麻酚 +批发77b手枪 +批发77式手枪 +批发92式手枪 +批发92式手狗 +批发95式步枪 +批发97式步枪 +批发av电视棒 +批发awp配件 +批发ghb原液 +批发high粉 +批发high药 +批发pcp汽枪 +批发pcp配件 +批发万利达弓弩 +批发中握b50 +批发中握pcp +批发乌头碱qq +批发乖乖水qq +批发乖乖药qq +批发亚硝酸乙酯 +批发仿真枪模具 +批发仿真枪配件 +批发仿真金属枪 +批发供应3唑仑 +批发供应大冰砖 +批发供应小冰砖 +批发供应摇头丸 +批发供应摇头糖 +批发供应氯胺酮 +批发供应海洛因 +批发供应白牙签 +批发供应迷魂药 +批发供应钻石冰 +批发供应麦角酸 +批发供应麻黄素 +批发供应黄牙签 +批发假冒身份证 +批发假硬币qq +批发假硬币电话 +批发假证书qq +批发催情水qq +批发催情液qq +批发兽用麻醉枪 +批发军用弩qq +批发军用弹簧刀 +批发军用折叠刀 +批发军用枪qq +批发冰毒tel +批发冰牙签qq +批发动物麻醉枪 +批发双管猎木仓 +批发古柯碱qq +批发可卡因qq +批发可待因qq +批发台湾版假币 +批发台湾版假钞 +批发听话药qq +批发喵喵药qq +批发喷雾型迷药 +批发大黑鹰弓弩 +批发失忆水qq +批发失忆粉qq +批发失忆药qq +批发安纳咖qq +批发小冰砖qq +批发尼泊尔军刀 +批发峨眉牌汽枪 +批发工字牌汽枪 +批发左旋麻黄素 +批发廓尔喀军刀 +批发开他敏qq +批发开刃蝴蝶刀 +批发开山刀qq +批发异丁腈qq +批发弹簧刀qq +批发成人dvd +批发户外开山刀 +批发手机变号器 +批发打鸟枪qq +批发挥发型迷药 +批发摇头丸qq +批发摇头丸配方 +批发摇头糖qq +批发朝鲜冰qq +批发杜冷丁qq +批发气动狗qq +批发气动钢珠枪 +批发气手枪qq +批发气木仓qq +批发气步枪qq +批发氯甲酸乙酯 +批发氯甲酸甲酯 +批发氯胺酮qq +批发氰化物qq +批发汽步枪qq +批发汽车解码器 +批发沙菲片qq +批发海乐神qq +批发海洛因qq +批发海洛因麻古 +批发液体迷幻药 +批发炸药导火索 +批发特警作战服 +批发狙击弩qq +批发狙击气步枪 +批发瑞士迷你枪 +批发甲基丙烯腈 +批发甲基可可碱 +批发甲基磺酰氯 +批发甲基苯丙胺 +批发甲麦角新碱 +批发白牙签qq +批发盐酸哌替啶 +批发盐酸曲马多 +批发盐酸氯胺酮 +批发真实身份证 +批发礼花弹qq +批发秃鹰枪qq +批发秃鹰气步枪 +批发粉末型迷药 +批发精仿弹簧刀 +批发红矾钠qq +批发罂粟粉qq +批发美沙酮qq +批发肩迷药qq +批发苍蝇水qq +批发苍蝇粉qq +批发蒙汗药qq +批发蝴蝶刀qq +批发警用电击棍 +批发赌博粉qq +批发赌博药qq +批发赭曲毒素a +批发赵氏弩qq +批发迷幻水qq +批发迷幻药qq +批发迷情粉qq +批发迷情药qq +批发迷晕药qq +批发迷香药qq +批发迷魂水qq +批发迷魂烟qq +批发迷魂粉qq +批发迷魂药qq +批发迷魂香qq +批发酣乐欣qq +批发野战刀qq +批发钢珠左轮狗 +批发钻石冰qq +批发锡锋牌汽枪 +批发长治筋qq +批发防暴枪qq +批发阻击弩qq +批发高仿真假币 +批发高仿身份证 +批发高压仿真枪 +批发高压打鸟枪 +批发高压气步枪 +批发高压电警棍 +批发鹰飞凌军刀 +批发麦角酸qq +批发麦角醇qq +批发麻果猪肉冰 +批发麻黄碱qq +批发麻黄素qq +批发麻黄素电话 +批发黄牙签qq +批发黑火药qq +批量出售银行卡 +找专业杀手qq +找个长期性关系 +找兼职学生服务 +找女奴上门服务 +找女奴上门调教 +找妹子上门服务 +找小妹上门包夜 +找小姐上门qq +找小姐全套包夜 +找小姐全套服务 +找小姐包夜信息 +找小姐包夜服务 +找小姐性息大全 +找小姐援交qq +找小姐援交上门 +找小姐特殊服务 +找少妇全套服务 +找美女上门包夜 +找职业杀手qq +把我当作了苹果 +把我的穴插烂了 +折刀砍刀军品网 +抚弄后插入小穴 +抽插好刺激好粗 +抽插磨蹭穴b逼 +拉出小姐干1干 +拍肩听话粉专卖 +拍肩听话粉买卖 +拍肩粉专卖qq +拍肩粉供应qq +拍肩粉提供qq +拍肩粉货到付款 +拍肩粉送货上门 +招聘兼职发帖员 +按摩女上门服务 +挥发型迷药供应 +挥发型迷药出售 +挥发型迷药提供 +挥发型迷药订购 +挥发型迷药销售 +捅入她的阴道里 +捅入妹妹的阴道 +捅进了她的阴道 +捅进她的阴道里 +换妻美文txt +捣蛋的教育部长 +提供1夜情服务 +提供3唑仑qq +提供3箭牌汽枪 +提供56式军刺 +提供64式手枪 +提供64手木仓 +提供77b手枪 +提供77式手枪 +提供92式手枪 +提供av电视棒 +提供awp配件 +提供cfx气枪 +提供fing霸 +提供high粉 +提供high药 +提供king粉 +提供pcp新贵 +提供pcp汽枪 +提供pcp配件 +提供pcz山猪 +提供x卧底软件 +提供万能开锁器 +提供丛林刀qq +提供中握b50 +提供中握pcp +提供乖乖水qq +提供乖乖水配方 +提供乖乖药qq +提供仿真来复枪 +提供仿真枪qq +提供仿真枪配件 +提供仿真金属枪 +提供伯莱塔猎枪 +提供假文凭qq +提供假硬币qq +提供假证件qq +提供催情口香糖 +提供催情液qq +提供催情粉qq +提供催情药qq +提供军官证qq +提供军官证样本 +提供军用54式 +提供军用77式 +提供军用枪qq +提供军警服qq +提供剁饼子服务 +提供半成品冰毒 +提供去氧麻黄素 +提供双管平式枪 +提供古柯叶qq +提供可卡因qq +提供可待因qq +提供台湾版假币 +提供台湾版假钞 +提供听话药qq +提供大冰砖qq +提供失忆水qq +提供失忆粉qq +提供失忆药qq +提供安乐死毒药 +提供安乐死药物 +提供小冰砖qq +提供小口径步枪 +提供少女迷情粉 +提供尼泊尔军刀 +提供峨眉牌汽枪 +提供工字气木仓 +提供工字牌气枪 +提供工字牌汽枪 +提供左轮钢珠狗 +提供开他敏qq +提供开山刀qq +提供弹簧刀qq +提供性服务qq +提供成人电视棒 +提供打鸟枪qq +提供挥发型迷药 +提供援交女qq +提供摇头丸qq +提供摇头丸配方 +提供改装发令枪 +提供改装射钉枪 +提供散弹枪qq +提供正品军套枪 +提供气动狗qq +提供气动钢珠枪 +提供气动铅弹枪 +提供气手枪qq +提供气狗专卖店 +提供汽动钢珠枪 +提供汽步枪qq +提供汽油燃烧瓶 +提供沙菲片qq +提供海洛因qq +提供火药钢珠枪 +提供狙击气步枪 +提供猎枪麻醉枪 +提供甲基苯丙胺 +提供甲基麻黄素 +提供白牙签qq +提供盐酸哌替啶 +提供盐酸氯胺酮 +提供盐酸羟亚胺 +提供盐酸麻黄碱 +提供盐酸麻黄素 +提供礼花弹qq +提供秃鹰枪qq +提供精品蝴蝶刀 +提供线上百家乐 +提供美沙酮qq +提供致癌药qq +提供苍蝇水qq +提供苍蝇粉qq +提供英语等级证 +提供蒙汗药qq +提供蒙汗药配方 +提供虎头牌猎枪 +提供蜘蛛刀qq +提供蝴蝶刀qq +提供赌博粉qq +提供赌博药qq +提供迷奸粉qq +提供迷幻水qq +提供迷幻药qq +提供迷情水qq +提供迷情粉qq +提供迷情药qq +提供迷香药qq +提供迷魂水qq +提供迷魂烟qq +提供迷魂粉qq +提供迷魂药qq +提供迷魂香qq +提供酣乐欣qq +提供野战刀qq +提供针孔作弊器 +提供钢珠左轮狗 +提供钢珠枪qq +提供钢管枪qq +提供钻石冰qq +提供铅弹气动枪 +提供锡锋牌汽枪 +提供长治筋qq +提供阻击弩qq +提供雷鸣登猎枪 +提供高仿学位证 +提供高仿户口本 +提供高仿毕业证 +提供高仿真假币 +提供高仿警察证 +提供高仿身份证 +提供高压打鸟枪 +提供高压气步枪 +提供麦角酸qq +提供麻醉枪qq +提供麻黄碱qq +提供黄牙签qq +提供黑火药qq +提供黑火药配方 +提取麻黄碱方法 +提炼罂粟花方法 +提高自己的口技 +插入小姐的嫩穴 +插入小姨的子宫 +插入阴道里抽插 +插女人小穴视频 +插女教师的屁眼 +插我用力插好爽 +插的妈妈好舒服 +插的妹妹好爽啊 +插的妹妹流淫水 +插进鲜嫩的小穴 +援交女上门qq +援交女上门信息 +援交女上门服务 +援交女上门爱爱 +援交女信息qq +援交女全套服务 +援交女包夜qq +援交女包夜电话 +援交女服务qq +援交女服务信息 +援交女联系qq +援交女联系电话 +援交妹上门qq +援交妹上门包夜 +援交妹上门电话 +援交妹全套上门 +援交妹全套服务 +援交妹包夜信息 +援交妹包夜电话 +援交妹服务qq +援交妹服务信息 +援交妹服务电话 +援交学生妹qq +援交学生妹上门 +援交学生妹打炮 +援交学生妹服务 +援交学生妹电话 +援交性服务qq +援交美女性服务 +援交鸡婆qq号 +搔妹妹色站大全 +摇其夫语猥亵事 +摇头丸专供qq +摇头丸专卖qq +摇头丸买卖qq +摇头丸供应qq +摇头丸出售qq +摇头丸批发qq +摇头丸提供qq +摇头丸直销qq +摇头丸订购qq +摇头丸购买qq +摇头丸送货上门 +摇头丸配方供应 +摇头丸配方出售 +摇头丸配方批发 +摇头丸配方销售 +摇头丸销售qq +摇头糖送货上门 +摇头糖销售qq +摩洛客成人网址 +摸摸你的小馒头 +撸撸射影院qq +操meimei +操meinv穴 +操完姐妹操嫂嫂 +操小姨子穴真爽 +操操你8辈祖宗 +操日风骚少妇穴 +操破苍穹txt +收售麻黄素qq +收获人妻的小贼 +收费裸聊室qq +改装ffx气枪 +改装发令枪qq +改装发令枪专卖 +改装发令枪图纸 +改装射钉枪qq +改装射钉枪专卖 +放荡中的灵与肉 +政府也能设赌局 +政府签单给废了 +政治人祸的源头 +教会是被政府查 +教你制作原子弹 +教室里淫乱狂搞 +数见红尘应识我 +新义安枪械专卖 +新天下情色论坛 +新庄爱bt下载 +新康泰克造冰毒 +新式电警棍出售 +新时代娱乐城网 +新葡京娱乐在线 +新衙只对百姓狂 +新金瓶梅成人片 +无声爆破剂配方 +无政府主义食谱 +无码h动漫下载 +无码国产片下载 +无良少妇综合网 +无锡锡锋牌汽枪 +日军对中国媎女 +日好色女成人网 +日本av成人片 +日本av激情片 +日本av片下载 +日本a片电影网 +日本h漫画下载 +日本东京热下载 +日本女优大集合 +日本女学生图片 +日本情色淫电影 +日本成人片网址 +日本武士刀批发 +日本淫色动画片 +日本淫色贴图区 +日本激情淫影院 +日本激情淫电影 +日本激情淫穴片 +日本激情淫骚穴 +日本激情片小说 +日本激情片电影 +日本激情片论坛 +日本美女吃精图 +日本风骚女电影 +日本黄片大合集 +日本黄片电影网 +日本黄色小电影 +日韩无码下载区 +日韩无码原创区 +日韩有码原创区 +日韩淫乱美女图 +早乙女露依bt +早乙女露依全集 +早乙女露依无码 +早乙女露依电驴 +早川瀬里奈无码 +昆明3夫妻艳照 +明升娱乐城赌博 +明娟以车震生活 +昏迷药供应qq +昏迷药批发qq +易发国际娱乐城 +星光伴我淫下载 +星野光无码下载 +星野明bt下载 +春日部马里种子 +春色av激情片 +昧着良心的中国 +暴操淫荡小妹妹 +曲马多出售qq +曲马多批发qq +曲马多订购qq +月泊西眉txt +有假币假钞出售 +有偿捐献肾器官 +有偿提供肾器官 +有偿收养女宝宝 +有偿领养女宝宝 +有偿领养男宝宝 +有军用枪支出售 +有冰毒麻古买q +有卖慢性毒药q +有吉奈生子种子 +有木有打1炮的 +朝鲜版假钞买卖 +本城小百合无码 +本田亚里沙种子 +朱闲基答记者问 +机关干部4大傻 +李一平中共新疆 +李宗瑞3p淫照 +李宗瑞bt种子 +李宗瑞不雅图片 +李宗瑞全套种子 +李宗瑞性爱视频 +李宗瑞淫照种子 +李宗瑞照片种子 +李宗瑞种子全套 +李宗瑞迷奸下载 +李宗瑞迷奸全集 +李宗瑞迷奸视频 +李宗瑞迷奸种子 +村奴全本txt +杜冷丁专卖qq +杜冷丁出售qq +杜冷丁提供qq +杜冷丁直销qq +杜冷丁购买qq +杜冷丁销售qq +极品成人3gp +极品美女在身边 +极品调教txt +极品骚妇1夜情 +极度淫乱txt +极度淫荡txt +极端武力军品网 +极端武力直销网 +松岛枫av种子 +松岛枫无码下载 +松岛枫迅雷下载 +松田知由里无码 +林心如掰穴自拍 +果聊图爱约约约 +枪支0部件出售 +枪的制造结构图 +校园4p的记忆 +校花门性爱视频 +核武器制作方法 +梦想之天下女人 +植物冰出售qq +植物冰出售电话 +楠木沙耶香无码 +楠木沙耶香种子 +模特上门性服务 +横批就是不会射 +樱井沙也加种子 +樱井沙加也无码 +橘色情果txt +欢乐城国际博彩 +欧美av片下载 +欧美成人小电影 +欧美成人帖图区 +欧美成人电影网 +欧美成人贴图区 +欧美成年色情片 +欧美激情淫影院 +欧美激情淫电影 +欧美激情穴淫奸 +欧美色情电影网 +歌女也把将星扛 +正品军刀销售网 +正品蝴蝶刀供应 +正宗ghb原液 +武腾兰无码下载 +武藤兰电影全集 +母子乱伦之淫穴 +毕业证出售qq +毛伟人奇在哪里 +毛回族人吃猪肉 +毛国家主要部委 +毛天安门录像带 +毛生孩子没屁眼 +气动狗供应qq +气动狗出售qq +气动狗批发qq +气动狗提供qq +气动狗订购qq +气动狗购买qq +气动狗销售qq +气动钢珠枪买卖 +气动钢珠枪批发 +气动钢珠枪提供 +气动钢珠枪直销 +气动钢珠枪订购 +气动钢珠枪购买 +气动铅弹枪qq +气动铅弹枪专卖 +气动铅弹枪销售 +气手枪专卖qq +气手枪批发qq +气手枪购买qq +气手枪销售qq +气木仓专卖qq +气枪bb弹出售 +气枪专卖店qq +气枪仿真枪出售 +气枪出售专卖网 +气枪子弹专卖店 +气枪弹模具出售 +气枪消声器出售 +气枪猎枪钢珠枪 +气枪猎枪麻醉枪 +气枪看货加QQ +气枪钢珠枪专卖 +气步枪供应qq +气步枪出售qq +气步枪批发qq +气步枪提供qq +气步枪直销qq +气步枪订购qq +气步枪转让qq +气步枪销售qq +氯化钾专卖qq +氯氨酮出售qq +氯氨酮销售qq +氯甲酸乙酯供应 +氯甲酸乙酯批发 +氯甲酸乙酯直销 +氯甲酸乙酯销售 +氯甲酸甲酯供应 +氯甲酸甲酯批发 +氯甲酸甲酯直销 +氯甲酸甲酯销售 +氯胺酮买卖qq +氯胺酮付款qq +氯胺酮供应qq +氯胺酮出售qq +氯胺酮原料qq +氯胺酮批发qq +氯胺酮提供qq +氯胺酮直销qq +氯胺酮订购qq +氯胺酮购买qq +氯胺酮送货上门 +氯胺酮配方qq +氯胺酮配方出售 +氯胺酮销售qq +氰化钠专卖qq +氰化钾出售qq +水中色成人影院 +水从穴里流出来 +水嶋彩迅雷下载 +永利高现金投注 +永发国际娱乐城 +汕头学生妹服务 +江湖淫娘txt +池乃内路里无码 +汽gou专卖网 +汽动钢珠枪供应 +汽动钢珠枪直销 +汽动钢珠枪订购 +汽动钢珠枪销售 +汽手枪批发qq +汽手枪提供qq +汽木仓供应qq +汽步枪买卖qq +汽步枪供应qq +汽步枪出售qq +汽步枪批发qq +汽步枪提供qq +汽步枪直销qq +汽步枪订购qq +汽步枪转让qq +汽步枪销售qq +汽短狗出售qq +汽车屏蔽器供应 +汽车拦截器供应 +汽车拦截解码器 +汽车解码器qq +汽车解码器供应 +汽车解码器提供 +汽车解码器直销 +汽长狗专卖qq +汽长狗供应qq +汽长狗出售qq +沙菲片供应qq +沙菲片出售qq +沙菲片提供qq +沧州办假身份证 +法官黄松有被抓 +波多野结衣下载 +波多野结衣无码 +波多野结衣视频 +波多野结衣种子 +注册免费淫电影 +注册美女捰聊网 +洋妞上宾馆陪服 +洋妞上门性服务 +浴室干骚女系列 +浴火情潮txt +海乐神专卖qq +海乐神专卖电话 +海乐神供应qq +海乐神出售qq +海乐神批发qq +海乐神订购qq +海云武士刀专卖 +海军突击刀专卖 +海洛因专卖qq +海洛因供应qq +海洛因出售qq +海洛因制作教程 +海洛因制造教程 +海洛因制造方法 +海洛因批发qq +海洛因提供qq +海洛因猪肉供应 +海洛因猪肉出售 +海洛因送货上门 +海洛因销售qq +海洛因麻古出售 +海盗的悠闲生活 +涂山国际娱乐城 +消旋麻黄素销售 +涩女日记txt +液体炸弹的制作 +液体炸药的配方 +液体炸药配方法 +液体迷幻药qq +淫3国梦想全集 +淫meimei +淫乱大家庭下载 +淫乱小姨子小说 +淫乱换妻txt +淫人堂最新地址 +淫兽调教txt +淫医师娘txt +淫叫好舒服用力 +淫女与猪乱搞图 +淫女在线看电影 +淫女床上的自慰 +淫奸meinv +淫奸处女穴电影 +淫奸处女穴论坛 +淫奸女护士电影 +淫奸小姨子电影 +淫奸小姨子论坛 +淫奸小姨淫水流 +淫奸护士姐姐穴 +淫奸护士穴论坛 +淫奸熟睡小姨子 +淫奸熟睡的妈妈 +淫妹妹成人娱乐 +淫妹妹电影论坛 +淫星档案txt +淫术炼金士下载 +淫欲江湖txt +淫水从穴门流出 +淫水你的大肉棒 +淫水淋湿的阴毛 +淫汁飞散大乱交 +淫电影下载论坛 +淫电影艳情电影 +淫男乱女txt +淫色贴图365 +淫色阁成人电影 +淫色阁成人网站 +淫花宫色女中心 +淫荡大鸡巴嫩穴 +淫荡妈妈骚姊姊 +淫荡妖艳女医生 +淫荡少妇之张敏 +淫荡少妇之美红 +淫荡少妇极品穴 +淫荡少妇被轮奸 +淫荡的大奶女孩 +淫荡的少妇下载 +淫逼嫩穴清晰图 +淫龙出世txt +深井蓝bt下载 +清纯学生妹兼职 +清纯学生妹援交 +渡濑晶种子下载 +温州娱乐网黄站 +温州鹿城成人网 +港台1线av男 +港台经典3级片 +港女寃历乲不低 +游锡堃可以信赖 +湿淋淋的骚阴道 +溜冰妹联系qq +溴化铯供应qq +澳门新世纪娱乐 +澳门赌钱博彩网 +澳门金沙娱乐场 +澳门金沙娱乐城 +激情3级片试看 +激情bt亚洲区 +激情xxx电影 +激情人体18禁 +激情妹妹聊天室 +激情成人聊天室 +激情成人色播网 +激情成人裸聊网 +激情淫穴小少妇 +激情淫穴的嫂嫂 +激情淫色mp3 +激情淫色动画片 +激情淫色贴图区 +激情淫色贴图网 +激情玩淫穴电影 +激情视频在线看 +激情视频聊天室 +激情美女小电影 +激情美女裸聊室 +激情聊天室qq +激情聊天室密码 +激情自拍小电影 +激情裸体聊天室 +激情裸女聊天室 +激情裸聊聊天室 +激情裸聊集会所 +激情陪聊女qq +濑户沙里奈无码 +火影之美女如云 +火药diy教程 +火药枪专卖qq +火药枪供应qq +火药枪出售qq +火药枪批发qq +火药枪直销qq +火药枪订购qq +火药枪销售qq +火药的制作方法 +火辣辣免费爽片 +灭门惨案之孽杀 +灯草和尚txt +炸药diy教程 +炸药制作的方法 +炸药的制作配方 +炸药配方与制作 +烟雾弹制作方法 +熟女日记txt +熟美妇淫交实录 +燃烧弹制作工艺 +燃烧弹制作方法 +燃烧弹制作流程 +燃烧弹制作配方 +燃烧弹制造方法 +燃烧弹的制作方 +燃烧弹的制作方 +燃烧瓶制作手册 +燃烧瓶制作教程 +燃烧瓶制作配方 +爆破剂供应qq +爆破剂配制方法 +爱不过两腿而已 +爱啪啪ooxx +爱我你就草草我 +爱抚淫女的阴户 +爱搞逼综合x网 +爱爱很爽很销魂 +爱约啪的小迷弟 +牙齿轻咬着阴核 +牢头牢霸打死你 +特码6合彩qq +特警作战服专卖 +特警作战服供应 +特警作战服批发 +特警作战服直销 +特警作战服销售 +特警作战服预订 +狂插妹妹的小穴 +狂插我的小嫩穴 +狂插日本学生妹 +狂插淫荡女护士 +狂操丰满小姨穴 +狂操插干老板娘 +狂操操小小姨穴 +狂操穴喷出阴精 +狙击枪订购qq +狙击枪销售qq +狙击气步枪专卖 +狙击气步枪供应 +狙击气步枪出售 +狙击气步枪批发 +狙击气步枪提供 +狙击气步枪直销 +狙击气步枪订购 +狙击气步枪购买 +狙击气步枪转让 +狙击气步枪销售 +狠狠撸在线影院 +狡猾的风水相师 +狩猎刀供应qq +狩猎刀批发qq +狩猎刀直销qq +狩猎刀销售qq +狩猎弓弩专卖网 +狩猎弓弩麻醉箭 +狩猎弩专卖qq +狩猎弩出售qq +狼友阁成人论坛 +猎木仓专卖qq +猎枪仿真枪QQ +猎枪子弹专卖网 +猎枪麻醉枪出售 +猎豹弓弩专卖网 +猎豹弩专卖qq +猛插小护士骚穴 +猛插林心如小穴 +猪肉钻石冰出售 +玉女偷情txt +玉蒲团玉女心经 +玉蒲团讯雷下载 +王子淫传txt +王民生不雅视频 +王民生艳照下载 +环球国际娱乐城 +现役看护妇下载 +现金6合彩qq +现金百家乐qq +玻璃bb弹出售 +玻璃bb弹批发 +玻璃bb弹销售 +生人勿近之邪花 +生征女兵的经历 +用你粗大的肉棒 +用力干嫩穴紧插 +甲基丙烯腈供应 +甲基丙烯腈批发 +甲基丙烯腈提供 +甲基丙烯腈直销 +甲基丙烯腈销售 +甲基磺酰氯供应 +甲基磺酰氯批发 +甲基磺酰氯提供 +甲基磺酰氯直销 +甲基磺酰氯销售 +甲基肼供应qq +甲基苯丙胺价格 +甲基苯丙胺供应 +甲基苯丙胺制作 +甲基苯丙胺化学 +甲基苯丙胺合成 +甲基苯丙胺批发 +甲基苯丙胺结构 +甲基苯丙胺销售 +甲基麻黄素出售 +甲基麻黄素销售 +电信我们是亏损 +电击枪供应qq +电子狗导航手机 +电影免费试看片 +电警棍专卖电话 +电话出售假硬币 +男人最爱的淫图 +男公关上门服务 +男公关包养qq +男士养生来找我 +男女激情淫贴图 +男奴找女王信息 +男按摩师txt +男欢女爱色情版 +男鸭子上门服务 +疯狂的抽插起来 +痴情女子绝情汉 +痴情女子负心汉 +痴美女医生松岛 +癫马女郎1夜情 +白牙签专卖qq +白牙签供应qq +白牙签批发qq +白牙签提供qq +白牙签溜冰qq +白牙签销售qq +白石瞳无码下载 +白领上门性服务 +百乐门线上娱乐 +百姓怕的医疗费 +百家乐免费试玩 +百家乐在线代理 +百家乐在线平台 +百家乐真人平台 +百家乐真人游戏 +百家乐真人骰宝 +百家乐真钱骰宝 +百家乐网上娱乐 +百家乐网上开户 +百家乐网络平台 +百家性大型色站 +百家性大型黄站 +百胜百旺娱乐城 +皇冠最新投注网 +皇冠国际娱乐城 +皇冠在线投注网 +皇冠备用投注网 +皇冠官方投注网 +皇冠赌博下注网 +皇冠赌球俱乐部 +皇冠赌球娱乐城 +皇冠足球投注网 +皇城国际娱乐城 +皇室国际娱乐城 +皇家足球投注网 +盈丰博彩娱乐城 +盐酸2乙酰吗啡 +盐酸2乙醯吗啡 +盐酸哌替啶批发 +盐酸哌替啶提供 +盐酸哌替啶直销 +盐酸哌替啶订购 +盐酸哌替啶购买 +盐酸哌替啶销售 +盐酸曲马多出售 +盐酸曲马多提供 +盐酸曲马多订购 +盐酸曲马多购买 +盐酸曲马多销售 +盐酸氯胺酮供应 +盐酸氯胺酮出售 +盐酸氯胺酮批发 +盐酸氯胺酮提供 +盐酸氯胺酮直销 +盐酸氯胺酮销售 +盐酸羟亚胺qq +盐酸羟亚胺专卖 +盐酸羟亚胺专销 +盐酸羟亚胺供应 +盐酸羟亚胺出售 +盐酸羟亚胺出货 +盐酸羟亚胺到货 +盐酸羟亚胺合成 +盐酸羟亚胺批发 +盐酸羟亚胺电话 +盐酸羟亚胺订购 +盐酸羟亚胺配方 +盐酸羟亚胺销售 +盐酸麻黄素出售 +盐酸麻黄素销售 +监听器软件下载 +直刀匕首直销网 +直销1元假硬币 +直销3唑仑qq +直销3箭牌气枪 +直销3箭牌汽枪 +直销3角牌气枪 +直销3角牌汽枪 +直销54式手枪 +直销5连发手枪 +直销64式手枪 +直销64手木仓 +直销77式手枪 +直销7连发手枪 +直销92式手枪 +直销av电视棒 +直销awp配件 +直销ghb原液 +直销king粉 +直销pcp汽枪 +直销pcp配件 +直销万能开锁器 +直销丛林刀qq +直销中握b50 +直销中握pcp +直销乖乖水qq +直销乖乖药qq +直销亚硝酸乙酯 +直销仿真枪qq +直销仿真枪配件 +直销仿真狙击抢 +直销仿真狙击枪 +直销仿真金属枪 +直销催情液qq +直销军用毛瑟枪 +直销勃朗宁军刀 +直销半自动猎枪 +直销古柯碱qq +直销可卡因qq +直销可待因qq +直销台湾版假币 +直销台湾版假钞 +直销台湾版假钱 +直销听话水qq +直销听话药qq +直销喵喵药qq +直销失忆水qq +直销失忆粉qq +直销安纳咖qq +直销小冰砖qq +直销尼泊尔军刀 +直销峨眉牌汽枪 +直销工字牌汽枪 +直销左旋麻黄素 +直销开他敏qq +直销开山刀qq +直销成人电视棒 +直销手机变号器 +直销挥发型迷药 +直销摇头丸qq +直销朝鲜冰qq +直销气动狗qq +直销气动钢珠枪 +直销氯甲酸乙酯 +直销氯甲酸甲酯 +直销氯胺酮qq +直销汽动钢珠枪 +直销汽步枪qq +直销汽车解码器 +直销沙菲片qq +直销海乐神qq +直销海洛因qq +直销液态冰qq +直销特警作战服 +直销狙击气步枪 +直销玻璃bb弹 +直销甲基丙烯腈 +直销甲基磺酰氯 +直销甲基苯丙胺 +直销白牙签qq +直销盐酸哌替啶 +直销秃鹰气步枪 +直销网络电视棒 +直销美沙酮qq +直销考试作弊器 +直销肩迷药qq +直销苍蝇水qq +直销蒙汗药qq +直销虎头牌猎枪 +直销赌博粉qq +直销赌博药qq +直销赭曲毒素a +直销迷幻水qq +直销迷幻药qq +直销迷情粉qq +直销迷情药qq +直销迷晕药qq +直销迷香药qq +直销迷魂水qq +直销迷魂烟qq +直销迷魂粉qq +直销迷魂药qq +直销迷魂香qq +直销酣乐欣qq +直销钢珠左轮狗 +直销钻石冰qq +直销锡锋牌汽枪 +直销长治筋qq +直销阻击弩qq +直销骚本pcp +直销高仿人民币 +直销高仿真假币 +直销高仿身份证 +直销高压仿真枪 +直销高压打鸟枪 +直销高压气步枪 +直销高压电警棍 +直销麦角酸qq +直销麻黄碱qq +直销麻黄素qq +直销黄牙签qq +相田桃无码下载 +真人21点网站 +真人在线百家乐 +真人在线裸聊网 +真人娱乐城qq +真人娱乐老虎机 +真人游戏百家乐 +真人现金21点 +真人百家乐博彩 +真人百家乐赌博 +真人视频裸聊网 +真人网上娱乐城 +真人荷官龙虎斗 +真人裸聊网qq +真人裸聊聊天室 +真人赌博百家乐 +真实银行卡批发 +真钱6合彩投注 +真钱博彩娱乐城 +真钱斗地主qq +真钱斗地主平台 +真钱游戏百家乐 +真钱现金斗地主 +真钱百家乐下注 +真钱百家乐在线 +真钱百家乐游戏 +真钱百家乐赌博 +真钱百家乐赌球 +真钱老虎机游戏 +真钱赌博机游戏 +眯眯爱大型黄站 +矢吹小百合无码 +知譺分子刘晓波 +硝化甘油的配方 +硝酸胺炸药出售 +硝酸钾出售qq +硝铵炸药的配方 +碘甲烷供应qq +磨丁黄金城赌场 +磷化锌供应qq +礼花弹qq出售 +礼花弹批发qq +礼花弹提供qq +礼花弹直销qq +视讯情人聊天室 +视频裸体秀qq +视频裸体聊天网 +视频裸聊女qq +视频裸聊聊天室 +视频陪聊女qq +神州电影制片厂 +神话诠释的社会 +神谷姬无码下载 +神雕艳情txt +禁区女领导大院 +禁爱诱惑txt +禽兽集团少儿禁 +私售单管猎l枪 +私售秃鹰制造图 +秃鹰pcp专卖 +秃鹰pcp供应 +秃鹰pcp出售 +秃鹰pcp批发 +秃鹰pcp提供 +秃鹰pcp直销 +秃鹰pcp订购 +秃鹰pcp购买 +秃鹰pcp转让 +秃鹰pcp销售 +秃鹰枪专卖qq +秃鹰枪批发qq +秃鹰枪提供qq +秃鹰枪直销qq +秃鹰气步枪qq +秃鹰气步枪供应 +秃鹰气步枪出售 +秃鹰气步枪批发 +秃鹰气步枪提供 +秃鹰气步枪直销 +秃鹰气步枪订购 +秃鹰气步枪购买 +秃鹰汽枪货到付 +秋野诗央里无码 +秘书自慰被偷拍 +秘密熟母俱乐部 +秦氏弩买卖qq +秦氏弩提供qq +秦氏弩购买qq +秦青的幸福生活 +穴居人淫色贴图 +穿越倚天建后宫 +立式双管枪销售 +立式双管猎出售 +童颜巨乳苍井空 +笔仙原来是小受 +第7色明星淫欲 +简易催泪弹制作 +简易大威力炸弹 +简易汽油弹制作 +简易炸弹的制作 +简易炸弹的配方 +简易炸药包制作 +简易炸药的制作 +篮球现金投注网 +粉嫩粉嫩的小穴 +粉臀红痕txt +粗大的鸡巴穴洞 +粗硬大龟头狂插 +精品刀具批发网 +精子是什么味道 +精液中出avi +索多玛120天 +紫彩乃迅雷下载 +红楼绮梦txt +红灯区小妹服务 +红矾钠供应qq +红矾钠批发qq +红肿的小穴摩弄 +红降汞供应qq +红降汞批发qq +红降汞提供qq +红鞋日记之禁区 +约炮加妹妹微信 +约炮成人聊天室 +纳粹军妓血泪史 +纵欲返古txt +线上kk娱乐城 +线上真人百家乐 +线上真钱扎金花 +线上真钱赌博网 +组装64枪qq +细川百合子种子 +经典无码国产片 +经插进我的穴了 +经济以毁灭教育 +绫乃梓bt下载 +维族与汉族冲突 +缠绵至死txt +罂粟粉供应qq +罂粟粉批发qq +罐装性奴txt +网上代办高仿证 +网上出售仿真狗 +网上办假证qq +网上办高仿文凭 +网上在线老虎机 +网上在线赌博机 +网上投注6合彩 +网上激情找美女 +网上现金博彩网 +网上现金百家乐 +网上百家乐平台 +网上真人娱乐场 +网上真人百家乐 +网上真钱娱乐场 +网上真钱娱乐城 +网上真钱炸金花 +网上真钱老虎机 +网上赌钱娱乐城 +网络6合彩出售 +网络6合彩投注 +网络专卖74式 +网络专销85式 +网络专销售手枪 +网络专销麻黄素 +网络出售银行卡 +网络现金6合彩 +网络电视棒直销 +网络真钱百家乐 +网络老虎机qq +网络赌博机qq +网络销售麻黄素 +罚得刁民见阎王 +美国秃鹰制造图 +美女1对1裸聊 +美女msn裸聊 +美女上门性服务 +美女主持赖上我 +美女主播裸聊室 +美女大学生兼职 +美女大秀钢管舞 +美女妖怪别吃我 +美女帮你打飞机 +美女性感图下载 +美女性生活贴图 +美女找富商包养 +美女淫色贴图区 +美女激情视频网 +美女激情裸聊天 +美女激情裸聊室 +美女视频聊天室 +美女视频裸聊室 +美女脱衣舞视频 +美女裸体聊天室 +美女裸聊视频室 +美女裸聊聊天室 +美少妇上门服务 +美沙酮供应qq +美沙酮出售qq +美沙酮批发qq +美沙酮提供qq +美沙酮直销qq +美沙酮订购qq +美沙酮销售qq +美穴张开贴图区 +美艳人妻txt +羟亚胺出售qq +羟亚胺批发qq +羟亚胺订购qq +羰基镍供应qq +羽鸟沙耶香无码 +耀邦保护免获咎 +老司机直播软件 +老婆陪我换配偶 +老师干的我好爽 +老师的阴道好紧 +老虎机博彩平台 +耐特野战刀专卖 +肉体的快感鹿葱 +肉棒与阴道摩擦 +肉棒乱插好舒服 +肉棒小穴里抽送 +肉棒抽出她嘴中 +肉棒捅入阴道里 +肉棒捅进阴户里 +肉棒插入大肉穴 +肉棒插入小穴里 +肉棒插入阴户内 +肉棒插入阴道里 +肉棒插在阴道里 +肉棒插嫩穴淫穴 +肉棒插得太深了 +肉棒插得我好爽 +肉棒插得湿润了 +肉棒插死浪穴了 +肉棒插进子宫了 +肉棒插进来肉穴 +肉棒插进肉洞里 +肉棒插进阴户内 +肉棒插进阴户里 +肉棒插进阴道里 +肉棒放在阴道口 +肉棒沾满了唾液 +肉棒狂插小嫩b +肉棒狠狠插嫩穴 +肉棒的抽插好爽 +肉棒顶入小穴口 +肉穴大鸡巴骚穴 +肏又嫩又紧的穴 +肏又紧又嫩的穴 +肏妹妹的小骚屄 +肏肉x屄爽歪歪 +股改成了穷光蛋 +股民死绝都活该 +胡jintao +胡椒醛出售qq +脱氧麻黄素供应 +脱衣激情裸聊室 +脱衣裸聊女qq +膣穴大陵辱松岛 +臀部猛烈的撞击 +自制92式qq +自制c4燃烧弹 +自制tnt教程 +自制tnt方法 +自制化学燃烧弹 +自制原子弹教程 +自制手枪哪里买 +自制汽油燃烧弹 +自制汽油燃烧瓶 +自制火药的方法 +自制燃烧弹方法 +自制燃烧瓶方法 +自制起爆器方法 +自制黑火药视频 +至尊国际娱乐城 +致幻剂出售qq +舒服死大鸡巴插 +舔吮乳房干小穴 +舔屁沟我很激动 +舔舐着阴道内壁 +色mm激情图片 +色mm激情论坛 +色中色av电影 +色中色最新网址 +色中色影院导航 +色中色成人影院 +色中色成人情色 +色中色成人电影 +色中色成人视讯 +色中色电影qq +色中色网址大全 +色中色论坛地址 +色中色论坛网址 +色中色黄色图片 +色中色黄色电影 +色人阁成人影院 +色医生电影下载 +色女的无情无爱 +色妹妹大型黄站 +色妹妹高清影院 +色姐姐情人影院 +色情倚天屠龙记 +色情导航排行榜 +色情片bt种子 +色情电子书下载 +色情电影免费看 +色情网址发布器 +色狗成人快播网 +色狼窝成人影院 +色狼谷超级色站 +色猪猪成人导航 +色老汉影院导航 +色色母女闹古代 +色降ii血玫瑰 +色魔堂电影论坛 +艳尻北原多香子 +艳母恋臀txt +艳照门视频下载 +艳照门种子下载 +芳香型智悟气功 +苍井空av下载 +苍井空av种子 +苍井空bt种子 +苍井空ed2k +苍井空快播种子 +苍井空无码下载 +苍井空激情视频 +苍井空电驴下载 +苍井空视频下载 +苍井空种子下载 +苍蝇水出售qq +苍蝇水提供qq +苍蝇水直销qq +苍蝇水订购qq +苍蝇水购买qq +苍蝇水销售qq +苍蝇粉供应qq +苍蝇粉出售qq +苍蝇粉批发qq +苍蝇粉提供qq +苍蝇粉直销qq +苍蝇粉订购qq +苍蝇粉购买qq +苍蝇粉销售qq +草酸麻黄碱销售 +荡妇瑞敏txt +荡妇白洁txt +荻原沙耶香无码 +莫洛托夫燃烧弹 +莫洛托夫鸡尾酒 +菊池麻衣子种子 +菊领风骚txt +营业税发票代开 +营业税发票出售 +蒋大彬群p种子 +蒙汗药供应qq +蒙汗药批发qq +蒙汗药提供qq +蒙汗药直销qq +蒙汗药订购qq +蒙汗药购买qq +蒙汗药配方专卖 +蒙汗药配方供应 +蒙汗药配方提供 +蒙汗药销售qq +藤井小百合无码 +藤崎秋迅雷下载 +藤彩香迅雷下载 +藤本圣名子种子 +藤野沙也加无码 +藤野沙也加种子 +虎头牌双管出售 +虎头牌猎枪专卖 +虎头牌猎枪出售 +虎头牌猎枪订购 +虎头牌猎枪销售 +虎头牌猎狗专卖 +虎头猎枪制造图 +虎牙刀专卖qq +蜘蛛刀专卖qq +蜘蛛刀买卖qq +蜘蛛刀供应qq +蜘蛛刀批发qq +蜘蛛刀提供qq +蜜桃成熟时bt +蜜穴被阴茎插入 +蜜穴里轻插缓送 +蝴蝶刀qq订购 +蝴蝶刀专卖qq +蝴蝶刀供应qq +蝴蝶刀出售qq +蝴蝶刀批发qq +蝴蝶刀提供qq +蝴蝶刀订购qq +蝴蝶刀销售qq +血脉激动6合彩 +表姐含我小鸡鸡 +衰败跟文化水准 +被奸淫的女教师 +被缚的千面女王 +裸体激情秀qq +裸体陪聊天qq +裸玩1对1互动 +裸聊交友qq群 +裸聊交友俱乐部 +裸聊直播室qq +裸聊美女聊天室 +裸聊聊天室下载 +裸聊表演俱乐部 +裸舞视频聊天室 +西点军品军刀网 +西班牙气枪套件 +西班牙汽枪套件 +西藏314事件 +西藏人民大起义 +西藏国家民主党 +要激情想要刺激 +警官证供应qq +警官证供应电话 +警官证出售qq +警察作训服供应 +警察作训服批发 +警用催泪喷射器 +警用刀具军品网 +警用品供应qq +警用电棍电棒甩 +警花少妇白燕妮 +警花少妇白艳妮 +订购3唑仑qq +订购3箭牌汽枪 +订购54式手枪 +订购56式军刺 +订购64式手枪 +订购77b手枪 +订购77式手枪 +订购awp配件 +订购ghb原液 +订购king粉 +订购pcp气枪 +订购pcp汽枪 +订购pcp配件 +订购pcz山猪 +订购中握b50 +订购中握pcp +订购乖乖药qq +订购仿真气步枪 +订购仿真狙击枪 +订购仿真金属枪 +订购催情催眠药 +订购催情液qq +订购催情粉qq +订购催情药qq +订购勃朗宁军刀 +订购半自动猎枪 +订购可待因qq +订购台湾版假币 +订购台湾版假钞 +订购听话药qq +订购喵喵药qq +订购喷雾蒙汗药 +订购大黑鹰弓弩 +订购失忆水qq +订购失忆粉qq +订购小口径步枪 +订购尼泊尔军刀 +订购山奈钾qq +订购峨眉牌汽枪 +订购左轮钢珠狗 +订购开他敏qq +订购成人电视棒 +订购手拉awp +订购打鸟枪qq +订购拍肩听话粉 +订购拍肩粉qq +订购挥发型迷药 +订购摇头丸qq +订购摇头丸电话 +订购散弹枪qq +订购杜冷丁qq +订购气动狗qq +订购气动钢珠枪 +订购气步枪qq +订购汽动钢珠枪 +订购汽步枪qq +订购沙菲片qq +订购海乐神qq +订购海洛因qq +订购狙击气步枪 +订购白牙签qq +订购盐酸曲马多 +订购盐酸羟亚胺 +订购秃鹰pcp +订购秃鹰枪qq +订购秃鹰气步枪 +订购粉末型迷药 +订购美沙酮qq +订购肩迷药qq +订购苍蝇水qq +订购苍蝇粉qq +订购蒙汗药qq +订购虎头牌猎枪 +订购赌博药qq +订购迷幻水qq +订购迷幻药qq +订购迷情粉qq +订购迷情药qq +订购迷晕药qq +订购迷香药qq +订购迷魂烟qq +订购迷魂香qq +订购酣乐欣qq +订购钢珠左轮狗 +订购钻石冰qq +订购锡峰牌气枪 +订购长治筋qq +订购阻击弩qq +订购骚本pcp +订购高仿身份证 +订购高压仿真枪 +订购高压打鸟枪 +订购高压气步枪 +订购麦角酸qq +订购麻古壶qq +订购麻醉枪qq +订购麻黄碱qq +订购黄牙签qq +让你大哥爽1爽 +让你爽的时间长 +让领导同志先走 +记者无疆界组织 +诚信做假身份证 +诚信办假证qq +诱色之野性医生 +谁占了她的身体 +谁看了她的屁屁 +谁知道激情网站 +谴责中国红十字 +豪门国际娱乐城 +财神真人娱乐城 +质问衡水组织部 +贩卖king粉 +贩卖银行卡qq +购买4氢大麻酚 +购买54式手枪 +购买64式手枪 +购买7连发手枪 +购买av电视棒 +购买pcp汽枪 +购买中握pcp +购买乖乖水qq +购买乖乖药qq +购买仿真狙击枪 +购买仿真金属枪 +购买催情液qq +购买可卡因qq +购买听话水qq +购买听话药qq +购买喵喵药qq +购买失忆水qq +购买失忆粉qq +购买小口径步枪 +购买山奈钾qq +购买工字牌汽枪 +购买左轮钢珠狗 +购买开他敏qq +购买弹簧刀qq +购买拍肩粉qq +购买沙菲片qq +购买海洛因qq +购买狙击气步枪 +购买白牙签qq +购买盐酸哌替啶 +购买秃鹰pcp +购买秃鹰枪qq +购买秃鹰气步枪 +购买秦氏弩qq +购买肩迷药qq +购买苍蝇水qq +购买苍蝇粉qq +购买赌博药qq +购买迷情粉qq +购买迷晕药qq +购买迷香药qq +购买迷魂烟qq +购买迷魂香qq +购买钢珠左轮狗 +购买长治筋qq +购买高压气步枪 +购买高压电警棍 +购买麦角酸qq +贴能惊动党中央 +费劲心思去睡你 +赌博粉专卖qq +赌博粉供应qq +赌博粉出售qq +赌博粉批发qq +赌博粉提供qq +赌博粉订购qq +赌博粉购买qq +赌博粉销售qq +赌博药供应qq +赌博药出售qq +赌博药批发qq +赌博药提供qq +赌博药直销qq +赌博药订购qq +赌博药购买qq +赌博药销售qq +赭曲毒素a供应 +赵氏弓弩专卖店 +赵氏弓弩专卖网 +赵氏弩专卖qq +赵氏弩买卖qq +赵氏弩出售qq +赵氏弩批发qq +赵氏弩直销qq +赵氏弩销售qq +赵氏钢珠弩出售 +起爆药配制方法 +超强解码干扰器 +超淫荡丝袜妹妹 +超火司机txt +超爽乱伦txt +超级女警txt +超级学生txt +超级官迷txt +足球现金投注网 +身份证克隆软件 +身份证出售qq +身份证号生成器 +身份证生成工具 +身份证生成软件 +身边官员难见廉 +车模兽兽门种子 +转让3箭牌气枪 +转让54式手枪 +转让56式军刺 +转让64式手枪 +转让77式手枪 +转让7连发猎枪 +转让92式手枪 +转让pcp汽枪 +转让pcp配件 +转让丛林刀qq +转让中握b50 +转让仿54手枪 +转让仿真枪配件 +转让仿真气步枪 +转让仿真金属枪 +转让军用54式 +转让军用77式 +转让军警服qq +转让勃朗宁军刀 +转让大黑鹰弓弩 +转让尼泊尔军刀 +转让山奈钾qq +转让工字牌汽枪 +转让开山刀qq +转让弹簧刀qq +转让日本武士刀 +转让气动狗qq +转让狙击气步枪 +转让玻璃bb弹 +转让秃鹰气步枪 +转让秦氏弩qq +转让蝴蝶刀qq +转让跳刀弹簧刀 +转让野战刀qq +转让钢珠左轮狗 +转让阻击弩qq +转让雷明登猎狗 +转让高压打鸟枪 +转让高压气步枪 +轮奸超女张含韵 +轻狂1笑帝王受 +辣妹狼图肏穴图 +迅雷黄短片下载 +运动射击枪出售 +还珠格格成人版 +进口催情水出售 +进口催情水销售 +进口原装仿真枪 +进口弩批发qq +进口弩销售qq +进口气枪制造图 +进口气狗专卖店 +进口秃鹰枪专卖 +进口金属枪模卖 +进口金属枪模售 +进口麻醉枪销售 +进口麻黄素批发 +迷奸粉出售qq +迷奸药供应qq +迷奸药出售qq +迷奸药配方供应 +迷奸药配方提供 +迷奸药销售qq +迷幻水买卖qq +迷幻水供应qq +迷幻水批发qq +迷幻水提供qq +迷幻水直销qq +迷幻药供应qq +迷幻药出售qq +迷幻药批发qq +迷幻药提供qq +迷幻药直销qq +迷幻药货到付款 +迷幻药购买qq +迷幻药销售qq +迷情乖乖水供应 +迷情乖乖水批发 +迷情乖乖水提供 +迷情乖乖水直销 +迷情乖乖水订购 +迷情乖乖水购买 +迷情乖乖水销售 +迷情水交易qq +迷情水供应qq +迷情水出售qq +迷情水提供qq +迷情水销售qq +迷情粉供应qq +迷情粉出售qq +迷情粉批发qq +迷情粉提供qq +迷情粉直销qq +迷情粉订购qq +迷情粉购买qq +迷情粉销售qq +迷情药专卖qq +迷情药专售qq +迷情药云南情蛊 +迷情药供应qq +迷情药出售qq +迷情药批发qq +迷情药提供qq +迷情药直销qq +迷情药订购qq +迷情药购买qq +迷情药销售qq +迷昏药销售qq +迷晕药供应qq +迷晕药直销qq +迷晕药购买qq +迷晕药销售qq +迷欲侠女txt +迷香药专售qq +迷香药供应qq +迷香药出售qq +迷香药批发qq +迷香药提供qq +迷香药直销qq +迷香药订购qq +迷香药购买qq +迷香药销售qq +迷魂水专卖qq +迷魂水送货上门 +迷魂烟专卖qq +迷魂烟专售qq +迷魂烟出售qq +迷魂烟批发qq +迷魂烟提供qq +迷魂烟直销qq +迷魂烟订购qq +迷魂烟购买qq +迷魂烟销售qq +迷魂粉订购qq +迷魂粉送货上门 +迷魂药专卖qq +迷魂药供应qq +迷魂药出售qq +迷魂药送货上门 +迷魂药销售qq +迷魂香供应qq +迷魂香出售qq +迷魂香批发qq +迷魂香提供qq +迷魂香直销qq +迷魂香订购qq +迷魂香购买qq +迷魂香销售qq +逃亡艳旅txt +遥控信号拦截器 +邯郸办假身份证 +郭美美最新床照 +都是可以月y的 +酣乐欣专卖qq +酣乐欣供应qq +酣乐欣出售qq +酣乐欣批发qq +酣乐欣提供qq +酣乐欣直销qq +酣乐欣销售qq +醋酸铊直销qq +采购礼花弹qq +重口味灌肠吃屎 +重庆哪里找小姐 +重生之妖孽人生 +重生之母女调教 +野外操b更刺激 +野性家庭女教师 +野战刀专卖qq +野战刀买卖qq +野战刀批发qq +野战刀提供qq +野战春色txt +野营军刀专卖网 +野营刀具军品网 +野营开山刀军刺 +野营生存刀qq +金冠娱乐城官网 +金冠娱乐城网站 +金属仿真枪出售 +金属仿真枪销售 +金属手拉机销售 +金属手拉鸡出售 +金正日通电6方 +金沙足球投注网 +金牌娱乐城官网 +金狮国际赌球城 +金瓶梅在线观看 +金界国际娱乐城 +金皇国际娱乐城 +金赞博彩娱乐城 +金都国际娱乐城 +金钻国际娱乐城 +金鳞岂是池中物 +金龙国际娱乐城 +针孔摄像头出售 +钢珠左轮狗供应 +钢珠左轮狗出售 +钢珠左轮狗提供 +钢珠左轮狗直销 +钢珠左轮狗订购 +钢珠左轮狗购买 +钢珠左轮狗转让 +钢珠弓弩专卖店 +钢珠弓弩专卖网 +钢珠弩出售qq +钢珠枪买卖qq +钢珠枪供应qq +钢珠枪出售qq +钢珠枪提供qq +钢珠枪火药动力 +钢珠枪直销qq +钢珠枪转让qq +钢珠枪销售qq +钢珠狗出售qq +钢珠狗出售电话 +钻石冰出售qq +钻石冰销售qq +钻石国际娱乐城 +铁杆国际娱乐城 +铃木麻奈美种子 +铅弹气动枪qq +铅弹气枪制造图 +铵梯类炸药出售 +银行卡专卖qq +银行卡买卖qq +银行卡买卖电话 +银行卡复制设备 +销售03式步枪 +销售1元假硬币 +销售3唑仑qq +销售3棱刀qq +销售3箭牌汽枪 +销售54式图纸 +销售54式手枪 +销售56式军刺 +销售56式刺刀 +销售5连发汽枪 +销售64式手枪 +销售77b手枪 +销售92式手枪 +销售92式手狗 +销售95式步枪 +销售97式步枪 +销售av电视棒 +销售awp配件 +销售cfx气枪 +销售ffx气枪 +销售ghb原液 +销售king粉 +销售pcp新贵 +销售pcp气枪 +销售pcp汽枪 +销售pcp配件 +销售万利达弓弩 +销售丛林刀qq +销售中握b50 +销售中握pcp +销售乖乖水qq +销售乖乖药qq +销售亚硝酸乙酯 +销售仿真来复枪 +销售仿真枪配件 +销售仿真狙击枪 +销售仿真金属枪 +销售信用卡qq +销售假护照qq +销售假文凭qq +销售假硬币qq +销售假证书qq +销售假证件qq +销售假钞票qq +销售健卫小口径 +销售催情口香糖 +销售催情液qq +销售催情粉qq +销售催情药qq +销售催情速溶片 +销售兰博武士刀 +销售兽用麻醉枪 +销售军官证qq +销售军用54式 +销售军用64式 +销售军用狙击弩 +销售军用钢珠弩 +销售冰牙签qq +销售加长两用弩 +销售动物麻醉枪 +销售勃朗宁军刀 +销售北朝鲜冰毒 +销售半自动步枪 +销售去甲可待因 +销售双氢可待因 +销售双管平式枪 +销售古柯叶qq +销售可待因qq +销售各式小口枪 +销售唧筒式猎枪 +销售售用麻醉枪 +销售喵喵药qq +销售喷雾型迷药 +销售喷雾蒙汗药 +销售大冰砖电话 +销售大马革钢枪 +销售大黑鹰弓弩 +销售失忆水qq +销售失忆粉qq +销售失身水qq +销售安乐死迷药 +销售安纳咖qq +销售小冰砖qq +销售小口径手枪 +销售小口径步枪 +销售小口径猎枪 +销售少女催情粉 +销售尼泊尔军刀 +销售峨眉牌汽枪 +销售工字牌气枪 +销售工字牌汽枪 +销售工字牌汽狗 +销售左旋麻黄素 +销售左轮枪qq +销售左轮钢珠狗 +销售开他敏qq +销售开山刀qq +销售强暴药qq +销售快鹿牌气枪 +销售快鹿牌汽枪 +销售成人dvd +销售户外狩猎弩 +销售手木仓子弹 +销售手榴弹qq +销售折叠手弓弩 +销售拍肩听话粉 +销售拍肩粉qq +销售挥发型迷药 +销售挥发性迷药 +销售摇头丸qq +销售摇头丸配方 +销售改装发令枪 +销售改装射钉枪 +销售散弹枪qq +销售朝鲜冰qq +销售杜冷丁qq +销售枪支0配件 +销售气动狗qq +销售气动钢珠枪 +销售气动铅弹枪 +销售气木仓qq +销售氯甲酸乙酯 +销售氯甲酸甲酯 +销售氯胺酮qq +销售氰化物qq +销售氰化钾qq +销售汽动钢珠枪 +销售汽车解码器 +销售沙菲片qq +销售海乐神qq +销售海洛因qq +销售火药动力枪 +销售火药枪qq +销售特警作战服 +销售狙击弩qq +销售狙击气步枪 +销售狩猎器材弩 +销售狩猎弩qq +销售猎枪麻醉枪 +销售甲2氢吗啡 +销售甲基丙烯腈 +销售甲基磺酰氯 +销售甲基苯丙胺 +销售电击麻醉枪 +销售白牙签qq +销售盐酸哌替啶 +销售盐酸曲马多 +销售盐酸氯胺酮 +销售盐酸羟亚胺 +销售盐酸麻黄碱 +销售眼镜蛇弓弩 +销售礼花弹qq +销售秃鹰pcp +销售秃鹰枪qq +销售秃鹰气步枪 +销售粉末型迷药 +销售约会强暴粉 +销售美沙酮qq +销售考试作弊器 +销售耐特野战枪 +销售肩迷药qq +销售苍蝇水qq +销售苍蝇粉qq +销售虎头牌猎枪 +销售蜘蛛刀qq +销售蝴蝶刀qq +销售袖珍麻醉枪 +销售赌博粉qq +销售赌博药qq +销售赭曲毒素a +销售身份证qq +销售过机版假钞 +销售运动射击枪 +销售进口催情水 +销售进口狙击弩 +销售连发钢珠弩 +销售迷奸药qq +销售迷幻水qq +销售迷幻药qq +销售迷情乖乖水 +销售迷情水qq +销售迷情粉qq +销售迷晕药qq +销售迷香药qq +销售迷魂烟qq +销售迷魂药qq +销售迷魂香qq +销售酣乐欣qq +销售醋氢可待因 +销售野战刀qq +销售金属仿真枪 +销售金属手拉机 +销售金属手拉鸡 +销售针孔作弊器 +销售钢珠专用弩 +销售钢珠左轮狗 +销售钢珠枪qq +销售钻石冰qq +销售铅弹气动枪 +销售锡锋牌汽枪 +销售长治筋qq +销售防暴枪qq +销售防身麻醉枪 +销售阻击弩qq +销售香烟型迷药 +销售驾驶证qq +销售骚本pcp +销售高仿人民币 +销售高仿军官证 +销售高仿学位证 +销售高仿毕业证 +销售高仿真假币 +销售高仿真假钞 +销售高仿真假钱 +销售高仿真枪支 +销售高仿真枪模 +销售高仿真硬币 +销售高仿真证件 +销售高仿警官证 +销售高仿身份证 +销售高压仿真枪 +销售高压打鸟枪 +销售高压气步枪 +销售高压电警棍 +销售麦角酸qq +销售麻古壶qq +销售麻醉枪qq +销售麻黄碱电话 +销售麻黄素qq +销售黄牙签qq +锡峰牌气枪出售 +键卫小口径专卖 +长江国际娱乐城 +长治筋供应qq +长治筋出售qq +长治筋批发qq +长治筋提供qq +长治筋直销qq +长治筋订购qq +长治筋购买qq +长治筋销售qq +防卫刀具军品网 +防卫刀具直销网 +防身麻醉枪出售 +阳具插入小穴中 +阳具插入小肉穴 +阳江军品军刀网 +阳江刀具专卖网 +阳江刀具军品网 +阳江刀具批发网 +阳江刀具直销网 +阳江开山刀qq +阴茎在阴道快感 +阴茎把子宫顶烂 +阴茎把淫穴塞满 +阴茎插入肉洞里 +阴道口湿淋淋的 +阴道夹的我好紧 +阴道夹裹住阴茎 +阻击弩专卖qq +阻击弩供应qq +阻击弩出售qq +阻击弩批发qq +阻击弩提供qq +阻击弩直销qq +阻击弩订购qq +阻击弩销售qq +阿兰德龙野营刀 +阿姨的阴户好紧 +阿姨的阴道好大 +阿庆淫传修订版 +阿里布达年代记 +陪我玩时时彩的 +陪聊裸体女qq +陷阱超人哗哗曼 +雇杀手服务qq +雇职业杀手qq +雷明登猎狗转让 +雷管的制作方法 +雷鸣登猎枪出售 +雾岛奈津美无码 +霞姐夜生活女王 +青木玲迅雷下载 +青木诗央里无码 +青木诗央里种子 +青楼十2房下载 +韩正降职副市长 +音咲绚bt下载 +顶丰国际娱乐城 +顶级轮奸套图站 +顶进嫂子的花心 +顶进少妇的花心 +须藤小夜子无码 +预订77式手枪 +领导干部吃王8 +领导的小蜜我们 +颠覆,共产主义 +风尘劫小说下载 +风情万种野玫瑰 +风流艳世录下载 +风流英雄猎艳记 +风骚侍女txt +风骚小阿姨新闻 +风骚欲女爽爽网 +风骚艳妓txt +飞叶子种子qq +饭岛爱种子视频 +饭岛美夏夜种子 +饼子上门性服务 +饼子包夜性服务 +香咲绫电驴下载 +香港3唑仑专卖 +香港6合彩qq +香港6合彩资料 +香港免费淫电影 +香港情色俱乐部 +香港成人淫电影 +香港成人电影网 +香港淫穴裸体图 +香港激情淫影院 +香港激情淫电影 +香港激情淫色区 +香烟型迷药供应 +香烟型迷药批发 +香烟型迷药提供 +香烟型迷药直销 +香烟型迷药订购 +香烟型迷药购买 +香烟型迷药销售 +马来酸迷达唑仑 +马牌线上娱乐城 +驾驶证专卖qq +驾驶证出售qq +骆冰淫传txt +骚女服务哪里有 +骚妹妹成人导航 +高严 国家电力 +高价找处女qq +高价收肾源qq +高仿人民币qq +高仿人民币买卖 +高仿人民币出售 +高仿人民币批发 +高仿人民币电话 +高仿人民币直销 +高仿人民币销售 +高仿假硬币qq +高仿假硬币出售 +高仿假硬币批发 +高仿假硬币销售 +高仿学位证专卖 +高仿学位证买卖 +高仿学位证代办 +高仿学位证出售 +高仿学位证制作 +高仿学位证办理 +高仿学位证电话 +高仿学历证办理 +高仿文凭专卖网 +高仿文凭代办网 +高仿文凭制作网 +高仿文凭办理网 +高仿毕业证qq +高仿毕业证买卖 +高仿毕业证代办 +高仿毕业证出售 +高仿毕业证办理 +高仿毕业证直销 +高仿真伪钞出售 +高仿真假币专卖 +高仿真假币买卖 +高仿真假币供应 +高仿真假币批发 +高仿真假币直销 +高仿真假币销售 +高仿真假钞供应 +高仿真假钞出售 +高仿真假钞销售 +高仿真充气娃娃 +高仿真枪械专卖 +高仿真枪模供应 +高仿真枪模提供 +高仿真气枪专卖 +高仿真气枪出售 +高仿真气枪销售 +高仿真证件制作 +高仿证书办理网 +高仿证件专卖网 +高仿证件制作网 +高仿证供应qq +高仿身份证供应 +高仿身份证出售 +高仿身份证办理 +高仿身份证批发 +高仿身份证提供 +高仿身份证直销 +高仿身份证订购 +高仿身份证销售 +高仿驾驶证专卖 +高仿驾驶证代办 +高压仿真枪qq +高压仿真枪专卖 +高压打鸟枪qq +高压打鸟枪专卖 +高压气手枪出售 +高压气枪专卖店 +高压气枪专卖网 +高压气枪制造图 +高压气枪结构图 +高压气步枪专卖 +高压气步枪供应 +高压气步枪批发 +高压气步枪提供 +高压气步枪直销 +高压气步枪订购 +高压气步枪购买 +高压气步枪销售 +高压汽枪免定金 +高压电警棍专卖 +高压电警棍供应 +高压电警棍批发 +高压钢珠狗出售 +高压麻醉枪出售 +高效办理假证件 +高清成人dvd +高清晰无码内射 +高爆炸药的制作 +高级仿真枪销售 +高纯度冰毒出售 +高纯度牙签订购 +高考无线作弊器 +魅惑波多野结衣 +魔女天娇美人志 +鲁德成和喻东岳 +鸡吧刺入她肛门 +鸡吧顶住阴道口 +鸡婆上门性服务 +鸡婆包夜性服务 +鸿利国际娱乐城 +鸿博网络娱乐城 +鹰飞凌军刀专卖 +鹿城黄站百家性 +麦角胺批发qq +麦角胺提供qq +麦角酸价格qq +麦角酸批发qq +麦角酸提供qq +麦角酸提炼技术 +麦角酸送货上门 +麦角酸销售qq +麻仓优全集下载 +麻古冰出售qq +麻果海洛因出售 +麻果的制作方法 +麻生希视频下载 +麻醉弓弩专卖店 +麻醉枪买卖qq +麻醉枪猎枪军用 +麻醉枪订购qq +麻香关穗里无码 +麻黄碱专卖qq +麻黄碱买卖qq +麻黄碱供应qq +麻黄碱出售qq +麻黄碱批发qq +麻黄碱提供qq +麻黄碱提取工艺 +麻黄碱提取技巧 +麻黄碱提取方法 +麻黄碱提取流程 +麻黄碱直销qq +麻黄碱订购qq +麻黄碱销售qq +麻黄素qq出售 +麻黄素买卖qq +麻黄素交易qq +麻黄素供应qq +麻黄素出售qq +麻黄素出售电话 +麻黄素原料qq +麻黄素原料批发 +麻黄素合成方法 +麻黄素批发qq +麻黄素提供qq +麻黄素提取方法 +麻黄素送货上门 +麻黄素销售qq +黄体酮供应qq +黄牙签qq供应 +黄牙签专卖qq +黄牙签买卖qq +黄牙签价格qq +黄牙签供应qq +黄牙签出售qq +黄牙签批发qq +黄牙签提供qq +黄牙签订购qq +黄牙签销售qq +黄网色电影av +黑星女侠txt +黑木香无码下载 +黑火药供应qq +黑火药制作教程 +黑火药制作方法 +黑火药制作配方 +黑火药成分比例 +黑火药混合成分 +黑火药配制比例 +黑火药配方比例 +黑索金制作方法 +黑索金销售qq +黑鹰弩专卖qq +黑鹰弩出售qq +黑鹰弩批发qq +黑鹰弩提供qq +鼎龙国际娱乐城 +龟头在阴户抽插 +龟头插入肉洞里 +龟头插花心深处 +龟头插进了小穴 +龟头直抵子宫口 +龟头碰到子宫口 +【手枪出售】联系 +0售手机卧底软件 +14se淫色图片 +14岁幼女b嫩阴 +14色se成人站 +17厘米微粗上翘 +18av千部影片 +18dy免费观看 +18dy性爱电影 +18dy淫色贴图 +18成人免费影片 +19dy淫色贴图 +1元假币出售qq +1元假币销售qq +1元硬币供应qq +1夜情交友俱乐部 +1夜情交友聊天室 +1夜情做爱裸聊室 +1夜情的免费电影 +1夜情视讯聊天室 +1年两会又3代表 +1本道迅雷下载区 +1比1仿真枪专卖 +1直处于充血勃起 +20dy淫色贴图 +21dy淫色贴图 +22dy淫色贴图 +23dy淫色贴图 +242异酸甲苯酯 +24dy淫色贴图 +24小时上门性交 +25dy淫色贴图 +26dy淫色贴图 +27dy淫色贴图 +2手大黑鹰弩转让 +307射钉枪改装 +307射钉枪改造 +3158色站导航 +365情色网论坛 +3d性爱电影下载 +3d情色电影下载 +3d打印枪支下载 +3d打印枪支图纸 +3d色情电影下载 +3利达弓弩专卖网 +3利达弩出售qq +3唑仑片专卖qq +3唑仑片出售qq +3唑仑片订购qq +3唑仑片销售qq +3唑安定出售qq +3棱军刀qq供应 +3棱军刀专卖qq +3棱军刀买卖qq +3棱军刀供应qq +3棱军刀批发qq +3棱军刀提供qq +3棱军刺专卖qq +3棱军刺买卖qq +3棱军刺供应qq +3棱军刺出售qq +3棱军刺批发qq +3棱军刺直销qq +3棱军刺销售qq +3棱刀具专卖qq +3棱刀具买卖qq +3棱刀具供应qq +3棱刀具出售qq +3棱刀具批发qq +3棱刀具提供qq +3棱刀具销售qq +3棱刮刀买卖qq +3棱刮刀供应qq +3棱刮刀出售qq +3棱刮刀提供qq +3棱刮刀销售qq +3棱刺刀专卖qq +3棱尖刀专卖qq +3棱尖刀供应qq +3棱尖刀出售qq +3棱尖刀出售电话 +3棱尖刀批发qq +3棱尖刀提供qq +3棱尖刀直销qq +3棱尖刀转让qq +3棱尖刀销售qq +3步倒麻醉箭专卖 +3箭气枪供应qq +3箭气狗专卖qq +3箭气狗提供qq +3箭汽枪直销qq +3陪小姐包夜电话 +3陪小姐联系电话 +45mm狗粮qq +45mm狗粮专卖 +45mm狗粮出售 +45mm狗粮出货 +45mm狗粮到货 +45mm狗粮制造 +45mm狗粮售出 +45mm狗粮图纸 +45mm狗粮现货 +45mm狗粮电话 +45mm狗粮订购 +45mm狗粮连锁 +45mm狗粮预订 +45mm铅弹出售 +4号冰毒出售qq +4号白粉销售qq +4号白粉销售电话 +4季彩香迅雷下载 +54式64式手枪 +54式64式电话 +54手枪专卖qq +54手枪买卖qq +54手枪买卖销售 +54手枪交易qq +54手枪供应qq +54手枪出售qq +54手枪子弹专卖 +54手枪子弹供应 +54手枪子弹出售 +54手枪子弹提供 +54手枪子弹销售 +54手枪批发qq +54手枪提供qq +54手枪改装qq +54手枪狗粮供应 +54手枪狗粮出售 +54手枪狗粮提供 +54手枪狗粮销售 +54手枪直销qq +54手枪订购qq +54手枪购买qq +54手枪转让qq +54手枪销售qq +54手狗供应qq +54手狗子弹供应 +54手狗子弹出售 +54手狗子弹提供 +54手狗子弹销售 +54枪支专卖qq +54猎枪买卖销售 +55mm铅弹出售 +55sss偷拍区 +56式3棱刺出售 +5月天成人电影网 +60周年策划袭击 +611aa情色网 +64参加者回忆录 +64式手枪弹专卖 +64手枪买卖销售 +64手枪子弹出售 +64手枪子弹提供 +64手枪子弹订购 +64手枪子弹销售 +64枪模供应qq +64猎枪买卖出售 +64猎枪买卖销售 +6789性爱电影 +6合彩在线投注网 +6合彩白小组特码 +6岁幼女阴穴近拍 +6提辖打死林衙内 +6级答案考后付款 +77手枪买卖销售 +77手枪出售qq +77手枪提供qq +77猎枪买卖销售 +7胜国际娱乐平台 +888真人娱乐场 +888真人娱乐城 +89学潮血腥屠杀 +911色情淫色网 +92手枪买卖销售 +92手枪子弹出售 +92手枪子弹提供 +92手枪子弹销售 +92猎枪买卖销售 +95步枪子弹供应 +av下载网站地址 +av女优影片下载 +av女优电影下载 +av女优种子下载 +av成人电影下载 +av电影种子下载 +av电影色情导航 +awp气步枪供应 +awp气步枪批发 +awp气步枪提供 +awp气步枪预订 +a片电影下载网站 +a片种子下载网站 +bb论坛操bb图 +bt亚洲无码影片 +c4炸药出售qq +c4炸药制作方法 +cannabis +cp99配件直销 +d7se淫色贴图 +dajiyuan +dang在玩社会 +diy化学燃烧弹 +diy汽油燃烧弹 +diy汽油燃烧瓶 +diy燃烧弹方法 +diy燃烧瓶方法 +e世博线上娱乐城 +fh加98我13 +fuck4川独立 +fuck5星红旗 +fuck世界日报 +fuck体育总局 +fuck十5周年 +fuck十年动乱 +fuck双峰微颤 +fuck台湾帝国 +fuck台湾民国 +fuck台湾独立 +fuck天皇陛下 +fuck天鹅之旅 +fuck希望之声 +fuck我妳老爸 +fuck手机复制 +fuck投毒杀人 +fuck新华内情 +fuck新疆独立 +fuck新闻出版 +fuck新闻管制 +fuck水去车仑 +fuck特别公告 +fuck社会主义 +fuck税务总局 +fuck系统公告 +fuck系统讯息 +fuck色情服务 +fuck色情电影 +fuck西藏天葬 +fuck西藏独立 +fuck透视眼镜 +fuck透视软件 +fuck驶你老师 +fuck驶你老母 +gay上门性服务 +gay包夜性服务 +ghb催情水订购 +ghb水送货上门 +ghb水配方供应 +ghb水配方批发 +ghb水配方提供 +ghb迷情药专卖 +ghb迷情药批发 +GSM短信接收器 +gηb迷情水专卖 +gηb迷情水供应 +gηb迷情水出售 +gηb迷情水直销 +gηb迷情水订购 +happy水qq +happy水提供 +hujintao +jiejie的屄 +ketamine +k粉制造技术供应 +k粉制造技术出售 +k粉制造方法qq +k粉麻果猪肉买卖 +lsd迷幻药出售 +luo聊美女qq +luo聊表演qq +makelove +May 35th +meimei做爱 +meimei吸精 +meimei嫩穴 +meimei小穴 +meimei淫图 +meimei的屄 +meimei黄站 +meinv极品穴 +meinv穴自拍 +meinv鸡吧图 +mimi淫色贴图 +mm乱淫自拍图片 +mm激情视频聊天 +morphine +pcp气枪专卖网 +petn制作方法 +petn制作过程 +petn爆炸演示 +petn爆炸视频 +ppk钢珠枪出售 +pp点点激情播放 +qiang支出售 +qovd成人电影 +qq3棱军刀直销 +qq3棱军刺专卖 +qq3棱军刺批发 +qq3棱军刺销售 +qq3棱刮刀供应 +qq3棱刺刀专卖 +qq3棱尖刀批发 +qq3箭汽枪直销 +qq54手枪专卖 +qq54手枪买卖 +qq54手枪出售 +qq54手狗出售 +qq54手狗提供 +qq54枪支出售 +qq64手枪出售 +qq上门援交服务 +qq上门服务性息 +qq上门服务美女 +qq专业制作假证 +qq专业办假证件 +qq专业办证公司 +qq专业发票代开 +qq专卖3棱军刺 +qq专卖3棱刺刀 +qq专卖仿真汽枪 +qq专卖假军官证 +qq专卖假学位证 +qq专卖军用匕首 +qq专卖单管猎枪 +qq专卖弹簧刀具 +qq专卖战术直刀 +qq专卖手枪配件 +qq专卖打鸟汽枪 +qq专卖枪支配件 +qq专卖狙击步枪 +qq专卖狙击气枪 +qq专卖狩猎气枪 +qq专卖猎豹弓弩 +qq专卖蝴蝶刀具 +qq专卖警用电棍 +qq专卖进口弓弩 +qq专卖进口汽枪 +qq专卖钢珠气枪 +qq专卖阳江军刺 +qq专卖阿普唑仑 +qq专卖高仿文凭 +qq专卖高仿汽枪 +qq专卖麻古果子 +qq专卖黑鹰弓弩 +qq专售喷雾迷药 +qq买卖3棱军刀 +qq买卖仿真手枪 +qq买卖仿真步枪 +qq买卖国产汽枪 +qq买卖弹簧刀具 +qq买卖战术折刀 +qq买卖狙击汽枪 +qq买卖考前答案 +qq买卖警用电棍 +qq买卖进口汽枪 +qq买卖迷幻喷雾 +qq买卖迷幻蘑菇 +qq买卖骚本配件 +qq买卖麻古果子 +qq亚洲g片下载 +qq代人了仇出气 +qq代办假2代证 +qq代办假会计证 +qq代办假军官证 +qq代办假户口本 +qq代办假房产证 +qq代办假毕业证 +qq代办假证公司 +qq代办假身份证 +qq代办假驾驶证 +qq代办国外文凭 +qq代办大专文凭 +qq代办文凭证件 +qq代办本科文凭 +qq代办高仿文凭 +qq代办高仿证件 +qq代办高仿驾照 +qq仿真手枪销售 +qq仿真枪械专卖 +qq仿真枪模供应 +qq仿真枪模批发 +qq仿真气枪预订 +qq仿真汽枪供应 +qq仿真汽枪出售 +qq仿真汽枪批发 +qq仿真汽枪提供 +qq仿真汽枪直销 +qq仿真汽枪订购 +qq仿真汽枪购买 +qq仿真汽枪转让 +qq仿真汽枪销售 +qq企业发票代开 +qq供应3唑仑片 +qq供应3棱军刀 +qq供应3棱刮刀 +qq供应3箭汽枪 +qq供应54手枪 +qq供应ghb水 +qq供应丙酮氰醇 +qq供应乙基吗啡 +qq供应仿真假钱 +qq供应仿真手狗 +qq供应仿真气枪 +qq供应仿真汽枪 +qq供应催情药水 +qq供应军刺军刀 +qq供应军用弓弩 +qq供应军用手枪 +qq供应单管猎枪 +qq供应双刃尖刀 +qq供应台湾秃鹰 +qq供应各类假证 +qq供应听话药水 +qq供应喷雾迷药 +qq供应女性数据 +qq供应娥眉气枪 +qq供应工字气枪 +qq供应慢性毒药 +qq供应战术折刀 +qq供应战术直刀 +qq供应手枪配件 +qq供应打鸟汽枪 +qq供应拍肩迷药 +qq供应枪支配件 +qq供应气枪铅弹 +qq供应氰化金钾 +qq供应狩猎气枪 +qq供应猎豹弓弩 +qq供应甲卡西酮 +qq供应秃鹰气枪 +qq供应秃鹰配件 +qq供应虎头猎枪 +qq供应赵氏弓弩 +qq供应进口气枪 +qq供应进口汽狗 +qq供应迷幻蘑菇 +qq供应迷魂香烟 +qq供应镀镍狗粮 +qq供应阿普唑仑 +qq供应高仿假币 +qq供应高仿假钞 +qq供应高仿文凭 +qq供应高仿纸币 +qq供应高仿警服 +qq供应高压汽枪 +qq供盐酸羟亚胺 +qq假人民币直销 +qq假会计证代办 +qq假会计证办理 +qq假军官证出售 +qq假军官证销售 +qq假学位证代办 +qq假户口本专卖 +qq假户口本代办 +qq假户口本办理 +qq假毕业证专卖 +qq假毕业证代办 +qq假毕业证出售 +qq假毕业证办理 +qq假行驶证办理 +qq假证代办公司 +qq假证制作公司 +qq假证办理公司 +qq假身份证出售 +qq假身份证销售 +qq假驾驶证代办 +qq假驾驶证制作 +qq假驾驶证办理 +qq免费裸聊网址 +qq公司发票代开 +qq军品刺刀出售 +qq军狗64出售 +qq军用54专卖 +qq军用刺刀出售 +qq军用刺刀销售 +qq军用匕首出售 +qq军用匕首销售 +qq军用弓弩供应 +qq军用弓弩出售 +qq军用弓弩批发 +qq军用弓弩提供 +qq军用弓弩直销 +qq军用弓弩订购 +qq军用手枪出售 +qq军用猎刀专卖 +qq出售1元假币 +qq出售3唑仑片 +qq出售3棱军刺 +qq出售3棱刮刀 +qq出售3棱刺刀 +qq出售3棱尖刀 +qq出售3箭气枪 +qq出售4号白粉 +qq出售54手枪 +qq出售仿真手枪 +qq出售仿真步枪 +qq出售仿真气枪 +qq出售仿真汽枪 +qq出售仿真汽狗 +qq出售仿真警服 +qq出售假人民币 +qq出售假驾驶证 +qq出售兰博刀具 +qq出售军品刺刀 +qq出售军用刺刀 +qq出售军用匕首 +qq出售军用弓弩 +qq出售单管猎枪 +qq出售卧底软件 +qq出售原装骚本 +qq出售双刃尖刀 +qq出售双管猎枪 +qq出售台湾秃鹰 +qq出售台版假币 +qq出售听话药水 +qq出售喷雾迷药 +qq出售国产汽枪 +qq出售大黑鹰弩 +qq出售女性数据 +qq出售学历证书 +qq出售工字气枪 +qq出售工字狗粮 +qq出售左轮手枪 +qq出售左轮配件 +qq出售开刃军刀 +qq出售开刃匕首 +qq出售开刃跳刀 +qq出售弹簧刀具 +qq出售弹簧跳刀 +qq出售战术军刀 +qq出售战术折刀 +qq出售打鸟汽枪 +qq出售折叠军刺 +qq出售枪支套件 +qq出售枪支配件 +qq出售气枪子弹 +qq出售气枪枪管 +qq出售气枪铅弹 +qq出售汽枪子弹 +qq出售汽枪铅弹 +qq出售汽狗铅弹 +qq出售烟花炮竹 +qq出售狩猎弓弩 +qq出售猎枪弹药 +qq出售猎豹弓弩 +qq出售瓦斯手枪 +qq出售甲卡西酮 +qq出售甲硝西泮 +qq出售百元假钞 +qq出售眼镜蛇弩 +qq出售秃鹰套件 +qq出售秃鹰配件 +qq出售窃听软件 +qq出售考试答案 +qq出售自制手枪 +qq出售自动步枪 +qq出售虎头猎枪 +qq出售虎牙军刀 +qq出售警用器材 +qq出售警用电棒 +qq出售赌博迷药 +qq出售赵氏弓弩 +qq出售进口弓弩 +qq出售进口汽枪 +qq出售进口汽狗 +qq出售迷幻喷雾 +qq出售迷幻药物 +qq出售迷幻香烟 +qq出售迷情药水 +qq出售迷昏药水 +qq出售迷魂香水 +qq出售迷魂香烟 +qq出售野营砍刀 +qq出售金属气枪 +qq出售钢珠气枪 +qq出售钢珠铅弹 +qq出售铅弹汽枪 +qq出售阿普唑仑 +qq出售高仿假钱 +qq出售高仿文凭 +qq出售高仿硬币 +qq出售高仿警服 +qq出售高仿证件 +qq出售高仿钞票 +qq出售高压气枪 +qq出售高压气狗 +qq出售高压汽枪 +qq出售高考答案 +qq制作假军官证 +qq制作假学位证 +qq制作假户口本 +qq制作假毕业证 +qq制作假驾驶证 +qq制作台湾秃鹰 +qq制作高仿护照 +qq制作高仿文凭 +qq制作高仿证件 +qq制作高仿驾照 +qq办理假学生证 +qq办理假毕业证 +qq办理假证公司 +qq办理国外文凭 +qq办理本科学位 +qq办理毕业证书 +qq办理职称证书 +qq办理高仿证书 +qq办理高仿驾照 +qq办证刻章公司 +qq办高仿身份证 +qq包夜打炮服务 +qq包夜特殊服务 +qq卖64式手枪 +qq卖92式手枪 +qq卖cfx气枪 +qq卖仿真狙击枪 +qq卖工字牌汽枪 +qq双刃尖刀买卖 +qq售盐酸哌替啶 +qq国外文凭代办 +qq国税发票代开 +qq在线视频裸聊 +qq在线裸体陪聊 +qq地方发票代开 +qq地税发票代开 +qq大专文凭出售 +qq大黑鹰弩改装 +qq女性数据专卖 +qq女性数据供应 +qq妓女上门服务 +qq妓女全套服务 +qq妓女包夜服务 +qq定制人皮面具 +qq左轮手枪销售 +qq开锁工具出售 +qq开锁工具批发 +qq弹簧刀具专卖 +qq弹簧刀具出售 +qq弹簧跳刀批发 +qq慢性毒药专卖 +qq慢性毒药批发 +qq慢性毒药直销 +qq成人视频裸聊 +qq户外刀具买卖 +qq户外刀具出售 +qq手枪配件出售 +qq手枪配件批发 +qq手枪配件销售 +qq打炮援交服务 +qq打鸟气枪销售 +qq批发3唑仑片 +qq批发3棱军刀 +qq批发3棱刀具 +qq批发3棱刺刀 +qq批发54手枪 +qq批发仿真汽枪 +qq批发仿真警服 +qq批发催情药水 +qq批发兰博军刀 +qq批发双刃尖刀 +qq批发台版假币 +qq批发听话药水 +qq批发喷雾迷药 +qq批发女性数据 +qq批发女性资料 +qq批发弓弩配件 +qq批发战术折刀 +qq批发拍肩迷药 +qq批发气枪配件 +qq批发汽枪配件 +qq批发汽枪铅弹 +qq批发狩猎气枪 +qq批发猎豹弓弩 +qq批发甲卡西酮 +qq批发男性资料 +qq批发破氧毒素 +qq批发虎头猎枪 +qq批发赵氏弓弩 +qq批发进口弓弩 +qq批发进口汽枪 +qq批发迷幻蘑菇 +qq批发迷昏药水 +qq批发迷魂香烟 +qq批发钢珠气枪 +qq批发阿普唑仑 +qq批发高仿假币 +qq批发高仿假钞 +qq批发高仿假钱 +qq批发高仿汽枪 +qq批发高仿警服 +qq批发高仿证件 +qq批发麻古配方 +qq拍肩迷药供应 +qq拍肩迷药批发 +qq拍肩迷药提供 +qq拍肩迷药直销 +qq拍肩迷药订购 +qq拍肩迷药销售 +qq提供3棱刮刀 +qq提供3棱尖刀 +qq提供54手枪 +qq提供ghb水 +qq提供仿真假钱 +qq提供仿真手狗 +qq提供仿真枪模 +qq提供仿真气枪 +qq提供仿真汽枪 +qq提供仿真警服 +qq提供催情药水 +qq提供军品刺刀 +qq提供军用弓弩 +qq提供单管猎枪 +qq提供双刃尖刀 +qq提供听话药水 +qq提供喷雾迷药 +qq提供国产汽枪 +qq提供大黑鹰弩 +qq提供女性数据 +qq提供娥眉气枪 +qq提供工字气枪 +qq提供慢性毒药 +qq提供战术折刀 +qq提供手枪配件 +qq提供打鸟汽枪 +qq提供拍肩迷药 +qq提供援交服务 +qq提供有偿肾源 +qq提供枪支配件 +qq提供气枪铅弹 +qq提供狙击汽枪 +qq提供猎豹弓弩 +qq提供甲卡西酮 +qq提供秃鹰套件 +qq提供秃鹰气枪 +qq提供秃鹰配件 +qq提供秦氏弓弩 +qq提供考前答案 +qq提供虎头猎枪 +qq提供警用电棍 +qq提供赵氏弓弩 +qq提供进口弓弩 +qq提供进口气枪 +qq提供进口汽枪 +qq提供进口汽狗 +qq提供迷情药水 +qq提供迷魂香水 +qq提供迷魂香烟 +qq提供钢珠气枪 +qq提供阿普唑仑 +qq提供雷管炸药 +qq提供高仿假币 +qq提供高仿假钞 +qq提供高仿文凭 +qq提供高仿汽枪 +qq提供高仿警服 +qq提供高仿证书 +qq提供高压汽枪 +qq提供麻古配方 +qq援交小妹服务 +qq援交美女服务 +qq改号软件直销 +qq无码成人影院 +qq暴力开锁出售 +qq有偿提供肾源 +qq机打发票代开 +qq机打发票出售 +qq枪支配件出售 +qq枪支配件直销 +qq枪支配件订购 +qq枪支配件销售 +qq气枪铅弹供应 +qq气枪铅弹批发 +qq气枪铅弹提供 +qq气枪铅弹直销 +qq气枪铅弹销售 +qq汽枪配件直销 +qq汽枪配件销售 +qq沙漠之鹰专卖 +qq激情裸聊服务 +qq狙击汽枪供应 +qq瓦斯手狗出售 +qq甲卡西酮买卖 +qq甲卡西酮供应 +qq甲卡西酮出售 +qq甲卡西酮批发 +qq甲卡西酮直销 +qq甲卡西酮订购 +qq甲卡西酮销售 +qq百元假钞出售 +qq百元假钞销售 +qq监听软件下载 +qq直销3棱军刀 +qq直销3棱刮刀 +qq直销3棱尖刀 +qq直销3箭汽枪 +qq直销54手枪 +qq直销仿真汽枪 +qq直销仿真警服 +qq直销催情药水 +qq直销军用匕首 +qq直销军用弓弩 +qq直销双刃尖刀 +qq直销台湾秃鹰 +qq直销听话药水 +qq直销喷雾迷药 +qq直销战术折刀 +qq直销拍肩迷药 +qq直销枪支配件 +qq直销气枪铅弹 +qq直销狙击汽枪 +qq直销猎豹弓弩 +qq直销甲卡西酮 +qq直销破氧毒素 +qq直销秃鹰猎枪 +qq直销警察手铐 +qq直销赵氏弩弓 +qq直销进口气枪 +qq直销进口汽枪 +qq直销进口汽狗 +qq直销迷幻药水 +qq直销迷幻蘑菇 +qq直销迷魂香烟 +qq直销金属气枪 +qq直销钢珠气枪 +qq直销钢珠汽枪 +qq直销阻击步狗 +qq直销阿普唑仑 +qq直销骚本气枪 +qq直销高仿假钞 +qq直销高仿汽枪 +qq直销麻古果子 +qq真人luo聊 +qq真人激情裸聊 +qq真人视频做爱 +qq真人视频性爱 +qq秃鹰手枪出售 +qq税收发票代开 +qq空白发票代开 +qq网上出售假证 +qq网上订购气枪 +qq美国秃鹰销售 +qq美女上门爱爱 +qq美女包夜服务 +qq美女视频裸聊 +qq考生资料出售 +qq肾源信息供应 +qq色情武侠小说 +qq英国骚本专卖 +qq蝴蝶甩刀专卖 +qq蝴蝶甩刀买卖 +qq蝴蝶甩刀出售 +qq蝴蝶甩刀批发 +qq警服常服供应 +qq警用匕首批发 +qq警用手铐供应 +qq警用甩棍出售 +qq警用电棍买卖 +qq警用电棍出售 +qq订制假驾驶证 +qq订购3棱军刀 +qq订购3棱刺刀 +qq订购3箭气枪 +qq订购ghb水 +qq订购仿真气枪 +qq订购仿真汽枪 +qq订购催情药水 +qq订购军用弓弩 +qq订购单管猎枪 +qq订购原装骚本 +qq订购双刃尖刀 +qq订购台湾秃鹰 +qq订购喷雾迷药 +qq订购工字气枪 +qq订购工字狗粮 +qq订购弹簧刀具 +qq订购慢性毒药 +qq订购战术折刀 +qq订购手枪配件 +qq订购打鸟汽枪 +qq订购折叠军刺 +qq订购拍肩迷药 +qq订购枪支配件 +qq订购狙击汽枪 +qq订购狩猎弓弩 +qq订购狩猎气枪 +qq订购猎豹弓弩 +qq订购甲卡西酮 +qq订购眼镜蛇弩 +qq订购秃鹰套件 +qq订购秃鹰配件 +qq订购蝴蝶刀具 +qq订购进口气枪 +qq订购进口汽狗 +qq订购迷昏药水 +qq订购迷魂香烟 +qq订购钢珠气枪 +qq订购钢珠汽枪 +qq订购锡锋气枪 +qq订购阿普唑仑 +qq订购高仿汽枪 +qq订购高仿警服 +qq订购高压汽枪 +qq诚信办证假证 +qq诚信办证护照 +qq财务发票代开 +qq财税发票代开 +qq购买54手枪 +qq购买仿真气枪 +qq购买仿真汽枪 +qq购买催情药水 +qq购买听话药水 +qq购买喷雾迷药 +qq购买拍肩迷药 +qq购买汽枪配件 +qq购买狩猎气枪 +qq购买猎豹弓弩 +qq购买甲卡西酮 +qq购买秃鹰气枪 +qq购买进口气枪 +qq购买迷魂香水 +qq购买迷魂香烟 +qq购买钢珠气枪 +qq赵氏弓弩专卖 +qq转让3箭汽枪 +qq转让54手枪 +qq转让仿真手枪 +qq转让仿真汽枪 +qq转让军用弓弩 +qq转让狙击汽枪 +qq转让猎豹弓弩 +qq转让秃鹰气枪 +qq转让虎头猎枪 +qq转让赵氏弓弩 +qq转让进口弓弩 +qq转让钢珠气枪 +qq转让高仿汽枪 +qq过机假钞出售 +qq过机假钞销售 +qq进口弓弩批发 +qq进口弓弩销售 +qq进口弩弓专卖 +qq进口气枪直销 +qq进口气枪转让 +qq进口气狗销售 +qq迷奸药水专卖 +qq迷幻蘑菇提供 +qq迷情药水供应 +qq迷魂香水出售 +qq迷魂香水销售 +qq迷魂香烟供应 +qq通用发票代开 +qq野外刀具专卖 +qq金属气枪批发 +qq金属气枪提供 +qq金属气枪直销 +qq金属气枪订购 +qq金属气枪转让 +qq钢珠气枪专卖 +qq钢珠气枪直销 +qq钢珠汽枪出售 +qq钢珠汽枪直销 +qq铅弹模具专卖 +qq铅弹模具出售 +qq银行卡复制机 +qq销售3棱军刀 +qq销售3棱军刺 +qq销售3棱刮刀 +qq销售3棱尖刀 +qq销售54手枪 +qq销售ghb水 +qq销售仿真假钱 +qq销售仿真手枪 +qq销售仿真汽枪 +qq销售假人民币 +qq销售假毕业证 +qq销售催情药水 +qq销售军品刺刀 +qq销售军用匕首 +qq销售单管猎枪 +qq销售卧底软件 +qq销售双刃尖刀 +qq销售双管猎枪 +qq销售台湾秃鹰 +qq销售台版假币 +qq销售听话药水 +qq销售喷雾迷药 +qq销售国产汽枪 +qq销售大黑鹰弩 +qq销售安乐死药 +qq销售工字气枪 +qq销售工字狗粮 +qq销售左轮手枪 +qq销售慢性毒药 +qq销售战术军刀 +qq销售战术折刀 +qq销售打鸟汽枪 +qq销售折叠军刺 +qq销售拍肩迷药 +qq销售枪支配件 +qq销售气枪铅弹 +qq销售汽枪子弹 +qq销售汽枪铅弹 +qq销售汽狗铅弹 +qq销售狙击汽枪 +qq销售猎豹弓弩 +qq销售瓦斯手枪 +qq销售甲卡西酮 +qq销售百元假钞 +qq销售秃鹰套件 +qq销售秃鹰配件 +qq销售考试答案 +qq销售自制手枪 +qq销售虎头猎枪 +qq销售赵氏弓弩 +qq销售进口汽枪 +qq销售迷幻喷雾 +qq销售迷幻药水 +qq销售迷幻药物 +qq销售迷幻蘑菇 +qq销售迷情药水 +qq销售迷情药物 +qq销售迷魂香烟 +qq销售金弓电狗 +qq销售钢珠气枪 +qq销售锡锋气枪 +qq销售阿普唑仑 +qq销售高仿假币 +qq销售高仿气枪 +qq销售高仿汽枪 +qq销售高仿警服 +qq销售高仿证件 +qq销售高仿钞票 +qq销售高压气枪 +qq销售高压汽枪 +qq阿普唑仑销售 +qq预定猎豹弓弩 +qq预订仿真气枪 +qq预订进口气枪 +qq香烟迷药供应 +qq香烟迷药订购 +qq骚本套件出售 +qq高价收养女孩 +qq高价领养女孩 +qq高仿假钱批发 +qq高仿护照制作 +qq高仿文凭代办 +qq高仿文凭制作 +qq高仿文凭办理 +qq高仿汽枪提供 +qq高仿真枪销售 +qq高仿证件代办 +qq高仿证件出售 +qq高仿证件制作 +qq高仿证件办理 +qq高偿收养儿童 +qq高偿收养婴儿 +qq高压汽枪供应 +qq高压汽枪出售 +qq高压汽枪配件 +qq鸡婆服务信息 +qq麻古果子销售 +qq黑鹰弓弩专卖 +qvod宾馆偷拍 +qvod性爱视频 +qvod日本a片 +qvod激情电影 +qvod近亲颜射 +sexinsex +sex激情裸聊网 +sex美女聊天室 +se淫乱姐姐小说 +sis色中色网站 +six four +SIX+FOUR +sk3真人娱乐城 +tel援交妹服务 +tm3个6158 +tnt炸弹的制作 +tnt炸弹的配方 +tnt的制作方法 +tokyohot +voa采访热比娅 +xxoo成人影院 +Zha药制造进程 +丁香大型成人社区 +万能开锁工具专卖 +万能开锁工具买卖 +万能开锁工具出售 +万能开锁工具批发 +万能开锁钥匙专卖 +万能开锁钥匙买卖 +万能开锁钥匙出售 +万能开锁钥匙批发 +万能开锁钥匙销售 +三利达弓弩专卖网 +三步倒麻醉箭专卖 +上海工字气枪出售 +上门包夜全套服务 +上门妓女电话qq +上门小姐服务qq +上门按摩性交服务 +上门按摩打炮qq +上门提供口交服务 +上门提供肛交服务 +上门提供足交服务 +上门援交妓女qq +上门援交小姐手机 +上门援交服务qq +上门服务妓女qq +下载av影片地址 +下载手机监听软件 +下载手机窃听软件 +下载黄色淫乱电影 +下载黄色电影网址 +下载黄色电影网站 +不伦继母的性猥亵 +不喜欢被干慢吞吞 +不注册免费淫电影 +不满政府隐瞒疫情 +不良少女日记下载 +专8考前答案qq +专业作弊设备qq +专业假证公司qq +专业出售冰毒qq +专业删帖联系qq +专业办理假身份证 +专业办理各种证件 +专业定制人皮面具 +专业定制高仿人皮 +专业批发警棍qq +专业网络证件办理 +专业证件办理中心 +专业销售气枪种类 +专卖3利达手弓弩 +专卖3唑仑片qq +专卖3棱军刀qq +专卖3棱军刺qq +专卖3棱刀具qq +专卖45mm狗粮 +专卖ghb水配方 +专卖ghb迷情水 +专卖gηb迷情水 +专卖lsd迷幻药 +专卖m4弓弩视频 +专卖万能开锁钥匙 +专卖上海工字气枪 +专卖仿真军刺qq +专卖仿真左轮手枪 +专卖仿真手枪qq +专卖仿真汽枪qq +专卖假人民币qq +专卖假军官证qq +专卖假学位证qq +专卖假毕业证qq +专卖兰博刀具qq +专卖军品刀具qq +专卖军品刺刀qq +专卖军用刺刀qq +专卖军用手枪qq +专卖军用狙击弓弩 +专卖北朝鲜冰qq +专卖双刃尖刀qq +专卖各类防身器材 +专卖各类防身电棍 +专卖国产秃鹰qq +专卖多功能弹簧刀 +专卖工字气枪qq +专卖工字牌钢珠狗 +专卖左轮手枪qq +专卖战术折刀qq +专卖户外刀具qq +专卖户外狩猎弓弩 +专卖手机窃听软件 +专卖手枪配件qq +专卖打鸟汽枪qq +专卖枪支配件qq +专卖狙击步枪qq +专卖狙击汽枪qq +专卖狩猎气枪qq +专卖猎豹弓弩qq +专卖甲卡西酮qq +专卖甲基安非他命 +专卖电击器电棍网 +专卖秃鹰汽枪qq +专卖自制手枪qq +专卖英国骚本qq +专卖蝴蝶跳刀qq +专卖赵氏弓弩qq +专卖赵氏钢珠弓弩 +专卖车主资料qq +专卖进口步枪qq +专卖进口气枪qq +专卖进口汽枪qq +专卖进口汽狗qq +专卖进口秃鹰气枪 +专卖进口金属枪模 +专卖野营刀具qq +专卖防身电警棍网 +专卖阿普唑仑qq +专卖高仿人皮面具 +专卖高仿假钱qq +专卖高仿军刺qq +专卖高仿文凭qq +专卖高仿汽枪qq +专卖高仿真人民币 +专卖高仿证件qq +专卖高压气枪qq +专卖麻古果子qq +专卖黄白牙签qq +专卖黑鹰弓弩qq +专售西班牙苍蝇水 +专用发票代开qq +专营删帖炒作qq +专销高仿人皮面具 +专门批发秦氏弓弩 +专门销售各种手弩 +世界名刀批发qq +世界都在笑中国傻 +丙酮氰醇供应qq +丙酮氰醇批发qq +丛林户外军刀专卖 +东北风情熟女之惑 +东突厥斯坦伊斯兰 +丝袜大魔王txt +丝袜无码rmvb +丝袜美女上门服务 +丝袜美腿痴女女同 +丝足按摩服务qq +两性午夜激情电影 +两性淫乱小说阅读 +中共十8人事变动 +中共十8热门人选 +中共的腐败与残暴 +中共近期权力斗争 +中南海的权利游戏 +中南海的权力游戏 +中南海还给老百姓 +中国实行血腥教育 +中国弓弩专卖qq +中国战神军用弓弩 +中国打日本是必须 +中国政府封锁消息 +中国民主党全委会 +中国海外腐败兵团 +中国激情淫色贴图 +中国美女淫色贴图 +中国高层权力斗争 +中文情色网址导航 +中组部前部长直言 +丰胸性感少女久纱 +乐百家国际娱乐城 +乙酸亚铊供应qq +买卖3棱军刀qq +买卖3棱军刺qq +买卖3棱刀具qq +买卖3棱尖刀qq +买卖54式气木仓 +买卖54手狗qq +买卖64式手木仓 +买卖64式气木仓 +买卖64手狗qq +买卖77式手木仓 +买卖77式气木仓 +买卖92式手木仓 +买卖92式气木仓 +买卖万能开锁工具 +买卖万能开锁钥匙 +买卖仿真军刺qq +买卖仿真手枪qq +买卖仿真步枪qq +买卖假人民币qq +买卖催情药水qq +买卖兰博刀具qq +买卖军用手枪qq +买卖军用枪支qq +买卖单管猎枪qq +买卖单管猎枪子弹 +买卖双刃尖刀qq +买卖双管猎枪qq +买卖双管猎枪子弹 +买卖国产汽枪qq +买卖左轮手枪qq +买卖手机卧底软件 +买卖手机监控软件 +买卖手枪配件qq +买卖狙击步狗qq +买卖狙击汽枪qq +买卖狩猎气枪qq +买卖甲基安非他命 +买卖秃鹰汽枪qq +买卖组装枪支qq +买卖考前答案qq +买卖自制手枪qq +买卖虎头猎枪子弹 +买卖蝴蝶跳刀qq +买卖进口汽枪qq +买卖进口汽狗qq +买卖迷幻香烟qq +买卖野营军刀qq +买卖钻石冰砖qq +买卖银氰化钾qq +买卖阿普唑仑qq +买卖高仿假币qq +买卖高仿军刺qq +买卖高仿真人民币 +买安乐死药物qq +买摇头丸配方qq +乱世金瓶梅txt +乱伦淫书丝袜淫图 +乱情马窝村txt +了解了解联系vx +云雨欲魔欲魔艳史 +亚太假人民币出售 +亚洲av成人影院 +亚洲av无码下载 +亚洲bt成人电影 +亚洲伦理色情网站 +亚洲最大激情电影 +亚洲情色qvod +亚洲成人av影视 +亚洲成人av影院 +亚洲成人av网站 +亚洲成人图片下载 +亚洲成人在线影院 +亚洲成人影院网址 +亚洲成人情色网站 +亚洲成人激情影院 +亚洲成人激情淫穴 +亚洲成人激情视频 +亚洲成人激情网站 +亚洲成人电影下载 +亚洲新时代娱乐城 +亚洲无码av下载 +亚洲无码合集下载 +亚洲无码性交电影 +亚洲无码电影下载 +亚洲无码精彩下载 +亚洲淫色贴图论坛 +亚洲激情影院论坛 +亚洲激情成人电影 +亚洲激情无码bt +亚洲激情淫色文章 +亚洲激情淫色电影 +亚洲激情淫色网址 +亚洲激情淫色网站 +亚洲激情淫色贴图 +亚洲美女做爱色图 +亚洲艳情男女图吧 +亲爱的快操我的b +人体炸弹制作方法 +人体炸弹制作流程 +人体炸弹包教包会 +人妻4部曲txt +人妻送友骑txt +人气av女优下载 +人狗乱交视频下载 +人间天堂女士勿扰 +仁科百华bt种子 +代人了仇了事qq +代人了仇出气qq +代制1代假身份证 +代制2代假身份证 +代制假1代身份证 +代制假2代身份证 +代办假会计证qq +代办假医师资格证 +代办假户口本qq +代办假毕业证qq +代办假证公司qq +代办假身份证qq +代办各种真实文凭 +代办各种证件qq +代办国外学位证书 +代办国外文凭qq +代办国外文凭认证 +代办大专文凭qq +代办大学文凭qq +代办学历文凭qq +代办学士学位qq +代办学生证件qq +代办文凭证件qq +代办本科文凭qq +代办毕业证书qq +代办真实学历文凭 +代办职称证书qq +代办高仿学位证书 +代办高仿学历证书 +代办高仿学历证件 +代办高仿文凭证书 +代办高仿毕业证书 +代办高仿证书qq +代办高仿证件qq +代办高仿资格证书 +代办高仿驾照qq +代售高仿真人民币 +代开发票联系qq +代开房租发票qq +代理国外文凭qq +代理学士学位证书 +代药物毒品类血浆 +代购手机窃听软件 +代购高仿真人民币 +代销高仿真人民币 +任意显号软件直销 +仿54枪销售qq +仿真54手枪专卖 +仿真54手枪出售 +仿真64手枪专卖 +仿真人皮面具销售 +仿真假钱提供qq +仿真军刺专卖qq +仿真军刺买卖qq +仿真军刺交易qq +仿真军刺供应qq +仿真军刺出售qq +仿真军刺批发qq +仿真军刺提供qq +仿真军刺直销qq +仿真军刺转让qq +仿真军刺销售qq +仿真手枪专卖qq +仿真手枪供应qq +仿真手枪出售qq +仿真手枪批发qq +仿真手枪提供qq +仿真手枪直销qq +仿真枪械专卖qq +仿真枪械出售qq +仿真枪械销售qq +仿真枪模专卖qq +仿真枪模供应qq +仿真枪模批发qq +仿真枪模提供qq +仿真枪模销售qq +仿真步枪提供qq +仿真步枪直销qq +仿真气枪专卖qq +仿真气枪供应qq +仿真气枪出售qq +仿真气枪制造图纸 +仿真气枪批发qq +仿真气枪提供qq +仿真气枪直销qq +仿真气枪订购qq +仿真气枪销售qq +仿真气狗出售qq +仿真气狗销售qq +仿真汽枪专卖qq +仿真汽枪供应qq +仿真汽枪出售qq +仿真汽枪子弹购买 +仿真汽枪批发qq +仿真汽枪提供qq +仿真汽枪直销qq +仿真汽枪订购qq +仿真汽枪购买qq +仿真汽枪转让qq +仿真汽枪销售qq +仿真汽狗出售qq +仿真狗销售网qq +仿真美女人皮面具 +仿真警服批发qq +仿真高压气枪专卖 +仿真高压气枪出售 +仿美秃鹰出售qq +仿美秃鹰订购qq +企业发票代开qq +传授黑火药的配方 +伸到老师的小穴里 +作弊设备专卖qq +作弊设备供应qq +作弊设备出售qq +作弊设备销售qq +你弄得阿姨爽死了 +你的1生借我1晚 +你的2我懂txt +供应1比1仿真枪 +供应3棱军刀qq +供应3棱军刺qq +供应3棱刀具qq +供应3棱刮刀qq +供应3棱尖刀qq +供应3步倒麻醉箭 +供应3箭汽枪qq +供应45mm狗粮 +供应54式手木仓 +供应54式气木仓 +供应54手枪子弹 +供应64式手木仓 +供应64式气木仓 +供应654k配件 +供应77式手木仓 +供应77式气木仓 +供应92式手木仓 +供应92式气木仓 +供应92手枪子弹 +供应awp气步枪 +供应ghb水qq +供应ghb水配方 +供应ghb迷情水 +供应ghb迷情药 +供应gηb迷情水 +供应happy水 +供应k粉制作技术 +供应k粉制造技术 +供应lqb362 +供应lsd迷幻药 +供应万能开锁工具 +供应万能开锁钥匙 +供应三步倒麻醉箭 +供应上海工字气枪 +供应丙酮氰醇qq +供应业主资料qq +供应乙酸亚铊qq +供应乙酸苯汞qq +供应亚砷酸钠qq +供应亚砷酸钾qq +供应仿真军刺qq +供应仿真手枪qq +供应仿真汽枪qq +供应假2代身份证 +供应假人民币qq +供应催情药水qq +供应兰博刀具qq +供应军人证件qq +供应军刀军刺qq +供应军用匕首qq +供应军用弓弩qq +供应军用弓弩专卖 +供应军用弩折叠弩 +供应军用手枪qq +供应冰毒制作技术 +供应出售双管猎枪 +供应单管猎枪qq +供应卧底监控软件 +供应双刃尖刀qq +供应双管猎枪qq +供应口香糖型春药 +供应口香糖型迷药 +供应台版高仿假币 +供应听话药水qq +供应喷雾迷药qq +供应国产汽枪qq +供应国产秃鹰qq +供应大小冰砖qq +供应大马士革钢刀 +供应女性数据qq +供应娥眉气枪qq +供应安乐死药qq +供应工字气枪qq +供应工字牌钢珠狗 +供应左轮手枪qq +供应左轮牌钢珠狗 +供应平式双管猎枪 +供应广州3箭气枪 +供应弹簧刀具qq +供应慢性毒药qq +供应战术直刀qq +供应户外军刀qq +供应户外刀具qq +供应户外砍刀qq +供应手机卧底软件 +供应手机监听软件 +供应手机窃听软件 +供应手枪配件qq +供应打鸟汽枪qq +供应放线菌酮qq +供应朝版假人民币 +供应木防已苦毒素 +供应枪支配件qq +供应枸橼酸芬太尼 +供应棕曲霉毒素a +供应正品军刀qq +供应步qiang +供应氟乙酸钠qq +供应氯甲酸氯甲酯 +供应氰化金钾qq +供应汽枪配件qq +供应汽枪铅弹qq +供应温切斯特气枪 +供应港38式左轮 +供应狙击步狗qq +供应狙击气枪qq +供应猎qiang +供应猎枪子弹qq +供应猎枪铅弹qq +供应猎豹弓弩qq +供应甲卡西酮qq +供应甲基甲卡西酮 +供应白粉冰糖qq +供应白黄牙签qq +供应百元假币qq +供应破氧毒素qq +供应硫酸亚铊qq +供应秃鹰气枪qq +供应秃鹰汽枪qq +供应秃鹰狙击气枪 +供应秦氏弓弩qq +供应窃听手机软件 +供应立式双管猎枪 +供应简易炸弹qq +供应绿瓦瓦管qq +供应绿皮瓦管qq +供应美国卡巴军刀 +供应美国秃鹰qq +供应美女裸聊qq +供应考前答案qq +供应股民电话资源 +供应英国骚本qq +供应英国骚本气枪 +供应虎头猎枪qq +供应蝴蝶甩刀qq +供应蝴蝶跳刀qq +供应西班牙苍蝇水 +供应西班牙苍蝇粉 +供应警用手枪qq +供应警用棍刀qq +供应警用电棍qq +供应警用转轮手枪 +供应赭曲毒素qq +供应赵氏弓弩qq +供应车主资料qq +供应进口弓弩配件 +供应进口气枪qq +供应进口气狗qq +供应进口汽枪qq +供应进口汽狗qq +供应进口秃鹰qq +供应迷奸药水qq +供应迷幻蘑菇qq +供应迷情药水qq +供应迷魂药水qq +供应迷魂香烟qq +供应野营刀具qq +供应野营猎刀qq +供应野营砍刀qq +供应金弓电狗qq +供应钢珠弓弩qq +供应钻石冰糖qq +供应铅弹汽枪qq +供应阿普唑仑qq +供应香港ghb水 +供应香烟迷药qq +供应马钱子碱qq +供应高仿人皮面具 +供应高仿假币qq +供应高仿假钞qq +供应高仿军刺qq +供应高仿手枪qq +供应高仿气枪qq +供应高仿真枪qq +供应高仿硬币qq +供应高仿纸币qq +供应高仿警服qq +供应高仿钞票qq +供应麦司卡林qq +供应麦角酸2乙胺 +供应麻古配方qq +供应麻果丸子qq +供应麻醉箭3步倒 +供应麻醉箭三步倒 +供应麻黄素羟亚胺 +供应黄曲霉素qq +保健充气娃娃专卖 +保健按摩特殊服务 +假人民币专卖qq +假人民币买卖qq +假人民币供应qq +假人民币出售电话 +假人民币批发qq +假人民币提供qq +假人民币直销qq +假人民币销售qq +假会计证代办qq +假会计证办理qq +假发票出售tel +假学位证代办qq +假学位证办理qq +假币假钱买卖qq +假币出售硬币出售 +假文凭证件专卖网 +假毕业证代办qq +假毕业证办理qq +假行驶证办理qq +假证代办公司qq +假证办理公司qq +假证快速办理qq +假证诚信办理qq +假资格证代办qq +假身份证代办qq +假驾驶证制作qq +假驾驶证办理qq +做个会做爱的女人 +偷拍掰开阴唇做爱 +催情药水出售qq +催情药水提供qq +催情药水直销qq +催情药水订购qq +催情药水购买qq +催情药水销售qq +催情香水专卖qq +儿奸娘初试云雨情 +儿子的肉棒好大啊 +儿子的肉棒好长啊 +免定金工字牌气枪 +免注册在线淫电影 +免费免注册淫电影 +免费午夜成人影院 +免费午夜激情视频 +免费午夜艳情电影 +免费台湾18电影 +免费品尝不伦主妇 +免费在线成人电影 +免费在线淫电影网 +免费在线激情电影 +免费妹妹黄色淫乱 +免费成人两性影院 +免费成人两性电影 +免费成人十8影院 +免费成人午夜电影 +免费成人娱乐电影 +免费成人激情影院 +免费成人激情电影 +免费成人电影下载 +免费成人电影图片 +免费成人电影快播 +免费成人色情小说 +免费淫乱电影下载 +免费淫区隐蔽入口 +免费淫奸女a片段 +免费淫奸黄色电影 +免费淫色妹妹电影 +免费淫色强奸电影 +免费淫色电影下载 +免费淫色电影网站 +免费淫色电影论坛 +免费电影吸精痴女 +免费电影欧女乱欲 +免费电影美女电影 +免费真人裸聊qq +免费美女luo聊 +免费美女激情裸聊 +免费美女裸聊qq +免费艳情淫秽小说 +免费裸体聊天网站 +免费裸女视频聊天 +免费裸女陪聊qq +免费顶级欲图禁片 +免费黄色淫乱电影 +免费黄色淫秽电影 +免费黄色电影下载 +免费黄色网站电影 +兔妹妹色色贴图区 +全免费淫色情电影 +全国楼凤信息出售 +全国高端外围美女 +全套包夜上门服务 +全金属仿真枪专卖 +公司发票代开qq +公媳性交淫荡图片 +公车上的女大学生 +兰博3号军刀专卖 +兰博军刀专卖qq +兰博刀具买卖qq +兰博刀具供应qq +兰博刀具批发qq +兰博刀具提供qq +兼职mm上门服务 +兼职妹妹上门服务 +兼职妹妹双飞服务 +兼职妹妹服务上门 +兼职妹妹服务中心 +兼职学生上门保健 +兼职学生上门服务 +兼职小妹上门电话 +兼职小妹服务电话 +兼职小姐上门服务 +兼职少妇全套服务 +兼职少妇服务信息 +兼职援交上门qq +兼职援交包夜qq +兼职援交学生上门 +兼职援交服务qq +兼职白领上门qq +兼职白领上门服务 +兼职美女上门qq +兼职美女上门保健 +兼职美女上门全套 +兼职美女上门服务 +兽交电影qvod +兽兽门视频完整版 +内射无码美人秘书 +内衣模特露点走光 +内裤炸弹制作方法 +最新1000人斩 +最新两性激情小说 +最新亚洲无码合集 +最新假钱批发电话 +最新成人视频下载 +最新手机卧底软件 +最新日本无码av +最新日韩无码合集 +最新高清美女视频 +最牛b的女预言家 +最色情的做爱裸聊 +军刀专卖刀具批发 +军刀价格军用刀具 +军刺野营砍刀出售 +军品刀具批发qq +军品刺刀专卖qq +军品刺刀批发qq +军用54货到付款 +军用77专卖qq +军用77出售qq +军用77销售qq +军用刀具出售qq +军用刀具销售qq +军用刺刀专卖qq +军用刺刀出售qq +军用刺刀批发qq +军用刺刀销售qq +军用匕首供应qq +军用匕首出售qq +军用匕首批发qq +军用匕首提供qq +军用匕首销售qq +军用弓弩供应qq +军用弓弩出售qq +军用弓弩批发qq +军用弓弩提供qq +军用弓弩直销qq +军用弓弩订购qq +军用弓弩转让qq +军用手枪专卖qq +军用手枪买卖qq +军用手枪供应qq +军用手枪出售qq +军用手枪批发qq +军用手枪提供qq +军用手枪配件供应 +军用手枪配件出售 +军用手枪配件批发 +军用手枪配件订购 +军用手枪配件销售 +军用手枪销售qq +军用手狗出售qq +军用折刀出售qq +军用折刀销售qq +军用枪支出售qq +军用枪支销售qq +军用汽枪配件出售 +军用汽枪配件销售 +农夫导航最新地址 +农村的干部最能贪 +冰毒制作工艺qq +冰毒制作方法qq +冰毒制作方法出售 +冰毒制作方法销售 +冰毒制造技术qq +冰毒合成方法qq +冰毒成品供应qq +冰毒送货上门qq +冰毒配方讲解光盘 +冰毒麻古供应qq +冰毒黄牙签价格q +冲田杏梨bt种子 +冲田杏梨视频下载 +冷狮爪下的小野猫 +出售1代假身份证 +出售1元假币qq +出售1元硬币qq +出售1元硬币假钞 +出售1元硬币电话 +出售1手女性数据 +出售1手女性资料 +出售1比1仿真枪 +出售2代假身份证 +出售3唑仑片qq +出售3棱军刀qq +出售3棱军刺qq +出售3棱刀具qq +出售3棱刮刀qq +出售3棱尖刀qq +出售3箭气枪qq +出售3箭气狗qq +出售3箭汽枪qq +出售45mm狗粮 +出售45mm铅弹 +出售4号白粉qq +出售4号白粉电话 +出售54军用手狗 +出售54式手木仓 +出售54式气木仓 +出售54手枪qq +出售54手枪子弹 +出售54手狗子弹 +出售56式冲锋枪 +出售56式半刺刀 +出售5连发猎l枪 +出售64军用手狗 +出售64式手木仓 +出售64式气木仓 +出售64手枪qq +出售64手枪子弹 +出售654k手枪 +出售77式气木仓 +出售77手枪qq +出售92式手木仓 +出售92式气木仓 +出售92手枪qq +出售92手枪子弹 +出售95步枪子弹 +出售97步枪子弹 +出售ak47刺刀 +出售bb汽枪qq +出售c02款式枪 +出售c4炸药qq +出售ghb催情水 +出售ghb水qq +出售ghb水配方 +出售ghb迷情水 +出售gηb迷情水 +出售jia币qq +出售k粉制作方法 +出售k粉制作配方 +出售k粉提供冰妹 +出售k粉麻果qq +出售lqb362 +出售lsd迷幻药 +出售pcp消声器 +出售万能开锁钥匙 +出售上海工字气枪 +出售上海工字气狗 +出售下压气狗qq +出售业主资料qq +出售乳化炸药qq +出售仿真假钱qq +出售仿真左轮手枪 +出售仿真手枪qq +出售仿真日本军刀 +出售仿真枪模qq +出售仿真气枪qq +出售仿真汽枪qq +出售仿真汽狗qq +出售仿真汽狗配件 +出售仿真狙击步枪 +出售仿真警服qq +出售仿美秃鹰qq +出售信用卡复制器 +出售信用卡读卡器 +出售假1代身份证 +出售假2代身份证 +出售假rmbqq +出售假人民币qq +出售假人民币扣扣 +出售假人民币电话 +出售假学位证qq +出售假币当面交易 +出售假币模具qq +出售假币联系方式 +出售假币联系电话 +出售假户口本qq +出售假毕业证qq +出售健卫14步枪 +出售健卫15步枪 +出售健卫20步枪 +出售催情药水qq +出售全国楼凤性息 +出售全国车主信息 +出售全金属狩猎弩 +出售公司电话资源 +出售兰博军刀qq +出售兰博刀具qq +出售军人证件qq +出售军刀军刺qq +出售军品刀具qq +出售军品刺刀qq +出售军用54手枪 +出售军用刺刀qq +出售军用匕首qq +出售军用弓弩qq +出售军用折刀qq +出售军用狙击弓弩 +出售冰毒制作方法 +出售冰毒制作配方 +出售冰毒技术qq +出售冰毒配方qq +出售制作美国秃鹰 +出售化学合成骚冰 +出售半自动pcp +出售单发麻醉手枪 +出售单管猎枪qq +出售卧底监控软件 +出售原装秃鹰qq +出售双刃尖刀qq +出售双管平式猎枪 +出售双管猎枪qq +出售双管猎枪出售 +出售双管立式猎枪 +出售口香糖型春药 +出售口香糖型迷药 +出售台版假币qq +出售司马系列气狗 +出售各国军用手枪 +出售各国军用步枪 +出售各国制式手枪 +出售各国制式步枪 +出售各种制毒工具 +出售各种烟花爆竹 +出售各种进口气枪 +出售各类警用装备 +出售喷雾迷药qq +出售国产军用手枪 +出售国产手拉长狗 +出售国产手枪qq +出售国产汽枪qq +出售国产秃鹰qq +出售地税发票qq +出售塑胶炸药qq +出售大口径狙击枪 +出售大马士革军刀 +出售大马士革钢刀 +出售女性数据qq +出售学历证书qq +出售学生资料qq +出售定制人皮面具 +出售定时炸弹qq +出售工字气枪qq +出售左轮手枪qq +出售左轮枪6连发 +出售平式双管猎狗 +出售弹簧刀具qq +出售微型手枪qq +出售成品冰毒qq +出售战术折刀qq +出售户主资料qq +出售户外军刀qq +出售户外刀具qq +出售户外砍刀qq +出售手qiang +出售手机卧底qq +出售手机卧底软件 +出售手机监听软件 +出售手机监控软件 +出售手机窃听软件 +出售手机间谍软件 +出售手枪子弹qq +出售手枪货到付款 +出售手枪配件qq +出售打鸟汽枪qq +出售拍肩型昏迷药 +出售拍肩型迷幻药 +出售拍肩迷药qq +出售提供军用l枪 +出售改号软件qq +出售新版高仿假钞 +出售无线监听设备 +出售暴力开锁工具 +出售朝版假人民币 +出售朝鲜版人民币 +出售枪支套件qq +出售枪支弹药qq +出售枪支配件qq +出售步qiang +出售气qiang +出售气枪套件qq +出售气枪子弹qq +出售气枪铅弹qq +出售汽枪配件qq +出售汽枪铅弹qq +出售汽狗子弹qq +出售汽狗铅弹qq +出售汽车锁解码器 +出售沙漠之鹰qq +出售液体炸弹qq +出售港38式左轮 +出售烟花爆竹qq +出售物流数据qq +出售狙击步狗qq +出售狙击气枪qq +出售狙击汽枪qq +出售狩猎弓弩qq +出售狩猎气枪qq +出售狩猎气狗qq +出售猎qiang +出售猎枪子弹qq +出售猎枪弹药qq +出售猎枪手枪qq +出售猎枪铅弹qq +出售猎豹弓弩qq +出售瓦斯手狗qq +出售甲卡西酮qq +出售甲卡西酮教程 +出售甲基安非他命 +出售白冰牙签qq +出售白冰黄冰qq +出售白粉冰毒qq +出售盐酸曲马多片 +出售真实学历qq +出售硝铵炸药qq +出售秃鹰气枪qq +出售秃鹰气枪配件 +出售秃鹰汽枪qq +出售秃鹰汽枪配件 +出售突击步枪qq +出售窃听软件qq +出售立式双管猎枪 +出售简易炸弹qq +出售精仿3棱军刺 +出售纯冰钻石白冰 +出售纯冰钻石黄冰 +出售缅古制作技术 +出售缅古制作方法 +出售缅甸麻古qq +出售罂粟种子qq +出售网络招嫖信息 +出售美军现役军刀 +出售美国m7军刺 +出售美国冷钢军刀 +出售美国卡巴军刀 +出售美国巴克军刀 +出售美国秃鹰汽枪 +出售考前答案qq +出售考生数据qq +出售考试作弊器材 +出售考试答案qq +出售股民电话资源 +出售自制54式枪 +出售自制77手枪 +出售自制式64式 +出售自制手枪qq +出售自制气枪qq +出售自制炸弹qq +出售自制烟花爆竹 +出售自制猎枪qq +出售自制连弩qq +出售自制雷管qq +出售自制鞭炮qq +出售自动步枪qq +出售自考考前答案 +出售苯基甲酮qq +出售英国骚本气枪 +出售虎头双管猎枪 +出售蝴蝶刀具qq +出售蝴蝶甩刀qq +出售蝴蝶跳刀qq +出售警服及警用品 +出售警用刀具qq +出售警用手枪qq +出售警用棍刀qq +出售警用甩棍qq +出售警用电棍qq +出售警用电棒qq +出售警用电棒电话 +出售赌博迷药qq +出售赵氏弓弩qq +出售身份证复印件 +出售身份证生成器 +出售车主资料qq +出售进口仿真步枪 +出售进口催情药水 +出售进口弓弩qq +出售进口手狗qq +出售进口步枪qq +出售进口气枪qq +出售进口气狗qq +出售进口汽枪qq +出售进口汽狗qq +出售进口秃鹰气枪 +出售进口金属枪模 +出售连发猎枪qq +出售迫击炮弹qq +出售迷奸药水qq +出售迷幻药物qq +出售迷情药水qq +出售迷昏药水qq +出售迷魂香水qq +出售迷魂香烟qq +出售野营刀具qq +出售野营砍刀qq +出售金属气枪qq +出售金钟1911 +出售钢珠汽枪qq +出售钻石冰糖qq +出售钻石冰糖牙签 +出售钻石牙签qq +出售铅弹模具qq +出售铅弹汽枪qq +出售银行卡复制器 +出售银行卡读卡器 +出售银行客户资料 +出售银行金卡名单 +出售防身手枪qq +出售防身手狗qq +出售雷管炸药qq +出售顺丰数据qq +出售飞行员飞叶子 +出售香烟型迷幻药 +出售骚本手枪qq +出售高仿人皮面具 +出售高仿假人民币 +出售高仿假币qq +出售高仿假钞qq +出售高仿假钞电话 +出售高仿假钱qq +出售高仿军刺qq +出售高仿军用枪支 +出售高仿学位证书 +出售高仿学历证书 +出售高仿学历证件 +出售高仿手枪qq +出售高仿文凭qq +出售高仿文凭证书 +出售高仿枪支qq +出售高仿气枪qq +出售高仿真人民币 +出售高仿真枪qq +出售高仿真版假币 +出售高仿纸币qq +出售高仿警服qq +出售高仿证书qq +出售高仿证件qq +出售高仿钞票qq +出售高假仿人民币 +出售高压气枪qq +出售高压气枪配件 +出售高压气狗qq +出售高压汽枪qq +出售高纯k粉qq +出售高纯度白牙签 +出售高考答案qq +出售麦角酸2乙胺 +出售麻古4号qq +出售麻古冰毒qq +出售麻古制作方法 +出售麻古果子qq +出售麻古白粉qq +出售麻古配方qq +出售麻果丸子qq +出售麻果白冰猪肉 +出售麻果配方qq +出售麻醉手枪qq +出售麻醉钢枪qq +出售黄冰白冰牙签 +出国留学必备物品 +出租狙击气枪qq +出轨的诱惑txt +创世之子猎艳之旅 +初中妹妹的小美穴 +别人的老婆我来抱 +制作45mm狗粮 +制作人体炸弹方法 +制作假军官证qq +制作假学位证qq +制作假户口本qq +制作假毕业证qq +制作假驾驶证qq +制作学历证件qq +制作氯胺酮的方法 +制作溜冰壶子配方 +制作火药配方qq +制作硝铵炸药方法 +制作简易炸药qq +制作高仿学历证书 +制作高仿学历证件 +制作高仿护照qq +制作高仿证书qq +制作高仿证件qq +制取petn方法 +制服下的诱惑下载 +制服古典乱伦都市 +刻章办证公司qq +办假证件本地交易 +办理1代假身份证 +办理2代假身份证 +办理会计师证qq +办理假1代身份证 +办理假2代身份证 +办理假会计证qq +办理假军官证qq +办理假学位证qq +办理假户口本qq +办理假资格证qq +办理假香港身份证 +办理假驾驶证qq +办理假高中毕业证 +办理军人证件qq +办理国外文凭qq +办理国外文凭证件 +办理执业资格证书 +办理本科文凭qq +办理本科证书qq +办理毕业文凭qq +办理毕业证书qq +办理真实学历证书 +办理硕士学位证书 +办理高仿学位证书 +办理高仿学历证书 +办理高仿学历证件 +办理高仿文凭qq +办理高仿文凭证书 +办理高仿毕业证书 +办理高仿证书qq +办理高仿证件qq +办理高仿驾照qq +办理高校文凭qq +办证刻章公司qq +办驾照正规驾驶证 +办高仿毕业证qq +加我微信有福利哦 +动漫av午夜电影 +动漫激情淫色贴图 +动漫美女触手禁图 +包办色情娱乐服务 +包夜帝王泰式兼职 +包夜按摩全套服务 +匕首蝴蝶甩刀专卖 +化学合成骚冰出售 +北京之春民主论坛 +北京小姐援交qq +北京市成人聊天室 +北京美女兼职上门 +十七大权力争霸战 +十字开锁工具批发 +午夜免费成人黄色 +午夜寂寞小妹在线 +午夜成人爽片导航 +午夜激情宽频影院 +半圆刮刀批发qq +华侨人娱乐城qq +华尔街娱乐城网址 +单管猎枪专卖qq +单管猎枪买卖销售 +单管猎枪出售qq +单管猎枪提供qq +单管猎枪订购qq +卖1代精仿身份证 +卖1代高仿身份证 +卖2代高仿身份证 +卖high粉qq +卖high粉手机 +卖high粉电话 +卖king粉qq +卖king粉手机 +卖king粉电话 +卖合成氯胺酮qq +卖左旋麻黄素qq +卖左旋麻黄素手机 +卖左旋麻黄素电话 +卖摇头丸配方qq +卖氯胺酮付款qq +卖盐酸哌替啶qq +卖盐酸羟亚胺qq +卖盐酸羟亚胺手机 +卖盐酸羟亚胺电话 +博天堂娱乐城网站 +博康舒大冒险魔女 +博彩网58娱乐城 +博彩网址导航qq +博彩网真人娱乐城 +博彩网真钱娱乐城 +卡通动漫美女淫乱 +卡通美女淫色贴图 +印尼伊斯兰祈祷团 +印尼抢劫华人资产 +厕所盗摄护士姐姐 +厕所盗摄美女性感 +厕所盗摄美女淫穴 +原装秃鹰出售qq +县委书记群p照片 +县委书记群p视频 +县长之女施暴追踪 +又粗又硬的大肉棒 +又粗又长的大肉棒 +又肥又大的骚屄儿 +又黑又粗长的鸡巴 +双刃尖刀买卖qq +双刃尖刀出售qq +双刃尖刀批发qq +双刃尖刀提供qq +双管平式猎枪出售 +双管猎枪专卖qq +双管猎枪买卖qq +双管猎枪供应qq +双管猎枪出售qq +双管猎枪销售qq +变瞎子的慢性毒药 +口含鸡巴插入阴道 +口服型昏迷药供应 +口服型昏迷药出售 +口服型昏迷药批发 +口服型昏迷药提供 +口服型昏迷药直销 +口服型昏迷药订购 +口服型昏迷药购买 +口服型昏迷药销售 +只为你勃起txt +可乐瓶改装空气枪 +可以来看我的直播 +可塑炸弹制作方法 +台湾18dy影院 +台湾18dy电影 +台湾18成人网站 +台湾十8两性电影 +台湾午夜色情小说 +台湾古装av老片 +台湾女人裸体贴图 +台湾妹中文娱乐网 +台湾建国运动组织 +台湾成人18贴图 +台湾成人19贴图 +台湾成人20贴图 +台湾成人21贴图 +台湾成人22贴图 +台湾成人23贴图 +台湾成人24贴图 +台湾成人25贴图 +台湾成人视频聊天 +台湾成人黄色电影 +台湾成人黄色网站 +台湾秃鹰出售qq +台湾秃鹰批发qq +台湾秃鹰提供qq +台湾秃鹰直销qq +台湾秃鹰转让qq +台湾秃鹰销售qq +台湾辣妹免费裸聊 +台湾青年独立联盟 +台湾黄色成人电影 +台版假币批发qq +台版假币批发电话 +台版假钞出售qq +台版假钞销售qq +叶月千穗bt下载 +司马系列气狗出售 +吃人民的吸血阶层 +各国风情全套包夜 +各种炸药配方大全 +各类警用装备出售 +合租屋里的女房客 +吉泽明步无码下载 +吉泽明步视频下载 +吉泽明步高清种子 +同城异性交友qq +同城激情luo聊 +同花顺国际娱乐城 +同花顺娱乐城赌博 +后庭花txt在线 +听话药水供应qq +听话药水批发qq +听话药水提供qq +听话药水直销qq +听话药水订购qq +听话药水购买qq +听话药水销售qq +吸吮着红嫩的乳头 +吸血贵利王血玫瑰 +和两勇男玩10p +和两勇男玩11p +和两勇男玩13p +和两勇男玩17p +和两勇男玩18p +和两勇男玩19p +和两勇男玩20p +和两勇男玩21p +和两勇男玩23p +和两勇男玩24p +和两勇男玩34p +和两勇男玩36p +和两勇男玩44p +和阿姨玩插穴游戏 +品色论坛网址qq +哇嘎绿色成人社区 +哥哥你好色娱乐网 +哥哥快来加我微信 +哥哥插入我的小穴 +哥哥淫奸妹妹论坛 +哥哥的肉棒好大啊 +哥哥的肉棒好长啊 +哪里有连发猎枪买 +哪里有银行卡复制 +售蓝色妖姬催情水 +售香港ghbqq +售高仿真人民币q +啊用你的鸡吧插我 +喜盈门国际娱乐城 +喷雾型迷幻药专卖 +喷雾型迷幻药批发 +喷雾迷药供应qq +喷雾迷药批发qq +喷雾迷药提供qq +喷雾迷药直销qq +喷雾迷药订购qq +喷雾迷药购买qq +喷雾迷药销售qq +嘿嘿嘿咻都懂的啦 +噗嗤1声滑入阴道 +国产3级影片下载 +国产a片下载qq +国产军用54手枪 +国产幼女屄屄套图 +国产手拉长狗出售 +国产手拉长狗销售 +国产气枪供应qq +国产气枪批发qq +国产气枪提供qq +国产气枪直销qq +国产气枪转让qq +国产气狗出售qq +国产汽枪专卖qq +国产汽枪供应qq +国产汽枪出售qq +国产汽枪销售qq +国产秃鹰专卖qq +国产秃鹰供应qq +国产秃鹰出售qq +国产秃鹰批发qq +国产秃鹰提供qq +国产秃鹰直销qq +国产秃鹰订购qq +国产秃鹰购买qq +国产秃鹰转让qq +国产自拍偷拍3部 +国产黄片下载qq +国内模特各国洋妞 +国内肾源出售qq +国外成人激情网站 +国外文凭代办qq +国外激情淫色贴图 +国家禁毒署林则徐 +国税发票代开qq +土制炸弹制作方法 +土制炸药制作方法 +土炸药的制作方法 +圣淘沙娱乐城网站 +在乳房和阴道摸弄 +在线免费成人电影 +在线免费激情裸聊 +在线博彩公司平台 +在线博彩真钱投注 +在线博彩赌博投注 +在线播放a级电影 +在线日本成人电影 +在线激情视频网站 +在线激情黄色电影 +在线真钱博彩平台 +在线脱衣做爱qq +在线裸体陪聊qq +在线裸女聊天qq +在线观看成人电影 +在线身份证生成器 +在线轮盘博彩导航 +在线轮盘博彩平台 +地产就没有新中国 +地方发票代开qq +地税发票代开qq +基本配方是硝酸甘 +基督教科学箴言报 +塑胶炸药制作教程 +塑胶炸药自制手册 +增值发票代开qq +增值发票出售qq +增值税票出售qq +处女的阴道特别紧 +处女阴道特写爽图 +夏夏娱乐免费黄站 +夏夏娱乐黄站电影 +夏树亚矢电驴下载 +夕树舞子无码下载 +外国小姐包夜服务 +多位东热女优参演 +多名医生感染艾滋 +多情少妇上门服务 +夜店小姐特殊服务 +夜色激情在线观看 +夜色王朝综合论坛 +大3元娱乐城开户 +大6av午夜电影 +大6娱乐免费黄站 +大6娱乐最新黄站 +大6娱乐鹿城黄站 +大6温州鹿城黄站 +大6激情淫穴小说 +大专文凭出售qq +大叔我爱你txt +大哥需要增大jj +大学生上门性服务 +大富翁国际娱乐城 +大富豪国际娱乐城 +大泽kana无码 +大炕上的肉体联欢 +大玩家娱乐城开户 +大粗肉棒插入阴户 +大粗鸡巴插进小穴 +大肉棍干的好舒服 +大肉棒插入阴户内 +大肉茎插进小肉洞 +大胸mm床上诱惑 +大西洋线上娱乐城 +大赢家真人百家乐 +大连办高中毕业证 +大量供应间苯3酚 +大量出售各种假币 +大量批发手枪配件 +大阴唇夹着大龟头 +大马士革刀具批发 +大马士革猎刀专卖 +大马士革钢刀专卖 +大马士革钢刀批发 +大鸡吧插妹妹淫屄 +大鸡巴坚挺插淫穴 +大鸡巴抽插小骚穴 +大鸡巴紧紧的插穴 +大黑鹰弓弩具批发 +大黑鹰弩改装qq +大龟头在花心深处 +大龟头顶紧子宫口 +天上人间博彩网站 +天天乐娱乐城官网 +天安门广场上悲剧 +天生我材必有用2 +天衣美津迅雷下载 +太安炸药制作流程 +太恩炸药制作方法 +太恩炸药配制方法 +太阳城在线娱乐网 +太阳城娱乐城网站 +太阳城娱乐网投注 +夫妻交换乐园小说 +夫妻性爱视频自拍 +失贞的都市txt +奉节美女全套上门 +奥菜亚美bt下载 +女儿的阴道好大啊 +女儿的阴道好嫩啊 +女儿的阴道好紧啊 +女兵的呻吟txt +女医药代表水淋淋 +女士陪我旅游散心 +女大学生勇闯仕途 +女学生上门性服务 +女宝有偿送养qq +女宝有偿领养qq +女性数据专卖qq +女性数据供应qq +女性数据出售qq +女性数据提供qq +女教师レイプ轮奸 +女激情淫影片下载 +女王上门调教信息 +女秘书做爱吞精图 +她的小穴插了进去 +她的阴道乳房真美 +好大好硬好想射你 +好弟弟使劲干姐姐 +好心男士助我怀孕 +好爽好舒服小骚穴 +如何制作硝化甘油 +妈妈的阴道好紧啊 +妓女上门全套服务 +妓女上门包夜qq +妓女上门包夜信息 +妓女上门包夜服务 +妓女上门援交qq +妓女上门服务qq +妓女上门服务信息 +妓女上门电话信息 +妓女全套服务qq +妓女全套服务信息 +妓女包夜上门服务 +妓女包夜服务qq +妓女包夜服务电话 +妓女婊子上门服务 +妓女援交服务电话 +妓女日记小说下载 +妓女自拍做爱电影 +妹妹的小穴好紧啊 +妹妹的阴唇好大啊 +妹妹的阴唇好嫩啊 +妹妹的阴道好嫩啊 +妹妹的阴道好紧啊 +妻诱之情趣txt +姐姐的阴唇好大啊 +姐姐的阴户好嫩啊 +姐姐的阴道好嫩啊 +姐姐的阴道好紧啊 +姐弟淫乱还玩3p +姐都快被你搞死了 +姑妈的阴道好紧啊 +娇小鲜嫩的小屄洞 +娱乐城注册送38 +娱乐城真人博彩通 +婷婷成人激情淫洞 +婷婷成人激情网站 +婷婷激情成人裸聊 +嫂子的阴道好大啊 +嫩嫩小肉缝小肉穴 +嫩穴插干快插我吧 +嫩穴狂插直到痉挛 +子宫口吮吸着龟头 +学位证件办理qq +学妹上门援交qq +学妹上门援交信息 +学生兼职小姐服务 +学生妹妹特殊服务 +学生小妹上门服务 +学生爱国运动正名 +安乐死药批发qq +安乐死药直销qq +安卓卧底监听软件 +安徽庐江官员裸照 +安徽庐江艳照下载 +完全免费淫色电影 +官员夫妻高清艳照 +官员宾馆5p照片 +官员宾馆群p下载 +官员宾馆群p照片 +官员宾馆群p视频 +官员宾馆群p艳照 +官员艳照下载种子 +定计奸岳母txt +定额发票代开qq +定额发票出售qq +宫下杏奈bt下载 +家庭淫乱小说下载 +容贵国男性的性器 +寂寞少妇服务信息 +寂寞空姐丝袜上门 +富婆包养鸭子qq +富婆包养鸭子信息 +射进女儿的屁眼里 +小仓杏小仓杏全集 +小女花不弃txt +小妇人色站尼妇库 +小妹24小时服务 +小妹上门全套服务 +小妹援交服务qq +小姐上门做爱服务 +小姐上门全套qq +小姐上门全套服务 +小姐上门性交服务 +小姐上门服务qq +小姐上门服务性息 +小姐上门服务电话 +小姐全套包夜qq +小姐姐给你打1针 +小姐打炮全套服务 +小姐按摩保健电话 +小姐按摩服务信息 +小姐援交包夜电话 +小姐援交服务信息 +小姐援交服务电话 +小室友里无码下载 +小屄儿里又暖又紧 +小平真是1代伟人 +小池亚弥迅雷下载 +小浪穴插死人家了 +小穴被我操的红肿 +小穴被插的好爽啊 +少女免费激情电影 +少女嫩穴被插出血 +少女床上春色销魂 +少女的诱惑txt +少女艳星诱惑色图 +少妇上门援交服务 +少妇上门服务信息 +少妇人妻上门服务 +少妇兼职上门服务 +少妇包夜全套qq +少妇大穴vs驴吊 +少妇淫荡出水电影 +少妇白洁全集小说 +少妇白洁在线阅读 +少妇白洁小说下载 +少妇野外淫穴电影 +少年大宝合集下载 +少年阿宾小说下载 +尒婬荡纯鎺𫓽 +尼泊尔狗腿刀专卖 +尼泊尔狗腿刀批发 +屄儿好好爽好舒服 +屄爽死了嗯嗯快快 +岛津千秋电驴下载 +岛谷爱梨bt下载 +川村蓝子迅雷下载 +工字气枪专卖qq +工字气枪供应qq +工字气枪出售qq +工字气枪提供qq +工字气枪转让qq +工字气枪销售qq +工字汽枪直销qq +工字牌气枪结构图 +工字牌钢珠狗专卖 +工字牌钢珠狗供应 +工字牌钢珠狗出售 +工字牌钢珠狗批发 +工字牌钢珠狗提供 +工字牌钢珠狗订购 +工字牌钢珠狗购买 +工字狗粮买卖qq +左轮手枪供应qq +左轮手枪出售qq +左轮手枪提供qq +左轮手枪直销qq +左轮手枪转让qq +左轮手枪销售qq +左轮手狗出售qq +左轮手狗销售qq +市场专销进口气狗 +市场专销进口汽狗 +市长强奸案txt +帮人报仇联系qq +常盘优子迅雷下载 +干8个美女的小穴 +干meinv小穴 +干干我用力地干我 +干进她穴内的龟头 +幸田梨纱种子视频 +乡村如此多娇全本 +幼交乱伦qvod +幼男做爱妹妹做爱 +幽兰谷成人网视频 +广告发票代开qq +广州3箭气枪出售 +广州找按摩女服务 +广源桔子暴发柑蛆 +広瀬蓝子全集种子 +床下高冷床上放荡 +庐江不雅照片全集 +庐江书记群p照片 +庐江书记群p艳照 +庐江书记高清艳照 +庐江何婷婷群p照 +庐江县委书记艳照 +庐江县委书记裸照 +庐江县委群p照片 +庐江县淫乱照种子 +庐江县艳照门qq +庐江官员乌龙艳照 +庐江官员群p照片 +庐江官员群p艳照 +庐江宾馆群p照片 +庐江群p不雅照片 +庐江群p打包下载 +庐江艳照3p下载 +庐江艳照套图下载 +庐江艳照资源共享 +庐江艳照迅雷下载 +庐江裸照图片下载 +庐江裸照视频下载 +开山砍刀批发qq +开着摩托干了岳母 +开锁工具批发qq +开锁工具批发电话 +异世之风流大法师 +异黄樟素销售qq +弓弩专卖货到付款 +弓弩制作方法qq +弓月杏里迅雷下载 +弟弟淫奸姐姐论坛 +弟弟淫奸熟睡姐姐 +弟弟的肉棒好大啊 +弟弟的肉棒好硬啊 +弟弟的肉棒好长啊 +张学兵不如1条狗 +张祖桦被短暂拘留 +弩的最简制作方法 +弩的制作图纸qq +弩的制作方法qq +弹簧刀具专卖qq +弹簧刀具出售qq +弹簧刀具销售qq +强奸5部曲txt +强奸大奶嫩逼美女 +强奸轮奸美女视频 +强开工具批发qq +强烈抗议中共当局 +当面交易会计师证 +当面交易假军官证 +当面交易假户口本 +当面交易假结婚证 +当面交易假身份证 +当面交易军车套牌 +当面交易国外文凭 +当面交易学历证书 +当面交易毕业文凭 +当面交易毕业证书 +当面交易资质证书 +当面交易车辆牌照 +彩名杏子迅雷下载 +德国博克军刀专卖 +快到高潮时他哭了 +快播免费成人电影 +快播成人高清电影 +快播色情种子下载 +快播黄色电影网站 +快速代办假证qq +快速办理假身份证 +快速办理学历证书 +快速办证刻章qq +怎样免费看淫电影 +急约救火男女荟萃 +急聘兼职文字录入 +性事奇趣录之阉夫 +性交游戏在线下载 +性吧有你春暖花开 +性爱游戏在线下载 +性爱激情小说下载 +性爱色情视频下载 +性爱调教园txt +恐怖分子傻瓜手册 +恶夫最里的小樱桃 +情色图片成人小说 +情色导航成人电影 +情色导航激情爽电 +情色电影注册观看 +情色美眉娱乐社区 +想玩刺激联系薇信 +想看直播啪啪啪吗 +想要女人的温纯吗 +慢性毒药专卖qq +慢性毒药批发qq +慢性毒药直销qq +戈博军刀专卖qq +成人18免费电影 +成人av亚洲影院 +成人av欧美影院 +成人av电影下载 +成人av视频下载 +成人av黄色电影 +成人a片在线观看 +成人亚洲av影院 +成人免费性交电影 +成人免费电影快播 +成人动画下载qq +成人午夜激情电影 +成人午夜激情视频 +成人在线激情聊天 +成人在线电影地址 +成人在线网页游戏 +成人小说sm做爱 +成人影片下载地址 +成人影片下载网址 +成人影片种子下载 +成人影院yy频道 +成人影院激情影院 +成人性交录像下载 +成人性交视频下载 +成人性爱录像下载 +成人情色小说下载 +成人情色小说论坛 +成人情色论坛导航 +成人收费裸聊qq +成人无码qvod +成人无码电影下载 +成人有声小说下载 +成人欧美av影院 +成人漫画免费下载 +成人激情在线电影 +成人激情性爱电影 +成人激情淫洞网站 +成人激情淫穴影院 +成人激情电影下载 +成人激情电影通道 +成人激情视频交友 +成人激情视频聊天 +成人激情网5月天 +成人激情网站大全 +成人激情聊天网站 +成人激情色情电影 +成人激情色情视频 +成人激情裸聊qq +成人激情裸聊网站 +成人激情论坛导航 +成人熟女乱伦电影 +成人电影bt下载 +成人电影wang +成人电影下载qq +成人电影下载种子 +成人电影下载网址 +成人电影下载网站 +成人电影在线地址 +成人电影在线播放 +成人电影在线网址 +成人电影在线网站 +成人电影在线观看 +成人电影种子下载 +成人电影网址大全 +成人电影观看地址 +成人视频bt种子 +成人视频下载qq +成人视频祼聊qq +成人视频聊天网站 +成人视频裸聊qq +成人网络游戏下载 +成人网页游戏下载 +成人色情乱伦影院 +成人色情午夜激情 +成人色情小说下载 +成人色情游戏地址 +成人色情电影下载 +成人裸体聊天qq +成人裸聊在线视频 +成人裸聊视频qq +成人高清电影下载 +成人高考考前答案 +成人黄色3级网站 +成人黄色电影网站 +我们服务对象就是 +我们的推荐不会差 +我和2姨在车上舔 +我和jiejie +我和僵尸有个约会 +我和姐姐的淫乱史 +我在花丛中的日子 +我宁愿你虐我到底 +我扒开了她的阴道 +我是帮爸爸征婚的 +我是网购达人小懒 +我是菜市我是菜市 +我淫我色淫色导航 +我爱你亚洲妹社区 +我的v信是paj +我的根比别人的大 +我要搞点hh的试 +战术军刀出售qq +战术军刀提供qq +战术军刀销售qq +战术折刀供应qq +战术折刀批发qq +战术折刀提供qq +战术折刀订购qq +战术直刀出售qq +战术直刀销售qq +户外军刀批发qq +户外军刀销售qq +户外刀具专卖qq +户外刀具买卖qq +户外刀具出售qq +户外刀具批发qq +户外刀具直销qq +户外刀具转让qq +户外刀具销售qq +户外砍刀供应qq +户外砍刀出售qq +户外砍刀批发qq +户外砍刀提供qq +手qiang价格 +手qiang出售 +手qiang销售 +手工猎刀户外刀具 +手把你制作原子弹 +手把手教你做炸弹 +手把手教做tnt +手拉短狗销售qq +手指插的进小淫穴 +手指用力扣进小穴 +手握住我的大肉棒 +手教你制作原子弹 +手机x卧底专业版 +手机x卧底增强版 +手机x卧底改良版 +手机x卧底破解版 +手机卧底下载qq +手机卧底安装下载 +手机卧底软件下载 +手机卧底软件专卖 +手机卧底软件供应 +手机卧底软件出售 +手机卧底软件提供 +手机卧底软件网站 +手机卧底间谍官网 +手机注册激情网站 +手机激情淫色网址 +手机监听定位qq +手机监听淘宝交易 +手机监听软件专卖 +手机监听软件供应 +手机监听软件出售 +手机监听软件卧底 +手机监听软件提供 +手机监听软件订购 +手机窃听软件下载 +手机窃听软件供应 +手机窃听软件出售 +手机远程卧底淘宝 +手机间谍软件出售 +手枪买卖自制手枪 +手枪出售联系电话 +手枪子弹供应qq +手枪子弹提供qq +手枪子弹订购qq +手枪式折叠三用弩 +手枪的分解与合成 +手枪的参数示意图 +手枪配件专卖qq +手枪配件供应qq +手枪配件出售qq +手枪配件批发qq +手枪配件提供qq +手枪配件销售qq +手槍买卖自制手枪 +打炮包夜服务qq +打炮援交服务qq +打鸟枪专卖店qq +打鸟气枪销售qq +打鸟汽枪出售qq +打鸟汽枪转让qq +批发1代假身份证 +批发1元硬币模具 +批发2代假身份证 +批发3唑仑片qq +批发3棱军刀qq +批发3棱刀具qq +批发3棱刮刀qq +批发3棱刺刀qq +批发3箭汽枪qq +批发54式手木仓 +批发54式气木仓 +批发54手枪qq +批发64式手木仓 +批发64式气木仓 +批发64手狗qq +批发77式手木仓 +批发77式气木仓 +批发92式手木仓 +批发92式气木仓 +批发awp气步枪 +批发ghb水配方 +批发ghb迷情水 +批发gηb迷情水 +批发happy水 +批发lsd迷幻药 +批发万能开锁工具 +批发万能开锁钥匙 +批发仿真军刺qq +批发仿真手枪qq +批发仿真汽枪qq +批发仿真沙鹰子弹 +批发供应甲卡西酮 +批发供应间苯3酚 +批发信用卡复制器 +批发假1代身份证 +批发假2代身份证 +批发假人民币qq +批发催情药水qq +批发兰博刀具qq +批发军用刺刀qq +批发军用匕首qq +批发军用手枪qq +批发单管猎枪qq +批发卧底监控软件 +批发原装秃鹰qq +批发双刃尖刀qq +批发双管猎枪qq +批发口香糖型春药 +批发口香糖型迷药 +批发台版假币qq +批发台版高仿假币 +批发各种军用子弹 +批发听话药水qq +批发喷雾迷药qq +批发国产秃鹰qq +批发女性数据qq +批发工字牌钢珠狗 +批发左轮手枪qq +批发开刃匕首qq +批发战术折刀qq +批发户外刀具qq +批发户外砍刀qq +批发手机监听软件 +批发手机窃听软件 +批发拍肩型迷魂粉 +批发拍肩迷药qq +批发朝版假人民币 +批发朝鲜版人民币 +批发枪支配件qq +批发枸橼酸芬太尼 +批发气枪铅弹qq +批发氯甲酸氯甲酯 +批发求生刀具qq +批发汽枪子弹qq +批发汽枪配件qq +批发汽枪铅弹qq +批发烟花爆竹qq +批发牙签果子qq +批发狙击步狗qq +批发狩猎气枪qq +批发猎枪铅弹qq +批发猎豹弓弩qq +批发甲卡西酮qq +批发甲基安非他命 +批发甲氰菊酯qq +批发甲藻毒素qq +批发白冰麻果qq +批发白黄牙签qq +批发破氧毒素qq +批发硝甲西泮qq +批发秃鹰套件qq +批发秃鹰汽枪qq +批发秃鹰配件qq +批发窃听手机软件 +批发精仿3棱军刺 +批发精仿56军刺 +批发精仿开山砍刀 +批发精仿手工猎刀 +批发精仿蝴蝶甩刀 +批发精仿野营军刀 +批发精仿野营手斧 +批发美国卡巴军刀 +批发虎头猎枪qq +批发蝴蝶甩刀qq +批发蝴蝶跳刀qq +批发警用电棍电话 +批发赭曲毒素qq +批发赵氏弓弩qq +批发超高压电警棍 +批发身份证生成器 +批发进口汽枪qq +批发进口汽狗qq +批发迷奸药丸qq +批发迷奸药水qq +批发迷幻蘑菇qq +批发迷情药水qq +批发迷魂药水qq +批发迷魂香烟qq +批发野营军刀qq +批发野营刀具qq +批发金属气枪qq +批发金弓电狗qq +批发钢珠气枪qq +批发铅弹汽枪qq +批发银行卡复制器 +批发银行卡读卡器 +批发高仿人皮面具 +批发高仿假人民币 +批发高仿假币qq +批发高仿假钞qq +批发高仿假钱qq +批发高仿军刺qq +批发高仿手枪qq +批发高仿气枪qq +批发高仿真人民币 +批发高压气枪配件 +批发高压汽枪qq +批发麦角酸2乙胺 +批发麻古配方qq +批发麻果白冰猪肉 +批发黄曲霉素qq +批发黄白牙签qq +批发黄白牙签电话 +批林整风参考材料 +批量高仿警服出售 +找大学生全套服务 +找学生妹上门服务 +找学生妹包夜电话 +找小女姐全套服务 +找援交妹手机qq +找长期或短期情人 +技术开锁工具批发 +把舌头伸入姐姐的 +把阴户内塞得满满 +折叠军刺供应qq +折叠军刺出售qq +折叠军刺销售qq +护士小穴空姐小穴 +护士掰开阴道插b +抽叉jiejie +抽插著阿姨的淫穴 +拉萨僧人接连抗议 +拍肩型迷魂粉qq +拍肩型迷魂粉供应 +拍肩型迷魂粉出售 +拍肩型迷魂粉订购 +拍肩型迷魂粉购买 +拍肩粉拍肩迷魂药 +拍肩迷药专售qq +拍肩迷药供应qq +拍肩迷药出售qq +拍肩迷药批发qq +拍肩迷药提供qq +拍肩迷药直销qq +拍肩迷药订购qq +拍肩迷药购买qq +拍肩迷药销售qq +拿着鸡巴对准小穴 +按摩小姐口交服务 +挥发型迷晕药销售 +挺动阿姨雪白肥臂 +挺着硬梆梆的肉棒 +挺送肉棒激烈撞击 +换夫妻txt在线 +换妻俱乐部yy群 +换妻群交qvod +推翻社会主义制度 +提供1手女性数据 +提供3棱军刀qq +提供3棱军刺qq +提供3棱刀具qq +提供3棱刮刀qq +提供3箭汽枪qq +提供45mm狗粮 +提供54式手木仓 +提供54式气木仓 +提供54手枪qq +提供54手枪子弹 +提供64式手木仓 +提供64式气木仓 +提供77式手木仓 +提供77式气木仓 +提供92式手木仓 +提供92式气木仓 +提供awp气步枪 +提供cp99汽枪 +提供ghb水qq +提供ghb水配方 +提供ghb迷情水 +提供k粉制作技术 +提供lqb362 +提供lsd迷幻药 +提供万能开锁钥匙 +提供上海工字气枪 +提供上门口交服务 +提供上门性交服务 +提供上门援交服务 +提供上门爱爱服务 +提供专业杀手qq +提供中握套件qq +提供中考考前答案 +提供亚硝酸胺qq +提供仿真军刺qq +提供仿真手枪qq +提供仿真枪械qq +提供仿真枪模qq +提供仿真气枪qq +提供仿真汽枪qq +提供假人民币qq +提供催情药水qq +提供免费裸体聊天 +提供兰博刀具qq +提供军人证件qq +提供军品刺刀qq +提供军用刺刀qq +提供军用匕首qq +提供军用弓弩qq +提供军用手枪qq +提供军用枪支qq +提供冰毒原料qq +提供冰毒技术qq +提供出售双管猎枪 +提供制作麻古原料 +提供包夜全套服务 +提供单管猎枪qq +提供博士学历qq +提供双刃尖刀qq +提供双管猎枪qq +提供台湾秃鹰qq +提供各种制毒工具 +提供听话药水qq +提供喷雾迷药qq +提供国产秃鹰qq +提供国外文凭qq +提供地税发票qq +提供处女上门qq +提供太安炸药qq +提供女性数据qq +提供娥眉气枪qq +提供安乐药物qq +提供小姐性息qq +提供尼2氢可待因 +提供工字气枪qq +提供工字牌钢珠狗 +提供左轮手枪qq +提供左轮牌钢珠狗 +提供平式双管猎枪 +提供幼女上门服务 +提供广州3箭气枪 +提供战术折刀qq +提供户外军刀qq +提供户外砍刀qq +提供手机卧底下载 +提供手机卧底软件 +提供手机监听软件 +提供手机窃听软件 +提供手枪配件qq +提供打鸟汽枪qq +提供拍肩型迷魂粉 +提供拍肩迷药qq +提供援交服务qq +提供有偿捐肾qq +提供有偿肾源qq +提供杀手服务qq +提供枪支配件qq +提供枸橼酸芬太尼 +提供正品军刺qq +提供步qiang +提供步枪子弹qq +提供步枪配件qq +提供气枪铅弹模具 +提供氟乙酸钠qq +提供汽枪子弹qq +提供汽枪配件qq +提供汽枪铅弹qq +提供港38式左轮 +提供激情裸聊qq +提供激情裸聊服务 +提供激情陪聊qq +提供火药配方比例 +提供狙击步狗qq +提供狙击气枪qq +提供狩猎气枪qq +提供猎枪制造图纸 +提供猎枪子弹qq +提供猎枪铅弹qq +提供猎豹弓弩qq +提供甲卡西酮qq +提供甲基安非他命 +提供甲基甲卡西酮 +提供百元假币qq +提供秃鹰套件qq +提供秃鹰气枪qq +提供秃鹰汽枪qq +提供秃鹰狙击气枪 +提供窃听手机软件 +提供立式双管猎枪 +提供线上真人轮盘 +提供美国卡巴军刀 +提供美国秃鹰汽枪 +提供美女裸聊服务 +提供考前答案qq +提供肾源信息qq +提供色情服务qq +提供英国骚本qq +提供英国骚本气枪 +提供英语等级证书 +提供虎头猎枪qq +提供蝴蝶甩刀qq +提供蝴蝶跳刀qq +提供裸体聊天服务 +提供警用棍刀qq +提供赵氏弓弩qq +提供进口弓弩qq +提供进口气枪qq +提供进口汽狗qq +提供进口秃鹰qq +提供迷奸药水qq +提供迷幻药物qq +提供迷幻蘑菇qq +提供迷情药水qq +提供迷魂药水qq +提供迷魂香烟qq +提供野营刀具qq +提供金属仿真汽枪 +提供金属气枪qq +提供金弓电狗qq +提供钢珠弓弩qq +提供钢珠汽枪qq +提供钻石冰毒qq +提供铅弹汽枪qq +提供阿普唑仑qq +提供隐形作弊耳机 +提供飞行员飞叶子 +提供香港ghb水 +提供高仿64手枪 +提供高仿假币qq +提供高仿假钞qq +提供高仿军刺qq +提供高仿学位证书 +提供高仿气枪qq +提供高仿汽枪qq +提供高仿真人民币 +提供高仿硬币qq +提供高仿纸币qq +提供高仿警服qq +提供高仿钞票qq +提供麻古配方qq +提供麻果丸子qq +插meimei图 +插入妈妈的穴好爽 +插在小穴里的肉棒 +插小穴妹妹直流水 +插的小穴都流水了 +插进少女粉红阴道 +援交上门服务qq +援交全套服务qq +援交包夜妹妹qq +援交女上门性服务 +援交女包夜性服务 +援交妹上门性服务 +援交妹妹服务qq +援交妹服务tel +援交小妹上门服务 +援交小妹包夜qq +援交小妹包夜服务 +援交小妹服务qq +援交小妹服务信息 +援交小姐上门包夜 +援交小姐上门电话 +援交小姐全套qq +援交小姐包夜qq +援交小姐包夜服务 +援交小姐包夜电话 +援交小姐手机qq +援交小姐服务qq +援交打炮妹妹qq +援交美女服务qq +援助交际服务电话 +操魂师之美眉天下 +攀上女领导txt +收奶员的真情告白 +收费视频美女裸聊 +改号软件直销qq +放线菌酮供应qq +政府不欠你们的钱 +政府说为人民服务 +效率高美女佳丽多 +救房市的集体官员 +教你如何延迟射精 +教你怎样延迟射精 +整个龟头插入小穴 +新7擒7纵7色狼 +新世纪娱乐城赌博 +新东泰娱乐城开户 +新农夫色网址联盟 +新山爱里电驴下载 +新康泰克提炼冰毒 +新澳门娱乐城开户 +新澳门娱乐城赌博 +新版假币出售qq +新版假币销售qq +新葡京国际娱乐城 +新金瓶梅下载地址 +新金瓶梅迅雷下载 +新闻总署态度蛮横 +无码成人影院qq +无码成人电影qq +无码成人电影下载 +无码黄片种子qq +无限暧昧迷药喷剂 +日本18淫电影网 +日本avbt下载 +日本av情色电影 +日本av成人影院 +日本av色情下载 +日本gv资源下载 +日本meimei +日本mm色比图吧 +日本最新av电影 +日本女优激情电影 +日本姐弟乱伦小说 +日本性爱片在线看 +日本情色无码光碟 +日本成人动漫下载 +日本成人激情影院 +日本成人激情淫穴 +日本成人激情电影 +日本成人激情短片 +日本成人激情网站 +日本成人激情论坛 +日本成人网页游戏 +日本成人高清影视 +日本无码av种子 +日本无码bt下载 +日本无码成人电影 +日本无码系列合集 +日本淫色动画贴图 +日本激情成人乱伦 +日本激情淫穴电影 +日本激情淫穴网站 +日本激情淫穴贴图 +日本激情淫色下载 +日本激情淫色影院 +日本激情淫色文章 +日本激情淫色视屏 +日本激情淫色贴图 +日本激情漫画贴图 +日本色情网址大全 +日本高清a片下载 +日本高清a片专区 +日本高清性爱视频 +日本高清情色下载 +日本黄色3级短片 +日韩av午夜电影 +日韩av电影下载 +日韩免费午夜电影 +日韩免费成人电影 +日韩妹妹嫩穴淫图 +日韩少女初夜爽片 +日韩成人激情电影 +昆明3夫妻不雅照 +昆明3对夫妻换妻 +昆明夫妻聚会裸照 +明升m88娱乐城 +星光伴我淫txt +星期8娱乐城官网 +星期8娱乐城网站 +星野杏里bt下载 +星野绫香电驴下载 +春暖花开性吧地址 +春色满园淫妻系列 +普通发票代开qq +智取小姨子txt +智能手机卧底淘宝 +暴力开锁出售qq +暴力开锁工具销售 +曾道人6合彩公司 +有偿供应肾源qq +有偿抱养女婴qq +有偿抱养男婴qq +有偿捐献肾脏qq +有偿提供肾源qq +有偿收养女宝qq +有偿收养男宝qq +有偿送养男婴qq +有关部门也是人妖 +有声性爱小说下载 +有老婆做我的情人 +朝冈实岭无码下载 +朝美穗香种子下载 +朝鲜假钱批发qq +朝鲜假钱批发电话 +朝鲜版人民币批发 +期出售手枪气枪猎 +本来就是毛邓社会 +机打发票代开qq +机打发票出售qq +来回去舐她的小穴 +杨野的禁脔txt +极品成人a片无码 +极品成人激情影院 +极品成人电影下载 +极品色医全文阅读 +杭州小姐援交信息 +林心如被疯狂轮奸 +枪支3d图纸下载 +枪支3d塑料图纸 +枪支弹药出售qq +枪支配件出售qq +枪支配件销售qq +枸橼酸芬太尼供应 +枸橼酸芬太尼批发 +枸橼酸芬太尼提供 +枸橼酸芬太尼直销 +枸橼酸芬太尼销售 +柔软红嫩的小阴唇 +树麻里子无码下载 +桑拿小姐服务电话 +梦中的女孩txt +梧州约我交友中心 +棒插到妈妈的穴里 +森林之狼弓弩专卖 +楼凤良家兼职信息 +模特上门援交qq +樱井彩美bt下载 +樱树露衣无码下载 +欢迎加微信公众号 +欧洲无码av下载 +欧洲极品性交图片 +欧美av午夜电影 +欧美av成人影院 +欧美av电影下载 +欧美sm视频下载 +欧美两性淫乱图片 +欧美尤物炮图图库 +欧美性交色图套图 +欧美成人av影视 +欧美成人av影院 +欧美成人av网站 +欧美成人图片下载 +欧美成人激情网站 +欧美成人电影下载 +欧美成人黄色电影 +欧美淫色贴图网址 +欧美激情性爱视频 +欧美激情成人电影 +欧美激情淫色下载 +欧美激情淫色贴图 +欧美色情电影视频 +欧美色情电影网址 +欧美色情种子下载 +欧美色情网址大全 +欧美高清a片下载 +欧美高清a片专区 +正品m9军刀专卖 +正品军刀户外刀具 +正规住宿发票代开 +正规医院收肾qq +正规发票代开qq +步qiang出售 +步qiang销售 +步枪子弹供应qq +步枪子弹提供qq +步枪子弹订购qq +武侠情色小说下载 +武汉mm上门服务 +残忍老爸玩我小穴 +比利时人的性生活 +毕业证书专卖qq +毛东突暴动和独立 +毛伟人主政41年 +毛太阳惊世豪言录 +毛时代大饥荒揭秘 +毛着力于夺取政权 +民办大学真实学历 +民族弩的制作方法 +气gou专卖qq +气枪价格仿真气枪 +气枪子弹专卖qq +气枪子弹出售qq +气枪的制造结构图 +气枪购买气枪组装 +气枪配件出售qq +气枪配件提供qq +气枪配件销售qq +气枪铅弹专卖qq +气枪铅弹出售qq +气枪铅弹批发qq +气枪铅弹提供qq +气枪铅弹模具提供 +气枪铅弹模具销售 +气枪铅弹直销qq +气枪铅弹销售qq +气步枪结构图qq +气狗出售进口气狗 +氟乙酸钠供应qq +氢弹手工制作方法 +氯甲酸氯甲酯供应 +氯甲酸氯甲酯批发 +氯甲酸氯甲酯直销 +氯甲酸氯甲酯销售 +氯胺酮海洛因出售 +氰化银钾订购qq +水岛爱奈迅雷下载 +永利博线上娱乐城 +永利高足球博彩网 +永利高足球投注网 +求你插插我吧好痒 +江湖淫娘小说下载 +江西邓毛谢古事件 +汽gou出售qq +汽gou销售qq +汽枪配件供应qq +汽枪配件出售qq +汽枪配件在线销售 +汽枪配件批发qq +汽枪配件直销qq +汽枪配件购买qq +汽枪配件销售qq +汽枪铅弹供应qq +汽枪铅弹出售qq +汽枪铅弹批发qq +汽枪铅弹销售qq +汽油燃烧弹diy +汽油燃烧瓶diy +汽车开锁工具批发 +汽车炸弹制作方法 +沙漠之鹰出售qq +沙漠之鹰销售qq +法lungong +法光照耀快快回家 +波多野结百度图片 +波多野结衣的情人 +泽田杏奈迅雷下载 +洞洞淫水清晰大图 +派嫦娥1号送我来 +流氓风流录txt +济南找兼职学生妹 +浪女自慰诱惑你操 +海南小姐上门服务 +海洛因的制作方法 +液体炸弹制作教程 +液体炸弹制作方法 +液体炸弹制作配方 +液体炸弹当面交易 +液体炸弹配制方法 +液体炸药制作方法 +淘宝气枪货到付款 +淫乐红楼梦txt +淫乱大家庭txt +淫乱小说在线阅读 +淫乱护士激情电影 +淫乱激情电影网站 +淫乱电影下载网址 +淫兽学园电影下载 +淫兽调教传txt +淫叫小穴肉棒插进 +淫图淫片全部免费 +淫女淫图淫书淫片 +淫女电影片段试看 +淫奸jiejie +淫奸meinv穴 +淫奸处女电影论坛 +淫奸妹妹电影论坛 +淫奸护士电影试看 +淫奸黄色电影a片 +淫妻罗曼史txt +淫术炼金士txt +淫民欧美激情贴图 +淫民激情文学图库 +淫液顺着肉洞流下 +淫秽小说在线阅读 +淫秽男女激情淫乱 +淫穴大鸡巴干好爽 +淫色bt娱乐导航 +淫色小说在线阅读 +淫色成人网址导航 +淫荡av激情电影 +淫荡女优放荡插逼 +淫荡好舒服用力干 +淫荡娇妻打开双腿 +淫荡家族群体性交 +淫荡少妇好色老师 +淫荡少妇露逼自拍 +淫荡的老师吕安妮 +淫荡肛交妹自慰器 +淫贱妹妹贴图论坛 +淫魔舞会电影下载 +深圳亮女情人会所 +深圳兼职妹妹上门 +深圳小姐上门服务 +深圳红印户口咨询 +深圳美女上门服务 +深夜隔壁在呻吟你 +混蛋神风流史下载 +清纯唯美乱伦熟女 +清纯妹妹出台包夜 +温jia周恩来宝 +温切斯特气枪供应 +温切斯特气枪出售 +温切斯特气枪批发 +温切斯特气枪订购 +温切斯特气枪购买 +温切斯特气枪转让 +温切斯特气枪销售 +温切斯特气枪预定 +温州娱乐鹿城黄站 +港澳成人午夜激情 +溴氰菊酯供应qq +漂亮妹妹上门包夜 +澳门新世纪娱乐城 +激情shipin +激情叫床视频下载 +激情小说迅雷下载 +激情成人影片下载 +激情成人桃色电影 +激情成人网络电视 +激情淫咪咪贴图区 +激情淫色合成贴图 +激情淫色文章网站 +激情淫色文章论坛 +激情淫色漫画论坛 +激情淫色网站导航 +激情淫色贴图导航 +激情淫色贴图网址 +激情淫色贴图论坛 +激情电影在线注册 +激情电影在线观看 +激情真人在线裸聊 +激情真人捰聊视频 +激情真人裸聊qq +激情视频聊天服务 +激情视频聊天论坛 +激情视频表演qq +激情视频裸聊qq +激情视频裸聊在线 +激情视频裸聊服务 +激情美女上门服务 +激情美女爽图多多 +激情美女脱衣视频 +激情美女裸聊qq +激情肛交迅雷下载 +激情色情小说下载 +激情裸聊性爱电影 +激情裸聊服务qq +激情裸聊视频qq +激情裸聊网站qq +激情裸聊美女qq +激情解码两性电影 +濑户由衣无码下载 +火药制作简易炸弹 +炸药制作完全手册 +炸药制作方法qq +炸药制作流程qq +炸药制造生产工艺 +炸药及其制造方法 +炸药硝酸甘油制法 +烟花爆竹批发qq +烟花鞭炮专卖qq +烟雾弹的制作方法 +燃烧剂的简易制作 +燃烧剂的简易制备 +燃烧弹的制作方法 +燃烧弹的制作过程 +燃烧瓶diy方法 +燃烧瓶的制作方法 +爆破和杀伤燃烧弹 +爱上少妇小镇情人 +爱上师娘的床全文 +爱博彩到天上人间 +爱喜免费成人电影 +爱神之传奇txt +父女激情淫色文章 +牙齿轻咬他的龟头 +物流数据批发qq +狂插meinv穴 +狂插儿媳妇的阴道 +狂插处女穴淫水流 +狂插处女血流不止 +狂插妹妹穴淫水流 +狂插嫩穴浪穴骚穴 +狂插少女的嫩bb +狂插日本美女护士 +狂插淫洞明星阴穴 +狂插美女护士小说 +狂舔少妇两腿之间 +狙击步狗供应qq +狙击步狗批发qq +狙击步狗提供qq +狙击步狗直销qq +狙击步狗订购qq +狙击步狗购买qq +狙击气枪出售qq +狙击汽枪供应qq +狙击汽枪出售qq +狩猎器材弓弩专卖 +狩猎弓弩专卖qq +狩猎弓弩供应qq +狩猎弓弩出售qq +狩猎弓弩批发qq +狩猎弓弩提供qq +狩猎气枪专卖qq +狩猎气枪供应qq +狩猎气枪出售qq +狩猎气狗专卖qq +狼族淫色群交蜜穴 +猎qiang专卖 +猎qiang出售 +猎qiang销售 +猎枪子弹供应qq +猎枪子弹底火专卖 +猎枪子弹提供qq +猎枪子弹订购qq +猎枪的制造结构图 +猎枪麻醉枪钢珠枪 +猎豹弓弩专卖qq +猎豹弓弩供应qq +猎豹弓弩出售qq +猎豹弓弩批发qq +猎豹弓弩提供qq +猎豹弓弩直销qq +猎豹弓弩订购qq +猎豹弓弩销售qq +猛力的抽送大肉棒 +猪肉白冰出售qq +猪肉纯冰销售qq +猫眼开锁工具批发 +玉蒲团之偷情宝鉴 +玉蒲团之官人我要 +玉蒲团之玉女心经 +玉蒲园淫书淫图射 +王子淫传小说下载 +王民生3p性爱照 +王民生6p门下载 +王民生宾馆玩群p +王民生黄色性爱照 +玩弄她的骚屄嫩肉 +玩澳门时时彩的加 +现代艳帝传奇下载 +现场做爱偷拍电影 +现场直播夫妻床事 +现金赌钱游戏平台 +用力操舒服死我吧 +用力狂插骚穴好爽 +用手指玩弄着阴户 +用舌尖插着阴道口 +甲卡西酮专卖qq +甲卡西酮买卖qq +甲卡西酮供应qq +甲卡西酮批发qq +甲卡西酮提供qq +甲卡西酮直销qq +甲卡西酮订购qq +甲卡西酮购买qq +甲卡西酮送货上门 +甲基安非他命专卖 +甲基安非他命买卖 +甲基安非他命出售 +甲基安非他命提供 +甲基安非他命购买 +甲基安非他命销售 +甲基甲卡西酮出售 +甲基甲卡西酮销售 +甲基苯丙胺供应商 +甲基苯丙胺的制作 +甲氰菊酯批发qq +甲硝西泮出售qq +电话出售1元硬币 +电话出售高仿假币 +电话批发台版假钞 +电话批发朝鲜假钞 +电话批发朝鲜假钱 +电车痴汉视频下载 +电雷管的制作方法 +男人看的猛爽电影 +男人若妻梦交下载 +男女婴幼儿童服装 +男妓上门服务qq +男宝有偿送养qq +男根增长sex吧 +男足缩头乌龟为耻 +番木鳖碱供应qq +疯狂抽插她的小穴 +疯狂掠夺大6股民 +疯狂的缠绵txt +癫马女郎之1夜情 +白嫩meinv穴 +白石日和无码下载 +白领女士交友会馆 +白领少妇上门服务 +百乐门线上娱乐城 +百元假钞出售qq +百元假钞销售qq +百家乐平台下注网 +百家博国际娱乐城 +百家博娱乐城赌博 +百家性大型黄色站 +百纳成人激情影院 +百胜亚洲网络赌场 +皇上借我沟引1下 +皇冠国际现金投注 +皇冠在线投注qq +皇冠正网平台出租 +皇冠现金网娱乐城 +皇冠赌球投注qq +皇冠足球投注平台 +皇冠金公主娱乐城 +盐酸伪麻黄碱供应 +盐酸伪麻黄碱出售 +盐酸伪麻黄碱销售 +盐酸吗啡出售qq +盐酸吗啡销售qq +盐酸羟亚胺批发q +监听软件下载qq +盗摄女子公共澡堂 +直销1元硬币qq +直销3棱军刺qq +直销3棱刮刀qq +直销3箭汽枪qq +直销45mm狗粮 +直销54式气木仓 +直销54手枪qq +直销64式气木仓 +直销77式气木仓 +直销ghb迷情水 +直销gηb迷情水 +直销lsd迷幻药 +直销万能开锁工具 +直销仿真假钱qq +直销仿真手枪qq +直销仿真汽枪qq +直销仿真警服qq +直销假人民币qq +直销催情药水qq +直销兰博刀具qq +直销军品刺刀qq +直销军用刺刀qq +直销军用匕首qq +直销军用弓弩qq +直销军用手枪qq +直销军用猎刀qq +直销北朝鲜冰qq +直销台湾秃鹰qq +直销听话药水qq +直销喷雾迷药qq +直销国产汽枪qq +直销国产秃鹰qq +直销工字气枪配件 +直销工字汽枪qq +直销左轮手枪qq +直销手机监控软件 +直销拍肩型迷魂粉 +直销拍肩迷药qq +直销枪支配件qq +直销枸橼酸芬太尼 +直销气枪铅弹qq +直销氯甲酸氯甲酯 +直销汽枪0件qq +直销温切斯特气枪 +直销狙击步狗qq +直销狙击汽枪qq +直销猎豹弓弩qq +直销甲卡西酮qq +直销硝甲西泮qq +直销秃鹰汽枪qq +直销立式双管猎枪 +直销美国卡巴军刀 +直销考试作弊器材 +直销警察手铐qq +直销警用电棍qq +直销警用设备qq +直销赵氏弓弩qq +直销赵氏弩弓qq +直销进口气枪qq +直销进口汽枪qq +直销进口汽狗qq +直销进口秃鹰qq +直销迷奸药丸qq +直销迷奸药水qq +直销迷幻药水qq +直销迷幻蘑菇qq +直销迷情ghb水 +直销迷情药水qq +直销迷昏药水qq +直销迷魂药水qq +直销迷魂香烟qq +直销金属气枪qq +直销金弓电狗qq +直销钢珠汽枪qq +直销钻石冰糖qq +直销骚本汽枪qq +直销高仿假人民币 +直销高仿假钱qq +直销高仿气枪qq +直销高仿汽枪qq +直销高假仿人民币 +直销高压汽枪qq +直销麻古果子qq +看完保证你打飞机 +看着有点舍不得操 +真人888娱乐场 +真人博彩游戏代理 +真人博彩游戏平台 +真人在线裸聊qq +真人性爱现场直播 +真人性爱高清直播 +真人激情视频qq +真人激情视频裸聊 +真人激情裸聊qq +真人激情裸聊视频 +真人百家乐博彩网 +真人真钱赌球下注 +真人视频做爱qq +真人视频祼聊qq +真人视频聊天qq +真人视频聊天交友 +真人视频裸体聊天 +真人视频裸聊qq +真人美女luo聊 +真人自拍视频要吗 +真人裸体视频聊天 +真人裸体陪聊qq +真人裸聊网站qq +真人骚r女自m慰 +真钱博彩在线投注 +真钱博彩赌博qq +真钱棋牌游戏qq +真钱百利宫娱乐城 +短篇色情小说下载 +石川爱理无码全集 +砍刀匕首专卖qq +砍刀精品折刀专卖 +破氧毒素批发qq +硕士考前答案qq +硝化甘油配制过程 +硝化甘油铝热炸药 +硝胺炸药出售qq +硝酸炸药制作配方 +硝酸甘油炸药制作 +硝酸甘油炸药制造 +硝酸胺炸药的制作 +硝铵炸药制作方法 +硫酸亚铊供应qq +碳酸亚铊供应qq +视频luo聊qq +视频做爱聊天qq +视频真人裸体聊天 +视频裸体聊天qq +神舟是花瓶的洋奴 +私售5连发猎l枪 +私售港38式左轮 +私售秃鹰汽枪qq +私售秃鹰汽枪订购 +私售美国秃鹰电话 +私售虎头双管qq +私售虎头双管制造 +私售虎头双管图纸 +私售虎头猎枪qq +私售虎头猎枪订购 +秃鹰套件专卖qq +秃鹰套件批发qq +秃鹰气枪专卖网点 +秃鹰气枪出售qq +秃鹰气枪提供qq +秃鹰气枪货到付款 +秃鹰汽枪专卖qq +秃鹰汽枪买卖qq +秃鹰汽枪供应qq +秃鹰汽枪出售qq +秃鹰汽枪制造图纸 +秃鹰汽枪批发qq +秃鹰汽枪提供qq +秃鹰汽枪直销qq +秃鹰汽枪订购qq +秃鹰汽枪销售qq +秃鹰配件专卖qq +秃鹰配件出售qq +秋元优奈bt下载 +秋山祥子种子下载 +秦氏弓弩专卖qq +税务发票代开qq +税收发票代开qq +空白发票代开qq +突击步枪出售qq +突击步枪销售qq +窃听手机软件下载 +窃听手机软件电话 +立即博娱乐城赌博 +立式双管猎枪销售 +站长推荐亚洲无码 +第4色成人激情网 +简易核弹头的制造 +简易火药制造方法 +简易炸弹出售qq +简易炸弹制作方法 +简易炸弹当面交易 +简易炸药制作工艺 +简易炸药制作教学 +简易炸药制作方法 +简易炸蛋制作方法 +粉红色的小嫩逼淫 +粗大的肉棒txt +粗大肉棒插入蜜穴 +精液中出rmvb +精液喷射在子宫上 +精液射如妈妈的穴 +精液射进她的小洞 +精液射进穴里视频 +紫彩乃潮吹赛红音 +红娘淫娘小说下载 +红楼绮梦全集小说 +红楼绮梦小说下载 +红楼美穴肛交淫图 +约我柳州交友中心 +纨绔艳情录txt +纪录我们告诉未来 +线上成人免费影片 +线上真钱棋牌游戏 +线上真钱赌博网站 +线上轮盘博彩qq +经典亚洲无码下载 +结城杏奈电驴下载 +维也纳娱乐城网站 +缅古送货上门qq +缅古配方供应qq +缅古配方出售qq +缅古配方提供qq +缅古配方销售qq +缅甸麻古出售qq +网上刻章办证电话 +网上办理假证qq +网上现金赌博游戏 +网上真人在线赌场 +网上真人娱乐赌博 +网上真人现金游戏 +网上真人现金赌博 +网上真钱娱乐平台 +网上真钱棋牌游戏 +网上真钱赌博网站 +网上真钱轮盘游戏 +网上真钱麻将游戏 +网址情色成人大全 +网络专销仿真手狗 +网络出售汽枪配件 +网络批发仿真手狗 +网络炒作执行专家 +网络电视棒成人台 +网络真人现金游戏 +网络证件qq假证 +网络足球投注qq +网络销售cp99 +网络销售仿真手狗 +网络销售汽枪配件 +美丽素女の性游戏 +美军现役军刺批发 +美国3箭气枪出货 +美国军用进口弓弩 +美国冷钢军刀专卖 +美国卡巴军刀专卖 +美国巴克军刀专卖 +美国成人激情网站 +美国激情淫色网站 +美国秃鹰0售qq +美国秃鹰供应qq +美国秃鹰出售qq +美国秃鹰批发qq +美国秃鹰提供qq +美国秃鹰直销qq +美国秃鹰订购qq +美国秃鹰转让qq +美国秃鹰销售qq +美女上门全套服务 +美女上门服务中心 +美女上门爱爱qq +美女下体淫水直流 +美女与猪性交电影 +美女丝袜按摩服务 +美女做爱激情电影 +美女全套服务电话 +美女兼职上门按摩 +美女包夜服务qq +美女含双棍玩内射 +美女妹妹上门服务 +美女嫂子的小骚逼 +美女嫩穴淫水直流 +美女小偷被抓现场 +美女性交极品大片 +美女性爱在线视频 +美女性爱视频下载 +美女援助交际qq +美女校花裸聊视频 +美女模特兼职上门 +美女激情裸聊视频 +美女电话上门服务 +美女真人视频聊天 +美女示范真人性爱 +美女视频裸聊qq +美女裸体视频qq +美女裸体视频聊天 +美女野兽做爱淫图 +美女陪游全套包服 +美妻性奴史txt +美穗由纪无码下载 +美艳少妇视频诱惑 +美高梅娱乐城网站 +羞块来摸摸人家我 +羟基乙腈供应qq +老公他要插进来了 +老师最原始的性福 +老师和我做爱好爽 +老师的肉棒好大啊 +考前答案出售qq +考前答案销售qq +考生资料出售qq +考试用窃听器qq +职业打手联系qq +职业杀手联系qq +肉体岂能拿来慷慨 +肉把鸡巴包得紧紧 +肉棒伸入她的口中 +肉棒刺入我的小穴 +肉棒在子宫口游荡 +肉棒在小穴里好爽 +肉棒在阴道内喷射 +肉棒在阴道内抽插 +肉棒在阴道口游荡 +肉棒弄得湿溜溜的 +肉棒抵住阴唇插入 +肉棒抽插的爽死了 +肉棒插入乱伦射精 +肉棒插入妹妹小穴 +肉棒插入小阴户内 +肉棒插入少妇嫩穴 +肉棒插入阿姨爽呀 +肉棒插到花心深处 +肉棒插干她的小穴 +肉棒插护士穴骚穴 +肉棒插进湿润花蕊 +肉棒狂插好爽插我 +肉棒狂插流出淫液 +肉棒狂插浪穴嫩穴 +肉棒狂插穴口好爽 +肉棒狂插花心深处 +肉棒精液淫液阴精 +肏jiejie屄 +肏meimei屄 +肏又大又嫩的屄儿 +肝肾有偿捐献qq +股民信息出售qq +股民电话资源qq +肥穴jiejie +肾源信息供应qq +肾源有偿捐献qq +背着父亲偷搞母亲 +胡温怒批政法系统 +脱衣激情裸聊天室 +自制54手枪图纸 +自制军用手枪出售 +自制冰毒教程qq +自制冰毒方法qq +自制塑胶炸药方法 +自制手枪出售qq +自制手枪哪里有卖 +自制汽枪出售qq +自制汽枪销售qq +自制液体炸弹方法 +自制炸药出售qq +自制硅胶面具出售 +自制硝铵炸药方法 +自制组装枪支销售 +自制鞭炮出售qq +自动跳刀专卖qq +自由西藏学生运动 +自考考前答案出售 +自考考前答案销售 +舌尖舔着肉棒阴门 +舔的下体湿润阴毛 +色mm穴激情图片 +色女缠郎免费下载 +色妹妹乱伦理小说 +色情导航av电影 +色情影院下载地址 +色情影院观看网址 +色情手机游戏下载 +色情有声小说下载 +色情激情电影观看 +色情电子小说下载 +色情网址网上做爱 +色情网址网上视频 +色情网站色情导航 +色情网页游戏下载 +色痞子巧诱娇娇女 +色系漫画打包下载 +艳照种子下载地址 +艾未未与读者闲扯 +花心天子在线阅读 +苯巴比妥批发qq +英国文凭代办qq +英国骚本专卖qq +英国骚本供应qq +英国骚本批发qq +英国骚本提供qq +英国骚本气枪出售 +英国骚本直销qq +英国骚本转让qq +英国骚本销售qq +英语4级假证办理 +英语6级假证办理 +苹果卧底监听软件 +草bbbbbbb +草榴社区最新地址 +草榴社区最新网址 +蒲江县办理真文凭 +薇yx25511 +薇yχ25511 +虎头猎枪买卖qq +虎头猎枪交易qq +虎头猎枪供应qq +虎头猎枪批发qq +虎头猎枪提供qq +蝴蝶刀供应加qq +蝴蝶刀具批发qq +蝴蝶折刀出售qq +蝴蝶甩刀专卖qq +蝴蝶甩刀买卖qq +蝴蝶甩刀出售qq +蝴蝶甩刀销售qq +蝴蝶砍刀出售qq +蝴蝶谷中文娱乐网 +蝴蝶跳刀专卖qq +蝴蝶跳刀买卖qq +蝴蝶跳刀供应qq +蝴蝶跳刀出售qq +蝴蝶跳刀批发qq +蝴蝶跳刀提供qq +蝴蝶跳刀直销qq +蝴蝶跳刀销售qq +被女人玩弄txt +被婶子当鸭子的我 +被美女围困的日子 +裸体妹妹林心如穴 +裸体视频聊天qq +裸体衣裤透视眼镜 +裸女乳房阴道丰臀 +裸女视频陪聊qq +裸聊日本成人电影 +裸聊视频下载qq +裸聊视频在线下载 +西班牙苍蝇水专售 +西班牙苍蝇水供应 +西班牙苍蝇水批发 +西班牙苍蝇水提供 +西班牙苍蝇水订购 +西班牙苍蝇水购买 +西秋爱菜无码下载 +覆雨翻云之逐艳曲 +警服电击棒专卖网 +警用手铐供应qq +警用手铐提供qq +警用电棍专卖qq +警用电棍买卖qq +警用电棍出售qq +警用电棍提供qq +警用电棍订购qq +警用电棍销售qq +订制狙击气枪qq +订制高仿人皮面具 +订购3棱刺刀qq +订购3箭气枪qq +订购54手枪qq +订购54手枪子弹 +订购64手枪子弹 +订购92手枪子弹 +订购ghb催情水 +订购ghb迷情水 +订购lsd迷幻药 +订购仿真汽枪qq +订购催情药水qq +订购兰博刀具qq +订购军用弓弩qq +订购原装秃鹰qq +订购台湾秃鹰qq +订购听话药水qq +订购喷雾迷药qq +订购国产气狗qq +订购国产秃鹰qq +订购大黑鹰弩qq +订购工字牌钢珠狗 +订购左轮牌钢珠狗 +订购手枪配件qq +订购拍肩迷药qq +订购枪支配件qq +订购步枪子弹qq +订购狙击步狗qq +订购狙击气枪qq +订购猎枪子弹qq +订购猎枪铅弹qq +订购猎豹弓弩qq +订购甲卡西酮qq +订购秃鹰套件qq +订购秃鹰汽枪qq +订购美国卡巴军刀 +订购蝴蝶刀具qq +订购西班牙苍蝇水 +订购赵氏弓弩qq +订购进口气枪qq +订购迷奸药水qq +订购迷幻蘑菇qq +订购迷情药水qq +订购迷昏药水qq +订购迷魂药水qq +订购迷魂香烟qq +订购金属气枪qq +订购金弓电狗qq +订购钢珠气枪qq +订购高仿手枪qq +订购高仿气枪qq +订购高仿汽枪qq +订购高仿警服qq +订购高压气枪qq +订购高压气枪配件 +订购高压汽枪qq +订购高压汽枪配件 +订购黑版3棱军刺 +诚信专业办证qq +诚信办理高仿假证 +诚信办证刻章公司 +诱人美眉裸聊视频 +诺贝尔和平奖得主 +谁为腐败晚餐买单 +调教爱奴免费下载 +调教爱奴全篇下载 +财务发票代开qq +财税发票代开qq +购买54手枪qq +购买awp气步枪 +购买qiang支 +购买仿真气枪qq +购买仿真汽枪qq +购买催情药水qq +购买听话药水qq +购买喷雾迷药qq +购买国产秃鹰qq +购买工字牌钢珠狗 +购买左轮牌钢珠狗 +购买拍肩迷药qq +购买气枪子弹qq +购买汽枪子弹qq +购买汽枪铅弹qq +购买狙击步狗qq +购买甲卡西酮qq +购买甲基安非他命 +购买真实学历qq +购买秃鹰气枪qq +购买进口气枪qq +购买迷奸药水qq +购买迷幻蘑菇qq +购买迷幻香烟qq +购买迷情药水qq +购买迷魂药水qq +购买迷魂香烟qq +购买钢珠气枪qq +购买防身警察装备 +购买高仿汽枪qq +赞成,西藏,独立 +赭曲毒素批发qq +赵氏弓弩专卖qq +赵氏弓弩供应qq +赵氏弓弩出售qq +赵氏弓弩批发qq +赵氏弓弩提供qq +赵氏弓弩直销qq +赵氏弓弩订购qq +赵氏弩弓出售qq +超高压电警棍出售 +跟妹妹肏穴好舒服 +身份证生成器下载 +车主名录批发qq +转让2手军刀qq +转让3棱军刀qq +转让3棱刀具qq +转让3箭汽枪qq +转让54手枪qq +转让65式伞兵刀 +转让99式伞兵刀 +转让仿真手枪qq +转让仿真汽枪qq +转让兰博刀具qq +转让军用匕首qq +转让军用弓弩qq +转让原装秃鹰qq +转让双刃尖刀qq +转让台湾秃鹰qq +转让国产汽枪qq +转让国产秃鹰qq +转让娥眉气枪qq +转让工字气枪qq +转让工字汽枪qq +转让工字牌钢珠狗 +转让左轮牌钢珠狗 +转让狙击步狗qq +转让狙击汽枪qq +转让秃鹰气枪qq +转让绿皮瓦管qq +转让英国骚本qq +转让进口弓弩qq +转让进口汽枪qq +转让进口秃鹰qq +转让金属气枪qq +转让钢珠气枪qq +转让钢珠汽枪qq +转让骚本汽枪qq +转让高仿军刺qq +转让高仿汽枪qq +转让高压汽枪qq +轮奸做爱高潮录象 +轮奸大meinv +轮奸爆乳内射流出 +轮盘现金投注平台 +软件式监听器出售 +轻轻地抽动著阳具 +轻轻地抽插著阳具 +迅雷下载淫乱电影 +过机版人民币qq +运城哪里有红灯区 +这个巡航导弹不大 +进京抓央视女记者 +进口3唑仑片出售 +进口3棱军刺专卖 +进口匕首出售qq +进口弓弩专卖qq +进口弓弩出售qq +进口弓弩提供qq +进口弓弩销售qq +进口弩弓专卖qq +进口手机卧底软件 +进口手枪专卖qq +进口气动长枪出售 +进口气枪专卖qq +进口气枪供应qq +进口气枪出售qq +进口气枪气枪子弹 +进口气枪直销qq +进口气枪转让qq +进口气狗出售qq +进口汽枪专卖qq +进口汽枪供应qq +进口汽枪出售qq +进口汽枪批发qq +进口汽枪直销qq +进口汽枪销售qq +进口汽狗专卖qq +进口汽狗买卖qq +进口汽狗供应qq +进口汽狗批发qq +进口汽狗提供qq +进口汽狗订购qq +进口汽狗销售qq +进口狙击汽枪出售 +进口猎枪专卖qq +进口秃鹰气枪专卖 +进口金属枪模专卖 +进口金属枪模销售 +进口高压气枪专卖 +进口高压气枪出售 +远程手机卧底淘宝 +迷人小穴好紧好湿 +迷奸药水专卖qq +迷奸药水供应qq +迷奸药水批发qq +迷奸药水提供qq +迷奸药水订购qq +迷幻喷雾批发qq +迷幻蘑菇出售qq +迷幻蘑菇提供qq +迷幻蘑菇销售qq +迷幻香烟出售qq +迷情ghb水专卖 +迷情ghb水出售 +迷情ghb水销售 +迷情药水供应qq +迷魂香水出售qq +迷魂香水销售qq +迷魂香烟专卖qq +迷魂香烟供应qq +迷魂香烟出售qq +迷魂香烟批发qq +迷魂香烟提供qq +迷魂香烟直销qq +迷魂香烟订购qq +迷魂香烟购买qq +迷魂香烟销售qq +逃亡艳旅小说下载 +通用发票代开qq +邓小平和他的儿子 +都市品香录txt +酒店小姐全套包夜 +重生之美女掠夺者 +野外军刀专卖qq +野外刀具专卖qq +野火手机卧底软件 +野营军刀买卖qq +野营军刀供应qq +野营军刀出售qq +野营军刀提供qq +野营军刀销售qq +野营军刀销售电话 +野营刀具专卖qq +野营刀具供应qq +野营刀具出售qq +野营刀具批发qq +野营刀具提供qq +野营刀具直销qq +野营刀具转让qq +野营刀具销售qq +野营砍刀专卖qq +野营砍刀批发qq +金属气枪批发qq +金属气枪提供qq +金属气枪直销qq +金属气枪订购qq +金属气枪转让qq +金属气枪销售qq +金泽文子迅雷下载 +金牌百家乐娱乐城 +金瓶梅txt在线 +金瓶梅免费电影院 +钢珠弩专卖网qq +钢珠枪小口径步枪 +钢珠气枪专卖qq +钢珠气枪供应qq +钢珠气枪出售qq +钢珠气枪提供qq +钢珠气枪直销qq +钢珠气枪订购qq +钢珠气枪购买qq +铅弹上海工字气枪 +铅弹模具出售qq +铅弹汽枪直销qq +铅弹汽枪订购qq +银氰化钾订购qq +银行卡复制器专售 +银行卡复制器出售 +银行卡解码器供应 +银行卡读卡器批发 +银行卡读卡器软件 +销售1元假币qq +销售1元硬币qq +销售1比1仿真枪 +销售3利达手弓弩 +销售3唑仑片qq +销售3棱军刀qq +销售3棱军刺qq +销售3棱刀具qq +销售3棱刮刀qq +销售3棱尖刀qq +销售3箭气枪qq +销售3箭汽枪qq +销售45mm狗粮 +销售54式手木仓 +销售54式气木仓 +销售54手枪子弹 +销售54手狗子弹 +销售54枪支qq +销售64式手木仓 +销售64式气木仓 +销售64手枪子弹 +销售654k手枪 +销售77式手木仓 +销售77式气木仓 +销售92式手木仓 +销售92式气木仓 +销售92手枪子弹 +销售awp气步枪 +销售cp99配件 +销售ghb催情水 +销售ghb水qq +销售ghb迷情水 +销售gηb迷情水 +销售jia币qq +销售lqb362 +销售lsd迷幻药 +销售万能开锁钥匙 +销售上海工字气狗 +销售交警警服qq +销售仿真假钱qq +销售仿真军刺qq +销售仿真手枪qq +销售仿真枪械qq +销售仿真气枪qq +销售仿美秃鹰qq +销售假人民币qq +销售假学位证qq +销售假币模具qq +销售假毕业证qq +销售假资格证qq +销售健卫14步枪 +销售催情药水qq +销售兰博军刀qq +销售兰博刀具qq +销售军刀军刺qq +销售军品刀具qq +销售军品刺刀qq +销售军用54qq +销售军用54手枪 +销售军用刺刀qq +销售军用匕首qq +销售军用弩折叠弩 +销售军用手枪qq +销售军用狙击弓弩 +销售出售双管猎枪 +销售北朝鲜冰qq +销售单管猎枪qq +销售卧底软件qq +销售原装秃鹰qq +销售双刃尖刀qq +销售双管平式猎枪 +销售双管猎枪qq +销售口香糖型春药 +销售口香糖型迷药 +销售台湾秃鹰qq +销售台版假币qq +销售台版高仿假币 +销售台秃配件qq +销售听话药水qq +销售喷雾迷药qq +销售国产军用手枪 +销售国产手枪qq +销售国产汽枪qq +销售地税发票qq +销售大黑鹰弩qq +销售女性数据qq +销售安乐死药qq +销售尼2氢可待因 +销售工字气枪qq +销售工字汽枪qq +销售左轮手枪qq +销售广州3箭气枪 +销售户外军刀qq +销售户外刀具qq +销售户外狩猎弓弩 +销售手qiang +销售手机卧底qq +销售手机卧底软件 +销售手机监听软件 +销售手机窃听软件 +销售手机间谍软件 +销售手枪子弹qq +销售手枪配件qq +销售打鸟汽枪qq +销售拍肩型昏迷药 +销售拍肩型迷幻药 +销售拍肩迷药qq +销售朝版假人民币 +销售枪支套件qq +销售枪支配件qq +销售枸橼酸芬太尼 +销售正品军刀qq +销售步qiang +销售步枪配件qq +销售气枪铅弹qq +销售气枪铅弹模具 +销售氯甲酸氯甲酯 +销售汽枪铅弹qq +销售汽狗子弹qq +销售汽狗铅弹qq +销售温切斯特气枪 +销售港38式左轮 +销售烟花爆竹qq +销售狙击步狗qq +销售狙击汽枪qq +销售狩猎弓弩qq +销售猎qiang +销售猎豹弓弩qq +销售猎豹弓弩改装 +销售甲卡西酮qq +销售甲基安非他命 +销售短狗狗粮qq +销售秃鹰气枪配件 +销售秃鹰汽枪qq +销售秃鹰汽枪配件 +销售秃鹰配件qq +销售立式双管猎枪 +销售绿皮瓦管qq +销售缅古制作技术 +销售缅古制作方法 +销售缅甸麻古qq +销售美国原装秃鹰 +销售美国秃鹰汽枪 +销售美沙酮中间体 +销售考前答案qq +销售考试作弊器材 +销售考试答案qq +销售股民电话资源 +销售自制54式枪 +销售自制手枪qq +销售自考考前答案 +销售苯基甲酮qq +销售英国骚本气枪 +销售虎头双管qq +销售虎头双管猎枪 +销售蝴蝶刀具qq +销售蝴蝶甩刀qq +销售蝴蝶跳刀qq +销售警服常服qq +销售警用刀具qq +销售警用手枪qq +销售警用甩棍qq +销售警用电棍qq +销售赵氏钢珠弓弩 +销售进口仿真步枪 +销售进口匕首qq +销售进口弓弩qq +销售进口弓弩价钱 +销售进口气枪qq +销售进口气狗qq +销售进口汽枪qq +销售进口汽狗qq +销售迷奸药水qq +销售迷幻药物qq +销售迷幻蘑菇qq +销售迷魂药水qq +销售迷魂香水qq +销售迷魂香烟qq +销售追风弩麻醉箭 +销售野营军刀qq +销售野营刀具qq +销售金属气枪qq +销售钢珠手弩qq +销售钢珠气枪qq +销售钢珠汽枪qq +销售铅弹鸟枪qq +销售锡锋气枪qq +销售韩国金狐手弩 +销售高仿人皮面具 +销售高仿假币qq +销售高仿假钞qq +销售高仿假钱qq +销售高仿军刺qq +销售高仿学位证书 +销售高仿气枪qq +销售高仿汽枪qq +销售高仿真人民币 +销售高仿纸币qq +销售高仿警服qq +销售高仿钞票qq +销售高压气枪qq +销售高压气枪图纸 +销售高压气枪配件 +销售高压汽枪qq +销售麦司卡林qq +销售麻古果子qq +销售麻古配方qq +销售麻醉手枪qq +销售黑版3棱军刺 +锡纸开锁工具批发 +长月亚美迅雷下载 +长谷川留美子无码 +门房秦大爷的故事 +防卫棍刀户外刀具 +防卫著名军刀出售 +防卫野营砍刀出售 +防身手狗出售qq +防身警用电棍出售 +阳江军刀批发qq +阳江刀具专卖qq +阳江刀具直销qq +阳江市刀具批发网 +阳江户外刀具销售 +阴唇湿润小妹舔乳 +阴唇阴道大图3级 +阴茎在子宫口游荡 +阴茎插入少妇阴道 +阴道图打手枪专用 +阴部翻过来看超拽 +阿姨帮我释放1下 +阿姨的水穴txt +阿姨的阴唇好大啊 +阿姨的阴户好大啊 +阿姨的阴户好肥啊 +阿姨的阴道好大啊 +阿姨的阴道好紧啊 +阿普唑仑批发qq +限制级女郎dj舞 +集团出售手枪气枪 +雨宫琴音种子下载 +雷管制造技术qq +雷管炸弹制作方法 +雷管炸药出售qq +雷管炸药看货付款 +青山和希bt下载 +韩国3级情色电影 +韩国女星偷拍无码 +韩国嫩模高清爱爱 +韩国成人激情影院 +韩国成人激情淫洞 +韩国激情淫色网站 +韩国激情淫色贴图 +韩国高清a片下载 +韩日成人激情影院 +韩日成人激情电影 +韩版高清a片专区 +顶级乱伦高潮淫水 +顶级学妹美穴淫图 +预订awp气步枪 +预订左轮手枪qq +预订秃鹰汽枪qq +风尘劫txt全集 +风尘劫电子书下载 +风月大6全文下载 +风流女儿国txt +风骚女友浴室放荡 +香月安娜电驴下载 +香港2类ghb水 +香港6合彩官方网 +香港ghb水qq +香港中特网管家婆 +香港成人激情影院 +香港成人激情论坛 +香港激情性爱影院 +香港激情淫色影院 +香港激情淫色贴图 +香烟型昏迷药供应 +香烟型昏迷药批发 +香烟型昏迷药提供 +香烟型昏迷药直销 +香烟型昏迷药订购 +香烟型昏迷药购买 +香烟型昏迷药销售 +香烟迷药供应qq +香烟迷药订购qq +马拉硫磷供应qq +马钱子碱供应qq +驱妖女仆队txt +骆冰淫传全集小说 +骚bb免费色电影 +骚本套件出售qq +骚本汽枪直销qq +骚浪淫水的小屄儿 +骚逼大型成人色站 +高价收养女孩qq +高价收购人体肝脏 +高价收购肾源qq +高价购买仿真手狗 +高仿人皮面具qq +高仿人皮面具专卖 +高仿人皮面具买卖 +高仿人皮面具供应 +高仿人皮面具批发 +高仿人皮面具提供 +高仿人皮面具订制 +高仿人皮面具销售 +高仿假人民币出售 +高仿假人民币销售 +高仿假币供应qq +高仿假币出售qq +高仿假币批发电话 +高仿假币提供qq +高仿假币销售qq +高仿假钞供应qq +高仿假钞出售qq +高仿假钞批发电话 +高仿假钞直销qq +高仿假钞销售qq +高仿假钱专卖qq +高仿假钱买卖qq +高仿假钱供应qq +高仿假钱直销qq +高仿假驾驶证qq +高仿假驾驶证办理 +高仿军刺买卖qq +高仿军刺供应qq +高仿军刺批发qq +高仿军刺提供qq +高仿学位证书提供 +高仿手枪出售qq +高仿手枪批发qq +高仿手枪提供qq +高仿手枪销售qq +高仿护照制作qq +高仿文凭专卖qq +高仿文凭代办qq +高仿文凭出售qq +高仿文凭办理qq +高仿文凭提供qq +高仿气枪供应qq +高仿气枪出售qq +高仿气枪提供qq +高仿气枪购买qq +高仿气枪销售qq +高仿汽枪专卖qq +高仿汽枪出售qq +高仿汽枪批发qq +高仿汽枪直销qq +高仿汽枪订购qq +高仿汽枪购买qq +高仿汽枪转让qq +高仿真人民币qq +高仿真人民币专卖 +高仿真人民币买卖 +高仿真人民币代售 +高仿真人民币代销 +高仿真人民币批发 +高仿真人民币提供 +高仿真人民币直销 +高仿真人民币销售 +高仿真假硬币出售 +高仿真身份证办理 +高仿纸币出售qq +高仿纸币销售qq +高仿警服供应qq +高仿警服出售qq +高仿警服提供qq +高仿警服订购qq +高仿警服销售qq +高仿证件代办qq +高仿证件公司qq +高仿证件办理qq +高仿钞票出售qq +高仿钞票批发qq +高仿钞票提供qq +高仿钞票销售qq +高假仿人民币直销 +高偿收养儿童qq +高压3箭汽枪专卖 +高压气枪专卖qq +高压气枪出售qq +高压气枪子弹出售 +高压气枪提供qq +高压气枪气枪子弹 +高压气枪电狗专卖 +高压气枪直销qq +高压气枪联系qq +高压气枪订购qq +高压气枪转让qq +高压气枪送货上门 +高压气枪销售qq +高压汽枪专卖qq +高压汽枪供应qq +高压汽枪出售qq +高压汽枪子弹销售 +高压汽枪批发qq +高压汽枪销售qq +高压电警棍专卖网 +高压电警棍批发网 +高压电警棍销售网 +高压警用电棍出售 +高清av轮奸肛交 +高清日本av下载 +高清电视棒成人版 +高爆炸药出售qq +高爆炸药制作方法 +高爆炸药基本配方 +高级淫口手淫口交 +高纯k粉出售qq +高考无线隐形耳机 +高考考前答案qq +鬼畜狂虐精浴av +鸡吧勃起插入阴道 +鸡吧猛的抽插嫩穴 +鸡婆上门包夜服务 +鸡婆包夜上门服务 +鸡巴全根没入阴道 +鸡巴受不了了要泄 +鸡巴射出精液泄了 +鸡巴插进了的小穴 +鸡巴淫沟插b大图 +鸡巴用力深度插入 +鹿城激情淫色贴图 +麦司卡林供应qq +麦角新碱销售qq +麦角胺麦角酸销售 +麦角酸2乙基酰胺 +麦角酸2乙基醯胺 +麻古出售联系方式 +麻古制作方法qq +麻古果子制作qq +麻古送货上门qq +麻古配方出售qq +麻果配方出售qq +麻果配方销售qq +麻醉枪出售可验货 +麻黄碱制冰毒方法 +麻黄素及原料出售 +黄牙签水果冰冰毒 +黄白牙签出售qq +黄白牙签批发qq +黄白牙签销售qq +黄色免费淫乱电影 +黄色免费淫电影网 +黄色免费电影美女 +黄色免费超级淫图 +黄色妹妹a级大片 +黄色电影免费下载 +黑不过中国证监会 +黑丝双通道可内射 +黑丝豹纹中出全套 +黑火药爆炸方程式 +黑火药的制作方法 +黑火药的完美配方 +黑索金的制造过程 +黑鹰弓弩专卖qq +龟头在阴唇上抽插 +龟头在阴道中抽插 +龟头在阴道里抽插 +龟头挑逗花蕊嫩肉 +龟头插入少妇阴道 +龟头插入淫荡少妇 +龟头操进处女阴道 +龟头用力刺入淫穴 +龟头用力刺入阴道 +龟头用里插入阴道 +龟头顶住她的阴户 +龟头顶在花心深处 +龟头顶破了处女膜 +10690短信群发 +11月更新成人导航 +12岁处女开包现场 +188金宝博娱乐城 +18dy大众成人网 +18岁处女床上开苞 +18岁禁淫荡小处女 +18成人视频聊天室 +18男人momob +1989年6月4日 +1代女皇艳史武则天 +1代淫后骆冰txt +1元假硬币专卖qq +1元假硬币买卖qq +1元假硬币供应qq +1元假硬币出售qq +1元假硬币批发qq +1元假硬币提供qq +1元假硬币直销qq +1元假硬币销售qq +1夜情援交服务qq +1夜情服务信息qq +1夜激情成人聊天室 +1对1真人视频裸聊 +1盒1次性玞枪霰弹 +1股淫液从肉洞喷出 +322攻台作战计划 +365激情淫色贴图 +38式左轮手枪订购 +3d打印机枪支图纸 +3d肉蒲团在线观看 +3利达弓弩专卖qq +3利达弓弩供应qq +3利达弓弩出售qq +3利达弓弩销售qq +3唑仑货到付款qq +3男轮番干1个荡妇 +3箭牌气枪供应qq +3箭牌汽枪订购qq +3级片a片下载观看 +3陪上门性服务qq +3陪女上门援交信息 +3陪女上门服务qq +3陪女出台服务qq +3陪女出台特殊服务 +3陪女特殊服务qq +462硝基邻甲苯酚 +46级考前答案qq +4海龙女txt全集 +4海龙女电子书下载 +54式手枪供应qq +54式手枪提供qq +54式手枪配件供应 +54式手枪配件出售 +54式手枪配件批发 +54式手枪配件提供 +54式手枪配件直销 +54式手枪配件订购 +54式手枪配件销售 +56式3棱刺刀专卖 +56式军刺专卖qq +56式军刺供应qq +56式军刺出售qq +56式军刺批发qq +56式军刺提供qq +56式军刺直销qq +56式军刺转让qq +56式军刺销售qq +5月天成人激情网站 +5连发猎枪销售qq +64受难者家属证辞 +64式手枪供应qq +64式手枪提供qq +64式手枪配件供应 +64式手枪配件出售 +64式手枪配件批发 +64式手枪配件提供 +64式手枪配件直销 +64式手枪配件订购 +64式手枪配件销售 +64式手狗专卖qq +64式手狗直销qq +64式手狗订购qq +6合彩曾道人白小姐 +77式手枪供应qq +77式手枪出售qq +77式手枪提供qq +77式手枪配件供应 +77式手枪配件出售 +77式手枪配件批发 +77式手枪配件提供 +77式手枪配件直销 +77式手枪配件订购 +77式手枪配件销售 +77式手枪销售qq +789dyb点cc +87bb成人小电影 +88bb成人小电影 +88娱乐城天上人间 +89bb成人小电影 +89年那个春夏之交 +90bb成人小电影 +91bb成人小电影 +91武2伞1941 +92bb成人小电影 +92式军用手枪出售 +92式手枪出售qq +92式手枪提供qq +92式手枪销售qq +92手枪54式手枪 +93bb成人小电影 +94bb成人小电影 +95bb成人小电影 +95式自动步枪供应 +95式自动步枪出售 +95式自动步枪批发 +95式自动步枪提供 +95式自动步枪直销 +95式自动步枪销售 +95式自动步枪预订 +96bb成人小电影 +987uu成人影院 +98bb成人小电影 +99bb成人小电影 +99真人娱乐城网站 +asex防屏蔽电影 +av全球成人购物网 +awp配件供应qq +awp配件出售qq +awp配件批发qq +awp配件提供qq +awp配件直销qq +awp配件订购qq +awp配件销售qq +bt免费淫电影下载 +bt无码区激情电影 +c4炸药diy教程 +cfx气枪送货上门 +cup爆乳家庭教师 +d7se我淫我电影 +diy塑料炸弹方法 +dse淫乱小姨小说 +ewin娱乐城开户 +Falundafa +falungong +fox格斗砍刀专卖 +fox格斗砍刀买卖 +fox格斗砍刀出售 +fox格斗砍刀直销 +fox格斗砍刀订购 +fox格斗砍刀转让 +fox格斗砍刀销售 +Freechina +fuck信息产业部 +fuck升达毕业证 +fuck台湾共产党 +fuck台湾共和国 +fuck天安门1代 +fuck天安门事件 +fuck天安门屠杀 +fuck天安门档案 +fuck小泉纯1郎 +fuck托管理事会 +fuck新手指导员 +fuck新闻出版署 +fuck无界浏览器 +fuck晚年周恩来 +fuck湿透的内裤 +fuck社保基金会 +fuck神通加持法 +fuck色情小电影 +fuck身份生成器 +fx季候风出售qq +high水批发qq +high粉出售qq +high粉送货上门 +high粉销售qq +high药出售qq +high药批发qq +high药直销qq +high药销售qq +jiejie的小屄 +jiejie的小穴 +jiejie的肥穴 +jiejie的阴户 +jiejie被轮奸 +k7娱乐城免费开户 +king粉送货qq +king粉送货上门 +kk情色交友俱乐部 +lihongzhi +m9d80军刀专卖 +meimei淫水流 +meimei的嫩屄 +meimei的阴户 +meimei的阴蒂 +meimei美图网 +meinv主持脱衣 +meinv护士被奸 +meinv极品嫩穴 +meinv淫水狂流 +meinv直播做爱 +pcp新贵配件出售 +pcp新贵配件直销 +pcp新贵配件销售 +pcp新贵配件预定 +pcp气枪分解图纸 +pcp气狗出售qq +pcp汽枪供应qq +pcp汽枪出售qq +pcp汽枪直销qq +pcp汽枪销售qq +pcp秃鹰套件专卖 +pcp秃鹰套件出售 +pcp配件买卖qq +pcp配件供应qq +pcp配件出售qq +pcp配件批发qq +pcp配件提供qq +pcp配件直销qq +pcp配件订购qq +pcp配件销售qq +pcz山猪买卖qq +petn的制作过程 +pk小3后妈少女血 +pp1点通成人电影 +pp241淫色导航 +pp242淫色导航 +pp243淫色导航 +pp244淫色导航 +pp点点激情片播放 +qq3箭牌气枪供应 +qq3陪女上门服务 +qq3陪女出台服务 +qq54式手狗出售 +qq64式手枪出售 +qq64式手狗出售 +qq92式手狗出售 +qqpcp配件供应 +qqpcp配件直销 +qqpcp配件订购 +qqpcp配件销售 +qqx卧底软件出售 +qq万能开锁器出售 +qq万能开锁器直销 +qq上门服务找美女 +qq专业办假证公司 +qq专卖万能开锁器 +qq专卖军用54式 +qq专卖喷雾蒙汗药 +qq专卖大黑鹰弓弩 +qq专卖安乐死药物 +qq专卖小口径手枪 +qq专卖尼泊尔军刀 +qq专卖峨眉牌汽枪 +qq专卖狙击气步枪 +qq专卖盐酸哌替啶 +qq专卖盐酸曲马多 +qq专卖盐酸氯胺酮 +qq专卖钢珠左轮狗 +qq专卖高仿军官证 +qq专卖高仿学位证 +qq专卖高仿毕业证 +qq专卖高压打鸟枪 +qq专卖高压气步枪 +qq专售喷雾蒙汗药 +qq丛林军刀专卖网 +qq中国军刀出售网 +qq乖乖水配方提供 +qq买卖54式手枪 +qq买卖万能开锁器 +qq买卖仿真枪配件 +qq买卖台湾版假币 +qq买卖台湾版假钞 +qq买卖台湾版假钱 +qq买卖安乐死药物 +qq买卖气动钢珠枪 +qq买卖盐酸哌替啶 +qq买卖高仿学位证 +qq买卖高仿毕业证 +qq买卖高仿真假币 +qq买销售虎头猎枪 +qq代办假学历证书 +qq代办假等级证书 +qq代办高仿4级证 +qq代办高仿会计证 +qq代办高仿军官证 +qq代办高仿学位证 +qq代办高仿户口本 +qq代办高仿毕业证 +qq代办高仿驾驶证 +qq仿54手枪出售 +qq仿54手枪销售 +qq供应64式手枪 +qq供应awp配件 +qq供应high粉 +qq供应king粉 +qq供应pcp汽枪 +qq供应pcp配件 +qq供应万能开锁器 +qq供应云南情蛊药 +qq供应仿真人民币 +qq供应仿真枪配件 +qq供应催情口香糖 +qq供应军用54式 +qq供应去氧麻黄素 +qq供应台湾版假币 +qq供应台湾版假钞 +qq供应台湾版假钱 +qq供应喷雾蒙汗药 +qq供应喷雾迷幻药 +qq供应喷雾迷情水 +qq供应大黑鹰弓弩 +qq供应安乐死毒药 +qq供应小口径猎枪 +qq供应尼泊尔军刀 +qq供应峨眉牌汽枪 +qq供应左旋麻黄素 +qq供应左轮钢珠狗 +qq供应气动钢珠枪 +qq供应汽车解码器 +qq供应盐酸哌替啶 +qq供应盐酸曲马多 +qq供应盐酸氯胺酮 +qq供应盐酸羟亚胺 +qq供应迷情乖乖水 +qq供应钢珠左轮狗 +qq供应锡峰牌气枪 +qq供应香烟型迷药 +qq供应高仿学位证 +qq供应高仿毕业证 +qq供应高仿真假币 +qq供应高仿真假钞 +qq供应高仿警官证 +qq供应高压气步枪 +qq假国外文凭代办 +qq假国外文凭制作 +qq假学位证书出售 +qq假学位证书办理 +qq假学位证书销售 +qq假文凭代办公司 +qq假文凭办理中心 +qq假文凭办理公司 +qq假等级证书代办 +qq假等级证书办理 +qq假证件制作公司 +qq假证件办理公司 +qq兼职小姐性服务 +qq军用54式销售 +qq军用64式销售 +qq军用狙击弩出售 +qq军用狙击弩销售 +qq出售3利达弓弩 +qq出售54式军狗 +qq出售54式手枪 +qq出售64式军狗 +qq出售64式手枪 +qq出售77式军狗 +qq出售77式手枪 +qq出售92式手枪 +qq出售awp配件 +qq出售king粉 +qq出售pcp套件 +qq出售pcp气枪 +qq出售pcp汽枪 +qq出售pcz山猪 +qq出售万能开锁器 +qq出售乖乖水配方 +qq出售仿真枪配件 +qq出售假学历证书 +qq出售假文凭证书 +qq出售假等级证书 +qq出售催情口香糖 +qq出售军用54式 +qq出售军用64式 +qq出售勃朗宁军刀 +qq出售半自动步枪 +qq出售去氧麻黄碱 +qq出售去氧麻黄素 +qq出售口服迷昏药 +qq出售台湾版假钱 +qq出售喷雾蒙汗药 +qq出售喷雾迷幻药 +qq出售喷雾迷昏药 +qq出售安乐死药物 +qq出售小口径手枪 +qq出售小口径步枪 +qq出售小口径猎枪 +qq出售少女催情粉 +qq出售少女迷情粉 +qq出售少女迷情药 +qq出售峨眉牌汽枪 +qq出售左旋麻黄素 +qq出售开刃3棱刀 +qq出售开刃弹簧刀 +qq出售拍肩听话粉 +qq出售本科假文凭 +qq出售气枪瞄准器 +qq出售汽车屏蔽器 +qq出售汽车干扰器 +qq出售汽车拦截器 +qq出售汽车解码器 +qq出售甲基苯丙胺 +qq出售盐酸哌替啶 +qq出售盐酸曲马多 +qq出售盐酸氯胺酮 +qq出售盐酸羟亚胺 +qq出售老年人资料 +qq出售考试作弊器 +qq出售蒙汗药配方 +qq出售迷情乖乖水 +qq出售金属仿真狗 +qq出售钢珠左轮狗 +qq出售香烟型迷药 +qq出售骚本pcp +qq出售高仿人民币 +qq出售高仿假硬币 +qq出售高仿军官证 +qq出售高仿学位证 +qq出售高仿户口本 +qq出售高仿毕业证 +qq出售高仿真假钞 +qq出售高仿警官证 +qq出售高仿警察证 +qq出售高仿驾驶证 +qq出售高压打鸟枪 +qq出售高压气步枪 +qq出售高压钢珠狗 +qq制作学士学位证 +qq制作高仿会计证 +qq制作高仿军官证 +qq制作高仿学位证 +qq制作高仿户口本 +qq制作高仿毕业证 +qq剁饼子包夜服务 +qq办假2代身份证 +qq办理仿真驾驶证 +qq办理假46级证 +qq办理假学历证书 +qq办理假文凭证书 +qq办理假毕业证书 +qq办理假等级证书 +qq办理本科假文凭 +qq办理高仿4级证 +qq办理高仿会计证 +qq办理高仿假证件 +qq办理高仿户口本 +qq办理高仿毕业证 +qq包夜性服务电话 +qq化学冰牙签出售 +qq卖45mm狗粮 +qq台湾版假币买卖 +qq台湾版假币批发 +qq台湾版假币直销 +qq喷雾迷幻药订购 +qq在线裸体陪聊女 +qq增值税发票代开 +qq大学生援交服务 +qq妓女上门性服务 +qq小口径手枪专卖 +qq小口径手枪销售 +qq尼泊尔军刀专卖 +qq尼泊尔军刀批发 +qq工字牌汽枪提供 +qq左旋麻黄素直销 +qq成人电视棒专卖 +qq成人电视棒供应 +qq成人电视棒出售 +qq成人电视棒提供 +qq成人电视棒销售 +qq批发54式手枪 +qq批发64式手枪 +qq批发awp配件 +qq批发云南情蛊药 +qq批发催情口香糖 +qq批发台湾版假币 +qq批发台湾版假钞 +qq批发台湾版假钱 +qq批发喷雾蒙汗药 +qq批发喷雾迷幻药 +qq批发喷雾迷情水 +qq批发尼泊尔军刀 +qq批发峨眉牌汽枪 +qq批发左旋麻黄素 +qq批发气动钢珠枪 +qq批发盐酸哌替啶 +qq批发盐酸曲马多 +qq批发盐酸羟亚胺 +qq批发秃鹰气步枪 +qq批发迷情乖乖水 +qq批发钢珠左轮狗 +qq批发香烟型迷药 +qq批发高仿假硬币 +qq批发高仿毕业证 +qq批发高仿真假币 +qq批发高压打鸟枪 +qq批发高压气步枪 +qq找小妹上门服务 +qq拍肩听话粉专卖 +qq拍肩听话粉买卖 +qq按摩保健性服务 +qq提供64式手枪 +qq提供awp配件 +qq提供fing霸 +qq提供pcp配件 +qq提供pcz山猪 +qq提供万能开锁器 +qq提供乖乖水配方 +qq提供云南情蛊药 +qq提供假文凭证书 +qq提供催情口香糖 +qq提供去氧麻黄素 +qq提供台湾版假币 +qq提供台湾版假钞 +qq提供台湾版假钱 +qq提供喷雾蒙汗药 +qq提供喷雾迷幻药 +qq提供喷雾迷情水 +qq提供大黑鹰弓弩 +qq提供安乐死毒药 +qq提供小口径猎枪 +qq提供尼泊尔军刀 +qq提供峨眉牌汽枪 +qq提供工字牌汽枪 +qq提供左旋麻黄素 +qq提供成人电视棒 +qq提供气动钢珠枪 +qq提供汽车解码器 +qq提供盐酸哌替啶 +qq提供盐酸曲马多 +qq提供盐酸氯胺酮 +qq提供盐酸羟亚胺 +qq提供秃鹰气步枪 +qq提供蒙汗药配方 +qq提供迷情乖乖水 +qq提供钢珠左轮狗 +qq提供香烟型迷药 +qq提供高仿假硬币 +qq提供高仿军官证 +qq提供高仿学位证 +qq提供高仿毕业证 +qq提供高仿真假币 +qq提供高仿警察证 +qq提供高压气步枪 +qq提供鹰飞凌军刀 +qq援交女全套服务 +qq援交妹上门服务 +qq正品军刀销售网 +qq气枪bb弹出售 +qq气枪消声器出售 +qq汽动钢珠枪订购 +qq狙击气步枪供应 +qq狙击气步枪出售 +qq狙击气步枪批发 +qq狙击气步枪提供 +qq狙击气步枪订购 +qq狙击气步枪购买 +qq狙击气步枪销售 +qq甲基苯丙胺出售 +qq甲基苯丙胺批发 +qq甲基麻黄素销售 +qq百家乐网络平台 +qq盐酸哌替啶批发 +qq盐酸哌替啶提供 +qq盐酸哌替啶直销 +qq盐酸哌替啶销售 +qq盐酸曲马多供应 +qq盐酸羟亚胺出售 +qq盐酸羟亚胺销售 +qq直销64式手枪 +qq直销av电视棒 +qq直销awp配件 +qq直销pcp配件 +qq直销云南情蛊药 +qq直销催情口香糖 +qq直销台湾版假币 +qq直销台湾版假钞 +qq直销台湾版假钱 +qq直销台湾秃鹰枪 +qq直销喷雾蒙汗药 +qq直销喷雾迷幻药 +qq直销喷雾迷情水 +qq直销大黑鹰弓弩 +qq直销峨眉牌汽枪 +qq直销工字牌汽枪 +qq直销左旋麻黄素 +qq直销挥发型迷药 +qq直销气动钢珠枪 +qq直销盐酸哌替啶 +qq直销盐酸曲马多 +qq直销迷情乖乖水 +qq直销钢珠左轮狗 +qq直销香烟型迷药 +qq直销骚本pcp +qq直销高仿毕业证 +qq直销高仿真假币 +qq真实身份证出售 +qq秃鹰气步枪专卖 +qq秃鹰气步枪供应 +qq秃鹰气步枪出售 +qq秃鹰气步枪提供 +qq秃鹰气步枪直销 +qq秃鹰气步枪订购 +qq秃鹰气步枪销售 +qq营业税发票代开 +qq蒙汗药配方供应 +qq订购54式手枪 +qq订购56式军刺 +qq订购64式手枪 +qq订购awp配件 +qq订购high粉 +qq订购king粉 +qq订购pcp气枪 +qq订购pcp配件 +qq订购pcz山猪 +qq订购万能开锁器 +qq订购云南情蛊药 +qq订购仿真气步枪 +qq订购仿真狙击枪 +qq订购催情口香糖 +qq订购台湾版假币 +qq订购台湾版假钞 +qq订购台湾版假钱 +qq订购喷雾蒙汗药 +qq订购喷雾迷幻药 +qq订购喷雾迷情水 +qq订购大黑鹰弓弩 +qq订购峨眉牌汽枪 +qq订购左旋麻黄素 +qq订购左轮钢珠狗 +qq订购成人电视棒 +qq订购拍肩听话粉 +qq订购气动钢珠枪 +qq订购盐酸哌替啶 +qq订购盐酸曲马多 +qq订购盐酸羟亚胺 +qq订购秃鹰气步枪 +qq订购迷情乖乖水 +qq订购钢珠左轮狗 +qq订购锡峰牌气枪 +qq订购香烟型迷药 +qq订购骚本pcp +qq订购高仿打鸟枪 +qq订购高仿真假币 +qq订购高压打鸟枪 +qq订购高压气步枪 +qq诚信办证会计证 +qq诚信办证军官证 +qq诚信办证医师证 +qq诚信办证房产证 +qq诚信办证护士证 +qq诚信办证教师证 +qq诚信办证毕业证 +qq诚信办证离婚证 +qq诚信办证等级证 +qq诚信办证结婚证 +qq诚信办证身份证 +qq购买54式手枪 +qq购买64式手枪 +qq购买云南情蛊药 +qq购买催情口香糖 +qq购买喷雾蒙汗药 +qq购买喷雾迷幻药 +qq购买喷雾迷情水 +qq购买左旋麻黄素 +qq购买盐酸曲马多 +qq购买迷情乖乖水 +qq购买钢珠左轮狗 +qq购买香烟型迷药 +qq购买高压气步枪 +qq赵氏钢珠弩出售 +qq转让64式手枪 +qq转让pcp配件 +qq转让仿真枪配件 +qq转让钢珠左轮狗 +qq销售77式手枪 +qq销售77式手狗 +qq销售92式手枪 +qq销售awp配件 +qq销售high粉 +qq销售king粉 +qq销售pcp汽枪 +qq销售pcz山猪 +qq销售万能开锁器 +qq销售云南情蛊药 +qq销售假学位证书 +qq销售假学历证书 +qq销售假文凭证书 +qq销售催情口香糖 +qq销售军用54式 +qq销售勃朗宁军刀 +qq销售去氧麻黄素 +qq销售喷雾迷幻药 +qq销售喷雾迷情水 +qq销售大黑鹰弓弩 +qq销售小口径手枪 +qq销售小口径猎枪 +qq销售峨眉牌汽枪 +qq销售左旋麻黄素 +qq销售开刃弹簧刀 +qq销售拍肩听话粉 +qq销售本科假文凭 +qq销售汽车解码器 +qq销售狙击气步枪 +qq销售甲基苯丙胺 +qq销售盐酸哌替啶 +qq销售盐酸曲马多 +qq销售盐酸氯胺酮 +qq销售盐酸羟亚胺 +qq销售秃鹰气步枪 +qq销售考试作弊器 +qq销售身份证原件 +qq销售迷情乖乖水 +qq销售香烟型迷药 +qq销售骚本pcp +qq销售高仿人民币 +qq销售高仿军官证 +qq销售高仿学位证 +qq销售高仿真假钞 +qq销售高仿警察证 +qq锡峰牌气枪出售 +qq阳江刀具专卖网 +qq预订54式手枪 +qq高价领养女宝宝 +qq高仿人民币出售 +qq高仿人民币销售 +qq高仿军官证代办 +qq高仿军官证制作 +qq高仿军官证办理 +qq高仿学位证专卖 +qq高仿学位证买卖 +qq高仿学位证代办 +qq高仿学位证供应 +qq高仿学位证出售 +qq高仿学位证制作 +qq高仿学位证办理 +qq高仿学位证批发 +qq高仿学位证提供 +qq高仿学位证直销 +qq高仿户口本制作 +qq高仿文凭制作网 +qq高仿文凭办理网 +qq高仿毕业证专卖 +qq高仿毕业证代办 +qq高仿毕业证出售 +qq高仿毕业证制作 +qq高仿毕业证办理 +qq高仿真假币直销 +qq高仿真气枪专卖 +qq高仿结婚证代办 +qq高仿结婚证办理 +qq高仿警官证出售 +qq高仿警官证销售 +qq高仿证书代办网 +qq高仿证书办理网 +qq高仿证件专卖网 +qq高仿驾驶证专卖 +qq高仿驾驶证制作 +qq高仿驾驶证办理 +qq高压气步枪批发 +qq高压气步枪提供 +qq高压气步枪直销 +qq高压气步枪购买 +qvod色情电影网 +sm插进湿润的小穴 +tel上门援交服务 +tel援交上门服务 +tel援交美女服务 +tnt炸弹制作方法 +tnt炸药制作方法 +vip在线成人电影 +vip激情成人电影 +vip特区激情在线 +x卧底软件买卖qq +x卧底软件供应qq +x卧底软件出售qq +x卧底软件官网qq +x卧底软件提供qq +x卧底软件销售qq +x手机卧底软件下载 +x手机卧底软件代理 +x手机卧底软件官网 +x手机卧底软件淘宝 +x手机卧底软件破解 +x手机卧底软件网站 +丁香成人论坛贴图区 +丁香欧美成人贴图区 +万能开锁器供应qq +万能开锁器出售qq +万能开锁器提供qq +万能开锁器销售qq +三步倒麻醉弩箭销售 +上海工字牌气枪专卖 +上海工字牌气枪出售 +上海工字牌气狗专卖 +上海情侣网吧门下载 +上门保健性服务qq +上门援交服务tel +上门服务找美女qq +下压试气枪销售qq +下载昆明3夫妻艳照 +下载李宗瑞3p视频 +不主动怎么交女朋友 +不文教父带你嫖韩日 +不用注册免费淫电影 +不用注册淫电影网站 +不良少女日记txt +不该把工农兵捧上天 +不需付费的色情电影 +专业办理毕业证qq +专业提供国内外女郎 +专卖1元假硬币qq +专卖54式手枪qq +专卖56式军刺qq +专卖95式自动步枪 +专卖pcp汽枪qq +专卖万能开锁器qq +专卖上海工字牌气枪 +专卖全金属狩猎弓弩 +专卖去氧麻黄素qq +专卖各类防身电警棍 +专卖增值税发票qq +专卖大黑鹰弓弩qq +专卖安乐死药物qq +专卖小口径手枪步枪 +专卖小口径步枪手枪 +专卖尼泊尔军刀qq +专卖峨眉牌汽枪qq +专卖工字牌汽枪qq +专卖左轮钢珠狗qq +专卖狙击气步枪qq +专卖盐酸哌替啶qq +专卖盐酸曲马多qq +专卖盐酸氯胺酮qq +专卖盐酸羟亚胺qq +专卖秃鹰气步枪qq +专卖粉末型迷药qq +专卖钢珠左轮狗qq +专卖高仿学位证qq +专卖高仿真假币qq +专卖高压打鸟枪qq +专卖高压气步枪qq +东突厥斯坦解放组织 +两腿之间狂暴的野马 +中华人民共和国主席 +中南海高层权利斗争 +中南海高层权力斗争 +中国民主党联合总部 +中国留学生张丽双插 +中国舆论监督网周洪 +中国被占领土1览表 +中握b50供应qq +中握b50套件出售 +中握b50提供qq +中握pcp专卖qq +中谷あいみbt下载 +丰满的视频聊天主持 +乖乖水配方提供qq +买卖16号双管猎枪 +买卖1元假硬币qq +买卖awp狙击步枪 +买卖fox格斗砍刀 +买卖pcp新贵qq +买卖万能开锁器qq +买卖仿真枪配件qq +买卖催情口香糖qq +买卖台湾版假人民币 +买卖大黑鹰弓弩qq +买卖安乐死药物qq +买卖工字牌汽枪qq +买卖气动钢珠枪qq +买卖甲基苯丙胺qq +买卖盐酸哌替啶qq +买卖盐酸曲马多qq +买卖高仿毕业证qq +买卖高仿真假币qq +买卖高仿等级证qq +乱伦无码母爱包乳母 +乳丰穴嫩激情性电影 +云南情蛊药供应qq +云南情蛊药批发qq +云南情蛊药提供qq +云南情蛊药直销qq +云南情蛊药订购qq +云南情蛊药购买qq +云南情蛊药销售qq +亚洲成人小电影下载 +亚洲成人激情淫影院 +亚洲成人贴图区论坛 +亚洲无码原创区bt +亚洲有码原创区bt +亚洲淫色贴图365 +亚洲激情淫少妇贴图 +亚洲激情淫搔穴贴图 +亚洲激情淫色贴图区 +亚洲激情淫色贴图网 +亚甲2氧甲基苯丙胺 +亚甲二氧甲基苯丙胺 +亚硝酸乙酯供应qq +京城男女之食色性也 +人斩少女3赤裸忍者 +今晚我把表姐操上了 +从后面插漂亮小穴妹 +代制1代假冒身份证 +代制1代精仿身份证 +代制1代高仿身份证 +代制2代假冒身份证 +代制2代精仿身份证 +代制2代高仿身份证 +代制假冒1代身份证 +代制假冒2代身份证 +代办假文凭证书qq +代办假等级证书qq +代办大学毕业证qq +代办学位证真实可查 +代办高中毕业证qq +代办高仿46级证件 +代办高仿4级证qq +代办高仿军官证qq +代办高仿大专毕业证 +代办高仿学位证qq +代办高仿户口本qq +代办高仿毕业证qq +代办高仿警官证qq +代办高仿驾驶证qq +代开房屋租赁费发票 +代理x手机卧底软件 +代理威尼斯人娱乐城 +代理百家乐赌博qq +代药物毒品类:血浆 +以色列大卫军刀批发 +任意显号码软件直销 +仿54手枪专卖qq +仿54手枪供应qq +仿54手枪销售qq +仿64手枪销售qq +仿真qiang专卖 +仿真qiang出售 +仿真qiang到货 +仿真狙击枪供应qq +仿真狙击枪出售qq +仿真阻击枪直销qq +你呀的鸡巴长歪了吧 +你好呀我维亻言吧吧 +你把妈的穴穴插满了 +供应1元假硬币qq +供应3d成人电视棒 +供应3箭牌汽枪qq +供应4氢大麻酚qq +供应54式手枪qq +供应54式手枪配件 +供应56式军刺qq +供应5连发猎枪qq +供应64式手枪qq +供应64式手枪配件 +供应77式手枪配件 +供应av电视棒qq +供应awp配件qq +供应fox格斗砍刀 +供应high粉qq +供应pcp新贵qq +供应pcp气枪qq +供应pcp汽枪qq +供应pcp秃鹰套件 +供应pcp配件qq +供应pcp骚本配件 +供应ppk自动手枪 +供应x卧底软件qq +供应x手机卧底软件 +供应万能开锁器qq +供应云南情蛊药qq +供应仿真54式手枪 +供应仿真54式气枪 +供应仿真64式手枪 +供应仿真64式气枪 +供应仿真77式手枪 +供应仿真77式气枪 +供应仿真92式气枪 +供应俄罗斯654k +供应催情催眠药qq +供应催情口香糖qq +供应最新台湾版假币 +供应最新汽车解码器 +供应军用折叠弩qq +供应化学冰牙签qq +供应台湾版假钞qq +供应各式军用枪qq +供应喵喵药供应qq +供应喷雾蒙汗药qq +供应喷雾迷幻药qq +供应喷雾迷情水qq +供应大黑鹰弓弩qq +供应小口径步狗qq +供应少女催情粉qq +供应少女失身水qq +供应尼泊尔军刀qq +供应峨眉牌汽枪qq +供应工字牌汽枪qq +供应左轮钢珠狗qq +供应开刃3棱刀qq +供应开刃蝴蝶刀qq +供应弹簧活塞式气枪 +供应德国a1000 +供应成人电视棒qq +供应手机卡监听软件 +供应手机监听器软件 +供应摇头丸配方qq +供应气动钢珠枪qq +供应气枪b50配件 +供应汽车信号拦截器 +供应汽车干扰器qq +供应汽车拦截器qq +供应汽车解码器qq +供应汽车遥控拦截器 +供应汽车遥控解码器 +供应汽车防盗解码器 +供应海洛因4号qq +供应港38式左轮枪 +供应火药钢珠枪qq +供应特洛伊卧底软件 +供应狙击气步枪qq +供应狙击钢珠专用弩 +供应甲基可可碱qq +供应甲基苯丙胺qq +供应盐酸哌替啶qq +供应盐酸曲马多qq +供应盐酸氯胺酮qq +供应盐酸羟亚胺qq +供应眼镜蛇弓努qq +供应秃鹰气步枪qq +供应胡椒基甲基qq +供应迷奸药配方qq +供应迷情乖乖水qq +供应野外求生刀qq +供应钢珠左轮狗qq +供应锡锋牌汽枪qq +供应香烟型迷药qq +供应高仿假硬币qq +供应高仿毕业证qq +供应高仿真假币qq +供应高仿真假钞qq +供应高压气步枪qq +供应麻醉qiang +俄罗斯654k专卖 +俄罗斯654k出售 +俄罗斯654k提供 +俄罗斯激情淫色贴图 +俄罗斯美女学院快播 +倚天屠龙别记txt +倚天屠龙别记殷素素 +假国外文凭代办qq +假国外文凭制作qq +假学位证书出售qq +假学位证书办理qq +假学位证书销售qq +假文凭代办公司qq +假文凭办理公司qq +假等级证书代办qq +假等级证书办理qq +假证书制作公司qq +假证件制作公司qq +假证件办理公司qq +做家教时被奸txt +健卫小口径步枪出售 +健卫小口径步枪销售 +偷窥合租女生txt +催情催眠药出售qq +催情口香糖出售qq +催情口香糖销售qq +儿子顶到妈妈的花心 +儿子顶到姐姐的花心 +免注册台湾18dy +免费a片日本淫电影 +免费dse淫乱图片 +免费免注册淫色电影 +免费在线淫电影下载 +免费在线淫电影欣赏 +免费在线淫电影网站 +免费在线黄色小电影 +免费成人meinv +免费操小姨子操小姨 +免费淫乱卡通动画片 +免费淫女在线看电影 +免费淫女看电影网站 +免费淫奸女护士图片 +免费淫奸女直接试看 +免费淫电影下载地址 +免费淫电影在线观看 +免费淫电影网址大全 +免费淫色妹妹电影网 +免费淫虫在线看电影 +免费淫黄色电影a片 +免费激情电影爽电影 +免费激情视频聊天室 +免费电影未亡人柔肌 +免费电影现役看护妇 +免费视频激情聊天室 +免费秀聊视舞聊天网 +免费裸舞视频聊天室 +免费观看女教师赤版 +免费观看王小丫做爱 +全日制文凭代办qq +全身1阵颤抖大鸡巴 +公交车上操女大学生 +公公狂操儿媳妇小穴 +公安局女局长安丽明 +六四受难者家属证辞 +兼职学生妹上门服务 +兼职小姐性服务qq +兼职援交妹服务qq +兼职美女妹上门服务 +最好的网上真人赌博 +最新1本道电影下载 +最新汽车万能解码器 +军刀丛林刀专卖qq +军品54式手枪出售 +军品64式手枪出售 +军品92式手枪出售 +军用64式销售qq +军用刀具专卖网qq +军用开山刀批发qq +军用弹簧刀出售qq +军用弹簧刀销售qq +军用狙击弩出售qq +军用狙击弩销售qq +农村公公与媳妇乱伦 +农民真正贫困的根源 +冰毒麻古k粉买qq +冷钢3美武士刀专卖 +凌辱妥学δ畏耪n后 +出售18p2p账号 +出售1代假冒身份证 +出售1代精仿身份证 +出售1代高仿身份证 +出售1元假硬币qq +出售2乙酰吗啡qq +出售2代精仿身份证 +出售2代高仿身份证 +出售3利达弓弩qq +出售3箭牌汽枪qq +出售4氢大麻酚qq +出售54式仿真手枪 +出售54式手枪qq +出售54式手枪子弹 +出售54式手枪配件 +出售64式手枪qq +出售64式手枪配件 +出售77式手枪qq +出售77式手枪电话 +出售77式手枪配件 +出售80年老版假币 +出售92式手枪qq +出售awp配件qq +出售fox格斗砍刀 +出售hd90版假币 +出售high粉教程 +出售high药qq +出售king粉教程 +出售m92f式手枪 +出售pcp套件qq +出售pcp新贵qq +出售pcp新贵配件 +出售pcp气枪qq +出售pcp气枪套件 +出售pcp汽枪qq +出售pcp秃鹰套件 +出售pcp秃鹰配件 +出售pcp配件qq +出售pcp骚本配件 +出售tnt制作方法 +出售x手机卧底软件 +出售万能开锁器qq +出售上海工字牌气枪 +出售中握b50套件 +出售乖乖水配方qq +出售仿真pcp汽枪 +出售仿真人民币qq +出售仿真枪配件qq +出售仿真金属枪qq +出售俄罗斯654k +出售信用卡复制设备 +出售信用卡客户资料 +出售信用卡用户信息 +出售信用卡用户资料 +出售信用卡磁道信息 +出售假冒1代身份证 +出售假冒2代身份证 +出售假学历证书qq +出售假等级证书qq +出售军品77式手枪 +出售军用54式qq +出售军用5连发手枪 +出售军用64式qq +出售军用92式手枪 +出售军用制式92式 +出售军用钢珠弩qq +出售冷钢3美武士刀 +出售勃朗宁军刀qq +出售半自动步枪qq +出售单发麻醉枪qq +出售卧底软件个人版 +出售卧底软件企业版 +出售去氧麻黄碱qq +出售去氧麻黄素qq +出售反屏蔽无线耳机 +出售台湾版假钱qq +出售台版高仿真假币 +出售各型号烟花爆竹 +出售各类假证件qq +出售喵喵药出售qq +出售喷雾蒙汗药qq +出售喷雾迷幻药qq +出售喷雾迷情水qq +出售国产高压电警棍 +出售安乐死慢性毒药 +出售安乐死药物qq +出售定时炸弹定时器 +出售小口径手枪qq +出售小口径步枪qq +出售小口径步枪子弹 +出售小口径步狗qq +出售小口径猎枪qq +出售小口径运动步枪 +出售小口径运动猎枪 +出售小口径钢珠气枪 +出售少女迷情粉qq +出售少女迷情药qq +出售峨眉牌汽枪qq +出售工字牌汽枪qq +出售左旋麻黄素qq +出售左旋麻黄素教程 +出售左轮钢珠狗qq +出售开刃3棱刀qq +出售开刃蝴蝶刀qq +出售弹簧活塞式气枪 +出售微型冲锋枪qq +出售成人3d电视棒 +出售成人dvd光碟 +出售手机x卧底软件 +出售手机变号器qq +出售手枪=货到付款 +出售摇头丸制作方法 +出售改装射钉枪qq +出售无线电作弊器材 +出售日本成人dvd +出售春秋执勤装警服 +出售朝鲜仿真版假币 +出售本科假文凭qq +出售汽车专用解码器 +出售汽车信号屏蔽器 +出售汽车信号拦截器 +出售汽车信号解码器 +出售汽车干扰器qq +出售汽车拦截器qq +出售汽车电子解码器 +出售汽车电脑解码器 +出售汽车芯片解码器 +出售汽车解码器软件 +出售汽车遥控复制器 +出售汽车遥控干扰器 +出售汽车遥控拦截器 +出售海洛因4号qq +出售海洛因制作方法 +出售港38式左轮枪 +出售火药动力钢珠枪 +出售特洛伊卧底软件 +出售狙击气步枪qq +出售猪肉钻石冰qq +出售猪肉钻石白牙签 +出售甲基苯丙胺qq +出售甲基苯丙胺冰毒 +出售电子汽车解码器 +出售男女性数据qq +出售盐酸哌替啶qq +出售盐酸曲马多qq +出售盐酸氯胺酮qq +出售盐酸羟亚胺qq +出售盐酸羟亚胺教程 +出售盐酸羟亚胺电话 +出售秃鹰气步枪qq +出售美国sog军刀 +出售考试作弊器qq +出售考试针孔摄像头 +出售自制92式qq +出售自制双管猎木仓 +出售自制式64式枪 +出售蒙汗药配方qq +出售蓝鹰第3代电棍 +出售虎头牌猎枪qq +出售西班牙奥托军刀 +出售解放军现役军刀 +出售警用手铐仿真枪 +出售警用防身电击棒 +出售走私小口径步枪 +出售身份证原料胶粒 +出售身份证原料薄膜 +出售进口汽车拦截器 +出售野营开山刀qq +出售针孔考试作弊器 +出售钢珠左轮狗qq +出售银行信用卡qq +出售银行卡用户信息 +出售银行卡用户资料 +出售银行卡联系qq +出售锡锋牌汽枪qq +出售防身电击棒警用 +出售香烟型迷药qq +出售高仿军官证qq +出售高仿学位证qq +出售高仿户口本qq +出售高仿毕业证qq +出售高仿真假人民币 +出售高仿真假币qq +出售高仿真假钞qq +出售高仿真枪模qq +出售高仿警官证qq +出售高仿驾驶证qq +出售高压小口径气枪 +出售高压打鸟枪qq +出售高压气步枪qq +出售高压电警棍电话 +出售高压钢珠狗qq +出售高清成人电视棒 +出售高科技赌博仪器 +出售高纯度冰糖qq +出售高考答案请联系 +出售麦角酸合成教程 +出售麦角酸提炼技术 +出售麻醉qiang +出售麻黄素原料qq +出售黑曼巴弓弩qq +分开两片肥嫩的阴唇 +分裂中华人民共和国 +创意身份证号生成器 +利来国际博彩娱乐城 +利来国际娱乐城代理 +制作king粉方法 +制作假学历证书qq +制作假文凭证书qq +制作汽油燃烧弹方法 +制作甲基苯丙胺方法 +制作盐酸羟亚胺qq +制作简易tnt炸弹 +制作脱氧麻黄素方法 +制作高仿会计证qq +制作高仿军官证qq +制作高仿学位证qq +制作高仿户口本qq +制作高仿等级证qq +制作高仿警察证qq +制作高压锅炸弹手册 +制作高压锅炸弹教程 +制作高压锅炸弹方法 +制作高压锅炸弹步骤 +制作黄牙签配方qq +制服下的诱惑txt +制服美少女鲇川なお +制造甲基苯丙胺qq +剁饼子包夜服务qq +前阴后庭抽插自慰器 +办假2代身份证qq +办假大专毕业证qq +办假本科毕业证qq +办理1代假冒身份证 +办理1代精仿身份证 +办理1代高仿身份证 +办理2代假冒身份证 +办理2代精仿身份证 +办理2代高仿身份证 +办理c1驾驶本qq +办理假冒1代身份证 +办理假冒2代身份证 +办理假学历证书qq +办理假文凭证书qq +办理假毕业证书qq +办理假等级证书qq +办理各种防伪身份证 +办理套号毕业证qq +办理学士学位证qq +办理本科假文凭qq +办理英语等级证qq +办理高仿4级证qq +办理高仿会计证qq +办理高仿假证件qq +办理高仿军官证qq +办理高仿学位证qq +办理高仿户口本qq +办理高仿本科证qq +办理高仿硕士证qq +办理高仿等级证qq +办理高仿警官证qq +办理高仿资格证qq +办理高仿身份证qq +办理高仿驾驶证qq +办高仿真身份证qq +加我薇y25511 +加我薇yx255⒒ +加薇信mem627 +勃朗宁军刀专卖qq +勃朗宁手枪提供qq +包夜性服务电话qq +千亿娱乐城真人赌博 +午夜成人激情聊天室 +午夜的诱惑网友自拍 +卖铅弹上海工字汽枪 +博彩通jqk111 +博彩金狮国际娱乐城 +卧底软件个人版下载 +卫生棉条真人使用图 +印度色情片迅雷下载 +厕所盗摄meinv +原子弹制造完全手册 +厨房自制高压锅炸弹 +去掉号就是我的微信 +去氧麻黄碱制作方法 +去氧麻黄素专卖qq +去氧麻黄素出售qq +去氧麻黄素提供qq +去氧麻黄素销售qq +又肥又嫩的小骚屄儿 +台湾18成人电影院 +台湾性爱片下载地址 +台湾版假人民币出售 +台湾版假币买卖qq +台湾版假币供应qq +台湾版假币批发qq +台湾版假币直销qq +台湾版假币订购qq +台湾版假钞买卖qq +台湾版假钞供应qq +台湾版假钞批发qq +台湾版假钞直销qq +台湾版假钞订购qq +台湾版假钱买卖qq +台湾版假钱供应qq +台湾版假钱批发qq +台湾版假钱直销qq +台湾版假钱订购qq +司马仿真枪模型QQ +同城提供性服务qq +同志会所找帅哥服务 +同性恋mb按摩服务 +后面插入处女的肉穴 +和jiejie插穴 +和jiejie淫穴 +和jiejie肏屄 +和meimei做爱 +和meimei肏屄 +和meimei肏穴 +咪咪爱论坛最新地址 +咬着她的奶头干了她 +品色堂论坛最新地址 +品色永远免费淫电影 +哥哥用力舒服死我了 +哥哥用力舒服死我吧 +哦再快小屄要美死丁 +哪个酒店有外国小姐 +哪里有连发猎枪买卖 +哪里能买到自制手枪 +售54式qiang +售高仿真人民币qq +唯我独尊的美国强盗 +啊快插啊小屄美死了 +喷雾蒙汗药专卖qq +喷雾蒙汗药专售qq +喷雾蒙汗药供应qq +喷雾蒙汗药出售qq +喷雾蒙汗药批发qq +喷雾蒙汗药提供qq +喷雾蒙汗药直销qq +喷雾蒙汗药订购qq +喷雾蒙汗药购买qq +喷雾蒙汗药销售qq +喷雾迷幻药供应qq +喷雾迷幻药批发qq +喷雾迷幻药提供qq +喷雾迷幻药直销qq +喷雾迷幻药订购qq +喷雾迷幻药购买qq +喷雾迷幻药销售qq +喷雾迷情水批发qq +喷雾迷情水提供qq +喷雾迷情水直销qq +喷雾迷情水订购qq +喷雾迷情水购买qq +喷雾迷情水销售qq +国产汽狗专卖气枪货 +圣纱耶香圣小岛无码 +在乳房和阴道mo弄 +在线6合彩真钱下注 +在线现金6合彩qq +在线真钱百家乐博彩 +在镜子里看我和老公 +在骚穴里抽插著阳具 +坦克车装扮成大卡车 +增值税发票代开qq +增值税发票出售qq +增值税发票联系qq +壮汉给纯情处女开苞 +处女上门性服务qq +处女校花被奸txt +外国人强悍的性要求 +外教上课迟到就挨操 +大6淫乱美女图图片 +大丑风流记全文阅读 +大叔的幸福人妻生活 +大哥我知道你很寂寞 +大学毕业证代办qq +大学毕业证办理qq +大学生0604运动 +大学生上门特殊服务 +大学生援交服务qq +大学生援交服务电话 +大空明日香迅雷下载 +大肉棒在妈妈的阴道 +大肉棒插进我的肉屄 +大胆总裁敢抢我妈咪 +大阴唇jiejie +大鸡巴插进了的小穴 +大鸡巴插进她肉洞里 +大鸡巴操得很很舒服 +大鸡巴操得我好爽啊 +大黑鹰弓弩专卖qq +大黑鹰弓弩供应qq +大黑鹰弓弩出售qq +大黑鹰弓弩直销qq +大黑鹰弓弩销售qq +大龟头戳进了子宫里 +大龟头顶住子宫深处 +天安门事件1989 +天安门血腥清场内幕 +天然むすめ素人みか +太阳城娱乐城百家乐 +太阳城娱乐网站投注 +太阳城真人娱乐qq +太阳城网上娱乐平台 +夫妇乐园txt全集 +央视是纳税人的央视 +奥巴马否认与夏雨荷 +女医生风情史txt +女大学生宿舍506 +女总裁爱上我txt +女教师禽兽轮奸陷阱 +女教师赤版免费下载 +女文工团的最后下落 +女皇陛下的笑话婚姻 +女监狱男管教txt +女记者被山西检察官 +女领导男秘书txt +妈妈挺动雪白的肥臀 +妈妈的性奴史txt +妓女上门剁饼子服务 +妓女上门性服务qq +妓女上门服务tel +妓女全套服务tel +妓女包夜提供性服务 +妓女提供性服务qq +妹妹可自拍luo聊 +妹妹张开双腿等你操 +妹妹的大阴唇好嫩啊 +妹妹的小穴舒服死了 +妹妹等你大鸡吧来插 +妹妹被操的淫水直流 +姐姐和我乱伦理小说 +姐姐和我乱伦理电影 +姐姐的嫩穴mm嫩穴 +姐弟妹乱伦专辑下载 +姨妈和我乱伦理小说 +婷婷基地色情5月天 +婷婷激情俱乐部导航 +嫩穴把肉棒包得紧紧 +学生妹上门全套服务 +学生妹上门援交信息 +学生妹全套援交qq +学生妹全套服务qq +学生妹小姐包夜服务 +学生妹援交上门服务 +学生爱国者运动证明 +孽欲追击档案之邪杀 +宁王府成人论坛导航 +安乐死药物供应qq +安乐死药物出售qq +安乐死药物订购qq +安乐死药物购买qq +安徽庐江县6p原图 +安徽庐江官员6p照 +完全免费在线淫电影 +官府忽悠百姓之能事 +宝马娱乐城注册即送 +家丁绿帽之杨凌乱入 +富婆找鸭子交友qq +富婆找鸭子包养qq +对著暴露的美穴狂插 +将手指插入她的穴里 +将肉棒对准她的穴口 +将肉棒插在阴道里面 +小口径手枪步枪专卖 +小口径步枪出售qq +小口径步枪子弹专卖 +小口径步枪子弹出售 +小口径步枪订购qq +小口径步枪销售qq +小口径猎枪供应qq +小口径猎枪提供qq +小口径猎枪销售qq +小口径运动步枪专卖 +小口径运动步枪出售 +小口径运动步枪销售 +小妹上门性服务qq +小姐上门性服务qq +小姐包夜性服务qq +小姐按摩全套服务q +小姨令我射了好几次 +小姨和我淫bb小说 +小姨子做爱记txt +小姨子的阴道好紧啊 +小嫩穴流血了流水了 +小幼女开处清晰大图 +小泽玛利亚全集种子 +小泽玛利亚电影全集 +小泽玛利亚视频下载 +小泽玛利亚种子下载 +小泽玛利亚诱惑色情 +小泽玛莉亚无码下载 +小穴双手紧抓住丰臀 +小穴流水妹妹手指插 +小穴的淫骚香味好爽 +小穴肉棒插穴用力插 +小穴被阴茎插的好痛 +小骚娘们的小嫩骚屄 +小龙女与淫兽txt +少女迷情粉货到付款 +少妇上门性服务qq +少妇小穴被操的很爽 +少妇淫心我要看淫心 +少妇白洁txt全集 +少妇白洁小说txt +少妇白洁电子书下载 +少妇白洁的淫乱生活 +少妇被强奸密穴流水 +少年阿宾txt全集 +少年阿宾电子书下载 +尼泊尔军刀专卖qq +尼泊尔军刀专卖电话 +尼泊尔军刀代购qq +尼泊尔军刀供应qq +尼泊尔军刀出售qq +尼泊尔军刀批发qq +尼泊尔军刀提供qq +尼泊尔军刀真刀专卖 +尼泊尔军刀订购qq +尼泊尔军刀转让qq +尼泊尔军刀销售qq +居家女人的淫荡性事 +岩本亚由美电驴下载 +工字牌气枪出售专卖 +工字牌汽枪专卖qq +工字牌汽枪买卖qq +工字牌汽枪供应qq +工字牌汽枪出售qq +工字牌汽枪批发qq +工字牌汽枪提供qq +工字牌汽枪送货上门 +工字牌汽枪销售qq +左旋麻黄素供应qq +左旋麻黄素合成配方 +左旋麻黄素批发qq +左旋麻黄素提供qq +左旋麻黄素直销qq +左旋麻黄素订购qq +左旋麻黄素购买qq +左旋麻黄素送货上门 +左旋麻黄素销售qq +左轮钢珠狗专卖qq +左轮钢珠狗供应qq +左轮钢珠狗批发qq +左轮钢珠狗直销qq +左轮钢珠狗订购qq +左轮钢珠狗购买qq +巨乳女优千秋大合集 +巨大的鸡巴戳了进去 +干jiejie小穴 +干meimei小穴 +干的好爽要爽死我了 +广州3箭牌气枪订购 +广州小姐找上门服务 +床上夫妻激情自拍图 +床上激情淫乱小搔穴 +庐江不雅照全集种子 +庐江不雅照图片种子 +庐江不雅照视频种子 +庐江县委不雅照bt +庐江县委书记5p照 +庐江县委书记群p图 +庐江县委书记群p照 +庐江县委书记裸照片 +庐江县委书记裸照系 +庐江县委书记雅照女 +庐江县官员群p照片 +庐江县官员艳照下载 +庐江县官员艳照全套 +庐江县群p照片全集 +庐江官员6p事件照 +庐江官员不雅照下载 +庐江官员床照门下载 +庐江官员艳门照下载 +庐江宾馆3p全裸照 +庐江艳照背后的事情 +庐江艳照门ed2k +庐江艳照门图片下载 +庐江艳照门种子下载 +庶女攻略完结txt +开心激情成人色情网 +弓弩专卖网货到付款 +弟弟摸姐姐胸部小说 +弟弟的肉棒又粗又大 +弩的制作方法和图纸 +弹簧活塞式气枪供应 +弹簧活塞式气枪出售 +弹簧活塞式气枪批发 +弹簧活塞式气枪提供 +弹簧活塞式气枪直销 +弹簧活塞式气枪购买 +弹簧活塞式气枪销售 +强制执行女体崩壊1 +强奸后的爱恋txt +强奸林心如扒开阴道 +当面交易军官证样本 +当面交易居民户口本 +当面交易英语等级证 +当面交易高仿学位证 +当面交易高仿户口本 +当面交易高仿身份证 +快播高清色情片下载 +快速办理驾驶证qq +怎么用土办法做武器 +性交小说txt下载 +性器肛门原千寻桜井 +性感meinv淫穴 +性教育片性教育电影 +性爱小说txt下载 +性电影免费在线试看 +性福联盟淫宝贝导航 +悲惨双胞胎1起被奸 +情色5月天qvod +情色6月天mm淫乱 +情色导航激情爽电影 +情色成人视频聊天室 +感冒药提炼冰毒技术 +感冒药提炼冰毒教程 +成人3d电视棒批发 +成人av电影在线看 +成人专用播放器下载 +成人午夜激情聊天室 +成人在线免费淫电影 +成人小电影在线点播 +成人收费裸聊室qq +成人激情免费电影院 +成人激情性爱电影网 +成人激情视频聊天室 +成人激情聊天室网站 +成人电视棒专卖qq +成人电视棒交易qq +成人电视棒提供qq +成人电视棒订购qq +成人电视棒货到付款 +成人电视棒预订qq +成人网址发布器下载 +成人色情片下载网站 +成人裸聊聊天室qq +成人高清电视棒官网 +成都妹妹上酒店服务 +成都找小姐上门服务 +我们就是你的天堂妹 +我占有了妈妈和阿姨 +我叫柔儿吗我的胃新 +我和1群女人的故事 +我和6个男人的故事 +我和小啊姨在车上做 +我和我的爱人的故事 +我很美哦晚上请联系 +我操了美丽的女律师 +我是1名情感咨询师 +我的娇妻欣儿txt +我的性启蒙老师下载 +我的放荡生活txt +我的美艳岳母txt +我第1次舔表姐的阴 +我该死免费色情电影 +或者你直接加我徽信 +战争正在向我们走来 +户口管制制度的弊端 +手伸到下体抚摸嫩穴 +手把手教你做原子弹 +手指不断在肉穴扣弄 +手指对她阴蒂的刺激 +手指扒开红嫩的阴唇 +手指还插在她的淫穴 +手机卡监听软件下载 +手机卧底软件体验版 +手机卧底软件破解版 +手机注册看性爱电影 +手机注册看激情电影 +手机监听器软件下载 +手机窃听器专卖qq +手机窃听软件x卧底 +手机窃听软件破解版 +手机远程卧底支付宝 +手柄制作炸弹引爆器 +手淫少妇自慰喷淫水 +打倒中华人民共和国 +批发1代假冒身份证 +批发1代精仿身份证 +批发1代高仿身份证 +批发1元假硬币qq +批发2代假冒身份证 +批发2代精仿身份证 +批发2代高仿身份证 +批发2甲基安非他明 +批发54式手枪qq +批发54式手枪配件 +批发56式军刺qq +批发64式手枪qq +批发64式手枪配件 +批发77式手枪qq +批发77式手枪配件 +批发85式狙击步枪 +批发88式狙击步枪 +批发awp狙击步枪 +批发awp配件qq +批发fox格斗砍刀 +批发high粉qq +批发pcp汽枪qq +批发pcp秃鹰套件 +批发pcp配件qq +批发pcp骚本配件 +批发x手机卧底软件 +批发云南情蛊药qq +批发仿真54式气枪 +批发仿真64式气枪 +批发仿真77式气枪 +批发仿真92式气枪 +批发供应high粉 +批发供应king粉 +批发供应左旋麻黄素 +批发供应盐酸羟亚胺 +批发假冒1代身份证 +批发假冒2代身份证 +批发催情口香糖qq +批发台湾版假钞qq +批发喵喵药批发qq +批发喷雾蒙汗药qq +批发喷雾迷幻药qq +批发喷雾迷情水qq +批发小口径步狗qq +批发少女催情粉qq +批发尼泊尔军刀qq +批发尼泊尔军刀电话 +批发峨眉牌汽枪qq +批发工字牌汽枪qq +批发左旋麻黄素qq +批发左轮钢珠狗qq +批发弹簧活塞式气枪 +批发成人3d电视棒 +批发手机变号器软件 +批发摇头丸配方qq +批发气动钢珠枪qq +批发氯化氨甲酰胆碱 +批发汽车信号拦截器 +批发甲基可可碱qq +批发甲基苯丙胺qq +批发盐酸哌替啶qq +批发盐酸曲马多qq +批发盐酸氯胺酮qq +批发盐酸羟亚胺qq +批发秃鹰气步枪qq +批发精仿兰博求生刀 +批发精仿军用潜水刀 +批发精仿尼泊尔军刀 +批发精仿贝尔求生刀 +批发精仿鹰飞凌军刀 +批发迷情乖乖水qq +批发钢珠左轮狗qq +批发香烟型迷药qq +批发骚本汽木仓qq +批发高仿真假币qq +批发高仿真枪模qq +批发高压气步枪qq +批发高压电警棍电话 +找小妹上门服务qq +找小姐上门qq过夜 +找小姐上门按摩服务 +找小姐上门服务qq +找小姐上门服务信息 +找小姐包夜服务信息 +找美女上门包夜qq +找鸭子男妓上门服务 +把你的小穴夹紧用力 +抽插捅挺阴唇处女膜 +拿着纳税人钱的骗子 +按摩女上门服务qq +按摩女郎之彩虹某处 +提供16号双管猎枪 +提供1元假硬币qq +提供1夜情服务qq +提供46级考前答案 +提供54式手枪qq +提供54式手枪配件 +提供56式军刺qq +提供5连发猎枪qq +提供64式手枪qq +提供64式手枪配件 +提供77式手枪qq +提供77式手枪配件 +提供awp狙击步枪 +提供awp配件qq +提供high粉qq +提供pcp新贵qq +提供pcp气枪qq +提供pcp汽枪qq +提供pcp秃鹰套件 +提供pcp配件qq +提供ppk自动手枪 +提供x手机卧底软件 +提供上门性服务qq +提供乖乖水配方qq +提供云南情蛊药qq +提供仿真54式手枪 +提供仿真54式气枪 +提供仿真64式手枪 +提供仿真64式气枪 +提供仿真77式手枪 +提供仿真77式气枪 +提供仿真92式手枪 +提供仿真92式气枪 +提供俄罗斯654k +提供催情口香糖qq +提供催情速溶片qq +提供单管半自动猎枪 +提供台湾版假钞qq +提供喷雾蒙汗药qq +提供喷雾迷幻药qq +提供喷雾迷情水qq +提供安乐死毒药qq +提供少女催情粉qq +提供尼泊尔军刀qq +提供尼泊尔军刀电话 +提供峨眉牌汽枪qq +提供工字牌汽枪qq +提供左旋麻黄素qq +提供左轮钢珠狗qq +提供庐江艳照门qq +提供开刃蝴蝶刀qq +提供弹簧活塞式气枪 +提供德国a1000 +提供成人电视棒qq +提供摇头丸配方qq +提供无线电作弊器材 +提供气动钢珠枪qq +提供氯化氨甲酰胆碱 +提供氯胺酮制作配方 +提供汽车信号拦截器 +提供汽车解码器qq +提供海洛因4号qq +提供港38式左轮枪 +提供特洛伊卧底软件 +提供狙击气步枪qq +提供甲基苯丙胺qq +提供盐酸哌替啶qq +提供盐酸曲马多qq +提供盐酸氯胺酮qq +提供秃鹰气步枪qq +提供线上真人百家乐 +提供线上真钱老虎机 +提供迷情乖乖水qq +提供钢珠左轮狗qq +提供锡锋牌汽枪qq +提供香烟型迷药qq +提供高仿人民币qq +提供高仿假硬币qq +提供高仿真假币qq +提供高压气步枪qq +提供高清成人电视棒 +提供高纯度k粉qq +提供鹰飞凌军刀qq +提供麻醉qiang +提供黄牙签提炼技术 +提炼罂粟花方法qq +插meimei小穴 +插meimei淫屄 +插入处女的肉穴深处 +插入她的搔b爽死了 +插的妈妈的小穴好爽 +援交女上门服务qq +援交女全套服务qq +援交女包夜电话qq +援交妹上门包夜服务 +援交妹上门提供服务 +援交妹上门服务信息 +援交妹上门服务性息 +援交妹全套服务qq +援交妹包夜服务电话 +援交学生妹全套qq +援交美女服务tel +搔meimei黄站 +摇头丸送货上门qq +操jiejie的穴 +操meimei湿穴 +改装发令枪专卖qq +放光明电视制作中心 +政府信用的彻底丧失 +政府和地产商的合谋 +政府和官员就是驴子 +教你制作高压锅炸弹 +教授氯胺酮制作方法 +教授海洛因制造方法 +新任教师の淫行物语 +新利娱乐城真人赌博 +新康泰克造冰毒技术 +新康泰克造冰毒教程 +新康泰克造冰毒方法 +无政府主义者的食谱 +无政府主义食谱bt +无政府主义食谱下载 +无政府主义食谱种子 +无政府主义食谱资源 +无数学生美女等着你 +日本1本道av下载 +日本av与欧美av +日本av之旅txt +日本h画漫bt下载 +日本mm性激情电影 +日本免费激情学生美 +日本卡通淫色动画片 +日本女优8分钟长片 +日本成人淫色dvd +日本成人激情3级片 +日本成人贴图区论坛 +日本淫虫在线看电影 +日本淫贴图淫妻贴图 +日本激情免费小电影 +日本激情淫影片下载 +日本激情淫色动画片 +日本激情淫色贴图区 +日本激情片电影无码 +日本激情视频聊天室 +日本精选无码dvd +日本美女两腿叉开图 +日本美女鲍鱼贴图区 +日本色情小游戏大全 +日片罕见3p加肛交 +日韩色情片迅雷下载 +日韩艳情片迅雷下载 +早安卧底小姐txt +昆明3夫妻高清艳照 +昆明3对夫妻玩群p +昆明3对夫妻群p图 +明珠国际网上娱乐城 +星光伴我淫小说下载 +月荷这个女人txt +有偿抱养女宝宝qq +有偿抱养男宝宝qq +有偿捐献肾器官qq +有偿提供肾器官qq +有偿提供肾器官电话 +有偿收养男宝宝qq +有偿送养女婴儿qq +有偿送养男婴儿qq +有偿领养女宝宝qq +有偿领养男宝宝qq +有泡妞约p秘籍出售 +有的只是性福和激情 +本站的免费成人电影 +李克强第5代领导人 +李宗瑞3p视频下载 +李宗瑞淫照种子下载 +李宗瑞淫照种子地址 +李宗瑞迷奸全集bt +来博真人百家乐赌博 +极品小妹性服务qq +极品美女的超级保镖 +极品金发美女美穴图 +林心如做爱网有激情 +校园丝袜教师txt +梦中的女孩小说下载 +森田めぐみ凌辱饲育 +欢迎g8情色电影院 +欢迎g9情色电影院 +欧美成人小电影下载 +欧美成人漫画贴图区 +欧美淫图成人色情网 +欧美淫女在线看电影 +欧美淫奸女直接试看 +欧美激情淫色贴图区 +欧美激情淫色贴图网 +欧美色情片迅雷下载 +欲望成人3gp视频 +正品名刀野营刀具网 +母子淫奸乱轮现场看 +毛meimei淫色 +毛meimei黄站 +气动仿真狗销售qq +气动钢珠枪买卖qq +气动钢珠枪供应qq +气动钢珠枪批发qq +气动钢珠枪提供qq +气动钢珠枪直销qq +气动钢珠枪订购qq +气枪/出售/专卖网 +气枪/猎枪/钢珠枪 +气枪b50配件专供 +气枪b50配件促销 +气枪价格气枪专卖店 +气枪图纸cad下载 +气枪图纸cad共享 +气枪子弹专卖店qq +气枪消声器出售qq +气枪购买|气枪组装 +气皇400出售qq +氯化氨甲酰胆碱供应 +氯化氨甲酰胆碱批发 +氯化氨甲酰胆碱提供 +氯化氨甲酰胆碱直销 +氯化氨甲酰胆碱销售 +氯甲酸乙酯供应qq +氯甲酸甲酯供应qq +氯胺酮制作方法qq +氯胺酮制作配方qq +求简易炸弹制作方法 +求自己的爸爸和她干 +江core江ze民 +江山如此多娇txt +江湖淫娘txt全集 +江湖淫娘电子书下载 +汽动钢珠枪订购qq +汽油弹简易制作教程 +汽油燃烧瓶自制方法 +汽狗支付宝专卖qq +汽车专用解码器出售 +汽车信号屏蔽器出售 +汽车信号干扰器出售 +汽车干扰器供应qq +汽车拦截器供应qq +汽车拦截器出售qq +汽车拦截器订购qq +汽车拦截器购买qq +汽车芯片解码器出售 +汽车芯片解码器销售 +汽车解码器供应qq +汽车解码器提供qq +汽车解码器联系qq +汽车解码器销售qq +汽车遥控干扰器供应 +汽车遥控干扰器出售 +汽车遥控拦截器出售 +汽车遥控解码器出售 +汽车遥控解码器批发 +汽车门锁解码器直销 +汽车防盗解码器批发 +波多野结衣qvod +波多野结衣作品下载 +波多野结衣合集下载 +注册送现金真人棋牌 +注册通道看情色电影 +浪漫空姐之为性锺情 +浪穴被你插得爽死了 +海洛因4号买卖qq +海洛因制造方法qq +海王星百家乐娱乐城 +淘金盈国际线上娱乐 +淫b内射电影在线看 +淫meimei电影 +淫meimei贴图 +淫乱小说txt下载 +淫乱金发meinv +淫女乱搞免费3级片 +淫奸jiejie穴 +淫奸meimei穴 +淫奸女电影直接试看 +淫妹妹成人情色论坛 +淫术炼金士小说下载 +淫民俱乐部做爱顶级 +淫液不断从穴里流出 +淫电影免费在线观看 +淫穴把整个龟头吸住 +淫色小说txt下载 +淫色小说网短片色情 +淫色少妇做爱淫穴流 +淫色少妇狗小说大全 +淫艳的女房东txt +淫荡meinv医生 +混迹在美女如云公司 +温彻斯特1000x +滴鼻液合成冰毒技术 +滴鼻液合成冰毒方法 +漂亮姐姐的色情实习 +潘金莲导航最新地址 +潜伏者手机监听软件 +澳门十2生肖乐透彩 +澳门真人赌场大家旺 +激情性爱电影观看网 +激情成人视频聊天室 +激情文字聊天室qq +激情裸聊视频聊天室 +火药动力钢珠枪出售 +灯草和尚txt在线 +炸弹遥控器制作方法 +炸药导火索批发qq +点点激情播放性电影 +爱上性感少妇txt +爱上风情女老板熳姐 +爱神之传奇小说下载 +爷爷顶到嫂子的花心 +爽爽爽台湾成人贴图 +特洛伊卧底软件qq +特洛伊卧底软件出售 +特洛伊卧底软件销售 +狂插meimei穴 +狂插meinv老师 +狙击气步枪专卖qq +狙击气步枪直销qq +狙击气步枪转让qq +狡猾的风水相师下载 +猎艳美女领导txt +猛地插入了她的肥穴 +猛男狂干meinv +王子淫传txt全集 +王子淫传电子书下载 +王民生3p视频下载 +王若葳600张裸照 +现代艳帝传奇txt +现役看护妇电影下载 +用舌头舔着他的马眼 +用舌头舔着大小阴唇 +甲基丙烯腈供应qq +甲基可可碱销售qq +甲基磺酰氯供应qq +甲基苯丙胺制作工艺 +甲基苯丙胺制作教程 +甲基苯丙胺制作方法 +甲基苯丙胺制作流程 +甲基苯丙胺制作过程 +甲基苯丙胺制造方法 +甲基苯丙胺原料出售 +甲基苯丙胺合成工艺 +甲基苯丙胺合成方法 +甲基苯丙胺批发qq +甲基苯丙胺提取技术 +甲基苯丙胺提取教程 +甲基苯丙胺提取方法 +甲基苯丙胺订购qq +甲基苯丙胺销售qq +电影淫电影艳情电影 +男人本性我感觉没错 +男人本色之欲望校园 +男同成人视讯聊天室 +男女激情淫乱图片穴 +男女激情淫乱穴下载 +男女激情淫影片图片 +男女激情淫影片播放 +男妓上门性服务qq +白石ひより完全攻略 +白肌meinv琴也 +百家乐在线下注平台 +百家乐在线赌城投注 +百家乐在线赌钱投注 +百家性大型bt黄站 +百家性大型免费黄站 +百家性大型娱乐黄站 +百家性大型黄站妹妹 +百家性大型黄站视频 +百家性大型黄站网址 +百家性超级淫色图片 +皇冠国际博彩投注网 +盐酸去氧麻黄碱电话 +盐酸哌替啶批发qq +盐酸哌替啶提供qq +盐酸哌替啶直销qq +盐酸哌替啶购买qq +盐酸哌替啶销售qq +盐酸曲马多供应qq +盐酸曲马多出售qq +盐酸曲马多批发qq +盐酸曲马多提供qq +盐酸曲马多直销qq +盐酸曲马多订货qq +盐酸曲马多订购qq +盐酸曲马多购买qq +盐酸曲马多销售qq +盐酸氯胺酮供应qq +盐酸氯胺酮出售qq +盐酸氯胺酮制作qq +盐酸氯胺酮批发qq +盐酸氯胺酮提供qq +盐酸氯胺酮直销qq +盐酸氯胺酮订购qq +盐酸氯胺酮销售qq +盐酸羟亚胺专卖qq +盐酸羟亚胺供应qq +盐酸羟亚胺制作方法 +盐酸羟亚胺批发qq +盐酸羟亚胺提供qq +盐酸羟亚胺提炼qq +盐酸羟亚胺直销qq +盐酸羟亚胺订购qq +盐酸羟亚胺送货上门 +盐酸羟亚胺配方qq +盐酸羟亚胺销售qq +直销1元假硬币qq +直销3箭牌汽枪qq +直销54式手枪qq +直销54式手枪配件 +直销64式手枪qq +直销64式手枪配件 +直销77式手枪qq +直销77式手枪配件 +直销awp狙击步枪 +直销awp配件qq +直销fox格斗砍刀 +直销pcp新贵配件 +直销pcp秃鹰套件 +直销pcp配件qq +直销云南情蛊药qq +直销仿真枪配件qq +直销催情口香糖qq +直销台湾版假币qq +直销台湾版假钞qq +直销喷雾迷幻药qq +直销喷雾迷情水qq +直销大黑鹰弓弩qq +直销少女催情粉qq +直销峨眉牌汽枪qq +直销工字牌汽枪qq +直销左旋麻黄素qq +直销左轮钢珠狗qq +直销弹簧活塞式气枪 +直销挥发型迷药qq +直销挥发性迷药qq +直销氯化氨甲酰胆碱 +直销汽车信号拦截器 +直销汽车芯片解码器 +直销甲基苯丙胺qq +直销盐酸曲马多qq +直销盐酸氯胺酮qq +直销秃鹰气步枪qq +直销考试作弊器qq +直销迷情乖乖水qq +直销钢珠左轮狗qq +直销锡锋牌汽枪qq +直销香烟型迷药qq +直销高仿人民币qq +直销高仿真假币qq +直销高压仿真枪qq +直销高压打鸟枪qq +直销高压气步枪qq +直销高压电警棍qq +真人娱乐城博彩导航 +真人娱乐老虎机qq +真人百家乐网络下注 +真人网上百家乐开户 +真人美女视频聊天室 +真人脱衣免费聊天室 +真实身份证出售中心 +真实银行卡专卖qq +真木亚里沙电驴下载 +真钱扎金花网络平台 +真钱百家乐在线赌博 +真钱轮盘百家乐下注 +真钱轮盘百家乐赌博 +研究生考生答案包过 +硝酸胺炸药制作方法 +硝铵炸药的制作方法 +秃鹰pcp专卖qq +秃鹰pcp订购qq +秃鹰气步枪专卖qq +秃鹰气步枪出售qq +秃鹰气步枪批发qq +秃鹰气步枪提供qq +秃鹰气步枪订购qq +秃鹰气步枪销售qq +空巢留守村妇txt +穿越火线之露水情缘 +穿越谁吃了我的皇妃 +第6代窃听软件淘宝 +第7色大型黄色网站 +简单赤裸的艺术摄影 +粉嫩粉嫩的小穴流水 +粉嫩美少女穴让你插 +粉末型迷药提供qq +粉红嫩穴鲍鱼嫩穴1 +粉红嫩穴鲍鱼嫩穴2 +粉红嫩穴鲍鱼嫩穴3 +粗大的肉棒我受不了 +粗大的鸡巴插入穴洞 +粗大肉棒从后面插入 +粗长的小弟弟让你爽 +精子射到妈妈的穴里 +精子射到姐姐的穴里 +精液射入了她的体内 +精液射在妹妹的子宫 +精液射进妈妈穴里面 +精液射进小姨的子宫 +红太阳是怎样升起的 +红楼绮梦txt全集 +红楼绮梦电子书下载 +经典免费淫电影下载 +网游喷血美女左小娜 +网络指定销售88式 +罗马艳情史迅雷下载 +美丽女教师的性经历 +美军现役军刀d80 +美国sog军刀专卖 +美国小姐淫荡舔乳照 +美女口含鸡吧玩内射 +美女在线裸聊视频网 +美女孩含双棍玩内射 +美女激情视频聊天室 +美女脱衣激情裸聊室 +美女裸体视频聊天室 +美女面对面激情裸聊 +美姐凌辱计划txt +美少妇的哀羞txt +老公喜欢干我的屁眼 +老婆在朋友胯下呻吟 +老师含住我的小弟弟 +老板手机号出售qq +考试短信接收器qq +聊斋之艳蛇迅雷下载 +聊斋艳坛之灯草和尚 +聊斋艳谭之灯草和尚 +肉体留不住男人的心 +肉壁紧紧的包著龟头 +肉棒1阵猛烈的抽插 +肉棒入少妇嫩穴嫩穴 +肉棒在乳沟来回猛抽 +肉棒在姐姐的阴道里 +肉棒插入妹妹的肉缝 +肉棒插入小姨的肉缝 +肉棒插入淫荡少妇穴 +肉棒插入湿湿的肉缝 +肉棒插入美女的肉缝 +肉棒插入肥肥的淫道 +肉棒插入风骚少妇穴 +肉棒狂插女人小嫩穴 +肉棒的抽插干的好爽 +肉棒触碰前面的肉穴 +肉洞深处不断地蠕动 +肉穴肥肥的裹着阴茎 +肏meimei淫屄 +肥嫩的小骚屄儿阴部 +自制化学燃烧弹教程 +自制化学燃烧弹方法 +自制汽油燃烧瓶教程 +自制高压锅炸弹过程 +舌头在小穴周围舔弄 +舔着两片湿润的阴唇 +舔舔私处妹妹嗷嗷叫 +色meimei淫穴 +色中色成人电影qq +色中色成人视讯qq +色即是空之甜性涩爱 +色女免费黄色小电影 +色情flash下载 +色情排行榜色情导航 +色情片劲爆床戏下载 +色情电子书打包下载 +色情电影色情排行榜 +色聊人午夜激情聊天 +色聊激情视屏聊天室 +艳情短篇合集txt +花园bt亚洲激情区 +苍井空快播qvod +苍井空迅雷下载种子 +苍井空迅雷种子下载 +英语46级答案出售 +英雄无敌之美女军团 +莆田市政府侵吞涉案 +菅野亚梨沙迅雷下载 +菲律宾太阳城投注网 +营业税发票代开qq +萨达姆和布什对情歌 +落魄女生酷总裁爱情 +蒙汗药配方供应qq +蓝鹰第3代电棍出售 +蔚心psy8327 +蕾丝内裤被龟头顶穿 +虎头5连发猎枪出售 +虎头牌单管猎枪专卖 +虎头牌单管猎枪出售 +虎头牌双管猎枪专卖 +虎头牌双管猎枪出售 +虎头牌双管猎枪销售 +蜜桃成熟时高清下载 +被干的喷水的高清图 +西班牙奥托军刀专卖 +西藏人民大起义运动 +解放军现役军刀专卖 +警用手榴弹出售qq +警用电击器防身供应 +订购54式手枪qq +订购54式手枪配件 +订购64式手枪qq +订购64式手枪配件 +订购77式手枪配件 +订购awp配件qq +订购b50气枪配件 +订购high粉qq +订购pcp新贵配件 +订购pcp汽枪qq +订购pcp秃鹰套件 +订购pcp骚本配件 +订购万能开锁器qq +订购中握b50套件 +订购云南情蛊药qq +订购仿真气步枪qq +订购仿真狙击枪qq +订购催情口香糖qq +订购台湾版假币qq +订购喷雾型迷药qq +订购喷雾蒙汗药qq +订购喷雾迷幻药qq +订购喷雾迷情水qq +订购安乐死药物qq +订购小口径步枪qq +订购小口径步狗qq +订购少女催情粉qq +订购尼泊尔军刀qq +订购尼泊尔军刀电话 +订购峨眉牌汽枪qq +订购左轮钢珠狗qq +订购弹簧活塞式气枪 +订购成人3d电视棒 +订购成人电视棒qq +订购汽车信号干扰器 +订购汽车信号拦截器 +订购汽车拦截器qq +订购狙击气步枪qq +订购甲基苯丙胺qq +订购盐酸曲马多qq +订购盐酸氯胺酮qq +订购秃鹰气步枪qq +订购迷情乖乖水qq +订购钢珠左轮狗qq +订购香烟型迷药qq +订购高仿毕业证qq +订购高压打鸟枪qq +订购高压气步枪qq +试用特洛伊卧底软件 +诚信办假证公司qq +诚信高效办理假证件 +语音激情视频聊天室 +请加qq8位355 +购买54式手枪qq +购买64式手枪qq +购买7连发手枪qq +购买92式手枪qq +购买云南情蛊药qq +购买催情口香糖qq +购买喷雾蒙汗药qq +购买喷雾迷幻药qq +购买喷雾迷情水qq +购买少女催情粉qq +购买左旋麻黄素qq +购买左轮钢珠狗qq +购买弹簧活塞式气枪 +购买拍肩迷幻药qq +购买汽车信号干扰器 +购买汽车拦截器qq +购买狙击气步枪qq +购买盐酸曲马多qq +购买迷情乖乖水qq +购买钢珠左轮狗qq +购买香烟型迷药qq +购买高压气步枪qq +赤裸执法者赤裸证人 +走肾的男女交友平台 +走肾的男女社交平台 +赵氏小羚羊两用中弩 +赵氏钢珠弩出售qq +赵雅芝那胯下的温柔 +超美少女系列蛯原舞 +超越者联盟突破精英 +身份证克隆软件qq +身份证克隆软件下载 +身份证号生成器qq +身份证号生成器提供 +转让16号双管猎枪 +转让3箭牌汽枪qq +转让54式手枪qq +转让64式手枪qq +转让pcp骚本配件 +转让仿54手枪qq +转让仿真枪配件qq +转让仿真气步枪qq +转让峨眉牌汽枪qq +转让工字牌汽枪qq +转让左轮钢珠狗qq +转让弹簧活塞式气枪 +转让钢珠左轮狗qq +转让高压仿真枪qq +转让高压打鸟枪qq +转让高压气步枪qq +轮盘百家乐代理赌博 +轻型巡航导弹的制作 +近亲相奸背徳愉悦9 +还珠格成人版txt +这个不常在加妹妹薇 +这是我的v信paj +进口气枪,气枪子弹 +进口汽车拦截器供应 +进口汽车拦截器出售 +进口狙击枪供应qq +进口狙击枪出售qq +进口狙击枪批发qq +进口狙击枪提供qq +进口狙击枪订购qq +进口狙击枪购买qq +远程手机卧底支付宝 +迷情乖乖水供应qq +迷情乖乖水批发qq +迷情乖乖水提供qq +迷情乖乖水直销qq +迷情乖乖水订购qq +迷情乖乖水购买qq +迷情乖乖水销售qq +追女方案个性化定制 +追风弓弩麻醉箭专卖 +逃亡艳旅txt全集 +逃亡艳旅电子书下载 +逍遥社区成人蝴蝶谷 +遥控解码器联系qq +那个很有技巧很舒服 +醉笑卧乡野全文阅读 +重庆找小姐上门服务 +重生火影之漩涡鸣人 +金宝博188bet +金属仿真手枪专卖网 +金属仿真枪订购qq +金属仿真狙击枪专卖 +金赞博彩娱乐城qq +金道搏彩网上娱乐城 +金鳞岂是池中物全本 +金麟岂是池中物下载 +钢珠54手枪结构图 +钢珠左轮狗专卖qq +钢珠左轮狗供应qq +钢珠左轮狗出售qq +钢珠左轮狗批发qq +钢珠左轮狗提供qq +钢珠左轮狗直销qq +钢珠左轮狗订购qq +钢珠左轮狗购买qq +钢珠左轮狗转让qq +钢珠狙击枪订购qq +钻石冰货到付款qq +银行卡出售买卖qq +销售1元假硬币qq +销售3箭牌汽枪qq +销售54式手枪qq +销售54式手枪配件 +销售56式军刺qq +销售64式手枪配件 +销售77式手枪配件 +销售92式手枪qq +销售92式手狗qq +销售awp配件qq +销售pcp新贵手枪 +销售pcp新贵配件 +销售pcp汽枪qq +销售pcp秃鹰套件 +销售pcp配件qq +销售pcp骚本配件 +销售x手机卧底软件 +销售万能开锁器qq +销售万能汽车解码器 +销售云南情蛊药qq +销售仿真人民币qq +销售仿真枪配件qq +销售仿真金属枪qq +销售俄罗斯654k +销售假学位证书qq +销售健卫小口径步枪 +销售催情口香糖qq +销售全金属狩猎弓弩 +销售军用92式手枪 +销售军用钢珠弩qq +销售军用雷鸣登qq +销售去氧麻黄碱qq +销售台版高仿真假币 +销售喵喵药销售qq +销售喷雾蒙汗药qq +销售喷雾迷幻药qq +销售喷雾迷情水qq +销售大黑鹰弓弩qq +销售小口径手枪qq +销售小口径步枪qq +销售小口径步枪子弹 +销售小口径步狗qq +销售小口径运动步枪 +销售小口径钢珠气枪 +销售少女催情粉qq +销售少女迷情粉qq +销售少女迷情药qq +销售峨眉牌汽枪qq +销售工字牌汽枪qq +销售左旋麻黄素qq +销售开刃3棱刀qq +销售弹簧活塞式气枪 +销售成人3d电视棒 +销售成人dvd光碟 +销售成人电视棒qq +销售手机x卧底软件 +销售摇头丸配方qq +销售改装射钉枪qq +销售无线电作弊器材 +销售日本成人dvd +销售本科假文凭qq +销售氯化氨甲酰胆碱 +销售汽车专用解码器 +销售汽车信号拦截器 +销售汽车电子解码器 +销售汽车解码器qq +销售港38式左轮枪 +销售特洛伊卧底软件 +销售狙击钢珠专用弩 +销售甲基苯丙胺qq +销售电击麻醉枪qq +销售男女性数据qq +销售盐酸哌替啶qq +销售盐酸曲马多qq +销售盐酸氯胺酮qq +销售盐酸羟亚胺qq +销售秃鹰气步枪qq +销售虎头牌猎枪qq +销售身份证原件qq +销售迷彩大黑鹰弓弩 +销售迷情乖乖水qq +销售锡锋牌汽枪qq +销售香烟型迷药qq +销售高仿学位证qq +销售高仿真假币qq +销售高仿真假钞qq +销售高仿真枪模qq +销售高仿警官证qq +销售高清成人电视棒 +销售麦角酸提炼技术 +销售麻醉qiang +锡峰牌气枪出售qq +锡锋牌气枪供应qq +阴户紧紧包含着肉棒 +阴茎在子宫喷射黏液 +阴茎挺进狭窄的阴户 +阴茎被子宫夹住好爽 +阴茎被小穴紧紧包住 +阻击枪汽枪高压气枪 +阿兰得龙野营刀具网 +阿兵哥言语录txt +阿姨和我乱伦理小说 +陌生做爱在车里发生 +陵辱面接4人淫乱娘 +雪白的屁股对着肉棒 +需要裸聊服务的请加 +青花缘社区北京楼凤 +非常不错的人妻轮奸 +韩企工会围堵我使馆 +韩国3级色情片下载 +韩国女演员卖淫自拍 +预订54式手枪qq +预订pcp汽枪qq +领导忽悠百姓叫号召 +风月大6电子书下载 +风流英雄猎艳记下载 +风骚侍女txt全集 +风骚侍女电子书下载 +风骚小女孩湿身露体 +香港3唑仑专卖qq +香港6合彩1码中特 +香港6合彩公司特码 +香港两性激情文学区 +香港成人色网址大全 +香港激情淫色贴图区 +香港激情淫色贴图网 +香烟型迷药订购qq +香烟型迷药购买qq +骆冰淫传txt全集 +骆冰淫传电子书下载 +骇人听闻的进补潮流 +高价收养女婴儿qq +高价领养女宝宝qq +高仿人民币买卖qq +高仿人民币交易qq +高仿人民币出售qq +高仿人民币批发qq +高仿人民币电话qq +高仿人民币直销qq +高仿假硬币批发qq +高仿军官证办理qq +高仿大专毕业证qq +高仿学位证专卖qq +高仿学位证买卖qq +高仿学位证代办qq +高仿学位证出售qq +高仿学位证制作qq +高仿学位证办理qq +高仿户口本制作qq +高仿文凭专卖网qq +高仿文凭代办网qq +高仿文凭制作网qq +高仿文凭办理网qq +高仿毕业证专卖qq +高仿毕业证代办qq +高仿毕业证出售qq +高仿毕业证制作qq +高仿毕业证办理qq +高仿毕业证淘宝交易 +高仿真人皮面具销售 +高仿真伪钞出售qq +高仿真假币专卖qq +高仿真假币买卖qq +高仿真假币交易qq +高仿真假币供应qq +高仿真假币出售qq +高仿真假币当面交易 +高仿真假币批发qq +高仿真假币直销qq +高仿真假币订购qq +高仿真假币销售qq +高仿真假钞出售qq +高仿真假钞销售qq +高仿真枪模供应qq +高仿真枪模出售qq +高仿真气枪销售qq +高仿结婚证代办qq +高仿结婚证办理qq +高仿证件专卖网qq +高仿证件制作网qq +高仿证件服务网qq +高仿身份证办理qq +高仿驾驶证专卖qq +高仿驾驶证办理qq +高压气枪,气枪子弹 +高压气枪|电狗专卖 +高压气步枪专卖qq +高压气步枪供应qq +高压气步枪批发qq +高压气步枪提供qq +高压气步枪直销qq +高压气步枪订购qq +高压气步枪购买qq +高压电警棍供应qq +高压电警棍出售qq +高压电警棍批发qq +高压电警棍提供qq +高压锅炸弹制作手册 +高压锅炸弹制作教程 +高压锅炸弹制作步骤 +高性能爆炸物质混合 +高树玛丽亚无码下载 +高树玛利亚ed2k +高清av电视棒出售 +高清加勒比店长推荐 +高清成人伦理色情片 +高清成人电视棒出售 +高清成人电视棒销售 +高爆炸药的基本配方 +高科技赌具赌博工具 +鸡吧阴茎插嫩穴小穴 +鸡婆上门性服务qq +鸡巴插入拔出真舒服 +鸡巴插肉缝淫荡小穴 +鸡巴插进娇嫩的花蕊 +鸡巴顶在女儿的嫩穴 +鹿城娱乐成人俱乐部 +鹿城百家性大型网站 +鹿城百家性大型黄站 +鹿城色妹妹大型黄站 +鹿鼎记性事传txt +麻醉qiang出售 +麻醉qiang销售 +黄牙签制作配方qq +黄色情挑txt下载 +黄色成人影下载地址 +黄蓉舔小龙女的乳头 +黑星女侠txt全集 +黑星女侠电子书下载 +黑曼巴弓弩专卖qq +黑曼巴弓弩供应qq +黑曼巴弓弩出售qq +黑曼巴弓弩批发qq +黑曼巴弓弩直销qq +黑曼巴弓弩销售qq +黑火药的比例与配方 +龟头挤进了她的阴道 +龟头磨蹭插入小嫩穴 +龟头紧顶她的子宫口 +龟头被舔得又麻又痒 +0售专业手机卧底软件 +0售专业手机监听软件 +0售专业手机间谍软件 +0售手机卧底定位软件 +100bb成人小电影 +100真人视频聊天室 +101bb成人小电影 +102bb成人小电影 +103bb成人小电影 +104bb成人小电影 +105bb成人小电影 +106bb成人小电影 +107bb成人小电影 +15年前的共和国卫士 +17岁处女小阴唇张开 +18dy粉红色高跟鞋 +1个女人的初夜txt +1夜情异物插穴性爱网 +1夜情激情成人聊天室 +1字开锁工具批发qq +1对熟女间的性虐游戏 +2010诺贝尔和平奖 +2011最新成人论坛 +2012出售高考答案 +2013现金棋牌游戏 +24小时上门保健按摩 +2代身份证出售tel +2代身份证号码生成器 +33712扒266泗 +3d团蒲肉完整版下载 +3d打印枪支0件图纸 +3d打印枪支图纸下载 +3d打印枪支部件图纸 +3d打印枪械图纸下载 +3d肉蒲团3d玉蒲团 +3d肉蒲团之极乐宝鉴 +3陪女上门服务tel +3陪女出台服务tel +3陪女特殊服务tel +42lian色站大全 +43lian色站大全 +44lian色站大全 +45mm狗粮专卖qq +45mm狗粮供应qq +45mm狗粮出售qq +45mm狗粮批发qq +45mm狗粮提供qq +45mm狗粮直销qq +45mm狗粮购买qq +45mm狗粮销售qq +54手qiang价格 +54手qiang出售 +54手qiang销售 +54手枪子弹供应qq +54手枪子弹提供qq +54手枪子弹电话qq +64手qiang价格 +64手qiang出售 +64手枪子弹订购qq +69手机卧底软件下载 +69手机卧底软件供应 +69手机卧底软件出售 +77手qiang价格 +77手枪子弹订购qq +8元钱泡了个极品空姐 +92式9mm手枪销售 +92手qiang价格 +92手qiang出售 +92手枪子弹订购qq +avi免费淫电影下载 +av电影种子下载地址 +awp气步枪供应qq +awp气步枪批发qq +awp气步枪提供qq +bt淫色电影免费下载 +cibs海外移民投资 +cp99配件直销qq +diy化学燃烧弹教程 +diy化学燃烧弹方法 +diy汽油燃烧弹方法 +diy汽油燃烧瓶方法 +dse淫乱小说在线看 +fuck天安门录像带 +fuck新闻出版总署 +fuck生孩子没屁眼 +fuck社会正义力量 +ghb催情水订购qq +ghb水送货上门qq +ghb水配方专卖qq +ghb水配方提供qq +ghb迷奸水直销qq +gηb迷情水出售qq +gηb迷情水提供qq +gηb迷情水订购qq +jiejie的嫩阴唇 +jiejie的嫩阴户 +jiejie的肥阴唇 +jiejie的肥阴户 +k粉制造技术出售qq +lsd迷幻药出售qq +lsd迷幻药销售qq +m300狙击配件出售 +m300狙击配件直销 +m300狙击配件预定 +meimeimm激情 +meimei小穴好紧 +meimei爽快死了 +meimei的大阴户 +meimei的嫩阴唇 +meimei的嫩阴户 +meimei的小嫩穴 +meimei的小淫穴 +meimei的小阴户 +meimei的穴好紧 +meimei社区淫色 +meinv性生活贴图 +meinv淫色贴图区 +mm要我使劲插它的穴 +n巨乳女医师森口绘美 +pao大叔约pa平台 +pp点点通色穴激情片 +qiang支弹药购买 +qqghb催情水订购 +qq专卖lsd迷幻药 +qq专卖工字牌钢珠狗 +qq专卖高仿人皮面具 +qq专卖高仿学位证书 +qq专售西班牙苍蝇水 +qq买卖手机监听软件 +qq买卖手机窃听软件 +qq代办国外学位证书 +qq代办高仿学位证书 +qq代办高仿学历证件 +qq任意显号软件直销 +qq供应awp气步枪 +qq供应口服型昏迷药 +qq供应台版高仿假币 +qq供应拍肩型昏迷药 +qq供应朝版假人民币 +qq供应温切斯特气枪 +qq供应西班牙苍蝇水 +qq供应西班牙苍蝇粉 +qq供应香烟型昏迷药 +qq供应高仿学位证书 +qq供应高仿学历证书 +qq假文凭证件专卖网 +qq兼职妹妹上门服务 +qq出售1手女性数据 +qq出售1手女性资料 +qq出售45mm狗粮 +qq出售happy水 +qq出售万能开锁钥匙 +qq出售军用狙击弓弩 +qq出售大马士革军刀 +qq出售学生家长名录 +qq出售工字牌钢珠狗 +qq出售手机监听软件 +qq出售手机窃听软件 +qq出售拍肩型昏迷药 +qq出售朝版假人民币 +qq出售汽车锁解码器 +qq出售温切斯特气枪 +qq出售西班牙苍蝇水 +qq出售西班牙苍蝇粉 +qq出售身份证复印件 +qq出售银行客户资料 +qq出售高仿学位证书 +qq出售高仿学历证书 +qq出售高仿学历证件 +qq出售高仿文凭证书 +qq制作简易炸弹教程 +qq制作高仿学位证书 +qq制作高仿学历证书 +qq制作高仿学历证件 +qq办理假1代身份证 +qq办理假2代身份证 +qq办理国外文凭证件 +qq办理高仿学位证书 +qq办理高仿学历证书 +qq办理高仿学历证件 +qq办理高仿毕业证书 +qq十字开锁工具批发 +qq售猪肉钻石白牙签 +qq妓女包夜上门服务 +qq学生妹上门性服务 +qq学生妹兼职性服务 +qq成人性爱录像下载 +qq手机卧底软件出售 +qq手机变号软件直销 +qq手机改号软件直销 +qq手机监听软件买卖 +qq手机窃听软件买卖 +qq手机窃听软件出售 +qq手机窃听软件销售 +qq批发awp气步枪 +qq批发万能开锁工具 +qq批发仿真64手枪 +qq批发军用手枪配件 +qq批发口服型昏迷药 +qq批发台版高仿假币 +qq批发工字牌钢珠狗 +qq批发拍肩型昏迷药 +qq批发拍肩型迷魂粉 +qq批发朝版假人民币 +qq批发朝鲜版人民币 +qq批发考试作弊设备 +qq批发西班牙苍蝇水 +qq批发西班牙苍蝇粉 +qq批发香烟型昏迷药 +qq批发高仿假人民币 +qq拍肩型迷魂粉订购 +qq提供awp气步枪 +qq提供cp99汽枪 +qq提供万能开锁钥匙 +qq提供口服型昏迷药 +qq提供大马士革钢刀 +qq提供工字牌钢珠狗 +qq提供广州3箭气枪 +qq提供拍肩型昏迷药 +qq提供美国卡巴军刀 +qq提供自考考前答案 +qq提供西班牙苍蝇水 +qq提供西班牙苍蝇粉 +qq提供香烟型昏迷药 +qq提供高仿学位证书 +qq援交妹上门性服务 +qq暴力开锁工具出售 +qq暴力开锁工具销售 +qq民用开锁工具出售 +qq电动开锁工具出售 +qq直销口服型昏迷药 +qq直销手机监听软件 +qq直销拍肩型昏迷药 +qq直销温切斯特气枪 +qq直销考试作弊器材 +qq直销西班牙苍蝇水 +qq直销西班牙苍蝇粉 +qq直销香烟型昏迷药 +qq考试作弊器材专卖 +qq考试作弊设备出售 +qq考试作弊设备批发 +qq西班牙苍蝇水供应 +qq西班牙苍蝇水批发 +qq西班牙苍蝇水提供 +qq西班牙苍蝇水订购 +qq西班牙苍蝇粉供应 +qq西班牙苍蝇粉批发 +qq西班牙苍蝇粉订购 +qq订购口服型昏迷药 +qq订购工字牌钢珠狗 +qq订购拍肩型昏迷药 +qq订购西班牙苍蝇水 +qq订购西班牙苍蝇粉 +qq订购香烟型昏迷药 +qq诚信办证计算机证 +qq购买awp气步枪 +qq购买口服型昏迷药 +qq购买工字牌钢珠狗 +qq购买拍肩型昏迷药 +qq购买西班牙苍蝇水 +qq购买西班牙苍蝇粉 +qq购买香烟型昏迷药 +qq转让工字牌钢珠狗 +qq远程窃听软件供应 +qq销售45mm狗粮 +qq销售awp气步枪 +qq销售happy水 +qq销售口服型昏迷药 +qq销售台版高仿假币 +qq销售手机监听软件 +qq销售手机窃听软件 +qq销售拍肩型昏迷药 +qq销售朝版假人民币 +qq销售温切斯特气枪 +qq销售窃听手机软件 +qq销售考试作弊工具 +qq销售西班牙苍蝇水 +qq销售西班牙苍蝇粉 +qq销售身份证复印件 +qq销售银行卡复制器 +qq销售香烟型昏迷药 +qq销售高仿学历证书 +qq销售高仿文凭证书 +qq高仿人皮面具出售 +qq高仿本科文凭代办 +qq高仿证件网上办理 +qq麦角胺麦角酸销售 +qvod亚洲色情电影 +qvod免费伦理电影 +qvod在线成人电影 +sex激情视频裸聊室 +sex美女激情裸聊网 +strychnine +tel援交妹上门服务 +tnt炸弹的制作方法 +voachinese +vol17巨乳美熟女 +v信撩mis5206 +v新zxzs5685 +x手机卧底软件支付宝 +zhuanfalun +万人色色网603hs +万能开锁工具买卖qq +万能开锁工具供应qq +万能开锁工具出售qq +万能开锁工具提供qq +万能开锁钥匙买卖qq +万能开锁钥匙销售qq +上海哪里有小姐信息服 +上海牌工字气枪专卖网 +上门提供口交服务qq +上门特殊全套服务包夜 +下硝化甘油的制作方法 +下载免费淫电影淫穴流 +下载免费淫色强奸电影 +下载免费黄色淫乱电影 +下载庐江县委书记艳照 +下载手机卧底监听软件 +下载身份证号码生成器 +不文教父之带你嫖日韩 +不良少女日记小说下载 +不要注册激情免费电影 +专业制作各种证件qq +专业制作高仿人皮面具 +专业开锁工具出售qq +专卖45mm狗粮qq +专卖54式qiang +专卖54手qiang +专卖64式qiang +专卖64手qiang +专卖77式qiang +专卖77手qiang +专卖92式qiang +专卖92手qiang +专卖lsd迷幻药qq +专卖工字牌钢珠狗qq +专卖特种部队专用弓弩 +专卖美国进口军用弓弩 +专卖高仿人皮面具qq +专卖高仿真人民币qq +专销高仿人皮面具qq +世界以利亚福音宣教会 +东北风情熟女之惑下载 +东热美女1个比1个强 +东突厥斯坦伊斯兰运动 +两性电影在线免费欣赏 +中共3大势力谁来执政 +中国最淫的免费淫图图 +中国支配下的朝鲜经济 +中国改革年代政治斗争 +中国股市必须推倒重来 +中宣部是中国的爱滋病 +中宣部是中国的艾滋病 +丰满肥大有阴唇湿润了 +为淑女免费介绍企业家 +习会成为末代总书记吗 +买卖万能开锁钥匙qq +买卖手机监听软件qq +买卖手机窃听软件qq +买卖高仿人皮面具qq +买卖高仿真人民币qq +乱伦视频qvod下载 +亚洲av电影qvod +亚洲免费淫色电影下载 +亚洲午夜成人影院中心 +亚洲淫色俱乐部免费淫 +亚洲激情meimei +亚洲穴贴图激情自拍穴 +亚洲自然超可爱美巨乳 +亚甲2氧基甲基苯丙胺 +亚甲二氧基甲基苯丙胺 +交换夫妻的肉宴txt +人傻波大b紧小学毕业 +人妻肛肉曲txt下载 +人气av女优在线观看 +代办学士学位证书qq +代办高仿学历证书qq +代办高仿学历证件qq +代办高仿文凭证书qq +代办高仿资格证书qq +代开房屋租赁发票qq +代购007间谍免费版 +代购007间谍破解版 +代购高仿真人民币qq +代销高仿真人民币qq +任意显号软件直销qq +仿真人皮面具销售qq +伊久伊思思巴巴久巴0 +伸入jiejie裙内 +你以为你装屄就能骗我 +你以为你装逼就能骗我 +你们懂的小视频加微信 +你怎么用土办法做武器 +供应2甲氧基马钱子碱 +供应3利达弓弩麻醉箭 +供应45mm狗粮qq +供应54手枪子弹qq +供应64手qiang +供应92手qiang +供应92手枪子弹qq +供应awp气步枪qq +供应ghb迷奸水qq +供应lsd迷幻药qq +供应三利达弓弩麻醉箭 +供应仿真54式手木仓 +供应仿真64式手木仓 +供应仿真77式手木仓 +供应仿真92式手木仓 +供应最新女性数据qq +供应卧底监控软件qq +供应卧底监控软件电话 +供应口服型昏迷药qq +供应台版高仿假币qq +供应塞班手机卧底软件 +供应太安炸药制作技术 +供应太安炸药制作过程 +供应安卓手机卧底工具 +供应安卓手机卧底软件 +供应工字牌钢珠狗qq +供应手qiang子弹 +供应手机卧底定位软件 +供应手机卧底监听软件 +供应手机卧底软件qq +供应手机卧底软件下载 +供应手机卧底间谍软件 +供应手机监听定位软件 +供应手机窃听软件qq +供应手机窃听软件下载 +供应拍肩型昏迷药qq +供应拍肩型迷幻剂qq +供应改装307射钉枪 +供应朝版假人民币qq +供应楼盘业主数据qq +供应楼盘业主资料qq +供应正宗天然k2香料 +供应正宗天然k3香料 +供应步qiang子弹 +供应猎qiang子弹 +供应甲基甲卡西酮qq +供应移动电话卧底软件 +供应移动电话监听软件 +供应移动电话窃听软件 +供应西班牙苍蝇水qq +供应远程卧底监控软件 +供应迷情ghb水qq +供应顺丰面单数据qq +供应香烟型昏迷药qq +供应香烟型迷幻剂qq +供应高仿人皮面具qq +供应高仿学历证件qq +供应高仿真人民币qq +供应麦角酸2乙胺qq +倚天屠龙别记小说下载 +倚天屠龙记之我是张无 +做人不能太cctv了 +做爱视频表演黄色小说 +做爱网有激情自拍裸体 +儿依武久巴儿灵思巴久 +儿子淫奸jiejie +儿子添着妈妈大的阴唇 +免注册淫电影在线观看 +免注册淫电影爱的色放 +免费mm黄色淫乱电影 +免费免注册在线淫电影 +免费在线收看淫色电影 +免费在线淫奸mm电影 +免费在线看淫电影下载 +免费妹妹黄色淫乱电影 +免费成人激情视频聊天 +免费我该死淫水流出图 +免费桃色电影不需注册 +免费注册激情视频聊天 +免费淫奸女a片段试看 +免费淫奸黄色淫乱电影 +免费淫色电影无需注册 +免费看3级电影淫电影 +免费色情激情电影网站 +免费色情电影强奸小说 +免费裸体美女性交电影 +免费观看美女裸体贴图 +免费试看激情成人电影 +兔meimei贴图区 +全国兼职小姐性信大全 +全国车主资料批发qq +公交车上淫乱小穴狂插 +公车淫奸jiejie +公车淫奸meimei +兼职妹妹上门服务qq +兼职学生上门特殊服务 +兼职小姐全套特殊服务 +兼职楼凤上门性交qq +兼职模特包夜全套服务 +兼职美女上门按摩服务 +最强美乳おたま初解禁 +最新成人激情电影网站 +最新手机监听软件下载 +最新身份证号码生成器 +军用手枪货到付款qq +军用手枪配件供应qq +军用手枪配件销售qq +冲田杏梨迅雷种子下载 +処女强夺3穴串挿轮奸 +出售1元硬币假钞qq +出售1元硬币货到付款 +出售1手业主资料qq +出售1手车主资料qq +出售64手qiang +出售654k改火套件 +出售92手qiang +出售fm2催情药qq +出售ghb水配方qq +出售lsd审问药qq +出售lsd迷幻药qq +出售m300狙击配件 +出售usb成人电视棒 +出售万能开锁工具qq +出售个人信息资料qq +出售假钱假币假钞qq +出售全国车主信息qq +出售内部成单数据qq +出售最新1手女性数据 +出售最新女性数据qq +出售军用制式92式枪 +出售军用手qiang +出售军用汽枪配件qq +出售冰毒4号黄白牙签 +出售冰毒k粉麻古麻果 +出售冰毒制造配方qq +出售北朝鲜冰纯度99 +出售卧底监控软件qq +出售卧底监控软件电话 +出售双管立式猎枪qq +出售口服型昏迷药qq +出售台湾版高仿真假钞 +出售台版高仿假币qq +出售国产军用54手枪 +出售塞班手机卧底软件 +出售大口径狙击枪qq +出售大马士革军刀qq +出售学生信息资料qq +出售安卓手机卧底软件 +出售工字气qiang +出售工字牌钢珠狗qq +出售快递综合数据qq +出售快递面单数据qq +出售手qiang价格 +出售手qiang子弹 +出售手机x卧底专业版 +出售手机x卧底增强版 +出售手机x卧底改良版 +出售手机x卧底破解版 +出售手机卧底定位软件 +出售手机卧底监听软件 +出售手机卧底软件qq +出售手机卧底软件电话 +出售手机卧底间谍软件 +出售手机监听软件qq +出售手机窃听软件qq +出售拍肩型迷幻剂qq +出售改手机号软件qq +出售朝版假人民币qq +出售朝鲜版高仿真假钞 +出售楼盘业主资料qq +出售步qiang子弹 +出售汽车锁解码器qq +出售物流成单数据qq +出售物流进线数据qq +出售猎qiang子弹 +出售甲卡西酮合成教程 +出售甲基安非他明qq +出售破解卧底定位软件 +出售移动电话卧底软件 +出售移动电话监听软件 +出售移动电话窃听软件 +出售考试作弊器材qq +出售股民电话资源qq +出售自制54式枪qq +出售西班牙苍蝇水qq +出售西班牙苍蝇粉qq +出售警用手铐|仿真枪 +出售身份证复印件qq +出售身份证扫描件qq +出售车主信息资料qq +出售远程卧底监控软件 +出售野火侦探卧底软件 +出售针孔考试作弊器材 +出售钻石冰糖缅古牙签 +出售银行储户数据qq +出售银行客户数据qq +出售银行客户数据电话 +出售银行客户资料qq +出售顺丰快递数据qq +出售顺丰面单数据qq +出售香烟型昏迷药qq +出售香烟型迷幻剂qq +出售高仿人皮面具qq +出售高仿假人民币qq +出售高仿学历证书qq +出售高仿学士学位证书 +出售高仿文凭证书qq +出售高仿真2代身份证 +出售高仿真人民币qq +出售高仿研究生毕业证 +出售高压气枪配件qq +出售高考考前答案qq +出售麦角酸2乙胺qq +出售麻古制作技术资料 +出售麻古制造技术配方 +出轨女人的自白txt +刘亦菲淫阴道流血色片 +创世之子猎艳之旅下载 +制作性能优良的燃烧弹 +制作高仿假毕业证qq +制作高仿学历证件qq +办理2代假身份证qq +办理假教师资格证qq +办理学士学位证书qq +办理硕士学位证书qq +办理高仿假驾驶证qq +办理高仿学位证书qq +办理高仿学历证书qq +办理高仿学历证件qq +加公众号翠花的小黑屋 +加我薇yx25511 +北京兼职妹妹上门服务 +十字开锁工具批发qq +十字强开工具提供qq +十字强开工具订购qq +午夜剧场成人视频聊天 +午夜激情meimei +华尔街娱乐城在线娱乐 +卡通meinv淫乱图 +厕所性感美女清晰淫穴 +厕所盗摄护士姐姐性感 +原子弹制作方法DIY +去氧麻黄堿或安非他命 +去氧麻黄碱或安非他命 +变态心魔女仲村生中出 +口服型昏迷药供应qq +口服型昏迷药批发qq +口服型昏迷药提供qq +口服型昏迷药直销qq +口服型昏迷药订购qq +口服型昏迷药购买qq +口服型昏迷药销售qq +台湾小穴自拍护士做爱 +台湾情色香港顶级淫片 +台湾成人免费情色电影 +台湾男女激情淫乱小说 +台湾秃鹰气枪出售qq +台湾秃鹰汽枪出售qq +号码任意显示软件直销 +各种壮阳圣品现场使用 +各种女生等着您快来吧 +后面插入处女肉穴深处 +和meimei玩插穴 +和亲jiejie作爱 +哥哥干的人家好舒服啊 +哥哥想玩大尺度的加微 +哥哥的猫耳女仆txt +啊快插啊小屄要美死了 +国产汽狗专卖|气枪货 +国产视频网吧老板玩穴 +圣淘沙娱乐城官方网站 +圣淘沙娱乐城真人赌博 +圣角色扮演学园大泽萌 +在你母亲厨房制作炸弹 +在线免费观看黄片a片 +在线激情电影会员注册 +在线激情脱衣艳舞表演 +基本添上1平勺碳酸钠 +塞班手机卧底软件下载 +处女淫水图台湾女人裸 +处女淫荡色情网址大全 +大6性meinv淫穴 +大专假毕业证当面交易 +大原里美酒井里美无码 +大肉棒插入湿湿的肉缝 +大肉棒插进了她的体内 +大胆性感美女正辣妹妹 +大马士革钢刀专卖qq +大马士革钢刀供应qq +大马士革钢刀批发qq +大鸡吧在她的小嘴抽送 +大鸡吧在小穴内壁摩擦 +大鸡吧插meimei +大鸡吧来回抽插着小穴 +大鸡巴在她的小嘴抽送 +大鸡巴大肉棒狂插嫩穴 +大鸡巴好趐趐快别揉了 +大鸡巴干meimei +大鸡巴干进妹妹的小穴 +大鸡巴插进妹妹的小穴 +大鸡巴顶进妹妹的小穴 +大鸡巴顶进妹妹的花心 +天利足球打水扫货软件 +天然むすめ素人このみ +天生我材必有用txt +太阳城娱乐城真钱博彩 +女按摩师的日记txt +女浮世绘师的情色日记 +奸淫未成年的小女护士 +好色妹妹电影做爱论坛 +妓女上门包夜服务qq +妓女上门包夜服务信息 +妓女上门包夜服务电话 +妓女包夜上门全套服务 +妓女包夜上门服务qq +妖美巨尻物语风间ゆみ +妹妹上门服务兼职小姐 +妹妹的淫穴被龟头顶住 +姐夫出差了我和姐姐搞 +姐妹操嫂嫂都操txt +娇妻偷欢超爽日本电影 +嫂狂欢隔壁小弟打手枪 +嫩女嫩屄插的红肿喷浆 +学生妹兼职性服务qq +学生妹美女在野外偷情 +安卓手机卧底软件qq +安卓手机卧底软件试用 +安卓手机监控软件试用 +安卓手机远程卧底淘宝 +安徽官员宾馆群p艳照 +安徽庐江全套艳照种子 +官员宾馆群p照片下载 +实习医生艳情录txt +富家女的男保姆txt +富易堂娱乐城真钱游戏 +富豪们的疯狂做爱方式 +小丫头我要你和充气妹 +小姐上门全套服务qq +小姐上门性交服务qq +小姐保健服务信息qq +小姐全套上门qq电话 +小店开业急招人员兼职 +小穴夹着肉棒摩擦阴道 +小穴被大鸡吧胀的好痒 +小骚屄儿meimei +少妇上门全套包夜服务 +少妇勾引我上床txt +少年阿宾的故事txt +尼泊尔狗腿刀专卖qq +居民身份证号码生成器 +山山泗久2山山6泗久 +岁我是双子座我的微1 +岁我是双鱼座我的微1 +岁我是处女座我的微1 +岁我是天秤座我的微1 +岁我是天蝎座我的微1 +岁我是射手座我的微1 +岁我是巨蟹座我的微1 +岁我是摩羯座我的微1 +岁我是水瓶座我的微1 +岁我是狮子座我的微1 +岁我是白羊座我的微1 +岁我是金牛座我的微1 +工字气枪配件批发qq +工字牌qb23qb6 +工字牌气枪指定销售点 +工字牌钢珠狗专卖qq +工字牌钢珠狗供应qq +工字牌钢珠狗出售qq +工字牌钢珠狗批发qq +工字牌钢珠狗提供qq +工字牌钢珠狗订购qq +工字牌钢珠狗购买qq +左手上天堂右手下地狱 +希望之声国际广播电台 +广州3箭气枪出售qq +庐江县不雅照下载bt +庐江县委不雅照女主角 +庐江县委书记5p全套 +庐江县委书记6p全套 +庐江县委书记照片全集 +庐江县委书记群p下载 +庐江县委书记群p照片 +庐江县委书记群p种子 +庐江县委书记群p艳照 +庐江县委书记艳照下载 +庐江县委书记艳照种子 +庐江县委书记高清艳照 +庐江县艳照事件的起因 +庐江官员6p事件照片 +庐江官员王明生艳照门 +庐江官员艳照图片下载 +弟弟淫奸jiejie +强奸17岁处女全过程 +强奸17岁少女全过程 +强奸美女狂插处女阴道 +快干我快干我我要被干 +快播成人色情网站在线 +快播高清色情伦理影院 +怀念十5年前的大学生 +怎么能知道女性手淫过 +怜卿甘为身下奴txt +性交极品大片美腿少妇 +性感小姐美女上门服务 +性爱韦小宝之玩女大王 +性爱韦小寳之玩女大王 +怪胎皇帝荒淫史txt +总裁女儿爱上我txt +恐怖分子自己制造炸弹 +恼杀美巨乳美女吉川萌 +情色成人论坛淫图导航 +情色激情meinv穴 +想找个男士帮我暖床我 +想玩激情的就加小妹哟 +想约吗想找个人陪你吗 +想聊吗想约吗想视频吗 +成人av电影qvod +成人在线视频裸聊qq +成人在线裸聊视频qq +成人导航x色成人导航 +成人小说下载ed2k +成人情感裸女裸聊图片 +成人激情淫乱另类高潮 +成人激情电影在线播放 +成人版3d高清电视棒 +成人电影免费成人电影 +成人电影淫穴嫩穴骚穴 +成人网我该死免费视频 +成人高考考前答案qq +我们愿做您爱情的桥梁 +我们这边是做男士养生 +我和jiejie肏穴 +我和meimei肏穴 +我和小少妇乱伦理淫穴 +我和美女同事的那些事 +我喜欢放得开玩的男生 +我在公车上搞了小姨子 +我就让组织部长关心他 +我方公司邮件您未查收 +我是1残疾人不会说话 +我是千斤大小姐txt +我是妈妈的主人txt +我是弱受我怕谁txt +我有好多小姐妹想玩吗 +我爱由我不由天txt +我的大屌早已饥渴难耐 +我的性启蒙老师txt +我的明星性奴隶刘亦菲 +我的邻居很腹黑txt +我跟meimei肏穴 +手qiang子弹供应 +手qiang子弹出售 +手qiang子弹提供 +手qiang子弹电话 +手qiang子弹订购 +手qiang子弹销售 +手qiang货到付款 +手伸到下体抚mo嫩穴 +手把手教你制作原子弹 +手机x卧底监听器软件 +手机专用窃听软件qq +手机卧底定位软件下载 +手机卧底监听软件qq +手机卧底监听软件下载 +手机卧底监听软件出售 +手机卧底软件专卖qq +手机卧底软件供应qq +手机卧底软件出售qq +手机卧底软件提供qq +手机卧底软件监听淘宝 +手机卧底软件破解下载 +手机卧底软件销售qq +手机卧底间谍软件下载 +手机变号软件直销qq +手机改号软件直销qq +手机注册色情电影网站 +手机监听软件专卖qq +手机监听软件买卖qq +手机监听软件出售qq +手机监听软件订购qq +手机监听软件销售qq +手机窃听软件买卖qq +手机窃听软件出售qq +手机窃听软件提供qq +手机窃听软件操作方法 +手机窃听软件销售qq +批发45mm狗粮qq +批发awp气步枪qq +批发ghb水配方qq +批发lsd迷幻药qq +批发卧底监控软件qq +批发卧底监控软件电话 +批发口服型昏迷药qq +批发台版高仿假币qq +批发塞班手机卧底软件 +批发工字牌钢珠狗qq +批发手机x卧底专业版 +批发手机x卧底改良版 +批发手机卧底间谍软件 +批发拍肩型昏迷药qq +批发拍肩型迷幻剂qq +批发朝版假人民币qq +批发硅胶高仿人皮面具 +批发窃听手机卧底软件 +批发精仿兰博3号军刀 +批发精仿大马士革钢刀 +批发精仿美国m7军刺 +批发精仿美国巴克军刀 +批发考试作弊设备qq +批发西班牙苍蝇水qq +批发迷情ghb水qq +批发香烟型昏迷药qq +批发香烟型迷幻剂qq +批发高仿人皮面具qq +批发高仿假人民币qq +批发高仿真人民币qq +批发高压气枪配件qq +批发麦角酸2乙胺qq +找大学生上门服务信息 +找大学生包夜服务信息 +找学生妹包夜服务信息 +技术开锁工具批发qq +把精液射进我的小穴里 +把肉茎抽出插入屁眼里 +护士嫩穴扒开嫩穴嫩穴 +拍肩型昏迷药供应qq +拍肩型昏迷药出售qq +拍肩型昏迷药批发qq +拍肩型昏迷药提供qq +拍肩型昏迷药直销qq +拍肩型昏迷药订购qq +拍肩型昏迷药购买qq +拍肩型昏迷药销售qq +换妻无奈的选择txt +推翻专制独裁的共产党 +提供1手女性数据qq +提供1手女性数据电话 +提供1手股民资料qq +提供1手车主资料qq +提供3d打印枪支图纸 +提供45mm狗粮qq +提供54手枪子弹qq +提供92手qiang +提供awp气步枪qq +提供ghb水配方qq +提供ghb迷奸水qq +提供lsd迷幻药qq +提供万能开锁钥匙qq +提供仿真54式手木仓 +提供仿真64式手木仓 +提供仿真77式手木仓 +提供仿真92式手木仓 +提供假2代身份证qq +提供最新女性数据qq +提供口服型昏迷药qq +提供台版高仿假币qq +提供安卓手机卧底工具 +提供安卓手机卧底软件 +提供小区业主资料qq +提供工字牌钢珠狗qq +提供手qiang子弹 +提供手机卧底定位软件 +提供手机卧底监听软件 +提供手机卧底软件下载 +提供手机卧底间谍软件 +提供手机监听软件下载 +提供手机窃听软件qq +提供手机窃听软件下载 +提供拍肩型昏迷药qq +提供拍肩型迷幻剂qq +提供改装307射钉枪 +提供无线电作弊接收器 +提供楼盘业主数据qq +提供步qiang子弹 +提供毕业证书办理qq +提供猎qiang子弹 +提供窃听手机软件qq +提供美国卡巴军刀qq +提供英语等级证书qq +提供远程卧底监控软件 +提供迷情ghb水qq +提供顺丰面单数据qq +提供香烟型昏迷药qq +提供香烟型迷幻剂qq +提供高仿人皮面具qq +提供高仿假驾驶证qq +提供高仿学历证件qq +提供高仿真人民币qq +插入jiejie蜜穴 +插入meimei穴中 +插在妈妈嫩嫩的小肉穴 +插干jiejie好爽 +插烂meimei小屄 +插的jiejie好爽 +握着他的鸡巴上下套弄 +援交妹上门性服务qq +援交妹上门服务tel +援交小姐全套上门qq +援交小姐包夜服务qq +援交小姐网上服务qq +摩擦1摩擦啪啪1啪啪 +操淫荡meimei穴 +操淫荡少妇操淫荡妹妹 +操的我好爽啊我又要泄 +收缩的阴道中抽出肉棒 +收获人妻的小贼txt +政府亲商护商还是在毁 +教师妈妈的骚肉txt +数见红尘应识我txt +无政府主义食谱中文版 +无需手机注册激情电影 +日本3级大片黄色网站 +日本avbt种子下载 +日本meinv吃精图 +日本似的性福开放生活 +日本大型黄色美女做爱 +日本无码o幼齿女学生 +日本淫荡meimei +日本色情动漫迅雷下载 +日韩淫乱meinv图 +昆明3对夫妻视频下载 +昆明3对夫妻视频图片 +昆明3对夫妻群p套图 +昆明3对夫妻群p聚会 +昆明夫妻聚会裸照下载 +易发国际娱乐城博彩网 +星光伴我淫txt全集 +星光伴我淫电子书下载 +智能手机卧底软件下载 +暴力开锁工具出售qq +暴力开锁工具批发qq +暴力开锁工具提供qq +暴力开锁工具销售qq +有1个女儿跟前夫生活 +有声淫秽色情小说下载 +未来的自由中国在民间 +极品白领上门特殊服务 +极品离婚女教师txt +极品金牌素人口交系列 +杭州找小姐1夜情服务 +枸橼酸芬太尼供应qq +梦中的女孩txt全集 +梦中的女孩电子书下载 +检察官敲开央视女记者 +森林之狼弓弩专卖qq +欢迎g10情色电影院 +欢迎g11情色电影院 +欢迎g12情色电影院 +欧美淫图片咪咪爱论坛 +欧美电影激情片段合集 +步qiang子弹供应 +步qiang子弹出售 +步qiang子弹提供 +步qiang子弹电话 +步qiang子弹订购 +步qiang子弹销售 +步qiang货到付款 +死亡数远超过官方说法 +母亲の结婚生活完全版 +母子的淫乱生日txt +毛meimei贴图区 +民用开锁工具出售qq +气枪价格,气枪专卖店 +气枪货到付款汽狗出售 +氯甲酸氯甲酯供应qq +水晶之恋深喉全套包夜 +永利足球打水扫货软件 +江都财政局1窝钱耗子 +注册送20元真人棋牌 +泳衣丝袜让你销魂舒畅 +洗着鸳鸯浴操屄真惬意 +浓浓的精液喷入了子宫 +浪少妇和医生疯狂做爱 +海盗的悠闲生活txt +淫之学妹喷尿射得好高 +淫之插穴虐待破处流血 +淫乱jiejie小说 +淫兽学园电影下载qq +淫奸jiejie小说 +淫奸jiejie电影 +淫奸jiejie论坛 +淫奸meimei电影 +淫奸meimei的屄 +淫奸meimei论坛 +淫奸电影少妇扒开阴道 +淫奸美女图淫奸刘亦菲 +淫妻的乱交免费在线看 +淫术炼金士txt全集 +淫术炼金士电子书下载 +淫民俱乐部日韩激情片 +淫民激情文学图库专题 +淫民激情文学图库欣赏 +淫色电影免费在线观看 +淫荡女护士淫荡少妇穴 +淫荡妈妈之办公室助理 +淫荡少妇穴操淫荡少妇 +淫荡的老婆晶晶txt +淫荡美眉就喜欢玩男人 +深圳兼职小姐上门服务 +混在美女如云的办公室 +混蛋神风流史小说下载 +混迹在美女如云的公司 +温切斯特气枪出售qq +温切斯特气枪批发qq +温切斯特气枪订购qq +温切斯特气枪购买qq +温切斯特气枪转让qq +温切斯特气枪预定qq +温室里强奸小姨txt +激情书屋男女做爱片段 +激情做爱色情淫妇做爱 +激情少女成人论坛乱伦 +激情爽电影夜夜最消魂 +激情美女贴图99情色 +火影之美女如云txt +熊猫哥哥和功夫美少女 +熟女家政妇山本ちづこ +爱神之传奇txt全集 +爱神之传奇电子书下载 +特洛伊卧底软件官方网 +狂插meimei小穴 +狡猾的风水相师txt +独占动画肛门1长谷川 +猎qiang出售qq +猎qiang子弹供应 +猎qiang子弹出售 +猎qiang子弹提供 +猎qiang子弹电话 +猎qiang子弹订购 +猎qiang子弹销售 +猎qiang货到付款 +猎枪销售手枪销售气枪 +猎艳江湖梦txt全集 +猛嫩穴把肉棒包得紧紧 +猛烈挺送肉棒激烈撞击 +玉女心经bt种子下载 +现代好色之欲望的季节 +现代艳帝传奇小说下载 +用你的阴茎插我的阴道 +用权力垄断我们的希望 +用舌尖在我的肉棒上舔 +甲基苯丙胺的制作方法 +甲基苯丙胺的制作视频 +电话手qiang子弹 +电话步qiang子弹 +电话猎qiang子弹 +男人最爱上的成人网站 +疯插警察制服诱惑下载 +疯狂jiejie淫穴 +白岩松十问中国证监会 +百家乐利来国际娱乐城 +皋兰1夜情交友聊天室 +直销45mm狗粮qq +直销lsd迷幻药qq +直销m300狙击配件 +直销口服型昏迷药qq +直销塞班手机卧底软件 +直销安卓手机卧底qq +直销手机监听软件qq +直销拍肩型昏迷药qq +直销拍肩型迷幻剂qq +直销考试作弊器材qq +直销西班牙苍蝇水qq +直销迷情ghb水qq +直销香烟型昏迷药qq +直销香烟型迷幻剂qq +直销高仿假人民币qq +直销高假仿人民币qq +相亲q裙可以进来聊聊 +真人主播的成人聊天室 +真人充气娃娃送货上门 +真人真钱博彩在线下注 +真人视频裸体聊天qq +瞄准她的肉穴插了进去 +硝酸甘油炸弹制作方法 +硝酸甘油炸药制作教程 +硬绑绑的阴茎插入阴道 +视频luoliao网 +禁不住诱惑耐不住寂寞 +禁区女领导大院txt +私售秃鹰汽枪制造图纸 +秘密熟母俱乐部txt +秦青的幸福生活txt +移动电话卧底软件下载 +移动电话卧底软件官网 +移动电话卧底软件破解 +移动电话监听软件下载 +移动电话窃听软件下载 +空中小姐的淫荡性生活 +空白普通发票出售qq +空虚少妇上门特殊服务 +立即登6观看激情爽片 +笔仙原来是小受txt +第6代窃听软件支付宝 +粗硬大肉棍抽动好舒服 +约pao私蜜社交平台 +纯情尤物由美中文字幕 +网上真人现金赌博qq +美マンの极意相原梨花 +美丽空姐上门特殊服务 +美国原装秃鹰专卖qq +美国成人激情淫洞网站 +美女shangmen +美女全裸视频服务qq +美女出租车内强行进入 +美女发春激情在线电影 +美女激情sm处女淫水 +美女激情性交射精电影 +美少妇的哀羞小说下载 +老婆在征婚我在旁边看 +老婆陪我换配偶txt +考试作弊器材专卖qq +考试作弊设备专卖qq +考试作弊设备批发qq +肉棒噗嗤1声插入阴道 +肉棒噗嗤1声滑入阴道 +肉棒在阴道中疯狂抽射 +肉棒已经整根插入穴中 +肉棒插入又大又深的穴 +肉棒插入少妇的阴户内 +肉棒插入湿淋淋的肉洞 +肉棒插入美穗子的肉缝 +肉棒插到妈子宫爽死了 +肉棒插进了湿湿的阴道 +肉棒的抽插淫荡少妇穴 +肉棒的抽送淫乱用力干 +肉棒顶的人家小穴好痒 +肉蒲团之极乐宝鉴在线 +股民电话资源销售qq +自制硅胶面具出售qq +自拍淫荡骚妇们的性福 +舌头伸到妈妈的小穴里 +舌头舔弄着小穴的内壁 +舌尖刮著阴唇上的淫水 +色meimei成人论 +色情导航免费色情电影 +色情激情淫乱卡通高潮 +艳星山口沙纪种子视频 +艳星杉原杏璃种子下载 +艳星梅坎娜李种子视频 +艳遇之古代太后1把抓 +花和尚社区成人性用品 +英语4级假证办理qq +英语6级假证办理qq +英语老师的洞房花烛夜 +药物奸淫女高校生a片 +莫洛托夫鸡尾酒的制作 +莫洛托夫鸡尾酒的配方 +萝莉御姐萌妹应有尽有 +蒙面奸魔事件薄txt +虎头牌5连发猎枪专卖 +虎头牌5连发猎枪出售 +被老师强奸的小初中生 +裸体的乱伦家庭txt +西班牙苍蝇水专卖qq +西班牙苍蝇水专售qq +西班牙苍蝇水供应qq +西班牙苍蝇水出售qq +西班牙苍蝇水批发qq +西班牙苍蝇水提供qq +西班牙苍蝇水直销qq +西班牙苍蝇水订购qq +西班牙苍蝇水购买qq +西班牙苍蝇水销售qq +西班牙苍蝇粉出售qq +西班牙苍蝇粉提供qq +西班牙苍蝇粉销售qq +西班牙苍蝇迷情液专卖 +警花少妇白艳妮txt +订购45mm狗粮qq +订购lsd迷幻药qq +订购m300狙击配件 +订购口服型昏迷药qq +订购工字牌钢珠狗qq +订购左轮牌钢珠狗qq +订购手qiang子弹 +订购拍肩型昏迷药qq +订购拍肩型迷幻剂qq +订购步qiang子弹 +订购温切斯特气枪qq +订购猎qiang子弹 +订购西班牙苍蝇水qq +订购迷情ghb水qq +订购香烟型昏迷药qq +订购香烟型迷幻剂qq +订购高压气枪配件qq +诚信办理高仿假证qq +诱奸沈阳女老师txt +购买45mm狗粮qq +购买awp气步枪qq +购买口服型昏迷药qq +购买喷雾型迷昏药qq +购买工字牌钢珠狗qq +购买左轮牌钢珠狗qq +购买拍肩型昏迷药qq +购买拍肩型迷幻剂qq +购买温切斯特气枪qq +购买西班牙苍蝇水qq +购买迷情ghb水qq +购买香烟型昏迷药qq +购买香烟型迷幻剂qq +超女世界online +身份证件制作软件下载 +身份证号生成器绿色版 +身份证生成器高速下载 +转让45mm狗粮qq +转让工字牌钢珠狗qq +转让左轮牌钢珠狗qq +转让新型号7连发猎枪 +转让温切斯特气枪qq +迅雷下载免费淫乱电影 +这个党的领袖钦命开除 +这是我们同城相亲q裙 +进入身体不进入生活的 +进口3棱军刺专卖qq +进口手机卧底软件出售 +进口手机卧底软件销售 +进口狙击汽枪供应qq +进口狙击汽枪出售qq +进口狙击汽枪提供qq +进口狙击汽枪销售qq +进错房间上错床txt +远程卧底监控软件qq +远程窃听软件供应qq +迷奸双胞meimei +迷离的嫂嫂全集txt +那就找个女生约1约吧 +邻家女优高清迅雷下载 +邻居美少妇操淫荡少妇 +邻居荡妇李太太txt +郊游时我干了女友同学 +重庆兼职妹妹上门服务 +重庆兼职美女上门服务 +金发表姨子的鲜嫩蜜穴 +金鳞岂是池中物txt +银行卡复制器转让qq +银行卡解码器供应qq +销售54手qiang +销售64手qiang +销售77手qiang +销售92手qiang +销售awp气步枪qq +销售lsd迷幻药qq +销售最新女性数据qq +销售军用汽枪配件qq +销售卧底监控软件电话 +销售口服型昏迷药qq +销售台湾秃鹰汽枪qq +销售台版高仿假币qq +销售吗啡阿托品注射液 +销售安卓手机卧底软件 +销售手qiang子弹 +销售手机卧底定位软件 +销售手机卧底监听软件 +销售手机卧底软件qq +销售手机卧底间谍软件 +销售手机监听软件qq +销售拍肩型昏迷药qq +销售拍肩型迷幻剂qq +销售楼盘业主资料qq +销售步qiang子弹 +销售步枪手枪猎枪气枪 +销售温切斯特气枪qq +销售猎qiangqq +销售猎qiang子弹 +销售移动电话卧底软件 +销售考试作弊器材qq +销售自制54式枪qq +销售荷兰叶子ak47 +销售西班牙苍蝇水qq +销售连发猎qiang +销售迷情ghb水qq +销售针孔考试作弊器材 +销售顺丰面单数据qq +销售香烟型昏迷药qq +销售香烟型迷幻剂qq +销售高仿人皮面具qq +销售高仿学历证书qq +销售高仿文凭证书qq +销售高仿真2代身份证 +销售高仿真人民币qq +销售高考考前答案qq +长途汽车上的淫乱乘客 +阳具在她的蜜穴里抽插 +阳具在阴道里来回抽插 +阴茎被肉壁紧紧的夹着 +阿不来提阿不都热西提 +阿庆淫传之处女3姐妹 +阿里布达年代记txt +雪白屁股的诱惑txt +露出了娇小鲜嫩的阴道 +韩国自拍无码系列之2 +韩日成人午夜激情电影 +顶到了欣虹阴道最深处 +预定温切斯特气枪qq +预订温切斯特气枪qq +颠覆中华人民共和国政 +香港免费黄色淫乱电影 +香港色情影星美女裸体 +香烟型昏迷药供应qq +香烟型昏迷药出售qq +香烟型昏迷药批发qq +香烟型昏迷药提供qq +香烟型昏迷药直销qq +香烟型昏迷药订购qq +香烟型昏迷药购买qq +香烟型昏迷药销售qq +高仿人皮面具专卖qq +高仿人皮面具供应qq +高仿人皮面具出售qq +高仿人皮面具批发qq +高仿人皮面具提供qq +高仿人皮面具直销qq +高仿人皮面具销售qq +高仿假人民币出售qq +高仿假人民币销售qq +高仿本科文凭代办qq +高仿真人民币专卖qq +高仿真人民币买卖qq +高仿真人民币代购qq +高仿真人民币代销qq +高仿真人民币供应qq +高仿真人民币出售qq +高仿真人民币批发qq +高仿真人民币提供qq +高仿真人民币直销qq +高仿真人民币销售qq +高假仿人民币直销qq +高压气枪子弹出售qq +高压气枪气枪货到付款 +高压气枪送货上门qq +高清美国色情迅雷下载 +高级卖淫女确实不1般 +魏兴jj98hh76 +魔性的美女铃木麻奈美 +魔王神官和勇者美少女 +鸡吧在肉洞里4处搅动 +鸡吧插进肥嫩的小骚屄 +鸡巴在她的阴道里抽插 +麻美由真bt种子下载 +齐天大性之大破盘丝洞 +龟头喷射出浓浓的精液 +龟头在她的阴户里抽插 +龟头在她的阴道里抽插 +龟头挤进了姐姐的小穴 +龟头顶住她的花心深处 +11xpcom成人影院 +1个风韵女人的性爱历程 +2011最新汽车解码器 +2012甲基苯丙胺价格 +2012高考无线作弊器 +2代身份证生成软件下载 +3d打印枪支cad图纸 +3级片看美国女人的性交 +3级电影淫电影艳情电影 +3级电影网香港色情服务 +44xpcom电影免费 +45xpcom电影免费 +46xpcom电影免费 +47xpcom电影免费 +48xpcom电影免费 +49xpcom电影免费 +50xpcom电影免费 +51xpcom电影免费 +52xpcom电影免费 +53xpcom电影免费 +54xpcom电影免费 +54式手枪配件供应qq +54式手枪配件出售qq +54式手枪配件批发qq +54式手枪配件提供qq +54式手枪配件直销qq +54式手枪配件订购qq +54式手枪配件销售qq +55xpcom电影免费 +56xpcom电影免费 +57xpcom电影免费 +58xpcom电影免费 +59xpcom电影免费 +5连发猎qiang出售 +60xpcom电影免费 +61xpcom电影免费 +62xpcom电影免费 +63xpcom电影免费 +64xpcom电影免费 +64式手枪配件供应qq +64式手枪配件出售qq +64式手枪配件批发qq +64式手枪配件提供qq +64式手枪配件直销qq +64式手枪配件订购qq +64式手枪配件销售qq +65xpcom电影免费 +65情网色论坛色情电影 +66xpcom电影免费 +6合彩白小姐曾道人特码 +6合采白小姐曾道人特码 +77式手枪配件供应qq +77式手枪配件出售qq +77式手枪配件批发qq +77式手枪配件提供qq +77式手枪配件直销qq +77式手枪配件订购qq +77式手枪配件销售qq +a片成人免费激情小电影 +d7se淫色穴图片下载 +dalailama自传 +diamorphine +ewin娱乐城官方下载 +fox格斗砍刀买卖qq +fox格斗砍刀供应qq +fox格斗砍刀批发qq +fox格斗砍刀直销qq +fox格斗砍刀销售qq +jiejie的穴好大啊 +jiejie的穴好紧啊 +jiejie被插的好爽 +meimei乱伦理淫穴 +meimei嫩穴被狂插 +meimei的小屄好痒 +meimei的屄好紧啊 +meimei的穴好多水 +meimei的阴道真紧 +meinv下体淫水直流 +meinv与猪性交电影 +meinv做爱激情电影 +meinv含双棍玩内射 +meinv嫂子的小骚逼 +meinv嫩穴淫水直流 +meinv性交极品大片 +meinv野兽做爱淫图 +minghuinews +mm在线电影a片3级片 +ol美女街上遥控震动a +pcp新贵配件直销qq +pcp新贵配件预定qq +qq专卖fox格斗砍刀 +qq专卖成人3d电视棒 +qq买卖fox格斗砍刀 +qq代理x手机卧底软件 +qq任意显号码软件直销 +qq供应fox格斗砍刀 +qq供应pcp骚本配件 +qq供应x手机卧底软件 +qq供应弹簧活塞式气枪 +qq供应汽车信号屏蔽器 +qq供应汽车信号干扰器 +qq供应汽车信号拦截器 +qq供应汽车信号解码器 +qq供应汽车电脑解码器 +qq供应汽车芯片解码器 +qq供应汽车解码器软件 +qq供应汽车遥控干扰器 +qq出售fox格斗砍刀 +qq出售pcp气枪套件 +qq出售pcp秃鹰套件 +qq出售pcp秃鹰配件 +qq出售pcp骚本套件 +qq出售x手机卧底软件 +qq出售中握b50套件 +qq出售健卫小口径步枪 +qq出售军用92式手枪 +qq出售成人3d电视棒 +qq出售汽车信号屏蔽器 +qq出售汽车信号干扰器 +qq出售汽车信号拦截器 +qq出售汽车信号解码器 +qq出售汽车电子解码器 +qq出售汽车遥控干扰器 +qq出售汽车遥控拦截器 +qq出售汽车门锁解码器 +qq出售猪肉钻石白牙签 +qq办理1代高仿身份证 +qq卖64手qiang +qq卖92手qiang +qq弹簧活塞式气枪出售 +qq弹簧活塞式气枪购买 +qq成人3d电视棒批发 +qq批发fox格斗砍刀 +qq批发pcp秃鹰套件 +qq批发pcp骚本配件 +qq批发x手机卧底软件 +qq批发汽车信号拦截器 +qq批发汽车遥控解码器 +qq提供fox格斗砍刀 +qq提供x手机卧底软件 +qq提供弹簧活塞式气枪 +qq提供汽车信号拦截器 +qq提供汽车信号解码器 +qq提供汽车电脑解码器 +qq提供汽车芯片解码器 +qq提供汽车解码器软件 +qq汽车信号屏蔽器出售 +qq汽车信号干扰器出售 +qq汽车信号拦截器出售 +qq汽车信号拦截器销售 +qq汽车门锁解码器直销 +qq特洛伊卧底软件出售 +qq特洛伊卧底软件销售 +qq直销fox格斗砍刀 +qq直销弹簧活塞式气枪 +qq订购b50气枪配件 +qq订购pcp秃鹰套件 +qq订购中握b50套件 +qq订购弹簧活塞式气枪 +qq订购汽车信号屏蔽器 +qq订购汽车信号干扰器 +qq订购汽车信号拦截器 +qq购买弹簧活塞式气枪 +qq转让fox格斗砍刀 +qq销售fox格斗砍刀 +qq销售pcp骚本配件 +qq销售弹簧活塞式气枪 +qq销售成人3d电视棒 +qq销售批发盐酸哌替啶 +qq销售汽车电子解码器 +qq销售汽车芯片解码器 +qq销售老年人资料qq +qq销售麦角酸提炼技术 +qq预订汽车信号拦截器 +qq高仿本科毕业证代办 +qq高仿本科毕业证办理 +qq高清av电视棒出售 +shuangfei美女 +usb电视棒网络电视棒 +v号是f加h9我813 +waap女教师盗撮志保 +www点63se点cc +x手机卧底软件免费下载 +x手机卧底软件免费试用 +x手机卧底软件官网地址 +zhenshanren +上海兼职学生妹上门服务 +上海工字气枪指定销售点 +下载身份证复印件生成器 +下雨了我的良人会在哪佳 +不良少女日记txt全集 +不良少女日记电子书下载 +专卖fox格斗砍刀qq +专卖俄罗斯mp654k +专卖小口径手qiang +专卖小口径步qiang +专卖成人3d电视棒qq +东北风情熟女之惑txt +东热rq大乱交2007 +两片暗红的阴唇1张1合 +中共反腐风暴大背景揭秘 +中共派系力量再达成妥协 +中国meinv淫色贴图 +中国政坛清华帮盛极而衰 +中国没有真正意义上的民 +乌鲁木齐市打砸烧抢事件 +乖乖丫鬟我想交友1下试 +买卖fox格斗砍刀qq +乱伦之公公与儿媳的秘密 +乱伦熟睡的jiejie +亚洲无码原创区rmvb +亚甲2氧基甲基安非他明 +京香julia全套种子 +人死了以后再通知我们吧 +人美乳甜屄嫩操起来真爽 +他们嫌我挡了城市的道路 +代办驾驶证办理免考驾照 +代理x手机卧底软件qq +代购007间谍免费试用 +代购手机007间谍软件 +代购潜伏者手机监听软件 +任意显号码软件批发qq +任意显号码软件直销qq +仿307射钉枪提供qq +传奇不良少女日记txt +你好呀挺有缘的威新聊吧 +供应54式手枪配件qq +供应64式手枪配件qq +供应77式手枪配件qq +供应fox格斗砍刀qq +供应pcp骚本配件qq +供应x卧底手机窃听工具 +供应x卧底手机窃听软件 +供应x手机卧底软件qq +供应仿cz75bd手枪 +供应俄罗斯mp654k +供应卧底软件个人破解版 +供应成人3d电视棒qq +供应手机卧底软件破解版 +供应温彻斯特1000x +供应甲基苯丙胺制作技术 +供应高清3d成人电视棒 +俄罗斯mp654k专卖 +倚天屠龙别记txt全集 +倚天屠龙别记电子书下载 +做爱时抚摸阴蒂的性技巧 +健卫小口径步枪出售qq +健卫小口径步枪销售qq +健卫小口径运动步枪专卖 +健卫小口径运动步枪出售 +健卫小口径运动步枪销售 +儿子淫奸jiejie穴 +免费情色电影情色5月天 +免费成人激情视频聊天室 +免费淫女骚穴在线看电影 +全球私密资源很多你懂得 +公开信胡书记空中民主墙 +公开批评中央高层领导人 +最新皇冠足球投注比分网 +出售54式手枪配件qq +出售5连发猎qiang +出售64式手枪配件qq +出售77式手枪配件qq +出售95式自动步枪qq +出售fox格斗砍刀qq +出售king粉合成教程 +出售pcp新贵配件qq +出售pcp秃鹰配件qq +出售pcp骚本配件qq +出售tops钢鹰战斗刀 +出售x手机卧底软件qq +出售俄罗斯mp654k +出售健卫小口径步枪qq +出售健卫小口径运动步枪 +出售军用92式手枪qq +出售卧底软件个人破解版 +出售小区业主手机号qq +出售左旋麻黄素合成教程 +出售弹簧活塞式气枪qq +出售成人3d电视棒qq +出售成人av电视棒qq +出售成人dvd光碟qq +出售手机007间谍软件 +出售手机卧底软件破解版 +出售手机间谍软件破解版 +出售摇头丸制作方法qq +出售无线针孔考试作弊器 +出售氰化钾安乐死药qq +出售汽车中控拦截器qq +出售汽车信号解码器qq +出售汽车电子解码器qq +出售汽车遥控信号解码器 +出售汽车遥控干扰器qq +出售汽车遥控拦截器qq +出售汽车遥控解码器qq +出售海洛因制造方法qq +出售温彻斯特1000x +出售潜伏者手机监听软件 +出售特洛伊远程窃听软件 +出售甲基苯丙胺制作方法 +出售甲基苯丙胺合成方法 +出售高仿真人皮面具qq +出售高清3d成人电视棒 +出售高考考试作弊器qq +出售麻醉qiangqq +出售麻醉枪免收任何定金 +创世之子猎艳之旅txt +利博亚洲娱乐城真人赌博 +制作厨房高压锅炸弹方法 +办理高仿本科毕业证qq +医院里的淫虐盛宴txt +十8岁美女护士电影网站 +午夜免费视频激情聊天室 +卖双管猎qiang出售 +卡通meinv淫色贴图 +卡通动漫meinv淫乱 +卫新pdc555666 +卫星pdc555666 +历代名妓悲落叶之柳如是 +厕所盗摄meinv性感 +厕所盗摄meinv淫穴 +去掉gt号就是我的微信 +又硬又大的肉棒插入阴户 +双飞毒龙直到分享了精液 +反沉迷身份证号码生成器 +台湾1夜激情成人聊天室 +台湾成人激情视频聊天室 +台湾版假人民币出售qq +合租屋里的女房客txt +后湾村的那些艳事txt +和别人肛交的妻子txt +和护士jiejie淫穴 +品色堂专用成人软件下载 +哥mm要聊1聊试吗薇号 +哥哥使劲插我爽死了啊啊 +哥哥想玩米果聊的加我微 +哥哥更多精彩请加我v信 +哥哥淫奸meimei穴 +唐皇宫外情之太监与宫女 +唯心pdc555666 +啊用力用力插烂我的淫穴 +嘉兴兼职女上门全套服务 +国产小口径运动步枪出售 +在线清晰日本超爽mm毛 +在线真人赌钱娱乐城投注 +增觕增汏延𪶄敭痿早泄 +壮汉给纯情处女开苞见血 +夏夏娱乐黄站乱伦熟女网 +大学生援交服务电话qq +大炕上的肉体联欢txt +大肉棒干我的小穴和屁眼 +大鸡吧塞进逼里使劲插我 +大鸡吧插又肥又嫩的屄儿 +大鸡巴在她的蜜穴里抽插 +大鸡巴就慢慢的插入小穴 +大龟头顶住她的花心深处 +女人被迷奸的时候也很爽 +女学生的耻蜜全集txt +女学生的耻蜜电子书下载 +奶大穴肥多条肉棒难满足 +妈的骚穴被你插得爽死了 +妓女包夜提供性服务qq +妹子想找个男生做依靠我 +姐姐的穴夹的我好紧小说 +姐弟乱轮yy玛雅激情贴 +学生妹全套特殊按摩服务 +学生妹兼职上门服务qq +学生妹少妇美女做爱上门 +安徽庐江书记淫乱照下载 +完全自由注册看成人电影 +宫路ナオミ美脚角度超美 +家人1起凌辱母亲和叔母 +射精时必须注意的几件事 +小口径手qiang专卖 +小口径步qiang专卖 +小向美奈子av种子下载 +小平同志为什么1直跑着 +小泽玛丽亚7淫乱的肉体 +小泽玛利亚av迅雷种子 +小穴任由大鸡吧来回抽插 +小穴的周围不断地缠绵着 +小穴被大鸡巴插得好疼啊 +小阴唇被鸡巴猛的塞进去 +少妇床上欲火难耐自摸图 +少妇白洁txt小说下载 +少妇白洁小说txt下载 +少年阿宾txt小说下载 +居民身份证复印件生成器 +巴力wildcatc5 +干8个meinv的小穴 +干进meimei的小穴 +平时喜欢听歌吗佳我威信 +庐江6p高清无码照下载 +庐江县委书记群p120 +庐江县委书记群p照全集 +庐江县委书记群p门照片 +开放大胆的男士就加我吧 +弟弟淫奸jiejie穴 +弹簧活塞式气枪供应qq +弹簧活塞式气枪出售qq +弹簧活塞式气枪批发qq +弹簧活塞式气枪提供qq +弹簧活塞式气枪直销qq +弹簧活塞式气枪销售qq +强奸2制服诱惑迅雷下载 +强奸大奶嫩逼meinv +强奸轮奸meinv视频 +快操我快操我的小b电影 +快速办理真实毕业证qq +性保姆被雇主掀翻在高潮 +情色影院导航18岁禁看 +想找个美女1个晚上寂寞 +成人免费视频mv少女站 +成人午夜场吸精痴女护士 +成人午夜激情视频聊天室 +成人性爱视频电影聊天室 +成人激情asp电影通道 +成全了毛的终身领袖地位 +我上海帅哥政府机关工作 +我以为我是人民的公仆吃 +我以为我是路人甲txt +我们这边是招聘夜场陪酒 +我使劲快速抽插龟头好麻 +我受不了啦好勇猛的鸡巴 +我在花丛中的日子txt +我宁愿你虐我到底txt +我手机要停机了你能帮我 +我扣446巴636巴8 +我是来自美国6军的士兵 +我是鹏妈妈挺替他着急的 +我的qq请注明世纪佳缘 +我的性启蒙老师小说下载 +我的老公不在家艳舞自摸 +我的肉棒仍然在滴著精液 +我的警校淫姐浪妹txt +我的警校生活之淫姐浪妹 +我的那些缠绵往事txt +我知道你也喜欢沙发运动 +我胸大身材好欢迎来激情 +我让朋友强奸我的小姨子 +手机任意显软件下载qq +手机卡监听软件下载qq +手机卧底软件监听支付宝 +扑哧1下鸡吧操进了逼里 +批发54式手枪配件qq +批发64式手枪配件qq +批发77式手枪配件qq +批发fox格斗砍刀qq +批发pcp骚本配件qq +批发x手机卧底软件qq +批发弹簧活塞式气枪qq +批发成人3d电视棒qq +批发成人dvd光碟qq +批发手机变号器软件qq +批发手机变号器软件电话 +批发汽车信号拦截器qq +批发汽车遥控解码器qq +批发潜伏者手机监听软件 +批发精仿极端武力捕鲸叉 +批发高清3d成人电视棒 +找个p友又能爽又能快活 +找帅哥同志mb上门服务 +找性感美女上门全套服务 +把大龟头对准她的阴道口 +护士脱衣图台湾激情电影 +捅入meimei的阴道 +提供54式手枪配件qq +提供64式手枪配件qq +提供77式手枪配件qq +提供fox格斗砍刀qq +提供x卧底手机窃听工具 +提供x卧底手机窃听软件 +提供x手机卧底软件qq +提供仿cz75bd手枪 +提供成人3d电视棒qq +提供手机变号器软件下载 +提供汽车信号拦截器qq +提供特洛伊卧底软件qq +提供特洛伊远程窃听软件 +提供甲基苯丙胺制作方法 +提供美女luoliao +提供高仿真人皮面具qq +插的meimei好爽啊 +插的meimei流淫水 +援交妹上门包夜服务qq +援交妹上门包夜服务电话 +援交妹上门提供服务qq +搓揉裸露在外的那对奶子 +搔meimei色站大全 +搞大肚婆爽口交泻水淫图 +操淫荡护士操淫荡空姐操 +教你怎么用土办法做武器 +教授氯胺酮制作方法qq +教授海洛因制造方法qq +教授甲基苯丙胺制作方法 +新女性宝鉴邱玉茹邱莉婷 +新康泰克提取麻黄碱技术 +新康泰克提取麻黄碱方法 +新康泰克提取麻黄素技术 +新康泰克提取麻黄素方法 +新腾国际娱乐城博彩注册 +无套肉棒浓稠内射漂亮屄 +无线电作弊器材专卖qq +无须注册淫奸小电影图片 +日本女优武藤兰种子下载 +日本娱乐性免费电影在线 +日本艳星平野绫种子视频 +时期打了几次我再次哦唯 +昆明群p聚会共181张 +暴操淫荡小meimei +本小se女很空虚很无聊 +来我们这里会让你很放松 +林心如做爱网有激情自拍 +林心如色情贴图性交贴图 +欧巴小姐我想了解1下来 +欧美清晰打炮能看的淫乱 +毛meimei免费电影 +气枪货到付款,汽狗出售 +求庐江县委书记不雅照片 +江山如此多娇txt下载 +汽车信号屏蔽器供应qq +汽车信号屏蔽器出售qq +汽车信号干扰器出售qq +汽车信号拦截器出售qq +汽车信号拦截器批发qq +汽车信号拦截器提供qq +汽车信号拦截器订购qq +汽车信号拦截器销售qq +汽车信号拦截器预订qq +汽车遥控拦截器出售qq +汽车遥控破解器出售qq +汽车遥控解码器销售电话 +洗浴间爽奸白嫩美乳少女 +海盗的悠闲生活小说下载 +淫meimei成人娱乐 +淫meimei电影论坛 +淫女电影片段试看淫mm +淫奸护士jiejie穴 +淫奸电影淫色猎暴淫电影 +淫妇周艳茹和儿子的性战 +淫水和精液浸濡的小穴里 +淫水流出图强免费淫电影 +淫浪少妇和医生疯狂做爱 +淫电影教你怎样延迟射精 +淫荡姐姐勾引小弟玩操屄 +淫荡红楼小姐的真实自白 +深夜进入少女家中玩强奸 +混蛋神风流史txt全集 +混蛋神风流史电子书下载 +温彻斯特1000x专卖 +温柔女孩操屄竟如此陶醉 +港激情图源成人色情论坛 +满清十大酷刑之赤裸凌迟 +漂亮女站着撒尿躺下被操 +漂亮女记者采访时被逼奸 +漆山妖这几个是数字薇信 +潜伏者手机监听软件qq +潜伏者手机监听软件出售 +潜伏者手机监听软件销售 +潮姫史上最高の潮吹き女 +激情meimei聊天室 +激情成人网用品知识保健 +火热的精液喷射在子宫上 +火车软卧上的艳遇txt +特洛伊卧底软件官方下载 +特洛伊远程窃听软件供应 +特洛伊远程窃听软件试用 +狂插meimei的小穴 +狂插meinv护士小说 +狂插日本meinv护士 +狂插日韩骚逼打飞机必看 +狂插白嫩幼女bb还射乳 +狙击qiang子弹出售 +狡猾的风水相师小说下载 +玉女吹箫的姿势和技巧图 +玉蒲团之和尚手记txt +王梦溪108g无码照片 +现代广州白领的淫荡生活 +现代艳帝传奇txt全集 +现代艳帝传奇电子书下载 +用他的舌尖舔着我的乳头 +用我的舌头刮着她的阴蒂 +甲基苯丙胺制作工艺qq +甲基苯丙胺制作教程qq +甲基苯丙胺制作方法qq +甲基苯丙胺制作流程qq +甲基苯丙胺制作过程qq +甲基苯丙胺制造方法qq +甲基苯丙胺合成工艺qq +甲基苯丙胺合成方法qq +甲基苯丙胺提取技术qq +甲基苯丙胺提取教程qq +甲基苯丙胺提取方法qq +百利宫娱乐城真人百家乐 +盐酸羟亚胺提炼制作技术 +直销54式手枪配件qq +直销64式手枪配件qq +直销77式手枪配件qq +直销fox格斗砍刀qq +直销pcp新贵配件qq +直销俄罗斯mp654k +直销成人3d电视棒qq +相公小仙女要了解下玩吗 +看我更多相册彼此了解后 +真实身份证出售中心qq +知名av女优色情片下载 +硝酸甘油炸药的制作教程 +磨得人家小穴好用力好酥 +禁宫8大酷刑之极乐酷刑 +秦青的幸福生活小说下载 +移动电话卧底软件免费版 +稀少罕见的美少女蝴蝶屄 +穴里嫩肉把鸡巴包得紧紧 +空难之后的1男6女生活 +粉红的的奶头粉嫩的阴唇 +精液射进小穴里到了高潮 +精液直射入她的小穴深处 +纳粹疯淫史2之间谍军妓 +给女人快速达高潮的秘密 +美仙子美乳美脚天中梨子 +美女偷拍成人小说激情网 +美女嫩穴妹穴亮穴女人穴 +美女裸体在线免费淫电影 +美少妇的哀羞txt全集 +美少妇的哀羞小说txt +美少妇的哀羞电子书下载 +美护士是男人操屄的目标 +美脚残酷物语膣壁浸透汁 +老公不在在家家好寂寞啊 +老公的精彩之有妻大家尝 +联邦作为制度博弈的工具 +肉壁包容着鸡吧很舒服啊 +肉摩擦她处女的肉穴深处 +肉棒在小穴4周游移轻撩 +肉棒在小穴深初来回抽动 +肉棒摩擦她屁眼里的嫩肉 +肉棒狠狠地插进小淫穴中 +肉棒用力的抽插着小阴唇 +肏meimei的小骚屄 +股市会成为百姓的屠宰场 +胡惊涛钓鱼岛不属于中国 +能帮我拍1下单写个好评 +脸盘美身材好就是屄丑点 +自制高压锅炸弹过程下载 +色meimei大型黄站 +色情小说bt限制级电影 +色情香欲txt小说下载 +色色医院秘密档案txt +花和尚北美社区最新地址 +苍井空av迅雷下载种子 +菲律宾圣安娜娱乐官方网 +蓝天航空公司的空姐下载 +虎头牌单管猎枪供应qq +衣琪巴久午久2山衣玲久 +被现实玩弄的情人txt +裸体贴图香港成人电影网 +见到这个美女就会有性欲 +警察我们是为人民服务的 +订购54式手枪配件qq +订购64式手枪配件qq +订购77式手枪配件qq +订购pcp新贵配件qq +订购成人3d电视棒qq +让开放成熟压力大的男女 +让我操高潮淫水1直流溅 +购买汽车信号干扰器qq +超淫荡丝袜meimei +身份证号码生成器绿色版 +身份证复印件制作器下载 +转让fox格斗砍刀qq +转让pcp骚本配件qq +转让弹簧活塞式气枪qq +迷人阴部护士妹妹也疯狂 +那天你让我拍的写真照片 +配合着蜜洞内肉棒的抽插 +重生之美女掠夺者txt +重生火影之漩涡鸣人下载 +金城安娜痴女教官no7 +销售54式手枪配件qq +销售64式手枪配件qq +销售77式手枪配件qq +销售fox格斗砍刀qq +销售pcp新贵配件qq +销售pcp骚本配件qq +销售x手机卧底软件qq +销售专卖买卖77式手枪 +销售仿cz75bd手枪 +销售俄罗斯mp654k +销售健卫小口径步枪qq +销售健卫小口径运动步枪 +销售军用92式手枪qq +销售小口径手qiang +销售弹簧活塞式气枪qq +销售成人3d电视棒qq +销售成人dvd光碟qq +销售手机卧底软件破解版 +销售汽车信号拦截器qq +销售汽车信号解码器qq +销售汽车电子解码器qq +销售特洛伊远程窃听软件 +销售破解版手机卧底软件 +销售高清3d成人电视棒 +阳具在他的穴里大幅抽插 +阳具对准她湿润的小穴口 +阴茎在我的肉洞中抽送着 +阴茎在我阴道里急速抽送 +阴道里的大肉棒来回抽插 +阴道里的大肉棒用力顶着 +阻击枪/汽枪/高压气枪 +阿兵哥言语录txt全集 +阿里布达年代记小说下载 +露出了娇小鲜嫩的小屄洞 +顺着大鸡巴湿淋淋的流下 +预订汽车信号拦截器qq +香港3级色情片迅雷下载 +骚meimei成人导航 +高仿真人皮面具销售qq +高压气枪|气枪货到付款 +高压英国pcp骚本出售 +高压锅炸弹制作手册种子 +高清av电视棒出售qq +魔鬼曲线风骚女优青木玲 +鲍鱼贴图妖色成年网电影 +鲜红小嫩屄被群奸真可惜 +鸡巴对准柔软的阴肉缝沟 +鸡巴对准穴口猛地插进去 +麻醉qiang出售qq +麻醉qiang手枪买卖 +麻醉qiang销售qq +黄色免费淫乱电影强奸片 +黄色免费电影meinv +黑火药和硝酸钾农药混合 +黑社会大姐大性欲很旺盛 +龙洲影院日本娱乐性免费 +龟头抵制花心顶住子宫口 +龟头抽插很紧的处女阴道 +龟头通过子宫口直抵花心 +1744扣021扣484 +2012高考考前答案出售 +2012高考考题出售qq +20岁处女偷拍免费ab片 +3d打印枪支0件图纸下载 +3夫妻结伴旅游换妻大乱交 +54手qiang子弹供应 +54手qiang子弹出售 +54手qiang子弹提供 +54手qiang子弹电话 +54手qiang子弹订购 +54手qiang子弹销售 +64手qiang子弹供应 +64手qiang子弹出售 +64手qiang子弹提供 +64手qiang子弹电话 +64手qiang子弹订购 +64手qiang子弹销售 +69手机卧底软件下载地址 +92手qiang子弹供应 +92手qiang子弹出售 +92手qiang子弹提供 +92手qiang子弹电话 +92手qiang子弹订购 +92手qiang子弹销售 +a片a片下载毛片毛片下载 +girldv热门成人影片 +gongchandang +ii2o444扣聊359 +jiejie的阴唇好大啊 +jiejie的阴户好嫩啊 +jiejie的阴道好嫩啊 +jiejie的阴道好紧啊 +k粉制造制作技术配方qq +m300狙击配件在线订购 +m300狙击配件直销qq +m300狙击配件预定qq +meimei的小穴好紧啊 +meimei的阴唇好大啊 +meimei的阴唇好嫩啊 +meimei的阴道好嫩啊 +meimei的阴道好紧啊 +meinv口含鸡吧玩内射 +meinv孩含双棍玩内射 +meinv激情视频聊天室 +mm的诱人双峰免费试看片 +qq54手qiang出售 +qq专卖54手qiang +qq专卖64手qiang +qq专卖77手qiang +qq专卖92手qiang +qq出售手机卧底监听软件 +qq出售进口手机卧底软件 +qq号码任意显示软件直销 +qq手机卧底监听软件提供 +qq提供手机卧底监听软件 +qq特洛伊卧底软件官方网 +qq直销手机卧底监听软件 +qq订购手机卧底监听软件 +qq销售54手qiang +qq销售64手qiang +qq销售77手qiang +qq销售92手qiang +qq销售手机卧底监听软件 +se淫乱jiejie小说 +tokyohot高清下载 +ty身份证复印件制作软件 +urbanrivals靠 +v号就是fh加98我13 +www71axcom裸聊 +x手机卧底软件安卓版下载 +x手机卧底软件安卓版供应 +x手机卧底软件苹果版下载 +下载手机号码变换软件qq +下载无政府主义者食谱资料 +不经常上网请留下您的电话 +东京热雨宫琴音东热流中出 +东北风情熟女之惑小说下载 +丝袜制服自慰道具黄瓜茄子 +中国外交方略让人惨不忍睹 +中宣部是中国社会的艾滋病 +中文情色网站免费母子乱伦 +乳房急促而有节奏的起伏着 +亚洲午夜激情那个电影中心 +亲哥哥妹妹的小穴舒服死了 +代理x手机卧底软件安卓版 +代理x手机卧底软件苹果版 +令人喷血的春宫108姿势 +优质梅钕只位高端的你服物 +传说的胡曾联手是1种假象 +供应54手qiang子弹 +供应64手qiang子弹 +供应92手qiang子弹 +供应x手机卧底软件安卓版 +供应安卓手机卧底软件qq +供应手qiang子弹qq +供应手机卧底软件下载qq +供应手机窃听软件下载qq +供应手机远程卧底软件qq +供应步qiang子弹qq +供应猎qiang子弹qq +保证你打飞机免费电影网站 +催眠悪用集団轮奸30连発 +儿子添着妈妈肥大湿润阴唇 +儿子的肉棒顶到妈妈的花心 +免费meimei黄色淫乱 +免费成人情色激情视频聊天 +免费淫电影免费淫色情电影 +免费淫色meimei电影 +免费电影成人电影激情电影 +全国最新最全良家少妇兼职 +公车奸美女淫奸女电影试看 +冰毒制造制作技术配方qq +出售2012高考考前答案 +出售54手qiang子弹 +出售64手qiang子弹 +出售92手qiang子弹 +出售m300狙击配件qq +出售x手机卧底软件苹果版 +出售全国快递面单数据qq +出售最新1手女性数据qq +出售无政府主义者食谱qq +出售高仿真2代身份证qq +刚刚做了包皮手术不能做爱 +刚发育好的处女就这么被干 +创世之子猎艳之旅小说下载 +初中meimei的小美穴 +加上数字78569是我的 +单管猎qiang出售qq +厕所盗摄护士jiejie +去掉amp号就是我的微信 +又粗又长的肉棒插入阴道里 +双管猎qiang专卖qq +可以嘉我薇信mez632 +可怜系新人美少女甘南3才 +台湾盲人美女在家疯狂做爱 +台湾裸体贴图成人免费电影 +台湾身材1流美女楼梯性爱 +号码任意显示软件直销qq +吉林长春哪里有假币卖假钱 +含住肉棒上下使劲吸吮起来 +和熟睡的妹妹做爱教你1手 +品色堂永远免费开放注册中 +哥哥淫奸meimei论坛 +唐僧和粉尘女子的性爱生活 +啊你弄的我好通啊不要不要 +啊我的小屄给你肏得好舒服 +嗯啊不要停啊插的再深1点 +嗯嗯舒服死了妹妹又要丢了 +国产熟女做爱深喉肛交无码 +在你母亲厨房制作炸弹指南 +在母亲厨房制作高压锅炸弹 +在淘宝搜索店铺鑫丝露女装 +在线淫电影免费淫色情电影 +处女第1次阴道做爱全过程 +处女被强迫吃春药后被开苞 +大6淫乱meinv图图片 +大批量售高仿真人民币qq +大胆总裁敢抢我妈咪txt +大阳具从后面插入她的小穴 +大鸡吧插meimei淫屄 +大龟头顶住了她的花心深处 +大龟头顶住嫂嫂的花心深处 +女大学生在夜店被朋友轮奸 +女生宿舍门房秦大爷的故事 +女皇陛下的笑话婚姻txt +女老板1丝不挂躺在我身边 +好弟弟使劲干jiejie +宅女在古代后宫的幸福生活 +安徽庐江官员群p艳照下载 +家丁绿帽之杨凌乱入txt +家庭主妇翔田千里志村玲子 +将肉棒插进她身体的最深处 +小哥哥来培培我吗想要尼加 +小妹我想试试放得开的来吗 +小嫩穴把大鸡巴包得紧紧的 +小店新开张能帮我拍1下单 +小泽圆小沢まどか的退隐作 +小穴疯狂地吮吸着我的阳精 +少女1丝不挂做爱淫水直流 +少女被逼吃精喝精轮奸灌精 +少妇嫩穴扒开嫩穴扒开嫩穴 +少妇床上欲火难耐自mo图 +工信部从每个纳税人的口袋 +帅哥mm我要互相了解来吗 +平成女忍者奥义中出し陵辱 +幼男做爱meimei做爱 +幼穴贴图毛穴贴图穴淫贴图 +广东妹张雨柔尖叫作爱全集 +庐江县县委书记群p不雅照 +庐江县委书记不雅照片下载 +庐江县委书记不雅照片全套 +庐江县委书记不雅照片全集 +庐江县委书记群pbt下载 +庐江官员艳照全套打包下载 +庐江官员集体淫乱照片下载 +开心色播开心5月丁香5月 +弟弟淫奸jiejie论坛 +弟弟淫奸熟睡jiejie +微13356486450 +微15361085319 +微18064684765 +微18924080025 +快快干我干我快忍不住了哼 +怎样延迟射精18岁以下禁 +怎样延迟射精19岁以下禁 +怎样延迟射精20岁以下禁 +怎样延迟射精21岁以下禁 +怎样延迟射精22岁以下禁 +怎样延迟射精23岁以下禁 +怎样延迟射精24岁以下禁 +怎样延迟射精25岁以下禁 +怎样延迟射精26岁以下禁 +情色6月天人间仙境情色网 +情色天堂论坛咪咪情色论坛 +想插穿她那肥嫩的小骚屄儿 +戈博gerber军刀专卖 +成人激情性爱午夜高潮情色 +成人色情网站初中女生偷拍 +我们就是你的天堂妹子很多 +我们这里做服务的有需要加 +我和6个男人的故事txt +我和jiejie的淫乱史 +我和哥哥双胞胎1起开蜂场 +我和妓女的合租生活txt +我和老师的销魂初夜txt +我扣扣i938i287o +我的内心独白里面有微信号 +我的性启蒙老师txt全集 +我的性启蒙老师电子书下载 +我的独白里面就是我微信号 +我的黑夜比你的白天更美丽 +手qiang子弹供应qq +手qiang子弹提供qq +手伸到儿媳妇下体抚摸嫩穴 +手机任意显号软件下载qq +手机卧底监听软件出售qq +手机卧底监听软件提供qq +手机号任意显软件下载qq +手机窃听软件操作方法qq +扣扣1956634409 +扣扣2194298023 +批发x手机卧底软件安卓版 +批发精仿buck夜鹰平刃 +把舌头伸入jiejie的 +提供54手qiang子弹 +提供64手qiang子弹 +提供92手qiang子弹 +提供安卓手机卧底软件qq +提供手qiang子弹qq +提供手机卧底定位软件qq +提供手机卧底监听软件qq +提供手机卧底间谍软件qq +提供手机远程卧底软件qq +提供步qiang子弹qq +提供猎qiang子弹qq +提供远程卧底监控软件qq +插小穴meimei直流水 +操女人穴色情贴图性交贴图 +操淫荡极品嫩穴操淫荡少妇 +教你在你母亲厨房制作炸弹 +日本av樱井莉亚种子下载 +日本女优夏川水滴种子下载 +日本激情图库脱衣裸体做爱 +日本艳星川村由纪种子视频 +日韩meimei嫩穴淫图 +昆明群p聚会181张下载 +晚上我在这里直播赚点兼职 +有时间可以聊聊你qq多少 +权威主义国家的合法性理论 +极品美女的超级保镖txt +柔软的肉壁紧紧的包著龟头 +梦幻情人射了10次的强片 +欢乐城美国在线咪咪爱论坛 +欲望女人的出轨诱惑txt +欲望边缘激情的缠绵txt +步qiang子弹供应qq +步qiang子弹提供qq +步qiang子弹订购qq +残忍的虐待强奸美丽的淑女 +母子淫乱轮现场看扶正肉棒 +求把自己第1次献给姐姐们 +海盗的悠闲生活txt全集 +海盗的悠闲生活电子书下载 +淫奸meimei电影论坛 +淫穴更紧紧将我的肉棒吸住 +淫荡女mm的嫩穴老师嫩穴 +淫荡少妇孙倩之双蝶乱花丛 +淫荡少妇孙倩之天高任蝶舞 +淫荡少妇激情自拍成人激情 +淫贱meimei贴图论坛 +清秀巨乳学妹校园内被轮奸 +温暖的冬夜老师拼命亲吻我 +湿淋淋的阴道被肉棒插出血 +激情少女成人论坛乱伦强奸 +激爽电影vip会员注册区 +点击这里试看美女做爱现场 +熟女玩3p内射来满足欲望 +爱上风情女老板熳姐txt +狂插meimei穴淫水流 +狡猾的风水相师txt全集 +狡猾的风水相师电子书下载 +猎qiang子弹供应qq +猎qiang子弹大量供应 +猎qiang子弹提供qq +猎qiang子弹订购qq +猛烈的挺送肉体激烈的撞击 +现代学生妹操屄水平真是高 +现在在我爸公司做财务工作 +现场直播女主持人教你做爱 +珈薇ownlove888 +用劲吸吮咬舐着湿润的穴肉 +用手指分开两片肥嫩的阴唇 +电影小片段试看免费淫影片 +电话54手qiang子弹 +电话64手qiang子弹 +电话92手qiang子弹 +电话手qiang子弹qq +电话步qiang子弹qq +电话猎qiang子弹qq +男女激情淫乱图林心如合成 +直销m300狙击配件qq +相伴不主动我们就不会认识 +看单亲妈妈给儿子的性启蒙 +硕大龟头紧紧顶著她的阴道 +秦青的幸福生活txt全集 +秦青的幸福生活电子书下载 +移动电话卧底软件免费供应 +穿越火线之露水情缘txt +粉嫩人妻在老公面前被人搞 +粗壮的肉棒插入淫荡的小穴 +纪念达赖喇嘛流亡49周年 +网络专销巴雷特xm109 +美女同事的那些艳事txt +美女小穴贴图偷拍少女乳房 +美女苏婷的淫荡生活txt +美少女fuck限界大挑戦 +翻译成数字可以加我期待你 +老师嫩穴极品嫩穴淫穴嫩穴 +肉棒又粗又大少女又痛又爽 +肉棒在阴唇上摩擦传来快感 +肉棒插入meimei小穴 +肉棒插入meinv的肉缝 +肉棒深深插入纤弱的肉洞里 +舌尖不断在肉缝里上下舔着 +色meimei乱伦理小说 +色情电影免费电影成人影院 +色情电影卡通成人av少女 +英雄无敌之美女军团txt +血色情迷之火爆萝莉txt +裸体meimei林心如穴 +订购54手qiang子弹 +订购64手qiang子弹 +订购92手qiang子弹 +订购m300狙击配件qq +订购手qiang子弹qq +订购步qiang子弹qq +订购猎qiang子弹qq +贵妃助浴艳舞互动风情胸揉 +跟meimei肏穴好舒服 +身份证复印件制作软件下载 +迅雷下载免费黄色淫乱电影 +这是我的非诚勿扰空间网址 +都市欲望疯狂的缠绵txt +重生火影之漩涡鸣人txt +销售54手qiang子弹 +销售64手qiang子弹 +销售92手qiang子弹 +销售安卓手机卧底软件qq +销售手机卧底定位软件qq +销售手机卧底间谍软件qq +长长的肉棒插进我的阴道里 +阴壁的嫩肉夹得我非常舒服 +阴壁肌肉紧紧挤压着棒鸡巴 +阴茎在殷素素的阴道里抽插 +阴道里嫩肉把鸡巴包得紧紧 +阿里布达年代记txt全集 +阿里布达年代记电子书下载 +高中毕业之销魂初夜txt +高官情人女记者官密txt +高清3d网络电视棒成人版 +鸡巴深深地插在妈的阴户里 +麻古制造制作技术配方qq +麻果制造制作技术配方qq +龟头在嫂嫂的小穴穴口研磨 +龟头挤进了紧窄湿润小嫩穴 +龟头顺着肉壁插入她的阴户 +147人体艺术日本人体艺术 +18岁少女处夜激情性爱电影 +2012下半年高考考前答案 +av女优和平凡男人1日结婚 +jiangdongriji +jiejie和我乱伦理小说 +jiejie和我乱伦理电影 +jiejie的嫩穴mm嫩穴 +meimei张开双腿等你操 +meimei的大阴唇好嫩啊 +meimei的小穴舒服死了 +meimei等你大鸡吧来插 +meimei被操的淫水直流 +meinv发春激情在线电影 +meinv激情sm处女淫水 +meinv激情性交射精电影 +qq专卖小口径手qiang +qq专卖小口径步qiang +qq出售潜伏者手机监听软件 +qq卖64手qiang子弹 +qq卖92手qiang子弹 +qq特洛伊卧底软件官方下载 +qq特洛伊远程窃听软件供应 +qq销售特洛伊智能偷听软件 +sod超天然素材桐岛あゆみ +spycall卧底软件淘宝 +tokyohot之极品妹妹 +zhengjianwang +下载无政府主义者食谱pdf +不断收紧阴道来吞噬我的龟头 +与家人1起淫乱的日子txt +东京物语vol3优质美少女 +东北风情熟女之惑txt全集 +东北风情熟女之惑电子书下载 +中国国家领导人子女任职名单 +中国在统1问题上的投降主义 +中国大型免费成人黄色图片区 +为什么我会帮妹妹在网上相亲 +为单身淑女免费介绍高端男士 +从陈良宇倒台看中国政局走势 +你的小穴好紧夹夹得我好舒服 +你的鸡吧好大啊干的我好爽哦 +供应最新92位码汽车解码器 +儿子顶到jiejie的花心 +免费淫电影看完保证你打飞机 +免费淫色meimei电影网 +免费看激情视频免费成人做爱 +免费裸体meinv性交电影 +最具活力的华人交友约啪平台 +出售军品77式手qiang +出售收藏品进线面单数据qq +出售潜伏者手机监听软件qq +出售甲基苯丙胺制作方法qq +创世之子猎艳之旅txt全集 +创世之子猎艳之旅电子书下载 +加v新wer205有惊喜偶 +加入免费的激情男女交友社区 +加我叩聊伞巴尔尔录伞伞灵巴 +加我抠i2i94o7352 +北京找小姐北京哪里有小姐上 +午夜激情美穴贴台湾性福联盟 +午夜激爽电影网成人电影色区 +半夜我把龟头插进妹妹的深处 +厕所性感meinv清晰淫穴 +另类的游戏之红颜荡妇txt +向您推荐1个集各色男女约会 +啊我的小屄给你肏得好舒服啊 +嘿嘿你只要够厉害就怕你不行 +在线淫电影淫奸电影黄色电影 +在线淫电影看完保证你打飞机 +塞班手机卧底软件破解版下载 +大幅的阴毛覆盖著她的迷人洞 +大鸡巴用力的往小穴里面狠插 +大龟头在我的阴道口来回磨擦 +天赐良缘qq群520我爱你 +夫妻男女公然在游泳池里做爱 +女同sm和h片段合集txt +学生妹meinv在野外偷情 +学生妹同男友夜晚做爱并轮插 +安徽省庐江县委书记艳照门网 +宫泽keito无修正第2弹 +家庭教师は女子校生藤沢美歩 +小穴流水meimei手指插 +小说偷日同事女友的太恋荡了 +小阴唇黏液流下舌头舔进阴道 +居然花钱请人教性爱姿势组图 +巨乳美女rina无码第2弹 +帅逼小妹我想试试开放点的敢 +庐江县委书记不雅照系ps盘 +庐江县委书记副县长淫乱艳照 +庐江县委书记色情艳照男女群 +强奸meinv狂插处女阴道 +恼杀美巨乳meinv吉川萌 +想要孩子的女性提供有偿服务 +想要被干想要跟你1起爽未新 +成人激情视频聊天室秘密入口 +我和僵尸有个约会之僵尸始祖 +我和弟弟双胞胎1起开蜂场哈 +我和美女同事的那些事txt +我平时工作挺忙的很少来这里 +我想做你想吗我欲望强你强吗 +我有好多小闺蜜等着你来解救 +我漂亮的老师狗爬式做爱现场 +我的阴茎使劲的抽插她的小穴 \ No newline at end of file diff --git a/Assets/Plugins/ByteGame/com.bytedance.starksdk/Editor/starksdkEditor.xml.meta b/Assets/HCMiniSdk/Scripts/Sensitive/Resources/sensitivewords.txt.meta similarity index 75% rename from Assets/Plugins/ByteGame/com.bytedance.starksdk/Editor/starksdkEditor.xml.meta rename to Assets/HCMiniSdk/Scripts/Sensitive/Resources/sensitivewords.txt.meta index 28f49b65..24039514 100644 --- a/Assets/Plugins/ByteGame/com.bytedance.starksdk/Editor/starksdkEditor.xml.meta +++ b/Assets/HCMiniSdk/Scripts/Sensitive/Resources/sensitivewords.txt.meta @@ -1,5 +1,5 @@ fileFormatVersion: 2 -guid: 704be7b645bd646b0b072b1dc6cccc22 +guid: 77068464577c488f8e267222b5cc0708 TextScriptImporter: externalObjects: {} userData: diff --git a/Assets/HCMiniSdk/Scripts/Sensitive/SensitiveCheckResult.cs b/Assets/HCMiniSdk/Scripts/Sensitive/SensitiveCheckResult.cs new file mode 100644 index 00000000..e5c580f8 --- /dev/null +++ b/Assets/HCMiniSdk/Scripts/Sensitive/SensitiveCheckResult.cs @@ -0,0 +1,17 @@ +namespace HC +{ + public class SensitiveCheckResult + { + public bool HasSensitive = false; + public string Text = ""; + public CheckSource CheckSource = CheckSource.Null; + } + + public enum CheckSource + { + Null = 0, + Local = 1, + Server, + ServerError + } +} \ No newline at end of file diff --git a/Assets/HCMiniSdk/Scripts/Sensitive/SensitiveCheckResult.cs.meta b/Assets/HCMiniSdk/Scripts/Sensitive/SensitiveCheckResult.cs.meta new file mode 100644 index 00000000..ee3e460f --- /dev/null +++ b/Assets/HCMiniSdk/Scripts/Sensitive/SensitiveCheckResult.cs.meta @@ -0,0 +1,3 @@ +fileFormatVersion: 2 +guid: 06b05ae469bb4181b93b0d47ee5802a1 +timeCreated: 1706086858 \ No newline at end of file diff --git a/Assets/HCMiniSdk/Scripts/Sensitive/SensitiveManager.cs b/Assets/HCMiniSdk/Scripts/Sensitive/SensitiveManager.cs new file mode 100644 index 00000000..8af06b95 --- /dev/null +++ b/Assets/HCMiniSdk/Scripts/Sensitive/SensitiveManager.cs @@ -0,0 +1,62 @@ +using System; +using System.Collections; +using System.Diagnostics; +using UnityEngine; + +namespace HC +{ + public class SensitiveManager : HCSingleton + { + private TrieNode _root; + + public void InitializeSdk() + { + StartCoroutine(InitializeTrieNode()); + } + + private IEnumerator InitializeTrieNode() + { + _root = new TrieNode(); + var sensitiveWordsFile = Resources.Load("sensitivewords"); + var sensitiveWords = sensitiveWordsFile.text.Split('\n'); + yield return _root.Initialize(sensitiveWords, () => { HCDebugger.LogDebug("TrieNode initialization complete."); }); + } + + public void CheckSensitiveWords(string text, SensitiveType type, Action action) + { + StartCoroutine(FilterText(text, type, (filteredText, checkSource) => + { + // 在回调函数中处理过滤后的文本 + var result = new SensitiveCheckResult + { + HasSensitive = !text.Equals(filteredText), + Text = filteredText, + CheckSource = checkSource + }; + + HCDebugger.LogDebug($"[CheckSensitiveWords] inputText = {text} type = {type} outText = {result.Text} HasSensitive = {result.HasSensitive} checkSource = {result.CheckSource}"); + // 调用传入的回调函数,将结果返回 + action(result); + })); + } + + + private IEnumerator FilterText(string inputText, SensitiveType type, Action callback) + { + // 先从本地查 + var filteredText = _root.FilterText(inputText); + if (inputText.Equals(filteredText)) + { + // 服务器校验,并把文本内容传递出去,如果服务器请求失败了,那么直接用原文本发送 + HCServer.Instance.CheckSensitiveWords((int)type, inputText, (code, msg, censorTextResult) => { callback(code != 0 ? filteredText : censorTextResult.content, code != 0 ? CheckSource.ServerError : CheckSource.Server); }); + } + else + { + // 本地已经被修改了文本内容了,直接给返回去了 + callback(filteredText, CheckSource.Local); + } + + yield return null; + } + } +} \ No newline at end of file diff --git a/Assets/HCMiniSdk/Scripts/Sensitive/SensitiveManager.cs.meta b/Assets/HCMiniSdk/Scripts/Sensitive/SensitiveManager.cs.meta new file mode 100644 index 00000000..bf12d876 --- /dev/null +++ b/Assets/HCMiniSdk/Scripts/Sensitive/SensitiveManager.cs.meta @@ -0,0 +1,3 @@ +fileFormatVersion: 2 +guid: 6f935df808fc4719a841be524f7ee279 +timeCreated: 1706086885 \ No newline at end of file diff --git a/Assets/HCMiniSdk/Scripts/Sensitive/SensitiveType.cs b/Assets/HCMiniSdk/Scripts/Sensitive/SensitiveType.cs new file mode 100644 index 00000000..ca61f1e5 --- /dev/null +++ b/Assets/HCMiniSdk/Scripts/Sensitive/SensitiveType.cs @@ -0,0 +1,9 @@ +namespace HC +{ + public enum SensitiveType + { + //1:昵称(短文本) 2:聊天(长文本) + NickName = 1, + Chat = 2 + } +} \ No newline at end of file diff --git a/Assets/HCMiniSdk/Scripts/Sensitive/SensitiveType.cs.meta b/Assets/HCMiniSdk/Scripts/Sensitive/SensitiveType.cs.meta new file mode 100644 index 00000000..55ffe959 --- /dev/null +++ b/Assets/HCMiniSdk/Scripts/Sensitive/SensitiveType.cs.meta @@ -0,0 +1,3 @@ +fileFormatVersion: 2 +guid: d0ef030b58f840dc9a8d236842292213 +timeCreated: 1706086819 \ No newline at end of file diff --git a/Assets/HCMiniSdk/Scripts/Sensitive/TrieNode.cs b/Assets/HCMiniSdk/Scripts/Sensitive/TrieNode.cs new file mode 100644 index 00000000..a8e02094 --- /dev/null +++ b/Assets/HCMiniSdk/Scripts/Sensitive/TrieNode.cs @@ -0,0 +1,124 @@ +using System; +using System.Collections; +using System.Collections.Concurrent; +using System.Collections.Generic; +using System.Text; +using System.Threading.Tasks; + +namespace HC +{ + public class TrieNode + { + private Dictionary children = new(); + private bool _isEndOfWord; + + public void AddWord(string word) + { + if (string.IsNullOrEmpty(word)) + { + throw new ArgumentException("Word cannot be null or empty."); + } + + if (this == null) + { + throw new NullReferenceException("TrieNode instance is null."); + } + + var currentNode = this; + + foreach (var c in word) + { + if (!currentNode.HasChildNode(c)) + { + var newNode = new TrieNode(); + currentNode.AddChildNode(c, newNode); + } + + currentNode = currentNode.GetChildNode(c); + } + + currentNode._isEndOfWord = true; + } + + private TrieNode GetChildNode(char c) + { + return children.TryGetValue(c, out var childNode) ? childNode : null; + } + + private void AddChildNode(char c, TrieNode childNode) + { + children.Add(c, childNode); + } + + private bool HasChildNode(char c) + { + return children.ContainsKey(c); + } + + public IEnumerator Initialize(IEnumerable sensitiveWords, Action callback) + { + var count = 0; + + foreach (var word in sensitiveWords) + { + AddWord(word.Trim()); + count++; + + if (count % 10000 == 0) + { + yield return null; // 暂停协程一帧 + } + } + + callback?.Invoke(); + } + + public string FilterText(string inputText) + { + var inputChars = inputText.ToCharArray(); + var length = inputChars.Length; + var resultBuilder = new StringBuilder(); + + for (var startIndex = 0; startIndex < length; startIndex++) + { + var currentNode = this; + var currentIndex = startIndex; + var matchedIndex = -1; + + while (currentIndex < length) + { + var currentChar = inputChars[currentIndex]; + + if (currentNode.HasChildNode(currentChar)) + { + currentNode = currentNode.GetChildNode(currentChar); + + if (currentNode._isEndOfWord) + { + matchedIndex = currentIndex; + } + + currentIndex++; + } + else + { + break; + } + } + + if (matchedIndex != -1) + { + for (var i = startIndex; i <= matchedIndex; i++) + { + inputChars[i] = '*'; + } + + startIndex = matchedIndex; + } + } + + resultBuilder.Append(inputChars); + return resultBuilder.ToString(); + } + } +} \ No newline at end of file diff --git a/Assets/HCMiniSdk/Scripts/Sensitive/TrieNode.cs.meta b/Assets/HCMiniSdk/Scripts/Sensitive/TrieNode.cs.meta new file mode 100644 index 00000000..50b804e7 --- /dev/null +++ b/Assets/HCMiniSdk/Scripts/Sensitive/TrieNode.cs.meta @@ -0,0 +1,3 @@ +fileFormatVersion: 2 +guid: 3a4abf72d78541898c406d1982965b54 +timeCreated: 1706102532 \ No newline at end of file diff --git a/Assets/HCMiniSdk/Scripts/Server.meta b/Assets/HCMiniSdk/Scripts/Server.meta new file mode 100644 index 00000000..6bcabbc0 --- /dev/null +++ b/Assets/HCMiniSdk/Scripts/Server.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: 42040c9b33c334a6aa03f7727b1cd465 +folderAsset: yes +DefaultImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/HCMiniSdk/Scripts/Server/HCRequestHandler.cs b/Assets/HCMiniSdk/Scripts/Server/HCRequestHandler.cs new file mode 100644 index 00000000..336152e1 --- /dev/null +++ b/Assets/HCMiniSdk/Scripts/Server/HCRequestHandler.cs @@ -0,0 +1,82 @@ +using System; +using System.Collections; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using UnityEngine; +using UnityEngine.Networking; + +namespace HC +{ + public class HCRequestHandler : HCSingleton + { + public void SendPostRequest(string url, string jsonRequestBody, Dictionary headers = null, Action callback = null) + { + StartCoroutine(PostRequestCoroutine(url, jsonRequestBody, headers, callback)); + } + + private static IEnumerator PostRequestCoroutine(string url, string jsonRequestBody, Dictionary headers, Action callback) + { + using var request = new UnityWebRequest(url, UnityWebRequest.kHttpVerbPOST); + request.timeout = 5; + request.downloadHandler = new DownloadHandlerBuffer(); + request.SetRequestHeader("Content-Type", "application/json"); + + if (!string.IsNullOrEmpty(jsonRequestBody)) + { + request.uploadHandler = new UploadHandlerRaw(Encoding.UTF8.GetBytes(jsonRequestBody)); + request.uploadHandler.contentType = "application/json"; + } + + if (headers != null) + { + foreach (var header in headers) + { + request.SetRequestHeader(header.Key, header.Value); + } + } +#if UNITY_EDITOR || DEVELOPMENT_BUILD + var startTime = Time.realtimeSinceStartup; +#endif + yield return request.SendWebRequest(); + +#if UNITY_EDITOR || DEVELOPMENT_BUILD + var endTime = Time.realtimeSinceStartup; + var sb = new StringBuilder(); + sb.AppendLine($"POST Request URL: {url}"); + sb.AppendLine($"POST Request Headers: {GetHeadersAsString(headers)}"); + sb.AppendLine($"POST Request Body: {jsonRequestBody}"); + sb.AppendLine($"Response Code: {request.responseCode}"); + sb.AppendLine($"Response Time: {endTime - startTime:F2} seconds"); + sb.AppendLine($"Response Headers: \n {GetHeadersAsString(request.GetResponseHeaders())}"); + var downloadHandlerText = request.downloadHandler != null ? request.downloadHandler.text : ""; + sb.AppendLine($"Response: {downloadHandlerText}"); + HCDebugger.LogDebug(sb.ToString()); +#endif + + + if (request.result == UnityWebRequest.Result.Success) + { + callback?.Invoke(0, request.downloadHandler?.text); + } + else + { + + callback?.Invoke(-1, request.error ?? $"request fail, result = {request.result} error = {request.error}"); + } + + request.disposeDownloadHandlerOnDispose = true; + request.disposeUploadHandlerOnDispose = true; + } + + private static string GetHeadersAsString(Dictionary headers) + { + if (headers == null || headers.Count == 0) + { + return "\tN/A"; + } + + return headers.Aggregate("", (current, header) => current + "\t" + header.Key + ": " + header.Value + "\n"); + } + } +} \ No newline at end of file diff --git a/Assets/HCMiniSdk/Scripts/Server/HCRequestHandler.cs.meta b/Assets/HCMiniSdk/Scripts/Server/HCRequestHandler.cs.meta new file mode 100644 index 00000000..aecc56cd --- /dev/null +++ b/Assets/HCMiniSdk/Scripts/Server/HCRequestHandler.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: 5b22c48f885c74d2c97953b6facfd886 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/HCMiniSdk/Scripts/Server/HCServer.cs b/Assets/HCMiniSdk/Scripts/Server/HCServer.cs new file mode 100644 index 00000000..cb0ca521 --- /dev/null +++ b/Assets/HCMiniSdk/Scripts/Server/HCServer.cs @@ -0,0 +1,410 @@ +using System; +using System.Collections.Generic; +using System.Security.Cryptography; +using System.Text; +using UnityEngine; + +namespace HC +{ + public class HCServer : HCSingleton + { +// #if !UNITY_EDITOR +// public const string BASE_URL = "https://sandc.gameztsvc.com/ztp"; +// +// #else +// public const string BASE_URL = "https://tk.dgtverse.cn/ztp"; +// #endif + public const string BASE_URL = "https://sandc.gameztsvc.com/ztp"; + + public const string URL_VERIFY_PURCHASE = "/game/report/iap"; + public const string URL_LOGIN = "/game/user/login"; + public const string URL_BIND = "/game/user/bind"; + public const string URL_DELETE = "/game/user/delete"; + public const string URL_MINI_APP_CONFIG = "/app/parameter"; + public const string URL_MINI_APP_PAY = "/wechat/mini-app-pay"; + public const string URL_ORDER_CREATE = "/order/create"; + public const string URL_ORDER_QUERY = "/order/query"; + public const string URL_ORDER_AWARDED = "/order/awarded"; + public const string URL_CENSOR_TEXT = "/user/censor-text"; + public const string URL_WX_DATA_DECRYPT = "/user/game-data-decrypt"; + + + private const string XXTEA_KEY = "tkbff&(gBUjX#$s0710"; + private const string secretKey = "tk~!@#$%^&*()_+0708"; + + public void WxDataDecrypt(string iv, string encryptedData, string signature, Action callback) + { + var req = new Dictionary + { + ["iv"] = iv, + ["signature"] = signature, + ["encrypted_data"] = encryptedData + }; + + Post(URL_WX_DATA_DECRYPT, req, callback); + } + + public void AppConfig(Action callback) + { + var req = new Dictionary(); + int appType = 0; + +#if WEBGL_WX + appType = 1; +#elif WEBGL_BYTEDANCE + appType = 2; +#endif + req["app_type"] = appType; + + Post(URL_MINI_APP_CONFIG, req, callback); + } + + public void MiniAppPay(string billNo, string productName, int amt, Action callback) + { + Post(URL_MINI_APP_PAY, new Dictionary() + { + ["bill_no"] = billNo, + ["product_name"] = productName, + ["amt"] = amt, + }, callback); + } + + + public void CheckSensitiveWords(int type, string text, Action callback) + { + Post(URL_CENSOR_TEXT, new Dictionary() + { + ["biz_type"] = type, + ["text"] = text + }, callback); + } + + /// + /// 支付下单接口 + /// + /// 商品名称 + /// 商品id + /// 价格 (分) + /// 数量 + /// 支付类型 1 = wechat + /// 货币单位 + /// + /// 回调 + public void OrderCreate(string productName, string productId, string price, int quantity, int orderType = 1, string currency = "CNY", string gameExtraParam = "", Action callback = null) + { + Post(URL_ORDER_CREATE, new Dictionary + { + ["product_name"] = productName, + ["product_id"] = productId, + ["price"] = price, + ["quantity"] = quantity, + ["order_type"] = orderType, + ["currency"] = currency, + ["game_extra_param"] = gameExtraParam, + }, callback); + } + + /// + /// 订单查询 + /// + /// 订单号 + /// 回调 + public void OrderQuery(string orderNo, Action callback = null) + { + Post(URL_ORDER_QUERY, new Dictionary + { + ["order_no"] = orderNo + }, callback); + } + + /// + /// 订单奖励下发上报接口 + /// + /// 订单号 + /// 回调 + public void OrderAwarded(string orderNo, Action callback = null) + { + Post(URL_ORDER_AWARDED, new Dictionary + { + ["order_no"] = orderNo + }, callback); + } + + + public void VerifyPurchase(Dictionary args, Action callback) + { + Post(URL_VERIFY_PURCHASE, args, callback); + } + + public void Post(string url, Dictionary args, Action callback, + Dictionary headers = null) where T : new() + { + args ??= new Dictionary(); + + headers ??= new Dictionary(); + + AddBaseParameters(args); + + EncryptionParameters(args); + var requestBody = ConvertDictionaryToJson(args); + HCDebugger.LogDebug("[server] url=> " + url); + HCDebugger.LogDebug("[server] requestBody=> " + requestBody); + var encryptBody = EncryptRequestBody(requestBody); + if (!string.IsNullOrEmpty(encryptBody)) + { + headers["params"] = encryptBody; + headers["encrypt"] = true.ToString().ToLower(); + requestBody = ""; + } + + HCRequestHandler.Instance.SendPostRequest(BASE_URL + url, requestBody, headers, + (code, res) => + { + HCDebugger.LogDebug($"[server] resp ====> code : {code} res : {res}"); + if (code == 0) + { + Response resp = null; + var errorMsg = ""; + + try + { + res = DecryptResponseBody(res); + resp = JsonUtility.FromJson>(res); + } + catch (Exception e) + { + errorMsg = $"[server] Data conversion exception。{e.Message} {res}"; + HCDebugger.LogError(errorMsg); + } + + + if (resp != null) + { + callback(resp.code, resp.msg, resp.data); + } + else + { + callback.Invoke(-1, errorMsg, new T()); + } + } + else + { + callback.Invoke(code, res, new T()); + } + + HCDebugger.LogDebug("[server]" + "[res] " + res); + }); + } + + private static string EncryptRequestBody(string requestBody) + { + var encryptRequestBodyBytes = HCXXTEA.Encrypt(Encoding.UTF8.GetBytes(requestBody), Encoding.UTF8.GetBytes(XXTEA_KEY)); + var encryptRequestBody = HCConvertUtils.BytesToHexString(encryptRequestBodyBytes, false); + HCDebugger.LogDebug($"[HCServer] [EncryptRequestBody] requestBody = {requestBody} encryptRequestBody = {encryptRequestBody}"); + return encryptRequestBody; + } + + private static string DecryptResponseBody(string responseBody) + { + var decryptResponseBodyBytes = HCXXTEA.Decrypt(HCConvertUtils.HexStringToBytes(responseBody), Encoding.UTF8.GetBytes(XXTEA_KEY)); + var decryptResponseBody = Encoding.UTF8.GetString(decryptResponseBodyBytes); + HCDebugger.LogDebug($"[HCServer] [DecryptResponseBody] responseBody = {responseBody} decryptResponseBody = {decryptResponseBody}"); + return decryptResponseBody; + } + + private static string GetMD5Hash(string input) + { + using (var md5 = MD5.Create()) + { + var inputBytes = Encoding.ASCII.GetBytes(input); + var hashBytes = md5.ComputeHash(inputBytes); + + var builder = new StringBuilder(); + foreach (var t in hashBytes) + { + builder.Append(t.ToString("x2")); // Convert byte to hexadecimal string + } + + return builder.ToString(); + } + } + + private static void EncryptionParameters(Dictionary args) + { + var signString = + $"{secretKey}platform={args["platform"]}packagename={args["package_name"]}channel={args["channel"]}appversion={args["app_version"]}appversioncode={args["app_version_code"]}language={args["language"]}ip={args["ip"]}ts={args["ts"]}"; + var sign = GetMD5Hash(signString); + args["sign"] = sign; + } + + private static void AddBaseParameters(IDictionary args) + { + args.AddIfNotExists("unity_sdk_version", HCNativeInterface.SDKVersion); + args.AddIfNotExists("package_name", HCInfoUtils.GetBundleID()); + + args.AddIfNotExists("platform", HCInfoUtils.GetPlatform()); + args.AddIfNotExists("channel", HCInfoUtils.GetChannel()); + args.AddIfNotExists("device_type", HCInfoUtils.GetDeviceType()); + args.AddIfNotExists("app_version", HCInfoUtils.GetAppVersion()); + args.AddIfNotExists("app_version_code", HCInfoUtils.GetAppVersionCode()); + args.AddIfNotExists("language", HCInfoUtils.GetLanguage()); + args.AddIfNotExists("ip", ""); + args.AddIfNotExists("device_id", HCTools.GetPlayerPrefsString(HCAccountManager.Instance.staticSaveKey_DeviceID)); + args.AddIfNotExists("app_u8id", ""); + args.AddIfNotExists("app_name", Application.productName); + args.AddIfNotExists("model", HCInfoUtils.GetModel()); + args.AddIfNotExists("brand", HCInfoUtils.GetBrand()); + args.AddIfNotExists("system_name", HCInfoUtils.GetSystemName()); + args.AddIfNotExists("screen_size", ""); + args.AddIfNotExists("network_type", ""); + args.AddIfNotExists("ua", ""); + args.AddIfNotExists("idfa", ""); + args.AddIfNotExists("idfv", ""); + args.AddIfNotExists("gaid", ""); + args.AddIfNotExists("oaid", ""); + args.AddIfNotExists("android_id", ""); + args.AddIfNotExists("adid", ""); + args.AddIfNotExists("fire_adid", ""); + args.AddIfNotExists("ad_network", ""); + args.AddIfNotExists("campaign", ""); + args.AddIfNotExists("adgroup", ""); + args.AddIfNotExists("creative", ""); + args.AddIfNotExists("referrer", ""); + args.AddIfNotExists("memory", ""); + args.AddIfNotExists("memory_usage", ""); + args.AddIfNotExists("country", ""); + args.AddIfNotExists("user_id", HCTools.GetPlayerPrefsString(HCAccountManager.staticSaveKey_UserID)); + args.AddIfNotExists("user_type", HCTools.GetPlayerPrefsInt(HCAccountManager.staticSaveKey_UserType)); + + args.AddIfNotExists("ss_distinct_id", HCTools.GetPlayerPrefsString(HCTools.SS_DISTINCT_ID)); + args.AddIfNotExists("ss_account_id", HCTools.GetPlayerPrefsString(HCAccountManager.staticSaveKey_UserID)); + args.AddIfNotExists("ts", "" + HCTimeTools.GetCurrentTimestamp()); + + foreach (var (key, value) in HCInfoUtils.GetBaseInfo()) + { + args.AddIfNotExists(key, value); + } + } + + + public static string ConvertDictionaryToJson(Dictionary dictionary) + { + StringBuilder jsonBuilder = new StringBuilder(); + jsonBuilder.Append("{"); + + int count = 0; + + foreach (KeyValuePair kvp in dictionary) + { + string key = kvp.Key; + object value = kvp.Value; + + jsonBuilder.AppendFormat("\"{0}\":", key); + + if (value is int || value is float || value is bool) + { + jsonBuilder.Append(value.ToString().ToLower()); + } + else if (value == null) + { + jsonBuilder.Append("\"\""); + } + else if (value is string) + { + jsonBuilder.AppendFormat("\"{0}\"", value); + } + else + { + // Handle other types or nested dictionaries recursively + Dictionary nestedDictionary = value as Dictionary; + if (nestedDictionary != null) + { + string nestedJson = ConvertDictionaryToJson(nestedDictionary); + jsonBuilder.Append(nestedJson); + } + } + + count++; + if (count < dictionary.Count) + { + jsonBuilder.Append(","); + } + } + + jsonBuilder.Append("}"); + return jsonBuilder.ToString(); + } + + [Serializable] + public class Response + { + public int code = -1; + public string msg; + public T data; + public int ts; + } + + [Serializable] + public class DataInfo + { + public int illegal_order = -1; + } + + [Serializable] + public class MiniAppConfig + { + public string content; + } + + [Serializable] + public class MiniPayResult + { + public string order_no; + public int balance; + } + + [Serializable] + public class CensorTextResult + { + public string has_sensitive; + public string content; + } + + /// + /// 下单结果 + /// + [Serializable] + public class OrderCreateResult + { + /// + /// 订单号 + /// + public string order_no; + } + + /// + /// 查询结果 + /// + [Serializable] + public class OrderQueryResult + { + public const int PayStatusNotPaid = 0; + public const int PayStatusPaid = 1; + public const int PayStatusPaymentFailed = 2; + + /// + /// 订单状态 0:未支付, 1:已支付,2:支付失败(等其它原因) + /// + public int pay_status; + + public string transaction_id; + public string pay_success_time; + public string game_extra_param; + } + + [Serializable] + public class OrderAwardedResult + { + } + } +} \ No newline at end of file diff --git a/Assets/HCMiniSdk/Scripts/Server/HCServer.cs.meta b/Assets/HCMiniSdk/Scripts/Server/HCServer.cs.meta new file mode 100644 index 00000000..ffd21a8f --- /dev/null +++ b/Assets/HCMiniSdk/Scripts/Server/HCServer.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: e5b132d50a071488c86c45bb7a7c37f5 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/HCMiniSdk/Scripts/WebGL.meta b/Assets/HCMiniSdk/Scripts/WebGL.meta new file mode 100644 index 00000000..37562b61 --- /dev/null +++ b/Assets/HCMiniSdk/Scripts/WebGL.meta @@ -0,0 +1,3 @@ +fileFormatVersion: 2 +guid: 4fb6da5e0dff4d01ac7d029b99a8f95b +timeCreated: 1699346463 \ No newline at end of file diff --git a/Assets/HCMiniSdk/Scripts/WebGL/HCBytedance.meta b/Assets/HCMiniSdk/Scripts/WebGL/HCBytedance.meta new file mode 100644 index 00000000..2c31ed14 --- /dev/null +++ b/Assets/HCMiniSdk/Scripts/WebGL/HCBytedance.meta @@ -0,0 +1,3 @@ +fileFormatVersion: 2 +guid: b79cb6d4aeff4acc9c43cd26dd7c288e +timeCreated: 1701221412 \ No newline at end of file diff --git a/Assets/HCMiniSdk/Scripts/WebGL/HCBytedance/HCBytedanceAccount.cs b/Assets/HCMiniSdk/Scripts/WebGL/HCBytedance/HCBytedanceAccount.cs new file mode 100644 index 00000000..b7093bc8 --- /dev/null +++ b/Assets/HCMiniSdk/Scripts/WebGL/HCBytedance/HCBytedanceAccount.cs @@ -0,0 +1,43 @@ +#if WEBGL_BYTEDANCE +using System; +using System.Collections.Generic; +using StarkSDKSpace; + +namespace HC +{ + public class HCBytedanceAccount : HCIAccount + { + public void Login(Action callback) + { + /// 登录成功 + /// 临时登录凭证, 有效期 3 分钟。可以通过在服务器端调用 登录凭证校验接口 换取 openid 和 session_key 等信息。 + /// 用于标识当前设备, 无论登录与否都会返回, 有效期 3 分钟 + /// 判断在当前 APP(头条、抖音等)是否处于登录状态 + StarkSDK.API.GetAccountManager().Login((code, anonymousCode, login) => + { + // 和服务器约定的code + var serverCode = $"{code},{anonymousCode}"; + + HCDebugger.LogDebug($"[HCBytedanceAccount] [Login] [success] code = {code} anonymousCode = {anonymousCode} login = {login}"); + callback.Invoke(new HCLoginResult() + { + code = 0, + token = serverCode, + userId = serverCode, + msg = "success" + }); + }, errMsg => + { + HCDebugger.LogDebug($"[HCBytedanceAccount] [Login] [failedCallback] errMsg = {errMsg}"); + callback.Invoke(new HCLoginResult() + { + code = -1, + token = "", + userId = "", + msg = errMsg + }); + }); + } + } +} +#endif \ No newline at end of file diff --git a/Assets/HCMiniSdk/Scripts/WebGL/HCBytedance/HCBytedanceAccount.cs.meta b/Assets/HCMiniSdk/Scripts/WebGL/HCBytedance/HCBytedanceAccount.cs.meta new file mode 100644 index 00000000..e52b4d2f --- /dev/null +++ b/Assets/HCMiniSdk/Scripts/WebGL/HCBytedance/HCBytedanceAccount.cs.meta @@ -0,0 +1,3 @@ +fileFormatVersion: 2 +guid: d529c4a6108244aebd3141c7c9d160f8 +timeCreated: 1701236379 \ No newline at end of file diff --git a/Assets/HCMiniSdk/Scripts/WebGL/HCBytedance/HCBytedanceAds.cs b/Assets/HCMiniSdk/Scripts/WebGL/HCBytedance/HCBytedanceAds.cs new file mode 100644 index 00000000..2790fae9 --- /dev/null +++ b/Assets/HCMiniSdk/Scripts/WebGL/HCBytedance/HCBytedanceAds.cs @@ -0,0 +1,267 @@ +#if WEBGL_BYTEDANCE +using System; +using System.Collections.Generic; +using StarkSDKSpace; +using UnityEngine; + +namespace HC +{ + public class HCBytedanceAds : HCSingleton, HCIAds, StarkAdManager.VideoAdCallback + { + private Action> _callback; + + public void InitializeSdk(Action> callback) + { + HCDebugger.LogDebug($"[HCBytedanceAds] [InitializeSdk] callback = {callback}"); + _callback = callback; + StarkSDK.API.GetStarkAdManager().SetVideoAdCallBack(this); + } + + public void RewardedLoad(string adUnitId) + { + HCDebugger.LogDebug($"[HCBytedanceAds] [RewardedLoad] adUnitId = {adUnitId}"); + } + + public bool IsRewardedAdReady(string adUnitId) + { + HCDebugger.LogDebug($"[HCBytedanceAds] [IsRewardedAdReady] adUnitId = {adUnitId}"); + return true; + } + + [Obsolete("Obsolete")] + public void ShowRewardedAd(string adUnitId) + { + HCDebugger.LogDebug($"[HCBytedanceAds] [IsRewardedAdReady] adUnitId = {adUnitId}"); + StarkSDK.API.GetStarkAdManager().ShowVideoAdWithId(adUnitId, isComplete => + { + HCDebugger.LogDebug($"[HCBytedanceAds] [ShowRewardedAd] [closeCallback] adUnitId = {adUnitId} isComplete = {isComplete}"); + _callback?.Invoke(HCADSstatuscallback.RewardedClose, adUnitId, 0, "", new Dictionary + { + ["isEnded"] = isComplete + }); + }, (errCode, errMsg) => + { + _callback?.Invoke(HCADSstatuscallback.RewardedLoadFailed, adUnitId, errCode, errMsg, new Dictionary + { + ["type"] = "callback" + }); + + HCDebugger.LogDebug($"[HCBytedanceAds] [ShowRewardedAd] [closeCallback] adUnitId = {adUnitId} errCode = {errCode} errMsg = {errMsg}"); + _callback?.Invoke(HCADSstatuscallback.RewardedShowFailed, adUnitId, errCode, errMsg, null); + }); + } + + private StarkAdManager.InterstitialAd _interstitialAd; + + + private StarkAdManager.InterstitialAd GetInterstitialAd(string adUnitId, bool isDestroy = false) + { + + if (_interstitialAd == null) + { + HCDebugger.LogError("创建广告对象"); + _interstitialAd = StarkSDK.API.GetStarkAdManager().CreateInterstitialAd(adUnitId, + (errCode, errMsg) => + { + // 广告视频错误回调,参数含义 errCode, errMsg 表明错误码和错误描述 + HCDebugger.LogDebug($"[HCBytedanceAds] [GetInterstitialAd] [errCallback] adUnitId = {adUnitId} errCode = {errCode} errMsg = {errMsg} _interstitialAd.IsLoaded() = {_interstitialAd?.IsLoaded()}"); + if (_interstitialAd !=null && _interstitialAd.IsLoaded()) + { + _callback?.Invoke(HCADSstatuscallback.InterstitialShowFailed, adUnitId, errCode, errMsg, null); + } + else + { + _callback?.Invoke(HCADSstatuscallback.InterstitialLoadFailed, adUnitId, errCode, errMsg, new Dictionary + { + ["type"] = "callback" + }); + } + }, () => + { + // HCDebugger.LogError($"销毁广告对象 {_interstitialAd} hashCode : {_interstitialAd?.GetHashCode()}"); + // _interstitialAd?.Destroy(); + // _interstitialAd = null; + + + // 广告视频关闭回调 + HCDebugger.LogDebug($"[HCBytedanceAds] [GetInterstitialAd] [closeCallback] adUnitId = {adUnitId}"); + _callback?.Invoke(HCADSstatuscallback.InterstitialClose, adUnitId, 0, "", new Dictionary + { + ["type"] = "callback" + }); + }, () => + { + HCDebugger.LogDebug($"[HCBytedanceAds] [GetInterstitialAd] [loadedCallback] adUnitId = {adUnitId}"); + _callback?.Invoke(HCADSstatuscallback.InterstitialLoadSuccess, adUnitId, 0, "", new Dictionary + { + ["type"] = "callback" + }); + }); + } + + HCDebugger.LogDebug($"###########[HCBytedanceAds] [GetInterstitialAd] _interstitialAd = {_interstitialAd} hashCode : {_interstitialAd.GetHashCode()}"); + return _interstitialAd; + } + + public void LoadInterstitial(string adUnitId) + { + HCDebugger.LogDebug($"[HCBytedanceAds] [LoadInterstitial] adUnitId = {adUnitId}"); + GetInterstitialAd(adUnitId, true).Load(); + } + + public bool IsInterstitialReady(string adUnitId) + { + var isInterstitialReady = GetInterstitialAd(adUnitId).IsLoaded(); + HCDebugger.LogDebug($"[HCBytedanceAds] [IsInterstitialReady] adUnitId = {adUnitId} isInterstitialReady = {isInterstitialReady}"); + return isInterstitialReady; + } + + public void ShowInterstitial(string adUnitId) + { + var isInterstitialReady = IsInterstitialReady(adUnitId); + + HCDebugger.LogDebug($"[HCBytedanceAds] [ShowInterstitial] adUnitId = {adUnitId} IsInterstitialReady = {isInterstitialReady}"); + if (isInterstitialReady) + { + _callback?.Invoke(HCADSstatuscallback.InterstitialShowSuccess, adUnitId, 0, "", null); + } + + GetInterstitialAd(adUnitId).Show(); + // IsInterstitialLoad = false; + } + + private StarkAdManager.BannerAd _bannerAd; + + private int px2dp(int px) => (int)(px * (160 / Screen.dpi)); + + private StarkAdManager.BannerAd GetBannerAd(string adUnitId) + { + var bannerStyle = new StarkAdManager.BannerStyle + { + width = 320, + left = 10, + top = 100 + }; + return _bannerAd ??= StarkSDK.API.GetStarkAdManager().CreateBannerAd(adUnitId, bannerStyle, 30, (errCode, errMsg) => + { + // 广告错误回调,参数表明错误码和错误描述. + HCDebugger.LogDebug($"[HCBytedanceAds] [GetBannerAd] [errCallback] adUnitId = {adUnitId} errCode = {errCode} errMsg = {errMsg}"); + _callback?.Invoke(HCADSstatuscallback.BannerLoadFailed, adUnitId, errCode, errMsg, null); + _callback?.Invoke(HCADSstatuscallback.BannerShowFailed, adUnitId, errCode, errMsg, null); + }, () => + { + // 广告加载回调 + HCDebugger.LogDebug($"[HCBytedanceAds] [GetBannerAd] [loadedCallback] adUnitId = {adUnitId} "); + _callback?.Invoke(HCADSstatuscallback.BannerLoadSuccess, adUnitId, 0, "", null); + }, (width, height) => + { + // 广告样式改变回调,第一个参数是width.第二个参数是height. + HCDebugger.LogDebug($"[HCBytedanceAds] [GetBannerAd] [resizeCallback] adUnitId = {adUnitId} width = {width} height = {height}"); + _callback?.Invoke(HCADSstatuscallback.BannerResize, adUnitId, 0, "", new Dictionary() + { + ["width"] = width, + ["height"] = height + }); + ChangeStyle(adUnitId, bannerStyle, width, height); + }, () => + { + // 广告关闭回调,仅在WebGL有效 + HCDebugger.LogDebug($"[HCBytedanceAds] [GetBannerAd] [closeCallback] adUnitId = {adUnitId}"); + }); + } + + void ChangeStyle(string adUnitId, StarkAdManager.BannerStyle style, int w, int h) + { + var sw = px2dp(Screen.width); //获得屏幕宽度(dp) + var sh = px2dp(Screen.height); //获得屏幕高度(dp) + + style.top = sh - h; //底部 + style.left = sw / 2 - w / 2; //中央 + style.width = w; + + GetBannerAd(adUnitId).ReSize(style); //使用Resize函数调整位置和大小 + } + + public void CreateBanner(string adUnitId) + { + HCDebugger.LogDebug($"[HCBytedanceAds] [CreateBanner] adUnitId = {adUnitId}"); + GetBannerAd(adUnitId); + } + + public void DestroyBanner(string adUnitId) + { + HCDebugger.LogDebug($"[HCBytedanceAds] [DestroyBanner] adUnitId = {adUnitId}"); + GetBannerAd(adUnitId).Destroy(); + } + + public void ShowBanner(string adUnitId) + { + var isInvalid = GetBannerAd(adUnitId).IsInvalid(); + HCDebugger.LogDebug($"[HCBytedanceAds] [ShowBanner] adUnitId = {adUnitId} IsInvalid = {isInvalid}"); + if (isInvalid) + { + _callback?.Invoke(HCADSstatuscallback.BannerShowSuccess, adUnitId, 0, "", null); + } + + GetBannerAd(adUnitId).Show(); + } + + public void HideBanner(string adUnitId) + { + HCDebugger.LogDebug($"[HCBytedanceAds] [HideBanner] adUnitId = {adUnitId}"); + GetBannerAd(adUnitId).Hide(); + _callback?.Invoke(HCADSstatuscallback.BannerHideSuccess, adUnitId, 0, "", null); + } + + public void SetLogEnable(bool _enable) + { + } + + public void LoadNative(string adUnit) + { + } + + public void RemoveNative(string adUnit) + { + } + + public bool IsNativeAdReady(string adUnit) + { + return false; + } + + public void ShowNative(string adUnit, float x, float y, float width, float height, string pAdPos, Action _showFailedCallback = null, Action _closeCallback = null) + { + } + + #region 激励视频回调 + + public void OnVideoLoaded() + { + HCDebugger.LogDebug("[HCBytedanceAds] [OnVideoLoaded]"); + _callback?.Invoke(HCADSstatuscallback.RewardedLoadSuccess, "", 0, "", new Dictionary + { + ["type"] = "callback" + }); + } + + public void OnVideoShow(long timestamp) + { + HCDebugger.LogDebug($"[HCBytedanceAds] [OnVideoShow] timestamp = {timestamp}"); + _callback?.Invoke(HCADSstatuscallback.RewardedShowSuccess, "", 0, "", null); + } + + public void OnError(int errCode, string errorMessage) + { + HCDebugger.LogDebug($"[HCBytedanceAds] [OnError] errCode = {errCode} errorMessage = {errorMessage}"); + } + + public void OnVideoClose(int watchedTime, int effectiveTime, int duration) + { + HCDebugger.LogDebug($"[HCBytedanceAds] [OnVideoClose] watchedTime = {watchedTime} effectiveTime = {effectiveTime} duration = {duration}"); + } + + #endregion + } +} +#endif \ No newline at end of file diff --git a/Assets/HCMiniSdk/Scripts/WebGL/HCBytedance/HCBytedanceAds.cs.meta b/Assets/HCMiniSdk/Scripts/WebGL/HCBytedance/HCBytedanceAds.cs.meta new file mode 100644 index 00000000..f5c3125e --- /dev/null +++ b/Assets/HCMiniSdk/Scripts/WebGL/HCBytedance/HCBytedanceAds.cs.meta @@ -0,0 +1,3 @@ +fileFormatVersion: 2 +guid: a26ff118b5a44fd6b4614a92cbffec1f +timeCreated: 1701236413 \ No newline at end of file diff --git a/Assets/HCMiniSdk/Scripts/WebGL/HCBytedance/HCBytedanceAnalytics.cs b/Assets/HCMiniSdk/Scripts/WebGL/HCBytedance/HCBytedanceAnalytics.cs new file mode 100644 index 00000000..b25d615e --- /dev/null +++ b/Assets/HCMiniSdk/Scripts/WebGL/HCBytedance/HCBytedanceAnalytics.cs @@ -0,0 +1,16 @@ +#if WEBGL_BYTEDANCE +using System.Collections.Generic; +using StarkSDKSpace; + +namespace HC +{ + public class HCBytedanceAnalytics : HCIAnalytics + { + public void TrackEvent(string eventName, Dictionary eventDic = null) + { + eventDic ??= new Dictionary(); + StarkSDK.API.ReportAnalytics(eventName, eventDic); + } + } +} +#endif \ No newline at end of file diff --git a/Assets/HCMiniSdk/Scripts/WebGL/HCBytedance/HCBytedanceAnalytics.cs.meta b/Assets/HCMiniSdk/Scripts/WebGL/HCBytedance/HCBytedanceAnalytics.cs.meta new file mode 100644 index 00000000..8fbec445 --- /dev/null +++ b/Assets/HCMiniSdk/Scripts/WebGL/HCBytedance/HCBytedanceAnalytics.cs.meta @@ -0,0 +1,3 @@ +fileFormatVersion: 2 +guid: 7bbaffbbd08143729412e4c19177cfe2 +timeCreated: 1701236609 \ No newline at end of file diff --git a/Assets/HCMiniSdk/Scripts/WebGL/HCBytedance/HCBytedanceAppInfo.cs b/Assets/HCMiniSdk/Scripts/WebGL/HCBytedance/HCBytedanceAppInfo.cs new file mode 100644 index 00000000..8d8dd08b --- /dev/null +++ b/Assets/HCMiniSdk/Scripts/WebGL/HCBytedance/HCBytedanceAppInfo.cs @@ -0,0 +1,131 @@ +#if WEBGL_BYTEDANCE +using System; +using System.Collections.Generic; +using StarkSDKSpace; + +namespace HC +{ + public class HCBytedanceAppInfo : HCIAppInfo + { + public string GetBundleID() + { + if (string.IsNullOrEmpty(StarkSDK.s_ContainerEnv.GameAppId)) + { + return HCStaticParams.BytedanceAppId; + } + + return StarkSDK.s_ContainerEnv.GameAppId; + } + + public string GetVersion() + { + return StarkSDK.API.GamePublishVersion; + } + + public string GetModel() + { + return StarkSDK.API.GetSystemInfo().model; + } + + public string GetBrand() + { + return StarkSDK.API.GetSystemInfo().brand; + } + + public string GetLanguage() + { + return StarkSDK.API.GetSystemInfo().language; + } + + public string GetSystemName() + { + return StarkSDK.API.GetSystemInfo().system; + } + + public Dictionary GetBaseInfo() + { + var mHostEnum = HostEnum.MoMoYu; + + try + { + mHostEnum = StarkSDK.s_ContainerEnv.m_HostEnum; + } + catch (Exception e) + { + // ignored + } + + var mLaunchFromEnum = LaunchFromEnum.UnKnown; + + try + { + mLaunchFromEnum = StarkSDK.s_ContainerEnv.m_LaunchFromEnum; + } + catch (Exception e) + { + // ignored + } + + var getVersionType = VersionType.None; + + try + { + getVersionType = StarkSDK.s_ContainerEnv.GetVersionType(); + } + catch (Exception e) + { + // ignored + } + + + var getLaunchFromStr = StarkSDK.s_ContainerEnv.GetLaunchFromStr(); + var getLocation = StarkSDK.s_ContainerEnv.GetLocation(); + var getLaunchFrom = StarkSDK.s_ContainerEnv.GetLaunchFrom(); + if (string.IsNullOrEmpty(getLaunchFromStr)) + { + getLaunchFromStr = ""; + } + + if (string.IsNullOrEmpty(getLocation)) + { + getLocation = ""; + } + + if (string.IsNullOrEmpty(getLaunchFrom)) + { + getLaunchFrom = ""; + } + + return new Dictionary() + { + ["d_hostVersion"] = StarkSDK.API.GetSystemInfo().hostVersion, + ["d_hostName"] = StarkSDK.API.GetSystemInfo().hostName, + ["d_scVersion"] = StarkSDK.API.GetSystemInfo().scVersion, + ["d_sdkVersion"] = StarkSDK.API.GetSystemInfo().sdkVersion, + ["d_m_HostEnum"] = mHostEnum.ToString(), + ["d_m_LaunchFromEnum"] = mLaunchFromEnum.ToString(), + ["d_GetLaunchFromStr"] = getLaunchFromStr, + ["d_GetVersionType"] = getVersionType.ToString(), + ["d_GetLocation"] = getLocation, + ["d_GetLaunchFrom"] = getLaunchFrom, + ["d_version"] = GetVersion(), + ["d_model"] = GetModel(), + ["d_brand"] = GetBrand(), + ["d_language"] = GetLanguage(), + ["d_systemName"] = GetSystemName(), + ["d_platform"] = StarkSDK.API.GetSystemInfo().platform, +#if UNITY_WEBGL + ["d_type"] = "unity_webgl", +#else + ["d_type"] = "native", +#endif + }; + } + + public string GetPlatform() + { + return $"douyin_{StarkSDK.API.GetSystemInfo().platform}"; + } + } +} +#endif \ No newline at end of file diff --git a/Assets/HCMiniSdk/Scripts/WebGL/HCBytedance/HCBytedanceAppInfo.cs.meta b/Assets/HCMiniSdk/Scripts/WebGL/HCBytedance/HCBytedanceAppInfo.cs.meta new file mode 100644 index 00000000..976607de --- /dev/null +++ b/Assets/HCMiniSdk/Scripts/WebGL/HCBytedance/HCBytedanceAppInfo.cs.meta @@ -0,0 +1,3 @@ +fileFormatVersion: 2 +guid: 68b385aac2404dc6b5206744fee8adab +timeCreated: 1701236646 \ No newline at end of file diff --git a/Assets/HCMiniSdk/Scripts/WebGL/HCBytedance/HCBytedanceBase.cs b/Assets/HCMiniSdk/Scripts/WebGL/HCBytedance/HCBytedanceBase.cs new file mode 100644 index 00000000..53732503 --- /dev/null +++ b/Assets/HCMiniSdk/Scripts/WebGL/HCBytedance/HCBytedanceBase.cs @@ -0,0 +1,140 @@ +#if WEBGL_BYTEDANCE +using System; +using System.Collections.Generic; +using System.Linq; +using StarkSDKSpace; + +namespace HC +{ + public class HCBytedanceBase : HCIBase + { + public void Vibrate(int shakeType, float intensity = 1) + { + } + + public void OpenCustomerService(Dictionary param) + { + + + } + + public void ExitApp() + { + StarkSDK.API.ExitApp(); + } + + public bool StartRecord(bool isRecordAudio, int maxRecordTimeSec = 600, Action startCallback = null, Action errorCallback = null, Action timeoutCallback = null) + { + HCDebugger.LogDebug($"[HCBytedanceBase] [StartRecord] isRecordAudio = {isRecordAudio} maxRecordTimeSec = {maxRecordTimeSec}"); + return StarkSDK.API.GetStarkGameRecorder().StartRecord(isRecordAudio, maxRecordTimeSec, () => + { + HCDebugger.LogDebug($"[HCBytedanceBase] [StartRecord] [startCallback]"); + startCallback?.Invoke(); + }, (errCode, errMsg) => + { + HCDebugger.LogDebug($"[HCBytedanceBase] [StartRecord] [startCallback] errCode = {errCode} errMsg = {errMsg}"); + errorCallback?.Invoke(errCode, errMsg); + }, + videoPath => + { + HCDebugger.LogDebug($"[HCBytedanceBase] [StartRecord] [startCallback] videoPath = {videoPath}"); + timeoutCallback?.Invoke(videoPath); + }); + } + + public bool StopRecord(Action completeCallback = null, Action errorCallback = null, List clipRanges = null, bool autoMerge = true) + { + List _clipRanges = null; + + if (clipRanges == null) return StarkSDK.API.GetStarkGameRecorder().StopRecord(videoPath => { completeCallback?.Invoke(videoPath); }, (code, msg) => { errorCallback?.Invoke(code, msg); }, _clipRanges, autoMerge); + _clipRanges = clipRanges.Select(clipRange => new StarkGameRecorder.TimeRange(clipRange.start, clipRange.end)).ToList(); + return StarkSDK.API.GetStarkGameRecorder().StopRecord(videoPath => + { + HCDebugger.LogDebug($"[HCBytedanceBase] [StopRecord] [completeCallback] videoPath : {videoPath}"); + completeCallback?.Invoke(videoPath); + }, (code, msg) => + { + HCDebugger.LogDebug($"[HCBytedanceBase] [StopRecord] [errorCallback] code : {code} msg : msg"); + errorCallback?.Invoke(code, msg); + }, _clipRanges, autoMerge); + } + + public void CheckScene(string scene, Action success, Action complete, Action error) + { + HCDebugger.LogDebug($"[HCBytedanceBase] [CheckScene] scene = {scene}"); + StarkSideBar.SceneEnum _scene; + // 只允许使用 sidebar + if ("sidebar".Equals(scene)) + { + _scene = StarkSideBar.SceneEnum.SideBar; + } + else + { + _scene = StarkSideBar.SceneEnum.SideBar; + } + + StarkSDK.API.GetStarkSideBarManager().CheckScene(_scene, b => + { + HCDebugger.LogDebug($"[HCBytedanceBase] [CheckScene] [success] scene = {scene} b = {b}"); + success?.Invoke(b); + }, () => + { + HCDebugger.LogDebug($"[HCBytedanceBase] [CheckScene] [complete] scene = {scene}"); + complete?.Invoke(); + }, + (errCode, errMsg) => + { + HCDebugger.LogDebug($"[HCBytedanceBase] [CheckScene] [error] scene = {scene} errCode = {errCode} errMsg = {errMsg}"); + error?.Invoke(errCode, errMsg); + }); + } + + public void NavigateToScene(string scene, Action success, Action complete, Action error) + { + HCDebugger.LogDebug($"[HCBytedanceBase] [NavigateToScene] scene = {scene}"); + StarkSideBar.SceneEnum _scene; + // 只允许使用 sidebar + if ("sidebar".Equals(scene)) + { + _scene = StarkSideBar.SceneEnum.SideBar; + } + else + { + _scene = StarkSideBar.SceneEnum.SideBar; + } + + StarkSDK.API.GetStarkSideBarManager().NavigateToScene(_scene, () => + { + HCDebugger.LogDebug($"[HCBytedanceBase] [NavigateToScene] [success] scene = {scene}"); + success?.Invoke(); + }, () => + { + HCDebugger.LogDebug($"[HCBytedanceBase] [NavigateToScene] [complete] scene = {scene}"); + complete?.Invoke(); + }, + (errCode, errMsg) => + { + HCDebugger.LogDebug($"[HCBytedanceBase] [NavigateToScene] [error] scene = {scene} errCode = {errCode} errMsg = {errMsg}"); + error?.Invoke(errCode, errMsg); + }); + } + + public void OnShowWithDict(Action> param) + { + HCDebugger.LogDebug("[HCBytedanceBase] [OnShowWithDict] "); + StarkSDK.API.GetStarkAppLifeCycle().OnShowWithDict += objects => + { + HCDebugger.LogDebug("[HCBytedanceBase] [OnShowWithDict] callback start = "); + + foreach (var objectsKey in objects.Keys) + { + HCDebugger.LogDebug($"[HCBytedanceBase] [OnShowWithDict] callback key = {objectsKey} value = {objects[objectsKey]} "); + } + + HCDebugger.LogDebug("[HCBytedanceBase] [OnShowWithDict] callback end = "); + param?.Invoke(objects); + }; + } + } +} +#endif \ No newline at end of file diff --git a/Assets/HCMiniSdk/Scripts/WebGL/HCBytedance/HCBytedanceBase.cs.meta b/Assets/HCMiniSdk/Scripts/WebGL/HCBytedance/HCBytedanceBase.cs.meta new file mode 100644 index 00000000..e17d6aa2 --- /dev/null +++ b/Assets/HCMiniSdk/Scripts/WebGL/HCBytedance/HCBytedanceBase.cs.meta @@ -0,0 +1,3 @@ +fileFormatVersion: 2 +guid: 66a6d821bbb4442fa430a1fce65e12cb +timeCreated: 1701236701 \ No newline at end of file diff --git a/Assets/HCMiniSdk/Scripts/WebGL/HCBytedance/HCBytedancePurchase.cs b/Assets/HCMiniSdk/Scripts/WebGL/HCBytedance/HCBytedancePurchase.cs new file mode 100644 index 00000000..c93ca064 --- /dev/null +++ b/Assets/HCMiniSdk/Scripts/WebGL/HCBytedance/HCBytedancePurchase.cs @@ -0,0 +1,20 @@ +#if WEBGL_BYTEDANCE +namespace HC +{ + public class HCBytedancePurchase : HCIPurchase + { + public void Init() + { + } + + public void Buy(HCPaymentArgs paymentArgs) + { + } + + public void Awarded(string orderID) + { + + } + } +} +#endif \ No newline at end of file diff --git a/Assets/HCMiniSdk/Scripts/WebGL/HCBytedance/HCBytedancePurchase.cs.meta b/Assets/HCMiniSdk/Scripts/WebGL/HCBytedance/HCBytedancePurchase.cs.meta new file mode 100644 index 00000000..29d599ef --- /dev/null +++ b/Assets/HCMiniSdk/Scripts/WebGL/HCBytedance/HCBytedancePurchase.cs.meta @@ -0,0 +1,3 @@ +fileFormatVersion: 2 +guid: b8c3b61608694c46852fa4e44e78229d +timeCreated: 1701743703 \ No newline at end of file diff --git a/Assets/HCMiniSdk/Scripts/WebGL/HCBytedance/HCBytedanceShare.cs b/Assets/HCMiniSdk/Scripts/WebGL/HCBytedance/HCBytedanceShare.cs new file mode 100644 index 00000000..b7144ffa --- /dev/null +++ b/Assets/HCMiniSdk/Scripts/WebGL/HCBytedance/HCBytedanceShare.cs @@ -0,0 +1,30 @@ +#if WEBGL_BYTEDANCE +using System; +using StarkSDKSpace; +using StarkSDKSpace.UNBridgeLib.LitJson; + +namespace HC +{ + public class HCBytedanceShare : HCIShare + { + public void Share(string title, string imgUrl, string content, Action callback, int type = 0) + { + // 分享的内容 + // https://developer.open-douyin.com/docs/resource/zh-CN/mini-game/develop/api/retweet/share-param/ + var shareJson = new JsonData + { + // ["channel"] = "picture", + ["imageUrl"] = imgUrl, + ["contentTitle"] = title, + ["contentDescription"] = content, + }; + StarkSDK.API.GetStarkShare().ShareAppMessage(data => { callback?.Invoke(true); }, _ => { callback?.Invoke(false); }, () => { callback?.Invoke(false); }, shareJson); + } + + public void DYShare(Action callback, JsonData jsonData) + { + StarkSDK.API.GetStarkShare().ShareAppMessage(data => { callback?.Invoke(true); }, _ => { callback?.Invoke(false); }, () => { callback?.Invoke(false); }, jsonData); + } + } +} +#endif \ No newline at end of file diff --git a/Assets/HCMiniSdk/Scripts/WebGL/HCBytedance/HCBytedanceShare.cs.meta b/Assets/HCMiniSdk/Scripts/WebGL/HCBytedance/HCBytedanceShare.cs.meta new file mode 100644 index 00000000..c88542ff --- /dev/null +++ b/Assets/HCMiniSdk/Scripts/WebGL/HCBytedance/HCBytedanceShare.cs.meta @@ -0,0 +1,3 @@ +fileFormatVersion: 2 +guid: ae04004b626d4f3d9d6d0153ec28a60d +timeCreated: 1701236734 \ No newline at end of file diff --git a/Assets/HCMiniSdk/Scripts/WebGL/HCDefault.meta b/Assets/HCMiniSdk/Scripts/WebGL/HCDefault.meta new file mode 100644 index 00000000..60ff33dd --- /dev/null +++ b/Assets/HCMiniSdk/Scripts/WebGL/HCDefault.meta @@ -0,0 +1,3 @@ +fileFormatVersion: 2 +guid: f76f7debb9454cf6ab24c3d65f23ef8e +timeCreated: 1701225486 \ No newline at end of file diff --git a/Assets/HCMiniSdk/Scripts/WebGL/HCDefault/HCAccount.cs b/Assets/HCMiniSdk/Scripts/WebGL/HCDefault/HCAccount.cs new file mode 100644 index 00000000..80f7eaf6 --- /dev/null +++ b/Assets/HCMiniSdk/Scripts/WebGL/HCDefault/HCAccount.cs @@ -0,0 +1,12 @@ +using System; + +namespace HC +{ + public class HCAccount : HCIAccount + { + public void Login(Action callback) + { + HCDebugger.LogDebug($"[HCAccount] [Login] Editor模式下,暂时不支持登陆. 登陆 : ${callback}"); + } + } +} \ No newline at end of file diff --git a/Assets/HCMiniSdk/Scripts/WebGL/HCDefault/HCAccount.cs.meta b/Assets/HCMiniSdk/Scripts/WebGL/HCDefault/HCAccount.cs.meta new file mode 100644 index 00000000..523a9ec8 --- /dev/null +++ b/Assets/HCMiniSdk/Scripts/WebGL/HCDefault/HCAccount.cs.meta @@ -0,0 +1,3 @@ +fileFormatVersion: 2 +guid: fa0020a26e4d4b8bbf62b6a3de06a7df +timeCreated: 1701225499 \ No newline at end of file diff --git a/Assets/HCMiniSdk/Scripts/WebGL/HCDefault/HCAds.cs b/Assets/HCMiniSdk/Scripts/WebGL/HCDefault/HCAds.cs new file mode 100644 index 00000000..0fa3b26e --- /dev/null +++ b/Assets/HCMiniSdk/Scripts/WebGL/HCDefault/HCAds.cs @@ -0,0 +1,101 @@ +using System; +using System.Collections.Generic; + +namespace HC +{ + public class HCAds : HCIAds + { + private Action> _callback; + + public void InitializeSdk(Action> callback) + { + _callback = callback; + } + + public void RewardedLoad(string adUnitId) + { + HCDebugger.LogDebug($"[HCAds] [RewardedLoad] adUnitId = {adUnitId}"); + _callback?.Invoke(HCADSstatuscallback.RewardedLoadSuccess, adUnitId, 0, "", new Dictionary + { + ["type"] = "callback" + }); + } + + public bool IsRewardedAdReady(string adUnitId) + { + HCDebugger.LogDebug($"[HCAds] [IsRewardedAdReady] adUnitId = {adUnitId}"); + return true; + } + + public void ShowRewardedAd(string adUnitId) + { + HCDebugger.LogDebug($"[HCAds] [ShowRewardedAd] adUnitId = {adUnitId}"); + _callback?.Invoke(HCADSstatuscallback.RewardedShowSuccess, adUnitId, 0, "", null); + } + + public void LoadInterstitial(string adUnitId) + { + HCDebugger.LogDebug($"[HCAds] [LoadInterstitial] adUnitId = {adUnitId}"); + _callback?.Invoke(HCADSstatuscallback.InterstitialLoadSuccess, adUnitId, 0, "", new Dictionary + { + ["type"] = "callback" + }); + } + + public bool IsInterstitialReady(string adUnitId) + { + HCDebugger.LogDebug($"[HCAds] [IsInterstitialReady] adUnitId = {adUnitId}"); + return true; + } + + public void ShowInterstitial(string adUnitId) + { + HCDebugger.LogDebug($"[HCAds] [ShowInterstitial] adUnitId = {adUnitId}"); + _callback?.Invoke(HCADSstatuscallback.InterstitialShowSuccess, adUnitId, 0, "", null); + } + + public void CreateBanner(string adUnitId) + { + HCDebugger.LogDebug($"[HCAds] [CreateBanner] adUnitId = {adUnitId}"); + } + + public void DestroyBanner(string adUnitId) + { + HCDebugger.LogDebug($"[HCAds] [DestroyBanner] adUnitId = {adUnitId}"); + } + + public void ShowBanner(string adUnitId) + { + HCDebugger.LogDebug($"[HCAds] [ShowBanner] adUnitId = {adUnitId}"); + _callback?.Invoke(HCADSstatuscallback.BannerShowSuccess, adUnitId, 0, "", null); + } + + public void HideBanner(string adUnitId) + { + HCDebugger.LogDebug($"[HCAds] [HideBanner] adUnitId = {adUnitId}"); + _callback?.Invoke(HCADSstatuscallback.BannerHideSuccess, adUnitId, 0, "", null); + } + + public void SetLogEnable(bool _enable) + { + } + + public void LoadNative(string adUnitId) + { + HCDebugger.LogDebug($"[HCAds] [HideBanner] adUnitId = {adUnitId}"); + } + + public void RemoveNative(string adUnitId) + { + } + + public bool IsNativeAdReady(string adPosition) + { + return true; + } + + public void ShowNative(string adPosition, float x, float y, float width, float height, string pAdPos, Action _showFailedCallback = null, Action _closeCallback = null) + { + } + } +} \ No newline at end of file diff --git a/Assets/HCMiniSdk/Scripts/WebGL/HCDefault/HCAds.cs.meta b/Assets/HCMiniSdk/Scripts/WebGL/HCDefault/HCAds.cs.meta new file mode 100644 index 00000000..7f690e16 --- /dev/null +++ b/Assets/HCMiniSdk/Scripts/WebGL/HCDefault/HCAds.cs.meta @@ -0,0 +1,3 @@ +fileFormatVersion: 2 +guid: cbb1f1ec469544f0847f63a1f4fa5587 +timeCreated: 1701225517 \ No newline at end of file diff --git a/Assets/HCMiniSdk/Scripts/WebGL/HCDefault/HCAppInfo.cs b/Assets/HCMiniSdk/Scripts/WebGL/HCDefault/HCAppInfo.cs new file mode 100644 index 00000000..88704c1d --- /dev/null +++ b/Assets/HCMiniSdk/Scripts/WebGL/HCDefault/HCAppInfo.cs @@ -0,0 +1,47 @@ +using System.Collections.Generic; + +namespace HC +{ + public class HCAppInfo : HCIAppInfo + { + public string GetBundleID() + { + return "wx31116f3531d60418"; + } + + public string GetVersion() + { + return "1"; + } + + public string GetModel() + { + return "1"; + } + + public string GetBrand() + { + return "1"; + } + + public string GetLanguage() + { + return "zh"; + } + + public string GetSystemName() + { + return "1"; + } + + public Dictionary GetBaseInfo() + { + return new Dictionary(); + } + + public string GetPlatform() + { + return "wechat_android"; + } + } +} \ No newline at end of file diff --git a/Assets/HCMiniSdk/Scripts/WebGL/HCDefault/HCAppInfo.cs.meta b/Assets/HCMiniSdk/Scripts/WebGL/HCDefault/HCAppInfo.cs.meta new file mode 100644 index 00000000..89c1b9f9 --- /dev/null +++ b/Assets/HCMiniSdk/Scripts/WebGL/HCDefault/HCAppInfo.cs.meta @@ -0,0 +1,3 @@ +fileFormatVersion: 2 +guid: c3d35cf790e8402eb54cb037b8e40b9c +timeCreated: 1701227104 \ No newline at end of file diff --git a/Assets/HCMiniSdk/Scripts/WebGL/HCDefault/HCBase.cs b/Assets/HCMiniSdk/Scripts/WebGL/HCDefault/HCBase.cs new file mode 100644 index 00000000..0212587e --- /dev/null +++ b/Assets/HCMiniSdk/Scripts/WebGL/HCDefault/HCBase.cs @@ -0,0 +1,50 @@ +using System; +using System.Collections.Generic; + +namespace HC +{ + public class HCBase : HCIBase + { + public void Vibrate(int shakeType, float intensity = 1) + { + } + + public void OpenCustomerService(Dictionary param) + { + + + } + + public void ExitApp() + { +#if UNITY_EDITOR + UnityEditor.EditorApplication.isPlaying = false; +#else + //Application.Quit(); +#endif + } + + public bool StartRecord(bool isRecordAudio, int maxRecordTimeSec = 600, Action startCallback = null, Action errorCallback = null, Action timeoutCallback = null) + { + return false; + } + + public bool StopRecord(Action completeCallback = null, Action errorCallback = null, List clipRanges = null, bool autoMerge = true) + { + return false; + } + + public void CheckScene(string scene, Action success, Action complete, Action error) + { + } + + public void NavigateToScene(string scene, Action success, Action complete, Action error) + { + } + + + public void OnShowWithDict(Action> param) + { + } + } +} \ No newline at end of file diff --git a/Assets/HCMiniSdk/Scripts/WebGL/HCDefault/HCBase.cs.meta b/Assets/HCMiniSdk/Scripts/WebGL/HCDefault/HCBase.cs.meta new file mode 100644 index 00000000..c146b107 --- /dev/null +++ b/Assets/HCMiniSdk/Scripts/WebGL/HCDefault/HCBase.cs.meta @@ -0,0 +1,3 @@ +fileFormatVersion: 2 +guid: 8f2fafcde76c4e6b849a7197b8bfc597 +timeCreated: 1701227173 \ No newline at end of file diff --git a/Assets/HCMiniSdk/Scripts/WebGL/HCDefault/HCDefaultAnalytics.cs b/Assets/HCMiniSdk/Scripts/WebGL/HCDefault/HCDefaultAnalytics.cs new file mode 100644 index 00000000..548dfbe9 --- /dev/null +++ b/Assets/HCMiniSdk/Scripts/WebGL/HCDefault/HCDefaultAnalytics.cs @@ -0,0 +1,12 @@ +using System.Collections.Generic; + +namespace HC +{ + public class HCDefaultAnalytics : HCIAnalytics + { + public void TrackEvent(string eventName, Dictionary eventDic = null) + { + HCDebugger.LogDebug($"[HCDefaultAnalytics] [TrackEvent] 平台打点: {eventName}"); + } + } +} \ No newline at end of file diff --git a/Assets/HCMiniSdk/Scripts/WebGL/HCDefault/HCDefaultAnalytics.cs.meta b/Assets/HCMiniSdk/Scripts/WebGL/HCDefault/HCDefaultAnalytics.cs.meta new file mode 100644 index 00000000..6bf83560 --- /dev/null +++ b/Assets/HCMiniSdk/Scripts/WebGL/HCDefault/HCDefaultAnalytics.cs.meta @@ -0,0 +1,3 @@ +fileFormatVersion: 2 +guid: ce2b342d681e4571ad3d804ee4ec9f26 +timeCreated: 1701227075 \ No newline at end of file diff --git a/Assets/HCMiniSdk/Scripts/WebGL/HCDefault/HCPurchase.cs b/Assets/HCMiniSdk/Scripts/WebGL/HCDefault/HCPurchase.cs new file mode 100644 index 00000000..d77e21b5 --- /dev/null +++ b/Assets/HCMiniSdk/Scripts/WebGL/HCDefault/HCPurchase.cs @@ -0,0 +1,21 @@ +namespace HC +{ + public class HCPurchase : HCIPurchase + { + public void Init() + { + } + + public void Buy(HCPaymentArgs paymentArgs) + { + HCDebugger.LogDebug($"发起支付: {paymentArgs.productId} {paymentArgs.productName} {paymentArgs.money} {paymentArgs.gameExtraParam} HCSDKManager.Instance.OnPurchaseDone = {HCSDKManager.Instance.OnPurchaseDone}"); + // orderID, productName, productID, purchaseResult, gameExtra + HCSDKManager.Instance.OnPurchaseDone?.Invoke("orderId", paymentArgs.productName, paymentArgs.productId, true, paymentArgs.gameExtraParam, false, ""); + } + + public void Awarded(string orderID) + { + + } + } +} \ No newline at end of file diff --git a/Assets/HCMiniSdk/Scripts/WebGL/HCDefault/HCPurchase.cs.meta b/Assets/HCMiniSdk/Scripts/WebGL/HCDefault/HCPurchase.cs.meta new file mode 100644 index 00000000..90b79275 --- /dev/null +++ b/Assets/HCMiniSdk/Scripts/WebGL/HCDefault/HCPurchase.cs.meta @@ -0,0 +1,3 @@ +fileFormatVersion: 2 +guid: 4a58dc219c6f40bdab84e159b6fcd898 +timeCreated: 1701743662 \ No newline at end of file diff --git a/Assets/HCMiniSdk/Scripts/WebGL/HCDefault/HCShare.cs b/Assets/HCMiniSdk/Scripts/WebGL/HCDefault/HCShare.cs new file mode 100644 index 00000000..e71f5e88 --- /dev/null +++ b/Assets/HCMiniSdk/Scripts/WebGL/HCDefault/HCShare.cs @@ -0,0 +1,19 @@ +using System; + +namespace HC +{ + public class HCShare : HCIShare + { + public void Share(string title, string imgUrl, string content, Action callback, int type = 0) + { + HCDebugger.LogDebug("[HCShare] [Share] 模拟分享"); + callback?.Invoke(true); + } +#if WEBGL_BYTEDANCE + public void DYShare(Action callback, StarkSDKSpace.UNBridgeLib.LitJson.JsonData jsonData) + { + + } +#endif + } +} \ No newline at end of file diff --git a/Assets/HCMiniSdk/Scripts/WebGL/HCDefault/HCShare.cs.meta b/Assets/HCMiniSdk/Scripts/WebGL/HCDefault/HCShare.cs.meta new file mode 100644 index 00000000..cf0cd50d --- /dev/null +++ b/Assets/HCMiniSdk/Scripts/WebGL/HCDefault/HCShare.cs.meta @@ -0,0 +1,3 @@ +fileFormatVersion: 2 +guid: 798cf7f32eca470fa61e026f3d9dcb29 +timeCreated: 1701227157 \ No newline at end of file diff --git a/Assets/HCMiniSdk/Scripts/WebGL/HCSDKManager.cs b/Assets/HCMiniSdk/Scripts/WebGL/HCSDKManager.cs new file mode 100644 index 00000000..549511fb --- /dev/null +++ b/Assets/HCMiniSdk/Scripts/WebGL/HCSDKManager.cs @@ -0,0 +1,171 @@ +using System; +using System.Collections.Generic; +using HC; +using JetBrains.Annotations; + +public partial class HCSDKManager +{ + protected override void OnInstanceCreate() + { + base.OnInstanceCreate(); +#if UNITY_WEBGL || WEBGL_BYTEDANCE + var hcWebGLSdkManager = HCWebGLSDKManager.Instance; +#endif + } + + public void Share(string title, [CanBeNull] string imgUrl = null, [CanBeNull] string content = null, [CanBeNull] Action callback = null, int type = 0) + { +#if UNITY_WEBGL || WEBGL_BYTEDANCE + HCWebGLSDKManager.Share.Share(title, imgUrl, content, callback); +#else + // TODO 暂时不支持 + callback?.Invoke(false); +#endif + } + + public void ExitApp() + { + HCWebGLSDKManager.Base.ExitApp(); + } + + + /// + /// 购买 + /// + /// + public void Buy(HCPaymentArgs paymentArgs) + { + HCAnalyticsManager.Instance.IAPBtnClick(paymentArgs.productName, paymentArgs.gameExtraParam, "CNY", paymentArgs.money, paymentArgs.gameExtraParam); +#if UNITY_WEBGL || WEBGL_BYTEDANCE + HCWebGLSDKManager.Purchase.Buy(paymentArgs); +#endif + } + + /// + /// 奖励下发成功 + /// + /// + public void Awarded(string orderID) + { +#if UNITY_WEBGL || WEBGL_BYTEDANCE + HCWebGLSDKManager.Purchase.Awarded(orderID); +#endif + } + + +#if WEBGL_BYTEDANCE + public void DyShare(Action callback, StarkSDKSpace.UNBridgeLib.LitJson.JsonData jsonData) + { + var json = jsonData.ToJson(); + HCDebugger.LogDebug("分享:" + json); + HCWebGLSDKManager.Share.DYShare(callback, jsonData); + } + + public void DyShareRecordVideo(string title, string[] videoTopicList, Action> callback) + { + HCDebugger.LogDebug($"[DyShareRecordVideo] title = {title} videoTopicList = {videoTopicList}"); + var topics = new List(); + if (videoTopicList != null) + { + topics.AddRange(videoTopicList); + } + + StarkSDKSpace.StarkSDK.API.GetStarkGameRecorder().ShareVideoWithTitleTopics(result => + { + HCDebugger.LogDebug($"[DyShareRecordVideo] [successCallback]"); + callback?.Invoke(true, "success", result); + }, msg => + { + HCDebugger.LogDebug($"[DyShareRecordVideo] [failedCallback] msg = {msg}"); + callback?.Invoke(false, msg, new Dictionary()); + }, () => + { + HCDebugger.LogDebug($"[DyShareRecordVideo] [cancelledCallback]"); + callback?.Invoke(false, "cancelled", new Dictionary()); + }, title, + topics); + } + + public void DyShareVideo(string videoPath, string title, string[] videoTopicList, string[] hashtagList, Action callback) + { + var videoTopics = new StarkSDKSpace.UNBridgeLib.LitJson.JsonData(); + videoTopics.SetJsonType(StarkSDKSpace.UNBridgeLib.LitJson.JsonType.Array); + if (videoTopicList != null) + { + foreach (var s in videoTopicList) + { + videoTopics.Add(s); + } + } + + var hashtags = new StarkSDKSpace.UNBridgeLib.LitJson.JsonData(); + hashtags.SetJsonType(StarkSDKSpace.UNBridgeLib.LitJson.JsonType.Array); + if (hashtagList != null) + { + foreach (var s in hashtagList) + { + hashtags.Add(s); + } + } + + var jsonData = new StarkSDKSpace.UNBridgeLib.LitJson.JsonData + { + ["channel"] = "video", + ["title"] = title, + ["extra"] = new() + { + ["videoPath"] = videoPath, + ["videoTopics"] = videoTopics, + ["hashtag_list"] = hashtags, + }, + }; + DyShare(callback, jsonData); + } + + + /// + /// 开始录屏 + /// 是否录制声音,默认为录制声音 + /// 最大录制时长,单位 s。小于等于 0 则无限制。默认为10分钟 + /// 视频录制开始回调 + /// 视频录制失败回调 + /// + /// 函数调用状态,调用成功返回true,否则返回false + public bool StartRecord(bool isRecordAudio, int maxRecordTimeSec = 600, Action startCallback = null, Action errorCallback = null, Action timeoutCallback = null) + { + return ((HCBytedanceBase)HCWebGLSDKManager.Base).StartRecord(isRecordAudio, maxRecordTimeSec, startCallback, errorCallback, timeoutCallback); + } + + /// + /// 停止录屏 + /// 视频录制完成回调 + /// 视频录制失败回调 + /// 停止后需要对视频进行裁剪的时间片段,如果为null或空列表,则不对视频进行裁剪 + /// 是否对视频裁剪片段进行自动合并。 + /// 合并规则: + /// 如果有两段重叠的时间片段,并且重叠部分小于等于1秒,则对这两段进行合并为一段 + /// 若autoMerge为true,比如时间片段为{[1000, 5000], [4000, 7000]},会被合并为{[1000, 7000]}。 + /// 若autoMerge为false,将按原始传入的时间片段进行裁剪,是否有重叠,由调用方保证。主要用于自定义裁剪。 + /// + /// 函数调用状态,调用成功返回true,否则返回false + public bool StopRecord(Action completeCallback = null, Action errorCallback = null, List clipRanges = null, bool autoMerge = true) + { + return ((HCBytedanceBase)HCWebGLSDKManager.Base).StopRecord(completeCallback, errorCallback, clipRanges, autoMerge); + } + + public void CheckScene(string scene, Action success, Action complete, Action error) + { + ((HCBytedanceBase)HCWebGLSDKManager.Base).CheckScene(scene, success, complete, error); + } + + public void NavigateToScene(string scene, Action success, Action complete, Action error) + { + ((HCBytedanceBase)HCWebGLSDKManager.Base).NavigateToScene(scene, success, complete, error); + } + + public void OnShowWithDict(Action> paramCallback) + { + ((HCBytedanceBase)HCWebGLSDKManager.Base).OnShowWithDict(paramCallback); + } +#endif +} \ No newline at end of file diff --git a/Assets/HCMiniSdk/Scripts/WebGL/HCSDKManager.cs.meta b/Assets/HCMiniSdk/Scripts/WebGL/HCSDKManager.cs.meta new file mode 100644 index 00000000..5386dc8b --- /dev/null +++ b/Assets/HCMiniSdk/Scripts/WebGL/HCSDKManager.cs.meta @@ -0,0 +1,3 @@ +fileFormatVersion: 2 +guid: 144d62fa86384ca7a881a2463bdf6612 +timeCreated: 1699839181 \ No newline at end of file diff --git a/Assets/HCMiniSdk/Scripts/WebGL/HCWX.meta b/Assets/HCMiniSdk/Scripts/WebGL/HCWX.meta new file mode 100644 index 00000000..cc4299ca --- /dev/null +++ b/Assets/HCMiniSdk/Scripts/WebGL/HCWX.meta @@ -0,0 +1,3 @@ +fileFormatVersion: 2 +guid: 00f9b2cf11974591ad900ba27e510886 +timeCreated: 1699349144 \ No newline at end of file diff --git a/Assets/HCMiniSdk/Scripts/WebGL/HCWX/HCSDKManager.cs b/Assets/HCMiniSdk/Scripts/WebGL/HCWX/HCSDKManager.cs new file mode 100644 index 00000000..bb451cd4 --- /dev/null +++ b/Assets/HCMiniSdk/Scripts/WebGL/HCWX/HCSDKManager.cs @@ -0,0 +1,943 @@ +#if WEBGL_WX +using System; +using System.Collections.Generic; +using System.Linq; +using HC; +using HC.MiniJSON; +using HC.Plugins; +using UnityEngine; +using UnityEngine.UI; +using WeChatWASM; + +public class GameClubDataCallback +{ + public int Code; + public string Msg; + public string PlatformMsg; + + /// **type说明** + /// | type取值 | 说明 | subKey | GameClubDataByType.value | + /// | ------- | -------------------------------------- | -------- | -------- | + /// | 1 | 加入该游戏圈时间 | 无需传入 | 秒级Unix时间戳 | + /// | 3 | 用户禁言状态 | 无需传入 | 0:正常 1:禁言 | + /// | 4 | 当天(自然日)点赞贴子数 | 无需传入 | | + /// | 5 | 当天(自然日)评论贴子数 | 无需传入 | | + /// | 6 | 当天(自然日)发表贴子数 | 无需传入 | | + /// | 7 | 当天(自然日)发表视频贴子数 | 无需传入 | | + /// | 8 | 当天(自然日)赞官方贴子数 | 无需传入 | | + /// | 9 | 当天(自然日)评论官方贴子数 | 无需传入 | | + /// | 10 | 当天(自然日)发表到本圈子话题的贴子数 | 传入话题id,从mp-游戏圈话题管理处获取 | | + public Dictionary Data; +} + +public class ShowGameClubCallback +{ + public const int CODE_ERROR = -1; + public const int CODE_SUCCESS = 0; + public const int CODE_CLICK = 1; + public const int CODE_BACK_GAME = 99; + + + public int Code; + public string Msg; + public bool IsClick; +} + +public class WxPrivacyCallback +{ + public int Code; + public string PrivacyContractName; + public bool NeedAuthorization; + public string Msg; +} + +public class WxAuthAuthorizeCallback +{ + public string Msg; + public Dictionary AuthSettingDictionary; + public Dictionary SubscriptionsSettingDictionary; + public Dictionary MiniprogramAuthSettingDictionary; + public bool SubscriptionsSettingMainSwitch = false; +} + +public class WxUserInfo +{ + public const int CODE_AUTH_DENY = -2; + public const int CODE_ERROR = -1; + public const int CODE_SUCCESS = 0; + public const int CODE_NOT_AUTHORIZE_1 = 1; + public const int CODE_NOT_AUTHORIZE_2 = 2; + public int Code; + public string Msg; + public string AvatarUrl { get; set; } + public string City { get; set; } + public string Country { get; set; } + public double Gender { get; set; } + public string Language { get; set; } + public string NickName { get; set; } + public string Province { get; set; } +} + +public class BoxPosition +{ + public readonly int Width; + public readonly int Height; + public readonly int X; + public readonly int Y; + + public BoxPosition(RectTransform pRect, Camera pCam = null, bool isPixelRatio = false) + { + var tWorldCorners = new Vector3[4]; + pRect.GetWorldCorners(tWorldCorners); + var tTopLeft = RectTransformUtility.WorldToScreenPoint(pCam, tWorldCorners[1]); + var tBottomRight = RectTransformUtility.WorldToScreenPoint(pCam, tWorldCorners[3]); + var tWidth = Mathf.Abs(tBottomRight.x - tTopLeft.x); + var tHeight = Mathf.Abs(tBottomRight.y - tTopLeft.y); + + var left = tTopLeft.x; + var top = Screen.height - tTopLeft.y; + + var scaleSize = 1.0; + + if (isPixelRatio) + { + scaleSize = WX.GetSystemInfoSync().pixelRatio; + } + + // 这个地方,wx的js代码会自己除以一个换算比例,所以C#代码这里就不除了。 + // 真实宽度 + Width = (int)(tWidth / scaleSize); + // 真实高度 + Height = (int)(tHeight / scaleSize); + // 真实x + X = (int)(left / scaleSize); + // 真实y + Y = (int)(top / scaleSize); + } +} + + +[System.Serializable] +public class OpenDataMessage +{ + public const string TypeShowFriendsRank = "showFriendsRank"; + public const string TypeSetUserRecord = "setUserRecord"; + public const string TypeShowGroupFriendsRank = "showGroupFriendsRank"; + + // type 用于表明事件类型 + public string type; + + public string scoreKey; + + public int score; +} + +public partial class HCSDKManager +{ + private Dictionary _cacheWxGameClubButton = new(); + + private static Action _ShowGameClubCallback; + + private static Action OnShowListener = _ => + { + _ShowGameClubCallback?.Invoke(new ShowGameClubCallback + { + Code = ShowGameClubCallback.CODE_BACK_GAME, + IsClick = true, + Msg = "回到游戏" + }); + if (OnShowListener != null) + { + WX.OffShow(OnShowListener); + } + }; + + #region 排行榜 + + /// + /// 设置用户排行榜的分数 + /// + /// 记录 + /// 回调【保留】 + /// 排行榜key【保留】 + /// 额外记录【保留】 + public void SetUserRecord(int score, Action callback = null, string key = "hc_score", Dictionary extra = null) + { + HCDebugger.LogDebug($"[ShowFriendsRank] SetUserRecord score {score}"); + // var wxgame = new Dictionary + // { + // ["score"] = score, + // ["update_time"] = HCTimeTools.GetCurrentTimestamp() + // }; + // var value = new Dictionary + // { + // ["wxgame"] = wxgame + // }; + + // if (extra != null) + // { + // foreach (var keyValuePair in extra) + // { + // value.AddIfNotExists(keyValuePair.Key, keyValuePair.Value); + // } + // } + + // var valueString = Json.Serialize(value); + // HCDebugger.LogDebug($"[SetUserRecord] key = {key} value = {value}"); + + // SetUserCloudStorage(new Dictionary + // { + // ["key"] = key, + // ["value"] = valueString + // }, callback); + + var openDataMessage = new OpenDataMessage() + { + type = OpenDataMessage.TypeSetUserRecord, + // scoreKey = key, + score = score + }; + WXBase.GetOpenDataContext().PostMessage(JsonUtility.ToJson(openDataMessage)); + } + + /// + /// 检查权限 + /// + /// + public void CheckWxFriendInteraction(Action callback) + { + HCDebugger.LogDebug("[ShowFriendsRank] CheckWxFriendInteraction"); +#if UNITY_EDITOR + if (HCTools.GetPlayerPrefsInt("CheckWxFriendInteraction") == 0) + { + HCTools.SavePlayerPrefsInt("CheckWxFriendInteraction", 1); + callback.Invoke(false); + } + else + { + callback.Invoke(true); + } + + return; +#endif + GetSetting(result => { callback.Invoke(result.AuthSettingDictionary.TryGetValue("scope.WxFriendInteraction", out var isHave) && isHave); }); + } + + /// + /// 申请权限 + /// + /// + public void ApplyForWxFriendInteraction(Action callback) + { + HCDebugger.LogDebug("[ShowFriendsRank] ApplyForWxFriendInteraction"); +#if UNITY_EDITOR + callback.Invoke(true); + return; +#endif + RequestAuthorize("scope.WxFriendInteraction", callback); + } + + /// + /// 显示排行榜 + /// + /// 挂载点 + /// 回调 主要用于显示失败,没有权限的时候,游戏处理逻辑 + /// 相机 + /// 排行榜key【保留】 + public void ShowFriendsRankAndRequestAuthorize(GameObject gameObject, Action callback = null, Camera pCam = null, string key = "hc_score") + { + CheckWxFriendInteraction(result => + { + if (result) + { + FriendsRank(); + } + else + { + ApplyForWxFriendInteraction(applyResult => + { + if (applyResult) + { + FriendsRank(); + } + else + { + callback?.Invoke(-1, "no permission"); + } + }); + } + }); + return; + + void FriendsRank() + { + ShowFriendsRank(gameObject, pCam, key); + callback?.Invoke(0, "success"); + } + } + + public void ShowFriendsRank(GameObject gameObject, Camera pCam = null, string key = "hc_score") + { + HCDebugger.LogDebug($"[ShowFriendsRank] show open data start key = {key}"); + const string prefabName = "Prefabs/hc_FriendsRank"; + + RawImage rawImage = null; + + var tempComponent = gameObject.GetComponent(); + if (tempComponent != null) + { + rawImage = tempComponent; + } + + var target = gameObject.transform.Find(prefabName.Replace("/", "_")); + + if (rawImage == null) + { + if (target == null) + { + var loadedPrefab = Resources.Load(prefabName) as GameObject; + if (loadedPrefab == null) return; + // 实例化加载的Prefab + var instantiatedPrefab = Instantiate(loadedPrefab, gameObject.transform, true); + // 设置实例化后的Prefab的名称为自定义名称 + instantiatedPrefab.name = prefabName.Replace("/", "_"); + // 设置实例化后的Prefab的位置 + // 获取实例化后的Prefab的RectTransform组件 + var rectTransform = instantiatedPrefab.GetComponent(); + // 将边距设置为0 + rectTransform.offsetMin = Vector2.zero; + rectTransform.offsetMax = Vector2.zero; + instantiatedPrefab.transform.localScale = Vector3.one; + rawImage = instantiatedPrefab.GetComponent(); + } + else + { + rawImage = target.GetComponent(); + } + } + + if (rawImage == null) + { + HCDebugger.LogError("排行榜 - 获取RawImage异常"); + return; + } + + var pRect = gameObject.GetComponent(); + if (pRect == null) + { + HCDebugger.LogError("排行榜 - 获取盒子位置信息失败"); + return; + } + +#if UNITY_EDITOR + if (!ColorUtility.TryParseHtmlString("#FF0000", out var color)) return; + rawImage.texture = null; + rawImage.color = color; + return; +#endif + var boxPosition = new BoxPosition(pRect, pCam); + HCDebugger.LogDebug($"[ShowFriendsRank] show open data {boxPosition.X} {boxPosition.Y} {boxPosition.Width} {boxPosition.Height}"); + + var openDataMessage = new OpenDataMessage() + { + type = OpenDataMessage.TypeShowFriendsRank, + scoreKey = key + }; + + WXBase.ShowOpenData(rawImage.texture, boxPosition.X, boxPosition.Y, boxPosition.Width, boxPosition.Height); + HCDebugger.LogDebug($"[ShowFriendsRank] show open data {JsonUtility.ToJson(openDataMessage)}"); + WXBase.GetOpenDataContext().PostMessage(JsonUtility.ToJson(openDataMessage)); + } + + public void CloseFriendsRank() + { + HCDebugger.LogDebug("[ShowFriendsRank] CloseFriendsRank"); +#if UNITY_EDITOR + return; +#endif + WXBase.HideOpenData(); + } + + #endregion + + + /// + /// 获取当前设置的权限 + /// + /// 回调内容 + /// 是否同时获取用户订阅消息的订阅状态,默认不获取。 + public void GetSetting(Action callback, bool withSubscriptions = false) + { + WX.GetSetting(new GetSettingOption + { + withSubscriptions = withSubscriptions, + success = result => + { + var errMsg = result.errMsg; + var authSetting = result.authSetting; + var subscriptionsSetting = result.subscriptionsSetting; + var miniprogramAuthSetting = result.miniprogramAuthSetting; + var authSettingDictionary = new Dictionary(); + var subscriptionsSettingDictionary = new Dictionary(); + var miniprogramAuthSettingDictionary = new Dictionary(); + + if (authSetting != null) + { + foreach (var keyValuePair in authSetting) + { + authSettingDictionary.Add(keyValuePair.Key, keyValuePair.Value); + } + } + + var subscriptionsSettingMainSwitch = false; + if (subscriptionsSetting is { itemSettings: not null }) + { + subscriptionsSettingMainSwitch = subscriptionsSetting.mainSwitch; + + foreach (var keyValuePair in subscriptionsSetting.itemSettings) + { + subscriptionsSettingDictionary.Add(keyValuePair.Key, keyValuePair.Value); + } + } + + if (miniprogramAuthSetting != null) + { + foreach (var keyValuePair in miniprogramAuthSetting) + { + miniprogramAuthSettingDictionary.Add(keyValuePair.Key, keyValuePair.Value); + } + } + + callback.Invoke(new WxAuthAuthorizeCallback + { + Msg = errMsg, + AuthSettingDictionary = authSettingDictionary, + SubscriptionsSettingDictionary = subscriptionsSettingDictionary, + MiniprogramAuthSettingDictionary = miniprogramAuthSettingDictionary, + SubscriptionsSettingMainSwitch = subscriptionsSettingMainSwitch + }); + }, + fail = result => + { + callback.Invoke(new WxAuthAuthorizeCallback + { + Msg = result.errMsg, + AuthSettingDictionary = new Dictionary(), + SubscriptionsSettingDictionary = new Dictionary(), + MiniprogramAuthSettingDictionary = new Dictionary() + }); + }, + }); + } + + + public void SetUserCloudStorage(Dictionary saveData, Action callback) + { + var kvDataList = saveData.Select(kv => new KVData { key = kv.Key, value = kv.Value }).ToArray(); + + WX.SetUserCloudStorage(new SetUserCloudStorageOption + { + KVDataList = kvDataList, + success = result => { callback?.Invoke(true, result.errMsg); }, + fail = result => + { + HCDebugger.LogError($"[SetUserCloudStorage] error msg = {result.errMsg}"); + callback?.Invoke(false, result.errMsg); + } + }); + } + + + public void RequestAuthorize(string scope, Action callback) + { + WX.Authorize(new AuthorizeOption + { + scope = scope, + success = _ => { callback.Invoke(true); }, + fail = result => + { + HCDebugger.LogError($"[RequestAuthorize] fail = {result.errMsg}"); + callback.Invoke(false); + } + }); + } + + /// + /// 打开设置权限 + /// + /// 设置权限内容 + /// 是否同时获取用户订阅消息的订阅状态,默认不获取。 + public void OpenSetting(Action callback, bool withSubscriptions = false) + { + WX.OpenSetting(new OpenSettingOption + { + withSubscriptions = withSubscriptions, + fail = result => + { + callback.Invoke(new WxAuthAuthorizeCallback + { + Msg = result.errMsg, + AuthSettingDictionary = new Dictionary(), + SubscriptionsSettingDictionary = new Dictionary(), + MiniprogramAuthSettingDictionary = new Dictionary() + }); + }, + success = result => + { + var errMsg = result.errMsg; + var authSetting = result.authSetting; + var subscriptionsSetting = result.subscriptionsSetting; + var authSettingDictionary = new Dictionary(); + var subscriptionsSettingDictionary = new Dictionary(); + var miniprogramAuthSettingDictionary = new Dictionary(); + + if (authSetting != null) + { + foreach (var keyValuePair in authSetting) + { + authSettingDictionary.Add(keyValuePair.Key, keyValuePair.Value); + } + } + + var subscriptionsSettingMainSwitch = false; + if (subscriptionsSetting is { itemSettings: not null }) + { + subscriptionsSettingMainSwitch = subscriptionsSetting.mainSwitch; + + foreach (var keyValuePair in subscriptionsSetting.itemSettings) + { + subscriptionsSettingDictionary.Add(keyValuePair.Key, keyValuePair.Value); + } + } + + callback.Invoke(new WxAuthAuthorizeCallback + { + Msg = errMsg, + AuthSettingDictionary = authSettingDictionary, + SubscriptionsSettingDictionary = subscriptionsSettingDictionary, + MiniprogramAuthSettingDictionary = miniprogramAuthSettingDictionary, + SubscriptionsSettingMainSwitch = subscriptionsSettingMainSwitch + }); + } + }); + } + + public void GetUserInfo(Action callback) + { + GetSetting(result => + { + if (result.AuthSettingDictionary.TryGetValue("scope.userInfo", out var hasAuthorize)) + { + if (hasAuthorize) + { + WX.GetUserInfo(new GetUserInfoOption + { + success = result => + { + var errMsg = result.errMsg; + var userInfo = result.userInfo; + var userInfoAvatarUrl = userInfo.avatarUrl; + var userInfoCity = userInfo.city; + var userInfoCountry = userInfo.country; + var userInfoGender = userInfo.gender; + var userInfoLanguage = userInfo.language; + var userInfoNickName = userInfo.nickName; + var userInfoProvince = userInfo.province; + callback.Invoke(new WxUserInfo + { + Code = WxUserInfo.CODE_SUCCESS, + Msg = result.errMsg, + AvatarUrl = userInfoAvatarUrl, + City = userInfoCity, + Country = userInfoCountry, + Gender = userInfoGender, + Language = userInfoLanguage, + NickName = userInfoNickName, + Province = userInfoProvince, + }); + }, + fail = result => + { + callback.Invoke(new WxUserInfo + { + Code = WxUserInfo.CODE_ERROR, + Msg = result.errMsg + }); + }, + complete = result => + { + var errMsg = result.errMsg; + } + }); + } + else + { + callback.Invoke(new WxUserInfo + { + Code = WxUserInfo.CODE_NOT_AUTHORIZE_2, + Msg = result.Msg + }); + } + } + else + { + callback.Invoke(new WxUserInfo + { + Code = WxUserInfo.CODE_NOT_AUTHORIZE_1, + Msg = result.Msg + }); + } + }); + } + + WXUserInfoButton _wxUserInfoButton; + + public void CreateUserInfoButton(RectTransform pRect, Action callback, Camera pCam = null, string lang = "zh_CN", bool withCredentials = false) + { + var boxPosition = new BoxPosition(pRect, pCam); + + _wxUserInfoButton = WXBase.CreateUserInfoButton(boxPosition.X, boxPosition.Y, boxPosition.Width, boxPosition.Height, lang, withCredentials); + _wxUserInfoButton.OnTap(result => + { + if (result.errCode != 0) + { + callback.Invoke(new WxUserInfo + { + Code = WxUserInfo.CODE_AUTH_DENY, + Msg = result.errMsg, + AvatarUrl = "", + City = "", + Country = "", + Gender = 0, + Language = "", + NickName = "", + Province = "", + }); + return; + } + + var errMsg = result.errMsg; + var userInfo = result.userInfo; + var userInfoAvatarUrl = userInfo.avatarUrl; + var userInfoCity = userInfo.city; + var userInfoCountry = userInfo.country; + var userInfoGender = userInfo.gender; + var userInfoLanguage = userInfo.language; + var userInfoNickName = userInfo.nickName; + var userInfoProvince = userInfo.province; + var wxUserInfo = new WxUserInfo + { + Code = WxUserInfo.CODE_SUCCESS, + Msg = result.errMsg, + AvatarUrl = userInfoAvatarUrl, + City = userInfoCity, + Country = userInfoCountry, + Gender = userInfoGender, + Language = userInfoLanguage, + NickName = userInfoNickName, + Province = userInfoProvince, + }; + var hciBaseAnalytics = HCAnalyticsManager.Instance.GetAnalyticsPlugin(TrackEventPlatform.TD); + ((HCTDAnalyticsWebGL)hciBaseAnalytics)?.TrackWxUserInfo(wxUserInfo); + + callback.Invoke(wxUserInfo); + }); + _wxUserInfoButton.Show(); + } + + public void CloseUserInfoButton() + { + _wxUserInfoButton?.Hide(); + _wxUserInfoButton?.Destroy(); + _wxUserInfoButton = null; + } + + public void GetWxPrivacySetting(Action callback) + { + WX.GetPrivacySetting(new GetPrivacySettingOption + { + success = result => + { + var resultPrivacyContractName = result.privacyContractName; + var resultNeedAuthorization = result.needAuthorization; + var errMsg = result.errMsg; + callback?.Invoke(new WxPrivacyCallback + { + Code = 0, + Msg = errMsg, + NeedAuthorization = resultNeedAuthorization, + PrivacyContractName = resultPrivacyContractName, + }); + }, + fail = result => + { + var errMsg = result.errMsg; + callback?.Invoke(new WxPrivacyCallback + { + Code = -1, + Msg = errMsg + }); + }, + complete = result => + { + var errMsg = result.errMsg; + } + }); + } + + /// + /// + /// + /// 按钮的url + /// 显示位置 + /// + /// + /// + /// 显示/点击回调 + public void ShowGameClubButton(string buttonImageUrl, RectTransform pRect, Camera pCam = null, string openlink = null, bool? hasRedDot = null, Action callback = null) + { +#if UNITY_EDITOR + callback?.Invoke(new ShowGameClubCallback + { + Code = ShowGameClubCallback.CODE_SUCCESS, + IsClick = false + }); + return; +#endif + if (_cacheWxGameClubButton.ContainsKey(pRect)) + { + HCDebugger.LogError("游戏圈子Icon正在显示"); + callback?.Invoke(new ShowGameClubCallback + { + Code = ShowGameClubCallback.CODE_ERROR, + Msg = "游戏圈子Icon正在显示" + }); + return; + } + + var tWorldCorners = new Vector3[4]; + pRect.GetWorldCorners(tWorldCorners); + var tTopLeft = RectTransformUtility.WorldToScreenPoint(pCam, tWorldCorners[1]); + var tBottomRight = RectTransformUtility.WorldToScreenPoint(pCam, tWorldCorners[3]); + var tWidth = Mathf.Abs(tBottomRight.x - tTopLeft.x); + var tHeight = Mathf.Abs(tBottomRight.y - tTopLeft.y); + + var left = tTopLeft.x; + var top = Screen.height - tTopLeft.y; + + // 0.5 + var scaleSize = WX.GetSystemInfoSync().pixelRatio; + // 真实宽度 + var width = (int)(tWidth / scaleSize); + // 真实高度 + var height = (int)(tHeight / scaleSize); + // 真实x + var x = (int)(left / scaleSize); + // 真实y + var y = (int)(top / scaleSize); + + var gameClubButton = WXBase.CreateGameClubButton(new WXCreateGameClubButtonParam + { + type = GameClubButtonType.image, + image = buttonImageUrl, + style = new GameClubButtonStyle + { + left = x, + top = y, + width = width, + height = height, + }, + openlink = openlink, + hasRedDot = hasRedDot + }); + callback?.Invoke(new ShowGameClubCallback + { + Code = ShowGameClubCallback.CODE_SUCCESS, + Msg = "show success" + }); + gameClubButton.OnTap(() => + { + callback?.Invoke(new ShowGameClubCallback + { + Code = ShowGameClubCallback.CODE_CLICK, + Msg = "click success", + IsClick = true + }); + + _ShowGameClubCallback = callback; + WX.OnShow(OnShowListener); + }); + _cacheWxGameClubButton.Add(pRect, gameClubButton); + } + + /// + /// 关闭指定位置的button,如果不传,关闭所有button + /// 要和传入的是同一个对象 + /// + /// + public void CloseGameClubButton(RectTransform pRect = null) + { + if (pRect == null) + { + foreach (var wxGameClubButton in _cacheWxGameClubButton.Values) + { + wxGameClubButton?.Hide(); + wxGameClubButton?.OffTap(); + wxGameClubButton?.Destroy(); + } + + _cacheWxGameClubButton.Clear(); + } + else + { + if (_cacheWxGameClubButton.TryGetValue(pRect, out var button)) + { + button?.Hide(); + button?.OffTap(); + button?.Destroy(); + _cacheWxGameClubButton.Remove(pRect); + } + else + { + HCDebugger.LogError($"传入的RectTransform 不存在 {pRect}"); + } + } + } + + public void GetGameClubData(Action call = null, string sessionId = "") + { + var list = new List + { + new() { type = 1 }, + new() { type = 3 }, + new() { type = 4 }, + new() { type = 5 }, + new() { type = 6 }, + new() { type = 7 }, + new() { type = 8 }, + new() { type = 9 } + }; + if (!string.IsNullOrEmpty(sessionId)) + { + list.Add(new DataType { type = 10, subKey = sessionId }); + } + + var dataTypeList = list.ToArray(); + + + WX.RequirePrivacyAuthorize(new RequirePrivacyAuthorizeOption + { + complete = result => { HCDebugger.LogDebug($"[RequirePrivacyAuthorize] [complete] errMsg = {result.errMsg}"); }, + fail = result => + { + call?.Invoke(new GameClubDataCallback + { + Code = -1, + Msg = "RequirePrivacyAuthorize fail", + PlatformMsg = result.errMsg, + Data = new Dictionary() + }); + HCDebugger.LogDebug($"[RequirePrivacyAuthorize] [fail] errMsg = {result.errMsg}"); + }, + success = result => + { + HCDebugger.LogDebug($"[RequirePrivacyAuthorize] [success] errMsg = {result.errMsg}"); + WX.GetGameClubData(new GetGameClubDataOption + { + dataTypeList = dataTypeList, + complete = generalCallbackResult => + { + var errMsg = generalCallbackResult.errMsg; + HCDebugger.LogDebug($"[GetGameClubData] [complete] errMsg = {errMsg}"); + }, + fail = generalCallbackResult => + { + var errMsg = generalCallbackResult.errMsg; + call?.Invoke(new GameClubDataCallback + { + Code = -2, + Msg = "GetGameClubData fail", + PlatformMsg = errMsg, + Data = new Dictionary() + }); + HCDebugger.LogDebug($"[GetGameClubData] [fail] errMsg = {errMsg}"); + }, + success = getGameClubDataSuccessCallbackResult => + { + var errMsg = getGameClubDataSuccessCallbackResult.errMsg; + var signature = getGameClubDataSuccessCallbackResult.signature; + var iv = getGameClubDataSuccessCallbackResult.iv; + var encryptedData = getGameClubDataSuccessCallbackResult.encryptedData; + var cloudID = getGameClubDataSuccessCallbackResult.cloudID; + HCDebugger.LogDebug($"[GetGameClubData] [success] errMsg = {errMsg} signature = {signature} iv = {iv} encryptedData = {encryptedData}"); + // 需要传递给川哥解析 + + if (string.IsNullOrEmpty(iv) || string.IsNullOrEmpty(signature) || string.IsNullOrEmpty(encryptedData)) + { + call?.Invoke(new GameClubDataCallback + { + Code = -3, + Msg = "GameClubData is Null", + PlatformMsg = errMsg, + Data = new Dictionary() + }); + return; + } + + HCServer.Instance.WxDataDecrypt(iv, encryptedData, signature, (code, msg, result) => + { + if (code == 0) + { + try + { + var resultContent = result.content; + var contentData = (Dictionary)Json.Deserialize(resultContent); + var watermark = contentData["watermark"]; + var dataList = (List)contentData["dataList"]; + var resultData = new Dictionary(); + foreach (Dictionary item in dataList) + { + var dataType = (Dictionary)item["dataType"]; + var type = dataType["type"]; + var value = item["value"]; + resultData.Add(int.Parse("" + type), value); + } + + call?.Invoke(new GameClubDataCallback + { + Code = 0, + Msg = "success", + PlatformMsg = msg, + Data = resultData + }); + } + catch (Exception e) + { + call?.Invoke(new GameClubDataCallback + { + Code = -4, + Msg = "Server Data Exception", + PlatformMsg = e.Message, + Data = new Dictionary() + }); + } + } + else + { + call?.Invoke(new GameClubDataCallback + { + Code = code, + Msg = "Server Fail", + PlatformMsg = msg, + Data = new Dictionary() + }); + } + }); + }, + }); + } + }); + } +} + +#endif \ No newline at end of file diff --git a/Assets/HCMiniSdk/Scripts/WebGL/HCWX/HCSDKManager.cs.meta b/Assets/HCMiniSdk/Scripts/WebGL/HCWX/HCSDKManager.cs.meta new file mode 100644 index 00000000..657a8869 --- /dev/null +++ b/Assets/HCMiniSdk/Scripts/WebGL/HCWX/HCSDKManager.cs.meta @@ -0,0 +1,3 @@ +fileFormatVersion: 2 +guid: b6fb4f2ca89645eaa5d85c9e12498129 +timeCreated: 1708407377 \ No newline at end of file diff --git a/Assets/HCMiniSdk/Scripts/WebGL/HCWX/HCWXAccount.cs b/Assets/HCMiniSdk/Scripts/WebGL/HCWX/HCWXAccount.cs new file mode 100644 index 00000000..0b3a7d1f --- /dev/null +++ b/Assets/HCMiniSdk/Scripts/WebGL/HCWX/HCWXAccount.cs @@ -0,0 +1,45 @@ +#if UNITY_WEBGL && WEBGL_WX + +using System; +using System.Collections.Generic; +using WeChatWASM; + +namespace HC +{ + public class HCWXAccount : HCIAccount + { + public void Login(Action action) + { + HCDebugger.LogDebug("[HCWXAccount] [Login] Start"); + WX.Login(new LoginOption + { + complete = generalCallbackResult => { HCDebugger.LogDebug($"[HCWXAccount] [Login] complete {generalCallbackResult.errMsg}"); }, + fail = err => + { + HCDebugger.LogDebug($"[HCWXAccount] [Login] fail {err.errMsg} {err.errno}"); + action?.Invoke(new HCLoginResult + { + code = -1, + msg = err.errMsg + }); + }, + success = result => + { + // 用户登录凭证(有效期五分钟)。开发者需要在开发者服务器后台调用 code2Session,使用 code 换取 openid、unionid、session_key 等信息 + var resultCode = result.code; + var resultErrMsg = result.errMsg; + HCDebugger.LogDebug($"[HCWXAccount] [Login] success result code = {resultCode} result err msg = {resultErrMsg}"); + action?.Invoke(new HCLoginResult() + { + code = 0, + token = resultCode, + userId = resultCode, + ext = new Dictionary() + }); + }, + }); + + } + } +} +#endif \ No newline at end of file diff --git a/Assets/HCMiniSdk/Scripts/WebGL/HCWX/HCWXAccount.cs.meta b/Assets/HCMiniSdk/Scripts/WebGL/HCWX/HCWXAccount.cs.meta new file mode 100644 index 00000000..ebebe1dd --- /dev/null +++ b/Assets/HCMiniSdk/Scripts/WebGL/HCWX/HCWXAccount.cs.meta @@ -0,0 +1,3 @@ +fileFormatVersion: 2 +guid: 22008261909049f1ab054eb29a2577f3 +timeCreated: 1699347646 \ No newline at end of file diff --git a/Assets/HCMiniSdk/Scripts/WebGL/HCWX/HCWXAds.cs b/Assets/HCMiniSdk/Scripts/WebGL/HCWX/HCWXAds.cs new file mode 100644 index 00000000..0872d586 --- /dev/null +++ b/Assets/HCMiniSdk/Scripts/WebGL/HCWX/HCWXAds.cs @@ -0,0 +1,995 @@ +#if UNITY_WEBGL && WEBGL_WX +using System; +using System.Collections.Generic; +using System.Linq; +using UnityEngine; +using WeChatWASM; +using SystemInfo = WeChatWASM.SystemInfo; + +namespace HC +{ + public class HCWXAds : HCSingleton, HCIAds + { + private SystemInfo _sysInfo; + private Action> _callback; + + public void InitializeSdk(Action> callback) + { + _callback = callback; + HCWxTools.Instance.WxCallUnityAction += WxCallUnity; + } + + #region Rewarded + + private readonly Dictionary _rewardedDictionary = new Dictionary(); + private readonly Dictionary _rewardedStatus = new Dictionary(); + + + public void RewardedLoad(string adUnitId) + { + WXRewardedVideoAd wxRewardedVideoAd = null; + + if (_rewardedDictionary.TryGetValue(adUnitId, out var value)) + { + wxRewardedVideoAd = value; + HCDebugger.LogDebug($"[ADManager] [InitRewardAd] adUnitId = {adUnitId} - 2"); + } + + if (wxRewardedVideoAd == null) + { + HCDebugger.LogDebug($"[ADManager] [InitRewardAd] adUnitId = {adUnitId} - 1"); + wxRewardedVideoAd = WXBase.CreateRewardedVideoAd(new WXCreateRewardedVideoAdParam + { + adUnitId = adUnitId + }); + + _rewardedDictionary[adUnitId] = wxRewardedVideoAd; + + wxRewardedVideoAd.OnLoad(loadResponse => + { + HCDebugger.LogDebug("[ADManager] [InitRewardAd] [OnLoad] RV Onload succ, rewardValue : " + loadResponse.rewardValue + + " , shareValue : " + + loadResponse.shareValue + " , errorMsg : " + loadResponse.errMsg); + _rewardedStatus[adUnitId] = true; + _callback?.Invoke(HCADSstatuscallback.RewardedLoadSuccess, adUnitId, 0, "", new Dictionary + { + ["type"] = "callback" + }); + }); + + wxRewardedVideoAd.OnClose(res => + { + HCDebugger.LogDebug($"[ADManager] [InitRewardAd] [OnClose] res is ended = {res.isEnded}"); + _callback?.Invoke(HCADSstatuscallback.RewardedClose, adUnitId, 0, res.errMsg, new Dictionary + { + ["isEnded"] = res.isEnded + }); + }); + wxRewardedVideoAd.OnError(error => + { + HCDebugger.LogDebug("[ADManager] [InitRewardAd] [OnError] RV OnError, errorCode : " + error.errCode + + " , errorMsg : " + error.errMsg); + _rewardedStatus[adUnitId] = false; + + _callback?.Invoke(HCADSstatuscallback.RewardedLoadFailed, adUnitId, error.errCode, error.errMsg, new Dictionary + { + ["type"] = "callback" + }); + }); + } + + + wxRewardedVideoAd.Load(success => + { + HCDebugger.LogDebug($"[ADManager] [InitRewardAd] [OnLoad] RV [load] succ, rewardValue : success {success.errMsg} {success.errCode}"); + // _rewardedStatus[adUnitId] = true; + // _callback?.Invoke(HCADSstatuscallback.RewardedLoadSuccess, adUnitId, 0, "", new Dictionary + // { + // ["type"] = "load" + // }); + }, error => + { + _rewardedStatus[adUnitId] = false; + _callback?.Invoke(HCADSstatuscallback.RewardedLoadFailed, adUnitId, error.errCode, error.errMsg, new Dictionary + { + ["type"] = "load" + }); + }); + } + + public bool IsRewardedAdReady(string adUnitId) + { + return _rewardedStatus.TryGetValue(adUnitId, out var status) && status; + } + + public void ShowRewardedAd(string adUnitId) + { + if (_rewardedDictionary.TryGetValue(adUnitId, out var wxRewardedVideoAd)) + { + wxRewardedVideoAd.Show(response => + { + HCDebugger.LogDebug($"[ADManager] [ShowRewardedAd] response success : {response.errCode} {response.errMsg}"); + + _callback?.Invoke(HCADSstatuscallback.RewardedShowSuccess, adUnitId, response.errCode, response.errMsg, null); + }, + failed => + { + HCDebugger.LogDebug($"[ADManager] [ShowRewardedAd] response failed : {failed.errCode} {failed.errMsg}"); + + _callback?.Invoke(HCADSstatuscallback.RewardedShowFailed, adUnitId, failed.errCode, failed.errMsg, null); + }); + } + else + { + _callback?.Invoke(HCADSstatuscallback.RewardedShowFailed, adUnitId, -99, "adUnitId does not exist", null); + } + } + + #endregion + + private readonly Dictionary _interstitialDictionary = new Dictionary(); + private readonly Dictionary _interstitialStatus = new Dictionary(); + + + public void LoadInterstitial(string adUnitId) + { + WXInterstitialAd interstitialAd = null; + if (_interstitialDictionary.TryGetValue(adUnitId, out var temp)) + { + interstitialAd = temp; + } + + + if (interstitialAd == null) + { + interstitialAd = WXBase.CreateInterstitialAd(new WXCreateInterstitialAdParam() + { + adUnitId = adUnitId + }); + _interstitialDictionary[adUnitId] = interstitialAd; + + interstitialAd.OnLoad(loadResponse => + { + HCDebugger.LogDebug("[ADManager] [InitInterstitialAd] iv OnLoad, IsIVReady = true, _rewardValue: " + + loadResponse.rewardValue + + " , _shareValue : " + loadResponse.shareValue + " , msg : " + loadResponse.errMsg); + _interstitialStatus[adUnitId] = true; + + _callback?.Invoke(HCADSstatuscallback.InterstitialLoadSuccess, adUnitId, 0, loadResponse.errMsg, new Dictionary + { + ["type"] = "callback" + }); + }); + interstitialAd.OnError(errorResponse => + { + HCDebugger.LogDebug("[ADManager] [InitInterstitialAd] iv onError, IsIVReady = false, errorCode: " + + errorResponse.errCode + " , errorMsg : " + + errorResponse.errMsg); + _interstitialStatus[adUnitId] = false; + _callback?.Invoke(HCADSstatuscallback.InterstitialLoadFailed, adUnitId, errorResponse.errCode, errorResponse.errMsg, new Dictionary + { + ["type"] = "callback" + }); + }); + interstitialAd.OnClose(() => + { + HCDebugger.LogDebug("[ADManager] [InitInterstitialAd] OnClose"); + + _callback?.Invoke(HCADSstatuscallback.InterstitialClose, adUnitId, 0, "", new Dictionary + { + ["type"] = "callback" + }); + }); + } + + interstitialAd.Load(loadResponse => + { + HCDebugger.LogDebug($"[ADManager] [InterstitialLoad] loadResponse success = {loadResponse.errMsg} {loadResponse.errCode}"); + // _interstitialStatus[adUnitId] = true; + // _callback?.Invoke(HCADSstatuscallback.InterstitialLoadSuccess, adUnitId, loadResponse.errCode, loadResponse.errMsg, new Dictionary + // { + // ["type"] = "load" + // }); + }, + failed => + { + HCDebugger.LogDebug($"[ADManager] [InterstitialLoad] loadResponse failed = {failed.errMsg} {failed.errCode}"); + _interstitialStatus[adUnitId] = false; + _callback?.Invoke(HCADSstatuscallback.InterstitialLoadFailed, adUnitId, failed.errCode, failed.errMsg, new Dictionary + { + ["type"] = "load" + }); + }); + } + + + public bool IsInterstitialReady(string adUnitId) + { + return _interstitialStatus.TryGetValue(adUnitId, out var status) && status; + } + + public void ShowInterstitial(string adUnitId) + { + HCDebugger.LogDebug($"[ADManager] [ShowInterstitial] ShowInterstitial - 1 adUnitId : {adUnitId} "); + if (_interstitialDictionary.TryGetValue(adUnitId, out var interstitialAd)) + { + HCDebugger.LogDebug($"[ADManager] [ShowInterstitial] ShowInterstitial - 2 adUnitId : {adUnitId} interstitialAd = {interstitialAd}"); + interstitialAd.Show(response => + { + HCDebugger.LogDebug($"[ADManager] [ShowInterstitial] response success : {response.errCode} {response.errMsg} _callback = {_callback}"); + + _callback?.Invoke(HCADSstatuscallback.InterstitialShowSuccess, adUnitId, response.errCode, response.errMsg, null); + }, + failed => + { + HCDebugger.LogDebug($"[ADManager] [ShowInterstitial] response failed : {failed.errCode} {failed.errMsg} _callback = {_callback}"); + + _callback?.Invoke(HCADSstatuscallback.InterstitialShowFailed, adUnitId, failed.errCode, failed.errMsg, null); + }); + } + else + { + _callback?.Invoke(HCADSstatuscallback.InterstitialShowFailed, adUnitId, -98, "adUnitId does not exist", null); + } + } + + + #region BannerAd + + private readonly Dictionary _bannerDictionary = new Dictionary(); + + public void CreateBanner(string adUnitId) + { + _sysInfo = WX.GetSystemInfoSync(); + var wxBannerAd = WXBase.CreateBannerAd(new WXCreateBannerAdParam + { + adUnitId = adUnitId, + adIntervals = 30, + style = new Style + { + left = 0, + top = (int)_sysInfo.windowHeight - 100, + width = (int)_sysInfo.windowWidth, + height = 100 + } + }); + wxBannerAd.OnError(res => + { + HCDebugger.LogDebug("[ADManager] [InitBanner] bannerad error response, errCode : " + res.errCode + + " , errMsg : " + res.errMsg); + + _callback?.Invoke(HCADSstatuscallback.BannerLoadFailed, adUnitId, res.errCode, res.errMsg, null); + }); + wxBannerAd.OnLoad(res => + { + // TODO callback + HCDebugger.LogDebug("[ADManager] [InitBanner] bannerad loaded response, rewardValue : " + res.rewardValue + + " , shareValue : " + + res.shareValue + " , errMsg : " + res.errMsg); + + _callback?.Invoke(HCADSstatuscallback.BannerLoadSuccess, adUnitId, 0, res.errMsg, null); + }); + wxBannerAd.OnResize(res => + { + HCDebugger.LogDebug("[ADManager] [InitBanner] bannerAd on resize, errMsg: " + res.errMsg + " , width : " + res.width + + " , height : " + + res.height); + //拉取的广告可能跟设置的不一样,需要动态调整位置 + wxBannerAd.style.top = (int)_sysInfo.windowHeight - res.height; + + _callback?.Invoke(HCADSstatuscallback.BannerResize, adUnitId, 0, res.errMsg, null); + }); + + _bannerDictionary[adUnitId] = wxBannerAd; + } + + public void DestroyBanner(string adUnitId) + { + if (_bannerDictionary.TryGetValue(adUnitId, out var wxBannerAd)) + { + wxBannerAd.Destroy(); + + _callback?.Invoke(HCADSstatuscallback.BannerDestroySuccess, adUnitId, 0, "", null); + } + else + { + _callback?.Invoke(HCADSstatuscallback.BannerDestroyFailed, adUnitId, -97, "adUnitId does not exist", null); + } + } + + + public void ShowBanner(string adUnitId) + { + if (_bannerDictionary.TryGetValue(adUnitId, out var wxBannerAd)) + { + wxBannerAd.Show(success => { _callback?.Invoke(HCADSstatuscallback.BannerShowSuccess, adUnitId, success.errCode, success.errMsg, null); }, + failed => { _callback?.Invoke(HCADSstatuscallback.BannerShowFailed, adUnitId, failed.errCode, failed.errMsg, null); }); + } + else + { + _callback?.Invoke(HCADSstatuscallback.BannerShowFailed, adUnitId, -96, "adUnitId does not exist", null); + } + } + + public void HideBanner(string adUnitId) + { + if (_bannerDictionary.TryGetValue(adUnitId, out var wxBannerAd)) + { + wxBannerAd.Hide(); + _callback?.Invoke(HCADSstatuscallback.BannerHideSuccess, adUnitId, 0, "", null); + } + else + { + _callback?.Invoke(HCADSstatuscallback.BannerHideFailed, adUnitId, -95, "adUnitId does not exist", null); + } + } + + #endregion + + + public void SetLogEnable(bool _enable) + { + } + + public void LoadNative(string adUnit) + { + HCDebugger.LogDebug($"[ADManager] [LoadNative] adUnit = {adUnit}"); + try + { + if (!HCTools.HasKey(adUnit)) return; + var playerPrefsString = HCTools.GetPlayerPrefsString(adUnit); + var gridAdPositionInfo = JsonUtility.FromJson(playerPrefsString); + HCDebugger.LogDebug($"[ADManager] [LoadNative] adUnit = {adUnit} playerPrefsString = {playerPrefsString}"); + InitNative(adUnit, gridAdPositionInfo._fixed, gridAdPositionInfo.adUnit, gridAdPositionInfo.left, gridAdPositionInfo.top, gridAdPositionInfo.width, gridAdPositionInfo.height); + } + catch (Exception e) + { + HCDebugger.LogError(e.Message); + } + } + + + // 记录广告已经初始化 key : Position value adId + private Dictionary ShowNativeAdUnit = new Dictionary(); + + private static Dictionary nativeCallbackDictionary = new Dictionary(); + + // show的时候,未初始化的时候,进行缓存 + private readonly List _cacheAdPosition = new(); + + private readonly HashSet _initAdPosition = new(); + + + public void RemoveNative(string adUnit) + { + HCDebugger.LogDebug($"[ADManager] [RemoveNative] adUnit = {adUnit}"); + if (_cacheAdPosition.Contains(adUnit)) + { + HCDebugger.LogDebug($"[ADManager] [RemoveNative] 清除缓存 adUnit = {adUnit}"); + // 移除缓存 + _cacheAdPosition.Remove(adUnit); + } + + if (ShowNativeAdUnit.TryGetValue(adUnit, out var showAdUnit)) + { + HCDebugger.LogDebug($"[ADManager] [RemoveNative] native 移除 adUnit = {adUnit}"); + HCWxTools.UnityToWxMiniGame(JsonUtility.ToJson(new WxNativeAdEntity + { + cmd = "RemoveNative", + adUnit = showAdUnit, + adPostion = adUnit + })); + } + else + { + HCDebugger.LogError($"[ADManager] [RemoveNative] error adUnit = {adUnit}"); + } + } + + public bool IsNativeAdReady(string adPosition) + { + // if (!ShowNativeAdUnit.TryGetValue(adPosition, out var showAdUnit)) + // { + // HCDebugger.LogDebug("[IsNativeAdReady] 对象为空,没有初始化来的,直接给返回True"); + // return true; + // } + // + // var result = HCWxTools.UnityToWxMiniGame(JsonUtility.ToJson(new WxNativeAdEntity + // { + // cmd = "isShow", + // adUnit = showAdUnit, + // adPostion = adPosition + // })); + + var result = _initAdPosition.Contains(adPosition); + HCDebugger.LogDebug($"[ADManager] [IsNativeAdReady] native ============ IsNativeAdReady : {result}"); + + + return result; + } + + // 广告标题的高度 + private const int AdTitleHeight = 21; + + // 广告格子的高度 + private const int AdHeight = 69; + private const int AdWidth = 60; + + public void ShowNative(string adPosition, float x, float y, float width, float height, string pAdPos, Action _showFailedCallback = null, Action _closeCallback = null) + { + HCAnalyticsManager.Instance.TrackEvent(HCInnerStaticSting.HC_NA_Position, new Dictionary + { + { "adPosition", adPosition }, + { "left", x }, + { "top", y }, + { "width", width }, + { "height", height }, + { "pAdPos", pAdPos }, + }); + + HCDebugger.LogDebug($"[ADManager] [ShowNative] adPosition {adPosition} x = {x} y = {y} width = {width} height = {height} _showFailedCallback = {_showFailedCallback} _closeCallback = {_closeCallback}"); + try + { + // 记录回调 + nativeCallbackDictionary[adPosition] = new NativeCallback + { + adUnit = adPosition, + showFailedCallback = _showFailedCallback, + closeCallback = _closeCallback + }; + + + ParameterConversion(adPosition, ref x, ref y, width, height, pAdPos, out var adUnitsBean, out var adViewHeight, out var adViewWidth); + if (HCTools.HasKey(adPosition)) + { + HCDebugger.LogDebug($"[ADManager] [ShowNative]存在缓存,开始对比缓存的数据 adPosition = {adPosition}"); + var playerPrefsString = HCTools.GetPlayerPrefsString(adPosition); + var gridAdPositionInfo = JsonUtility.FromJson(playerPrefsString); + if (Math.Abs(x - gridAdPositionInfo.left) > 1 || Math.Abs(y - gridAdPositionInfo.top) > 1 || Math.Abs(adViewWidth - gridAdPositionInfo.width) > 1 || Math.Abs(adViewHeight - gridAdPositionInfo.height) > 1) + { + HCDebugger.LogDebug($"[ADManager] [ShowNative] 位置信息有改变,需要更新 {playerPrefsString} x = {x} y = {y} width = {adViewHeight} height = {adViewWidth}"); + // 这里还可以调用销毁格子广告。 + ShowNativeAdUnit.Remove(adPosition); + _initAdPosition.Remove(adPosition); + DestroyNative(adUnitsBean.AdUnit); + } + } + else + { + HCDebugger.LogWarning($"[ADManager] [ShowNative] 没有缓存数据 adPosition = {adPosition}"); + } + + // 已经初始化 + if (ShowNativeAdUnit.TryGetValue(adPosition, out var adUnit)) + { + if (IsNativeAdReady(adPosition)) + { + HCAnalyticsManager.Instance.TrackEvent(HCInnerStaticSting.HC_NA_AchieveShow_Match, new Dictionary + { + { "adPosition", adPosition }, + { "left", x }, + { "top", y }, + { "width", width }, + { "height", height }, + { "pAdPos", pAdPos }, + }); + + HCDebugger.LogDebug($"[ADManager] [ShowNative] start adPosition = {adPosition} AdUnit = {adUnit}"); + // 显示native + _ShowNative(adUnit); + } + else + { + HCAnalyticsManager.Instance.TrackEvent(HCInnerStaticSting.HC_NA_ShowFail_Not_Ready, new Dictionary + { + { "adPosition", adPosition }, + { "left", x }, + { "top", y }, + { "width", width }, + { "height", height }, + { "pAdPos", pAdPos }, + }); + + HCDebugger.LogWarning($"[ADManager] [ShowNative] native 没有缓存 adPosition = {adPosition} AdUnit = {adUnit}"); + nativeCallbackDictionary[adPosition]?.ShowFailedCallback(-102, "没有缓存"); + } + } + else + { + HCAnalyticsManager.Instance.TrackEvent("NA_AchieveShow_Match_no_cache", new Dictionary + { + { "adPosition", adPosition }, + { "left", x }, + { "top", y }, + { "width", width }, + { "height", height }, + { "pAdPos", pAdPos }, + }); + + // 解析参数 + var gridAdPositionInfo = new GridAdPositionInfo + { + ADPosition = adPosition, + _fixed = 0, + adUnit = adUnitsBean.AdUnit, + left = x, + top = y, + width = adViewWidth, + height = adViewHeight + }; + + HCTools.SavePlayerPrefsString(adPosition, JsonUtility.ToJson(gridAdPositionInfo)); + _cacheAdPosition.Add(adPosition); + + HCDebugger.LogDebug($"[ADManager] [ShowNative] start InitNative adPosition = {adPosition} AdUnit = {adUnitsBean.AdUnit} x = {x} y = {y} adViewWidth = {adViewWidth} adViewHeight = {adViewHeight}"); + + // 调用初始化,然后初始化回调中,对sdk判断是否显示 + InitNative(adPosition, 0, adUnitsBean.AdUnit, x, y, adViewWidth, adViewHeight); + } + } + catch (Exception e) + { + HCAnalyticsManager.Instance.TrackEvent(HCInnerStaticSting.HC_NA_ShowFail, new Dictionary + { + { "adPosition", adPosition }, + { "left", x }, + { "top", y }, + { "width", width }, + { "height", height }, + { "pAdPos", pAdPos }, + { "e", e.Message }, + }); + + nativeCallbackDictionary[adPosition]?.ShowFailedCallback(-100, e.Message); + nativeCallbackDictionary.Remove(adPosition); + } + } + + private void DestroyNative(string adUnit) + { + HCDebugger.LogDebug($"[ADManager] [DestroyNative] adUnit = {adUnit}"); + // 显示native + HCWxTools.UnityToWxMiniGame(JsonUtility.ToJson(new WxNativeAdEntity + { + cmd = "DestroyNative", + adUnit = adUnit, + })); + } + + /// + /// 真实的广告id + /// + /// + private void _ShowNative(string adUnit) + { + HCDebugger.LogDebug($"[ADManager] [_ShowNative] _ShowNative adUnit = {adUnit}"); + // 显示native + HCWxTools.UnityToWxMiniGame(JsonUtility.ToJson(new WxNativeAdEntity + { + cmd = "ShowNative", + adUnit = adUnit, + })); + } + + private void InitNative(string adPosition, int _fixed, string adUnit, float left, float top, int width, int height) + { + HCAnalyticsManager.Instance.TrackEvent(HCInnerStaticSting.HC_NA_Start_Load, new Dictionary + { + { "adPosition", adPosition }, + { "_fixed", _fixed }, + { "adUnit", adUnit }, + { "left", left }, + { "top", top }, + { "width", width }, + { "height", height }, + }); + + HCDebugger.LogDebug($"[ADManager] [InitNative] adPosition = {adPosition} _fixed = {_fixed} adUnit = {adUnit} left = {left} top = {top} width = {width} height = {height}"); + // 显示native + HCWxTools.UnityToWxMiniGame(JsonUtility.ToJson(new WxNativeAdEntity + { + cmd = "LoadNative", + adPostion = adPosition, + _fixed = _fixed, + adUnit = adUnit, + left = (int)left, + top = (int)top, + width = width, + height = height + })); + } + + private void ParameterConversion(string adUnit, ref float x, ref float y, float width, float height, string pAdPos, out HCNativeAdUnit adUnitsBean, out int adViewHeight, out int adViewWidth) + { + var h = Screen.height; + var screenHeight = WX.GetSystemInfoSync().screenHeight; + + + var w = Screen.width; + var windowHeight = WX.GetSystemInfoSync().windowHeight; + var screenWidth = WX.GetSystemInfoSync().screenWidth; + var windowWidth = WX.GetSystemInfoSync().windowWidth; + + /** + * 【HCSDK】 [HCWXAds] h : 1334 screenHeight : 667 windowHeight : 667 + * 【HCSDK】 [HCWXAds] w : 750 screenWidth : 375 windowWidth : 375 + */ + HCDebugger.LogDebug($"[HCWXAds] h : {h} screenHeight : {screenHeight} windowHeight : {windowHeight}"); + HCDebugger.LogDebug($"[HCWXAds] w : {w} screenWidth : {screenWidth} windowWidth : {windowWidth}"); + HCDebugger.LogDebug($"[HCWXAds] adUnit:{adUnit} x :{x} y : {y} width : {width} height : {height} pAdPos : {pAdPos}"); + + + // 0.5 + var scaleSize = WX.GetSystemInfoSync().pixelRatio; + HCDebugger.LogDebug($"[HCWXAds] scaleSize {scaleSize}"); + + // 真实宽度 + width = (float)(width / scaleSize); + // 真实高度 + height = (float)(height / scaleSize); + // 真实x + x = (float)(x / scaleSize); + // 真实y + y = (float)(y / scaleSize); + + + HCDebugger.LogDebug($"[HCWXAds] scaleSize >>>>>>> x :{x} y : {y} width : {width} height : {height} pAdPos : {pAdPos}"); + + var rows = (int)(height - AdTitleHeight) / AdHeight; + + HCDebugger.LogDebug($"[HCWXAds] rows = {rows}"); + if (!HCStaticParams.NativeAdUnitIDDictionary.TryGetValue(adUnit, out adUnitsBean)) + { + HCDebugger.LogError($"[HCWXAds] adUnit {adUnit} 加载失败"); + adViewHeight = 0; + adViewWidth = 0; + throw new Exception($"adUnit {adUnit} 加载失败"); + } + + while (adUnitsBean != null) + { + HCDebugger.LogDebug($"[HCWXAds] while >>>>>> rows = {rows} adUnitsBean.Rows = {adUnitsBean.Rows}"); + if (rows >= adUnitsBean.Rows) + { + break; + } + + adUnitsBean = adUnitsBean.Fit; + } + + if (adUnitsBean == null) + { + HCDebugger.LogError($"[HCWXAds] adUnit {adUnit} 加载失败 adUnitsBean == null 配置中没有可展示完全的广告id"); + adViewHeight = 0; + adViewWidth = 0; + throw new Exception($"adUnit {adUnit} 加载失败 adUnitsBean == null"); + } + + // var tempWidth = AdWidth; + // var tempHeight = AdHeight; + // var tempAdTitleHeight = AdTitleHeight; + + + // if (adUnitsBean.IsFull) + // { + // tempWidth = (int)(screenWidth / adUnitsBean.Columns); + // HCDebugger.LogDebug($"[HCWXAds] 全屏格子广告 : width {tempWidth}"); + // tempHeight = tempWidth * AdHeight / AdWidth; + // tempAdTitleHeight = tempWidth * AdHeight / AdTitleHeight; + // } + + adViewHeight = adUnitsBean.Rows * AdHeight + AdTitleHeight; + adViewWidth = adUnitsBean.Columns * AdWidth; + + if (adUnitsBean.IsFull) + { + HCDebugger.LogDebug($"[HCWXAds] 全屏格子广告 原 adViewWidth = {adViewWidth} adViewHeight = {adViewHeight}"); + adViewHeight = adViewHeight * (int)screenWidth / adViewWidth; + adViewWidth = (int)screenWidth; + HCDebugger.LogDebug($"[HCWXAds] 全屏格子广告 fix adViewWidth = {adViewWidth} adViewHeight = {adViewHeight}"); + } + + // ShowNativeAdUnit[adUnit] = adUnitsBean.AdUnit; + + HCDebugger.LogDebug($"[HCWXAds] [ShowNative] x = {x} y = {y} width = {width} height = {height} adViewHeight = {adViewHeight} adViewWidth = {adViewWidth} {adUnitsBean.Anchor}"); + + switch (adUnitsBean.Anchor) + { + case TextAnchor.UpperLeft: + break; + case TextAnchor.UpperCenter: + // 只处理盒子宽度大于广告宽度的情况 + if (adViewWidth < width) + { + x += (width - adViewWidth) / 2; + } + + break; + case TextAnchor.UpperRight: + // 只处理盒子宽度大于广告宽度的情况 + if (adViewWidth < width) + { + x += (width - adViewWidth); + } + + break; + case TextAnchor.MiddleLeft: + y += (height - adViewHeight) / 2; + break; + case TextAnchor.MiddleCenter: + y += (height - adViewHeight) / 2; + // 只处理盒子宽度大于广告宽度的情况 + if (adViewWidth < width) + { + x += (width - adViewWidth) / 2; + } + + break; + case TextAnchor.MiddleRight: + y += (height - adViewHeight) / 2; + // 只处理盒子宽度大于广告宽度的情况 + if (adViewWidth < width) + { + x += (width - adViewWidth); + } + + break; + case TextAnchor.LowerLeft: + y += (height - adViewHeight); + break; + case TextAnchor.LowerCenter: + y += (height - adViewHeight); + // 只处理盒子宽度大于广告宽度的情况 + if (adViewWidth < width) + { + x += (width - adViewWidth) / 2; + } + + break; + case TextAnchor.LowerRight: + y += (height - adViewHeight); + + // 只处理盒子宽度大于广告宽度的情况 + if (adViewWidth < width) + { + x += (width - adViewWidth); + } + + break; + default: + throw new ArgumentOutOfRangeException(); + } + + HCDebugger.LogDebug($"[HCWXAds] [ShowNative] x = {x} y = {y} width = {width} height = {height} adViewHeight = {adViewHeight} adViewWidth = {adViewWidth} {adUnitsBean.Anchor}"); + // y += (int)WX.GetSystemInfoSync().statusBarHeight; + + if (adUnitsBean.Rows != 1) + { + y -= 30; + } + + if (adUnitsBean.Rows == 1 && adUnitsBean.Anchor is TextAnchor.LowerCenter or TextAnchor.LowerLeft or TextAnchor.LowerRight) + { + y += 5; + } + + if (width >= adViewWidth && !adUnitsBean.IsFull && adUnitsBean.Anchor is TextAnchor.LowerRight or TextAnchor.MiddleRight or TextAnchor.UpperRight or TextAnchor.LowerCenter or TextAnchor.MiddleCenter or TextAnchor.UpperCenter) + { + x += adUnitsBean.Rows == 1 ? 10 : 5; + } + + if (y <= 0) + { + y = 1; + } + + if (x <= 0) + { + x = 1; + } + + HCDebugger.LogDebug($"[HCWXAds] [ShowNative] x = {x} y = {y} width = {width} height = {height} adViewHeight = {adViewHeight} adViewWidth = {adViewWidth} {adUnitsBean.Anchor}"); + } + + + public class NativeCallback + { + public string adUnit; + public Action showFailedCallback = null; + public Action closeCallback = null; + + public void ShowFailedCallback(int code, string msg) + { + HCDebugger.LogDebug($"[ADManager] [NativeCallback] [ShowFailedCallback] code = {code} msg = {msg}"); + showFailedCallback?.Invoke(code, msg); + nativeCallbackDictionary.Remove(adUnit); + } + + public void CloseCallback() + { + HCDebugger.LogDebug($"[ADManager] [NativeCallback] [CloseCallback] closeCallback={closeCallback}"); + closeCallback?.Invoke(); + nativeCallbackDictionary.Remove(adUnit); + } + } + + public class GridAdPositionInfo + { + public string ADPosition; + public int _fixed; + public string adUnit; + public float left; + public float top; + public int width; + public int height; + } + + private void WxCallUnity(string cmd, string content) + { + var wxNativeCallback = JsonUtility.FromJson(content); + HCDebugger.LogDebug($"[ADManager] [WxCallUnity] 收到wx的回调 cmd = {cmd} content = {content}"); + + switch (cmd) + { + // 加载失败 + case "onError": + HCAnalyticsManager.Instance.TrackEvent(HCInnerStaticSting.HC_NA_Fail_Loaded, new Dictionary + { + { "adPosition", wxNativeCallback.adPostion }, + { "msg", wxNativeCallback.msg }, + { "cmd", wxNativeCallback.cmd }, + { "adUnit", wxNativeCallback.adUnit }, + { "code", wxNativeCallback.code }, + }); + + _initAdPosition.Remove(wxNativeCallback.adPostion); + HCDebugger.LogDebug($" [WxCallUnity] [onLoad] 收到wx的回调 wxNativeCallback.adPostion = {wxNativeCallback.adPostion} {_cacheAdPosition.Contains(wxNativeCallback.adPostion)}"); + // load 成功,同时还有缓存,那么给他显示一下 + if (_cacheAdPosition.Contains(wxNativeCallback.adPostion)) + { + if (nativeCallbackDictionary.TryGetValue(wxNativeCallback.adPostion, out var callback3)) + { + callback3.ShowFailedCallback(wxNativeCallback.code, wxNativeCallback.msg); + } + } + + _cacheAdPosition.Remove(wxNativeCallback.adPostion); + break; + // 加载成功 + case "onLoad": + HCAnalyticsManager.Instance.TrackEvent(HCInnerStaticSting.HC_NA_Loaded, new Dictionary + { + { "adPosition", wxNativeCallback.adPostion }, + { "msg", wxNativeCallback.msg }, + { "cmd", wxNativeCallback.cmd }, + { "adUnit", wxNativeCallback.adUnit }, + { "code", wxNativeCallback.code }, + }); + + _initAdPosition.Add(wxNativeCallback.adPostion); + + HCDebugger.LogDebug($" [WxCallUnity] [onLoad] 收到wx的回调 wxNativeCallback.adPostion = {wxNativeCallback.adPostion} {_cacheAdPosition.Contains(wxNativeCallback.adPostion)}"); + // load 成功,同时还有缓存,那么给他显示一下 + if (_cacheAdPosition.Contains(wxNativeCallback.adPostion)) + { + if (ShowNativeAdUnit.TryGetValue(wxNativeCallback.adPostion, out var temp)) + { + _ShowNative(temp); + } + } + + _cacheAdPosition.Remove(wxNativeCallback.adPostion); + + break; + // 关闭 + case "onHide": + case "onClose": + HCDebugger.LogDebug($"关闭回调 cache : {_cacheAdPosition.Contains(wxNativeCallback.adPostion)} close : {nativeCallbackDictionary.ContainsKey(wxNativeCallback.adPostion)}"); + if (_cacheAdPosition.Contains(wxNativeCallback.adPostion)) + { + // 移除缓存 + _cacheAdPosition.Remove(wxNativeCallback.adPostion); + } + + if (nativeCallbackDictionary.TryGetValue(wxNativeCallback.adPostion, out var callback)) + { + callback.CloseCallback(); + } + + if (cmd.Equals("onClose")) + { + var remove1 = ShowNativeAdUnit.Remove(wxNativeCallback.adPostion); + var remove2 = _initAdPosition.Remove(wxNativeCallback.adPostion); + HCDebugger.LogDebug($"[WxCallUnity] [onClose] adPosition = {wxNativeCallback.adPostion} remove1 = {remove1} remove2 = {remove2}"); + + LoadNative(wxNativeCallback.adPostion); + } + + HCAnalyticsManager.Instance.TrackEvent("NA_Close", new Dictionary + { + { "adPosition", wxNativeCallback.adPostion }, + { "msg", wxNativeCallback.msg }, + { "cmd", wxNativeCallback.cmd }, + { "adUnit", wxNativeCallback.adUnit }, + { "code", wxNativeCallback.code }, + }); + + break; + // 显示成功 + case "onShowSuccess": + HCAnalyticsManager.Instance.TrackEvent(HCInnerStaticSting.HC_NA_Show, new Dictionary + { + { "adPosition", wxNativeCallback.adPostion }, + { "msg", wxNativeCallback.msg }, + { "cmd", wxNativeCallback.cmd }, + { "adUnit", wxNativeCallback.adUnit }, + { "code", wxNativeCallback.code }, + }); + break; + // 显示失败 + case "onShowFail": + var adShowFailPosition = wxNativeCallback.GetAdUnit(ShowNativeAdUnit); + if (nativeCallbackDictionary.TryGetValue(adShowFailPosition, out var callback2)) + { + callback2.ShowFailedCallback(wxNativeCallback.code, wxNativeCallback.msg); + } + HCAnalyticsManager.Instance.TrackEvent(HCInnerStaticSting.HC_NA_ShowFail, new Dictionary + { + { "adPosition", wxNativeCallback.adPostion }, + { "msg", wxNativeCallback.msg }, + { "cmd", wxNativeCallback.cmd }, + { "adUnit", wxNativeCallback.adUnit }, + { "code", wxNativeCallback.code }, + }); + + break; + case "onHideSuccess": + if (nativeCallbackDictionary.TryGetValue(wxNativeCallback.adPostion, out var callback6)) + { + callback6.CloseCallback(); + } + + HCAnalyticsManager.Instance.TrackEvent("NA_onHideSuccess", new Dictionary + { + { "adPosition", wxNativeCallback.adPostion }, + { "msg", wxNativeCallback.msg }, + { "cmd", wxNativeCallback.cmd }, + { "adUnit", wxNativeCallback.adUnit }, + { "code", wxNativeCallback.code }, + }); + break; + case "onHideFail": + HCAnalyticsManager.Instance.TrackEvent("NA_onHideFail", new Dictionary + { + { "adPosition", wxNativeCallback.adPostion }, + { "msg", wxNativeCallback.msg }, + { "cmd", wxNativeCallback.cmd }, + { "adUnit", wxNativeCallback.adUnit }, + { "code", wxNativeCallback.code }, + }); + break; + case "newNativeAdObject": + ShowNativeAdUnit[wxNativeCallback.adPostion] = wxNativeCallback.adUnit; + break; + case "onDestroy": + HCAnalyticsManager.Instance.TrackEvent("NA_onDestroy", new Dictionary + { + { "adPosition", wxNativeCallback.adPostion }, + { "msg", wxNativeCallback.msg }, + { "cmd", wxNativeCallback.cmd }, + { "adUnit", wxNativeCallback.adUnit }, + { "code", wxNativeCallback.code }, + }); + var adShowFailPosition2 = wxNativeCallback.GetAdUnit(ShowNativeAdUnit); + if (!string.IsNullOrEmpty(adShowFailPosition2)) + { + ShowNativeAdUnit.Remove(adShowFailPosition2); + _initAdPosition.Remove(adShowFailPosition2); + } + + break; + } + } + } +} +#endif \ No newline at end of file diff --git a/Assets/HCMiniSdk/Scripts/WebGL/HCWX/HCWXAds.cs.meta b/Assets/HCMiniSdk/Scripts/WebGL/HCWX/HCWXAds.cs.meta new file mode 100644 index 00000000..17179210 --- /dev/null +++ b/Assets/HCMiniSdk/Scripts/WebGL/HCWX/HCWXAds.cs.meta @@ -0,0 +1,3 @@ +fileFormatVersion: 2 +guid: 5848ad96867b4c4fb5ce0c2384eb48d0 +timeCreated: 1699509176 \ No newline at end of file diff --git a/Assets/HCMiniSdk/Scripts/WebGL/HCWX/HCWXAnalytics.cs b/Assets/HCMiniSdk/Scripts/WebGL/HCWX/HCWXAnalytics.cs new file mode 100644 index 00000000..30114b8f --- /dev/null +++ b/Assets/HCMiniSdk/Scripts/WebGL/HCWX/HCWXAnalytics.cs @@ -0,0 +1,28 @@ +#if UNITY_WEBGL && WEBGL_WX +using System.Collections.Generic; +using LitJson; +using WeChatWASM; + +namespace HC +{ + public class HCWXAnalytics : HCIAnalytics + { + public void TrackEvent(string eventName, Dictionary eventDic = null) + { + eventDic ??= new Dictionary(); + var json = JsonMapper.ToJson(eventDic); + HCDebugger.LogDebug($"[HCWXAnalytics] [TrackEvent] eventName {eventName} json = {json}"); + + Dictionary umeng = new Dictionary(); + umeng["cmd"] = "umeng"; + umeng["eventName"] = eventName; + umeng["data"] = eventDic; + HCWxTools.Instance.UnityToWxMiniGame(umeng); + +#if !UNITY_EDITOR + WX.ReportEvent(eventName.ToLower(), eventDic); +#endif + } + } +} +#endif \ No newline at end of file diff --git a/Assets/HCMiniSdk/Scripts/WebGL/HCWX/HCWXAnalytics.cs.meta b/Assets/HCMiniSdk/Scripts/WebGL/HCWX/HCWXAnalytics.cs.meta new file mode 100644 index 00000000..7b45ab6e --- /dev/null +++ b/Assets/HCMiniSdk/Scripts/WebGL/HCWX/HCWXAnalytics.cs.meta @@ -0,0 +1,3 @@ +fileFormatVersion: 2 +guid: 1a415aba52674d11a10ba4496e8e4bb5 +timeCreated: 1699521669 \ No newline at end of file diff --git a/Assets/HCMiniSdk/Scripts/WebGL/HCWX/HCWXAppInfo.cs b/Assets/HCMiniSdk/Scripts/WebGL/HCWX/HCWXAppInfo.cs new file mode 100644 index 00000000..cb2148c5 --- /dev/null +++ b/Assets/HCMiniSdk/Scripts/WebGL/HCWX/HCWXAppInfo.cs @@ -0,0 +1,54 @@ +#if UNITY_WEBGL && WEBGL_WX +using System.Collections.Generic; +using WeChatWASM; + +namespace HC +{ + public class HCWXAppInfo : HCIAppInfo + { + public string GetBundleID() + { + return WX.GetAccountInfoSync().miniProgram.appId; + } + + public string GetVersion() + { + return WX.GetAccountInfoSync().miniProgram.version; + } + + public string GetModel() + { + return WX.GetSystemInfoSync().model; + } + + public string GetBrand() + { + return WX.GetSystemInfoSync().brand; + } + + public string GetLanguage() + { + return WX.GetSystemInfoSync().language; + } + + public string GetSystemName() + { + return WX.GetSystemInfoSync().system; + } + + public Dictionary GetBaseInfo() + { + var dictionary = new Dictionary + { + ["envVersion"] = WX.GetAccountInfoSync().miniProgram.envVersion + }; + return dictionary; + } + + public string GetPlatform() + { + return "wechat_" + WX.GetSystemInfoSync().platform.ToLower(); + } + } +} +#endif \ No newline at end of file diff --git a/Assets/HCMiniSdk/Scripts/WebGL/HCWX/HCWXAppInfo.cs.meta b/Assets/HCMiniSdk/Scripts/WebGL/HCWX/HCWXAppInfo.cs.meta new file mode 100644 index 00000000..237a6d1f --- /dev/null +++ b/Assets/HCMiniSdk/Scripts/WebGL/HCWX/HCWXAppInfo.cs.meta @@ -0,0 +1,3 @@ +fileFormatVersion: 2 +guid: b1e147afa48044f0971f73b84a9cf6eb +timeCreated: 1699587019 \ No newline at end of file diff --git a/Assets/HCMiniSdk/Scripts/WebGL/HCWX/HCWXBase.cs b/Assets/HCMiniSdk/Scripts/WebGL/HCWX/HCWXBase.cs new file mode 100644 index 00000000..0df99e7b --- /dev/null +++ b/Assets/HCMiniSdk/Scripts/WebGL/HCWX/HCWXBase.cs @@ -0,0 +1,78 @@ +#if UNITY_WEBGL && WEBGL_WX +using System; +using System.Collections.Generic; +using WeChatWASM; + +namespace HC +{ + public class HCWXBase : HCSingleton, HCIBase + { + public Action OpenCustomerServiceFail; + public Action OpenCustomerServiceSuccess; + + public void Vibrate(int shakeType, float intensity = 1) + { + WX.VibrateShort(new VibrateShortOption()); + } + + public void OpenCustomerService(Dictionary param) + { + var sessionFrom = param.GetValue("sessionFrom", "") as string; + + var showMessageCard = (bool)param.GetValue("showMessageCard", false); + + var sendMessageTitle = param.GetValue("sendMessageTitle", "") as string; + var sendMessagePath = param.GetValue("sendMessagePath", "") as string; + var sendMessageImg = param.GetValue("sendMessageImg", "") as string; + + var option = new OpenCustomerServiceConversationOption + { + success = OnOpenCustomerServiceSuccess, + fail = OnOpenCustomerServiceFail, + sessionFrom = sessionFrom, + showMessageCard = showMessageCard, + sendMessageTitle = sendMessageTitle, + sendMessagePath = sendMessagePath, + sendMessageImg = sendMessageImg + }; + + + WX.OpenCustomerServiceConversation(option); + } + + public void ExitApp() + { + WX.ExitMiniProgram(new ExitMiniProgramOption + { + success = _=>{}, + fail = _=>{}, + complete = _=>{} + }); + } + + private void OnOpenCustomerServiceFail(GeneralCallbackResult obj) + { + HCDebugger.LogDebug($"OnOpenCustomerServiceFail obj.errMsg = {obj.errMsg} OpenCustomerServiceFail = {OpenCustomerServiceFail}"); + OpenCustomerServiceFail?.Invoke(obj.errMsg); + } + + private void OnOpenCustomerServiceSuccess(OpenCustomerServiceConversationSuccessCallbackResult obj) + { + HCDebugger.LogDebug($"OnOpenCustomerServiceSuccess obj.path = {obj.path} msg = {obj.errMsg} OpenCustomerServiceSuccess = {OpenCustomerServiceSuccess}"); + OpenCustomerServiceSuccess?.Invoke(new CustomerServiceSuccessBean() + { + path = obj.path, + errMsg = obj.errMsg, + query = obj.query + }); + } + } + + public struct CustomerServiceSuccessBean + { + public string path; + public string errMsg; + public Dictionary query; + } +} +#endif \ No newline at end of file diff --git a/Assets/HCMiniSdk/Scripts/WebGL/HCWX/HCWXBase.cs.meta b/Assets/HCMiniSdk/Scripts/WebGL/HCWX/HCWXBase.cs.meta new file mode 100644 index 00000000..36ec8013 --- /dev/null +++ b/Assets/HCMiniSdk/Scripts/WebGL/HCWX/HCWXBase.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: 6aef53d389d94577ac554655d8765b56 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/HCMiniSdk/Scripts/WebGL/HCWX/HCWXShare.cs b/Assets/HCMiniSdk/Scripts/WebGL/HCWX/HCWXShare.cs new file mode 100644 index 00000000..b9daa9ff --- /dev/null +++ b/Assets/HCMiniSdk/Scripts/WebGL/HCWX/HCWXShare.cs @@ -0,0 +1,61 @@ +#if UNITY_WEBGL && WEBGL_WX +using System; +using System.Collections.Generic; +using JetBrains.Annotations; +using WeChatWASM; + +namespace HC +{ + public class HCWXShare : HCIShare + { + public HCWXShare() + { + HCAnalyticsManager.Instance.RemoteConfigListen += RemoteConfigUpdate; + OnListenShare(); + } + + private static void OnListenShare() + { + var shareImageUrl = HCAnalyticsManager.Instance.GetRemoteConfigStr("share_imageUrl", ""); + var shareTitle = HCAnalyticsManager.Instance.GetRemoteConfigStr("share_title", ""); + HCDebugger.LogDebug($"[HCWXShare] [OnListenShare] start"); + WX.OnShareTimeline(action => + { + HCDebugger.LogDebug($"[HCWXShare] [OnListenShare] action = {action}"); + HCDebugger.LogDebug($"[HCWXShare] [OnListenShare] action = {action} shareImageUrl = {shareImageUrl} shareTitle = {shareTitle}"); + action.Invoke(new OnShareTimelineListenerResult + { + imageUrl = shareImageUrl, + title = shareTitle + }); + }); + WXBase.OnShareAppMessage(new WXShareAppMessageParam + { + imageUrl = shareImageUrl, + title = shareTitle + }); + } + + public void Share(string title, string imgUrl, string content, Action callback, int type = 0) + { + var shareAppMessageOption = new ShareAppMessageOption + { + title = title + }; + + if (!string.IsNullOrEmpty(imgUrl)) + { + shareAppMessageOption.imageUrl = imgUrl; + } + + WX.ShareAppMessage(shareAppMessageOption); + callback?.Invoke(true); + } + + private static void RemoteConfigUpdate(TrackEventPlatform platform, Dictionary config) + { + OnListenShare(); + } + } +} +#endif \ No newline at end of file diff --git a/Assets/HCMiniSdk/Scripts/WebGL/HCWX/HCWXShare.cs.meta b/Assets/HCMiniSdk/Scripts/WebGL/HCWX/HCWXShare.cs.meta new file mode 100644 index 00000000..08db964d --- /dev/null +++ b/Assets/HCMiniSdk/Scripts/WebGL/HCWX/HCWXShare.cs.meta @@ -0,0 +1,3 @@ +fileFormatVersion: 2 +guid: 0617a31d6f8546daa78068115649a0a6 +timeCreated: 1699839015 \ No newline at end of file diff --git a/Assets/HCMiniSdk/Scripts/WebGL/HCWX/HCWxPurchase.cs b/Assets/HCMiniSdk/Scripts/WebGL/HCWX/HCWxPurchase.cs new file mode 100644 index 00000000..8aebdf90 --- /dev/null +++ b/Assets/HCMiniSdk/Scripts/WebGL/HCWX/HCWxPurchase.cs @@ -0,0 +1,484 @@ +#if UNITY_WEBGL && WEBGL_WX +using System; +using System.Collections.Generic; +using HC.MiniJSON; +using JetBrains.Annotations; +using WeChatWASM; + +namespace HC +{ + public class HCWxPurchase : HCSingleton, HCIPurchase + { + private const string PayTypeH5 = "hc_pay_type_h5"; + private const string PayServiceOrderId = "hc_pay_service_order_id"; + private static bool IsH5Pay => HCAnalyticsManager.Instance.GetRemoteConfigBool("h5_pay", HCWebGLSDKManager.AppInfo.GetPlatform().ToLower().Contains("ios")); + + private bool _isOpenCustomerService; + + private string lastOrderId = ""; + private int checkH5ExecutionCount = 0; + + private HashSet h5callbackOrderStatus = new(); + + + public void Init() + { + if (HCWebGLSDKManager.Base is HCWXBase hcwxBase) + { + hcwxBase.OpenCustomerServiceSuccess += OpenCustomerServiceSuccess; + hcwxBase.OpenCustomerServiceFail += OpenCustomerServiceFail; + } + + CheckOrderList(); + + InvokeRepeating("CheckOrderList", 800, 32); + } + + private void OpenCustomerServiceSuccess(CustomerServiceSuccessBean customerServiceSuccessBean) + { + HCDebugger.LogDebug($"[HCWxPurchase] [OpenCustomerServiceSuccess] lastOrderId = {lastOrderId} _isOpenCustomerService = {_isOpenCustomerService} path = {customerServiceSuccessBean.path} "); + if (!_isOpenCustomerService) return; + _isOpenCustomerService = false; + + if (string.IsNullOrEmpty(lastOrderId)) + { + HCSDKManager.Instance.LogEvent(HCInnerStaticSting.HC_WECHAT_PAY_ERROR, "msg", "客服界面跳转回来lastOrderId为空", "order_no", lastOrderId); + HCDebugger.LogError("[HCWxPurchase] [OpenCustomerServiceSuccess] lastOrderId is null"); + return; + } + + + HCSDKManager.Instance.LogEvent(HCInnerStaticSting.HC_WECHAT_PAY_OPEN_CUSTOMER_SERVICE_SUCCESS, "order_no", lastOrderId); + + checkH5ExecutionCount = 0; + + // 打开查询load + WX.ShowLoading(new ShowLoadingOption() + { + title = "查询中...", + success = result => { HCDebugger.LogDebug($"[HCWxPurchase] [ShowLoading] success result.errMsg = {result.errMsg}"); }, + fail = result => { HCDebugger.LogDebug($"[HCWxPurchase] [ShowLoading] fail result.errMsg = {result.errMsg}"); } + }); + h5callbackOrderStatus.Add(lastOrderId); + + H5CheckOrderStatus(); + InvokeRepeating("H5CheckOrderStatus", 2, 2); + } + + private void H5CheckOrderStatus() + { + HCServer.Instance.OrderQuery(lastOrderId, (code, msg, orderQueryResult) => + { + checkH5ExecutionCount++; + if (code == 0 && orderQueryResult != null && orderQueryResult.pay_status != HCServer.OrderQueryResult.PayStatusNotPaid) + { + HCDebugger.LogDebug( + $"[HCWxPurchase] [H5CheckOrderStatus] 校验成功 :code = {code} pay_status = {orderQueryResult.pay_status} transaction_id = {orderQueryResult.transaction_id} pay_success_time = {orderQueryResult.pay_success_time}"); + + + var readPaymentArgsFromOrderId = ReadPaymentArgsFromOrderId(lastOrderId); + if (readPaymentArgsFromOrderId == null) + { + HCSDKManager.Instance.LogEvent(HCInnerStaticSting.HC_WECHAT_PAY_ERROR, "msg", "缓存查询订单不存在", "order_no", lastOrderId); + HCDebugger.LogError($"[HCWxPurchase] [H5CheckOrderStatus] orderId查询订单失败 lastOrderId = {lastOrderId}"); + // 已经被销毁了,无需给回调了 + // CallbackPay(lastOrderId, "", "", -1, ""); + + // 取消 查询 + CheckComplete(); + return; + } + + DeleteOrder(lastOrderId); + + if (h5callbackOrderStatus.Contains(lastOrderId)) + { + // 标记已经通知 + h5callbackOrderStatus.Remove(lastOrderId); + CallbackPay(lastOrderId, readPaymentArgsFromOrderId.productName, readPaymentArgsFromOrderId.productId, HCServer.OrderQueryResult.PayStatusPaid == orderQueryResult.pay_status ? 0 : orderQueryResult.pay_status, + readPaymentArgsFromOrderId.gameExtraParam, serverGameExtraParam: orderQueryResult.game_extra_param, hcPaymentArgs: readPaymentArgsFromOrderId, + msg: $"pay_status = {orderQueryResult.pay_status} transaction_id = {orderQueryResult.transaction_id}"); + + } + else + { + HCDebugger.LogError($"[HCWxPurchase] [H5CheckOrderStatus] lastOrderId = {lastOrderId} callbacked."); + } + + lastOrderId = ""; + + // 取消 查询 + CheckComplete(); + return; + } + + HCDebugger.LogDebug($"[HCWxPurchase] [H5CheckOrderStatus] fail checkH5ExecutionCount = {checkH5ExecutionCount} code = {code} msg = {msg} orderQueryResult = {orderQueryResult?.pay_status}"); + // 如果执行次数达到3次,取消重复调用并执行其他方法 + if (checkH5ExecutionCount >= 3) + { + CheckComplete(); + var readPaymentArgsFromOrderId = ReadPaymentArgsFromOrderId(lastOrderId); + CallbackPay(lastOrderId, readPaymentArgsFromOrderId.productName, readPaymentArgsFromOrderId.productId, 2, readPaymentArgsFromOrderId.gameExtraParam, msg: "查询次数到达3次"); + } + }); + } + + private void CheckComplete() + { + WX.HideLoading(new HideLoadingOption() + { + success = result => { HCDebugger.LogDebug($"[HCWxPurchase] [HideLoading] success result.errMsg = {result.errMsg}"); }, + fail = result => { HCDebugger.LogDebug($"[HCWxPurchase] [HideLoading] fail result.errMsg = {result.errMsg}"); } + }); + + // 取消重复调用 + CancelInvoke("H5CheckOrderStatus"); + + // 查询一下历史订单 + CheckOrderList(); + } + + private void OpenCustomerServiceFail(string errMsg) + { + if (!_isOpenCustomerService) return; + _isOpenCustomerService = false; + + HCSDKManager.Instance.LogEvent(HCInnerStaticSting.HC_WECHAT_PAY_OPEN_CUSTOMER_SERVICE_FAIL, "msg", errMsg, "order_no", lastOrderId); + var readPaymentArgsFromOrderId = ReadPaymentArgsFromOrderId(lastOrderId); + CallbackPay(lastOrderId, readPaymentArgsFromOrderId.productName, readPaymentArgsFromOrderId.productId, 1, readPaymentArgsFromOrderId.gameExtraParam, msg: $"open customer service fail : errMsg = {errMsg}"); + DeleteOrder(lastOrderId); + + // 查询一下历史订单 + CheckOrderList(); + } + + private bool CallbackPay(string orderNo, string productName, string productId, int code, string gameExtraParam, bool repeat = false, string serverGameExtraParam = "", HCPaymentArgs hcPaymentArgs = null, int balance = 0, + string msg = "") + { + hcPaymentArgs ??= new HCPaymentArgs(); + + if (code == 0) + { + HCAnalyticsManager.Instance.IAPSuccess(productName, productId, orderNo, "CNY", hcPaymentArgs.money, gameExtraParam, balance); + } + else + { + HCAnalyticsManager.Instance.IAPFail(productName, productId, orderNo, "CNY", hcPaymentArgs.money, hcPaymentArgs.gameExtraParam, $"code = {code} msg = {msg}"); + } + + HCDebugger.LogDebug($"[HCWxPurchase] [CallbackPay] orderNo = {orderNo} productName = {productName} productId = {productId} code = {code} gameExtraParam = {gameExtraParam} serverGameExtraParam = {serverGameExtraParam}"); + HCSDKManager.Instance.OnPurchaseDone?.Invoke(orderNo, productName, productId, code == 0, gameExtraParam, repeat, serverGameExtraParam); + return HCSDKManager.Instance.OnPurchaseDone != null; + } + + + public void Buy(HCPaymentArgs paymentArgs) + { + lastOrderId = ""; + + paymentArgs.ext ??= new Dictionary(); + paymentArgs.ext[PayTypeH5] = IsH5Pay; + HCSDKManager.Instance.LogEvent(HCInnerStaticSting.HC_WECHAT_PAY_CREATE_ORDER_ID, new Dictionary() + { + ["money"] = paymentArgs.money, + ["productId"] = paymentArgs.productId, + ["productName"] = paymentArgs.productName, + ["gameExtraParam"] = paymentArgs.gameExtraParam, + ["ext"] = paymentArgs.ext, + }); + + // 创建订单号 + HCServer.Instance.OrderCreate(paymentArgs.productName, paymentArgs.productId, "" + paymentArgs.money, 1, gameExtraParam: paymentArgs.gameExtraParam, callback: (code, msg, orderCreateInfo) => + { + if (code != 0 || orderCreateInfo == null || string.IsNullOrEmpty(orderCreateInfo.order_no)) + { + HCSDKManager.Instance.LogEvent(HCInnerStaticSting.HC_WECHAT_PAY_CREATE_ORDER_ID_FAIL, "msg", msg, "code", code); + HCDebugger.LogError($"[HCWxPurchase] [Buy] create order error. code = {code} orderCreateInfo = {orderCreateInfo} msg = {msg}"); + CallbackPay(lastOrderId, paymentArgs.productName, paymentArgs.productId, 3, paymentArgs.gameExtraParam, msg: $"create order error. code = {code} orderCreateInfo = {orderCreateInfo} msg = {msg}"); + return; + } + + var serverOrderNo = orderCreateInfo.order_no; + lastOrderId = serverOrderNo; + + paymentArgs.ext[PayServiceOrderId] = serverOrderNo; + HCDebugger.LogDebug($"[HCWxPurchase] [Buy] sessionFrom = {serverOrderNo} sendMessageTitle = {paymentArgs.productName} IsH5Pay = {IsH5Pay}"); + if (IsH5Pay) + { + WX.ShowModal(new ShowModalOption + { + title = HCAnalyticsManager.Instance.GetRemoteConfigStr("pay_title", ""), + content = HCAnalyticsManager.Instance.GetRemoteConfigStr("pay_content", "即将进入客服会话。在客服会话中点击右下角图片即可开始充值"), + confirmText = HCAnalyticsManager.Instance.GetRemoteConfigStr("pay_confirm_text", "去充值"), + cancelText = HCAnalyticsManager.Instance.GetRemoteConfigStr("pay_cancel_text", "取消"), + success = result => + { + // 用户点击确定' + if (result.confirm) + { + _isOpenCustomerService = true; + + // 保存订单 + SaveOrder(serverOrderNo, paymentArgs); + HCWebGLSDKManager.Base.OpenCustomerService(new Dictionary + { + ["sessionFrom"] = serverOrderNo, + ["showMessageCard"] = true, + ["sendMessageTitle"] = $"我要充值{paymentArgs.money * 1.0 / 100}元", + ["sendMessagePath"] = serverOrderNo, + ["sendMessageImg"] = HCAnalyticsManager.Instance.GetRemoteConfigStr("pay_img", "https://wxres.dgtverse.cn/h5pay/img/20231228-145750.png"), + }); + } + else if (result.cancel) + { + HCSDKManager.Instance.LogEvent(HCInnerStaticSting.HC_WECHAT_PAY_CANCEL, "order_no", serverOrderNo); + CallbackPay(lastOrderId, paymentArgs.productName, paymentArgs.productId, 3, paymentArgs.gameExtraParam, msg: $"cancel : order_no = {serverOrderNo}"); + } + } + }); + } + else + { + // Android + var requestMidasPaymentOption = new RequestMidasPaymentOption + { + mode = "game", + // 沙箱环境 0正式环境 1 测试环境 + env = HCAnalyticsManager.Instance.GetRemoteConfigInt("pay_env", 1), + offerId = HCStaticParams.PAY_OFFERID, + currencyType = "CNY", + platform = "android", + buyQuantity = paymentArgs.money, + zoneId = "1", + outTradeNo = serverOrderNo, + success = result => + { + HCDebugger.LogDebug($"[] result.errMsg = {result.errMsg}"); + HCAnalyticsManager.Instance.IAPChannelSuccess(paymentArgs.productName, paymentArgs.productId, serverOrderNo, "CNY", paymentArgs.money, paymentArgs.gameExtraParam); + // 保存订单,开始充值 + SaveOrder(serverOrderNo, paymentArgs); + ServerBuy(serverOrderNo, paymentArgs.productName, paymentArgs.money, (code, msg, data) => { }); + }, + fail = result => + { + CallbackPay(serverOrderNo, paymentArgs.productName, paymentArgs.productId, 1, paymentArgs.gameExtraParam, msg: $"支付失败: {result.errMsg} {result.errCode}"); + HCAnalyticsManager.Instance.IAPChannelFail(paymentArgs.productName, paymentArgs.productId, serverOrderNo, "CNY", paymentArgs.money, paymentArgs.gameExtraParam, + $"code = {result.errCode} msg = {result.errMsg}"); + HCDebugger.LogDebug($"支付失败: {result.errMsg} {result.errCode}"); + }, + complete = result => + { + HCDebugger.LogDebug("支付完成"); + HCDebugger.LogDebug($"支付完成: {result.errMsg} {result.errCode}"); + } + }; + + WX.RequestMidasPayment(requestMidasPaymentOption); + } + }); + } + + public void Awarded(string orderID) + { + HCServer.Instance.OrderAwarded(orderID, ((code, msg, _) => { HCDebugger.LogDebug($"[Awarded] 上报结果: code ={code}"); })); + } + + private string GenerateTradeNo() + { + // 微信客户端的订单号只要32位 + var generateTradeNo = Guid.NewGuid().ToString().Replace("-", ""); + HCDebugger.LogDebug($"[HCWxPurchase] [GenerateTradeNo] generateTradeNo = {generateTradeNo}"); + return generateTradeNo; + } + + /// + /// 检查订单列表,进行补单。 + /// + private void CheckOrderList() + { + HCDebugger.LogDebug("[HCWxPurchase] [CheckOrderList] start"); + var readAllPaymentArgs = ReadAllPaymentArgs(); + + if (readAllPaymentArgs.Count > 0) + { + HCSDKManager.Instance.LogEvent("CheckOrderList", "Count", readAllPaymentArgs.Count, "OrderList", OrderListInfoObjToString(readAllPaymentArgs)); + } + + foreach (var (orderId, paymentArgs) in readAllPaymentArgs) + { + HCDebugger.LogDebug($"[HCWxPurchase] [CheckOrderList] start : orderId = {orderId}"); + + if (paymentArgs.ext.ContainsKey(PayTypeH5) && (bool)paymentArgs.ext.GetValue(PayTypeH5, false)) + { + HCServer.Instance.OrderQuery(orderId, callback: (code, msg, orderQueryResult) => + { + if (code != 0 || orderQueryResult == null) + { + HCDebugger.LogError($"[HCWxPurchase] [CheckOrderList] error. orderId = {orderId} code = {code} msg = {msg}"); + return; + } + + switch (orderQueryResult.pay_status) + { + case HCServer.OrderQueryResult.PayStatusNotPaid: + HCDebugger.LogDebug($"[HCWxPurchase] [CheckOrderList] orderId = {orderId} pay_status = {orderQueryResult.pay_status}"); + break; + case HCServer.OrderQueryResult.PayStatusPaid when HCSDKManager.Instance.OnPurchaseDone == null: + return; + case HCServer.OrderQueryResult.PayStatusPaid: + CallbackPay(orderId, paymentArgs.productName, paymentArgs.productId, 0, paymentArgs.gameExtraParam, false, orderQueryResult.game_extra_param, hcPaymentArgs: paymentArgs, + msg: $"pay_status = {orderQueryResult.pay_status}"); + DeleteOrder(orderId); + break; + case HCServer.OrderQueryResult.PayStatusPaymentFailed: + DeleteOrder(orderId); + break; + } + }); + } + else + { + ServerBuy(orderId, paymentArgs.productName, paymentArgs.money, (code, msg, data) => { }); + } + } + } + + private void ServerBuy(string orderId, string productName, int money, [CanBeNull] Action callback = null) + { + HCServer.Instance.MiniAppPay(orderId, productName, money, (code, msg, data) => + { + HCDebugger.LogDebug($"支付成功后的服务器校验回调 code = {code} msg = {msg} data balance = {data.balance} order_no = {data.order_no} callback = {callback}"); + callback?.Invoke(code, msg, data); + + if (HCSDKManager.Instance.OnPurchaseDone == null) + { + HCDebugger.LogError("[HCWxPurchase] [ServerBuy] [MiniAppPay] OnPurchaseDone is null;"); + } + + // 如果服务器返回的了订单id,那就直接给删除掉 + var orderNo = data.order_no; + if (code == 0 && !string.IsNullOrEmpty(orderNo)) + { + HCDebugger.LogDebug($"微信支付成功了,删除订单, orderNo = {orderNo}"); + // DeleteOrder(orderId); + + var paymentArgs = ReadPaymentArgsFromOrderId(orderNo); + + paymentArgs.ext ??= new Dictionary(); + paymentArgs.ext[PayTypeH5] = true; + HCDebugger.LogDebug($"微信支付成功了,保存h5订单, orderNo = {orderNo} paymentArgs = {Json.Serialize(paymentArgs)}"); + SaveOrder(orderId, paymentArgs); + // 查h5订单 + h5callbackOrderStatus.Add(lastOrderId); + H5CheckOrderStatus(); + InvokeRepeating("H5CheckOrderStatus", 2, 2); + } + else + { + HCDebugger.LogDebug("微信支付成功了,请求失败了。"); + } + }); + } + + private void SaveOrder(string orderId, HCPaymentArgs paymentArgs) + { + HCDebugger.LogDebug($"[HCWxPurchase] [SaveOrder] orderId = {orderId}"); + var readAllPaymentArgs = ReadAllPaymentArgs(); + if (readAllPaymentArgs.ContainsKey(orderId)) + { + readAllPaymentArgs.Remove(orderId); + } + + readAllPaymentArgs[orderId] = paymentArgs; + + var data = Save(readAllPaymentArgs); + HCDebugger.LogDebug($"[HCWxPurchase] [SaveOrder] orderId = {orderId} data = {data}"); + } + + private void DeleteOrder(string orderId) + { + HCDebugger.LogDebug($"[HCWxPurchase] [DeleteOrder] orderId = {orderId}"); + var readAllPaymentArgs = ReadAllPaymentArgs(); + if (readAllPaymentArgs.ContainsKey(orderId)) + { + HCDebugger.LogDebug($"[HCWxPurchase] [DeleteOrder] orderId = {orderId} success"); + readAllPaymentArgs.Remove(orderId); + } + + var data = Save(readAllPaymentArgs); + HCDebugger.LogDebug($"[HCWxPurchase] [DeleteOrder] orderId = {orderId} data = {data}"); + } + + private static string Save(Dictionary readAllPaymentArgs) + { + var saveString = OrderListInfoObjToString(readAllPaymentArgs); + HCTools.SavePlayerPrefsString("HCIPurchase", saveString); + return saveString; + } + + private static string OrderListInfoObjToString(Dictionary readAllPaymentArgs) + { + var saveData = new Dictionary(); + readAllPaymentArgs ??= new Dictionary(); + foreach (var (key, paymentArgs) in readAllPaymentArgs) + { + saveData[key] = new Dictionary() + { + ["productId"] = paymentArgs.productId, + ["productName"] = paymentArgs.productName, + ["gameExtraParam"] = paymentArgs.gameExtraParam, + ["money"] = paymentArgs.money, + ["ext"] = paymentArgs.ext ??= new Dictionary() + }; + } + + var saveString = MiniJSON.Json.Serialize(saveData); + return saveString; + } + + public HCPaymentArgs ReadPaymentArgsFromOrderId(string orderId) + { + return ReadAllPaymentArgs().GetValue(orderId, null); + } + + private Dictionary ReadAllPaymentArgs() + { + var result = new Dictionary(); + try + { + var playerPrefsString = HCTools.GetPlayerPrefsString("HCIPurchase"); + + HCDebugger.LogDebug($"[HCWxPurchase] [ReadAllPaymentArgs] playerPrefsString = {playerPrefsString}"); + + if (string.IsNullOrEmpty(playerPrefsString)) + { + return result; + } + + var deserialize = (Dictionary)MiniJSON.Json.Deserialize(playerPrefsString); + + foreach (var (key, value) in deserialize) + { + var data = value as Dictionary; + result[key] = new HCPaymentArgs + { + productId = (string)data.GetValue("productId", ""), + gameExtraParam = (string)data.GetValue("gameExtraParam", ""), + productName = (string)data.GetValue("productName", ""), + money = int.Parse("" + data.GetValue("money", 0)), + ext = (Dictionary)data.GetValue("ext", new Dictionary()) + }; + } + } + catch (Exception e) + { + // ignored + + HCDebugger.LogDebug($"[HCWxPurchase] [ReadAllPaymentArgs] Error = {e.Message}"); + } + + return result; + } + } +} +#endif \ No newline at end of file diff --git a/Assets/HCMiniSdk/Scripts/WebGL/HCWX/HCWxPurchase.cs.meta b/Assets/HCMiniSdk/Scripts/WebGL/HCWX/HCWxPurchase.cs.meta new file mode 100644 index 00000000..db94ce37 --- /dev/null +++ b/Assets/HCMiniSdk/Scripts/WebGL/HCWX/HCWxPurchase.cs.meta @@ -0,0 +1,3 @@ +fileFormatVersion: 2 +guid: 3b5ba85d836c45d9ae38906a432eaba2 +timeCreated: 1701668260 \ No newline at end of file diff --git a/Assets/HCMiniSdk/Scripts/WebGL/HCWX/HCWxTools.cs b/Assets/HCMiniSdk/Scripts/WebGL/HCWX/HCWxTools.cs new file mode 100644 index 00000000..7d4f7cd5 --- /dev/null +++ b/Assets/HCMiniSdk/Scripts/WebGL/HCWX/HCWxTools.cs @@ -0,0 +1,107 @@ +#if UNITY_WEBGL +using System; +using System.Collections.Generic; +using System.Runtime.InteropServices; +using UnityEngine; + +namespace HC +{ + public class HCWxTools : MonoBehaviour + { + private static HCWxTools Cw { get; set; } + + public Action WxCallUnityAction; + + public static HCWxTools Instance + { + get + { + if (Cw != null) return Cw; + if (!Application.isPlaying) + { + return null; + } + + Cw = new GameObject(nameof(HCWxTools)).AddComponent(); + DontDestroyOnLoad(Cw.gameObject); + + return Cw; + } + } + + + [DllImport("__Internal", EntryPoint = "JsUnityToWxMiniGame")] + public static extern string UnityToWxMiniGame([In] string obj0); + + + public string UnityToWxMiniGame(Dictionary args) + { +#if !UNITY_EDITOR + var jsonArgs = MiniJSON.Json.Serialize(args); + var returnStr = UnityToWxMiniGame(jsonArgs); + HCDebugger.LogWarning($"[UnityToWxMiniGame] {jsonArgs} returnStr = {returnStr}"); + return returnStr; +#else + HCDebugger.LogWarning($"[UnityToWxMiniGame] {MiniJSON.Json.Serialize(args)}"); + return ""; +#endif + } + + void OnWxCallUnity(string content) + { + HCDebugger.LogDebug($"[HCWxTools] [OnWxCallUnity] content : {content}"); + + var strings = content.Split(new[] { "#@#" }, StringSplitOptions.None); + var cmd = strings[0]; + content = strings[1]; + if (cmd.Equals("getDistinctId")) + { + HCTools.SavePlayerPrefsString(HCTools.SS_DISTINCT_ID, content); + return; + } + WxCallUnityAction?.Invoke(cmd, content); + } + } + + + [Serializable] + public class WxNativeAdEntity + { + public string cmd; + public string adPostion; + public string adUnit; + public int width; + public int height; + public int left; + public int top; + public int _fixed; + } + + [Serializable] + public class WxNativeCallback + { + public string cmd; + public string adPostion; + public string adUnit; + public int code; + public string msg; + + public string GetAdUnit(Dictionary showNativeAdUnit) + { + var adShowFailPosition = adPostion; + if (string.IsNullOrEmpty(adShowFailPosition)) + { + foreach (var (key, value) in showNativeAdUnit) + { + if (value.Equals(adUnit)) + { + return key; + } + } + } + + return null; + } + } +} +#endif \ No newline at end of file diff --git a/Assets/HCMiniSdk/Scripts/WebGL/HCWX/HCWxTools.cs.meta b/Assets/HCMiniSdk/Scripts/WebGL/HCWX/HCWxTools.cs.meta new file mode 100644 index 00000000..20772d98 --- /dev/null +++ b/Assets/HCMiniSdk/Scripts/WebGL/HCWX/HCWxTools.cs.meta @@ -0,0 +1,3 @@ +fileFormatVersion: 2 +guid: 6a8138d6e4ba4dd39b36e7082c1daedb +timeCreated: 1699842572 \ No newline at end of file diff --git a/Assets/HCMiniSdk/Scripts/WebGL/HCWebGLSDKManager.cs b/Assets/HCMiniSdk/Scripts/WebGL/HCWebGLSDKManager.cs new file mode 100644 index 00000000..8002bba9 --- /dev/null +++ b/Assets/HCMiniSdk/Scripts/WebGL/HCWebGLSDKManager.cs @@ -0,0 +1,122 @@ +namespace HC +{ + public class HCWebGLSDKManager : HCSingleton + { + public static HCIAccount Account + { + get + { +#if WEBGL_WX && !UNITY_EDITOR + return new HCWXAccount(); +#elif WEBGL_BYTEDANCE + return new HCBytedanceAccount(); +#else + return new HCAccount(); +#endif + } + } + + public static HCIAds Ads + { + get + { +#if WEBGL_WX && !UNITY_EDITOR + return HCWXAds.Instance; +#elif WEBGL_BYTEDANCE + return HCBytedanceAds.Instance; +#else + return new HCAds(); +#endif + } + } + + public static HCIAnalytics Analytics + { + get + { +#if WEBGL_WX && !UNITY_EDITOR + return new HCWXAnalytics(); +#elif WEBGL_BYTEDANCE + return new HCBytedanceAnalytics(); +#else + return new HCDefaultAnalytics(); +#endif + } + } + + private static HCIAppInfo _AppInfo; + + public static HCIAppInfo AppInfo + { + get + { + if (_AppInfo == null) + { +#if WEBGL_WX && !UNITY_EDITOR + _AppInfo = new HCWXAppInfo(); +#elif WEBGL_BYTEDANCE + _AppInfo = new HCBytedanceAppInfo(); +#else + _AppInfo = new HCAppInfo(); +#endif + } + + return _AppInfo; + + } + } + + public static HCIShare Share + { + get + { +#if WEBGL_WX && !UNITY_EDITOR + return new HCWXShare(); +#elif WEBGL_BYTEDANCE + return new HCBytedanceShare(); +#else + return new HCShare(); +#endif + } + } + + public static HCIBase Base + { + get + { +#if WEBGL_WX && !UNITY_EDITOR + return HCWXBase.Instance; +#elif WEBGL_BYTEDANCE + return new HCBytedanceBase(); +#else + return new HCBase(); +#endif + } + } + + public static HCIPurchase Purchase + { + get + { +#if WEBGL_WX && !UNITY_EDITOR + return HCWxPurchase.Instance; +#elif WEBGL_BYTEDANCE + return new HCBytedancePurchase(); +#else + return new HCPurchase(); +#endif + } + } + + protected override void OnInstanceCreate() + { + base.OnInstanceCreate(); + Purchase.Init(); + // 先屏蔽掉,后续还需要统一 +#if WEBGL_WX + var hcWxTools = HCWxTools.Instance; +#endif + var hciShare = Share; + } + } +} \ No newline at end of file diff --git a/Assets/HCMiniSdk/Scripts/WebGL/HCWebGLSDKManager.cs.meta b/Assets/HCMiniSdk/Scripts/WebGL/HCWebGLSDKManager.cs.meta new file mode 100644 index 00000000..7070a37f --- /dev/null +++ b/Assets/HCMiniSdk/Scripts/WebGL/HCWebGLSDKManager.cs.meta @@ -0,0 +1,3 @@ +fileFormatVersion: 2 +guid: b377c4a4ace8447a82f0f522fcf31075 +timeCreated: 1699347108 \ No newline at end of file diff --git a/Assets/HCMiniSdk/Scripts/WebGL/Interface.meta b/Assets/HCMiniSdk/Scripts/WebGL/Interface.meta new file mode 100644 index 00000000..b01671e9 --- /dev/null +++ b/Assets/HCMiniSdk/Scripts/WebGL/Interface.meta @@ -0,0 +1,3 @@ +fileFormatVersion: 2 +guid: b3ff21b908004b91bc0cf920e6067193 +timeCreated: 1699347622 \ No newline at end of file diff --git a/Assets/HCMiniSdk/Scripts/WebGL/Interface/HCIAccount.cs b/Assets/HCMiniSdk/Scripts/WebGL/Interface/HCIAccount.cs new file mode 100644 index 00000000..28337539 --- /dev/null +++ b/Assets/HCMiniSdk/Scripts/WebGL/Interface/HCIAccount.cs @@ -0,0 +1,19 @@ +using System; +using System.Collections.Generic; + +namespace HC +{ + public class HCLoginResult + { + public int code; + public string msg = ""; + public string token = ""; + public string userId = ""; + public Dictionary ext; + } + + public interface HCIAccount + { + void Login(Action callback); + } +} \ No newline at end of file diff --git a/Assets/HCMiniSdk/Scripts/WebGL/Interface/HCIAccount.cs.meta b/Assets/HCMiniSdk/Scripts/WebGL/Interface/HCIAccount.cs.meta new file mode 100644 index 00000000..9b73591b --- /dev/null +++ b/Assets/HCMiniSdk/Scripts/WebGL/Interface/HCIAccount.cs.meta @@ -0,0 +1,3 @@ +fileFormatVersion: 2 +guid: a29e8412805f48359c3d0f29cd532950 +timeCreated: 1699346655 \ No newline at end of file diff --git a/Assets/HCMiniSdk/Scripts/WebGL/Interface/HCIAds.cs b/Assets/HCMiniSdk/Scripts/WebGL/Interface/HCIAds.cs new file mode 100644 index 00000000..61143417 --- /dev/null +++ b/Assets/HCMiniSdk/Scripts/WebGL/Interface/HCIAds.cs @@ -0,0 +1,58 @@ +using System; +using System.Collections.Generic; + +namespace HC +{ + public interface HCIAds + { + public void InitializeSdk(Action> callback); + + public void RewardedLoad(string adUnitId); + public bool IsRewardedAdReady(string adUnitId); + + public void ShowRewardedAd(string adUnitId); + + void LoadInterstitial(string adUnitId); + + public bool IsInterstitialReady(string adUnitId); + + public void ShowInterstitial(string adUnitId); + + void CreateBanner(string adUnitId); + + void DestroyBanner(string adUnitId); + + public void ShowBanner(string adUnitId); + + public void HideBanner(string adUnitId); + + public void SetLogEnable(bool _enable); + void LoadNative(string adUnit); + void RemoveNative(string adUnit); + bool IsNativeAdReady(string adPosition); + void ShowNative(string adPosition, float x, float y, float width, float height, string pAdPos, Action _showFailedCallback = null, Action _closeCallback = null); + } + + public enum HCADSstatuscallback + { + RewardedLoadSuccess, + RewardedClose, + RewardedLoadFailed, + RewardedShowSuccess, + RewardedShowFailed, + InterstitialLoadSuccess, + InterstitialLoadFailed, + InterstitialClose, + InterstitialShowSuccess, + InterstitialShowFailed, + BannerLoadFailed, + BannerLoadSuccess, + BannerResize, + BannerDestroySuccess, + BannerDestroyFailed, + BannerShowSuccess, + BannerShowFailed, + BannerHideSuccess, + BannerHideFailed + } +} \ No newline at end of file diff --git a/Assets/HCMiniSdk/Scripts/WebGL/Interface/HCIAds.cs.meta b/Assets/HCMiniSdk/Scripts/WebGL/Interface/HCIAds.cs.meta new file mode 100644 index 00000000..9da52ebe --- /dev/null +++ b/Assets/HCMiniSdk/Scripts/WebGL/Interface/HCIAds.cs.meta @@ -0,0 +1,3 @@ +fileFormatVersion: 2 +guid: 3a798314443e4784a8ae2a20d095308c +timeCreated: 1699346919 \ No newline at end of file diff --git a/Assets/HCMiniSdk/Scripts/WebGL/Interface/HCIAnalytics.cs b/Assets/HCMiniSdk/Scripts/WebGL/Interface/HCIAnalytics.cs new file mode 100644 index 00000000..424b79a0 --- /dev/null +++ b/Assets/HCMiniSdk/Scripts/WebGL/Interface/HCIAnalytics.cs @@ -0,0 +1,10 @@ +using System.Collections.Generic; +using JetBrains.Annotations; + +namespace HC +{ + public interface HCIAnalytics + { + void TrackEvent(string eventName, [CanBeNull] Dictionary eventDic = null); + } +} \ No newline at end of file diff --git a/Assets/HCMiniSdk/Scripts/WebGL/Interface/HCIAnalytics.cs.meta b/Assets/HCMiniSdk/Scripts/WebGL/Interface/HCIAnalytics.cs.meta new file mode 100644 index 00000000..2e9054dc --- /dev/null +++ b/Assets/HCMiniSdk/Scripts/WebGL/Interface/HCIAnalytics.cs.meta @@ -0,0 +1,3 @@ +fileFormatVersion: 2 +guid: b21e2da936344fbfadfd7bfbb9ef4f7c +timeCreated: 1699346934 \ No newline at end of file diff --git a/Assets/HCMiniSdk/Scripts/WebGL/Interface/HCIAppInfo.cs b/Assets/HCMiniSdk/Scripts/WebGL/Interface/HCIAppInfo.cs new file mode 100644 index 00000000..2b351618 --- /dev/null +++ b/Assets/HCMiniSdk/Scripts/WebGL/Interface/HCIAppInfo.cs @@ -0,0 +1,18 @@ +using System.Collections.Generic; + +namespace HC +{ + public interface HCIAppInfo + { + string GetBundleID(); + + // WX.GetAccountInfoSync().miniProgram.version + string GetVersion(); + string GetModel(); + string GetBrand(); + string GetLanguage(); + string GetSystemName(); + Dictionary GetBaseInfo(); + string GetPlatform(); + } +} \ No newline at end of file diff --git a/Assets/HCMiniSdk/Scripts/WebGL/Interface/HCIAppInfo.cs.meta b/Assets/HCMiniSdk/Scripts/WebGL/Interface/HCIAppInfo.cs.meta new file mode 100644 index 00000000..eb958b2a --- /dev/null +++ b/Assets/HCMiniSdk/Scripts/WebGL/Interface/HCIAppInfo.cs.meta @@ -0,0 +1,3 @@ +fileFormatVersion: 2 +guid: a336691004254e02a60eb2fbac43dbd3 +timeCreated: 1699531335 \ No newline at end of file diff --git a/Assets/HCMiniSdk/Scripts/WebGL/Interface/HCIBase.cs b/Assets/HCMiniSdk/Scripts/WebGL/Interface/HCIBase.cs new file mode 100644 index 00000000..f2f1d677 --- /dev/null +++ b/Assets/HCMiniSdk/Scripts/WebGL/Interface/HCIBase.cs @@ -0,0 +1,30 @@ +using System; +using System.Collections.Generic; + +namespace HC +{ + public interface HCIBase + { + void Vibrate(int shakeType, float intensity = 1); +#if UNITY_WEBGL && WEBGL_BYTEDANCE + bool StartRecord(bool isRecordAudio, int maxRecordTimeSec = 600, Action startCallback = null, Action errorCallback = null, Action timeoutCallback = null); + bool StopRecord(Action completeCallback = null, Action errorCallback = null, List clipRanges = null, bool autoMerge = true); + + void CheckScene(string scene, Action success, Action complete, Action error); + void NavigateToScene(string scene, Action success, Action complete, Action error); + void OnShowWithDict(Action> param); +#endif + void OpenCustomerService(Dictionary param); + + void ExitApp(); + } + + public struct TimeRange + { + /// 开始时间,单位ms + public int start; + + /// 结束时间,单位ms + public int end; + } +} \ No newline at end of file diff --git a/Assets/HCMiniSdk/Scripts/WebGL/Interface/HCIBase.cs.meta b/Assets/HCMiniSdk/Scripts/WebGL/Interface/HCIBase.cs.meta new file mode 100644 index 00000000..2c388dc3 --- /dev/null +++ b/Assets/HCMiniSdk/Scripts/WebGL/Interface/HCIBase.cs.meta @@ -0,0 +1,3 @@ +fileFormatVersion: 2 +guid: 114c430b7f2d4153a41efb1fda942056 +timeCreated: 1699587124 \ No newline at end of file diff --git a/Assets/HCMiniSdk/Scripts/WebGL/Interface/HCIPurchase.cs b/Assets/HCMiniSdk/Scripts/WebGL/Interface/HCIPurchase.cs new file mode 100644 index 00000000..8207d94c --- /dev/null +++ b/Assets/HCMiniSdk/Scripts/WebGL/Interface/HCIPurchase.cs @@ -0,0 +1,43 @@ +using System; +using System.Collections.Generic; + +namespace HC +{ + public interface HCIPurchase + { + void Init(); + + void Buy(HCPaymentArgs paymentArgs); + + void Awarded(string orderID); + } + + [Serializable] + public class HCPaymentArgs + { + /// + /// 商品id + /// + public string productId; + + /// + /// 商品名字 + /// + public string productName; + + /// + /// 商品金额 ,单位 (分) 1元 = 100分 + /// + public int money; + + /// + /// 扩展参数 + /// + public string gameExtraParam; + + /// + /// 预留 + /// + public Dictionary ext; + } +} \ No newline at end of file diff --git a/Assets/HCMiniSdk/Scripts/WebGL/Interface/HCIPurchase.cs.meta b/Assets/HCMiniSdk/Scripts/WebGL/Interface/HCIPurchase.cs.meta new file mode 100644 index 00000000..efec630e --- /dev/null +++ b/Assets/HCMiniSdk/Scripts/WebGL/Interface/HCIPurchase.cs.meta @@ -0,0 +1,3 @@ +fileFormatVersion: 2 +guid: 9afa1b90a6894bf295acde17db54105a +timeCreated: 1699346950 \ No newline at end of file diff --git a/Assets/HCMiniSdk/Scripts/WebGL/Interface/HCIShare.cs b/Assets/HCMiniSdk/Scripts/WebGL/Interface/HCIShare.cs new file mode 100644 index 00000000..a688ceba --- /dev/null +++ b/Assets/HCMiniSdk/Scripts/WebGL/Interface/HCIShare.cs @@ -0,0 +1,14 @@ +using System; +using JetBrains.Annotations; + +namespace HC +{ + public interface HCIShare + { + void Share(string title, [CanBeNull] string imgUrl, [CanBeNull] string content, [CanBeNull] Action callback, int type = 0); + +#if WEBGL_BYTEDANCE + void DYShare(Action callback, StarkSDKSpace.UNBridgeLib.LitJson.JsonData jsonData); +#endif + } +} \ No newline at end of file diff --git a/Assets/HCMiniSdk/Scripts/WebGL/Interface/HCIShare.cs.meta b/Assets/HCMiniSdk/Scripts/WebGL/Interface/HCIShare.cs.meta new file mode 100644 index 00000000..0879004f --- /dev/null +++ b/Assets/HCMiniSdk/Scripts/WebGL/Interface/HCIShare.cs.meta @@ -0,0 +1,3 @@ +fileFormatVersion: 2 +guid: 816906aab5d34785b3362b8072211579 +timeCreated: 1699586225 \ No newline at end of file diff --git a/Assets/HCMiniSdk/Third.meta b/Assets/HCMiniSdk/Third.meta new file mode 100644 index 00000000..3dc027df --- /dev/null +++ b/Assets/HCMiniSdk/Third.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: 143afa026ade542dda1e91c768aa1924 +folderAsset: yes +DefaultImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/HCMiniSdk/Third/ta.meta b/Assets/HCMiniSdk/Third/ta.meta new file mode 100644 index 00000000..19fc4623 --- /dev/null +++ b/Assets/HCMiniSdk/Third/ta.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: 5eb58b860995749ef9aa665d2fa3708f +folderAsset: yes +DefaultImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/HCMiniSdk/Third/ta/Editor.meta b/Assets/HCMiniSdk/Third/ta/Editor.meta new file mode 100644 index 00000000..b2406b50 --- /dev/null +++ b/Assets/HCMiniSdk/Third/ta/Editor.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: d0483b4febec94ff283572eaa4168d65 +folderAsset: yes +DefaultImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/Plugins/ByteGame/com.bytedance.starksdk.unitytools/unityTools.asmdef b/Assets/HCMiniSdk/Third/ta/Editor/TDAnalytics_Editor.asmdef similarity index 75% rename from Assets/Plugins/ByteGame/com.bytedance.starksdk.unitytools/unityTools.asmdef rename to Assets/HCMiniSdk/Third/ta/Editor/TDAnalytics_Editor.asmdef index 1e86e113..744d908f 100644 --- a/Assets/Plugins/ByteGame/com.bytedance.starksdk.unitytools/unityTools.asmdef +++ b/Assets/HCMiniSdk/Third/ta/Editor/TDAnalytics_Editor.asmdef @@ -1,15 +1,17 @@ -{ - "name": "UnityTools", - "references": [], - "includePlatforms": [ - "Editor" - ], - "excludePlatforms": [], - "allowUnsafeCode": false, - "overrideReferences": false, - "precompiledReferences": [], - "autoReferenced": true, - "defineConstraints": [], - "versionDefines": [], - "noEngineReferences": false +{ + "name": "ThinkingAnalytics-Editor", + "references": [ + "ThinkingAnalytics" + ], + "includePlatforms": [ + "Editor" + ], + "excludePlatforms": [], + "allowUnsafeCode": false, + "overrideReferences": false, + "precompiledReferences": [], + "autoReferenced": true, + "defineConstraints": [], + "versionDefines": [], + "noEngineReferences": false } \ No newline at end of file diff --git a/Assets/Plugins/ByteGame/com.bytedance.starksdk.unitytools/unityTools.asmdef.meta b/Assets/HCMiniSdk/Third/ta/Editor/TDAnalytics_Editor.asmdef.meta similarity index 73% rename from Assets/Plugins/ByteGame/com.bytedance.starksdk.unitytools/unityTools.asmdef.meta rename to Assets/HCMiniSdk/Third/ta/Editor/TDAnalytics_Editor.asmdef.meta index db83c32a..b765216f 100644 --- a/Assets/Plugins/ByteGame/com.bytedance.starksdk.unitytools/unityTools.asmdef.meta +++ b/Assets/HCMiniSdk/Third/ta/Editor/TDAnalytics_Editor.asmdef.meta @@ -1,7 +1,7 @@ -fileFormatVersion: 2 -guid: 0df35c79eba75be4b98b1cef0019f3f7 -AssemblyDefinitionImporter: - externalObjects: {} - userData: - assetBundleName: - assetBundleVariant: +fileFormatVersion: 2 +guid: dbc881e260fba43c3b36c3da8364a4b1 +AssemblyDefinitionImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/HCMiniSdk/Third/ta/Editor/TDInspectors.cs b/Assets/HCMiniSdk/Third/ta/Editor/TDInspectors.cs new file mode 100644 index 00000000..2f698269 --- /dev/null +++ b/Assets/HCMiniSdk/Third/ta/Editor/TDInspectors.cs @@ -0,0 +1,140 @@ +using UnityEngine; +using UnityEditor; +using UnityEditorInternal; + +namespace ThinkingData.Analytics.Editors +{ + [CustomEditor(typeof(TDAnalytics))] + [CanEditMultipleObjects] + public class TD_Inspectors : Editor + { + private ReorderableList _stringArray; + + public void OnEnable() + { + + var appId = this.serializedObject.FindProperty("configs"); + + _stringArray = new ReorderableList(appId.serializedObject, appId, true, true, true, true) + { + drawHeaderCallback = DrawListHeader, + drawElementCallback = DrawListElement, + onRemoveCallback = RemoveListElement, + onAddCallback = AddListElement + }; + + _stringArray.elementHeight = 5 * (EditorGUIUtility.singleLineHeight + 10); + + _stringArray.serializedProperty.isExpanded = true; + } + + void DrawListHeader(Rect rect) + { + var arect = rect; + arect.height = EditorGUIUtility.singleLineHeight + 10; + arect.x += 14; + arect.width = 80; + GUIStyle style = new GUIStyle(); + style.fontStyle = FontStyle.Bold; + + GUI.Label(arect, "Instance Configurations", style); + } + + void DrawListElement(Rect rect, int index, bool isActive, bool isFocused) + { + var spacing = 5; + var xSpacing = 85; + var arect = rect; + SerializedProperty item = _stringArray.serializedProperty.GetArrayElementAtIndex(index); + var serElem = this._stringArray.serializedProperty.GetArrayElementAtIndex(index); + arect.height = EditorGUIUtility.singleLineHeight; + arect.width = 240; + + if (index == 0) + { + EditorGUI.PropertyField(arect, item, new GUIContent((index + 1) + " (default)")); + } + else + { + EditorGUI.PropertyField(arect, item, new GUIContent("" + (index + 1))); + + } + arect.y += EditorGUIUtility.singleLineHeight + spacing; + GUIStyle style = new GUIStyle(); + style.fontStyle = FontStyle.Bold; + + + EditorGUI.LabelField(arect, "APP ID:", style); + arect.x += xSpacing; + EditorGUI.PropertyField(arect, serElem.FindPropertyRelative("appId"), GUIContent.none); + + arect.y += EditorGUIUtility.singleLineHeight + spacing; + arect.x -= xSpacing; + + EditorGUI.LabelField(arect, "SERVER URL:", style); + arect.x += xSpacing; + EditorGUI.PropertyField(new Rect(arect.x, arect.y, arect.width, arect.height), serElem.FindPropertyRelative("serverUrl"), GUIContent.none); + + arect.y += EditorGUIUtility.singleLineHeight + spacing; + arect.x -= xSpacing; + + EditorGUI.LabelField(arect, "MODE:", style); + arect.x += xSpacing; + EditorGUI.PropertyField(arect, serElem.FindPropertyRelative("mode"), GUIContent.none); + + arect.y += EditorGUIUtility.singleLineHeight + spacing; + arect.x -= xSpacing; + + EditorGUI.LabelField(arect, "TimeZone:", style); + arect.x += xSpacing; + var a = serElem.FindPropertyRelative("timeZone"); + if (a.intValue == 100) + { + EditorGUI.PropertyField(new Rect(arect.x, arect.y, 115, arect.height), a, GUIContent.none); + arect.x += 125; + EditorGUI.PropertyField(new Rect(arect.x, arect.y, 115, arect.height), serElem.FindPropertyRelative("timeZoneId"), GUIContent.none); + } + else + { + EditorGUI.PropertyField(arect, a, GUIContent.none); + } + } + + void AddListElement(ReorderableList list) + { + if (list.serializedProperty != null) + { + list.serializedProperty.arraySize++; + list.index = list.serializedProperty.arraySize - 1; + SerializedProperty item = list.serializedProperty.GetArrayElementAtIndex(list.index); + item.FindPropertyRelative("appId").stringValue = ""; + } + else + { + ReorderableList.defaultBehaviours.DoAddButton(list); + } + } + + void RemoveListElement(ReorderableList list) + { + if (EditorUtility.DisplayDialog("Warnning", "Do you want to remove this element?", "Remove", "Cancel")) + { + ReorderableList.defaultBehaviours.DoRemoveButton(list); + } + } + + public override void OnInspectorGUI() + { + DrawDefaultInspector(); + this.serializedObject.Update(); + var property = _stringArray.serializedProperty; + property.isExpanded = EditorGUILayout.Foldout(property.isExpanded, property.displayName); + if (property.isExpanded) + { + + _stringArray.DoLayoutList(); + } + serializedObject.ApplyModifiedProperties(); + } + } +} diff --git a/Assets/HCMiniSdk/Third/ta/Editor/TDInspectors.cs.meta b/Assets/HCMiniSdk/Third/ta/Editor/TDInspectors.cs.meta new file mode 100644 index 00000000..d24fd672 --- /dev/null +++ b/Assets/HCMiniSdk/Third/ta/Editor/TDInspectors.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: 9e175a5169e2c4de78d15b28f2ce6520 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/HCMiniSdk/Third/ta/Editor/TDPostprocessBuild.cs b/Assets/HCMiniSdk/Third/ta/Editor/TDPostprocessBuild.cs new file mode 100644 index 00000000..0c60fed0 --- /dev/null +++ b/Assets/HCMiniSdk/Third/ta/Editor/TDPostprocessBuild.cs @@ -0,0 +1,104 @@ +#if UNITY_EDITOR && UNITY_IOS +using System.IO; +using ThinkingData.Analytics.Utils; +using UnityEditor; +using UnityEditor.Callbacks; +using UnityEditor.iOS.Xcode; +using UnityEngine; + +namespace ThinkingData.Analytics.Editors +{ + public class TD_PostProcessBuild + { + //Xcode Build Settings + //[PostProcessBuild] + [PostProcessBuildAttribute(88)] + public static void OnPostProcessBuild(BuildTarget target, string targetPath) + { + if (target != BuildTarget.iOS) + { + Debug.LogWarning("[ThinkingData] Warning: Target is not iOS. XCodePostProcess will not run"); + return; + } + + string projPath = Path.GetFullPath(targetPath) + "/Unity-iPhone.xcodeproj/project.pbxproj"; + + PBXProject proj = new PBXProject(); + proj.ReadFromFile(projPath); +#if UNITY_2019_3_OR_NEWER + string targetGuid = proj.GetUnityFrameworkTargetGuid(); +#else + string targetGuid = proj.TargetGuidByName(PBXProject.GetUnityTargetName()); +#endif + + //Build Property + proj.SetBuildProperty(targetGuid, "ENABLE_BITCODE", "NO");//BitCode NO + proj.SetBuildProperty(targetGuid, "GCC_ENABLE_OBJC_EXCEPTIONS", "YES");//Enable Objective-C Exceptions + proj.AddBuildProperty(targetGuid, "OTHER_LDFLAGS", "-ObjC"); + + string[] headerSearchPathsToAdd = { "$(SRCROOT)/Libraries/Plugins/iOS/ThinkingSDK/Source/main", "$(SRCROOT)/Libraries/Plugins/iOS/ThinkingSDK/Source/common" }; + proj.UpdateBuildProperty(targetGuid, "HEADER_SEARCH_PATHS", headerSearchPathsToAdd, null);// Header Search Paths + + //Add Frameworks + proj.AddFrameworkToProject(targetGuid, "WebKit.framework", true); + proj.AddFrameworkToProject(targetGuid, "CoreTelephony.framework", true); + proj.AddFrameworkToProject(targetGuid, "SystemConfiguration.framework", true); + proj.AddFrameworkToProject(targetGuid, "Security.framework", true); + proj.AddFrameworkToProject(targetGuid, "UserNotifications.framework", true); + + //Add Lib + proj.AddFileToBuild(targetGuid, proj.AddFile("usr/lib/libsqlite3.tbd", "libsqlite3.tbd", PBXSourceTree.Sdk)); + proj.AddFileToBuild(targetGuid, proj.AddFile("usr/lib/libz.tbd", "libz.tbd", PBXSourceTree.Sdk)); + + proj.WriteToFile(projPath); + + //Info.plist + //Disable preset properties + string plistPath = Path.Combine(targetPath, "Info.plist"); + PlistDocument plist = new PlistDocument(); + plist.ReadFromFile(plistPath); + plist.root.CreateArray("TDDisPresetProperties"); + TDPublicConfig.GetPublicConfig(); + foreach (string item in TDPublicConfig.DisPresetProperties) + { + plist.root["TDDisPresetProperties"].AsArray().AddString(item); + } + plist.WriteToFile(plistPath); + } + } +} +#endif + + +#if UNITY_EDITOR && UNITY_ANDROID && UNITY_2019_1_OR_NEWER +using UnityEditor; +using UnityEditor.Android; +using UnityEngine; +using System.IO; +using System.Xml; +using System.Collections.Generic; + +namespace ThinkingData.Analytics.Editors +{ + + class TD_PostProcessBuild : IPostGenerateGradleAndroidProject + { + // Copy configuration file ta_public_config.xml + public int callbackOrder { get { return 0; } } + public void OnPostGenerateGradleAndroidProject(string path) + { + // Copy configuration file ta_public_config.xml + string desPath = path + "/../launcher/src/main/res/values/ta_public_config.xml"; + if (File.Exists(desPath)) + { + File.Delete(desPath); + } + TextAsset textAsset = Resources.Load("ta_public_config"); + if (textAsset != null && textAsset.bytes != null) + { + File.WriteAllBytes(desPath, textAsset.bytes); + } + } + } +} +#endif diff --git a/Assets/HCMiniSdk/Third/ta/Editor/TDPostprocessBuild.cs.meta b/Assets/HCMiniSdk/Third/ta/Editor/TDPostprocessBuild.cs.meta new file mode 100644 index 00000000..340f92a7 --- /dev/null +++ b/Assets/HCMiniSdk/Third/ta/Editor/TDPostprocessBuild.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: 75476b67117c64ab1a25a2b94db96dcb +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/HCMiniSdk/Third/ta/Plugins.meta b/Assets/HCMiniSdk/Third/ta/Plugins.meta new file mode 100644 index 00000000..dae8788e --- /dev/null +++ b/Assets/HCMiniSdk/Third/ta/Plugins.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: c26d18832cbd64cc7856c01ac6d5deb5 +folderAsset: yes +DefaultImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/Plugins/ByteGame/com.bytedance.starksdk/Android.meta b/Assets/HCMiniSdk/Third/ta/Plugins/Android.meta similarity index 73% rename from Assets/Plugins/ByteGame/com.bytedance.starksdk/Android.meta rename to Assets/HCMiniSdk/Third/ta/Plugins/Android.meta index 4ede01b0..ec6117b4 100644 --- a/Assets/Plugins/ByteGame/com.bytedance.starksdk/Android.meta +++ b/Assets/HCMiniSdk/Third/ta/Plugins/Android.meta @@ -1,8 +1,8 @@ -fileFormatVersion: 2 -guid: bfffc393e266340498dd1a597fbf910f -folderAsset: yes -DefaultImporter: - externalObjects: {} - userData: - assetBundleName: - assetBundleVariant: +fileFormatVersion: 2 +guid: 89fe14a74ae0f4916a24ea021891c1b9 +folderAsset: yes +DefaultImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/HCMiniSdk/Third/ta/Plugins/PC.meta b/Assets/HCMiniSdk/Third/ta/Plugins/PC.meta new file mode 100644 index 00000000..bbe9ed97 --- /dev/null +++ b/Assets/HCMiniSdk/Third/ta/Plugins/PC.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: b5e64871c9af447029fea9ebb8a01507 +folderAsset: yes +DefaultImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/HCMiniSdk/Third/ta/Plugins/PC/AutoTrack.meta b/Assets/HCMiniSdk/Third/ta/Plugins/PC/AutoTrack.meta new file mode 100644 index 00000000..ca4fbe3f --- /dev/null +++ b/Assets/HCMiniSdk/Third/ta/Plugins/PC/AutoTrack.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: eefcaefb9c6534ae78d8e6d4345a9531 +folderAsset: yes +DefaultImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/HCMiniSdk/Third/ta/Plugins/PC/AutoTrack/ThinkingSDKAutoTrack.cs b/Assets/HCMiniSdk/Third/ta/Plugins/PC/AutoTrack/ThinkingSDKAutoTrack.cs new file mode 100644 index 00000000..5aceb949 --- /dev/null +++ b/Assets/HCMiniSdk/Third/ta/Plugins/PC/AutoTrack/ThinkingSDKAutoTrack.cs @@ -0,0 +1,213 @@ +using System.Collections.Generic; +using UnityEngine; +using ThinkingSDK.PC.Main; +using ThinkingSDK.PC.Storage; +using ThinkingSDK.PC.Utils; +using ThinkingSDK.PC.Constant; +public class ThinkingSDKAutoTrack : MonoBehaviour +{ + private string mAppId; + private TDAutoTrackEventType mAutoTrackEvents = TDAutoTrackEventType.None; + private Dictionary> mAutoTrackProperties = new Dictionary>(); + private bool mStarted = false; + private TDAutoTrackEventHandler_PC mEventCallback_PC; + + private static string TDAutoTrackEventType_APP_START = "AppStart"; + private static string TDAutoTrackEventType_APP_END = "AppEnd"; + private static string TDAutoTrackEventType_APP_CRASH = "AppCrash"; + private static string TDAutoTrackEventType_APP_INSTALL = "AppInstall"; + + // Start is called before the first frame update + void Start() + { + } + void OnApplicationFocus(bool hasFocus) + { + if (hasFocus) + { + if ((mAutoTrackEvents & TDAutoTrackEventType.AppStart) != 0) + { + Dictionary properties = new Dictionary(); + if (mAutoTrackProperties.ContainsKey(TDAutoTrackEventType_APP_START)) + { + ThinkingSDKUtil.AddDictionary(properties, mAutoTrackProperties[TDAutoTrackEventType_APP_START]); + } + if (mEventCallback_PC != null) + { + ThinkingSDKUtil.AddDictionary(properties, mEventCallback_PC.AutoTrackEventCallback_PC((int) TDAutoTrackEventType.AppStart, properties)); + } + ThinkingPCSDK.Track(ThinkingSDKConstant.START_EVENT, properties, this.mAppId); + } + if ((mAutoTrackEvents & TDAutoTrackEventType.AppEnd) != 0) + { + ThinkingPCSDK.TimeEvent(ThinkingSDKConstant.END_EVENT, this.mAppId); + } + + ThinkingPCSDK.PauseTimeEvent(false, appId: this.mAppId); + } + else + { + if ((mAutoTrackEvents & TDAutoTrackEventType.AppEnd) != 0) + { + Dictionary properties = new Dictionary(); + if (mAutoTrackProperties.ContainsKey(TDAutoTrackEventType_APP_END)) + { + ThinkingSDKUtil.AddDictionary(properties, mAutoTrackProperties[TDAutoTrackEventType_APP_END]); + } + if (mEventCallback_PC != null) + { + ThinkingSDKUtil.AddDictionary(properties, mEventCallback_PC.AutoTrackEventCallback_PC((int) TDAutoTrackEventType.AppEnd, properties)); + } + ThinkingPCSDK.Track(ThinkingSDKConstant.END_EVENT, properties, this.mAppId); + } + ThinkingPCSDK.Flush(this.mAppId); + + ThinkingPCSDK.PauseTimeEvent(true, appId: this.mAppId); + } + } + + void OnApplicationQuit() + { + if (Application.isFocused == true) + { + OnApplicationFocus(false); + } + //ThinkingPCSDK.FlushImmediately(this.mAppId); + } + + public void SetAppId(string appId) + { + this.mAppId = appId; + } + + public void EnableAutoTrack(TDAutoTrackEventType events, Dictionary properties, string appId) + { + SetAutoTrackProperties(events, properties); + if ((events & TDAutoTrackEventType.AppInstall) != 0) + { + object result = ThinkingSDKFile.GetData(appId, ThinkingSDKConstant.IS_INSTALL, typeof(int)); + if (result == null) + { + Dictionary mProperties = new Dictionary(properties); + ThinkingSDKFile.SaveData(appId, ThinkingSDKConstant.IS_INSTALL, 1); + if (mAutoTrackProperties.ContainsKey(TDAutoTrackEventType_APP_INSTALL)) + { + ThinkingSDKUtil.AddDictionary(mProperties, mAutoTrackProperties[TDAutoTrackEventType_APP_INSTALL]); + } + ThinkingPCSDK.Track(ThinkingSDKConstant.INSTALL_EVENT, mProperties, this.mAppId); + ThinkingPCSDK.Flush(this.mAppId); + } + } + if ((events & TDAutoTrackEventType.AppStart) != 0 && mStarted == false) + { + Dictionary mProperties = new Dictionary(properties); + if (mAutoTrackProperties.ContainsKey(TDAutoTrackEventType_APP_START)) + { + ThinkingSDKUtil.AddDictionary(mProperties, mAutoTrackProperties[TDAutoTrackEventType_APP_START]); + } + ThinkingPCSDK.Track(ThinkingSDKConstant.START_EVENT, mProperties, this.mAppId); + ThinkingPCSDK.Flush(this.mAppId); + } + if ((events & TDAutoTrackEventType.AppEnd) != 0 && mStarted == false) + { + ThinkingPCSDK.TimeEvent(ThinkingSDKConstant.END_EVENT, this.mAppId); + } + + mStarted = true; + } + + public void EnableAutoTrack(TDAutoTrackEventType events, TDAutoTrackEventHandler_PC eventCallback, string appId) + { + mAutoTrackEvents = events; + mEventCallback_PC = eventCallback; + if ((events & TDAutoTrackEventType.AppInstall) != 0) + { + object result = ThinkingSDKFile.GetData(appId, ThinkingSDKConstant.IS_INSTALL, typeof(int)); + if (result == null) + { + ThinkingSDKFile.SaveData(appId, ThinkingSDKConstant.IS_INSTALL, 1); + Dictionary properties = null; + if (mAutoTrackProperties.ContainsKey(TDAutoTrackEventType_APP_INSTALL)) + { + properties = mAutoTrackProperties[TDAutoTrackEventType_APP_INSTALL]; + } + else + { + properties = new Dictionary(); + } + if (mEventCallback_PC != null) + { + ThinkingSDKUtil.AddDictionary(properties, mEventCallback_PC.AutoTrackEventCallback_PC((int)TDAutoTrackEventType.AppInstall, properties)); + } + ThinkingPCSDK.Track(ThinkingSDKConstant.INSTALL_EVENT, properties, this.mAppId); + ThinkingPCSDK.Flush(this.mAppId); + } + } + if ((events & TDAutoTrackEventType.AppStart) != 0 && mStarted == false) + { + Dictionary properties = null; + if (mAutoTrackProperties.ContainsKey(TDAutoTrackEventType_APP_START)) + { + properties = mAutoTrackProperties[TDAutoTrackEventType_APP_START]; + } + else + { + properties = new Dictionary(); + } + if (mEventCallback_PC != null) + { + ThinkingSDKUtil.AddDictionary(properties, mEventCallback_PC.AutoTrackEventCallback_PC((int) TDAutoTrackEventType.AppStart, properties)); + } + ThinkingPCSDK.Track(ThinkingSDKConstant.START_EVENT, properties, this.mAppId); + ThinkingPCSDK.Flush(this.mAppId); + } + if ((events & TDAutoTrackEventType.AppEnd) != 0 && mStarted == false) + { + ThinkingPCSDK.TimeEvent(ThinkingSDKConstant.END_EVENT, this.mAppId); + } + + mStarted = true; + } + + public void SetAutoTrackProperties(TDAutoTrackEventType events, Dictionary properties) + { + mAutoTrackEvents = events; + if ((events & TDAutoTrackEventType.AppInstall) != 0) + { + if (mAutoTrackProperties.ContainsKey(TDAutoTrackEventType_APP_INSTALL)) + { + ThinkingSDKUtil.AddDictionary(mAutoTrackProperties[TDAutoTrackEventType_APP_INSTALL], properties); + } + else + mAutoTrackProperties[TDAutoTrackEventType_APP_INSTALL] = properties; + } + if ((events & TDAutoTrackEventType.AppStart) != 0) + { + if (mAutoTrackProperties.ContainsKey(TDAutoTrackEventType_APP_START)) + { + ThinkingSDKUtil.AddDictionary(mAutoTrackProperties[TDAutoTrackEventType_APP_START], properties); + } + else + mAutoTrackProperties[TDAutoTrackEventType_APP_START] = properties; + } + if ((events & TDAutoTrackEventType.AppEnd) != 0) + { + if (mAutoTrackProperties.ContainsKey(TDAutoTrackEventType_APP_END)) + { + ThinkingSDKUtil.AddDictionary(mAutoTrackProperties[TDAutoTrackEventType_APP_END], properties); + } + else + mAutoTrackProperties[TDAutoTrackEventType_APP_END] = properties; + } + if ((events & TDAutoTrackEventType.AppCrash) != 0) + { + if (mAutoTrackProperties.ContainsKey(TDAutoTrackEventType_APP_CRASH)) + { + ThinkingSDKUtil.AddDictionary(mAutoTrackProperties[TDAutoTrackEventType_APP_CRASH], properties); + } + else + mAutoTrackProperties[TDAutoTrackEventType_APP_CRASH] = properties; + } + } + +} diff --git a/Assets/HCMiniSdk/Third/ta/Plugins/PC/AutoTrack/ThinkingSDKAutoTrack.cs.meta b/Assets/HCMiniSdk/Third/ta/Plugins/PC/AutoTrack/ThinkingSDKAutoTrack.cs.meta new file mode 100644 index 00000000..5401f4e4 --- /dev/null +++ b/Assets/HCMiniSdk/Third/ta/Plugins/PC/AutoTrack/ThinkingSDKAutoTrack.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: 0ac1f96dfbfb046e79d0e2f5c3d94261 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/HCMiniSdk/Third/ta/Plugins/PC/Config.meta b/Assets/HCMiniSdk/Third/ta/Plugins/PC/Config.meta new file mode 100644 index 00000000..0d08ab07 --- /dev/null +++ b/Assets/HCMiniSdk/Third/ta/Plugins/PC/Config.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: 255aaff7c590d43c0893234eb5279770 +folderAsset: yes +DefaultImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/HCMiniSdk/Third/ta/Plugins/PC/Config/ThinkingSDKConfig.cs b/Assets/HCMiniSdk/Third/ta/Plugins/PC/Config/ThinkingSDKConfig.cs new file mode 100644 index 00000000..904c9550 --- /dev/null +++ b/Assets/HCMiniSdk/Third/ta/Plugins/PC/Config/ThinkingSDKConfig.cs @@ -0,0 +1,192 @@ +using System; +using System.Collections.Generic; +using ThinkingSDK.PC.Utils; +using ThinkingSDK.PC.Request; +using ThinkingSDK.PC.Constant; +using UnityEngine; +using System.Collections; + +namespace ThinkingSDK.PC.Config +{ + public enum Mode + { + /* normal mode, the data will be stored in the cache and reported in batches */ + NORMAL, + /* debug mode, the data will be reported one by one */ + DEBUG, + /* debug only mode, only verify the data, and will not store it */ + DEBUG_ONLY + } + public class ThinkingSDKConfig + { + private string mToken; + private string mServerUrl; + private string mNormalUrl; + private string mDebugUrl; + private string mConfigUrl; + private string mInstanceName; + private Mode mMode = Mode.NORMAL; + private TimeZoneInfo mTimeZone; + public int mUploadInterval = 30; + public int mUploadSize = 30; + private List mDisableEvents = new List(); + private static Dictionary sInstances = new Dictionary(); + private ResponseHandle mCallback; + private ThinkingSDKConfig(string token,string serverUrl, string instanceName) + { + //verify server url + serverUrl = this.VerifyUrl(serverUrl); + this.mServerUrl = serverUrl; + this.mNormalUrl = serverUrl + "/sync"; + this.mDebugUrl = serverUrl + "/data_debug"; + this.mConfigUrl = serverUrl + "/config"; + this.mToken = token; + this.mInstanceName = instanceName; + try + { + this.mTimeZone = TimeZoneInfo.Local; + } + catch (Exception) + { + //if (ThinkingSDKPublicConfig.IsPrintLog()) ThinkingSDKLogger.Print("TimeZoneInfo initial failed :" + e.Message); + } + } + private string VerifyUrl(string serverUrl) + { + Uri uri = new Uri(serverUrl); + serverUrl = uri.Scheme + "://" + uri.Host + ":" + uri.Port; + return serverUrl; + } + public void SetMode(Mode mode) + { + this.mMode = mode; + } + public Mode GetMode() + { + return this.mMode; + } + public string DebugURL() + { + return this.mDebugUrl; + } + public string NormalURL() + { + return this.mNormalUrl; + } + public string ConfigURL() + { + return this.mConfigUrl; + } + public string Server() + { + return this.mServerUrl; + } + public string InstanceName() + { + return this.mInstanceName; + } + public static ThinkingSDKConfig GetInstance(string token, string server, string instanceName) + { + ThinkingSDKConfig config = null; + if (!string.IsNullOrEmpty(instanceName)) + { + if (sInstances.ContainsKey(instanceName)) + { + config = sInstances[instanceName]; + } + else + { + config = new ThinkingSDKConfig(token, server, instanceName); + sInstances.Add(instanceName, config); + } + } + else + { + if (sInstances.ContainsKey(token)) + { + config = sInstances[token]; + } + else + { + config = new ThinkingSDKConfig(token, server, null); + sInstances.Add(token, config); + } + } + return config; + } + public void SetTimeZone(TimeZoneInfo timeZoneInfo) + { + this.mTimeZone = timeZoneInfo; + } + public TimeZoneInfo TimeZone() + { + return this.mTimeZone; + } + public List DisableEvents() { + return this.mDisableEvents; + } + public bool IsDisabledEvent(string eventName) + { + if (this.mDisableEvents == null) + { + return false; + } + else + { + return this.mDisableEvents.Contains(eventName); + } + } + public void UpdateConfig(MonoBehaviour mono, ResponseHandle callback = null) + { + mCallback = callback; + mono.StartCoroutine(this.GetWithFORM(this.mConfigUrl,this.mToken,null, ConfigResponseHandle)); + } + + private void ConfigResponseHandle(Dictionary result) + { + try + { + int code = int.Parse(result["code"].ToString()); + if (result != null && code == 0) + { + Dictionary data = (Dictionary)result["data"]; + if (ThinkingSDKPublicConfig.IsPrintLog()) ThinkingSDKLogger.Print("Get remote config success: " + ThinkingSDKJSON.Serialize(data)); + foreach (KeyValuePair kv in data) + { + if (kv.Key == "sync_interval") + { + this.mUploadInterval = int.Parse(kv.Value.ToString()); + } + else if (kv.Key == "sync_batch_size") + { + this.mUploadSize = int.Parse(kv.Value.ToString()); + } + else if (kv.Key == "disable_event_list") + { + foreach (var item in (List)kv.Value) + { + this.mDisableEvents.Add((string)item); + } + } + } + } + else + { + if (ThinkingSDKPublicConfig.IsPrintLog()) ThinkingSDKLogger.Print("Get remote config failed: " + ThinkingSDKJSON.Serialize(result)); + } + } + catch (Exception ex) + { + if (ThinkingSDKPublicConfig.IsPrintLog()) ThinkingSDKLogger.Print("Get remote config failed: " + ex.Message); + } + if (mCallback != null) + { + mCallback(); + } + } + + private IEnumerator GetWithFORM (string url, string appId, Dictionary param, ResponseHandle responseHandle) { + yield return ThinkingSDKBaseRequest.GetWithFORM_2(this.mConfigUrl,this.mToken,param,responseHandle); + } + } +} diff --git a/Assets/HCMiniSdk/Third/ta/Plugins/PC/Config/ThinkingSDKConfig.cs.meta b/Assets/HCMiniSdk/Third/ta/Plugins/PC/Config/ThinkingSDKConfig.cs.meta new file mode 100644 index 00000000..243dc8d3 --- /dev/null +++ b/Assets/HCMiniSdk/Third/ta/Plugins/PC/Config/ThinkingSDKConfig.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: 472854a90c78a4dd4a16616ba3d3437d +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/HCMiniSdk/Third/ta/Plugins/PC/Config/ThinkingSDKPublicConfig.cs b/Assets/HCMiniSdk/Third/ta/Plugins/PC/Config/ThinkingSDKPublicConfig.cs new file mode 100644 index 00000000..9c95ea92 --- /dev/null +++ b/Assets/HCMiniSdk/Third/ta/Plugins/PC/Config/ThinkingSDKPublicConfig.cs @@ -0,0 +1,52 @@ +namespace ThinkingSDK.PC.Config +{ + public class ThinkingSDKPublicConfig + { + // Whether to print log + bool isPrintLog; + // sdk version + string version = "1.0"; + // sdk name + string name = "Unity"; + private static readonly ThinkingSDKPublicConfig config = null; + + static ThinkingSDKPublicConfig() + { + config = new ThinkingSDKPublicConfig(); + } + + private static ThinkingSDKPublicConfig GetConfig() + { + return config; + } + public ThinkingSDKPublicConfig() + { + isPrintLog = false; + } + public static void SetIsPrintLog(bool isPrint) + { + GetConfig().isPrintLog = isPrint; + } + public static bool IsPrintLog() + { + return GetConfig().isPrintLog; + } + public static void SetVersion(string libVersion) + { + GetConfig().version = libVersion; + } + public static void SetName(string libName) + { + GetConfig().name = libName; + } + public static string Version() + { + return GetConfig().version; + } + public static string Name() + { + return GetConfig().name; + } + + } +} diff --git a/Assets/HCMiniSdk/Third/ta/Plugins/PC/Config/ThinkingSDKPublicConfig.cs.meta b/Assets/HCMiniSdk/Third/ta/Plugins/PC/Config/ThinkingSDKPublicConfig.cs.meta new file mode 100644 index 00000000..d514b1ae --- /dev/null +++ b/Assets/HCMiniSdk/Third/ta/Plugins/PC/Config/ThinkingSDKPublicConfig.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: 47e9c09a25d664062bd8264d072b2f34 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/HCMiniSdk/Third/ta/Plugins/PC/Constant.meta b/Assets/HCMiniSdk/Third/ta/Plugins/PC/Constant.meta new file mode 100644 index 00000000..416a1152 --- /dev/null +++ b/Assets/HCMiniSdk/Third/ta/Plugins/PC/Constant.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: e5cb18d25c15d4fca82ba5c10c117b9e +folderAsset: yes +DefaultImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/HCMiniSdk/Third/ta/Plugins/PC/Constant/ThinkingSDKConstant.cs b/Assets/HCMiniSdk/Third/ta/Plugins/PC/Constant/ThinkingSDKConstant.cs new file mode 100644 index 00000000..679f81eb --- /dev/null +++ b/Assets/HCMiniSdk/Third/ta/Plugins/PC/Constant/ThinkingSDKConstant.cs @@ -0,0 +1,116 @@ +using System.Collections.Generic; + +namespace ThinkingSDK.PC.Constant +{ + public delegate void ResponseHandle(Dictionary result = null); + public class ThinkingSDKConstant + { + + // current platform + public static readonly string PLATFORM = "PC"; + // date format style + public static readonly string TIME_PATTERN = "{0:yyyy-MM-dd HH:mm:ss.fff}"; + + // event type + public static readonly string TYPE = "#type"; + // event time + public static readonly string TIME = "#time"; + // distinct ID + public static readonly string DISTINCT_ID = "#distinct_id"; + // event name + public static readonly string EVENT_NAME = "#event_name"; + // account ID + public static readonly string ACCOUNT_ID = "#account_id"; + // event properties + public static readonly string PROPERTIES = "properties"; + // network type + public static readonly string NETWORK_TYPE = "#network_type"; + // sdk version + public static readonly string LIB_VERSION = "#lib_version"; + // carrier name + public static readonly string CARRIER = "#carrier"; + // sdk name + public static readonly string LIB = "#lib"; + // os name + public static readonly string OS = "#os"; + // device ID + public static readonly string DEVICE_ID = "#device_id"; + // device screen height + public static readonly string SCREEN_HEIGHT = "#screen_height"; + //device screen width + public static readonly string SCREEN_WIDTH = "#screen_width"; + // device manufacturer + public static readonly string MANUFACTURE = "#manufacturer"; + // device model + public static readonly string DEVICE_MODEL = "#device_model"; + // device system language + public static readonly string SYSTEM_LANGUAGE = "#system_language"; + // os version + public static readonly string OS_VERSION = "#os_version"; + // app version + public static readonly string APP_VERSION = "#app_version"; + // app bundle ID + public static readonly string APP_BUNDLEID = "#bundle_id"; + // zone offset + public static readonly string ZONE_OFFSET = "#zone_offset"; + // project ID + public static readonly string APPID = "#app_id"; + // unique ID for the event + public static readonly string UUID = "#uuid"; + // first event ID + public static readonly string FIRST_CHECK_ID = "#first_check_id"; + // special event ID + public static readonly string EVENT_ID = "#event_id"; + // random ID + public static readonly string RANDOM_ID = "RANDDOM_ID"; + // random ID(WebGL) + public static readonly string RANDOM_DEVICE_ID = "RANDOM_DEVICE_ID"; + // event duration + public static readonly string DURATION = "#duration"; + // flush time + public static readonly string FLUSH_TIME = "#flush_time"; + // request data + public static readonly string REQUEST_DATA = "data"; + + // super properties + public static readonly string SUPER_PROPERTY = "super_properties"; + + // user properties action + public static readonly string USER_ADD = "user_add"; + public static readonly string USER_SET = "user_set"; + public static readonly string USER_SETONCE = "user_setOnce"; + public static readonly string USER_UNSET = "user_unset"; + public static readonly string USER_DEL = "user_del"; + public static readonly string USER_APPEND = "user_append"; + public static readonly string USER_UNIQ_APPEND = "user_uniq_append"; + + // Whether to pause data reporting + public static readonly string ENABLE_TRACK = "enable_track"; + // Whether to stop data reporting + public static readonly string OPT_TRACK = "opt_track"; + // Whether the installation is recorded + public static readonly string IS_INSTALL = "is_install"; + + // app install event + public static readonly string INSTALL_EVENT = "ta_app_install"; + // app start event + public static readonly string START_EVENT = "ta_app_start"; + // app end event + public static readonly string END_EVENT = "ta_app_end"; + // app crash event + public static readonly string CRASH_EVENT = "ta_app_crash"; + // app crash reason + public static readonly string CRASH_REASON = "#app_crashed_reason"; + // scene load + public static readonly string APP_SCENE_LOAD = "ta_scene_loaded"; + // scene unload + public static readonly string APP_SCENE_UNLOAD = "ta_scene_unloaded"; + + + + + + + + } +} diff --git a/Assets/HCMiniSdk/Third/ta/Plugins/PC/Constant/ThinkingSDKConstant.cs.meta b/Assets/HCMiniSdk/Third/ta/Plugins/PC/Constant/ThinkingSDKConstant.cs.meta new file mode 100644 index 00000000..0271e3af --- /dev/null +++ b/Assets/HCMiniSdk/Third/ta/Plugins/PC/Constant/ThinkingSDKConstant.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: 361e81159859b41d797fc238c8f55f17 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/HCMiniSdk/Third/ta/Plugins/PC/DataModel.meta b/Assets/HCMiniSdk/Third/ta/Plugins/PC/DataModel.meta new file mode 100644 index 00000000..48cac201 --- /dev/null +++ b/Assets/HCMiniSdk/Third/ta/Plugins/PC/DataModel.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: a138ac43e601b433093a111aff909263 +folderAsset: yes +DefaultImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/HCMiniSdk/Third/ta/Plugins/PC/DataModel/ThinkingSDKBaseData.cs b/Assets/HCMiniSdk/Third/ta/Plugins/PC/DataModel/ThinkingSDKBaseData.cs new file mode 100644 index 00000000..4fceb963 --- /dev/null +++ b/Assets/HCMiniSdk/Third/ta/Plugins/PC/DataModel/ThinkingSDKBaseData.cs @@ -0,0 +1,125 @@ +using System; +using System.Collections.Generic; +using ThinkingSDK.PC.Time; + +namespace ThinkingSDK.PC.DataModel +{ + public abstract class ThinkingSDKBaseData + { + // event type + private string mType; + // event time + private ThinkingSDKTimeInter mTime; + // distinct ID + private string mDistinctID; + // event name + private string mEventName; + // account ID + private string mAccountID; + + // unique ID for the event + private string mUUID; + private Dictionary mProperties = new Dictionary(); + public Dictionary Properties() + { + return mProperties; + } + public void SetEventName(string eventName) + { + this.mEventName = eventName; + } + public void SetEventType(string eventType) + { + this.mType = eventType; + } + public string EventName() + { + return this.mEventName; + } + public void SetTime(ThinkingSDKTimeInter time) + { + this.mTime = time; + } + public ThinkingSDKTimeInter EventTime() + { + return this.mTime; + } + public void SetDataType(string type) + { + this.mType = type; + } + virtual public String GetDataType() + { + return this.mType; + } + public string AccountID() + { + return this.mAccountID; + } + public string DistinctID() + { + return this.mDistinctID; + } + public void SetAccountID(string accuntID) + { + this.mAccountID = accuntID; + } + public void SetDistinctID(string distinctID) + { + this.mDistinctID = distinctID; + } + public string UUID() + { + return this.mUUID; + } + public ThinkingSDKBaseData() { } + public ThinkingSDKBaseData(ThinkingSDKTimeInter time,string eventName) + { + this.SetBaseData(eventName); + this.SetTime(time); + } + public ThinkingSDKBaseData(string eventName) + { + this.SetBaseData(eventName); + } + public void SetBaseData(string eventName) + { + this.mEventName = eventName; + this.mUUID = System.Guid.NewGuid().ToString(); + } + + public ThinkingSDKBaseData(ThinkingSDKTimeInter time, string eventName, Dictionary properties):this(time,eventName) + { + if (properties != null) + { + this.SetProperties(properties); + } + } + + abstract public Dictionary ToDictionary(); + public void SetProperties(Dictionary properties,bool isOverwrite = true) + { + if (isOverwrite) + { + foreach (KeyValuePair kv in properties) + { + mProperties[kv.Key] = kv.Value; + + } + } + else + { + foreach (KeyValuePair kv in properties) + { + if (!mProperties.ContainsKey(kv.Key)) + { + mProperties[kv.Key] = kv.Value; + } + + } + } + + } + + } +} diff --git a/Assets/HCMiniSdk/Third/ta/Plugins/PC/DataModel/ThinkingSDKBaseData.cs.meta b/Assets/HCMiniSdk/Third/ta/Plugins/PC/DataModel/ThinkingSDKBaseData.cs.meta new file mode 100644 index 00000000..bf4ed943 --- /dev/null +++ b/Assets/HCMiniSdk/Third/ta/Plugins/PC/DataModel/ThinkingSDKBaseData.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: 69b1ae68ce0724b4290b99fb1920ffca +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/HCMiniSdk/Third/ta/Plugins/PC/DataModel/ThinkingSDKEventData.cs b/Assets/HCMiniSdk/Third/ta/Plugins/PC/DataModel/ThinkingSDKEventData.cs new file mode 100644 index 00000000..3d90731a --- /dev/null +++ b/Assets/HCMiniSdk/Third/ta/Plugins/PC/DataModel/ThinkingSDKEventData.cs @@ -0,0 +1,82 @@ +using System; +using System.Collections.Generic; +using ThinkingSDK.PC.Constant; +using ThinkingSDK.PC.Time; + +namespace ThinkingSDK.PC.DataModel +{ + public class ThinkingSDKEventData:ThinkingSDKBaseData + { + private DateTime mEventTime; + private TimeZoneInfo mTimeZone; + private float mDuration; + private static Dictionary mData; + public void SetEventTime(DateTime dateTime) + { + this.mEventTime = dateTime; + } + public void SetTimeZone(TimeZoneInfo timeZone) + { + this.mTimeZone = timeZone; + } + //public DateTime EventTime() + //{ + // return this.mEventTime; + //} + public DateTime Time() + { + return mEventTime; + } + public ThinkingSDKEventData(string eventName) : base(eventName) + { + } + + public ThinkingSDKEventData(ThinkingSDKTimeInter time, string eventName):base(time,eventName) + { + } + public ThinkingSDKEventData(ThinkingSDKTimeInter time, string eventName, Dictionary properties):base(time,eventName,properties) + { + } + public override string GetDataType() + { + return "track"; + } + public void SetDuration(float duration) + { + this.mDuration = duration; + } + + public override Dictionary ToDictionary() + { + if (mData == null) + { + mData = new Dictionary(); + } + else + { + mData.Clear(); + } + mData[ThinkingSDKConstant.TYPE] = GetDataType(); + mData[ThinkingSDKConstant.TIME] = this.EventTime().GetTime(this.mTimeZone); + mData[ThinkingSDKConstant.DISTINCT_ID] = this.DistinctID(); + if (!string.IsNullOrEmpty(this.EventName())) + { + mData[ThinkingSDKConstant.EVENT_NAME] = this.EventName(); + } + if (!string.IsNullOrEmpty(this.AccountID())) + { + mData[ThinkingSDKConstant.ACCOUNT_ID] = this.AccountID(); + } + mData[ThinkingSDKConstant.UUID] = this.UUID(); + Dictionary properties = this.Properties(); + properties[ThinkingSDKConstant.ZONE_OFFSET] = this.EventTime().GetZoneOffset(this.mTimeZone); + if (mDuration != 0) + { + properties[ThinkingSDKConstant.DURATION] = mDuration; + } + mData[ThinkingSDKConstant.PROPERTIES] = properties; + + return mData; + } + } +} diff --git a/Assets/HCMiniSdk/Third/ta/Plugins/PC/DataModel/ThinkingSDKEventData.cs.meta b/Assets/HCMiniSdk/Third/ta/Plugins/PC/DataModel/ThinkingSDKEventData.cs.meta new file mode 100644 index 00000000..f3b1fa0f --- /dev/null +++ b/Assets/HCMiniSdk/Third/ta/Plugins/PC/DataModel/ThinkingSDKEventData.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: 3d815c0c9730f473387bb0c0cd83098c +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/HCMiniSdk/Third/ta/Plugins/PC/DataModel/ThinkingSDKFirstEvent.cs b/Assets/HCMiniSdk/Third/ta/Plugins/PC/DataModel/ThinkingSDKFirstEvent.cs new file mode 100644 index 00000000..b4b06690 --- /dev/null +++ b/Assets/HCMiniSdk/Third/ta/Plugins/PC/DataModel/ThinkingSDKFirstEvent.cs @@ -0,0 +1,35 @@ +using System.Collections.Generic; +using ThinkingSDK.PC.Constant; +using ThinkingSDK.PC.Utils; +namespace ThinkingSDK.PC.DataModel +{ + public class ThinkingSDKFirstEvent:ThinkingSDKEventData + { + private string mFirstCheckId; + public ThinkingSDKFirstEvent(string eventName):base(eventName) + { + + } + public void SetFirstCheckId(string firstCheckId) + { + mFirstCheckId = firstCheckId; + } + public string FirstCheckId() + { + if (string.IsNullOrEmpty(mFirstCheckId)) + { + return ThinkingSDKDeviceInfo.DeviceID(); + } + else + { + return mFirstCheckId; + } + } + override public Dictionary ToDictionary() + { + Dictionary dictionary = base.ToDictionary(); + dictionary[ThinkingSDKConstant.FIRST_CHECK_ID] = FirstCheckId(); + return dictionary; + } + } +} diff --git a/Assets/HCMiniSdk/Third/ta/Plugins/PC/DataModel/ThinkingSDKFirstEvent.cs.meta b/Assets/HCMiniSdk/Third/ta/Plugins/PC/DataModel/ThinkingSDKFirstEvent.cs.meta new file mode 100644 index 00000000..e177423e --- /dev/null +++ b/Assets/HCMiniSdk/Third/ta/Plugins/PC/DataModel/ThinkingSDKFirstEvent.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: 285f00076791947c8a99103da1a2653d +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/HCMiniSdk/Third/ta/Plugins/PC/DataModel/ThinkingSDKOverWritableEvent.cs b/Assets/HCMiniSdk/Third/ta/Plugins/PC/DataModel/ThinkingSDKOverWritableEvent.cs new file mode 100644 index 00000000..ec2c1b24 --- /dev/null +++ b/Assets/HCMiniSdk/Third/ta/Plugins/PC/DataModel/ThinkingSDKOverWritableEvent.cs @@ -0,0 +1,24 @@ +using System.Collections.Generic; +using ThinkingSDK.PC.Constant; + +namespace ThinkingSDK.PC.DataModel +{ + public class ThinkingSDKOverWritableEvent:ThinkingSDKEventData + { + private string mEventID; + public ThinkingSDKOverWritableEvent(string eventName,string eventID) : base(eventName) + { + this.mEventID = eventID; + } + public override string GetDataType() + { + return "track_overwrite"; + } + override public Dictionary ToDictionary() + { + Dictionary dictionary = base.ToDictionary(); + dictionary[ThinkingSDKConstant.EVENT_ID] = mEventID; + return dictionary; + } + } +} diff --git a/Assets/HCMiniSdk/Third/ta/Plugins/PC/DataModel/ThinkingSDKOverWritableEvent.cs.meta b/Assets/HCMiniSdk/Third/ta/Plugins/PC/DataModel/ThinkingSDKOverWritableEvent.cs.meta new file mode 100644 index 00000000..b4ba5998 --- /dev/null +++ b/Assets/HCMiniSdk/Third/ta/Plugins/PC/DataModel/ThinkingSDKOverWritableEvent.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: 9609b6c1610254c6795e60fe0ce7a92b +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/HCMiniSdk/Third/ta/Plugins/PC/DataModel/ThinkingSDKUpdateEvent.cs b/Assets/HCMiniSdk/Third/ta/Plugins/PC/DataModel/ThinkingSDKUpdateEvent.cs new file mode 100644 index 00000000..da8139c1 --- /dev/null +++ b/Assets/HCMiniSdk/Third/ta/Plugins/PC/DataModel/ThinkingSDKUpdateEvent.cs @@ -0,0 +1,25 @@ +using System.Collections.Generic; +using ThinkingSDK.PC.Constant; + +namespace ThinkingSDK.PC.DataModel +{ + public class ThinkingSDKUpdateEvent:ThinkingSDKEventData + { + + private string mEventID; + public ThinkingSDKUpdateEvent(string eventName, string eventID) : base(eventName) + { + this.mEventID = eventID; + } + public override string GetDataType() + { + return "track_update"; + } + override public Dictionary ToDictionary() + { + Dictionary dictionary = base.ToDictionary(); + dictionary[ThinkingSDKConstant.EVENT_ID] = mEventID; + return dictionary; + } + } +} diff --git a/Assets/HCMiniSdk/Third/ta/Plugins/PC/DataModel/ThinkingSDKUpdateEvent.cs.meta b/Assets/HCMiniSdk/Third/ta/Plugins/PC/DataModel/ThinkingSDKUpdateEvent.cs.meta new file mode 100644 index 00000000..a6ac63d7 --- /dev/null +++ b/Assets/HCMiniSdk/Third/ta/Plugins/PC/DataModel/ThinkingSDKUpdateEvent.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: 25db2db9cd0d24311b5c5db04b42a604 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/HCMiniSdk/Third/ta/Plugins/PC/DataModel/ThinkingSDKUserData.cs b/Assets/HCMiniSdk/Third/ta/Plugins/PC/DataModel/ThinkingSDKUserData.cs new file mode 100644 index 00000000..652721dd --- /dev/null +++ b/Assets/HCMiniSdk/Third/ta/Plugins/PC/DataModel/ThinkingSDKUserData.cs @@ -0,0 +1,31 @@ +using System.Collections.Generic; +using ThinkingSDK.PC.Constant; +using ThinkingSDK.PC.Time; + +namespace ThinkingSDK.PC.DataModel +{ + public class ThinkingSDKUserData:ThinkingSDKBaseData + { + public ThinkingSDKUserData(ThinkingSDKTimeInter time,string eventType, Dictionary properties) + { + this.SetEventType(eventType); + this.SetTime(time); + this.SetBaseData(null); + this.SetProperties(properties); + } + override public Dictionary ToDictionary() + { + Dictionary data = new Dictionary(); + data[ThinkingSDKConstant.TYPE] = GetDataType(); + data[ThinkingSDKConstant.TIME] = EventTime().GetTime(null); + data[ThinkingSDKConstant.DISTINCT_ID] = DistinctID(); + if (!string.IsNullOrEmpty(AccountID())) + { + data[ThinkingSDKConstant.ACCOUNT_ID] = AccountID(); + } + data[ThinkingSDKConstant.UUID] = UUID(); + data[ThinkingSDKConstant.PROPERTIES] = Properties(); + return data; + } + } +} diff --git a/Assets/HCMiniSdk/Third/ta/Plugins/PC/DataModel/ThinkingSDKUserData.cs.meta b/Assets/HCMiniSdk/Third/ta/Plugins/PC/DataModel/ThinkingSDKUserData.cs.meta new file mode 100644 index 00000000..74880bbd --- /dev/null +++ b/Assets/HCMiniSdk/Third/ta/Plugins/PC/DataModel/ThinkingSDKUserData.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: 890bcbb20acb741689b72692aaf6f60a +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/HCMiniSdk/Third/ta/Plugins/PC/Main.meta b/Assets/HCMiniSdk/Third/ta/Plugins/PC/Main.meta new file mode 100644 index 00000000..7a6a4364 --- /dev/null +++ b/Assets/HCMiniSdk/Third/ta/Plugins/PC/Main.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: 3166be662c1c1445387662fcb7118be5 +folderAsset: yes +DefaultImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/HCMiniSdk/Third/ta/Plugins/PC/Main/LightThinkingSDKInstance.cs b/Assets/HCMiniSdk/Third/ta/Plugins/PC/Main/LightThinkingSDKInstance.cs new file mode 100644 index 00000000..b5e421a6 --- /dev/null +++ b/Assets/HCMiniSdk/Third/ta/Plugins/PC/Main/LightThinkingSDKInstance.cs @@ -0,0 +1,97 @@ +using ThinkingSDK.PC.Config; +using System.Collections.Generic; +using ThinkingSDK.PC.Utils; +using UnityEngine; + +namespace ThinkingSDK.PC.Main +{ + public class LightThinkingSDKInstance : ThinkingSDKInstance + { + public LightThinkingSDKInstance(string appId, string server, ThinkingSDKConfig config, MonoBehaviour mono = null) : base(appId, server, null, config, mono) + { + } + public override void Identifiy(string distinctID) + { + if (IsPaused()) + { + return; + } + if (!string.IsNullOrEmpty(distinctID)) + { + this.mDistinctID = distinctID; + } + } + public override string DistinctId() + { + if (string.IsNullOrEmpty(this.mDistinctID)) + { + this.mDistinctID = ThinkingSDKUtil.RandomID(false); + } + return this.mDistinctID; + } + public override void Login(string accountID) + { + if (IsPaused()) + { + return; + } + if (!string.IsNullOrEmpty(accountID)) + { + this.mAccountID = accountID; + } + } + public override string AccountID() + { + return this.mAccountID; + } + public override void Logout() + { + if (IsPaused()) + { + return; + } + this.mAccountID = ""; + } + public override void SetSuperProperties(Dictionary superProperties) + { + if (IsPaused()) + { + return; + } + ThinkingSDKUtil.AddDictionary(this.mSupperProperties, superProperties); + } + public override void UnsetSuperProperty(string propertyKey) + { + if (IsPaused()) + { + return; + } + if (this.mSupperProperties.ContainsKey(propertyKey)) + { + this.mSupperProperties.Remove(propertyKey); + } + } + public override Dictionary SuperProperties() + { + return this.mSupperProperties; + } + public override void ClearSuperProperties() + { + if (IsPaused()) + { + return; + } + this.mSupperProperties.Clear(); + } + public override void EnableAutoTrack(TDAutoTrackEventType events, Dictionary properties) + { + } + public override void SetAutoTrackProperties(TDAutoTrackEventType events, Dictionary properties) + { + } + public override void Flush() + { + } + } + +} \ No newline at end of file diff --git a/Assets/HCMiniSdk/Third/ta/Plugins/PC/Main/LightThinkingSDKInstance.cs.meta b/Assets/HCMiniSdk/Third/ta/Plugins/PC/Main/LightThinkingSDKInstance.cs.meta new file mode 100644 index 00000000..9fba05af --- /dev/null +++ b/Assets/HCMiniSdk/Third/ta/Plugins/PC/Main/LightThinkingSDKInstance.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: 7bff4ee40c5ed4a0cb4e4afe060d03c2 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/HCMiniSdk/Third/ta/Plugins/PC/Main/ThinkingPCSDK.cs b/Assets/HCMiniSdk/Third/ta/Plugins/PC/Main/ThinkingPCSDK.cs new file mode 100644 index 00000000..f85b286d --- /dev/null +++ b/Assets/HCMiniSdk/Third/ta/Plugins/PC/Main/ThinkingPCSDK.cs @@ -0,0 +1,357 @@ +using System; +using System.Collections.Generic; +using ThinkingSDK.PC.Config; +using ThinkingSDK.PC.DataModel; +using ThinkingSDK.PC.Time; +using ThinkingSDK.PC.Utils; +using UnityEngine; +namespace ThinkingSDK.PC.Main +{ + public class ThinkingPCSDK + { + private ThinkingPCSDK() + { + + } + private static readonly Dictionary Instances = new Dictionary(); + private static readonly Dictionary LightInstances = new Dictionary(); + private static string CurrentAppid; + + private static ThinkingSDKInstance GetInstance(string appId) + { + ThinkingSDKInstance instance = null; + if (!string.IsNullOrEmpty(appId)) + { + appId = appId.Replace(" ", ""); + if (LightInstances.ContainsKey(appId)) + { + instance = LightInstances[appId]; + } + else if (Instances.ContainsKey(appId)) + { + instance = Instances[appId]; + } + } + if (instance == null) + { + instance = Instances[CurrentAppid]; + } + return instance; + } + + public static ThinkingSDKInstance CurrentInstance() + { + ThinkingSDKInstance instance = Instances[CurrentAppid]; + return instance; + } + + public static ThinkingSDKInstance Init(string appId, string server, string instanceName, ThinkingSDKConfig config = null, MonoBehaviour mono = null) + { + if (ThinkingSDKUtil.IsEmptyString(appId)) + { + if (ThinkingSDKPublicConfig.IsPrintLog()) ThinkingSDKLogger.Print("appId is empty"); + return null; + } + ThinkingSDKInstance instance = null; + if (!string.IsNullOrEmpty(instanceName)) + { + if (Instances.ContainsKey(instanceName)) + { + instance = Instances[instanceName]; + } + else + { + instance = new ThinkingSDKInstance(appId, server, instanceName, config, mono); + if (string.IsNullOrEmpty(CurrentAppid)) + { + CurrentAppid = instanceName; + } + Instances[instanceName] = instance; + } + } + else + { + if (Instances.ContainsKey(appId)) + { + instance = Instances[appId]; + } + else + { + instance = new ThinkingSDKInstance(appId, server, null, config, mono); + if (string.IsNullOrEmpty(CurrentAppid)) + { + CurrentAppid = appId; + } + Instances[appId] = instance; + } + } + return instance; + } + /// + /// Sets distinct ID + /// + /// + /// + public static void Identifiy(string distinctID, string appId = "") + { + GetInstance(appId).Identifiy(distinctID); + } + + /// + /// Gets distinct ID + /// + /// + /// + public static string DistinctId(string appId = "") + { + return GetInstance(appId).DistinctId(); + } + /// + /// Sets account ID + /// + /// + /// + public static void Login(string accountID,string appId = "") + { + GetInstance(appId).Login(accountID); + } + /// + /// Gets account ID + /// + /// + /// + public static string AccountID(string appId = "") + { + return GetInstance(appId).AccountID(); + } + /// + /// Clear account ID + /// + public static void Logout(string appId = "") + { + GetInstance(appId).Logout(); + } + + /// + /// Enable Auto-tracking Events + /// + /// + /// + public static void EnableAutoTrack(TDAutoTrackEventType events, Dictionary properties, string appId = "") + { + GetInstance(appId).EnableAutoTrack(events, properties); + } + + public static void EnableAutoTrack(TDAutoTrackEventType events, TDAutoTrackEventHandler_PC eventCallback, string appId = "") + { + GetInstance(appId).EnableAutoTrack(events, eventCallback); + } + + public static void SetAutoTrackProperties(TDAutoTrackEventType events, Dictionary properties, string appId = "") + { + GetInstance(appId).SetAutoTrackProperties(events, properties); + } + + public static void Track(string eventName,string appId = "") + { + GetInstance(appId).Track(eventName); + } + public static void Track(string eventName, Dictionary properties, string appId = "") + { + GetInstance(appId).Track(eventName,properties); + } + public static void Track(string eventName, Dictionary properties, DateTime date, string appId = "") + { + GetInstance(appId).Track(eventName, properties, date); + } + public static void Track(string eventName, Dictionary properties, DateTime date, TimeZoneInfo timeZone, string appId = "") + { + GetInstance(appId).Track(eventName, properties, date, timeZone); + } + public static void TrackForAll(string eventName, Dictionary properties) + { + foreach (string appId in Instances.Keys) + { + GetInstance(appId).Track(eventName, properties); + } + } + public static void Track(ThinkingSDKEventData eventModel,string appId = "") + { + GetInstance(appId).Track(eventModel); + } + + public static void Flush (string appId = "") + { + GetInstance(appId).Flush(); + } + //public static void FlushImmediately (string appId = "") + //{ + // GetInstance(appId).FlushImmediately(); + //} + public static void SetSuperProperties(Dictionary superProperties,string appId = "") + { + GetInstance(appId).SetSuperProperties(superProperties); + } + public static void UnsetSuperProperty(string propertyKey, string appId = "") + { + GetInstance(appId).UnsetSuperProperty(propertyKey); + } + public static Dictionary SuperProperties(string appId="") + { + return GetInstance(appId).SuperProperties(); + } + + public static Dictionary PresetProperties(string appId="") + { + return GetInstance(appId).PresetProperties(); + } + + public static void ClearSuperProperties(string appId= "") + { + GetInstance(appId).ClearSuperProperties(); + } + + public static void TimeEvent(string eventName,string appId="") + { + GetInstance(appId).TimeEvent(eventName); + } + public static void TimeEventForAll(string eventName) + { + foreach (string appId in Instances.Keys) + { + GetInstance(appId).TimeEvent(eventName); + } + } + /// + /// Pause Event timing + /// + /// ture: puase timing, false: resume timing + /// event name (null or empty is for all event) + public static void PauseTimeEvent(bool status, string eventName = "", string appId = "") + { + GetInstance(appId).PauseTimeEvent(status, eventName); + } + public static void UserSet(Dictionary properties, string appId = "") + { + GetInstance(appId).UserSet(properties); + } + public static void UserSet(Dictionary properties, DateTime dateTime,string appId = "") + { + GetInstance(appId).UserSet(properties, dateTime); + } + public static void UserUnset(string propertyKey,string appId = "") + { + GetInstance(appId).UserUnset(propertyKey); + } + public static void UserUnset(string propertyKey, DateTime dateTime,string appId = "") + { + GetInstance(appId).UserUnset(propertyKey,dateTime); + } + public static void UserUnset(List propertyKeys, string appId = "") + { + GetInstance(appId).UserUnset(propertyKeys); + } + public static void UserUnset(List propertyKeys, DateTime dateTime, string appId = "") + { + GetInstance(appId).UserUnset(propertyKeys,dateTime); + } + public static void UserSetOnce(Dictionary properties,string appId = "") + { + GetInstance(appId).UserSetOnce(properties); + } + public static void UserSetOnce(Dictionary properties, DateTime dateTime, string appId = "") + { + GetInstance(appId).UserSetOnce(properties,dateTime); + } + public static void UserAdd(Dictionary properties, string appId = "") + { + GetInstance(appId).UserAdd(properties); + } + public static void UserAdd(Dictionary properties, DateTime dateTime, string appId = "") + { + GetInstance(appId).UserAdd(properties,dateTime); + } + public static void UserAppend(Dictionary properties, string appId = "") + { + GetInstance(appId).UserAppend(properties); + } + public static void UserAppend(Dictionary properties, DateTime dateTime, string appId = "") + { + GetInstance(appId).UserAppend(properties,dateTime); + } + public static void UserUniqAppend(Dictionary properties, string appId = "") + { + GetInstance(appId).UserUniqAppend(properties); + } + public static void UserUniqAppend(Dictionary properties, DateTime dateTime, string appId = "") + { + GetInstance(appId).UserUniqAppend(properties,dateTime); + } + public static void UserDelete(string appId="") + { + GetInstance(appId).UserDelete(); + } + public static void UserDelete(DateTime dateTime,string appId = "") + { + GetInstance(appId).UserDelete(dateTime); + } + public static void SetDynamicSuperProperties(TDDynamicSuperPropertiesHandler_PC dynamicSuperProperties, string appId = "") + { + GetInstance(appId).SetDynamicSuperProperties(dynamicSuperProperties); + } + public static void SetTrackStatus(TDTrackStatus status, string appId = "") + { + GetInstance(appId).SetTrackStatus(status); + } + public static void OptTracking(bool optTracking,string appId = "") + { + GetInstance(appId).OptTracking(optTracking); + } + public static void EnableTracking(bool isEnable, string appId = "") + { + GetInstance(appId).EnableTracking(isEnable); + } + public static void OptTrackingAndDeleteUser(string appId = "") + { + GetInstance(appId).OptTrackingAndDeleteUser(); + } + public static string CreateLightInstance() + { + string randomID = System.Guid.NewGuid().ToString("N"); + ThinkingSDKInstance lightInstance = ThinkingSDKInstance.CreateLightInstance(); + LightInstances[randomID] = lightInstance; + return randomID; + } + public static void CalibrateTime(long timestamp) + { + ThinkingSDKTimestampCalibration timestampCalibration = new ThinkingSDKTimestampCalibration(timestamp); + ThinkingSDKInstance.SetTimeCalibratieton(timestampCalibration); + } + public static void CalibrateTimeWithNtp(string ntpServer) + { + ThinkingSDKNTPCalibration ntpCalibration = new ThinkingSDKNTPCalibration(ntpServer); + ThinkingSDKInstance.SetNtpTimeCalibratieton(ntpCalibration); + } + + public static string GetDeviceId() + { + return ThinkingSDKDeviceInfo.DeviceID(); + } + public static void EnableLog(bool isEnable) + { + ThinkingSDKPublicConfig.SetIsPrintLog(isEnable); + } + public static void SetLibName(string name) + { + ThinkingSDKPublicConfig.SetName(name); + } + public static void SetLibVersion(string versionCode) + { + ThinkingSDKPublicConfig.SetVersion(versionCode); + } + public static string TimeString(DateTime dateTime, string appId = "") + { + return GetInstance(appId).TimeString(dateTime); + } + } +} diff --git a/Assets/HCMiniSdk/Third/ta/Plugins/PC/Main/ThinkingPCSDK.cs.meta b/Assets/HCMiniSdk/Third/ta/Plugins/PC/Main/ThinkingPCSDK.cs.meta new file mode 100644 index 00000000..0cb66c03 --- /dev/null +++ b/Assets/HCMiniSdk/Third/ta/Plugins/PC/Main/ThinkingPCSDK.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: ee46cd65b236c4202a800c812df46325 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/HCMiniSdk/Third/ta/Plugins/PC/Main/ThinkingSDKInstance.cs b/Assets/HCMiniSdk/Third/ta/Plugins/PC/Main/ThinkingSDKInstance.cs new file mode 100644 index 00000000..fdf463c2 --- /dev/null +++ b/Assets/HCMiniSdk/Third/ta/Plugins/PC/Main/ThinkingSDKInstance.cs @@ -0,0 +1,786 @@ +using System; +using System.Collections; +using System.Collections.Generic; +using ThinkingSDK.PC.Config; +using ThinkingSDK.PC.Constant; +using ThinkingSDK.PC.DataModel; +using ThinkingSDK.PC.Request; +using ThinkingSDK.PC.Storage; +using ThinkingSDK.PC.TaskManager; +using ThinkingSDK.PC.Time; +using ThinkingSDK.PC.Utils; +using UnityEngine; + +namespace ThinkingSDK.PC.Main +{ + [Flags] + // Auto-tracking Events Type + public enum TDAutoTrackEventType + { + None = 0, + AppStart = 1 << 0, // reporting when the app enters the foreground (ta_app_start) + AppEnd = 1 << 1, // reporting when the app enters the background (ta_app_end) + AppCrash = 1 << 4, // reporting when an uncaught exception occurs (ta_app_crash) + AppInstall = 1 << 5, // reporting when the app is opened for the first time after installation (ta_app_install) + AppSceneLoad = 1 << 6, // reporting when the scene is loaded in the app (ta_scene_loaded) + AppSceneUnload = 1 << 7, // reporting when the scene is unloaded in the app (ta_scene_loaded) + All = AppStart | AppEnd | AppInstall | AppCrash | AppSceneLoad | AppSceneUnload + } + // Data Reporting Status + public enum TDTrackStatus + { + Pause = 1, // pause data reporting + Stop = 2, // stop data reporting, and clear caches + SaveOnly = 3, // data stores in the cache, but not be reported + Normal = 4 // resume data reporting + } + + public interface TDDynamicSuperPropertiesHandler_PC + { + Dictionary GetDynamicSuperProperties_PC(); + } + public interface TDAutoTrackEventHandler_PC + { + Dictionary AutoTrackEventCallback_PC(int type, Dictionaryproperties); + } + public class ThinkingSDKInstance + { + private string mAppid; + private string mServer; + protected string mDistinctID; + protected string mAccountID; + private bool mOptTracking = true; + private Dictionary mTimeEvents = new Dictionary(); + private Dictionary mTimeEventsBefore = new Dictionary(); + private bool mEnableTracking = true; + private bool mEventSaveOnly = false; //data stores in the cache, but not be reported + protected Dictionary mSupperProperties = new Dictionary(); + protected Dictionary> mAutoTrackProperties = new Dictionary>(); + private ThinkingSDKConfig mConfig; + private ThinkingSDKBaseRequest mRequest; + private static ThinkingSDKTimeCalibration mTimeCalibration; + private static ThinkingSDKTimeCalibration mNtpTimeCalibration; + private TDDynamicSuperPropertiesHandler_PC mDynamicProperties; + private ThinkingSDKTask mTask { + get { + return ThinkingSDKTask.SingleTask(); + } + set { + this.mTask = value; + } + } + private static ThinkingSDKInstance mCurrentInstance; + private MonoBehaviour mMono; + private static MonoBehaviour sMono; + private ThinkingSDKAutoTrack mAutoTrack; + + WaitForSeconds flushDelay; + public static void SetTimeCalibratieton(ThinkingSDKTimeCalibration timeCalibration) + { + mTimeCalibration = timeCalibration; + } + public static void SetNtpTimeCalibratieton(ThinkingSDKTimeCalibration timeCalibration) + { + mNtpTimeCalibration = timeCalibration; + } + private ThinkingSDKInstance() + { + + } + private void DefaultData() + { + DistinctId(); + AccountID(); + SuperProperties(); + DefaultTrackState(); + } + public ThinkingSDKInstance(string appId,string server):this(appId,server,null,null) + { + + + } + public ThinkingSDKInstance(string appId, string server, string instanceName, ThinkingSDKConfig config, MonoBehaviour mono = null) + { + this.mMono = mono; + sMono = mono; + if (config == null) + { + this.mConfig = ThinkingSDKConfig.GetInstance(appId, server, instanceName); + } + else + { + this.mConfig = config; + } + this.mConfig.UpdateConfig(mono, ConfigResponseHandle); + this.mAppid = appId; + this.mServer = server; + if (this.mConfig.GetMode() == Mode.NORMAL) + { + this.mRequest = new ThinkingSDKNormalRequest(appId, this.mConfig.NormalURL()); + } + else + { + this.mRequest = new ThinkingSDKDebugRequest(appId,this.mConfig.DebugURL()); + if (this.mConfig.GetMode() == Mode.DEBUG_ONLY) + { + ((ThinkingSDKDebugRequest)this.mRequest).SetDryRun(1); + } + } + DefaultData(); + mCurrentInstance = this; + // dynamic loading ThinkingSDKTask ThinkingSDKAutoTrack + GameObject mThinkingSDKTask = new GameObject("ThinkingSDKTask", typeof(ThinkingSDKTask)); + UnityEngine.Object.DontDestroyOnLoad(mThinkingSDKTask); + + GameObject mThinkingSDKAutoTrack = new GameObject("ThinkingSDKAutoTrack", typeof(ThinkingSDKAutoTrack)); + this.mAutoTrack = (ThinkingSDKAutoTrack) mThinkingSDKAutoTrack.GetComponent(typeof(ThinkingSDKAutoTrack)); + if (!string.IsNullOrEmpty(instanceName)) + { + this.mAutoTrack.SetAppId(instanceName); + } + else + { + this.mAutoTrack.SetAppId(this.mAppid); + } + UnityEngine.Object.DontDestroyOnLoad(mThinkingSDKAutoTrack); + } + private void EventResponseHandle(Dictionary result) + { + int eventCount = 0; + if (result != null) + { + int flushCount = 0; + if (result.ContainsKey("flush_count")) + { + flushCount = (int)result["flush_count"]; + } + if (!string.IsNullOrEmpty(this.mConfig.InstanceName())) + { + eventCount = ThinkingSDKFileJson.DeleteBatchTrackingData(flushCount, this.mConfig.InstanceName()); + } + else + { + eventCount = ThinkingSDKFileJson.DeleteBatchTrackingData(flushCount, this.mAppid); + } + } + mTask.Release(); + if (eventCount > 0) + { + if (ThinkingSDKPublicConfig.IsPrintLog()) ThinkingSDKLogger.Print("Flush automatically (" + this.mAppid + ")"); + Flush(); + } + } + private void ConfigResponseHandle(Dictionary result) + { + if (this.mConfig.GetMode() == Mode.NORMAL) + { + flushDelay = new WaitForSeconds(mConfig.mUploadInterval); + sMono.StartCoroutine(WaitAndFlush()); + } + } + public static ThinkingSDKInstance CreateLightInstance() + { + ThinkingSDKInstance lightInstance = new LightThinkingSDKInstance(mCurrentInstance.mAppid, mCurrentInstance.mServer, mCurrentInstance.mConfig, sMono); + return lightInstance; + } + public ThinkingSDKTimeInter GetTime(DateTime dateTime) + { + ThinkingSDKTimeInter time = null; + + if ( dateTime == DateTime.MinValue || dateTime == null) + { + if (mNtpTimeCalibration != null)// check if time calibrated + { + time = new ThinkingSDKCalibratedTime(mNtpTimeCalibration, mConfig.TimeZone()); + } + else if (mTimeCalibration != null)// check if time calibrated + { + time = new ThinkingSDKCalibratedTime(mTimeCalibration, mConfig.TimeZone()); + } + else + { + time = new ThinkingSDKTime(mConfig.TimeZone(), DateTime.Now); + } + } + else + { + time = new ThinkingSDKTime(mConfig.TimeZone(), dateTime); + } + + return time; + } + // sets distisct ID + public virtual void Identifiy(string distinctID) + { + if (ThinkingSDKPublicConfig.IsPrintLog()) ThinkingSDKLogger.Print("Setting distinct ID, DistinctId = " + distinctID); + if (IsPaused()) + { + return; + } + if (!string.IsNullOrEmpty(distinctID)) + { + this.mDistinctID = distinctID; + ThinkingSDKFile.SaveData(mAppid, ThinkingSDKConstant.DISTINCT_ID,distinctID); + } + } + public virtual string DistinctId() + { + this.mDistinctID = (string)ThinkingSDKFile.GetData(this.mAppid,ThinkingSDKConstant.DISTINCT_ID, typeof(string)); + if (string.IsNullOrEmpty(this.mDistinctID)) + { + this.mDistinctID = ThinkingSDKUtil.RandomID(); + ThinkingSDKFile.SaveData(this.mAppid, ThinkingSDKConstant.DISTINCT_ID, this.mDistinctID); + } + + return this.mDistinctID; + } + + public virtual void Login(string accountID) + { + if (IsPaused()) + { + return; + } + if (ThinkingSDKPublicConfig.IsPrintLog()) ThinkingSDKLogger.Print("Login SDK, AccountId = " + accountID); + if (!string.IsNullOrEmpty(accountID)) + { + this.mAccountID = accountID; + ThinkingSDKFile.SaveData(mAppid, ThinkingSDKConstant.ACCOUNT_ID, accountID); + } + } + public virtual string AccountID() + { + this.mAccountID = (string)ThinkingSDKFile.GetData(this.mAppid,ThinkingSDKConstant.ACCOUNT_ID, typeof(string)); + return this.mAccountID; + } + public virtual void Logout() + { + if (IsPaused()) + { + return; + } + if (ThinkingSDKPublicConfig.IsPrintLog()) ThinkingSDKLogger.Print("Logout SDK"); + this.mAccountID = ""; + ThinkingSDKFile.DeleteData(this.mAppid,ThinkingSDKConstant.ACCOUNT_ID); + } + //TODO + public virtual void EnableAutoTrack(TDAutoTrackEventType events, Dictionary properties) + { + this.mAutoTrack.EnableAutoTrack(events, properties, mAppid); + } + public virtual void EnableAutoTrack(TDAutoTrackEventType events, TDAutoTrackEventHandler_PC eventCallback) + { + this.mAutoTrack.EnableAutoTrack(events, eventCallback, mAppid); + } + // sets auto-tracking events properties + public virtual void SetAutoTrackProperties(TDAutoTrackEventType events, Dictionary properties) + { + this.mAutoTrack.SetAutoTrackProperties(events, properties); + } + public void Track(string eventName) + { + Track(eventName, null, DateTime.MinValue); + } + public void Track(string eventName, Dictionary properties) + { + Track(eventName, properties, DateTime.MinValue); + } + public void Track(string eventName, Dictionary properties, DateTime date) + { + Track(eventName, properties, date, null, false); + } + public void Track(string eventName, Dictionary properties, DateTime date, TimeZoneInfo timeZone) + { + Track(eventName, properties, date, timeZone, false); + } + public void Track(string eventName, Dictionary properties, DateTime date, TimeZoneInfo timeZone, bool immediately) + { + ThinkingSDKTimeInter time = GetTime(date); + ThinkingSDKEventData data = new ThinkingSDKEventData(time, eventName, properties); + if (timeZone != null) + { + data.SetTimeZone(timeZone); + } + SendData(data, immediately); + } + private void SendData(ThinkingSDKEventData data) + { + SendData(data, false); + } + private void SendData(ThinkingSDKEventData data, bool immediately) + { + if (this.mDynamicProperties != null) + { + data.SetProperties(this.mDynamicProperties.GetDynamicSuperProperties_PC(),false); + } + if (this.mSupperProperties != null && this.mSupperProperties.Count > 0) + { + data.SetProperties(this.mSupperProperties,false); + } + Dictionary deviceInfo = ThinkingSDKUtil.DeviceInfo(); + foreach (string item in ThinkingSDKUtil.DisPresetProperties) + { + if (deviceInfo.ContainsKey(item)) + { + deviceInfo.Remove(item); + } + } + data.SetProperties(deviceInfo, false); + + float duration = 0; + if (mTimeEvents.ContainsKey(data.EventName())) + { + int beginTime = (int)mTimeEvents[data.EventName()]; + int nowTime = Environment.TickCount; + duration = (float)((nowTime - beginTime) / 1000.0); + mTimeEvents.Remove(data.EventName()); + if (mTimeEventsBefore.ContainsKey(data.EventName())) + { + int beforeTime = (int)mTimeEventsBefore[data.EventName()]; + duration = duration + (float)(beforeTime / 1000.0); + mTimeEventsBefore.Remove(data.EventName()); + } + } + if (duration != 0) + { + data.SetDuration(duration); + } + + SendData((ThinkingSDKBaseData)data, immediately); + } + private void SendData(ThinkingSDKBaseData data) + { + SendData(data, false); + } + private void SendData(ThinkingSDKBaseData data, bool immediately) + { + if (IsPaused()) + { + return; + } + if (!string.IsNullOrEmpty(this.mAccountID)) + { + data.SetAccountID(this.mAccountID); + } + if (string.IsNullOrEmpty(this.mDistinctID)) + { + DistinctId(); + } + data.SetDistinctID(this.mDistinctID); + + if (this.mConfig.IsDisabledEvent(data.EventName())) + { + if (ThinkingSDKPublicConfig.IsPrintLog()) ThinkingSDKLogger.Print("Disabled Event: " + data.EventName()); + return; + } + if (this.mConfig.GetMode() == Mode.NORMAL && this.mRequest.GetType() != typeof(ThinkingSDKNormalRequest)) + { + this.mRequest = new ThinkingSDKNormalRequest(this.mAppid, this.mConfig.NormalURL()); + } + + if (immediately) + { + Dictionary dataDic = data.ToDictionary(); + this.mMono.StartCoroutine(mRequest.SendData_2(null, ThinkingSDKJSON.Serialize(dataDic), 1)); + } + else + { + Dictionary dataDic = data.ToDictionary(); + int count = 0; + if (!string.IsNullOrEmpty(this.mConfig.InstanceName())) + { + if (ThinkingSDKPublicConfig.IsPrintLog()) ThinkingSDKLogger.Print("Enqueue data: \n" + ThinkingSDKJSON.Serialize(dataDic) + "\n AppId: " + this.mAppid); + count = ThinkingSDKFileJson.EnqueueTrackingData(dataDic, this.mConfig.InstanceName()); + } + else + { + if (ThinkingSDKPublicConfig.IsPrintLog()) ThinkingSDKLogger.Print("Enqueue data: \n" + ThinkingSDKJSON.Serialize(dataDic) + "\n AppId: " + this.mAppid); + count = ThinkingSDKFileJson.EnqueueTrackingData(dataDic, this.mAppid); + } + if (this.mConfig.GetMode() != Mode.NORMAL || count >= this.mConfig.mUploadSize) + { + if (count >= this.mConfig.mUploadSize) + { + if (ThinkingSDKPublicConfig.IsPrintLog()) ThinkingSDKLogger.Print("Flush automatically (" + this.mAppid + ")"); + } + Flush(); + } + } + } + + private IEnumerator WaitAndFlush() + { + while (true) + { + yield return flushDelay; + if (ThinkingSDKPublicConfig.IsPrintLog()) ThinkingSDKLogger.Print("Flush automatically (" + this.mAppid + ")"); + Flush(); + } + } + + /// + /// flush events data + /// + public virtual void Flush() + { + if (mEventSaveOnly == false) { + mTask.SyncInvokeAllTask(); + + int batchSize = (this.mConfig.GetMode() != Mode.NORMAL) ? 1 : mConfig.mUploadSize; + if (!string.IsNullOrEmpty(this.mConfig.InstanceName())) + { + mTask.StartRequest(mRequest, EventResponseHandle, batchSize, this.mConfig.InstanceName()); + } + else + { + mTask.StartRequest(mRequest, EventResponseHandle, batchSize, this.mAppid); + } + } + } + //public void FlushImmediately() + //{ + // if (mEventSaveOnly == false) + // { + // mTask.SyncInvokeAllTask(); + + // int batchSize = (this.mConfig.GetMode() != Mode.NORMAL) ? 1 : mConfig.mUploadSize; + // string list; + // int eventCount = 0; + // if (!string.IsNullOrEmpty(this.mConfig.InstanceName())) + // { + // list = ThinkingSDKFileJson.DequeueBatchTrackingData(batchSize, this.mConfig.InstanceName(), out eventCount); + // } + // else + // { + // list = ThinkingSDKFileJson.DequeueBatchTrackingData(batchSize, this.mAppid, out eventCount); + // } + // if (eventCount > 0) + // { + // this.mMono.StartCoroutine(mRequest.SendData_2(EventResponseHandle, list, eventCount)); + // } + // } + //} + public void Track(ThinkingSDKEventData eventModel) + { + ThinkingSDKTimeInter time = GetTime(eventModel.Time()); + eventModel.SetTime(time); + SendData(eventModel); + } + + public virtual void SetSuperProperties(Dictionary superProperties) + { + if (IsPaused()) + { + return; + } + Dictionary properties = new Dictionary(); + string propertiesStr = (string)ThinkingSDKFile.GetData(this.mAppid, ThinkingSDKConstant.SUPER_PROPERTY, typeof(string)); + if (!string.IsNullOrEmpty(propertiesStr)) + { + properties = ThinkingSDKJSON.Deserialize(propertiesStr); + } + ThinkingSDKUtil.AddDictionary(properties, superProperties); + this.mSupperProperties = properties; + ThinkingSDKFile.SaveData(this.mAppid, ThinkingSDKConstant.SUPER_PROPERTY, ThinkingSDKJSON.Serialize(this.mSupperProperties)); + } + public virtual void UnsetSuperProperty(string propertyKey) + { + if (IsPaused()) + { + return; + } + Dictionary properties = new Dictionary(); + string propertiesStr = (string)ThinkingSDKFile.GetData(this.mAppid, ThinkingSDKConstant.SUPER_PROPERTY, typeof(string)); + if (!string.IsNullOrEmpty(propertiesStr)) + { + properties = ThinkingSDKJSON.Deserialize(propertiesStr); + } + if (properties.ContainsKey(propertyKey)) + { + properties.Remove(propertyKey); + } + this.mSupperProperties = properties; + ThinkingSDKFile.SaveData(this.mAppid, ThinkingSDKConstant.SUPER_PROPERTY, ThinkingSDKJSON.Serialize(this.mSupperProperties)); + } + public virtual Dictionary SuperProperties() + { + string propertiesStr = (string)ThinkingSDKFile.GetData(this.mAppid, ThinkingSDKConstant.SUPER_PROPERTY, typeof(string)); + if (!string.IsNullOrEmpty(propertiesStr)) + { + this.mSupperProperties = ThinkingSDKJSON.Deserialize(propertiesStr); + } + return this.mSupperProperties; + } + public Dictionary PresetProperties() + { + Dictionary presetProperties = new Dictionary(); + presetProperties[ThinkingSDKConstant.DEVICE_ID] = ThinkingSDKDeviceInfo.DeviceID(); + presetProperties[ThinkingSDKConstant.CARRIER] = ThinkingSDKDeviceInfo.Carrier(); + presetProperties[ThinkingSDKConstant.OS] = ThinkingSDKDeviceInfo.OS(); + presetProperties[ThinkingSDKConstant.SCREEN_HEIGHT] = ThinkingSDKDeviceInfo.ScreenHeight(); + presetProperties[ThinkingSDKConstant.SCREEN_WIDTH] = ThinkingSDKDeviceInfo.ScreenWidth(); + presetProperties[ThinkingSDKConstant.MANUFACTURE] = ThinkingSDKDeviceInfo.Manufacture(); + presetProperties[ThinkingSDKConstant.DEVICE_MODEL] = ThinkingSDKDeviceInfo.DeviceModel(); + presetProperties[ThinkingSDKConstant.SYSTEM_LANGUAGE] = ThinkingSDKDeviceInfo.MachineLanguage(); + presetProperties[ThinkingSDKConstant.OS_VERSION] = ThinkingSDKDeviceInfo.OSVersion(); + presetProperties[ThinkingSDKConstant.NETWORK_TYPE] = ThinkingSDKDeviceInfo.NetworkType(); + presetProperties[ThinkingSDKConstant.APP_BUNDLEID] = ThinkingSDKAppInfo.AppIdentifier(); + presetProperties[ThinkingSDKConstant.APP_VERSION] = ThinkingSDKAppInfo.AppVersion(); + presetProperties[ThinkingSDKConstant.ZONE_OFFSET] = ThinkingSDKUtil.ZoneOffset(DateTime.Now, this.mConfig.TimeZone()); + + return presetProperties; + } + public virtual void ClearSuperProperties() + { + if (IsPaused()) + { + return; + } + this.mSupperProperties.Clear(); + ThinkingSDKFile.DeleteData(this.mAppid,ThinkingSDKConstant.SUPER_PROPERTY); + } + + public void TimeEvent(string eventName) + { + if (!mTimeEvents.ContainsKey(eventName)) + { + mTimeEvents.Add(eventName, Environment.TickCount); + } + } + /// + /// Pause Event timing + /// + /// ture: puase timing, false: resume timing + /// event name (null or empty is for all event) + public void PauseTimeEvent(bool status, string eventName = "") + { + if (string.IsNullOrEmpty(eventName)) + { + string[] eventNames = new string[mTimeEvents.Keys.Count]; + mTimeEvents.Keys.CopyTo(eventNames, 0); + for (int i=0; i< eventNames.Length; i++) + { + string key = eventNames[i]; + if (status == true) + { + int startTime = int.Parse(mTimeEvents[key].ToString()); + int pauseTime = Environment.TickCount; + int duration = pauseTime - startTime; + if (mTimeEventsBefore.ContainsKey(key)) + { + duration = duration + int.Parse(mTimeEventsBefore[key].ToString()); + } + mTimeEventsBefore[key] = duration; + } + else + { + mTimeEvents[key] = Environment.TickCount; + } + } + } + else + { + if (status == true) + { + int startTime = int.Parse(mTimeEvents[eventName].ToString()); + int pauseTime = Environment.TickCount; + int duration = pauseTime - startTime; + mTimeEventsBefore[eventName] = duration; + } + else + { + mTimeEvents[eventName] = Environment.TickCount; + } + } + } + public void UserSet(Dictionary properties) + { + UserSet(properties, DateTime.MinValue); + } + public void UserSet(Dictionary properties,DateTime dateTime) + { + ThinkingSDKTimeInter time = GetTime(dateTime); + ThinkingSDKUserData data = new ThinkingSDKUserData(time, ThinkingSDKConstant.USER_SET, properties); + SendData(data); + } + public void UserUnset(string propertyKey) + { + UserUnset(propertyKey, DateTime.MinValue); + } + public void UserUnset(string propertyKey, DateTime dateTime) + { + ThinkingSDKTimeInter time = GetTime(dateTime); + Dictionary properties = new Dictionary(); + properties[propertyKey] = 0; + ThinkingSDKUserData data = new ThinkingSDKUserData(time, ThinkingSDKConstant.USER_UNSET, properties); + SendData(data); + } + public void UserUnset(List propertyKeys) + { + UserUnset(propertyKeys,DateTime.MinValue); + } + public void UserUnset(List propertyKeys, DateTime dateTime) + { + ThinkingSDKTimeInter time = GetTime(dateTime); + Dictionary properties = new Dictionary(); + foreach (string key in propertyKeys) + { + properties[key] = 0; + } + ThinkingSDKUserData data = new ThinkingSDKUserData(time, ThinkingSDKConstant.USER_UNSET, properties); + SendData(data); + } + public void UserSetOnce(Dictionary properties) + { + UserSetOnce(properties, DateTime.MinValue); + } + public void UserSetOnce(Dictionary properties, DateTime dateTime) + { + ThinkingSDKTimeInter time = GetTime(dateTime); + ThinkingSDKUserData data = new ThinkingSDKUserData(time, ThinkingSDKConstant.USER_SETONCE, properties); + SendData(data); + } + public void UserAdd(Dictionary properties) + { + UserAdd(properties, DateTime.MinValue); + } + public void UserAdd(Dictionary properties, DateTime dateTime) + { + ThinkingSDKTimeInter time = GetTime(dateTime); + ThinkingSDKUserData data = new ThinkingSDKUserData(time, ThinkingSDKConstant.USER_ADD, properties); + SendData(data); + } + public void UserAppend(Dictionary properties) + { + UserAppend(properties, DateTime.MinValue); + } + public void UserAppend(Dictionary properties, DateTime dateTime) + { + ThinkingSDKTimeInter time = GetTime(dateTime); + ThinkingSDKUserData data = new ThinkingSDKUserData(time, ThinkingSDKConstant.USER_APPEND, properties); + SendData(data); + } + public void UserUniqAppend(Dictionary properties) + { + UserUniqAppend(properties, DateTime.MinValue); + } + public void UserUniqAppend(Dictionary properties, DateTime dateTime) + { + ThinkingSDKTimeInter time = GetTime(dateTime); + ThinkingSDKUserData data = new ThinkingSDKUserData(time, ThinkingSDKConstant.USER_UNIQ_APPEND, properties); + SendData(data); + } + public void UserDelete() + { + UserDelete(DateTime.MinValue); + } + public void UserDelete(DateTime dateTime) + { + ThinkingSDKTimeInter time = GetTime(dateTime); + Dictionary properties = new Dictionary(); + ThinkingSDKUserData data = new ThinkingSDKUserData(time, ThinkingSDKConstant.USER_DEL,properties); + SendData(data); + } + public void SetDynamicSuperProperties(TDDynamicSuperPropertiesHandler_PC dynamicSuperProperties) + { + if (IsPaused()) + { + return; + } + this.mDynamicProperties = dynamicSuperProperties; + } + protected bool IsPaused() + { + bool mIsPaused = !mEnableTracking || !mOptTracking; + if (mIsPaused) + { + if (ThinkingSDKPublicConfig.IsPrintLog()) ThinkingSDKLogger.Print("SDK Track status is Pause or Stop"); + } + return mIsPaused; + } + + public void SetTrackStatus(TDTrackStatus status) + { + if (ThinkingSDKPublicConfig.IsPrintLog()) ThinkingSDKLogger.Print("Change Status to " + status); + switch (status) + { + case TDTrackStatus.Pause: + mEventSaveOnly = false; + OptTracking(true); + EnableTracking(false); + break; + case TDTrackStatus.Stop: + mEventSaveOnly = false; + EnableTracking(true); + OptTracking(false); + break; + case TDTrackStatus.SaveOnly: + mEventSaveOnly = true; + EnableTracking(true); + OptTracking(true); + break; + case TDTrackStatus.Normal: + default: + mEventSaveOnly = false; + OptTracking(true); + EnableTracking(true); + Flush(); + break; + } + } + + public void OptTracking(bool optTracking) + { + mOptTracking = optTracking; + int opt = optTracking ? 1 : 0; + ThinkingSDKFile.SaveData(mAppid, ThinkingSDKConstant.OPT_TRACK, opt); + if (!optTracking) + { + ThinkingSDKFile.DeleteData(mAppid, ThinkingSDKConstant.ACCOUNT_ID); + ThinkingSDKFile.DeleteData(mAppid, ThinkingSDKConstant.DISTINCT_ID); + ThinkingSDKFile.DeleteData(mAppid, ThinkingSDKConstant.SUPER_PROPERTY); + this.mAccountID = null; + this.mDistinctID = null; + this.mSupperProperties = new Dictionary(); + ThinkingSDKFileJson.DeleteAllTrackingData(mAppid); + } + } + public void EnableTracking(bool isEnable) + { + mEnableTracking = isEnable; + int enable = isEnable ? 1 : 0; + ThinkingSDKFile.SaveData(mAppid, ThinkingSDKConstant.ENABLE_TRACK,enable); + } + private void DefaultTrackState() + { + object enableTrack = ThinkingSDKFile.GetData(mAppid, ThinkingSDKConstant.ENABLE_TRACK, typeof(int)); + object optTrack = ThinkingSDKFile.GetData(mAppid, ThinkingSDKConstant.OPT_TRACK, typeof(int)); + if (enableTrack != null) + { + this.mEnableTracking = ((int)enableTrack) == 1; + } + else + { + this.mEnableTracking = true; + } + if (optTrack != null) + { + this.mOptTracking = ((int)optTrack) == 1; + } + else + { + this.mOptTracking = true; + } + } + public void OptTrackingAndDeleteUser() + { + UserDelete(); + OptTracking(false); + } + public string TimeString(DateTime dateTime) + { + return ThinkingSDKUtil.FormatDate(dateTime, mConfig.TimeZone()); + } + } +} + diff --git a/Assets/HCMiniSdk/Third/ta/Plugins/PC/Main/ThinkingSDKInstance.cs.meta b/Assets/HCMiniSdk/Third/ta/Plugins/PC/Main/ThinkingSDKInstance.cs.meta new file mode 100644 index 00000000..02bd125b --- /dev/null +++ b/Assets/HCMiniSdk/Third/ta/Plugins/PC/Main/ThinkingSDKInstance.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: 8287bb3311be54f52be240639203175f +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/HCMiniSdk/Third/ta/Plugins/PC/Request.meta b/Assets/HCMiniSdk/Third/ta/Plugins/PC/Request.meta new file mode 100644 index 00000000..4d9cce43 --- /dev/null +++ b/Assets/HCMiniSdk/Third/ta/Plugins/PC/Request.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: db5e3ec02eff54121adead1f781264b7 +folderAsset: yes +DefaultImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/HCMiniSdk/Third/ta/Plugins/PC/Request/ThinkingSDKBaseRequest.cs b/Assets/HCMiniSdk/Third/ta/Plugins/PC/Request/ThinkingSDKBaseRequest.cs new file mode 100644 index 00000000..9a671469 --- /dev/null +++ b/Assets/HCMiniSdk/Third/ta/Plugins/PC/Request/ThinkingSDKBaseRequest.cs @@ -0,0 +1,155 @@ +using System; +using System.Net; +using System.Net.Security; +using System.Security.Cryptography.X509Certificates; +using System.Collections.Generic; +using ThinkingSDK.PC.Constant; +using ThinkingSDK.PC.Utils; +using System.IO; +using UnityEngine.Networking; +using System.Collections; +using ThinkingSDK.PC.Config; + +namespace ThinkingSDK.PC.Request +{ + /* + * Enumerate the form of data reported by post, and the enumeration value represents json and form forms + */ + enum POST_TYPE { JSON, FORM }; + public abstract class ThinkingSDKBaseRequest + { + private string mAppid; + private string mURL; + private string mData; + public ThinkingSDKBaseRequest(string appId, string url, string data) + { + mAppid = appId; + mURL = url; + mData = data; + } + public ThinkingSDKBaseRequest(string appId, string url) + { + mAppid = appId; + mURL = url; + } + public void SetData(string data) + { + this.mData = data; + } + public string APPID() { + return mAppid; + } + public string URL() + { + return mURL; + } + public string Data() + { + return mData; + } + /** + * initialization interface + */ + public static void GetConfig(string url,ResponseHandle responseHandle) + { + if (!ThinkingSDKUtil.IsValiadURL(url)) + { + if (ThinkingSDKPublicConfig.IsPrintLog()) ThinkingSDKLogger.Print("Invalid Url:\n" + url); + } + HttpWebRequest request = (HttpWebRequest)WebRequest.Create(url); + request.Method = "GET"; + HttpWebResponse response = (HttpWebResponse)request.GetResponse(); + var responseResult = new StreamReader(response.GetResponseStream()).ReadToEnd(); + if (responseResult != null) + { + if (ThinkingSDKPublicConfig.IsPrintLog()) ThinkingSDKLogger.Print("Request URL:\n"+url); + if (ThinkingSDKPublicConfig.IsPrintLog()) ThinkingSDKLogger.Print("Response:\n"+responseResult); + } + } + + public bool MyRemoteCertificateValidationCallback(System.Object sender, X509Certificate certificate, X509Chain chain, SslPolicyErrors sslPolicyErrors) + { + bool isOk = true; + // If there are errors in the certificate chain, + // look at each error to determine the cause. + if (sslPolicyErrors != SslPolicyErrors.None) { + for (int i=0; i param, ResponseHandle responseHandle) + { + string uri = url + "?appid=" + appId; + if (param != null) + { + uri = uri + "&data=" + ThinkingSDKJSON.Serialize(param); + } + + using (UnityWebRequest webRequest = UnityWebRequest.Get(uri)) + { + webRequest.timeout = 30; + webRequest.SetRequestHeader("Content-Type", "application/x-www-form-urlencoded"); + + //if (ThinkingSDKPublicConfig.IsPrintLog()) ThinkingSDKLogger.Print("Request URL: \n" + uri); + + // Request and wait for the desired page. + yield return webRequest.SendWebRequest(); + + Dictionary resultDict = null; +#if UNITY_2020_1_OR_NEWER + switch (webRequest.result) + { + case UnityWebRequest.Result.ConnectionError: + case UnityWebRequest.Result.DataProcessingError: + case UnityWebRequest.Result.ProtocolError: + //if (ThinkingSDKPublicConfig.IsPrintLog()) ThinkingSDKLogger.Print("Error response: \n" + webRequest.error); + break; + case UnityWebRequest.Result.Success: + string resultText = webRequest.downloadHandler.text; + //if (ThinkingSDKPublicConfig.IsPrintLog()) ThinkingSDKLogger.Print("Response: \n" + resultText); + if (!string.IsNullOrEmpty(resultText)) + { + resultDict = ThinkingSDKJSON.Deserialize(resultText); + } + break; + } +#else + if (webRequest.isHttpError || webRequest.isNetworkError) + { + //if (ThinkingSDKPublicConfig.IsPrintLog()) ThinkingSDKLogger.Print("Error response: \n" + webRequest.error); + } + else + { + string resultText = webRequest.downloadHandler.text; + //if (ThinkingSDKPublicConfig.IsPrintLog()) ThinkingSDKLogger.Print("Response: \n" + resultText); + if (!string.IsNullOrEmpty(resultText)) + { + resultDict = ThinkingSDKJSON.Deserialize(resultText); + } + } +#endif + if (responseHandle != null) + { + responseHandle(resultDict); + } + } + } + } +} + diff --git a/Assets/HCMiniSdk/Third/ta/Plugins/PC/Request/ThinkingSDKBaseRequest.cs.meta b/Assets/HCMiniSdk/Third/ta/Plugins/PC/Request/ThinkingSDKBaseRequest.cs.meta new file mode 100644 index 00000000..c52a4c1b --- /dev/null +++ b/Assets/HCMiniSdk/Third/ta/Plugins/PC/Request/ThinkingSDKBaseRequest.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: 3b31966af44764a508681ee9d6e24f7a +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/HCMiniSdk/Third/ta/Plugins/PC/Request/ThinkingSDKDebugRequest.cs b/Assets/HCMiniSdk/Third/ta/Plugins/PC/Request/ThinkingSDKDebugRequest.cs new file mode 100644 index 00000000..8aeb9b22 --- /dev/null +++ b/Assets/HCMiniSdk/Third/ta/Plugins/PC/Request/ThinkingSDKDebugRequest.cs @@ -0,0 +1,95 @@ +using System.Collections.Generic; +using ThinkingSDK.PC.Config; +using ThinkingSDK.PC.Constant; +using ThinkingSDK.PC.Utils; +using UnityEngine; +using UnityEngine.Networking; +using System.Collections; + +namespace ThinkingSDK.PC.Request +{ + public class ThinkingSDKDebugRequest:ThinkingSDKBaseRequest + { + private int mDryRun = 0; + private string mDeviceID = ThinkingSDKDeviceInfo.DeviceID(); + public void SetDryRun(int dryRun) + { + mDryRun = dryRun; + } + public ThinkingSDKDebugRequest(string appId, string url, string data):base(appId,url,data) + { + + } + public ThinkingSDKDebugRequest(string appId, string url) : base(appId, url) + { + } + + public override IEnumerator SendData_2(ResponseHandle responseHandle, string data, int eventCount) + { + this.SetData(data); + string uri = this.URL(); + //string content = ThinkingSDKJSON.Serialize(this.Data()[0]); + string content = data.Substring(1,data.Length-2); + + WWWForm form = new WWWForm(); + form.AddField("appid", this.APPID()); + form.AddField("source", "client"); + form.AddField("dryRun", mDryRun); + form.AddField("deviceId", mDeviceID); + form.AddField("data", content); + + using (UnityWebRequest webRequest = UnityWebRequest.Post(uri, form)) + { + webRequest.timeout = 30; + webRequest.SetRequestHeader("Content-Type", "application/x-www-form-urlencoded"); + + if (ThinkingSDKPublicConfig.IsPrintLog()) ThinkingSDKLogger.Print("Send event Request:\n " + content + "\n URL = " + uri); + + // Request and wait for the desired page. + yield return webRequest.SendWebRequest(); + + Dictionary resultDict = null; +#if UNITY_2020_1_OR_NEWER + switch (webRequest.result) + { + case UnityWebRequest.Result.ConnectionError: + case UnityWebRequest.Result.DataProcessingError: + case UnityWebRequest.Result.ProtocolError: + if (ThinkingSDKPublicConfig.IsPrintLog()) ThinkingSDKLogger.Print("Send event Response Error:\n " + webRequest.error); + break; + case UnityWebRequest.Result.Success: + string resultText = webRequest.downloadHandler.text; + if (ThinkingSDKPublicConfig.IsPrintLog()) ThinkingSDKLogger.Print("Send event Response:\n " + resultText); + if (!string.IsNullOrEmpty(resultText)) + { + resultDict = ThinkingSDKJSON.Deserialize(resultText); + } + break; + } +#else + if (webRequest.isHttpError || webRequest.isNetworkError) + { + if (ThinkingSDKPublicConfig.IsPrintLog()) ThinkingSDKLogger.Print("Send event Response Error:\n " + webRequest.error); + } + else + { + string resultText = webRequest.downloadHandler.text; + if (ThinkingSDKPublicConfig.IsPrintLog()) ThinkingSDKLogger.Print("Send event Response:\n " + resultText); + if (!string.IsNullOrEmpty(resultText)) + { + resultDict = ThinkingSDKJSON.Deserialize(resultText); + } + } +#endif + if (responseHandle != null) + { + if (resultDict != null) + { + resultDict.Add("flush_count", eventCount); + } + responseHandle(resultDict); + } + } + } + } +} diff --git a/Assets/HCMiniSdk/Third/ta/Plugins/PC/Request/ThinkingSDKDebugRequest.cs.meta b/Assets/HCMiniSdk/Third/ta/Plugins/PC/Request/ThinkingSDKDebugRequest.cs.meta new file mode 100644 index 00000000..e8c9592d --- /dev/null +++ b/Assets/HCMiniSdk/Third/ta/Plugins/PC/Request/ThinkingSDKDebugRequest.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: 7849691904f3c426e81a91572a027863 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/HCMiniSdk/Third/ta/Plugins/PC/Request/ThinkingSDKNormalRequest.cs b/Assets/HCMiniSdk/Third/ta/Plugins/PC/Request/ThinkingSDKNormalRequest.cs new file mode 100644 index 00000000..082d158e --- /dev/null +++ b/Assets/HCMiniSdk/Third/ta/Plugins/PC/Request/ThinkingSDKNormalRequest.cs @@ -0,0 +1,106 @@ +using System; +using System.Collections.Generic; +using System.IO; +using System.IO.Compression; +using System.Text; +using ThinkingSDK.PC.Constant; +using ThinkingSDK.PC.Utils; +using UnityEngine.Networking; +using System.Collections; +using ThinkingSDK.PC.Config; + +namespace ThinkingSDK.PC.Request +{ + public class ThinkingSDKNormalRequest:ThinkingSDKBaseRequest + { + public ThinkingSDKNormalRequest(string appId, string url, string data) :base(appId, url, data) + { + } + public ThinkingSDKNormalRequest(string appId, string url) : base(appId, url) + { + } + + public override IEnumerator SendData_2(ResponseHandle responseHandle, string data, int eventCount) + { + this.SetData(data); + string uri = this.URL(); + var flush_time = ThinkingSDKUtil.GetTimeStamp(); + + string content = "{\"#app_id\":\"" + this.APPID() + "\",\"data\":" + data + ",\"#flush_time\":" + flush_time + "}"; + string encodeContent = Encode(content); + byte[] contentCompressed = Encoding.UTF8.GetBytes(encodeContent); + + using (UnityWebRequest webRequest = new UnityWebRequest(uri, "POST")) + { + webRequest.timeout = 30; + webRequest.SetRequestHeader("Content-Type", "text/plain"); + webRequest.SetRequestHeader("appid", this.APPID()); + webRequest.SetRequestHeader("TA-Integration-Type", "PC"); + webRequest.SetRequestHeader("TA-Integration-Version", ThinkingSDKPublicConfig.Version()); + webRequest.SetRequestHeader("TA-Integration-Count", "1"); + webRequest.SetRequestHeader("TA-Integration-Extra", "PC"); + webRequest.uploadHandler = (UploadHandler)new UploadHandlerRaw(contentCompressed); + webRequest.downloadHandler = (DownloadHandler)new DownloadHandlerBuffer(); + + if (ThinkingSDKPublicConfig.IsPrintLog()) ThinkingSDKLogger.Print("Send event Request:\n " + content + "\n URL = " + uri); + + // Request and wait for the desired page. + yield return webRequest.SendWebRequest(); + + Dictionary resultDict = null; +#if UNITY_2020_1_OR_NEWER + switch (webRequest.result) + { + case UnityWebRequest.Result.ConnectionError: + case UnityWebRequest.Result.DataProcessingError: + case UnityWebRequest.Result.ProtocolError: + if (ThinkingSDKPublicConfig.IsPrintLog()) ThinkingSDKLogger.Print("Send event Response Error:\n " + webRequest.error); + break; + case UnityWebRequest.Result.Success: + string resultText = webRequest.downloadHandler.text; + if (ThinkingSDKPublicConfig.IsPrintLog()) ThinkingSDKLogger.Print("Send event Response:\n " + resultText); + if (!string.IsNullOrEmpty(resultText)) + { + resultDict = ThinkingSDKJSON.Deserialize(resultText); + } + break; + } +#else + if (webRequest.isHttpError || webRequest.isNetworkError) + { + if (ThinkingSDKPublicConfig.IsPrintLog()) ThinkingSDKLogger.Print("Send event Response Error:\n " + webRequest.error); + } + else + { + string resultText = webRequest.downloadHandler.text; + if (ThinkingSDKPublicConfig.IsPrintLog()) ThinkingSDKLogger.Print("Send event Response:\n " + resultText); + if (!string.IsNullOrEmpty(resultText)) + { + resultDict = ThinkingSDKJSON.Deserialize(resultText); + } + } +#endif + if (responseHandle != null) + { + if (resultDict != null) + { + resultDict.Add("flush_count", eventCount); + } + responseHandle(resultDict); + } + } + } + private static string Encode(string inputStr) + { + byte[] inputBytes = Encoding.UTF8.GetBytes(inputStr); + using (var outputStream = new MemoryStream()) + { + using (var gzipStream = new GZipStream(outputStream, CompressionMode.Compress)) + gzipStream.Write(inputBytes, 0, inputBytes.Length); + byte[] output = outputStream.ToArray(); + return Convert.ToBase64String(output); + } + } + + } +} diff --git a/Assets/HCMiniSdk/Third/ta/Plugins/PC/Request/ThinkingSDKNormalRequest.cs.meta b/Assets/HCMiniSdk/Third/ta/Plugins/PC/Request/ThinkingSDKNormalRequest.cs.meta new file mode 100644 index 00000000..b1ff204b --- /dev/null +++ b/Assets/HCMiniSdk/Third/ta/Plugins/PC/Request/ThinkingSDKNormalRequest.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: 992a71ad5ae554eb98a712f6a65b3a7f +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/HCMiniSdk/Third/ta/Plugins/PC/Storage.meta b/Assets/HCMiniSdk/Third/ta/Plugins/PC/Storage.meta new file mode 100644 index 00000000..56bae737 --- /dev/null +++ b/Assets/HCMiniSdk/Third/ta/Plugins/PC/Storage.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: 21f73e209611b40d3a1c87e9418529b2 +folderAsset: yes +DefaultImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/HCMiniSdk/Third/ta/Plugins/PC/Storage/ThinkingSDKFile.cs b/Assets/HCMiniSdk/Third/ta/Plugins/PC/Storage/ThinkingSDKFile.cs new file mode 100644 index 00000000..caca1700 --- /dev/null +++ b/Assets/HCMiniSdk/Third/ta/Plugins/PC/Storage/ThinkingSDKFile.cs @@ -0,0 +1,80 @@ +using System; +using UnityEngine; + +namespace ThinkingSDK.PC.Storage +{ + public class ThinkingSDKFile + { + private static string connectorKey = "_"; + public static string GetKey(string prefix,string key) + { + return prefix + connectorKey + key; + } + public static void SaveData(string prefix, string key, object value) + { + SaveData(GetKey(prefix, key), value); + } + public static void SaveData(string key, object value) + { + if (!string.IsNullOrEmpty(key)) + { + if (value.GetType() == typeof(int)) + { + PlayerPrefs.SetInt(key, (int)value); + } + else if (value.GetType() == typeof(float)) + { + PlayerPrefs.SetFloat(key, (float)value); + } + else if (value.GetType() == typeof(string)) + { + PlayerPrefs.SetString(key, (string)value); + } + PlayerPrefs.Save(); + } + } + public static object GetData(string key, Type type) + { + if (!string.IsNullOrEmpty(key) && PlayerPrefs.HasKey(key)) + { + if (type == typeof(int)) + { + return PlayerPrefs.GetInt(key); + } + else if (type == typeof(float)) + { + return PlayerPrefs.GetFloat(key); + } + else if (type == typeof(string)) + { + return PlayerPrefs.GetString(key); + } + PlayerPrefs.Save(); + } + return null; + + } + public static object GetData(string prefix,string key, Type type) + { + key = GetKey(prefix, key); + return GetData(key, type); + } + + public static void DeleteData(string key) + { + if (!string.IsNullOrEmpty(key)) + { + if (PlayerPrefs.HasKey(key)) + { + PlayerPrefs.DeleteKey(key); + } + } + } + public static void DeleteData(string prefix,string key) + { + key = GetKey(prefix, key); + DeleteData(key); + } + } +} + diff --git a/Assets/HCMiniSdk/Third/ta/Plugins/PC/Storage/ThinkingSDKFile.cs.meta b/Assets/HCMiniSdk/Third/ta/Plugins/PC/Storage/ThinkingSDKFile.cs.meta new file mode 100644 index 00000000..8ad1e336 --- /dev/null +++ b/Assets/HCMiniSdk/Third/ta/Plugins/PC/Storage/ThinkingSDKFile.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: be6ada75d19854acca2314015d2c6376 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/HCMiniSdk/Third/ta/Plugins/PC/Storage/ThinkingSDKFileJson.cs b/Assets/HCMiniSdk/Third/ta/Plugins/PC/Storage/ThinkingSDKFileJson.cs new file mode 100644 index 00000000..18e9cd76 --- /dev/null +++ b/Assets/HCMiniSdk/Third/ta/Plugins/PC/Storage/ThinkingSDKFileJson.cs @@ -0,0 +1,188 @@ +using System; +using System.Collections.Generic; +using UnityEngine; +using ThinkingSDK.PC.Utils; + +namespace ThinkingSDK.PC.Storage +{ + public class ThinkingSDKFileJson + { + // Save the event, return the number of cached events + internal static int EnqueueTrackingData(Dictionary data, string prefix) + { + int eventId = EventAutoIncrementingID(prefix); + string trackingKey = GetEventKeysPrefix(prefix, eventId); + + var dataJson = ThinkingSDKJSON.Serialize(data); + PlayerPrefs.SetString(trackingKey, dataJson); + IncreaseTrackingDataID(prefix); + int eventCount = EventAutoIncrementingID(prefix) - EventIndexID(prefix); + return eventCount; + } + + // Get event end ID + internal static int EventAutoIncrementingID(string prefix) + { + string mEventAutoIncrementingID = GetEventAutoIncrementingIDKey(prefix); + return PlayerPrefs.HasKey(mEventAutoIncrementingID) ? PlayerPrefs.GetInt(mEventAutoIncrementingID) : 0; + } + + // Auto increment event end ID + private static void IncreaseTrackingDataID(string prefix) + { + int id = EventAutoIncrementingID(prefix); + id += 1; + PlayerPrefs.SetInt(GetEventAutoIncrementingIDKey(prefix), id); + } + + // Reset event end ID + private static void ResetTrackingDataID(string prefix) + { + int id = 0; + PlayerPrefs.SetInt(GetEventAutoIncrementingIDKey(prefix), id); + } + + // Get event start ID + internal static int EventIndexID(string prefix) + { + string eventIndexID = GetEventIndexIDKey(prefix); + return PlayerPrefs.HasKey(eventIndexID) ? PlayerPrefs.GetInt(eventIndexID) : 0; + } + + // Save time start ID + private static void SaveEventIndexID(int indexID, string prefix) + { + string eventIndexID = GetEventIndexIDKey(prefix); + PlayerPrefs.SetInt(eventIndexID, indexID); + } + + // Fetch a specified number of events in batches + internal static string DequeueBatchTrackingData(int batchSize, string prefix, out int eventCount) + { + string batchData = eventBatchPrefix; + List> tempDataList = new List>(); + int dataIndex = EventIndexID(prefix); + int maxIndex = EventAutoIncrementingID(prefix) - 1; + eventCount = 0; + while (eventCount < batchSize && dataIndex <= maxIndex) { + string trackingKey = GetEventKeysPrefix(prefix, dataIndex); + if (PlayerPrefs.HasKey(trackingKey)) { + string dataJson = PlayerPrefs.GetString(trackingKey); + if (eventCount < batchSize - 1 && dataIndex < maxIndex) + { + batchData = batchData + dataJson + eventBatchInfix; + } + else + { + batchData = batchData + dataJson; + } + eventCount++; + } + dataIndex++; + } + + if (eventCount > 0) + { + batchData = batchData + eventBatchSuffix; + return batchData; + } + else + { + return null; + } + } + + // Batch delete the specified number of events and return the remaining number of events + internal static int DeleteBatchTrackingData(int batchSize, string prefix) + { + int deletedCount = 0; + int dataIndex = EventIndexID(prefix); + int maxIndex = EventAutoIncrementingID(prefix) - 1; + while (deletedCount < batchSize && dataIndex <= maxIndex) { + string trackingKey = GetEventKeysPrefix(prefix, dataIndex); + if (PlayerPrefs.HasKey(trackingKey)) { + PlayerPrefs.DeleteKey(trackingKey); + deletedCount++; + } + dataIndex++; + } + SaveEventIndexID(dataIndex, prefix); + + int eventCount = EventAutoIncrementingID(prefix) - EventIndexID(prefix); + return eventCount; + } + + // Batch delete specified events + // internal static void DeleteBatchTrackingData(List> batch, string prefix) { + // foreach(Dictionary data in batch) { + // String id = data["id"].ToString(); + // if (id != null && PlayerPrefs.HasKey(id)) { + // PlayerPrefs.DeleteKey(id); + // } + // } + // } + + // Batch delete all events + internal static int DeleteAllTrackingData(string prefix) + { + DeleteBatchTrackingData(int.MaxValue, prefix); + SaveEventIndexID(0, prefix); + ResetTrackingDataID(prefix); + return 0; + } + + private static string eventKeyInfix = "Event"; + private static string eventIndexIDSuffix = "EventIndexID"; + private static string eventAutoIncrementingIDSuffix = "EventAutoIncrementingID"; + + private static string eventBatchPrefix = "["; + private static string eventBatchInfix = ","; + private static string eventBatchSuffix = "]"; + + private static Dictionary eventKeysPrefix = new Dictionary() { }; + private static Dictionary eventIndexIDKeys = new Dictionary() { }; + private static Dictionary eventAutoIncrementingIDKeys = new Dictionary() { }; + + private static string GetEventKeysPrefix(string prefix, int index) + { + if (eventKeysPrefix.ContainsKey(prefix)) + { + return eventKeysPrefix[prefix] + index; + } + else + { + string eventKey = prefix + eventKeyInfix; + eventKeysPrefix[prefix] = eventKey; + return eventKey + index; + } + } + + private static string GetEventIndexIDKey(string prefix) + { + if (eventIndexIDKeys.ContainsKey(prefix)) + { + return eventIndexIDKeys[prefix]; + } + else + { + string eventKey = prefix + eventIndexIDSuffix; + eventIndexIDKeys[prefix] = eventKey; + return eventKey; + } + } + + private static string GetEventAutoIncrementingIDKey(string prefix) + { + if (eventAutoIncrementingIDKeys.ContainsKey(prefix)) + { + return eventAutoIncrementingIDKeys[prefix]; + } + else + { + string eventKey = prefix + eventAutoIncrementingIDSuffix; + eventAutoIncrementingIDKeys[prefix] = eventKey; + return eventKey; + } + } + } +} diff --git a/Assets/HCMiniSdk/Third/ta/Plugins/PC/Storage/ThinkingSDKFileJson.cs.meta b/Assets/HCMiniSdk/Third/ta/Plugins/PC/Storage/ThinkingSDKFileJson.cs.meta new file mode 100644 index 00000000..b08277c6 --- /dev/null +++ b/Assets/HCMiniSdk/Third/ta/Plugins/PC/Storage/ThinkingSDKFileJson.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: d4bedacbe272d46bda26db9388665562 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/HCMiniSdk/Third/ta/Plugins/PC/TaskManager.meta b/Assets/HCMiniSdk/Third/ta/Plugins/PC/TaskManager.meta new file mode 100644 index 00000000..bd2f83f9 --- /dev/null +++ b/Assets/HCMiniSdk/Third/ta/Plugins/PC/TaskManager.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: 372921461f6fe4648827f1a91a1759e1 +folderAsset: yes +DefaultImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/HCMiniSdk/Third/ta/Plugins/PC/TaskManager/ThinkingSDKTask.cs b/Assets/HCMiniSdk/Third/ta/Plugins/PC/TaskManager/ThinkingSDKTask.cs new file mode 100644 index 00000000..960330d4 --- /dev/null +++ b/Assets/HCMiniSdk/Third/ta/Plugins/PC/TaskManager/ThinkingSDKTask.cs @@ -0,0 +1,124 @@ +using UnityEngine; +using System.Collections; +using System.Collections.Generic; +using ThinkingSDK.PC.Request; +using ThinkingSDK.PC.Constant; +using ThinkingSDK.PC.Storage; + +namespace ThinkingSDK.PC.TaskManager +{ + [DisallowMultipleComponent] + public class ThinkingSDKTask : MonoBehaviour + { + private readonly static object _locker = new object(); + + private List requestList = new List(); + private List responseHandleList = new List(); + private List batchSizeList = new List(); + private List appIdList = new List(); + + + private static ThinkingSDKTask mSingleTask; + + private bool isWaiting = false; + private float updateInterval = 0; + + public static ThinkingSDKTask SingleTask() + { + return mSingleTask; + } + + private void Awake() { + mSingleTask = this; + } + + private void Start() { + } + + private void Update() { + updateInterval += UnityEngine.Time.deltaTime; + if (updateInterval > 0.2) + { + updateInterval = 0; + if (!isWaiting && requestList.Count > 0) + { + WaitOne(); + StartRequestSendData(); + } + } + } + + /// + /// hold signal + /// + public void WaitOne() + { + isWaiting = true; + } + /// + /// release signal + /// + public void Release() + { + isWaiting = false; + } + public void SyncInvokeAllTask() + { + + } + + public void StartRequest(ThinkingSDKBaseRequest mRequest, ResponseHandle responseHandle, int batchSize, string appId) + { + lock(_locker) + { + requestList.Add(mRequest); + responseHandleList.Add(responseHandle); + batchSizeList.Add(batchSize); + appIdList.Add(appId); + } + } + + private void StartRequestSendData() + { + if (requestList.Count > 0) + { + ThinkingSDKBaseRequest mRequest; + ResponseHandle responseHandle; + string list; + int eventCount = 0; + lock (_locker) + { + mRequest = requestList[0]; + responseHandle = responseHandleList[0]; + list = ThinkingSDKFileJson.DequeueBatchTrackingData(batchSizeList[0], appIdList[0], out eventCount); + } + if (mRequest != null) + { + if (eventCount > 0 && list.Length > 0) + { + this.StartCoroutine(this.SendData(mRequest, responseHandle, list, eventCount)); + } + else + { + if (responseHandle != null) + { + responseHandle(null); + } + } + lock(_locker) + { + requestList.RemoveAt(0); + responseHandleList.RemoveAt(0); + batchSizeList.RemoveAt(0); + appIdList.RemoveAt(0); + } + } + + } + } + private IEnumerator SendData(ThinkingSDKBaseRequest mRequest, ResponseHandle responseHandle, string list, int eventCount) { + yield return mRequest.SendData_2(responseHandle, list, eventCount); + } + } +} + diff --git a/Assets/HCMiniSdk/Third/ta/Plugins/PC/TaskManager/ThinkingSDKTask.cs.meta b/Assets/HCMiniSdk/Third/ta/Plugins/PC/TaskManager/ThinkingSDKTask.cs.meta new file mode 100644 index 00000000..ce3d9c5b --- /dev/null +++ b/Assets/HCMiniSdk/Third/ta/Plugins/PC/TaskManager/ThinkingSDKTask.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: eb96ead89c0c544608be4e0ad781de78 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/HCMiniSdk/Third/ta/Plugins/PC/ThinkingSDK.asmdef b/Assets/HCMiniSdk/Third/ta/Plugins/PC/ThinkingSDK.asmdef new file mode 100644 index 00000000..4c20b5e4 --- /dev/null +++ b/Assets/HCMiniSdk/Third/ta/Plugins/PC/ThinkingSDK.asmdef @@ -0,0 +1,3 @@ +{ + "name": "ThinkingSDK" +} diff --git a/Assets/Plugins/ByteGame/com.bytedance.starksdk.unitytools/Editor/template.json.meta b/Assets/HCMiniSdk/Third/ta/Plugins/PC/ThinkingSDK.asmdef.meta similarity index 59% rename from Assets/Plugins/ByteGame/com.bytedance.starksdk.unitytools/Editor/template.json.meta rename to Assets/HCMiniSdk/Third/ta/Plugins/PC/ThinkingSDK.asmdef.meta index 7693ce41..a78dc3e6 100644 --- a/Assets/Plugins/ByteGame/com.bytedance.starksdk.unitytools/Editor/template.json.meta +++ b/Assets/HCMiniSdk/Third/ta/Plugins/PC/ThinkingSDK.asmdef.meta @@ -1,7 +1,7 @@ -fileFormatVersion: 2 -guid: f62eca89b1c747b49a303d11d1488c68 -TextScriptImporter: - externalObjects: {} - userData: - assetBundleName: - assetBundleVariant: +fileFormatVersion: 2 +guid: 0a958a7eb80a248e1b8bc4553787c209 +AssemblyDefinitionImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/HCMiniSdk/Third/ta/Plugins/PC/Time.meta b/Assets/HCMiniSdk/Third/ta/Plugins/PC/Time.meta new file mode 100644 index 00000000..ee5221a9 --- /dev/null +++ b/Assets/HCMiniSdk/Third/ta/Plugins/PC/Time.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: c859b53e53b824a2aa36430c980862cf +folderAsset: yes +DefaultImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/HCMiniSdk/Third/ta/Plugins/PC/Time/TDTimeout.cs b/Assets/HCMiniSdk/Third/ta/Plugins/PC/Time/TDTimeout.cs new file mode 100644 index 00000000..3c2de2c1 --- /dev/null +++ b/Assets/HCMiniSdk/Third/ta/Plugins/PC/Time/TDTimeout.cs @@ -0,0 +1,44 @@ +using UnityEngine; +using System.Collections; +using System; +using System.Threading; + +namespace ThinkingSDK.PC.Time +{ + public class TDTimeout : MonoBehaviour + { + // Use this for initialization + void Start() + { + + } + + // Update is called once per frame + void Update() + { + + } + + public static void SetTimeout(int timeout, Action action, object obj) + { + GameObject gameObject = new GameObject("TDTimeout"); + var tdTimeout = gameObject.AddComponent(); + tdTimeout._setTimeout(timeout, action, obj); + } + + private void _setTimeout(int timeout, Action action, object obj) + { + StartCoroutine(_wait(timeout, action, obj)); + } + + private IEnumerator _wait(int timeout, Action action, object obj) + { + yield return new WaitForSeconds(timeout); + if (action != null) + { + action(obj); + } + Destroy(gameObject); + } + } +} diff --git a/Assets/HCMiniSdk/Third/ta/Plugins/PC/Time/TDTimeout.cs.meta b/Assets/HCMiniSdk/Third/ta/Plugins/PC/Time/TDTimeout.cs.meta new file mode 100644 index 00000000..81367bda --- /dev/null +++ b/Assets/HCMiniSdk/Third/ta/Plugins/PC/Time/TDTimeout.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: 4c4b6a31edd864c43a12c23d11ac6ddd +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/HCMiniSdk/Third/ta/Plugins/PC/Time/ThinkingSDKCalibratedTime.cs b/Assets/HCMiniSdk/Third/ta/Plugins/PC/Time/ThinkingSDKCalibratedTime.cs new file mode 100644 index 00000000..cd24363a --- /dev/null +++ b/Assets/HCMiniSdk/Third/ta/Plugins/PC/Time/ThinkingSDKCalibratedTime.cs @@ -0,0 +1,43 @@ +using System; +using ThinkingSDK.PC.Utils; + +namespace ThinkingSDK.PC.Time +{ + public class ThinkingSDKCalibratedTime : ThinkingSDKTimeInter + { + private ThinkingSDKTimeCalibration mCalibratedTime; + private long mSystemElapsedRealtime; + private TimeZoneInfo mTimeZone; + private DateTime mDate; + public ThinkingSDKCalibratedTime(ThinkingSDKTimeCalibration calibrateTimeInter,TimeZoneInfo timeZoneInfo) + { + this.mCalibratedTime = calibrateTimeInter; + this.mTimeZone = timeZoneInfo; + this.mDate = mCalibratedTime.NowDate(); + } + public string GetTime(TimeZoneInfo timeZone) + { + if (timeZone == null) + { + return ThinkingSDKUtil.FormatDate(mDate, mTimeZone); + } + else + { + return ThinkingSDKUtil.FormatDate(mDate, timeZone); + } + } + + public double GetZoneOffset(TimeZoneInfo timeZone) + { + if (timeZone == null) + { + return ThinkingSDKUtil.ZoneOffset(mDate, mTimeZone); + } + else + { + return ThinkingSDKUtil.ZoneOffset(mDate, timeZone); + } + } + } + +} diff --git a/Assets/HCMiniSdk/Third/ta/Plugins/PC/Time/ThinkingSDKCalibratedTime.cs.meta b/Assets/HCMiniSdk/Third/ta/Plugins/PC/Time/ThinkingSDKCalibratedTime.cs.meta new file mode 100644 index 00000000..4d4dc146 --- /dev/null +++ b/Assets/HCMiniSdk/Third/ta/Plugins/PC/Time/ThinkingSDKCalibratedTime.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: 46014ab35934a4a90b8329f357801cdf +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/HCMiniSdk/Third/ta/Plugins/PC/Time/ThinkingSDKDefinedTime.cs b/Assets/HCMiniSdk/Third/ta/Plugins/PC/Time/ThinkingSDKDefinedTime.cs new file mode 100644 index 00000000..654a19e3 --- /dev/null +++ b/Assets/HCMiniSdk/Third/ta/Plugins/PC/Time/ThinkingSDKDefinedTime.cs @@ -0,0 +1,25 @@ +using System; + +namespace ThinkingSDK.PC.Time +{ + public class ThinkingSDKDefinedTime : ThinkingSDKTimeInter + { + private string mTime; + private double mZoneOffset; + public ThinkingSDKDefinedTime(string time,double zoneOffset) + { + this.mTime = time; + this.mZoneOffset = zoneOffset; + } + public string GetTime(TimeZoneInfo timeZone) + { + return this.mTime; + } + + public double GetZoneOffset(TimeZoneInfo timeZone) + { + return this.mZoneOffset; + } + } +} + diff --git a/Assets/HCMiniSdk/Third/ta/Plugins/PC/Time/ThinkingSDKDefinedTime.cs.meta b/Assets/HCMiniSdk/Third/ta/Plugins/PC/Time/ThinkingSDKDefinedTime.cs.meta new file mode 100644 index 00000000..7cdf3fa8 --- /dev/null +++ b/Assets/HCMiniSdk/Third/ta/Plugins/PC/Time/ThinkingSDKDefinedTime.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: 86eabc3f1cff146f89092cd516702db9 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/HCMiniSdk/Third/ta/Plugins/PC/Time/ThinkingSDKNTPCalibration.cs b/Assets/HCMiniSdk/Third/ta/Plugins/PC/Time/ThinkingSDKNTPCalibration.cs new file mode 100644 index 00000000..647b7c63 --- /dev/null +++ b/Assets/HCMiniSdk/Third/ta/Plugins/PC/Time/ThinkingSDKNTPCalibration.cs @@ -0,0 +1,131 @@ +using System; +using System.Net; +using System.Net.Sockets; +using System.Linq; + +namespace ThinkingSDK.PC.Time +{ + public class ThinkingSDKNTPCalibration : ThinkingSDKTimeCalibration + { + public ThinkingSDKNTPCalibration(string ntpServer) { + double totalMilliseconds = ConvertDateTimeInt(DateTime.UtcNow); + this.mStartTime = (long)totalMilliseconds; + this.mSystemElapsedRealtime = Environment.TickCount; + + // request scoket time + Socket socket = GetNetworkTimeSync(ntpServer, this); + // set scoket timeout + TDTimeout.SetTimeout(3, new Action(ScoketTimeout), (object)socket); + } + + private void ScoketTimeout(object obj) + { + if (obj is Socket) + { + Socket socket = (Socket)obj; + if (socket.Connected == true) + { + socket.Close(); + } + } + } + + protected static new double ConvertDateTimeInt(System.DateTime time) + { + DateTime startTime = new DateTime(1970, 1, 1, 0, 0, 0, DateTimeKind.Utc); + return (double)(time - startTime).TotalMilliseconds; + } + + private static Socket GetNetworkTimeSync(string ntpServer, ThinkingSDKTimeCalibration timeCalibration) + { + // NTP message size - 16 bytes of the digest (RFC 2030) + var ntpData = new byte[48]; + + //Setting the Leap Indicator, Version Number and Mode values + ntpData[0] = 0x1B; //LI = 0 (no warning), VN = 3 (IPv4 only), Mode = 3 (Client Mode) + + var addresses = Dns.GetHostEntry(ntpServer).AddressList; + var addressFirst = addresses.First(e => e.AddressFamily == AddressFamily.InterNetwork); + if (addressFirst == null) + { + addressFirst = addresses[0]; + } + + //The UDP port number assigned to NTP is 123 + var ipEndPoint = new IPEndPoint(addressFirst, 123); + //NTP uses UDP + var socket = new Socket(ipEndPoint.AddressFamily, SocketType.Dgram, ProtocolType.Udp); + + socket.Connect(ipEndPoint); + + SocketAsyncEventArgs socketAsyncEventArgs = new SocketAsyncEventArgs(); + socketAsyncEventArgs.SetBuffer(ntpData, 0, ntpData.Length); + socketAsyncEventArgs.UserToken = timeCalibration; + socketAsyncEventArgs.RemoteEndPoint = ipEndPoint; + socketAsyncEventArgs.Completed += SocketAsyncEventArgs_Completed; + // send socket request + socket.SendAsync(socketAsyncEventArgs); + + return socket; + } + + private static void SocketAsyncEventArgs_Completed(object sender, SocketAsyncEventArgs eventArgs) + { + Socket socket = (Socket)sender; + if (eventArgs.SocketError == SocketError.Success) + { + if (eventArgs.LastOperation == SocketAsyncOperation.Send) + { + socket.ReceiveAsync(eventArgs); + } + else if (eventArgs.LastOperation == SocketAsyncOperation.Receive) + { + if (eventArgs.SocketError == SocketError.Success && eventArgs.Buffer.Length > 0) + { + DateTime ntpTime = ParseDateTimeWithNTPData(eventArgs.Buffer); + double totalMilliseconds = ConvertDateTimeInt(ntpTime); + ThinkingSDKTimeCalibration timeCalibration = (ThinkingSDKTimeCalibration)eventArgs.UserToken; + timeCalibration.mStartTime = (long)totalMilliseconds; + } + socket.Close(); + } + else + { + socket.Close(); + } + } + else + { + socket.Close(); + } + } + + static uint SwapEndianness(ulong x) + { + return (uint)(((x & 0x000000ff) << 24) + ((x & 0x0000ff00) << 8) + ((x & 0x00ff0000) >> 8) + ((x & 0xff000000) >> 24)); + } + + private static DateTime ParseDateTimeWithNTPData(byte[] ntpData) + { + //Offset to get to the "Transmit Timestamp" field (time at which the reply + //departed the server for the client, in 64-bit timestamp format." + const byte serverReplyTime = 40; + + //Get the seconds part + ulong intPart = BitConverter.ToUInt32(ntpData, serverReplyTime); + + //Get the seconds fraction + ulong fractPart = BitConverter.ToUInt32(ntpData, serverReplyTime + 4); + + //Convert From big-endian to little-endian + intPart = SwapEndianness(intPart); + fractPart = SwapEndianness(fractPart); + + var milliseconds = (intPart * 1000) + ((fractPart * 1000) / 0x100000000L); + + //**UTC** time + var networkDateTime = (new DateTime(1900, 1, 1, 0, 0, 0, DateTimeKind.Utc)).AddMilliseconds((long)milliseconds); + return networkDateTime; + } + } +} \ No newline at end of file diff --git a/Assets/HCMiniSdk/Third/ta/Plugins/PC/Time/ThinkingSDKNTPCalibration.cs.meta b/Assets/HCMiniSdk/Third/ta/Plugins/PC/Time/ThinkingSDKNTPCalibration.cs.meta new file mode 100644 index 00000000..09d2677e --- /dev/null +++ b/Assets/HCMiniSdk/Third/ta/Plugins/PC/Time/ThinkingSDKNTPCalibration.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: 610a0d13d17714116b2d436c4daf69a9 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/HCMiniSdk/Third/ta/Plugins/PC/Time/ThinkingSDKTime.cs b/Assets/HCMiniSdk/Third/ta/Plugins/PC/Time/ThinkingSDKTime.cs new file mode 100644 index 00000000..4f15c556 --- /dev/null +++ b/Assets/HCMiniSdk/Third/ta/Plugins/PC/Time/ThinkingSDKTime.cs @@ -0,0 +1,42 @@ +using System; +using ThinkingSDK.PC.Utils; + +namespace ThinkingSDK.PC.Time +{ + public class ThinkingSDKTime : ThinkingSDKTimeInter + { + private TimeZoneInfo mTimeZone; + private DateTime mDate; + + public ThinkingSDKTime(TimeZoneInfo timezone, DateTime date) + { + this.mTimeZone = timezone; + this.mDate = date; + } + + public string GetTime(TimeZoneInfo timeZone) + { + if (timeZone == null) + { + return ThinkingSDKUtil.FormatDate(mDate, mTimeZone); + } + else + { + return ThinkingSDKUtil.FormatDate(mDate, timeZone); + } + } + + public double GetZoneOffset(TimeZoneInfo timeZone) + { + if (timeZone == null) + { + return ThinkingSDKUtil.ZoneOffset(mDate, mTimeZone); + } + else + { + return ThinkingSDKUtil.ZoneOffset(mDate, timeZone); + } + } + } + +} diff --git a/Assets/HCMiniSdk/Third/ta/Plugins/PC/Time/ThinkingSDKTime.cs.meta b/Assets/HCMiniSdk/Third/ta/Plugins/PC/Time/ThinkingSDKTime.cs.meta new file mode 100644 index 00000000..97d68569 --- /dev/null +++ b/Assets/HCMiniSdk/Third/ta/Plugins/PC/Time/ThinkingSDKTime.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: 482ba0db5b92b4f9e9475acfda6e496c +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/HCMiniSdk/Third/ta/Plugins/PC/Time/ThinkingSDKTimeCalibration.cs b/Assets/HCMiniSdk/Third/ta/Plugins/PC/Time/ThinkingSDKTimeCalibration.cs new file mode 100644 index 00000000..a4096a0e --- /dev/null +++ b/Assets/HCMiniSdk/Third/ta/Plugins/PC/Time/ThinkingSDKTimeCalibration.cs @@ -0,0 +1,32 @@ +using System; + +namespace ThinkingSDK.PC.Time +{ + public class ThinkingSDKTimeCalibration + { + /// + /// Timestamp when time was calibrated + /// + public long mStartTime; + /// + /// System boot time when calibrating time + /// + public long mSystemElapsedRealtime; + public DateTime NowDate() + { + long nowTime = Environment.TickCount; + long timestamp = nowTime - this.mSystemElapsedRealtime + this.mStartTime; + // DateTime dt = DateTimeOffset.FromUnixTimeMilliseconds(timestamp).LocalDateTime; + // return dt; + + DateTime dt = new DateTime(1970, 1, 1, 0, 0, 0, DateTimeKind.Utc); + return dt.AddMilliseconds(timestamp); + } + + protected static double ConvertDateTimeInt(System.DateTime time) + { + DateTime startTime = new DateTime(1970, 1, 1, 0, 0, 0, DateTimeKind.Utc); + return (double)(time - startTime).TotalMilliseconds; + } + } +} \ No newline at end of file diff --git a/Assets/HCMiniSdk/Third/ta/Plugins/PC/Time/ThinkingSDKTimeCalibration.cs.meta b/Assets/HCMiniSdk/Third/ta/Plugins/PC/Time/ThinkingSDKTimeCalibration.cs.meta new file mode 100644 index 00000000..202b812f --- /dev/null +++ b/Assets/HCMiniSdk/Third/ta/Plugins/PC/Time/ThinkingSDKTimeCalibration.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: b9bb8b764cd4d47bd91702ea2c9a5ad5 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/HCMiniSdk/Third/ta/Plugins/PC/Time/ThinkingSDKTimeInter.cs b/Assets/HCMiniSdk/Third/ta/Plugins/PC/Time/ThinkingSDKTimeInter.cs new file mode 100644 index 00000000..82c17fa2 --- /dev/null +++ b/Assets/HCMiniSdk/Third/ta/Plugins/PC/Time/ThinkingSDKTimeInter.cs @@ -0,0 +1,9 @@ +using System; +namespace ThinkingSDK.PC.Time +{ + public interface ThinkingSDKTimeInter + { + string GetTime(TimeZoneInfo timeZone); + Double GetZoneOffset(TimeZoneInfo timeZone); + } +} diff --git a/Assets/HCMiniSdk/Third/ta/Plugins/PC/Time/ThinkingSDKTimeInter.cs.meta b/Assets/HCMiniSdk/Third/ta/Plugins/PC/Time/ThinkingSDKTimeInter.cs.meta new file mode 100644 index 00000000..16718475 --- /dev/null +++ b/Assets/HCMiniSdk/Third/ta/Plugins/PC/Time/ThinkingSDKTimeInter.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: 0cc5c74f7de224d3aa2fa4668ae7a9f2 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/HCMiniSdk/Third/ta/Plugins/PC/Time/ThinkingSDKTimestampCalibration.cs b/Assets/HCMiniSdk/Third/ta/Plugins/PC/Time/ThinkingSDKTimestampCalibration.cs new file mode 100644 index 00000000..d3da3816 --- /dev/null +++ b/Assets/HCMiniSdk/Third/ta/Plugins/PC/Time/ThinkingSDKTimestampCalibration.cs @@ -0,0 +1,21 @@ +using System; +using ThinkingSDK.PC.Config; +using ThinkingSDK.PC.Utils; + +namespace ThinkingSDK.PC.Time +{ + public class ThinkingSDKTimestampCalibration : ThinkingSDKTimeCalibration + { + + public ThinkingSDKTimestampCalibration(long timestamp) + { + DateTime dateTimeUtcNow = DateTime.UtcNow; + this.mStartTime = timestamp; + this.mSystemElapsedRealtime = Environment.TickCount; + + double time_offset = (ConvertDateTimeInt(dateTimeUtcNow) - timestamp) / 1000; + if (ThinkingSDKPublicConfig.IsPrintLog()) ThinkingSDKLogger.Print("Time Calibration with NTP (" + timestamp + "), diff = " + time_offset.ToString("0.000s")); + } + } +} + diff --git a/Assets/HCMiniSdk/Third/ta/Plugins/PC/Time/ThinkingSDKTimestampCalibration.cs.meta b/Assets/HCMiniSdk/Third/ta/Plugins/PC/Time/ThinkingSDKTimestampCalibration.cs.meta new file mode 100644 index 00000000..f2bbbca5 --- /dev/null +++ b/Assets/HCMiniSdk/Third/ta/Plugins/PC/Time/ThinkingSDKTimestampCalibration.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: aef0ebc4f720643f3878a26fc71b6ddd +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/HCMiniSdk/Third/ta/Plugins/PC/Utils.meta b/Assets/HCMiniSdk/Third/ta/Plugins/PC/Utils.meta new file mode 100644 index 00000000..570e5c65 --- /dev/null +++ b/Assets/HCMiniSdk/Third/ta/Plugins/PC/Utils.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: 0ff15ea6a25e04a79b1289cb0664ef16 +folderAsset: yes +DefaultImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/HCMiniSdk/Third/ta/Plugins/PC/Utils/ThinkingSDKAppInfo.cs b/Assets/HCMiniSdk/Third/ta/Plugins/PC/Utils/ThinkingSDKAppInfo.cs new file mode 100644 index 00000000..12b4eb52 --- /dev/null +++ b/Assets/HCMiniSdk/Third/ta/Plugins/PC/Utils/ThinkingSDKAppInfo.cs @@ -0,0 +1,48 @@ +using System; +using ThinkingSDK.PC.Config; +using ThinkingSDK.PC.Constant; +using UnityEngine; + +namespace ThinkingSDK.PC.Utils +{ + public class ThinkingSDKAppInfo + { + // sdk version + public static string LibVersion() + { + if (ThinkingSDKUtil.DisPresetProperties.Contains(ThinkingSDKConstant.LIB_VERSION)) + { + return ""; + } + return ThinkingSDKPublicConfig.Version() ; + } + // sdk name + public static string LibName() + { + if (ThinkingSDKUtil.DisPresetProperties.Contains(ThinkingSDKConstant.LIB)) + { + return ""; + } + return ThinkingSDKPublicConfig.Name(); + } + // app version + public static string AppVersion() + { + if (ThinkingSDKUtil.DisPresetProperties.Contains(ThinkingSDKConstant.APP_VERSION)) + { + return ""; + } + return Application.version; + } + // app identifier, bundle ID + public static string AppIdentifier() + { + if (ThinkingSDKUtil.DisPresetProperties.Contains(ThinkingSDKConstant.APP_BUNDLEID)) + { + return ""; + } + return Application.identifier; + } + + } +} \ No newline at end of file diff --git a/Assets/HCMiniSdk/Third/ta/Plugins/PC/Utils/ThinkingSDKAppInfo.cs.meta b/Assets/HCMiniSdk/Third/ta/Plugins/PC/Utils/ThinkingSDKAppInfo.cs.meta new file mode 100644 index 00000000..eee0a1f2 --- /dev/null +++ b/Assets/HCMiniSdk/Third/ta/Plugins/PC/Utils/ThinkingSDKAppInfo.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: 85a9d7d4b192d42fb826f9620d01ef01 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/HCMiniSdk/Third/ta/Plugins/PC/Utils/ThinkingSDKDeviceInfo.cs b/Assets/HCMiniSdk/Third/ta/Plugins/PC/Utils/ThinkingSDKDeviceInfo.cs new file mode 100644 index 00000000..153ced78 --- /dev/null +++ b/Assets/HCMiniSdk/Third/ta/Plugins/PC/Utils/ThinkingSDKDeviceInfo.cs @@ -0,0 +1,229 @@ +using System; +using ThinkingSDK.PC.Constant; +using ThinkingSDK.PC.Storage; +using UnityEngine; + +namespace ThinkingSDK.PC.Utils +{ + public class ThinkingSDKDeviceInfo + { + // devide ID + public static string DeviceID() + { + if (ThinkingSDKUtil.DisPresetProperties.Contains(ThinkingSDKConstant.DEVICE_ID)) + { + return ""; + } + #if (UNITY_WEBGL) + return RandomDeviceID(); + #else + return SystemInfo.deviceUniqueIdentifier; + #endif + } + // A persistent random number, used as an alternative to the device ID (WebGL cannot obtain the device ID) + private static string RandomDeviceID() + { + string randomID = (string)ThinkingSDKFile.GetData(ThinkingSDKConstant.RANDOM_DEVICE_ID, typeof(string)); + if (string.IsNullOrEmpty(randomID)) + { + randomID = System.Guid.NewGuid().ToString("N"); + ThinkingSDKFile.SaveData(ThinkingSDKConstant.RANDOM_DEVICE_ID, randomID); + } + return randomID; + } + // network type + public static string NetworkType() + { + if (ThinkingSDKUtil.DisPresetProperties.Contains(ThinkingSDKConstant.NETWORK_TYPE)) + { + return ""; + } + string networkType = "NULL"; + if (Application.internetReachability == NetworkReachability.ReachableViaCarrierDataNetwork) + { + networkType = "Mobile"; + } + else if (Application.internetReachability == NetworkReachability.ReachableViaLocalAreaNetwork) + { + networkType = "LAN"; + } + return networkType; + } + // carrier name + public static string Carrier() + { + if (ThinkingSDKUtil.DisPresetProperties.Contains(ThinkingSDKConstant.CARRIER)) + { + return ""; + } + return "NULL"; + } + // os name + public static string OS() + { + if (ThinkingSDKUtil.DisPresetProperties.Contains(ThinkingSDKConstant.OS)) + { + return ""; + } + string os = "other"; + if (SystemInfo.operatingSystemFamily == OperatingSystemFamily.Linux) + { + os = "Linux"; + } + else if (SystemInfo.operatingSystemFamily == OperatingSystemFamily.MacOSX) + { + os = "MacOSX"; + } + else if (SystemInfo.operatingSystemFamily == OperatingSystemFamily.Windows) + { + os = "Windows"; + } + return os; + } + // os version + public static string OSVersion() + { + if (ThinkingSDKUtil.DisPresetProperties.Contains(ThinkingSDKConstant.OS_VERSION)) + { + return ""; + } + return SystemInfo.operatingSystem; + } + // device screen width + public static int ScreenWidth() + { + if (ThinkingSDKUtil.DisPresetProperties.Contains(ThinkingSDKConstant.SCREEN_WIDTH)) + { + return 0; + } + return (int)(UnityEngine.Screen.currentResolution.width); + } + // device screen height + public static int ScreenHeight() + { + if (ThinkingSDKUtil.DisPresetProperties.Contains(ThinkingSDKConstant.SCREEN_HEIGHT)) + { + return 0; + } + return (int)(UnityEngine.Screen.currentResolution.height); + } + // graphics card manufacturer name + public static string Manufacture() + { + if (ThinkingSDKUtil.DisPresetProperties.Contains(ThinkingSDKConstant.MANUFACTURE)) + { + return ""; + } + return SystemInfo.graphicsDeviceVendor; + } + // devide model + public static string DeviceModel() + { + if (ThinkingSDKUtil.DisPresetProperties.Contains(ThinkingSDKConstant.DEVICE_MODEL)) + { + return ""; + } + return SystemInfo.deviceModel; + } + // device language + public static string MachineLanguage() + { + if (ThinkingSDKUtil.DisPresetProperties.Contains(ThinkingSDKConstant.SYSTEM_LANGUAGE)) + { + return ""; + } + switch (Application.systemLanguage) + { + case SystemLanguage.Afrikaans: + return "af"; + case SystemLanguage.Arabic: + return "ar"; + case SystemLanguage.Basque: + return "eu"; + case SystemLanguage.Belarusian: + return "be"; + case SystemLanguage.Bulgarian: + return "bg"; + case SystemLanguage.Catalan: + return "ca"; + case SystemLanguage.Chinese: + return "zh"; + case SystemLanguage.Czech: + return "cs"; + case SystemLanguage.Danish: + return "da"; + case SystemLanguage.Dutch: + return "nl"; + case SystemLanguage.English: + return "en"; + case SystemLanguage.Estonian: + return "et"; + case SystemLanguage.Faroese: + return "fo"; + case SystemLanguage.Finnish: + return "fu"; + case SystemLanguage.French: + return "fr"; + case SystemLanguage.German: + return "de"; + case SystemLanguage.Greek: + return "el"; + case SystemLanguage.Hebrew: + return "he"; + case SystemLanguage.Icelandic: + return "is"; + case SystemLanguage.Indonesian: + return "id"; + case SystemLanguage.Italian: + return "it"; + case SystemLanguage.Japanese: + return "ja"; + case SystemLanguage.Korean: + return "ko"; + case SystemLanguage.Latvian: + return "lv"; + case SystemLanguage.Lithuanian: + return "lt"; + case SystemLanguage.Norwegian: + return "nn"; + case SystemLanguage.Polish: + return "pl"; + case SystemLanguage.Portuguese: + return "pt"; + case SystemLanguage.Romanian: + return "ro"; + case SystemLanguage.Russian: + return "ru"; + case SystemLanguage.SerboCroatian: + return "sr"; + case SystemLanguage.Slovak: + return "sk"; + case SystemLanguage.Slovenian: + return "sl"; + case SystemLanguage.Spanish: + return "es"; + case SystemLanguage.Swedish: + return "sv"; + case SystemLanguage.Thai: + return "th"; + case SystemLanguage.Turkish: + return "tr"; + case SystemLanguage.Ukrainian: + return "uk"; + case SystemLanguage.Vietnamese: + return "vi"; + case SystemLanguage.ChineseSimplified: + return "zh"; + case SystemLanguage.ChineseTraditional: + return "zh"; + case SystemLanguage.Hungarian: + return "hu"; + case SystemLanguage.Unknown: + return "unknown"; + + }; + return ""; + } + } +} + diff --git a/Assets/HCMiniSdk/Third/ta/Plugins/PC/Utils/ThinkingSDKDeviceInfo.cs.meta b/Assets/HCMiniSdk/Third/ta/Plugins/PC/Utils/ThinkingSDKDeviceInfo.cs.meta new file mode 100644 index 00000000..e9931ece --- /dev/null +++ b/Assets/HCMiniSdk/Third/ta/Plugins/PC/Utils/ThinkingSDKDeviceInfo.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: c84fe92f43c114ba7ad64250db8e124e +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/HCMiniSdk/Third/ta/Plugins/PC/Utils/ThinkingSDKJSON.cs b/Assets/HCMiniSdk/Third/ta/Plugins/PC/Utils/ThinkingSDKJSON.cs new file mode 100644 index 00000000..7e2b954d --- /dev/null +++ b/Assets/HCMiniSdk/Third/ta/Plugins/PC/Utils/ThinkingSDKJSON.cs @@ -0,0 +1,630 @@ +/* + * MIT License. Forked from GA_MiniJSON. + * I modified it so that it could be used for TD limitations. + */ +// using UnityEngine; +using System; +using System.Collections; +using System.Collections.Generic; +using System.IO; +using System.Text; +using System.Globalization; + +namespace ThinkingSDK.PC.Utils +{ + /* Based on the JSON parser from + * http://techblog.procurios.nl/k/618/news/view/14605/14863/How-do-I-write-my-own-parser-for-JSON.html + * + * I simplified it so that it doesn't throw exceptions + * and can be used in Unity iPhone with maximum code stripping. + */ + /// + /// This class encodes and decodes JSON strings. + /// Spec. details, see http://www.json.org/ + /// + /// JSON uses Arrays and Objects. These correspond here to the datatypes ArrayList and Hashtable. + /// All numbers are parsed to floats. + /// + public class ThinkingSDKJSON + { + /// + /// Parses the string json into a value + /// + /// A JSON string. + /// An List<object>, a Dictionary<string, object>, a double, an integer,a string, null, true, or false + public static Dictionary Deserialize(string json) + { + // save the string for debug information + if (json == null) + { + return null; + } + + return Parser.Parse(json); + } + + // Use caution! + public static List DeserializeArray(string json) + { + // save the string for debug information + if (json == null) + { + return null; + } + + return Parser.ParseArray(json); + } + + sealed class Parser : IDisposable + { + const string WORD_BREAK = "{}[],:\""; + + public static bool IsWordBreak(char c) + { + return Char.IsWhiteSpace(c) || WORD_BREAK.IndexOf(c) != -1; + } + + enum TOKEN + { + NONE, + CURLY_OPEN, + CURLY_CLOSE, + SQUARED_OPEN, + SQUARED_CLOSE, + COLON, + COMMA, + STRING, + NUMBER, + TRUE, + FALSE, + NULL + }; + + StringReader json; + + Parser(string jsonString) + { + json = new StringReader(jsonString); + } + + public static Dictionary Parse(string jsonString) + { + using (var instance = new Parser(jsonString)) + { + return instance.ParseObject(); + } + } + + public static List ParseArray(string jsonString) + { + using (var instance = new Parser(jsonString)) + { + return instance.ParseArray(); + } + } + + public void Dispose() + { + json.Dispose(); + json = null; + } + + Dictionary ParseObject() + { + Dictionary table = new Dictionary(); + + // ditch opening brace + json.Read(); + + // { + while (true) + { + switch (NextToken) + { + case TOKEN.NONE: + return null; + case TOKEN.COMMA: + continue; + case TOKEN.CURLY_CLOSE: + return table; + default: + // name + string name = ParseString(); + if (name == null) + { + return null; + } + + // : + if (NextToken != TOKEN.COLON) + { + return null; + } + // ditch the colon + json.Read(); + + // value + table[name] = ParseValue(); + break; + } + } + } + + List ParseArray() + { + List array = new List(); + + // ditch opening bracket + json.Read(); + + // [ + var parsing = true; + while (parsing) + { + TOKEN nextToken = NextToken; + + switch (nextToken) + { + case TOKEN.NONE: + return null; + case TOKEN.COMMA: + continue; + case TOKEN.SQUARED_CLOSE: + parsing = false; + break; + default: + object value = ParseByToken(nextToken); + + array.Add(value); + break; + } + } + + return array; + } + + object ParseValue() + { + TOKEN nextToken = NextToken; + return ParseByToken(nextToken); + } + + object ParseByToken(TOKEN token) + { + switch (token) + { + case TOKEN.STRING: + string str = ParseString(); + DateTime dateTime; + if (DateTime.TryParseExact(str, "yyyy-MM-dd HH:mm:ss.fff", CultureInfo.InvariantCulture, DateTimeStyles.None, out dateTime)) + { + return dateTime; + } + return str; + case TOKEN.NUMBER: + return ParseNumber(); + case TOKEN.CURLY_OPEN: + return ParseObject(); + case TOKEN.SQUARED_OPEN: + return ParseArray(); + case TOKEN.TRUE: + return true; + case TOKEN.FALSE: + return false; + case TOKEN.NULL: + return null; + default: + return null; + } + } + + string ParseString() + { + StringBuilder s = new StringBuilder(); + char c; + + // ditch opening quote + json.Read(); + + bool parsing = true; + while (parsing) + { + + if (json.Peek() == -1) + { + parsing = false; + break; + } + + c = NextChar; + switch (c) + { + case '"': + parsing = false; + break; + case '\\': + if (json.Peek() == -1) + { + parsing = false; + break; + } + + c = NextChar; + switch (c) + { + case '"': + case '\\': + case '/': + s.Append(c); + break; + case 'b': + s.Append('\b'); + break; + case 'f': + s.Append('\f'); + break; + case 'n': + s.Append('\n'); + break; + case 'r': + s.Append('\r'); + break; + case 't': + s.Append('\t'); + break; + case 'u': + var hex = new char[4]; + + for (int i = 0; i < 4; i++) + { + hex[i] = NextChar; + } + + s.Append((char)Convert.ToInt32(new string(hex), 16)); + break; + } + break; + default: + s.Append(c); + break; + } + } + + return s.ToString(); + } + + object ParseNumber() + { + string number = NextWord; + + if (number.IndexOf('.') == -1) + { + long parsedInt; + Int64.TryParse(number, out parsedInt); + return parsedInt; + } + + double parsedDouble; + if (!Double.TryParse(number, System.Globalization.NumberStyles.AllowDecimalPoint | System.Globalization.NumberStyles.AllowLeadingSign, System.Globalization.CultureInfo.InvariantCulture, out parsedDouble)) + { + Double.TryParse(number, System.Globalization.NumberStyles.AllowDecimalPoint | System.Globalization.NumberStyles.AllowLeadingSign, System.Globalization.CultureInfo.CreateSpecificCulture("es-ES"), out parsedDouble); + } + return parsedDouble; + } + + void EatWhitespace() + { + while (Char.IsWhiteSpace(PeekChar)) + { + json.Read(); + + if (json.Peek() == -1) + { + break; + } + } + } + + char PeekChar + { + get + { + return Convert.ToChar(json.Peek()); + } + } + + char NextChar + { + get + { + return Convert.ToChar(json.Read()); + } + } + + string NextWord + { + get + { + StringBuilder word = new StringBuilder(); + + while (!IsWordBreak(PeekChar)) + { + word.Append(NextChar); + + if (json.Peek() == -1) + { + break; + } + } + + return word.ToString(); + } + } + + TOKEN NextToken + { + get + { + EatWhitespace(); + + if (json.Peek() == -1) + { + return TOKEN.NONE; + } + + switch (PeekChar) + { + case '{': + return TOKEN.CURLY_OPEN; + case '}': + json.Read(); + return TOKEN.CURLY_CLOSE; + case '[': + return TOKEN.SQUARED_OPEN; + case ']': + json.Read(); + return TOKEN.SQUARED_CLOSE; + case ',': + json.Read(); + return TOKEN.COMMA; + case '"': + return TOKEN.STRING; + case ':': + return TOKEN.COLON; + case '0': + case '1': + case '2': + case '3': + case '4': + case '5': + case '6': + case '7': + case '8': + case '9': + case '-': + return TOKEN.NUMBER; + } + + switch (NextWord) + { + case "false": + return TOKEN.FALSE; + case "true": + return TOKEN.TRUE; + case "null": + return TOKEN.NULL; + } + + return TOKEN.NONE; + } + } + } + + /// + /// Converts a IDictionary / IList object or a simple type (string, int, etc.) into a JSON string + /// + /// A Dictionary<string, object> / List<object> + /// A JSON encoded string, or null if object 'json' is not serializable + public static string Serialize(object obj, Func func = null) + { + return Serializer.Serialize(obj, func); + } + + sealed class Serializer + { + StringBuilder builder; + Func func; + + Serializer() + { + builder = new StringBuilder(); + } + + public static string Serialize(object obj, Func func) + { + var instance = new Serializer(); + instance.func = func; + + instance.SerializeValue(obj); + + return instance.builder.ToString(); + } + + void SerializeValue(object value) + { + IList asList; + IDictionary asDict; + string asStr; + + if (value == null) + { + builder.Append("null"); + } + else if ((asStr = value as string) != null) + { + SerializeString(asStr); + } + else if (value is bool) + { + builder.Append((bool)value ? "true" : "false"); + } + else if ((asList = value as IList) != null) + { + SerializeArray(asList); + } + else if ((asDict = value as IDictionary) != null) + { + SerializeObject(asDict); + } + else if (value is char) + { + SerializeString(new string((char)value, 1)); + } + else + { + SerializeOther(value); + } + } + + void SerializeObject(IDictionary obj) + { + bool first = true; + + builder.Append('{'); + + foreach (object e in obj.Keys) + { + if (!first) + { + builder.Append(','); + } + + SerializeString(e.ToString()); + builder.Append(':'); + + SerializeValue(obj[e]); + + first = false; + } + + builder.Append('}'); + } + + void SerializeArray(IList anArray) + { + builder.Append('['); + + bool first = true; + + foreach (object obj in anArray) + { + if (!first) + { + builder.Append(','); + } + + SerializeValue(obj); + + first = false; + } + + builder.Append(']'); + } + + void SerializeString(string str) + { + builder.Append('\"'); + + char[] charArray = str.ToCharArray(); + foreach (var c in charArray) + { + switch (c) + { + case '"': + builder.Append("\\\""); + break; + case '\\': + builder.Append("\\\\"); + break; + case '\b': + builder.Append("\\b"); + break; + case '\f': + builder.Append("\\f"); + break; + case '\n': + builder.Append("\\n"); + break; + case '\r': + builder.Append("\\r"); + break; + case '\t': + builder.Append("\\t"); + break; + default: + int codepoint = Convert.ToInt32(c); + if ((codepoint >= 32) && (codepoint <= 126)) + { + builder.Append(c); + } + else + { + builder.Append("\\u"); + builder.Append(codepoint.ToString("x4")); + } + break; + } + } + + builder.Append('\"'); + } + + void SerializeOther(object value) + { + // NOTE: decimals lose precision during serialization. + // They always have, I'm just letting you know. + // Previously floats and doubles lost precision too. + if (value is float) + { + builder.Append(((float)value).ToString("R", System.Globalization.CultureInfo.InvariantCulture)); + } + else if (value is int + || value is uint + || value is long + || value is sbyte + || value is byte + || value is short + || value is ushort + || value is ulong) + { + builder.Append(value); + } + else if (value is double) + { + builder.Append(Convert.ToDouble(value).ToString("R", System.Globalization.CultureInfo.InvariantCulture)); + } + else if (value is decimal) { + builder.Append(Convert.ToDecimal(value).ToString("R", System.Globalization.CultureInfo.InvariantCulture)); + } + else if (value is DateTime) + { + builder.Append('\"'); + DateTime dateTime = (DateTime)value; + if (null != func) + { + builder.Append(func((DateTime)value)); + } + else + { + builder.Append(dateTime.ToString("yyyy-MM-dd HH:mm:ss.fff", System.Globalization.CultureInfo.InvariantCulture)); + } + builder.Append('\"'); + } + else + { + SerializeString(value.ToString()); + } + } + } + } +} diff --git a/Assets/HCMiniSdk/Third/ta/Plugins/PC/Utils/ThinkingSDKJSON.cs.meta b/Assets/HCMiniSdk/Third/ta/Plugins/PC/Utils/ThinkingSDKJSON.cs.meta new file mode 100644 index 00000000..de5cd85c --- /dev/null +++ b/Assets/HCMiniSdk/Third/ta/Plugins/PC/Utils/ThinkingSDKJSON.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: f521a02d525fd485c93a25ce7f330b0d +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/HCMiniSdk/Third/ta/Plugins/PC/Utils/ThinkingSDKLogger.cs b/Assets/HCMiniSdk/Third/ta/Plugins/PC/Utils/ThinkingSDKLogger.cs new file mode 100644 index 00000000..aaebf35c --- /dev/null +++ b/Assets/HCMiniSdk/Third/ta/Plugins/PC/Utils/ThinkingSDKLogger.cs @@ -0,0 +1,23 @@ +using System; +using System.IO; +using ThinkingSDK.PC.Constant; +using ThinkingSDK.PC.Config; +using UnityEngine; + +namespace ThinkingSDK.PC.Utils +{ + public class ThinkingSDKLogger + { + public ThinkingSDKLogger() + { + + } + public static void Print(string str) + { + if (ThinkingSDKPublicConfig.IsPrintLog()) + { + Debug.Log("[ThinkingData] Info: " + str); + } + } + } +} diff --git a/Assets/HCMiniSdk/Third/ta/Plugins/PC/Utils/ThinkingSDKLogger.cs.meta b/Assets/HCMiniSdk/Third/ta/Plugins/PC/Utils/ThinkingSDKLogger.cs.meta new file mode 100644 index 00000000..4de59a8b --- /dev/null +++ b/Assets/HCMiniSdk/Third/ta/Plugins/PC/Utils/ThinkingSDKLogger.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: 7003bc870a4644632aa259a02b235ec6 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/HCMiniSdk/Third/ta/Plugins/PC/Utils/ThinkingSDKTimeUtil.cs b/Assets/HCMiniSdk/Third/ta/Plugins/PC/Utils/ThinkingSDKTimeUtil.cs new file mode 100644 index 00000000..2bbb8447 --- /dev/null +++ b/Assets/HCMiniSdk/Third/ta/Plugins/PC/Utils/ThinkingSDKTimeUtil.cs @@ -0,0 +1,15 @@ +using System.Collections; +using System.Collections.Generic; +using UnityEngine; + +namespace ThinkingSDK.PC.Utils +{ + public class ThinkingSDKTimeUtil + { + public static string Time() + { + return ""; + } + } +} + diff --git a/Assets/HCMiniSdk/Third/ta/Plugins/PC/Utils/ThinkingSDKTimeUtil.cs.meta b/Assets/HCMiniSdk/Third/ta/Plugins/PC/Utils/ThinkingSDKTimeUtil.cs.meta new file mode 100644 index 00000000..8371099a --- /dev/null +++ b/Assets/HCMiniSdk/Third/ta/Plugins/PC/Utils/ThinkingSDKTimeUtil.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: bb171e9f7fda1436a83fc7be10687f92 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/HCMiniSdk/Third/ta/Plugins/PC/Utils/ThinkingSDKUtil.cs b/Assets/HCMiniSdk/Third/ta/Plugins/PC/Utils/ThinkingSDKUtil.cs new file mode 100644 index 00000000..4a47bf1f --- /dev/null +++ b/Assets/HCMiniSdk/Third/ta/Plugins/PC/Utils/ThinkingSDKUtil.cs @@ -0,0 +1,199 @@ +using UnityEngine; +using System; +using System.Xml; +using System.Collections.Generic; +using ThinkingSDK.PC.Config; +using ThinkingSDK.PC.Constant; +using ThinkingSDK.PC.Storage; + +namespace ThinkingSDK.PC.Utils +{ + public class ThinkingSDKUtil + { + private static Dictionary deviceInfo = null; + public ThinkingSDKUtil() + { + + } + public static List DisPresetProperties = ThinkingSDKUtil.GetDisPresetProperties(); + /* + * Check if the URL is valid + */ + public static bool IsValiadURL(string url) + { + return !(url == null || url.Length == 0 || !url.Contains("http") || !url.Contains("https")); + } + /* + * Check if the string is empty + */ + public static bool IsEmptyString(string str) + { + return (str == null || str.Length == 0); + } + public static Dictionary DeviceInfo() + { + if (deviceInfo == null) + { + deviceInfo = new Dictionary(); + deviceInfo[ThinkingSDKConstant.DEVICE_ID] = ThinkingSDKDeviceInfo.DeviceID(); + //deviceInfo[ThinkingSDKConstant.CARRIER] = ThinkingSDKDeviceInfo.Carrier(); //PC端不采集 + deviceInfo[ThinkingSDKConstant.OS] = ThinkingSDKDeviceInfo.OS(); + deviceInfo[ThinkingSDKConstant.OS_VERSION] = ThinkingSDKDeviceInfo.OSVersion(); + deviceInfo[ThinkingSDKConstant.SCREEN_HEIGHT] = ThinkingSDKDeviceInfo.ScreenHeight(); + deviceInfo[ThinkingSDKConstant.SCREEN_WIDTH] = ThinkingSDKDeviceInfo.ScreenWidth(); + deviceInfo[ThinkingSDKConstant.MANUFACTURE] = ThinkingSDKDeviceInfo.Manufacture(); + deviceInfo[ThinkingSDKConstant.DEVICE_MODEL] = ThinkingSDKDeviceInfo.DeviceModel(); + deviceInfo[ThinkingSDKConstant.APP_VERSION] = ThinkingSDKAppInfo.AppVersion(); + deviceInfo[ThinkingSDKConstant.APP_BUNDLEID] = ThinkingSDKAppInfo.AppIdentifier(); + deviceInfo[ThinkingSDKConstant.LIB] = ThinkingSDKAppInfo.LibName(); + deviceInfo[ThinkingSDKConstant.LIB_VERSION] = ThinkingSDKAppInfo.LibVersion(); + } + deviceInfo[ThinkingSDKConstant.SYSTEM_LANGUAGE] = ThinkingSDKDeviceInfo.MachineLanguage(); + deviceInfo[ThinkingSDKConstant.NETWORK_TYPE] = ThinkingSDKDeviceInfo.NetworkType(); + return deviceInfo; + } + // Get disabled preset properties + private static List GetDisPresetProperties() + { + List properties = new List(); + + TextAsset textAsset = Resources.Load("ta_public_config"); + if (textAsset != null && textAsset.text != null) + { + XmlDocument xmlDoc = new XmlDocument(); + // xmlDoc.Load(srcPath); + xmlDoc.LoadXml(textAsset.text); + XmlNode root = xmlDoc.SelectSingleNode("resources"); + for (int i=0; i originalDic, Dictionary subDic) + { + if (originalDic != subDic) + { + foreach (KeyValuePair kv in subDic) + { + originalDic[kv.Key] = kv.Value; + } + } + } + //get timestamp + public static long GetTimeStamp() + { + TimeSpan ts = DateTime.UtcNow - new DateTime(1970, 1, 1, 0, 0, 0, 0); + return Convert.ToInt64(ts.TotalMilliseconds); + } + } +} diff --git a/Assets/HCMiniSdk/Third/ta/Plugins/PC/Utils/ThinkingSDKUtil.cs.meta b/Assets/HCMiniSdk/Third/ta/Plugins/PC/Utils/ThinkingSDKUtil.cs.meta new file mode 100644 index 00000000..5e83b327 --- /dev/null +++ b/Assets/HCMiniSdk/Third/ta/Plugins/PC/Utils/ThinkingSDKUtil.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: ed8643f4a1b924df991677307901a014 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/HCMiniSdk/Third/ta/Plugins/iOS.meta b/Assets/HCMiniSdk/Third/ta/Plugins/iOS.meta new file mode 100644 index 00000000..6025ba10 --- /dev/null +++ b/Assets/HCMiniSdk/Third/ta/Plugins/iOS.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: c31cb343571204f66ae1ccaf78837c29 +folderAsset: yes +DefaultImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/HCMiniSdk/Third/ta/Plugins/iOS/TAThirdParty.meta b/Assets/HCMiniSdk/Third/ta/Plugins/iOS/TAThirdParty.meta new file mode 100644 index 00000000..18644729 --- /dev/null +++ b/Assets/HCMiniSdk/Third/ta/Plugins/iOS/TAThirdParty.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: dc9f548d434094d83b1c00e0cd0895ae +folderAsset: yes +DefaultImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/HCMiniSdk/Third/ta/Plugins/iOS/TAThirdParty/TAAdjustSyncData.h b/Assets/HCMiniSdk/Third/ta/Plugins/iOS/TAThirdParty/TAAdjustSyncData.h new file mode 100755 index 00000000..111feeb0 --- /dev/null +++ b/Assets/HCMiniSdk/Third/ta/Plugins/iOS/TAThirdParty/TAAdjustSyncData.h @@ -0,0 +1,16 @@ +// +// TAAdjustSyncData.h +// ThinkingSDK +// +// Created by wwango on 2022/3/25. +// + +#import "TABaseSyncData.h" + +NS_ASSUME_NONNULL_BEGIN + +@interface TAAdjustSyncData : TABaseSyncData + +@end + +NS_ASSUME_NONNULL_END diff --git a/Assets/Plugins/ByteGame/com.bytedance.starksdk/Editor/starksdkEditor.dll.meta b/Assets/HCMiniSdk/Third/ta/Plugins/iOS/TAThirdParty/TAAdjustSyncData.h.meta similarity index 84% rename from Assets/Plugins/ByteGame/com.bytedance.starksdk/Editor/starksdkEditor.dll.meta rename to Assets/HCMiniSdk/Third/ta/Plugins/iOS/TAThirdParty/TAAdjustSyncData.h.meta index abc69190..09f28398 100644 --- a/Assets/Plugins/ByteGame/com.bytedance.starksdk/Editor/starksdkEditor.dll.meta +++ b/Assets/HCMiniSdk/Third/ta/Plugins/iOS/TAThirdParty/TAAdjustSyncData.h.meta @@ -1,5 +1,5 @@ fileFormatVersion: 2 -guid: 32d2dd4746cb8421ea3b1e407a7e177c +guid: 5c2ee17250bf74b279745e7b20324386 PluginImporter: externalObjects: {} serializedVersion: 2 @@ -19,15 +19,15 @@ PluginImporter: - first: Editor: Editor second: - enabled: 1 + enabled: 0 settings: DefaultValueInitialized: true - first: - Windows Store Apps: WindowsStoreApps + iPhone: iOS second: - enabled: 0 + enabled: 1 settings: - CPU: AnyCPU + AddToEmbeddedBinaries: false userData: assetBundleName: assetBundleVariant: diff --git a/Assets/HCMiniSdk/Third/ta/Plugins/iOS/TAThirdParty/TAAdjustSyncData.m b/Assets/HCMiniSdk/Third/ta/Plugins/iOS/TAThirdParty/TAAdjustSyncData.m new file mode 100755 index 00000000..8d047c22 --- /dev/null +++ b/Assets/HCMiniSdk/Third/ta/Plugins/iOS/TAThirdParty/TAAdjustSyncData.m @@ -0,0 +1,33 @@ +// +// TAAdjustSyncData.m +// ThinkingSDK +// +// Created by wwango on 2022/3/25. +// + +#import "TAAdjustSyncData.h" + +@implementation TAAdjustSyncData + +#pragma clang diagnostic push +#pragma clang diagnostic ignored "-Warc-performSelector-leaks" + +- (void)syncThirdData:(id)taInstance property:(NSDictionary *)property { + + if (!self.customPropety || [self.customPropety isKindOfClass:[NSDictionary class]]) { + self.customPropety = @{}; + } + + NSString *accountID = [taInstance getAccountId] ? [taInstance getAccountId] : @""; + NSString *distinctId = [taInstance getDistinctId] ? [taInstance getDistinctId] : @""; + + Class cls = NSClassFromString(@"Adjust"); + SEL sel = NSSelectorFromString(@"addSessionCallbackParameter:value:"); + if (cls && [cls respondsToSelector:sel]) { + [cls performSelector:sel withObject:TA_ACCOUNT_ID withObject:accountID]; + [cls performSelector:sel withObject:TA_DISTINCT_ID withObject:distinctId]; + } +} +#pragma clang diagnostic pop + +@end diff --git a/Assets/Plugins/ByteGame/com.bytedance.starksdk/Android/starkvideolib.aar.meta b/Assets/HCMiniSdk/Third/ta/Plugins/iOS/TAThirdParty/TAAdjustSyncData.m.meta similarity index 82% rename from Assets/Plugins/ByteGame/com.bytedance.starksdk/Android/starkvideolib.aar.meta rename to Assets/HCMiniSdk/Third/ta/Plugins/iOS/TAThirdParty/TAAdjustSyncData.m.meta index de3b7f58..37338571 100644 --- a/Assets/Plugins/ByteGame/com.bytedance.starksdk/Android/starkvideolib.aar.meta +++ b/Assets/HCMiniSdk/Third/ta/Plugins/iOS/TAThirdParty/TAAdjustSyncData.m.meta @@ -1,32 +1,33 @@ -fileFormatVersion: 2 -guid: b2cc872206b724a37ba6dcd121b39660 -PluginImporter: - externalObjects: {} - serializedVersion: 2 - iconMap: {} - executionOrder: {} - defineConstraints: [] - isPreloaded: 0 - isOverridable: 0 - isExplicitlyReferenced: 0 - validateReferences: 1 - platformData: - - first: - Android: Android - second: - enabled: 1 - settings: {} - - first: - Any: - second: - enabled: 0 - settings: {} - - first: - Editor: Editor - second: - enabled: 0 - settings: - DefaultValueInitialized: true - userData: - assetBundleName: - assetBundleVariant: +fileFormatVersion: 2 +guid: 5eb03a70bd3e04ffaa297aa9944119ab +PluginImporter: + externalObjects: {} + serializedVersion: 2 + iconMap: {} + executionOrder: {} + defineConstraints: [] + isPreloaded: 0 + isOverridable: 0 + isExplicitlyReferenced: 0 + validateReferences: 1 + platformData: + - first: + Any: + second: + enabled: 0 + settings: {} + - first: + Editor: Editor + second: + enabled: 0 + settings: + DefaultValueInitialized: true + - first: + iPhone: iOS + second: + enabled: 1 + settings: + AddToEmbeddedBinaries: false + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/HCMiniSdk/Third/ta/Plugins/iOS/TAThirdParty/TAAppLovinSyncData.h b/Assets/HCMiniSdk/Third/ta/Plugins/iOS/TAThirdParty/TAAppLovinSyncData.h new file mode 100755 index 00000000..74e9db64 --- /dev/null +++ b/Assets/HCMiniSdk/Third/ta/Plugins/iOS/TAThirdParty/TAAppLovinSyncData.h @@ -0,0 +1,16 @@ +// +// TAAppLovinSyncData.h +// ThinkingSDK.default-Base-Core-Extension-Util-iOS +// +// Created by wwango on 2022/9/28. +// + +#import "TABaseSyncData.h" + +NS_ASSUME_NONNULL_BEGIN + +@interface TAAppLovinSyncData : TABaseSyncData + +@end + +NS_ASSUME_NONNULL_END diff --git a/Assets/HCMiniSdk/Third/ta/Plugins/iOS/TAThirdParty/TAAppLovinSyncData.h.meta b/Assets/HCMiniSdk/Third/ta/Plugins/iOS/TAThirdParty/TAAppLovinSyncData.h.meta new file mode 100644 index 00000000..d1934902 --- /dev/null +++ b/Assets/HCMiniSdk/Third/ta/Plugins/iOS/TAThirdParty/TAAppLovinSyncData.h.meta @@ -0,0 +1,33 @@ +fileFormatVersion: 2 +guid: bef7b8a1ee5a94c378327f8cc1fbd2c2 +PluginImporter: + externalObjects: {} + serializedVersion: 2 + iconMap: {} + executionOrder: {} + defineConstraints: [] + isPreloaded: 0 + isOverridable: 0 + isExplicitlyReferenced: 0 + validateReferences: 1 + platformData: + - first: + Any: + second: + enabled: 0 + settings: {} + - first: + Editor: Editor + second: + enabled: 0 + settings: + DefaultValueInitialized: true + - first: + iPhone: iOS + second: + enabled: 1 + settings: + AddToEmbeddedBinaries: false + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/HCMiniSdk/Third/ta/Plugins/iOS/TAThirdParty/TAAppLovinSyncData.m b/Assets/HCMiniSdk/Third/ta/Plugins/iOS/TAThirdParty/TAAppLovinSyncData.m new file mode 100755 index 00000000..1998f2f9 --- /dev/null +++ b/Assets/HCMiniSdk/Third/ta/Plugins/iOS/TAThirdParty/TAAppLovinSyncData.m @@ -0,0 +1,62 @@ +// +// TAAppLovinSyncData.m +// ThinkingSDK.default-Base-Core-Extension-Util-iOS +// +// Created by wwango on 2022/9/28. +// + +#import "TAAppLovinSyncData.h" + +@implementation TAAppLovinSyncData + +#pragma clang diagnostic push +#pragma clang diagnostic ignored "-Warc-performSelector-leaks" + +- (void)syncThirdData:(id)taInstance property:(NSDictionary *)property { + + if (!self.customPropety || [self.customPropety isKindOfClass:[NSDictionary class]]) { + self.customPropety = @{}; + } + + NSString *distinctId = [taInstance getDistinctId] ? [taInstance getDistinctId] : @""; + + static dispatch_once_t onceToken; + Class cls = NSClassFromString(@"ALSdk"); + SEL sel1 = NSSelectorFromString(@"shared"); + SEL sel2 = NSSelectorFromString(@"setUserIdentifier"); + __block id instance; + dispatch_once(&onceToken, ^{ + if (cls && [cls respondsToSelector:sel1]) { + instance = [cls performSelector:sel1]; + if ([instance respondsToSelector:sel2]) { + [instance performSelector:sel2 withObject:distinctId]; + } + } + }); + + + if ([property isKindOfClass:[NSDictionary class]] && [property.allKeys containsObject:TASyncDataKey]) { + id customData = property[TASyncDataKey]; + Class cls = NSClassFromString(@"MAAd"); + if ([customData isKindOfClass:cls]) { + double revenue = [(NSNumber *)[customData performSelector:@selector(revenue)] doubleValue]; + NSString *networkName = [customData performSelector:@selector(networkName)]; + NSString *placement = [customData performSelector:@selector(placement)]; + NSString *adUnitId = [customData performSelector:@selector(adUnitIdentifier)]; + NSString *format = [[customData performSelector:@selector(format)] performSelector:@selector(label)]; + NSString *countryCode = [instance valueForKeyPath:@"configuration.countryCode"]; + + [taInstance track:@"appLovin_sdk_ad_revenue" properties:@{ + @"revenue":@(revenue), + @"networkName":networkName, + @"placement":placement, + @"adUnitId":adUnitId, + @"format":format, + @"countryCode":countryCode}]; + } + } + +} +#pragma clang diagnostic pop + +@end diff --git a/Assets/HCMiniSdk/Third/ta/Plugins/iOS/TAThirdParty/TAAppLovinSyncData.m.meta b/Assets/HCMiniSdk/Third/ta/Plugins/iOS/TAThirdParty/TAAppLovinSyncData.m.meta new file mode 100644 index 00000000..462e5bd8 --- /dev/null +++ b/Assets/HCMiniSdk/Third/ta/Plugins/iOS/TAThirdParty/TAAppLovinSyncData.m.meta @@ -0,0 +1,33 @@ +fileFormatVersion: 2 +guid: 6acd01cb07ff941398f5ac76b64d668b +PluginImporter: + externalObjects: {} + serializedVersion: 2 + iconMap: {} + executionOrder: {} + defineConstraints: [] + isPreloaded: 0 + isOverridable: 0 + isExplicitlyReferenced: 0 + validateReferences: 1 + platformData: + - first: + Any: + second: + enabled: 0 + settings: {} + - first: + Editor: Editor + second: + enabled: 0 + settings: + DefaultValueInitialized: true + - first: + iPhone: iOS + second: + enabled: 1 + settings: + AddToEmbeddedBinaries: false + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/HCMiniSdk/Third/ta/Plugins/iOS/TAThirdParty/TAAppsFlyerSyncData.h b/Assets/HCMiniSdk/Third/ta/Plugins/iOS/TAThirdParty/TAAppsFlyerSyncData.h new file mode 100755 index 00000000..3e2e4dac --- /dev/null +++ b/Assets/HCMiniSdk/Third/ta/Plugins/iOS/TAThirdParty/TAAppsFlyerSyncData.h @@ -0,0 +1,16 @@ +// +// TAAppsFlyerSyncData.h +// ThinkingSDK +// +// Created by wwango on 2022/2/14. +// + +#import "TABaseSyncData.h" + +NS_ASSUME_NONNULL_BEGIN + +@interface TAAppsFlyerSyncData : TABaseSyncData + +@end + +NS_ASSUME_NONNULL_END diff --git a/Assets/HCMiniSdk/Third/ta/Plugins/iOS/TAThirdParty/TAAppsFlyerSyncData.h.meta b/Assets/HCMiniSdk/Third/ta/Plugins/iOS/TAThirdParty/TAAppsFlyerSyncData.h.meta new file mode 100644 index 00000000..4f45d340 --- /dev/null +++ b/Assets/HCMiniSdk/Third/ta/Plugins/iOS/TAThirdParty/TAAppsFlyerSyncData.h.meta @@ -0,0 +1,33 @@ +fileFormatVersion: 2 +guid: b808938d5a4ef44cd9417fcaa09304a4 +PluginImporter: + externalObjects: {} + serializedVersion: 2 + iconMap: {} + executionOrder: {} + defineConstraints: [] + isPreloaded: 0 + isOverridable: 0 + isExplicitlyReferenced: 0 + validateReferences: 1 + platformData: + - first: + Any: + second: + enabled: 0 + settings: {} + - first: + Editor: Editor + second: + enabled: 0 + settings: + DefaultValueInitialized: true + - first: + iPhone: iOS + second: + enabled: 1 + settings: + AddToEmbeddedBinaries: false + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/HCMiniSdk/Third/ta/Plugins/iOS/TAThirdParty/TAAppsFlyerSyncData.m b/Assets/HCMiniSdk/Third/ta/Plugins/iOS/TAThirdParty/TAAppsFlyerSyncData.m new file mode 100755 index 00000000..75b71715 --- /dev/null +++ b/Assets/HCMiniSdk/Third/ta/Plugins/iOS/TAThirdParty/TAAppsFlyerSyncData.m @@ -0,0 +1,39 @@ +// +// TAAppsFlyerSyncData.m +// ThinkingSDK +// +// Created by wwango on 2022/2/14. +// + +#import "TAAppsFlyerSyncData.h" + +@implementation TAAppsFlyerSyncData + +#pragma clang diagnostic push +#pragma clang diagnostic ignored "-Warc-performSelector-leaks" + +- (void)syncThirdData:(id)taInstance property:(NSDictionary *)property { + + if (!self.customPropety || [self.customPropety isKindOfClass:[NSDictionary class]]) { + self.customPropety = @{}; + } + + NSMutableDictionary * datas = [NSMutableDictionary dictionaryWithDictionary:property]; + NSString *accountID = [taInstance getAccountId]; + NSString *distinctId = [taInstance getDistinctId]; + [datas setObject:(accountID ? accountID : @"") forKey:TA_ACCOUNT_ID]; + [datas setObject:distinctId ? distinctId : @"" forKey:TA_DISTINCT_ID]; + + Class cls = NSClassFromString(@"AppsFlyerLib"); + SEL sel1 = NSSelectorFromString(@"shared"); + SEL sel2 = NSSelectorFromString(@"setAdditionalData:"); + if (cls && [cls respondsToSelector:sel1]) { + id instance = [cls performSelector:sel1]; + if ([instance respondsToSelector:sel2]) { + [instance performSelector:sel2 withObject:datas]; + } + } +} +#pragma clang diagnostic pop + +@end diff --git a/Assets/HCMiniSdk/Third/ta/Plugins/iOS/TAThirdParty/TAAppsFlyerSyncData.m.meta b/Assets/HCMiniSdk/Third/ta/Plugins/iOS/TAThirdParty/TAAppsFlyerSyncData.m.meta new file mode 100644 index 00000000..701459bc --- /dev/null +++ b/Assets/HCMiniSdk/Third/ta/Plugins/iOS/TAThirdParty/TAAppsFlyerSyncData.m.meta @@ -0,0 +1,33 @@ +fileFormatVersion: 2 +guid: b373ccef5fc814dd3b5cca3544ef6d2e +PluginImporter: + externalObjects: {} + serializedVersion: 2 + iconMap: {} + executionOrder: {} + defineConstraints: [] + isPreloaded: 0 + isOverridable: 0 + isExplicitlyReferenced: 0 + validateReferences: 1 + platformData: + - first: + Any: + second: + enabled: 0 + settings: {} + - first: + Editor: Editor + second: + enabled: 0 + settings: + DefaultValueInitialized: true + - first: + iPhone: iOS + second: + enabled: 1 + settings: + AddToEmbeddedBinaries: false + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/HCMiniSdk/Third/ta/Plugins/iOS/TAThirdParty/TABaseSyncData.h b/Assets/HCMiniSdk/Third/ta/Plugins/iOS/TAThirdParty/TABaseSyncData.h new file mode 100755 index 00000000..99e9b023 --- /dev/null +++ b/Assets/HCMiniSdk/Third/ta/Plugins/iOS/TAThirdParty/TABaseSyncData.h @@ -0,0 +1,76 @@ +// +// TABaseSyncData.h +// ThinkingSDK +// +// Created by wwango on 2022/2/14. +// + +#import +#import +#import "TAThirdPartySyncProtocol.h" + +#define TA_DISTINCT_ID @"ta_distinct_id" +#define TA_ACCOUNT_ID @"ta_account_id" + + +#define td_force_inline __inline__ __attribute__((always_inline)) + + +#define TASyncDataKey @"TASyncDataKey" + + +NS_ASSUME_NONNULL_BEGIN + +static td_force_inline void __td_td__swizzleWithClassMethod(Class c, NSString *oriSELStr, SEL newSel, IMP newIMP) { + SEL orig = NSSelectorFromString(oriSELStr); + Method origMethod = class_getClassMethod(c, orig); + c = object_getClass((id)c); + + class_addMethod(c, newSel, newIMP, method_getTypeEncoding(origMethod)); + + + if(class_addMethod(c, orig, newIMP, method_getTypeEncoding(origMethod))) { + class_replaceMethod(c, newSel, method_getImplementation(origMethod), method_getTypeEncoding(origMethod)); + } else { + Method newMethod = class_getClassMethod(c, newSel); + method_exchangeImplementations(origMethod, newMethod); + } +} + + +static td_force_inline void __td_td_swizzleWithOriSELStr(id target, NSString *oriSELStr, SEL newSEL, IMP newIMP) { + SEL origSEL = NSSelectorFromString(oriSELStr); + Method origMethod = class_getInstanceMethod([target class], origSEL); + + if ([target respondsToSelector:origSEL]) { + + class_addMethod([target class], newSEL, newIMP, method_getTypeEncoding(origMethod)); + + + Method origMethod = class_getInstanceMethod([target class], origSEL); + + Method newMethod = class_getInstanceMethod([target class], newSEL); + + + if(class_addMethod([target class], origSEL, method_getImplementation(newMethod), method_getTypeEncoding(newMethod))) { + + class_replaceMethod([target class], newSEL, method_getImplementation(origMethod), method_getTypeEncoding(origMethod)); + } else { + + method_exchangeImplementations(origMethod, newMethod); + } + } else { + + class_addMethod([target class], origSEL, newIMP, method_getTypeEncoding(origMethod)); + } +} + +@interface TABaseSyncData : NSObject + +@property (nonatomic, weak) id taInstance; +@property (nonatomic, strong) NSDictionary *customPropety; +@property (nonatomic, assign) BOOL isSwizzleMethod; + +@end + +NS_ASSUME_NONNULL_END diff --git a/Assets/HCMiniSdk/Third/ta/Plugins/iOS/TAThirdParty/TABaseSyncData.h.meta b/Assets/HCMiniSdk/Third/ta/Plugins/iOS/TAThirdParty/TABaseSyncData.h.meta new file mode 100644 index 00000000..d3bdabb7 --- /dev/null +++ b/Assets/HCMiniSdk/Third/ta/Plugins/iOS/TAThirdParty/TABaseSyncData.h.meta @@ -0,0 +1,33 @@ +fileFormatVersion: 2 +guid: 65771a2840d484c718e6166b779b5d9b +PluginImporter: + externalObjects: {} + serializedVersion: 2 + iconMap: {} + executionOrder: {} + defineConstraints: [] + isPreloaded: 0 + isOverridable: 0 + isExplicitlyReferenced: 0 + validateReferences: 1 + platformData: + - first: + Any: + second: + enabled: 0 + settings: {} + - first: + Editor: Editor + second: + enabled: 0 + settings: + DefaultValueInitialized: true + - first: + iPhone: iOS + second: + enabled: 1 + settings: + AddToEmbeddedBinaries: false + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/HCMiniSdk/Third/ta/Plugins/iOS/TAThirdParty/TABaseSyncData.m b/Assets/HCMiniSdk/Third/ta/Plugins/iOS/TAThirdParty/TABaseSyncData.m new file mode 100755 index 00000000..b276be8b --- /dev/null +++ b/Assets/HCMiniSdk/Third/ta/Plugins/iOS/TAThirdParty/TABaseSyncData.m @@ -0,0 +1,21 @@ +// +// TABaseSyncData.m +// ThinkingSDK +// +// Created by wwango on 2022/2/14. +// + +#import "TABaseSyncData.h" + +@implementation TABaseSyncData + +- (void)syncThirdData:(id)taInstance property:(NSDictionary *)property { + self.taInstance = taInstance; + self.customPropety = property; +} + +- (void)syncThirdData:(id)taInstance { + [self syncThirdData:taInstance property:@{}]; +} + +@end diff --git a/Assets/HCMiniSdk/Third/ta/Plugins/iOS/TAThirdParty/TABaseSyncData.m.meta b/Assets/HCMiniSdk/Third/ta/Plugins/iOS/TAThirdParty/TABaseSyncData.m.meta new file mode 100644 index 00000000..d1fe2400 --- /dev/null +++ b/Assets/HCMiniSdk/Third/ta/Plugins/iOS/TAThirdParty/TABaseSyncData.m.meta @@ -0,0 +1,33 @@ +fileFormatVersion: 2 +guid: 517862af209ce4ad4bd8002a327fed73 +PluginImporter: + externalObjects: {} + serializedVersion: 2 + iconMap: {} + executionOrder: {} + defineConstraints: [] + isPreloaded: 0 + isOverridable: 0 + isExplicitlyReferenced: 0 + validateReferences: 1 + platformData: + - first: + Any: + second: + enabled: 0 + settings: {} + - first: + Editor: Editor + second: + enabled: 0 + settings: + DefaultValueInitialized: true + - first: + iPhone: iOS + second: + enabled: 1 + settings: + AddToEmbeddedBinaries: false + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/HCMiniSdk/Third/ta/Plugins/iOS/TAThirdParty/TABranchSyncData.h b/Assets/HCMiniSdk/Third/ta/Plugins/iOS/TAThirdParty/TABranchSyncData.h new file mode 100755 index 00000000..0d11db3f --- /dev/null +++ b/Assets/HCMiniSdk/Third/ta/Plugins/iOS/TAThirdParty/TABranchSyncData.h @@ -0,0 +1,16 @@ +// +// TABranchSyncData.h +// ThinkingSDK +// +// Created by wwango on 2022/3/25. +// + +#import "TABaseSyncData.h" + +NS_ASSUME_NONNULL_BEGIN + +@interface TABranchSyncData : TABaseSyncData + +@end + +NS_ASSUME_NONNULL_END diff --git a/Assets/HCMiniSdk/Third/ta/Plugins/iOS/TAThirdParty/TABranchSyncData.h.meta b/Assets/HCMiniSdk/Third/ta/Plugins/iOS/TAThirdParty/TABranchSyncData.h.meta new file mode 100644 index 00000000..adf2d925 --- /dev/null +++ b/Assets/HCMiniSdk/Third/ta/Plugins/iOS/TAThirdParty/TABranchSyncData.h.meta @@ -0,0 +1,33 @@ +fileFormatVersion: 2 +guid: ca22a7263ae5145cba856e4bd480b2bb +PluginImporter: + externalObjects: {} + serializedVersion: 2 + iconMap: {} + executionOrder: {} + defineConstraints: [] + isPreloaded: 0 + isOverridable: 0 + isExplicitlyReferenced: 0 + validateReferences: 1 + platformData: + - first: + Any: + second: + enabled: 0 + settings: {} + - first: + Editor: Editor + second: + enabled: 0 + settings: + DefaultValueInitialized: true + - first: + iPhone: iOS + second: + enabled: 1 + settings: + AddToEmbeddedBinaries: false + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/HCMiniSdk/Third/ta/Plugins/iOS/TAThirdParty/TABranchSyncData.m b/Assets/HCMiniSdk/Third/ta/Plugins/iOS/TAThirdParty/TABranchSyncData.m new file mode 100755 index 00000000..c810dd03 --- /dev/null +++ b/Assets/HCMiniSdk/Third/ta/Plugins/iOS/TAThirdParty/TABranchSyncData.m @@ -0,0 +1,37 @@ +// +// TABranchSyncData.m +// ThinkingSDK +// +// Created by wwango on 2022/3/25. +// + +#import "TABranchSyncData.h" + +@implementation TABranchSyncData + +#pragma clang diagnostic push +#pragma clang diagnostic ignored "-Warc-performSelector-leaks" + +- (void)syncThirdData:(id)taInstance property:(NSDictionary *)property { + + if (!self.customPropety || [self.customPropety isKindOfClass:[NSDictionary class]]) { + self.customPropety = @{}; + } + + NSString *accountID = [taInstance getAccountId]; + NSString *distinctId = [taInstance getDistinctId]; + + Class cls = NSClassFromString(@"Branch"); + SEL sel1 = NSSelectorFromString(@"getInstance"); + SEL sel2 = NSSelectorFromString(@"setRequestMetadataKey:value:"); + if (cls && [cls respondsToSelector:sel1]) { + id instance = [cls performSelector:sel1]; + if ([instance respondsToSelector:sel2]) { + [instance performSelector:sel2 withObject:TA_ACCOUNT_ID withObject:accountID]; + [instance performSelector:sel2 withObject:TA_DISTINCT_ID withObject:distinctId]; + } + } +} +#pragma clang diagnostic pop + +@end diff --git a/Assets/HCMiniSdk/Third/ta/Plugins/iOS/TAThirdParty/TABranchSyncData.m.meta b/Assets/HCMiniSdk/Third/ta/Plugins/iOS/TAThirdParty/TABranchSyncData.m.meta new file mode 100644 index 00000000..f0dcbb7f --- /dev/null +++ b/Assets/HCMiniSdk/Third/ta/Plugins/iOS/TAThirdParty/TABranchSyncData.m.meta @@ -0,0 +1,33 @@ +fileFormatVersion: 2 +guid: 14d24e07c10e04914806b65a10266790 +PluginImporter: + externalObjects: {} + serializedVersion: 2 + iconMap: {} + executionOrder: {} + defineConstraints: [] + isPreloaded: 0 + isOverridable: 0 + isExplicitlyReferenced: 0 + validateReferences: 1 + platformData: + - first: + Any: + second: + enabled: 0 + settings: {} + - first: + Editor: Editor + second: + enabled: 0 + settings: + DefaultValueInitialized: true + - first: + iPhone: iOS + second: + enabled: 1 + settings: + AddToEmbeddedBinaries: false + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/HCMiniSdk/Third/ta/Plugins/iOS/TAThirdParty/TAFirebaseSyncData.h b/Assets/HCMiniSdk/Third/ta/Plugins/iOS/TAThirdParty/TAFirebaseSyncData.h new file mode 100755 index 00000000..346facab --- /dev/null +++ b/Assets/HCMiniSdk/Third/ta/Plugins/iOS/TAThirdParty/TAFirebaseSyncData.h @@ -0,0 +1,16 @@ +// +// TAFirebaseSyncData.h +// ThinkingSDK.default-Base-Core-Extension-Util-iOS +// +// Created by wwango on 2022/9/28. +// + +#import "TABaseSyncData.h" + +NS_ASSUME_NONNULL_BEGIN + +@interface TAFirebaseSyncData : TABaseSyncData + +@end + +NS_ASSUME_NONNULL_END diff --git a/Assets/HCMiniSdk/Third/ta/Plugins/iOS/TAThirdParty/TAFirebaseSyncData.h.meta b/Assets/HCMiniSdk/Third/ta/Plugins/iOS/TAThirdParty/TAFirebaseSyncData.h.meta new file mode 100644 index 00000000..2ddc6b24 --- /dev/null +++ b/Assets/HCMiniSdk/Third/ta/Plugins/iOS/TAThirdParty/TAFirebaseSyncData.h.meta @@ -0,0 +1,33 @@ +fileFormatVersion: 2 +guid: 05884726aff3f4d0a8705c380924ac0f +PluginImporter: + externalObjects: {} + serializedVersion: 2 + iconMap: {} + executionOrder: {} + defineConstraints: [] + isPreloaded: 0 + isOverridable: 0 + isExplicitlyReferenced: 0 + validateReferences: 1 + platformData: + - first: + Any: + second: + enabled: 0 + settings: {} + - first: + Editor: Editor + second: + enabled: 0 + settings: + DefaultValueInitialized: true + - first: + iPhone: iOS + second: + enabled: 1 + settings: + AddToEmbeddedBinaries: false + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/HCMiniSdk/Third/ta/Plugins/iOS/TAThirdParty/TAFirebaseSyncData.m b/Assets/HCMiniSdk/Third/ta/Plugins/iOS/TAThirdParty/TAFirebaseSyncData.m new file mode 100755 index 00000000..5d65e130 --- /dev/null +++ b/Assets/HCMiniSdk/Third/ta/Plugins/iOS/TAThirdParty/TAFirebaseSyncData.m @@ -0,0 +1,32 @@ +// +// TAFirebaseSyncData.m +// ThinkingSDK.default-Base-Core-Extension-Util-iOS +// +// Created by wwango on 2022/9/28. +// + +#import "TAFirebaseSyncData.h" + +@implementation TAFirebaseSyncData + +#pragma clang diagnostic push +#pragma clang diagnostic ignored "-Warc-performSelector-leaks" + +- (void)syncThirdData:(id)taInstance property:(NSDictionary *)property { + + if (!self.customPropety || [self.customPropety isKindOfClass:[NSDictionary class]]) { + self.customPropety = @{}; + } + + NSString *distinctId = [taInstance getDistinctId] ? [taInstance getDistinctId] : @""; + + Class cls = NSClassFromString(@"FIRAnalytics"); + SEL sel = NSSelectorFromString(@"setUserID:"); + if (cls && [cls respondsToSelector:sel]) { + [cls performSelector:sel withObject:distinctId]; + } + +} +#pragma clang diagnostic pop + +@end diff --git a/Assets/HCMiniSdk/Third/ta/Plugins/iOS/TAThirdParty/TAFirebaseSyncData.m.meta b/Assets/HCMiniSdk/Third/ta/Plugins/iOS/TAThirdParty/TAFirebaseSyncData.m.meta new file mode 100644 index 00000000..19ec5559 --- /dev/null +++ b/Assets/HCMiniSdk/Third/ta/Plugins/iOS/TAThirdParty/TAFirebaseSyncData.m.meta @@ -0,0 +1,33 @@ +fileFormatVersion: 2 +guid: f55372f8b0d004744a0d5601f3bdf1e5 +PluginImporter: + externalObjects: {} + serializedVersion: 2 + iconMap: {} + executionOrder: {} + defineConstraints: [] + isPreloaded: 0 + isOverridable: 0 + isExplicitlyReferenced: 0 + validateReferences: 1 + platformData: + - first: + Any: + second: + enabled: 0 + settings: {} + - first: + Editor: Editor + second: + enabled: 0 + settings: + DefaultValueInitialized: true + - first: + iPhone: iOS + second: + enabled: 1 + settings: + AddToEmbeddedBinaries: false + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/HCMiniSdk/Third/ta/Plugins/iOS/TAThirdParty/TAIronSourceSyncData.h b/Assets/HCMiniSdk/Third/ta/Plugins/iOS/TAThirdParty/TAIronSourceSyncData.h new file mode 100755 index 00000000..e89d705a --- /dev/null +++ b/Assets/HCMiniSdk/Third/ta/Plugins/iOS/TAThirdParty/TAIronSourceSyncData.h @@ -0,0 +1,16 @@ +// +// TAIronSourceSyncData.h +// ThinkingSDK +// +// Created by wwango on 2022/2/16. +// + +#import "TABaseSyncData.h" + +NS_ASSUME_NONNULL_BEGIN + +@interface TAIronSourceSyncData : TABaseSyncData + +@end + +NS_ASSUME_NONNULL_END diff --git a/Assets/HCMiniSdk/Third/ta/Plugins/iOS/TAThirdParty/TAIronSourceSyncData.h.meta b/Assets/HCMiniSdk/Third/ta/Plugins/iOS/TAThirdParty/TAIronSourceSyncData.h.meta new file mode 100644 index 00000000..2a8fcc8a --- /dev/null +++ b/Assets/HCMiniSdk/Third/ta/Plugins/iOS/TAThirdParty/TAIronSourceSyncData.h.meta @@ -0,0 +1,33 @@ +fileFormatVersion: 2 +guid: 7fccbd96cdae8450181ef923883295d9 +PluginImporter: + externalObjects: {} + serializedVersion: 2 + iconMap: {} + executionOrder: {} + defineConstraints: [] + isPreloaded: 0 + isOverridable: 0 + isExplicitlyReferenced: 0 + validateReferences: 1 + platformData: + - first: + Any: + second: + enabled: 0 + settings: {} + - first: + Editor: Editor + second: + enabled: 0 + settings: + DefaultValueInitialized: true + - first: + iPhone: iOS + second: + enabled: 1 + settings: + AddToEmbeddedBinaries: false + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/HCMiniSdk/Third/ta/Plugins/iOS/TAThirdParty/TAIronSourceSyncData.m b/Assets/HCMiniSdk/Third/ta/Plugins/iOS/TAThirdParty/TAIronSourceSyncData.m new file mode 100755 index 00000000..99c24f86 --- /dev/null +++ b/Assets/HCMiniSdk/Third/ta/Plugins/iOS/TAThirdParty/TAIronSourceSyncData.m @@ -0,0 +1,61 @@ +// +// TAIronSourceSyncData.m +// ThinkingSDK +// +// Created by wwango on 2022/2/16. +// + +#import "TAIronSourceSyncData.h" + +@implementation TAIronSourceSyncData + +#pragma clang diagnostic push +#pragma clang diagnostic ignored "-Warc-performSelector-leaks" + +static id _td_last_IronSource_delegate; + +- (void)syncThirdData:(id)taInstance { + + [super syncThirdData:taInstance]; + + if (self.isSwizzleMethod) return; + + Class class = NSClassFromString(@"IronSource"); + NSString *oriSELString = @"addImpressionDataDelegate:"; + SEL newSel = NSSelectorFromString([NSString stringWithFormat:@"td_%@", oriSELString]); + IMP newIMP = imp_implementationWithBlock(^(id _self, id delegate) { + if ([_self respondsToSelector:newSel]) { + [_self performSelector:newSel withObject:delegate]; + _td_last_IronSource_delegate = delegate; + } + + id class1 = delegate; + NSString *oriSELString1 = @"impressionDataDidSucceed:"; + SEL newSel1 = NSSelectorFromString([NSString stringWithFormat:@"td_%@", oriSELString1]); + IMP newIMP1 = imp_implementationWithBlock(^(id _self1, id impressionData) { + if ([_self1 respondsToSelector:newSel1]) { + [_self1 performSelector:newSel1 withObject:impressionData]; + } + + NSDictionary *all_data; + SEL sel = NSSelectorFromString(@"all_data"); + if ([impressionData respondsToSelector:sel]) { + all_data = [impressionData performSelector:sel]; + } + + if (_td_last_IronSource_delegate == _self1) { + [self.taInstance track:@"ta_ironSource_callback" properties:all_data]; + } + }); + __td_td_swizzleWithOriSELStr(class1, oriSELString1, newSel1, newIMP1); + }); + + __td_td__swizzleWithClassMethod(class, oriSELString, newSel, newIMP); + + self.isSwizzleMethod = YES; +} + +#pragma clang diagnostic pop + +@end + diff --git a/Assets/HCMiniSdk/Third/ta/Plugins/iOS/TAThirdParty/TAIronSourceSyncData.m.meta b/Assets/HCMiniSdk/Third/ta/Plugins/iOS/TAThirdParty/TAIronSourceSyncData.m.meta new file mode 100644 index 00000000..ad8bfa8d --- /dev/null +++ b/Assets/HCMiniSdk/Third/ta/Plugins/iOS/TAThirdParty/TAIronSourceSyncData.m.meta @@ -0,0 +1,33 @@ +fileFormatVersion: 2 +guid: 50723cb7b78a24331b43bba7ee34caf4 +PluginImporter: + externalObjects: {} + serializedVersion: 2 + iconMap: {} + executionOrder: {} + defineConstraints: [] + isPreloaded: 0 + isOverridable: 0 + isExplicitlyReferenced: 0 + validateReferences: 1 + platformData: + - first: + Any: + second: + enabled: 0 + settings: {} + - first: + Editor: Editor + second: + enabled: 0 + settings: + DefaultValueInitialized: true + - first: + iPhone: iOS + second: + enabled: 1 + settings: + AddToEmbeddedBinaries: false + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/HCMiniSdk/Third/ta/Plugins/iOS/TAThirdParty/TAKochavaSyncData.h b/Assets/HCMiniSdk/Third/ta/Plugins/iOS/TAThirdParty/TAKochavaSyncData.h new file mode 100755 index 00000000..ada19297 --- /dev/null +++ b/Assets/HCMiniSdk/Third/ta/Plugins/iOS/TAThirdParty/TAKochavaSyncData.h @@ -0,0 +1,16 @@ +// +// TAKochavaSyncData.h +// ThinkingSDK.default-Base-Core-Extension-Util-iOS +// +// Created by wwango on 2022/9/28. +// + +#import "TABaseSyncData.h" + +NS_ASSUME_NONNULL_BEGIN + +@interface TAKochavaSyncData : TABaseSyncData + +@end + +NS_ASSUME_NONNULL_END diff --git a/Assets/HCMiniSdk/Third/ta/Plugins/iOS/TAThirdParty/TAKochavaSyncData.h.meta b/Assets/HCMiniSdk/Third/ta/Plugins/iOS/TAThirdParty/TAKochavaSyncData.h.meta new file mode 100644 index 00000000..771248a9 --- /dev/null +++ b/Assets/HCMiniSdk/Third/ta/Plugins/iOS/TAThirdParty/TAKochavaSyncData.h.meta @@ -0,0 +1,33 @@ +fileFormatVersion: 2 +guid: 5908d2c27b80a489dae892a870b74de1 +PluginImporter: + externalObjects: {} + serializedVersion: 2 + iconMap: {} + executionOrder: {} + defineConstraints: [] + isPreloaded: 0 + isOverridable: 0 + isExplicitlyReferenced: 0 + validateReferences: 1 + platformData: + - first: + Any: + second: + enabled: 0 + settings: {} + - first: + Editor: Editor + second: + enabled: 0 + settings: + DefaultValueInitialized: true + - first: + iPhone: iOS + second: + enabled: 1 + settings: + AddToEmbeddedBinaries: false + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/HCMiniSdk/Third/ta/Plugins/iOS/TAThirdParty/TAKochavaSyncData.m b/Assets/HCMiniSdk/Third/ta/Plugins/iOS/TAThirdParty/TAKochavaSyncData.m new file mode 100755 index 00000000..29a1fc21 --- /dev/null +++ b/Assets/HCMiniSdk/Third/ta/Plugins/iOS/TAThirdParty/TAKochavaSyncData.m @@ -0,0 +1,42 @@ +// +// TAKochavaSyncData.m +// ThinkingSDK.default-Base-Core-Extension-Util-iOS +// +// Created by wwango on 2022/9/28. +// + +#import "TAKochavaSyncData.h" + +@implementation TAKochavaSyncData + +#pragma clang diagnostic push +#pragma clang diagnostic ignored "-Warc-performSelector-leaks" + +- (void)syncThirdData:(id)taInstance property:(NSDictionary *)property { + + if (!self.customPropety || [self.customPropety isKindOfClass:[NSDictionary class]]) { + self.customPropety = @{}; + } + + NSString *accountID = [taInstance getAccountId]; + NSString *distinctId = [taInstance getDistinctId]; + + Class cls = NSClassFromString(@"KVATracker"); + SEL sel = NSSelectorFromString(@"shared"); + SEL sel1 = NSSelectorFromString(@"identityLink"); + SEL sel2 = NSSelectorFromString(@"registerWithNameString:identifierString:"); + if (cls && [cls respondsToSelector:sel]) { + id shared = [cls performSelector:sel]; + if (shared && [shared respondsToSelector:sel1]) { + id identityLink = [shared performSelector:sel1]; + if (identityLink && [identityLink respondsToSelector:sel2]) { + [identityLink performSelector:sel2 withObject:TA_ACCOUNT_ID withObject:(accountID ? accountID : @"")]; + [identityLink performSelector:sel2 withObject:TA_DISTINCT_ID withObject:(distinctId ? distinctId : @"")]; + } + } + } +} +#pragma clang diagnostic pop + + +@end diff --git a/Assets/HCMiniSdk/Third/ta/Plugins/iOS/TAThirdParty/TAKochavaSyncData.m.meta b/Assets/HCMiniSdk/Third/ta/Plugins/iOS/TAThirdParty/TAKochavaSyncData.m.meta new file mode 100644 index 00000000..a0d4ea4c --- /dev/null +++ b/Assets/HCMiniSdk/Third/ta/Plugins/iOS/TAThirdParty/TAKochavaSyncData.m.meta @@ -0,0 +1,33 @@ +fileFormatVersion: 2 +guid: 9dfff7df542cd401fa7592b206725a02 +PluginImporter: + externalObjects: {} + serializedVersion: 2 + iconMap: {} + executionOrder: {} + defineConstraints: [] + isPreloaded: 0 + isOverridable: 0 + isExplicitlyReferenced: 0 + validateReferences: 1 + platformData: + - first: + Any: + second: + enabled: 0 + settings: {} + - first: + Editor: Editor + second: + enabled: 0 + settings: + DefaultValueInitialized: true + - first: + iPhone: iOS + second: + enabled: 1 + settings: + AddToEmbeddedBinaries: false + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/HCMiniSdk/Third/ta/Plugins/iOS/TAThirdParty/TAReYunSyncData.h b/Assets/HCMiniSdk/Third/ta/Plugins/iOS/TAThirdParty/TAReYunSyncData.h new file mode 100755 index 00000000..516410dd --- /dev/null +++ b/Assets/HCMiniSdk/Third/ta/Plugins/iOS/TAThirdParty/TAReYunSyncData.h @@ -0,0 +1,16 @@ +// +// TAReYunSyncData.h +// ThinkingSDK +// +// Created by wwango on 2022/3/25. +// + +#import "TABaseSyncData.h" + +NS_ASSUME_NONNULL_BEGIN + +@interface TAReYunSyncData : TABaseSyncData + +@end + +NS_ASSUME_NONNULL_END diff --git a/Assets/HCMiniSdk/Third/ta/Plugins/iOS/TAThirdParty/TAReYunSyncData.h.meta b/Assets/HCMiniSdk/Third/ta/Plugins/iOS/TAThirdParty/TAReYunSyncData.h.meta new file mode 100644 index 00000000..a55686a5 --- /dev/null +++ b/Assets/HCMiniSdk/Third/ta/Plugins/iOS/TAThirdParty/TAReYunSyncData.h.meta @@ -0,0 +1,33 @@ +fileFormatVersion: 2 +guid: e64632bcc60a04ad78c1baa60002266c +PluginImporter: + externalObjects: {} + serializedVersion: 2 + iconMap: {} + executionOrder: {} + defineConstraints: [] + isPreloaded: 0 + isOverridable: 0 + isExplicitlyReferenced: 0 + validateReferences: 1 + platformData: + - first: + Any: + second: + enabled: 0 + settings: {} + - first: + Editor: Editor + second: + enabled: 0 + settings: + DefaultValueInitialized: true + - first: + iPhone: iOS + second: + enabled: 1 + settings: + AddToEmbeddedBinaries: false + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/HCMiniSdk/Third/ta/Plugins/iOS/TAThirdParty/TAReYunSyncData.m b/Assets/HCMiniSdk/Third/ta/Plugins/iOS/TAThirdParty/TAReYunSyncData.m new file mode 100755 index 00000000..d26258e8 --- /dev/null +++ b/Assets/HCMiniSdk/Third/ta/Plugins/iOS/TAThirdParty/TAReYunSyncData.m @@ -0,0 +1,31 @@ +// +// TAReYunSyncData.m +// ThinkingSDK +// +// Created by wwango on 2022/3/25. +// + +#import "TAReYunSyncData.h" + +@implementation TAReYunSyncData + +#pragma clang diagnostic push +#pragma clang diagnostic ignored "-Warc-performSelector-leaks" + +- (void)syncThirdData:(id)taInstance property:(NSDictionary *)property { + + if (!self.customPropety || [self.customPropety isKindOfClass:[NSDictionary class]]) { + self.customPropety = @{}; + } + + NSString *distinctId = [taInstance getDistinctId] ? [taInstance getDistinctId] : @""; + + Class cls = NSClassFromString(@"Tracking"); + SEL sel = NSSelectorFromString(@"setRegisterWithAccountID:"); + if (cls && [cls respondsToSelector:sel]) { + [cls performSelector:sel withObject: distinctId]; + } +} +#pragma clang diagnostic pop + +@end diff --git a/Assets/HCMiniSdk/Third/ta/Plugins/iOS/TAThirdParty/TAReYunSyncData.m.meta b/Assets/HCMiniSdk/Third/ta/Plugins/iOS/TAThirdParty/TAReYunSyncData.m.meta new file mode 100644 index 00000000..5182f8a2 --- /dev/null +++ b/Assets/HCMiniSdk/Third/ta/Plugins/iOS/TAThirdParty/TAReYunSyncData.m.meta @@ -0,0 +1,33 @@ +fileFormatVersion: 2 +guid: fb3609527c6d545288b56199264a3800 +PluginImporter: + externalObjects: {} + serializedVersion: 2 + iconMap: {} + executionOrder: {} + defineConstraints: [] + isPreloaded: 0 + isOverridable: 0 + isExplicitlyReferenced: 0 + validateReferences: 1 + platformData: + - first: + Any: + second: + enabled: 0 + settings: {} + - first: + Editor: Editor + second: + enabled: 0 + settings: + DefaultValueInitialized: true + - first: + iPhone: iOS + second: + enabled: 1 + settings: + AddToEmbeddedBinaries: false + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/HCMiniSdk/Third/ta/Plugins/iOS/TAThirdParty/TAThirdParty.h b/Assets/HCMiniSdk/Third/ta/Plugins/iOS/TAThirdParty/TAThirdParty.h new file mode 100644 index 00000000..f1a3a147 --- /dev/null +++ b/Assets/HCMiniSdk/Third/ta/Plugins/iOS/TAThirdParty/TAThirdParty.h @@ -0,0 +1,18 @@ +// +// TAThirdParty.h +// TAThirdParty +// +// Created by Charles on 9.1.23. +// + +#import + +//! Project version number for TAThirdParty. +FOUNDATION_EXPORT double TAThirdPartyVersionNumber; + +//! Project version string for TAThirdParty. +FOUNDATION_EXPORT const unsigned char TAThirdPartyVersionString[]; + +// In this header, you should import all the public headers of your framework using statements like #import + + diff --git a/Assets/HCMiniSdk/Third/ta/Plugins/iOS/TAThirdParty/TAThirdParty.h.meta b/Assets/HCMiniSdk/Third/ta/Plugins/iOS/TAThirdParty/TAThirdParty.h.meta new file mode 100644 index 00000000..9e9c6b84 --- /dev/null +++ b/Assets/HCMiniSdk/Third/ta/Plugins/iOS/TAThirdParty/TAThirdParty.h.meta @@ -0,0 +1,33 @@ +fileFormatVersion: 2 +guid: 97f6ec784b7384c92ac47dcd94bf5d5a +PluginImporter: + externalObjects: {} + serializedVersion: 2 + iconMap: {} + executionOrder: {} + defineConstraints: [] + isPreloaded: 0 + isOverridable: 0 + isExplicitlyReferenced: 0 + validateReferences: 1 + platformData: + - first: + Any: + second: + enabled: 0 + settings: {} + - first: + Editor: Editor + second: + enabled: 0 + settings: + DefaultValueInitialized: true + - first: + iPhone: iOS + second: + enabled: 1 + settings: + AddToEmbeddedBinaries: false + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/HCMiniSdk/Third/ta/Plugins/iOS/TAThirdParty/TAThirdPartyManager.h b/Assets/HCMiniSdk/Third/ta/Plugins/iOS/TAThirdParty/TAThirdPartyManager.h new file mode 100755 index 00000000..01bd1c6e --- /dev/null +++ b/Assets/HCMiniSdk/Third/ta/Plugins/iOS/TAThirdParty/TAThirdPartyManager.h @@ -0,0 +1,20 @@ +// +// TAThirdPartyManager.h +// ThinkingSDK +// +// Created by wwango on 2022/2/11. +// + +#import +#import "TAThirdPartySyncProtocol.h" + +NS_ASSUME_NONNULL_BEGIN + +@interface TAThirdPartyManager : NSObject + +- (void)enableThirdPartySharing:(NSNumber *)type instance:(id)instance; +- (void)enableThirdPartySharing:(NSNumber *)type instance:(id)instance property:(NSDictionary *)property; + +@end + +NS_ASSUME_NONNULL_END diff --git a/Assets/HCMiniSdk/Third/ta/Plugins/iOS/TAThirdParty/TAThirdPartyManager.h.meta b/Assets/HCMiniSdk/Third/ta/Plugins/iOS/TAThirdParty/TAThirdPartyManager.h.meta new file mode 100644 index 00000000..bd468340 --- /dev/null +++ b/Assets/HCMiniSdk/Third/ta/Plugins/iOS/TAThirdParty/TAThirdPartyManager.h.meta @@ -0,0 +1,33 @@ +fileFormatVersion: 2 +guid: 17cf558a565af4f988f6a4a875217e78 +PluginImporter: + externalObjects: {} + serializedVersion: 2 + iconMap: {} + executionOrder: {} + defineConstraints: [] + isPreloaded: 0 + isOverridable: 0 + isExplicitlyReferenced: 0 + validateReferences: 1 + platformData: + - first: + Any: + second: + enabled: 0 + settings: {} + - first: + Editor: Editor + second: + enabled: 0 + settings: + DefaultValueInitialized: true + - first: + iPhone: iOS + second: + enabled: 1 + settings: + AddToEmbeddedBinaries: false + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/HCMiniSdk/Third/ta/Plugins/iOS/TAThirdParty/TAThirdPartyManager.m b/Assets/HCMiniSdk/Third/ta/Plugins/iOS/TAThirdParty/TAThirdPartyManager.m new file mode 100755 index 00000000..03c771ba --- /dev/null +++ b/Assets/HCMiniSdk/Third/ta/Plugins/iOS/TAThirdParty/TAThirdPartyManager.m @@ -0,0 +1,168 @@ +// +// TAThirdPartyManager.m +// ThinkingSDK +// +// Created by wwango on 2022/2/11. +// + +#import "TAThirdPartyManager.h" +#import "TAAppsFlyerSyncData.h" +#import "TAIronSourceSyncData.h" +#import "TAAdjustSyncData.h" +#import "TABranchSyncData.h" +#import "TATopOnSyncData.h" +#import "TAReYunSyncData.h" +#import "TATradPlusSyncData.h" +#import "TAKochavaSyncData.h" + + + typedef NS_OPTIONS(NSInteger, TAInnerThirdPartyShareType) { + TAInnerThirdPartyShareTypeNONE = 0, + TAInnerThirdPartyShareTypeAPPSFLYER = 1 << 0, + TAInnerThirdPartyShareTypeIRONSOURCE = 1 << 1, + TAInnerThirdPartyShareTypeADJUST = 1 << 2, + TAInnerThirdPartyShareTypeBRANCH = 1 << 3, + TAInnerThirdPartyShareTypeTOPON = 1 << 4, + TAInnerThirdPartyShareTypeTRACKING = 1 << 5, + TAInnerThirdPartyShareTypeTRADPLUS = 1 << 6, + TAInnerThirdPartyShareTypeAPPLOVIN = 1 << 7, + TAInnerThirdPartyShareTypeKOCHAVA = 1 << 8, + TAInnerThirdPartyShareTypeTALKINGDATA = 1 << 9, + TAInnerThirdPartyShareTypeFIREBASE = 1 << 10, + + }; + +static NSMutableDictionary *_thirdPartyManagerMap; + +// Register a third-party data collection service, and when the APP starts, it will start from the data area +char * kThinkingServices_service __attribute((used, section("__DATA, ThinkingServices"))) = "{ \"TAThirdPartyProtocol\" : \"TAThirdPartyManager\"}"; +@interface TAThirdPartyManager() + +@end + + +@implementation TAThirdPartyManager + +- (instancetype)init +{ + self = [super init]; + if (self) { + _thirdPartyManagerMap = [NSMutableDictionary dictionary]; + } + return self; +} + +- (void)enableThirdPartySharing:(NSNumber *)type instance:(id)instance +{ + [self enableThirdPartySharing:type instance:instance property:@{}]; +} + +- (void)enableThirdPartySharing:(NSNumber *)typee instance:(id)instance property:(NSDictionary *)property +{ + NSDictionary *info = [self _getThridInfoWithType:typee]; + + NSString *libClass = info[@"libClass"]; + NSString *taThirdClass = info[@"taThirdClass"]; + NSString *errorMes = info[@"errorMes"]; + + if (!NSClassFromString(libClass)) { + NSLog(@"[THINKING] %@", errorMes); + }else { + id syncData = [_thirdPartyManagerMap objectForKey:taThirdClass]; + if (!syncData) { + syncData = [NSClassFromString(taThirdClass) new]; + [_thirdPartyManagerMap setObject:syncData forKey:taThirdClass]; + } + [syncData syncThirdData:instance property:[property copy]]; + NSLog(@"[THINKING] %@ , SyncThirdData Success", NSClassFromString(libClass)); + } +} + + + + +- (NSDictionary *)_getThridInfoWithType:(NSNumber *)typee { + + static NSDictionary *_ta_ThridInfo; + static dispatch_once_t onceToken; + dispatch_once(&onceToken, ^{ + _ta_ThridInfo = @{ + @(TAInnerThirdPartyShareTypeAPPSFLYER):@{ + + @"libClass": @"AppsFlyerLib", + @"taThirdClass":@"TAAppsFlyerSyncData", + @"errorMes":@"AppsFlyer Data synchronization exception: not installed AppsFlyer SDK" + + }, + @(TAInnerThirdPartyShareTypeIRONSOURCE):@{ + + @"libClass": @"IronSource", + @"taThirdClass":@"TAIronSourceSyncData", + @"errorMes": @"IronSource Data synchronization exception: not installed IronSource SDK" + + }, + @(TAInnerThirdPartyShareTypeADJUST):@{ + + @"libClass": @"Adjust", + @"taThirdClass":@"TAAdjustSyncData", + @"errorMes": @"Adjust Data synchronization exception: not installed Adjust SDK" + + }, + @(TAInnerThirdPartyShareTypeBRANCH):@{ + + @"libClass": @"Branch", + @"taThirdClass":@"TABranchSyncData", + @"errorMes": @"Branch Data synchronization exception: not installed Branch SDK" + + }, + @(TAInnerThirdPartyShareTypeTOPON):@{ + + @"libClass": @"ATAPI", + @"taThirdClass":@"TATopOnSyncData", + @"errorMes": @"TopOn Data synchronization exception: not installed TopOn SDK" + + }, + @(TAInnerThirdPartyShareTypeTRACKING):@{ + + @"libClass": @"Tracking", + @"taThirdClass":@"TAReYunSyncData", + @"errorMes": @"ReYun Data synchronization exception: Data synchronization exception: not installed SDK" + + }, + @(TAInnerThirdPartyShareTypeTRADPLUS):@{ + + @"libClass": @"TradPlus", + @"taThirdClass":@"TATradPlusSyncData", + @"errorMes": @"TradPlus Data synchronization exception: not installed TradPlus SDK" + + }, + @(TAInnerThirdPartyShareTypeAPPLOVIN):@{ + + @"libClass": @"ALSdk", + @"taThirdClass":@"TAAppLovinSyncData", + @"errorMes": @"AppLovin Data synchronization exception: not installed AppLovin SDK" + + }, + @(TAInnerThirdPartyShareTypeKOCHAVA):@{ + + @"libClass": @"KVATracker", + @"taThirdClass":@"TAKochavaSyncData", + @"errorMes": @"Kochava Data synchronization exception: not installed Kochava SDK" + + }, + @(TAInnerThirdPartyShareTypeFIREBASE):@{ + + @"libClass": @"FIRAnalytics", + @"taThirdClass":@"TAFirebaseSyncData", + @"errorMes": @"FIREBASE Data synchronization exception: not installed FIRAnalytics SDK" + + }, + }; + }); + + return _ta_ThridInfo[typee]; + +} + + +@end diff --git a/Assets/HCMiniSdk/Third/ta/Plugins/iOS/TAThirdParty/TAThirdPartyManager.m.meta b/Assets/HCMiniSdk/Third/ta/Plugins/iOS/TAThirdParty/TAThirdPartyManager.m.meta new file mode 100644 index 00000000..e7583c84 --- /dev/null +++ b/Assets/HCMiniSdk/Third/ta/Plugins/iOS/TAThirdParty/TAThirdPartyManager.m.meta @@ -0,0 +1,33 @@ +fileFormatVersion: 2 +guid: 6a1080195ae5b4aea9bc7c1589134f3f +PluginImporter: + externalObjects: {} + serializedVersion: 2 + iconMap: {} + executionOrder: {} + defineConstraints: [] + isPreloaded: 0 + isOverridable: 0 + isExplicitlyReferenced: 0 + validateReferences: 1 + platformData: + - first: + Any: + second: + enabled: 0 + settings: {} + - first: + Editor: Editor + second: + enabled: 0 + settings: + DefaultValueInitialized: true + - first: + iPhone: iOS + second: + enabled: 1 + settings: + AddToEmbeddedBinaries: false + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/HCMiniSdk/Third/ta/Plugins/iOS/TAThirdParty/TAThirdPartySyncProtocol.h b/Assets/HCMiniSdk/Third/ta/Plugins/iOS/TAThirdParty/TAThirdPartySyncProtocol.h new file mode 100755 index 00000000..3f78b175 --- /dev/null +++ b/Assets/HCMiniSdk/Third/ta/Plugins/iOS/TAThirdParty/TAThirdPartySyncProtocol.h @@ -0,0 +1,36 @@ +// +// TAThirdPartySyncProtocol.h +// ThinkingSDKDEMO +// +// Created by wwango on 2022/2/17. +// Copyright © 2022 thinking. All rights reserved. +// + +#import + +NS_ASSUME_NONNULL_BEGIN + +@protocol TAThinkingTrackProtocol + +- (void)track:(NSString *)event properties:(nullable NSDictionary *)propertieDict; +- (NSString *)getDistinctId; +- (NSString *)getAccountId; + +@end + + +@protocol TAThirdPartySyncProtocol + +- (void)syncThirdData:(id)taInstance; +- (void)syncThirdData:(id)taInstance property:(NSDictionary *)property; + +@end + +@protocol TAThirdPartyProtocol + +- (void)enableThirdPartySharing:(NSNumber *)type instance:(id)instance; +- (void)enableThirdPartySharing:(NSNumber *)type instance:(id)instance property:(NSDictionary *)property; + +@end + +NS_ASSUME_NONNULL_END diff --git a/Assets/HCMiniSdk/Third/ta/Plugins/iOS/TAThirdParty/TAThirdPartySyncProtocol.h.meta b/Assets/HCMiniSdk/Third/ta/Plugins/iOS/TAThirdParty/TAThirdPartySyncProtocol.h.meta new file mode 100644 index 00000000..c0c3540f --- /dev/null +++ b/Assets/HCMiniSdk/Third/ta/Plugins/iOS/TAThirdParty/TAThirdPartySyncProtocol.h.meta @@ -0,0 +1,33 @@ +fileFormatVersion: 2 +guid: d31a489f12eb54653b5cf6444e4245d6 +PluginImporter: + externalObjects: {} + serializedVersion: 2 + iconMap: {} + executionOrder: {} + defineConstraints: [] + isPreloaded: 0 + isOverridable: 0 + isExplicitlyReferenced: 0 + validateReferences: 1 + platformData: + - first: + Any: + second: + enabled: 0 + settings: {} + - first: + Editor: Editor + second: + enabled: 0 + settings: + DefaultValueInitialized: true + - first: + iPhone: iOS + second: + enabled: 1 + settings: + AddToEmbeddedBinaries: false + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/HCMiniSdk/Third/ta/Plugins/iOS/TAThirdParty/TATopOnSyncData.h b/Assets/HCMiniSdk/Third/ta/Plugins/iOS/TAThirdParty/TATopOnSyncData.h new file mode 100755 index 00000000..e3eb68b7 --- /dev/null +++ b/Assets/HCMiniSdk/Third/ta/Plugins/iOS/TAThirdParty/TATopOnSyncData.h @@ -0,0 +1,16 @@ +// +// TATopOnSyncData.h +// ThinkingSDK +// +// Created by wwango on 2022/3/25. +// + +#import "TABaseSyncData.h" + +NS_ASSUME_NONNULL_BEGIN + +@interface TATopOnSyncData : TABaseSyncData + +@end + +NS_ASSUME_NONNULL_END diff --git a/Assets/HCMiniSdk/Third/ta/Plugins/iOS/TAThirdParty/TATopOnSyncData.h.meta b/Assets/HCMiniSdk/Third/ta/Plugins/iOS/TAThirdParty/TATopOnSyncData.h.meta new file mode 100644 index 00000000..c512ac3f --- /dev/null +++ b/Assets/HCMiniSdk/Third/ta/Plugins/iOS/TAThirdParty/TATopOnSyncData.h.meta @@ -0,0 +1,33 @@ +fileFormatVersion: 2 +guid: 9cb377c463bc14281934790c36a376c0 +PluginImporter: + externalObjects: {} + serializedVersion: 2 + iconMap: {} + executionOrder: {} + defineConstraints: [] + isPreloaded: 0 + isOverridable: 0 + isExplicitlyReferenced: 0 + validateReferences: 1 + platformData: + - first: + Any: + second: + enabled: 0 + settings: {} + - first: + Editor: Editor + second: + enabled: 0 + settings: + DefaultValueInitialized: true + - first: + iPhone: iOS + second: + enabled: 1 + settings: + AddToEmbeddedBinaries: false + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/HCMiniSdk/Third/ta/Plugins/iOS/TAThirdParty/TATopOnSyncData.m b/Assets/HCMiniSdk/Third/ta/Plugins/iOS/TAThirdParty/TATopOnSyncData.m new file mode 100755 index 00000000..b383cd61 --- /dev/null +++ b/Assets/HCMiniSdk/Third/ta/Plugins/iOS/TAThirdParty/TATopOnSyncData.m @@ -0,0 +1,39 @@ +// +// TATopOnSyncData.m +// ThinkingSDK +// +// Created by wwango on 2022/3/25. +// + +#import "TATopOnSyncData.h" + +@implementation TATopOnSyncData + +#pragma clang diagnostic push +#pragma clang diagnostic ignored "-Warc-performSelector-leaks" + +- (void)syncThirdData:(id)taInstance property:(NSDictionary *)property { + + if (!self.customPropety || [self.customPropety isKindOfClass:[NSDictionary class]]) { + self.customPropety = @{}; + } + + NSMutableDictionary * datas = [NSMutableDictionary dictionaryWithDictionary:property]; + NSString *accountID = [taInstance getAccountId]; + NSString *distinctId = [taInstance getDistinctId]; + [datas setObject:(accountID ? accountID : @"") forKey:TA_ACCOUNT_ID]; + [datas setObject:distinctId ? distinctId : @"" forKey:TA_DISTINCT_ID]; + + Class cls = NSClassFromString(@"ATAPI"); + SEL sel1 = NSSelectorFromString(@"sharedInstance"); + SEL sel2 = NSSelectorFromString(@"setCustomData:"); + if (cls && [cls respondsToSelector:sel1]) { + id instance = [cls performSelector:sel1]; + if ([instance respondsToSelector:sel2]) { + [instance performSelector:sel2 withObject:datas]; + } + } +} +#pragma clang diagnostic pop + +@end diff --git a/Assets/HCMiniSdk/Third/ta/Plugins/iOS/TAThirdParty/TATopOnSyncData.m.meta b/Assets/HCMiniSdk/Third/ta/Plugins/iOS/TAThirdParty/TATopOnSyncData.m.meta new file mode 100644 index 00000000..8020cddd --- /dev/null +++ b/Assets/HCMiniSdk/Third/ta/Plugins/iOS/TAThirdParty/TATopOnSyncData.m.meta @@ -0,0 +1,33 @@ +fileFormatVersion: 2 +guid: dbca3c50b30be4ef88f32c10856288c8 +PluginImporter: + externalObjects: {} + serializedVersion: 2 + iconMap: {} + executionOrder: {} + defineConstraints: [] + isPreloaded: 0 + isOverridable: 0 + isExplicitlyReferenced: 0 + validateReferences: 1 + platformData: + - first: + Any: + second: + enabled: 0 + settings: {} + - first: + Editor: Editor + second: + enabled: 0 + settings: + DefaultValueInitialized: true + - first: + iPhone: iOS + second: + enabled: 1 + settings: + AddToEmbeddedBinaries: false + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/HCMiniSdk/Third/ta/Plugins/iOS/TAThirdParty/TATradPlusSyncData.h b/Assets/HCMiniSdk/Third/ta/Plugins/iOS/TAThirdParty/TATradPlusSyncData.h new file mode 100755 index 00000000..5d94ce60 --- /dev/null +++ b/Assets/HCMiniSdk/Third/ta/Plugins/iOS/TAThirdParty/TATradPlusSyncData.h @@ -0,0 +1,16 @@ +// +// TATradPlusSyncData.h +// ThinkingSDK +// +// Created by wwango on 2022/3/25. +// + +#import "TABaseSyncData.h" + +NS_ASSUME_NONNULL_BEGIN + +@interface TATradPlusSyncData : TABaseSyncData + +@end + +NS_ASSUME_NONNULL_END diff --git a/Assets/HCMiniSdk/Third/ta/Plugins/iOS/TAThirdParty/TATradPlusSyncData.h.meta b/Assets/HCMiniSdk/Third/ta/Plugins/iOS/TAThirdParty/TATradPlusSyncData.h.meta new file mode 100644 index 00000000..31523406 --- /dev/null +++ b/Assets/HCMiniSdk/Third/ta/Plugins/iOS/TAThirdParty/TATradPlusSyncData.h.meta @@ -0,0 +1,33 @@ +fileFormatVersion: 2 +guid: f0682c1aaffe14280b29c0bd11d0954e +PluginImporter: + externalObjects: {} + serializedVersion: 2 + iconMap: {} + executionOrder: {} + defineConstraints: [] + isPreloaded: 0 + isOverridable: 0 + isExplicitlyReferenced: 0 + validateReferences: 1 + platformData: + - first: + Any: + second: + enabled: 0 + settings: {} + - first: + Editor: Editor + second: + enabled: 0 + settings: + DefaultValueInitialized: true + - first: + iPhone: iOS + second: + enabled: 1 + settings: + AddToEmbeddedBinaries: false + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/HCMiniSdk/Third/ta/Plugins/iOS/TAThirdParty/TATradPlusSyncData.m b/Assets/HCMiniSdk/Third/ta/Plugins/iOS/TAThirdParty/TATradPlusSyncData.m new file mode 100755 index 00000000..1603792b --- /dev/null +++ b/Assets/HCMiniSdk/Third/ta/Plugins/iOS/TAThirdParty/TATradPlusSyncData.m @@ -0,0 +1,39 @@ +// +// TATradPlusSyncData.m +// ThinkingSDK +// +// Created by wwango on 2022/3/25. +// + +#import "TATradPlusSyncData.h" + +@implementation TATradPlusSyncData + +#pragma clang diagnostic push +#pragma clang diagnostic ignored "-Warc-performSelector-leaks" + +- (void)syncThirdData:(id)taInstance property:(NSDictionary *)property { + + if (!self.customPropety || [self.customPropety isKindOfClass:[NSDictionary class]]) { + self.customPropety = @{}; + } + + NSMutableDictionary * datas = [NSMutableDictionary dictionaryWithDictionary:property]; +// NSString *accountID = [taInstance getAccountId]; + NSString *distinctId = [taInstance getDistinctId]; +// [datas setObject:(accountID ? accountID : @"") forKey:TA_ACCOUNT_ID]; + [datas setObject:distinctId ? distinctId : @"" forKey:TA_DISTINCT_ID]; + + Class cls = NSClassFromString(@"TradPlus"); + SEL sel1 = NSSelectorFromString(@"sharedInstance"); + SEL sel2 = NSSelectorFromString(@"setDicCustomValue:"); + if (cls && [cls respondsToSelector:sel1]) { + id instance = [cls performSelector:sel1]; + if ([instance respondsToSelector:sel2]) { + [instance performSelector:sel2 withObject:datas]; + } + } +} +#pragma clang diagnostic pop + +@end diff --git a/Assets/HCMiniSdk/Third/ta/Plugins/iOS/TAThirdParty/TATradPlusSyncData.m.meta b/Assets/HCMiniSdk/Third/ta/Plugins/iOS/TAThirdParty/TATradPlusSyncData.m.meta new file mode 100644 index 00000000..d64d6f4f --- /dev/null +++ b/Assets/HCMiniSdk/Third/ta/Plugins/iOS/TAThirdParty/TATradPlusSyncData.m.meta @@ -0,0 +1,33 @@ +fileFormatVersion: 2 +guid: e00d06dbb27e94407b943499f2d08daf +PluginImporter: + externalObjects: {} + serializedVersion: 2 + iconMap: {} + executionOrder: {} + defineConstraints: [] + isPreloaded: 0 + isOverridable: 0 + isExplicitlyReferenced: 0 + validateReferences: 1 + platformData: + - first: + Any: + second: + enabled: 0 + settings: {} + - first: + Editor: Editor + second: + enabled: 0 + settings: + DefaultValueInitialized: true + - first: + iPhone: iOS + second: + enabled: 1 + settings: + AddToEmbeddedBinaries: false + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/HCMiniSdk/Third/ta/Plugins/iOS/ThinkingAnalytics.m b/Assets/HCMiniSdk/Third/ta/Plugins/iOS/ThinkingAnalytics.m new file mode 100644 index 00000000..75688bc0 --- /dev/null +++ b/Assets/HCMiniSdk/Third/ta/Plugins/iOS/ThinkingAnalytics.m @@ -0,0 +1,517 @@ +#if __has_include() +#import +#import +#else +#import "ThinkingAnalyticsSDK.h" +#import "TDDeviceInfo.h" +#endif +#import + +#define NETWORK_TYPE_DEFAULT 1 +#define NETWORK_TYPE_WIFI 2 +#define NETWORK_TYPE_ALL 3 + +typedef const char * (*ResultHandler) (const char *type, const char *jsonData); +static ResultHandler resultHandler; +void RegisterRecieveGameCallback(ResultHandler handlerPointer) +{ + resultHandler = handlerPointer; +} + +static NSMutableDictionary *light_instances; +static pthread_rwlock_t rwlock = PTHREAD_RWLOCK_INITIALIZER; + +ThinkingAnalyticsSDK* ta_getInstance(NSString *app_id) { + ThinkingAnalyticsSDK *result = nil; + + if (app_id == nil || [app_id isEqualToString:@""]) { + return [ThinkingAnalyticsSDK sharedInstance]; + } + + pthread_rwlock_rdlock(&rwlock); + if (light_instances[app_id] != nil) { + result = light_instances[app_id]; + } + pthread_rwlock_unlock(&rwlock); + + if (result != nil) return result; + + return [ThinkingAnalyticsSDK sharedInstanceWithAppid: app_id]; +} + +void ta_convertToDictionary(const char *json, NSDictionary **properties_dict) { + NSString *json_string = json != NULL ? [NSString stringWithUTF8String:json] : nil; + if (json_string) { + *properties_dict = [NSJSONSerialization JSONObjectWithData:[json_string dataUsingEncoding:NSUTF8StringEncoding] options:kNilOptions error:nil]; + } +} + +NSDictionary * ta_parse_date(NSDictionary *properties_dict) { + NSMutableDictionary *properties = [NSMutableDictionary dictionary]; + for (NSString *key in properties_dict.allKeys) { + id value = properties_dict[key]; + if ([value isKindOfClass:[NSDate class]]) { + NSDateFormatter *formatter = [[NSDateFormatter alloc] init]; + formatter.dateFormat = @"yyyy-MM-dd HH:mm:ss.SSS"; + NSString *dateStr = [formatter stringFromDate:(NSDate *)value]; + properties[key] = dateStr; + } else if ([value isKindOfClass:[NSDictionary class]]) { + properties[key] = ta_parse_date((NSDictionary *)value); + } else { + properties[key] = value; + } + } + return properties; +} + +char* ta_strdup(const char* string) { + if (string == NULL) + return NULL; + char* res = (char*)malloc(strlen(string) + 1); + strcpy(res, string); + return res; +} + + +void ta_start(const char *app_id, const char *url, int mode, const char *timezone_id, bool enable_encrypt, int encrypt_version, const char *encrypt_public_key, int pinning_mode, bool allow_invalid_certificates, bool validates_domain_name, const char *instance_name) { + NSString *app_id_string = app_id != NULL ? [NSString stringWithUTF8String:app_id] : nil; + NSString *url_string = url != NULL ? [NSString stringWithUTF8String:url] : nil; + NSString *instance_name_string = instance_name != NULL ? [NSString stringWithUTF8String:instance_name] : nil; + TDConfig *config = [[TDConfig alloc] init]; + config.appid = app_id_string; + config.configureURL = url_string; + if (instance_name) { + [config setName:instance_name_string]; + } + if (mode == 1) { + // DEBUG + config.debugMode = ThinkingAnalyticsDebug; + } else if (mode == 2) { + // DEBUG_ONLY + config.debugMode = ThinkingAnalyticsDebugOnly; + } + NSString *timezone_id_string = timezone_id != NULL ? [NSString stringWithUTF8String:timezone_id] : nil; + NSTimeZone *timezone = [NSTimeZone timeZoneWithName:timezone_id_string]; + if (timezone) { + config.defaultTimeZone = timezone; + } + if (enable_encrypt == YES) { + NSString *encrypt_public_key_string = encrypt_public_key != NULL ? [NSString stringWithUTF8String:encrypt_public_key] : nil; + // Enable data encryption + config.enableEncrypt = YES; + // Set public key and version + config.secretKey = [[TDSecretKey alloc] initWithVersion:encrypt_version publicKey:encrypt_public_key_string]; + } + + [ThinkingAnalyticsSDK startWithConfig:config]; +} + +void ta_enable_log(BOOL enable_log) { + if (enable_log) { + [ThinkingAnalyticsSDK setLogLevel:TDLoggingLevelDebug]; + } else { + [ThinkingAnalyticsSDK setLogLevel:TDLoggingLevelNone]; + } +} + +void ta_set_network_type(int type) { + switch (type) { + case NETWORK_TYPE_DEFAULT: + [ta_getInstance(nil) setNetworkType:TDNetworkTypeDefault]; + break; + case NETWORK_TYPE_WIFI: + [ta_getInstance(nil) setNetworkType:TDNetworkTypeOnlyWIFI]; + break; + case NETWORK_TYPE_ALL: + [ta_getInstance(nil) setNetworkType:TDNetworkTypeALL]; + break; + } +} + +void ta_identify(const char *app_id, const char *unique_id) { + NSString *app_id_string = app_id != NULL ? [NSString stringWithUTF8String:app_id] : nil; + NSString *id_string = unique_id != NULL ? [NSString stringWithUTF8String:unique_id] : nil; + [ta_getInstance(app_id_string) identify:id_string]; +} + +const char *ta_get_distinct_id(const char *app_id) { + NSString *app_id_string = app_id != NULL ? [NSString stringWithUTF8String:app_id] : nil; + NSString *distinct_id =[ta_getInstance(app_id_string) getDistinctId]; + return ta_strdup([distinct_id UTF8String]); +} + +void ta_login(const char *app_id, const char *account_id) { + NSString *app_id_string = app_id != NULL ? [NSString stringWithUTF8String:app_id] : nil; + NSString *id_string = account_id != NULL ? [NSString stringWithUTF8String:account_id] : nil; + [ta_getInstance(app_id_string) login:id_string]; +} + +void ta_logout(const char *app_id) { + NSString *app_id_string = app_id != NULL ? [NSString stringWithUTF8String:app_id] : nil; + [ta_getInstance(app_id_string) logout]; +} + +void ta_config_custom_lib_info(const char *lib_name, const char *lib_version) { + NSString *lib_name_string = lib_name != NULL ? [NSString stringWithUTF8String:lib_name] : nil; + NSString *lib_version_string = lib_version != NULL ? [NSString stringWithUTF8String:lib_version] : nil; + [ThinkingAnalyticsSDK setCustomerLibInfoWithLibName:lib_name_string libVersion:lib_version_string]; +} + +void ta_track_event(const char *app_id, const char *event_model_json) { + NSDictionary *event_model_dic = nil; + ta_convertToDictionary(event_model_json, &event_model_dic); + TDEventModel *eventModel; + NSString *eventType = event_model_dic[@"event_type"]; + if ([eventType isEqualToString:@"track_first"]) { + eventModel = [[TDFirstEventModel alloc] initWithEventName:event_model_dic[@"event_name"] firstCheckID:event_model_dic[@"extra_id"]]; + } else if ([eventType isEqualToString:@"track_update"]) { + eventModel = [[TDUpdateEventModel alloc] initWithEventName:event_model_dic[@"event_name"] eventID:event_model_dic[@"extra_id"]]; + } else if ([eventType isEqualToString:@"track_overwrite"]) { + eventModel = [[TDOverwriteEventModel alloc] initWithEventName:event_model_dic[@"event_name"] eventID:event_model_dic[@"extra_id"]]; + } + + eventModel.properties = event_model_dic[@"event_properties"]; + + long event_time = [event_model_dic[@"event_time"] longValue]; + NSString *timezoneString = event_model_dic[@"event_timezone"]; + NSTimeZone *tz; + if ([@"Local" isEqualToString:timezoneString]) { + tz = [NSTimeZone localTimeZone]; + } else { + tz = [NSTimeZone timeZoneWithName:timezoneString]; + } + + if (event_time) { + NSDate *date = [NSDate dateWithTimeIntervalSince1970:event_time/1000.0]; + [eventModel configTime:date timeZone:tz]; + } + + NSString *app_id_string = app_id != NULL ? [NSString stringWithUTF8String:app_id] : nil; + [ta_getInstance(app_id_string) trackWithEventModel:eventModel]; +} + +void ta_track(const char *app_id, const char *event_name, const char *properties, long long time_stamp_millis, const char *timezone) { + NSString *event_name_string = event_name != NULL ? [NSString stringWithUTF8String:event_name] : nil; + NSString *app_id_string = app_id != NULL ? [NSString stringWithUTF8String:app_id] : nil; + + NSDictionary *properties_dict = nil; + ta_convertToDictionary(properties, &properties_dict); + + NSString *time_zone_string = timezone != NULL ? [NSString stringWithUTF8String:timezone] : nil; + NSTimeZone *tz; + if ([@"Local" isEqualToString:time_zone_string]) { + tz = [NSTimeZone localTimeZone]; + } else { + tz = [NSTimeZone timeZoneWithName:time_zone_string]; + } + + NSDate *time = [NSDate dateWithTimeIntervalSince1970:time_stamp_millis / 1000.0]; + + if (tz) { + [ta_getInstance(app_id_string) track:event_name_string properties:properties_dict time:time timeZone:tz]; + } else { + if (time_stamp_millis > 0) { +#pragma clang diagnostic push +#pragma clang diagnostic ignored "-Wdeprecated-declarations" + [ta_getInstance(app_id_string) track:event_name_string properties:properties_dict time:time]; +#pragma clang diagnostic pop + } else { + [ta_getInstance(app_id_string) track:event_name_string properties:properties_dict]; + } + } +} + +void ta_flush(const char *app_id) { + NSString *app_id_string = app_id != NULL ? [NSString stringWithUTF8String:app_id] : nil; + [ta_getInstance(app_id_string) flush]; +} + +void ta_set_super_properties(const char *app_id, const char *properties) { + NSString *app_id_string = app_id != NULL ? [NSString stringWithUTF8String:app_id] : nil; + NSDictionary *properties_dict = nil; + ta_convertToDictionary(properties, &properties_dict); + if (properties_dict) { + [ta_getInstance(app_id_string) setSuperProperties:properties_dict]; + } +} + +void ta_unset_super_property(const char *app_id, const char *property_name) { + NSString *app_id_string = app_id != NULL ? [NSString stringWithUTF8String:app_id] : nil; + NSString *property_name_string = property_name != NULL ? [NSString stringWithUTF8String:property_name] : nil; + [ta_getInstance(app_id_string) unsetSuperProperty:property_name_string]; +} + +void ta_clear_super_properties(const char *app_id) { + NSString *app_id_string = app_id != NULL ? [NSString stringWithUTF8String:app_id] : nil; + [ta_getInstance(app_id_string) clearSuperProperties]; +} + +const char *ta_get_super_properties(const char *app_id) { + NSString *app_id_string = app_id != NULL ? [NSString stringWithUTF8String:app_id] : nil; + NSDictionary *property_dict = [ta_getInstance(app_id_string) currentSuperProperties]; + // nsdictionary --> nsdata + NSData *data = [NSJSONSerialization dataWithJSONObject:property_dict options:kNilOptions error:nil]; + // nsdata -> nsstring + NSString *jsonString = [[NSString alloc]initWithData:data encoding:NSUTF8StringEncoding]; + return ta_strdup([jsonString UTF8String]); +} + +const char *ta_get_preset_properties(const char *app_id) { + NSString *app_id_string = app_id != NULL ? [NSString stringWithUTF8String:app_id] : nil; + NSDictionary *property_dict = [[ta_getInstance(app_id_string) getPresetProperties] toEventPresetProperties]; + // nsdate => nsstring + property_dict = ta_parse_date(property_dict); + // nsdictionary --> nsdata + NSData *data = [NSJSONSerialization dataWithJSONObject:property_dict options:kNilOptions error:nil]; + // nsdata -> nsstring + NSString *jsonString = [[NSString alloc]initWithData:data encoding:NSUTF8StringEncoding]; + return ta_strdup([jsonString UTF8String]); +} + +void ta_time_event(const char *app_id, const char *event_name) { + NSString *app_id_string = app_id != NULL ? [NSString stringWithUTF8String:app_id] : nil; + NSString *event_name_string = event_name != NULL ? [NSString stringWithUTF8String:event_name] : nil; + [ta_getInstance(app_id_string) timeEvent:event_name_string]; +} + +void ta_user_set(const char *app_id, const char *properties) { + NSString *app_id_string = app_id != NULL ? [NSString stringWithUTF8String:app_id] : nil; + NSDictionary *properties_dict = nil; + ta_convertToDictionary(properties, &properties_dict); + if (properties_dict) { + [ta_getInstance(app_id_string) user_set:properties_dict]; + } +} + +void ta_user_set_with_time(const char *app_id, const char *properties, long long time_stamp_millis) { + NSDate *time = [NSDate dateWithTimeIntervalSince1970:time_stamp_millis / 1000.0]; + NSString *app_id_string = app_id != NULL ? [NSString stringWithUTF8String:app_id] : nil; + NSDictionary *properties_dict = nil; + ta_convertToDictionary(properties, &properties_dict); + if (properties_dict) { + [ta_getInstance(app_id_string) user_set:properties_dict withTime:time]; + } +} + +void ta_user_unset(const char *app_id, const char *properties) { + NSString *app_id_string = app_id != NULL ? [NSString stringWithUTF8String:app_id] : nil; + NSString *properties_string = properties != NULL ? [NSString stringWithUTF8String:properties] : nil; + [ta_getInstance(app_id_string) user_unset:properties_string]; +} + +void ta_user_unset_with_time(const char *app_id, const char *properties, long long time_stamp_millis) { + NSDate *time = [NSDate dateWithTimeIntervalSince1970:time_stamp_millis / 1000.0]; + NSString *app_id_string = app_id != NULL ? [NSString stringWithUTF8String:app_id] : nil; + NSString *properties_string = properties != NULL ? [NSString stringWithUTF8String:properties] : nil; + [ta_getInstance(app_id_string) user_unset:properties_string withTime:time]; +} + +void ta_user_set_once(const char *app_id, const char *properties) { + NSString *app_id_string = app_id != NULL ? [NSString stringWithUTF8String:app_id] : nil; + NSDictionary *properties_dict = nil; + ta_convertToDictionary(properties, &properties_dict); + if (properties_dict) { + [ta_getInstance(app_id_string) user_setOnce:properties_dict]; + } +} + +void ta_user_set_once_with_time(const char *app_id, const char *properties, long long time_stamp_millis) { + NSDate *time = [NSDate dateWithTimeIntervalSince1970:time_stamp_millis / 1000.0]; + NSString *app_id_string = app_id != NULL ? [NSString stringWithUTF8String:app_id] : nil; + NSDictionary *properties_dict = nil; + ta_convertToDictionary(properties, &properties_dict); + if (properties_dict) { + [ta_getInstance(app_id_string) user_setOnce:properties_dict withTime:time]; + } +} + +void ta_user_add(const char *app_id, const char *properties) { + NSString *app_id_string = app_id != NULL ? [NSString stringWithUTF8String:app_id] : nil; + NSDictionary *properties_dict = nil; + ta_convertToDictionary(properties, &properties_dict); + if (properties_dict) { + [ta_getInstance(app_id_string) user_add:properties_dict]; + } +} + +void ta_user_add_with_time(const char *app_id, const char *properties, long long time_stamp_millis) { + NSDate *time = [NSDate dateWithTimeIntervalSince1970:time_stamp_millis / 1000.0]; + NSString *app_id_string = app_id != NULL ? [NSString stringWithUTF8String:app_id] : nil; + NSDictionary *properties_dict = nil; + ta_convertToDictionary(properties, &properties_dict); + if (properties_dict) { + [ta_getInstance(app_id_string) user_add:properties_dict withTime:time]; + } +} + +void ta_user_delete(const char *app_id) { + NSString *app_id_string = app_id != NULL ? [NSString stringWithUTF8String:app_id] : nil; + [ta_getInstance(app_id_string) user_delete]; +} + +void ta_user_delete_with_time(const char *app_id, long long time_stamp_millis) { + NSDate *time = [NSDate dateWithTimeIntervalSince1970:time_stamp_millis / 1000.0]; + NSString *app_id_string = app_id != NULL ? [NSString stringWithUTF8String:app_id] : nil; + [ta_getInstance(app_id_string) user_delete:time]; +} + +void ta_user_append(const char *app_id, const char *properties) { + NSString *app_id_string = app_id != NULL ? [NSString stringWithUTF8String:app_id] : nil; + NSDictionary *properties_dict = nil; + ta_convertToDictionary(properties, &properties_dict); + if (properties_dict) { + [ta_getInstance(app_id_string) user_append:properties_dict]; + } +} + +void ta_user_append_with_time(const char *app_id, const char *properties, long long time_stamp_millis) { + NSDate *time = [NSDate dateWithTimeIntervalSince1970:time_stamp_millis / 1000.0]; + NSString *app_id_string = app_id != NULL ? [NSString stringWithUTF8String:app_id] : nil; + NSDictionary *properties_dict = nil; + ta_convertToDictionary(properties, &properties_dict); + if (properties_dict) { + [ta_getInstance(app_id_string) user_append:properties_dict withTime:time]; + } +} + +void ta_user_uniq_append(const char *app_id, const char *properties) { + NSString *app_id_string = app_id != NULL ? [NSString stringWithUTF8String:app_id] : nil; + NSDictionary *properties_dict = nil; + ta_convertToDictionary(properties, &properties_dict); + if (properties_dict) { + [ta_getInstance(app_id_string) user_uniqAppend:properties_dict]; + } +} + +void ta_user_uniq_append_with_time(const char *app_id, const char *properties, long long time_stamp_millis) { + NSDate *time = [NSDate dateWithTimeIntervalSince1970:time_stamp_millis / 1000.0]; + NSString *app_id_string = app_id != NULL ? [NSString stringWithUTF8String:app_id] : nil; + NSDictionary *properties_dict = nil; + ta_convertToDictionary(properties, &properties_dict); + if (properties_dict) { + [ta_getInstance(app_id_string) user_uniqAppend:properties_dict withTime:time]; + } +} + +const char *ta_get_device_id() { + NSString *distinct_id = [ta_getInstance(nil) getDeviceId]; + return ta_strdup([distinct_id UTF8String]); +} + +void ta_set_dynamic_super_properties(const char *app_id) { + NSString *app_id_string = app_id != NULL ? [NSString stringWithUTF8String:app_id] : nil; + [ta_getInstance(app_id_string) setAutoTrackDynamicProperties:^NSDictionary * _Nonnull{ + const char *ret = resultHandler("DynamicSuperProperties", nil); + NSDictionary *dynamicSuperProperties = nil; + ta_convertToDictionary(ret, &dynamicSuperProperties); + return dynamicSuperProperties; + }]; +} + +void ta_set_track_status(const char *app_id, int status) { + NSString *app_id_string = app_id != NULL ? [NSString stringWithUTF8String:app_id] : nil; + ThinkingAnalyticsSDK* instance = ta_getInstance(app_id_string); + switch (status) { + case 1: + [instance setTrackStatus:TATrackStatusPause]; + break; + case 2: + [instance setTrackStatus:TATrackStatusStop]; + break; + case 3: + [instance setTrackStatus:TATrackStatusSaveOnly]; + break; + case 4: + default: + [instance setTrackStatus:TATrackStatusNormal]; + } +} + +void ta_enable_tracking(const char *app_id, BOOL enabled) { + NSString *app_id_string = app_id != NULL ? [NSString stringWithUTF8String:app_id] : nil; + [ta_getInstance(app_id_string) enableTracking:enabled]; +} + +void ta_opt_out_tracking(const char *app_id) { + NSString *app_id_string = app_id != NULL ? [NSString stringWithUTF8String:app_id] : nil; + [ta_getInstance(app_id_string) optOutTracking]; +} + +void ta_opt_out_tracking_and_delete_user(const char *app_id) { + NSString *app_id_string = app_id != NULL ? [NSString stringWithUTF8String:app_id] : nil; + [ta_getInstance(app_id_string) optOutTrackingAndDeleteUser]; +} + +void ta_opt_in_tracking(const char *app_id) { + NSString *app_id_string = app_id != NULL ? [NSString stringWithUTF8String:app_id] : nil; + [ta_getInstance(app_id_string) optInTracking]; +} + +void ta_create_light_instance(const char *delegate_app_id) { + NSString *delegate_app_id_string = delegate_app_id != NULL ? [NSString stringWithUTF8String:delegate_app_id] : nil; + ThinkingAnalyticsSDK *light = [ta_getInstance(nil) createLightInstance]; + + pthread_rwlock_wrlock(&rwlock); + if (light_instances == nil) { + light_instances = [NSMutableDictionary dictionary]; + } + + [light_instances setObject:light forKey:delegate_app_id_string]; + pthread_rwlock_unlock(&rwlock); +} + +void ta_enable_autoTrack(const char *app_id, int autoTrackEvents, const char *properties) { + NSString *app_id_string = app_id != NULL ? [NSString stringWithUTF8String:app_id] : nil; + NSDictionary *properties_dict = nil; + ta_convertToDictionary(properties, &properties_dict); + [ta_getInstance(app_id_string) enableAutoTrack: autoTrackEvents properties:properties_dict]; +} + +void ta_enable_autoTrack_with_callback(const char *app_id, int autoTrackEvents) { + NSString *app_id_string = app_id != NULL ? [NSString stringWithUTF8String:app_id] : nil; + __block NSString * w_app_id_string = app_id_string; + [ta_getInstance(app_id_string) enableAutoTrack: autoTrackEvents callback:^NSDictionary * _Nonnull(ThinkingAnalyticsAutoTrackEventType eventType, NSDictionary * _Nonnull properties) { + NSMutableDictionary *callbackProperties = [NSMutableDictionary dictionaryWithDictionary:properties]; + [callbackProperties setObject:@(eventType) forKey:@"EventType"]; + [callbackProperties setObject:w_app_id_string forKey:@"AppID"]; + NSData *jsonData = [NSJSONSerialization dataWithJSONObject:ta_parse_date(callbackProperties) options:NSJSONWritingPrettyPrinted error:nil]; + NSString *jsonString = [[NSString alloc] initWithData:jsonData encoding:NSUTF8StringEncoding]; + const char *ret = resultHandler("AutoTrackProperties", [jsonString UTF8String]); + NSDictionary *autoTrackProperties = nil; + ta_convertToDictionary(ret, &autoTrackProperties); + return autoTrackProperties; + }]; +} + +void ta_set_autoTrack_properties(const char *app_id, int autoTrackEvents, const char *properties) { + NSString *app_id_string = app_id != NULL ? [NSString stringWithUTF8String:app_id] : nil; + NSDictionary *properties_dict = nil; + ta_convertToDictionary(properties, &properties_dict); + [ta_getInstance(app_id_string) setAutoTrackProperties: autoTrackEvents properties:properties_dict]; +} + +const char *ta_get_time_string(long long time_stamp_millis) { + NSDate *time = [NSDate dateWithTimeIntervalSince1970:time_stamp_millis / 1000.0]; + NSString *time_string = [ta_getInstance(nil) getTimeString:time]; + return ta_strdup([time_string UTF8String]); +} + +void ta_calibrate_time(long long time_stamp_millis) { + [ThinkingAnalyticsSDK calibrateTime:time_stamp_millis]; +} + +void ta_calibrate_time_with_ntp(const char *ntp_server) { + NSString *ntp_server_string = ntp_server != NULL ? [NSString stringWithUTF8String:ntp_server] : nil; + [ThinkingAnalyticsSDK calibrateTimeWithNtp:ntp_server_string]; +} + +void ta_enable_third_party_sharing(const char *app_id, int share_type, const char *properties) { + NSString *app_id_string = app_id != NULL ? [NSString stringWithUTF8String:app_id] : nil; + NSDictionary *properties_dict = nil; + ta_convertToDictionary(properties, &properties_dict); + if (properties_dict) { + [ta_getInstance(app_id_string) enableThirdPartySharing:share_type customMap:properties_dict]; + } else { + [ta_getInstance(app_id_string) enableThirdPartySharing:share_type]; + } +} diff --git a/Assets/HCMiniSdk/Third/ta/Plugins/iOS/ThinkingAnalytics.m.meta b/Assets/HCMiniSdk/Third/ta/Plugins/iOS/ThinkingAnalytics.m.meta new file mode 100644 index 00000000..3fff6fdb --- /dev/null +++ b/Assets/HCMiniSdk/Third/ta/Plugins/iOS/ThinkingAnalytics.m.meta @@ -0,0 +1,33 @@ +fileFormatVersion: 2 +guid: 4a3a74316bafb412290585db3ac5a04e +PluginImporter: + externalObjects: {} + serializedVersion: 2 + iconMap: {} + executionOrder: {} + defineConstraints: [] + isPreloaded: 0 + isOverridable: 0 + isExplicitlyReferenced: 0 + validateReferences: 1 + platformData: + - first: + Any: + second: + enabled: 0 + settings: {} + - first: + Editor: Editor + second: + enabled: 0 + settings: + DefaultValueInitialized: true + - first: + iPhone: iOS + second: + enabled: 1 + settings: + AddToEmbeddedBinaries: false + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/HCMiniSdk/Third/ta/Plugins/iOS/ThinkingSDK.meta b/Assets/HCMiniSdk/Third/ta/Plugins/iOS/ThinkingSDK.meta new file mode 100644 index 00000000..20bd8ffe --- /dev/null +++ b/Assets/HCMiniSdk/Third/ta/Plugins/iOS/ThinkingSDK.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: 4dd9e7986fe964179ac6733ba24e44fe +folderAsset: yes +DefaultImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/HCMiniSdk/Third/ta/Plugins/iOS/ThinkingSDK/Info.plist b/Assets/HCMiniSdk/Third/ta/Plugins/iOS/ThinkingSDK/Info.plist new file mode 100755 index 00000000..e500a04a --- /dev/null +++ b/Assets/HCMiniSdk/Third/ta/Plugins/iOS/ThinkingSDK/Info.plist @@ -0,0 +1,24 @@ + + + + + CFBundleDevelopmentRegion + $(DEVELOPMENT_LANGUAGE) + CFBundleDisplayName + Thinking + CFBundleExecutable + $(EXECUTABLE_NAME) + CFBundleIdentifier + $(PRODUCT_BUNDLE_IDENTIFIER) + CFBundleInfoDictionaryVersion + 6.0 + CFBundleName + $(PRODUCT_NAME) + CFBundlePackageType + FMWK + CFBundleShortVersionString + 1.0 + CFBundleVersion + $(CURRENT_PROJECT_VERSION) + + diff --git a/Assets/HCMiniSdk/Third/ta/Plugins/iOS/ThinkingSDK/Info.plist.meta b/Assets/HCMiniSdk/Third/ta/Plugins/iOS/ThinkingSDK/Info.plist.meta new file mode 100644 index 00000000..69ea11bd --- /dev/null +++ b/Assets/HCMiniSdk/Third/ta/Plugins/iOS/ThinkingSDK/Info.plist.meta @@ -0,0 +1,7 @@ +fileFormatVersion: 2 +guid: 3f0912fc584a54fccb105f957cec170d +DefaultImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/HCMiniSdk/Third/ta/Plugins/iOS/ThinkingSDK/Source.meta b/Assets/HCMiniSdk/Third/ta/Plugins/iOS/ThinkingSDK/Source.meta new file mode 100644 index 00000000..60de2878 --- /dev/null +++ b/Assets/HCMiniSdk/Third/ta/Plugins/iOS/ThinkingSDK/Source.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: b010dd865139b4ea8b8fe65c815bf3da +folderAsset: yes +DefaultImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/HCMiniSdk/Third/ta/Plugins/iOS/ThinkingSDK/Source/AppLaunch.meta b/Assets/HCMiniSdk/Third/ta/Plugins/iOS/ThinkingSDK/Source/AppLaunch.meta new file mode 100644 index 00000000..d76daa73 --- /dev/null +++ b/Assets/HCMiniSdk/Third/ta/Plugins/iOS/ThinkingSDK/Source/AppLaunch.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: e3aa65556739d487581dcbc33f001e23 +folderAsset: yes +DefaultImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/HCMiniSdk/Third/ta/Plugins/iOS/ThinkingSDK/Source/AppLaunch/AppPush.meta b/Assets/HCMiniSdk/Third/ta/Plugins/iOS/ThinkingSDK/Source/AppLaunch/AppPush.meta new file mode 100644 index 00000000..38a99430 --- /dev/null +++ b/Assets/HCMiniSdk/Third/ta/Plugins/iOS/ThinkingSDK/Source/AppLaunch/AppPush.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: 0f4211ddaee63483da2cf08a3b9dbed6 +folderAsset: yes +DefaultImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/HCMiniSdk/Third/ta/Plugins/iOS/ThinkingSDK/Source/AppLaunch/AppPush/TDAPPPushParams.h b/Assets/HCMiniSdk/Third/ta/Plugins/iOS/ThinkingSDK/Source/AppLaunch/AppPush/TDAPPPushParams.h new file mode 100644 index 00000000..a46db5f8 --- /dev/null +++ b/Assets/HCMiniSdk/Third/ta/Plugins/iOS/ThinkingSDK/Source/AppLaunch/AppPush/TDAPPPushParams.h @@ -0,0 +1,18 @@ +// +// TDAPPPushParams.h +// ThinkingSDK +// +// Created by Charles on 6.5.23. +// + +#import + +NS_ASSUME_NONNULL_BEGIN + +extern id __td_get_userNotificationCenter(void); +extern id __td_get_userNotificationCenter_delegate(void); +extern NSDictionary * __td_get_userNotificationCenterResponse(id response); +extern NSString * __td_get_userNotificationCenterRequestContentTitle(id response); +extern NSString * __td_get_userNotificationCenterRequestContentBody(id response); + +NS_ASSUME_NONNULL_END diff --git a/Assets/HCMiniSdk/Third/ta/Plugins/iOS/ThinkingSDK/Source/AppLaunch/AppPush/TDAPPPushParams.h.meta b/Assets/HCMiniSdk/Third/ta/Plugins/iOS/ThinkingSDK/Source/AppLaunch/AppPush/TDAPPPushParams.h.meta new file mode 100644 index 00000000..e574b641 --- /dev/null +++ b/Assets/HCMiniSdk/Third/ta/Plugins/iOS/ThinkingSDK/Source/AppLaunch/AppPush/TDAPPPushParams.h.meta @@ -0,0 +1,33 @@ +fileFormatVersion: 2 +guid: d606670f7a7c24e1d86b03c1fc6251ac +PluginImporter: + externalObjects: {} + serializedVersion: 2 + iconMap: {} + executionOrder: {} + defineConstraints: [] + isPreloaded: 0 + isOverridable: 0 + isExplicitlyReferenced: 0 + validateReferences: 1 + platformData: + - first: + Any: + second: + enabled: 0 + settings: {} + - first: + Editor: Editor + second: + enabled: 0 + settings: + DefaultValueInitialized: true + - first: + iPhone: iOS + second: + enabled: 1 + settings: + AddToEmbeddedBinaries: false + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/HCMiniSdk/Third/ta/Plugins/iOS/ThinkingSDK/Source/AppLaunch/AppPush/TDAPPPushParams.m b/Assets/HCMiniSdk/Third/ta/Plugins/iOS/ThinkingSDK/Source/AppLaunch/AppPush/TDAPPPushParams.m new file mode 100644 index 00000000..98548ba3 --- /dev/null +++ b/Assets/HCMiniSdk/Third/ta/Plugins/iOS/ThinkingSDK/Source/AppLaunch/AppPush/TDAPPPushParams.m @@ -0,0 +1,70 @@ +// +// TDAPPPushParams.m +// ThinkingSDK +// +// Created by Charles on 6.5.23. +// + +#import "TDAPPPushParams.h" + +id __td_get_userNotificationCenter(void) { + Class cls = NSClassFromString(@"UNUserNotificationCenter"); + SEL sel = NSSelectorFromString(@"currentNotificationCenter"); + if ([cls respondsToSelector:sel]) { + id (*getUserNotificationCenterIMP)(id, SEL) = (NSString * (*)(id, SEL))[cls methodForSelector:sel]; + return getUserNotificationCenterIMP(cls, sel); + } + return nil; +} + +id __td_get_userNotificationCenter_delegate(void) { + Class cls = NSClassFromString(@"UNUserNotificationCenter"); + SEL sel = NSSelectorFromString(@"currentNotificationCenter"); + SEL delegateSel = NSSelectorFromString(@"delegate"); + if ([cls respondsToSelector:sel]) { + id (*getUserNotificationCenterIMP)(id, SEL) = (id (*)(id, SEL))[cls methodForSelector:sel]; + id center = getUserNotificationCenterIMP(cls, sel); + if (center) { + id (*getUserNotificationCenterDelegateIMP)(id, SEL) = (id (*)(id, SEL))[center methodForSelector:delegateSel]; + id delegate = getUserNotificationCenterDelegateIMP(center, delegateSel); + return delegate; + } + } + return nil; +} + +NSDictionary * __td_get_userNotificationCenterResponse(id response) { + + @try { + if ([response isKindOfClass:[NSClassFromString(@"UNNotificationResponse") class]]) { + return [response valueForKeyPath:@"notification.request.content.userInfo"]; + } + } @catch (NSException *exception) { + + } + return nil; +} + +NSString * __td_get_userNotificationCenterRequestContentTitle(id response) { + + @try { + if ([response isKindOfClass:[NSClassFromString(@"UNNotificationResponse") class]]) { + return [response valueForKeyPath:@"notification.request.content.title"]; + } + } @catch (NSException *exception) { + + } + return nil; +} + +NSString * __td_get_userNotificationCenterRequestContentBody(id response) { + + @try { + if ([response isKindOfClass:[NSClassFromString(@"UNNotificationResponse") class]]) { + return [response valueForKeyPath:@"notification.request.content.body"]; + } + } @catch (NSException *exception) { + + } + return nil; +} diff --git a/Assets/HCMiniSdk/Third/ta/Plugins/iOS/ThinkingSDK/Source/AppLaunch/AppPush/TDAPPPushParams.m.meta b/Assets/HCMiniSdk/Third/ta/Plugins/iOS/ThinkingSDK/Source/AppLaunch/AppPush/TDAPPPushParams.m.meta new file mode 100644 index 00000000..0281b8c9 --- /dev/null +++ b/Assets/HCMiniSdk/Third/ta/Plugins/iOS/ThinkingSDK/Source/AppLaunch/AppPush/TDAPPPushParams.m.meta @@ -0,0 +1,33 @@ +fileFormatVersion: 2 +guid: 08ddbde4b0bb44a2781691f28d329404 +PluginImporter: + externalObjects: {} + serializedVersion: 2 + iconMap: {} + executionOrder: {} + defineConstraints: [] + isPreloaded: 0 + isOverridable: 0 + isExplicitlyReferenced: 0 + validateReferences: 1 + platformData: + - first: + Any: + second: + enabled: 0 + settings: {} + - first: + Editor: Editor + second: + enabled: 0 + settings: + DefaultValueInitialized: true + - first: + iPhone: iOS + second: + enabled: 1 + settings: + AddToEmbeddedBinaries: false + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/HCMiniSdk/Third/ta/Plugins/iOS/ThinkingSDK/Source/AppLaunch/AppPush/TDAppDelegateProxyManager.h b/Assets/HCMiniSdk/Third/ta/Plugins/iOS/ThinkingSDK/Source/AppLaunch/AppPush/TDAppDelegateProxyManager.h new file mode 100644 index 00000000..3960b153 --- /dev/null +++ b/Assets/HCMiniSdk/Third/ta/Plugins/iOS/ThinkingSDK/Source/AppLaunch/AppPush/TDAppDelegateProxyManager.h @@ -0,0 +1,14 @@ + +#import + +NS_ASSUME_NONNULL_BEGIN + +@interface TDAppDelegateProxyManager : NSObject + ++ (instancetype)defaultManager; + +- (void)proxyNotifications; + +@end + +NS_ASSUME_NONNULL_END diff --git a/Assets/HCMiniSdk/Third/ta/Plugins/iOS/ThinkingSDK/Source/AppLaunch/AppPush/TDAppDelegateProxyManager.h.meta b/Assets/HCMiniSdk/Third/ta/Plugins/iOS/ThinkingSDK/Source/AppLaunch/AppPush/TDAppDelegateProxyManager.h.meta new file mode 100644 index 00000000..983e9d2e --- /dev/null +++ b/Assets/HCMiniSdk/Third/ta/Plugins/iOS/ThinkingSDK/Source/AppLaunch/AppPush/TDAppDelegateProxyManager.h.meta @@ -0,0 +1,33 @@ +fileFormatVersion: 2 +guid: 0ad802e76f93c418c9419315b8a3d275 +PluginImporter: + externalObjects: {} + serializedVersion: 2 + iconMap: {} + executionOrder: {} + defineConstraints: [] + isPreloaded: 0 + isOverridable: 0 + isExplicitlyReferenced: 0 + validateReferences: 1 + platformData: + - first: + Any: + second: + enabled: 0 + settings: {} + - first: + Editor: Editor + second: + enabled: 0 + settings: + DefaultValueInitialized: true + - first: + iPhone: iOS + second: + enabled: 1 + settings: + AddToEmbeddedBinaries: false + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/HCMiniSdk/Third/ta/Plugins/iOS/ThinkingSDK/Source/AppLaunch/AppPush/TDAppDelegateProxyManager.m b/Assets/HCMiniSdk/Third/ta/Plugins/iOS/ThinkingSDK/Source/AppLaunch/AppPush/TDAppDelegateProxyManager.m new file mode 100644 index 00000000..39897358 --- /dev/null +++ b/Assets/HCMiniSdk/Third/ta/Plugins/iOS/ThinkingSDK/Source/AppLaunch/AppPush/TDAppDelegateProxyManager.m @@ -0,0 +1,49 @@ + +#import "TDAppDelegateProxyManager.h" +#import "TDApplicationDelegateProxy.h" +#import "TDNewSwizzle.h" +#import "UIApplication+TDPushClick.h" +#import "TDMethodHelper.h" + +#if __IPHONE_OS_VERSION_MAX_ALLOWED >= __IPHONE_10_0 +#import "TDUNUserNotificationCenterDelegateProxy.h" +#endif + +@implementation TDAppDelegateProxyManager + ++ (instancetype)defaultManager { + static dispatch_once_t onceToken; + static TDAppDelegateProxyManager *manager = nil; + dispatch_once(&onceToken, ^{ + manager = [[TDAppDelegateProxyManager alloc] init]; + }); + return manager; +} + +- (void)proxyNotifications NS_EXTENSION_UNAVAILABLE_IOS(""){ + + static dispatch_once_t onceToken; + dispatch_once(&onceToken, ^{ + [TDMethodHelper swizzleRespondsToSelector]; + + [TDApplicationDelegateProxy resolveOptionalSelectorsForDelegate:[UIApplication sharedApplication].delegate]; + [TDApplicationDelegateProxy proxyDelegate:[UIApplication sharedApplication].delegate selectors:[NSSet setWithArray:@[@"application:didReceiveLocalNotification:", + @"application:didReceiveRemoteNotification:fetchCompletionHandler:", + @"application:handleOpenURL:", + @"application:openURL:options:", + @"application:continueUserActivity:restorationHandler:", + @"application:performActionForShortcutItem:completionHandler:"]]]; + if (@available(iOS 10.0, *)) { + if ([UNUserNotificationCenter currentNotificationCenter].delegate) { + [TDUNUserNotificationCenterDelegateProxy proxyDelegate:[UNUserNotificationCenter currentNotificationCenter].delegate selectors:[NSSet setWithArray:@[@"userNotificationCenter:didReceiveNotificationResponse:withCompletionHandler:"]]]; + } + NSError *error = NULL; + [UNUserNotificationCenter td_new_swizzleMethod:@selector(setDelegate:) withMethod:@selector(thinkingdata_setDelegate:) error:&error]; + if (error) { + NSLog(@"proxy notification delegate error: %@", error); + } + } + }); +} + +@end diff --git a/Assets/HCMiniSdk/Third/ta/Plugins/iOS/ThinkingSDK/Source/AppLaunch/AppPush/TDAppDelegateProxyManager.m.meta b/Assets/HCMiniSdk/Third/ta/Plugins/iOS/ThinkingSDK/Source/AppLaunch/AppPush/TDAppDelegateProxyManager.m.meta new file mode 100644 index 00000000..0366a4af --- /dev/null +++ b/Assets/HCMiniSdk/Third/ta/Plugins/iOS/ThinkingSDK/Source/AppLaunch/AppPush/TDAppDelegateProxyManager.m.meta @@ -0,0 +1,33 @@ +fileFormatVersion: 2 +guid: ed11ab70d6d6943019d6d3995eeaadc2 +PluginImporter: + externalObjects: {} + serializedVersion: 2 + iconMap: {} + executionOrder: {} + defineConstraints: [] + isPreloaded: 0 + isOverridable: 0 + isExplicitlyReferenced: 0 + validateReferences: 1 + platformData: + - first: + Any: + second: + enabled: 0 + settings: {} + - first: + Editor: Editor + second: + enabled: 0 + settings: + DefaultValueInitialized: true + - first: + iPhone: iOS + second: + enabled: 1 + settings: + AddToEmbeddedBinaries: false + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/HCMiniSdk/Third/ta/Plugins/iOS/ThinkingSDK/Source/AppLaunch/AppPush/TDApplicationDelegateProxy.h b/Assets/HCMiniSdk/Third/ta/Plugins/iOS/ThinkingSDK/Source/AppLaunch/AppPush/TDApplicationDelegateProxy.h new file mode 100644 index 00000000..1b1a54c8 --- /dev/null +++ b/Assets/HCMiniSdk/Third/ta/Plugins/iOS/ThinkingSDK/Source/AppLaunch/AppPush/TDApplicationDelegateProxy.h @@ -0,0 +1,10 @@ + +#import "TDDelegateProxy.h" + +NS_ASSUME_NONNULL_BEGIN + +@interface TDApplicationDelegateProxy : TDDelegateProxy + +@end + +NS_ASSUME_NONNULL_END diff --git a/Assets/HCMiniSdk/Third/ta/Plugins/iOS/ThinkingSDK/Source/AppLaunch/AppPush/TDApplicationDelegateProxy.h.meta b/Assets/HCMiniSdk/Third/ta/Plugins/iOS/ThinkingSDK/Source/AppLaunch/AppPush/TDApplicationDelegateProxy.h.meta new file mode 100644 index 00000000..b4fe0cb6 --- /dev/null +++ b/Assets/HCMiniSdk/Third/ta/Plugins/iOS/ThinkingSDK/Source/AppLaunch/AppPush/TDApplicationDelegateProxy.h.meta @@ -0,0 +1,33 @@ +fileFormatVersion: 2 +guid: 47013b120f73c4885845dbb7dd840189 +PluginImporter: + externalObjects: {} + serializedVersion: 2 + iconMap: {} + executionOrder: {} + defineConstraints: [] + isPreloaded: 0 + isOverridable: 0 + isExplicitlyReferenced: 0 + validateReferences: 1 + platformData: + - first: + Any: + second: + enabled: 0 + settings: {} + - first: + Editor: Editor + second: + enabled: 0 + settings: + DefaultValueInitialized: true + - first: + iPhone: iOS + second: + enabled: 1 + settings: + AddToEmbeddedBinaries: false + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/HCMiniSdk/Third/ta/Plugins/iOS/ThinkingSDK/Source/AppLaunch/AppPush/TDApplicationDelegateProxy.m b/Assets/HCMiniSdk/Third/ta/Plugins/iOS/ThinkingSDK/Source/AppLaunch/AppPush/TDApplicationDelegateProxy.m new file mode 100644 index 00000000..beb05b4a --- /dev/null +++ b/Assets/HCMiniSdk/Third/ta/Plugins/iOS/ThinkingSDK/Source/AppLaunch/AppPush/TDApplicationDelegateProxy.m @@ -0,0 +1,119 @@ + +#import "TDApplicationDelegateProxy.h" +#import "TDClassHelper.h" +#import "NSObject+TDDelegateProxy.h" +#import "UIApplication+TDPushClick.h" +#import +#import "TDPresetProperties+TDDisProperties.h" +#import "TDAppLaunchReason.h" +#import "TDCommonUtil.h" + +@implementation TDApplicationDelegateProxy + +- (void)application:(UIApplication *)application didReceiveRemoteNotification:(NSDictionary *)userInfo fetchCompletionHandler:(void (^)(UIBackgroundFetchResult))completionHandler { + SEL selector = @selector(application:didReceiveRemoteNotification:fetchCompletionHandler:); + [TDApplicationDelegateProxy invokeWithTarget:self selector:selector, application, userInfo, completionHandler]; + [TDApplicationDelegateProxy trackEventWithTarget:self application:application remoteNotification:userInfo]; +} + +- (void)application:(UIApplication *)application didReceiveLocalNotification:(UILocalNotification *)notification { + SEL selector = @selector(application:didReceiveLocalNotification:); + [TDApplicationDelegateProxy invokeWithTarget:self selector:selector, application, notification]; + [TDApplicationDelegateProxy trackEventWithTarget:self application:application localNotification:notification]; +} + +- (BOOL)application:(UIApplication *)application continueUserActivity:(NSUserActivity *)userActivity restorationHandler:(void (^)(NSArray> * _Nullable))restorationHandler { + SEL selector = @selector(application:continueUserActivity:restorationHandler:); + if (![TDPresetProperties disableStartReason]) { + [[TDAppLaunchReason sharedInstance] clearAppLaunchParams]; + [TDAppLaunchReason sharedInstance].appLaunchParams = @{@"url": [TDCommonUtil string: userActivity.webpageURL.absoluteString],@"data":@{}}; + } + return [TDApplicationDelegateProxy invokeReturnBOOLWithTarget:self selector:selector arg1:application arg2:userActivity arg3:restorationHandler]; +} + +- (BOOL)application:(UIApplication *)app openURL:(NSURL *)url options:(NSDictionary *)options { + SEL selector = @selector(application:openURL:options:); + if (![TDPresetProperties disableStartReason]) { + [[TDAppLaunchReason sharedInstance] clearAppLaunchParams]; + [TDAppLaunchReason sharedInstance].appLaunchParams = @{@"url": [TDCommonUtil string:url.absoluteString],@"data":@{}}; + } + return [TDApplicationDelegateProxy invokeReturnBOOLWithTarget:self selector:selector arg1:app arg2:url arg3:options]; +} + +- (BOOL)application:(UIApplication *)application handleOpenURL:(NSURL *)url { + SEL selector = @selector(application:handleOpenURL:); + if (![TDPresetProperties disableStartReason]) { + [[TDAppLaunchReason sharedInstance] clearAppLaunchParams]; + [TDAppLaunchReason sharedInstance].appLaunchParams = @{@"url": [TDCommonUtil string:url.absoluteString], @"data":@{}}; + } + return [TDApplicationDelegateProxy invokeReturnBOOLWithTarget:self selector:selector arg1:application arg2:url]; +} + +- (void)application:(UIApplication *)application performActionForShortcutItem:(UIApplicationShortcutItem *)shortcutItem completionHandler:(void (^)(BOOL))completionHandler{ + SEL selector = @selector(application:performActionForShortcutItem:completionHandler:); + [TDApplicationDelegateProxy invokeWithTarget:self selector:selector, application, shortcutItem, completionHandler]; + if (![TDPresetProperties disableStartReason]) { + [[TDAppLaunchReason sharedInstance] clearAppLaunchParams]; + [TDAppLaunchReason sharedInstance].appLaunchParams = @{@"url": @"",@"data": [TDCommonUtil dictionary:shortcutItem.userInfo]}; + } +} + + ++ (void)trackEventWithTarget:(NSObject *)target application:(UIApplication *)application remoteNotification:(NSDictionary *)userInfo { + + if (target != application.delegate) { + return; + } + + if ([[UIDevice currentDevice].systemVersion floatValue] >= 10.0) { + NSLog(@"iOS version >= 10.0, callback for %@ was ignored.", @"application:didReceiveRemoteNotification:fetchCompletionHandler:"); + return; + } + + if (application.applicationState != UIApplicationStateInactive) { + return; + } + + if (![TDPresetProperties disableStartReason]) { + [[TDAppLaunchReason sharedInstance] clearAppLaunchParams]; + [TDAppLaunchReason sharedInstance].appLaunchParams = @{@"url": @"", @"data": [TDCommonUtil dictionary:userInfo]}; + } + +} + ++ (void)trackEventWithTarget:(NSObject *)target application:(UIApplication *)application localNotification:(UILocalNotification *)notification { + + if (target != application.delegate) { + return; + } + + BOOL isValidPushClick = NO; + if (application.applicationState == UIApplicationStateInactive) { + isValidPushClick = YES; + } + + if (!isValidPushClick) { + return; + } + + if (![TDPresetProperties disableStartReason]) { + NSMutableDictionary *properties = [[NSMutableDictionary alloc] init]; + properties[@"alertBody"] = notification.alertBody; + if (@available(iOS 8.2, *)) { + properties[@"alertTitle"] = notification.alertTitle; + } + [[TDAppLaunchReason sharedInstance] clearAppLaunchParams]; + [TDAppLaunchReason sharedInstance].appLaunchParams = @{@"url": @"", @"data": [TDCommonUtil dictionary:properties]}; + } +} + ++ (NSSet *)optionalSelectors { + return [NSSet setWithArray:@[@"application:didReceiveLocalNotification:", + @"application:didReceiveRemoteNotification:fetchCompletionHandler:", + @"application:handleOpenURL:", + @"application:openURL:options:", + @"application:continueUserActivity:restorationHandler:", + @"application:performActionForShortcutItem:completionHandler:"]]; +} + +@end diff --git a/Assets/HCMiniSdk/Third/ta/Plugins/iOS/ThinkingSDK/Source/AppLaunch/AppPush/TDApplicationDelegateProxy.m.meta b/Assets/HCMiniSdk/Third/ta/Plugins/iOS/ThinkingSDK/Source/AppLaunch/AppPush/TDApplicationDelegateProxy.m.meta new file mode 100644 index 00000000..99949019 --- /dev/null +++ b/Assets/HCMiniSdk/Third/ta/Plugins/iOS/ThinkingSDK/Source/AppLaunch/AppPush/TDApplicationDelegateProxy.m.meta @@ -0,0 +1,33 @@ +fileFormatVersion: 2 +guid: b2eec12b437e64f6886ebe51d6680b83 +PluginImporter: + externalObjects: {} + serializedVersion: 2 + iconMap: {} + executionOrder: {} + defineConstraints: [] + isPreloaded: 0 + isOverridable: 0 + isExplicitlyReferenced: 0 + validateReferences: 1 + platformData: + - first: + Any: + second: + enabled: 0 + settings: {} + - first: + Editor: Editor + second: + enabled: 0 + settings: + DefaultValueInitialized: true + - first: + iPhone: iOS + second: + enabled: 1 + settings: + AddToEmbeddedBinaries: false + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/HCMiniSdk/Third/ta/Plugins/iOS/ThinkingSDK/Source/AppLaunch/AppPush/TDUNUserNotificationCenterDelegateProxy.h b/Assets/HCMiniSdk/Third/ta/Plugins/iOS/ThinkingSDK/Source/AppLaunch/AppPush/TDUNUserNotificationCenterDelegateProxy.h new file mode 100644 index 00000000..94be8fcb --- /dev/null +++ b/Assets/HCMiniSdk/Third/ta/Plugins/iOS/ThinkingSDK/Source/AppLaunch/AppPush/TDUNUserNotificationCenterDelegateProxy.h @@ -0,0 +1,16 @@ + +#import "TDDelegateProxy.h" + +#if __IPHONE_OS_VERSION_MAX_ALLOWED >= __IPHONE_10_0 +#import +#endif + +NS_ASSUME_NONNULL_BEGIN + +@interface TDUNUserNotificationCenterDelegateProxy : TDDelegateProxy + + + +@end + +NS_ASSUME_NONNULL_END diff --git a/Assets/HCMiniSdk/Third/ta/Plugins/iOS/ThinkingSDK/Source/AppLaunch/AppPush/TDUNUserNotificationCenterDelegateProxy.h.meta b/Assets/HCMiniSdk/Third/ta/Plugins/iOS/ThinkingSDK/Source/AppLaunch/AppPush/TDUNUserNotificationCenterDelegateProxy.h.meta new file mode 100644 index 00000000..68c40185 --- /dev/null +++ b/Assets/HCMiniSdk/Third/ta/Plugins/iOS/ThinkingSDK/Source/AppLaunch/AppPush/TDUNUserNotificationCenterDelegateProxy.h.meta @@ -0,0 +1,33 @@ +fileFormatVersion: 2 +guid: dd9eda5b6572748ecaa3313c288c9e16 +PluginImporter: + externalObjects: {} + serializedVersion: 2 + iconMap: {} + executionOrder: {} + defineConstraints: [] + isPreloaded: 0 + isOverridable: 0 + isExplicitlyReferenced: 0 + validateReferences: 1 + platformData: + - first: + Any: + second: + enabled: 0 + settings: {} + - first: + Editor: Editor + second: + enabled: 0 + settings: + DefaultValueInitialized: true + - first: + iPhone: iOS + second: + enabled: 1 + settings: + AddToEmbeddedBinaries: false + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/HCMiniSdk/Third/ta/Plugins/iOS/ThinkingSDK/Source/AppLaunch/AppPush/TDUNUserNotificationCenterDelegateProxy.m b/Assets/HCMiniSdk/Third/ta/Plugins/iOS/ThinkingSDK/Source/AppLaunch/AppPush/TDUNUserNotificationCenterDelegateProxy.m new file mode 100644 index 00000000..c667448c --- /dev/null +++ b/Assets/HCMiniSdk/Third/ta/Plugins/iOS/ThinkingSDK/Source/AppLaunch/AppPush/TDUNUserNotificationCenterDelegateProxy.m @@ -0,0 +1,55 @@ + +#import "TDUNUserNotificationCenterDelegateProxy.h" +#import "TDClassHelper.h" +#import "NSObject+TDDelegateProxy.h" +#import +#import "TDAPPPushParams.h" +#import "TDPresetProperties+TDDisProperties.h" +#import "TDAppLaunchReason.h" +#import "TDCommonUtil.h" + +@implementation TDUNUserNotificationCenterDelegateProxy + +- (void)userNotificationCenter:(UNUserNotificationCenter *)center didReceiveNotificationResponse:(UNNotificationResponse *)response withCompletionHandler:(void (^)(void))completionHandler API_AVAILABLE(ios(10.0)){ + SEL selector = @selector(userNotificationCenter:didReceiveNotificationResponse:withCompletionHandler:); + [TDUNUserNotificationCenterDelegateProxy invokeWithTarget:self selector:selector, center, response, completionHandler]; + [TDUNUserNotificationCenterDelegateProxy trackEventWithTarget:self notificationCenter:center notificationResponse:response]; +} + ++ (void)trackEventWithTarget:(NSObject *)target notificationCenter:(UNUserNotificationCenter *)center notificationResponse:(UNNotificationResponse *)response API_AVAILABLE(ios(10.0)){ + + if (target != center.delegate) { + return; + } + + if (![TDPresetProperties disableStartReason]) { + NSMutableDictionary *properties = [[NSMutableDictionary alloc] init]; + NSDictionary *userInfo = __td_get_userNotificationCenterResponse(response); + if (userInfo) { + [properties addEntriesFromDictionary:userInfo]; + } + properties[@"title"] = __td_get_userNotificationCenterRequestContentTitle(response); + properties[@"body"] = __td_get_userNotificationCenterRequestContentBody(response); + + [[TDAppLaunchReason sharedInstance] clearAppLaunchParams]; + [TDAppLaunchReason sharedInstance].appLaunchParams = @{@"url": @"", @"data": [TDCommonUtil dictionary:properties]}; + } + + if (![TDPresetProperties disableOpsReceiptProperties]) { + @try { + if ([response isKindOfClass:[NSClassFromString(@"UNNotificationResponse") class]]) { + NSDictionary *userInfo = [response valueForKeyPath:@"notification.request.content.userInfo"]; + [TDAppLaunchReason td_ops_push_click:userInfo]; + } + } @catch (NSException *exception) { + + } + } + +} + ++ (NSSet *)optionalSelectors { + return [NSSet setWithArray:@[@"userNotificationCenter:didReceiveNotificationResponse:withCompletionHandler:"]]; +} + +@end diff --git a/Assets/HCMiniSdk/Third/ta/Plugins/iOS/ThinkingSDK/Source/AppLaunch/AppPush/TDUNUserNotificationCenterDelegateProxy.m.meta b/Assets/HCMiniSdk/Third/ta/Plugins/iOS/ThinkingSDK/Source/AppLaunch/AppPush/TDUNUserNotificationCenterDelegateProxy.m.meta new file mode 100644 index 00000000..21f49a81 --- /dev/null +++ b/Assets/HCMiniSdk/Third/ta/Plugins/iOS/ThinkingSDK/Source/AppLaunch/AppPush/TDUNUserNotificationCenterDelegateProxy.m.meta @@ -0,0 +1,33 @@ +fileFormatVersion: 2 +guid: a8c262d70355c46f38a4fce70eb95cc5 +PluginImporter: + externalObjects: {} + serializedVersion: 2 + iconMap: {} + executionOrder: {} + defineConstraints: [] + isPreloaded: 0 + isOverridable: 0 + isExplicitlyReferenced: 0 + validateReferences: 1 + platformData: + - first: + Any: + second: + enabled: 0 + settings: {} + - first: + Editor: Editor + second: + enabled: 0 + settings: + DefaultValueInitialized: true + - first: + iPhone: iOS + second: + enabled: 1 + settings: + AddToEmbeddedBinaries: false + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/HCMiniSdk/Third/ta/Plugins/iOS/ThinkingSDK/Source/AppLaunch/AppPush/UIApplication+TDPushClick.h b/Assets/HCMiniSdk/Third/ta/Plugins/iOS/ThinkingSDK/Source/AppLaunch/AppPush/UIApplication+TDPushClick.h new file mode 100644 index 00000000..373abc95 --- /dev/null +++ b/Assets/HCMiniSdk/Third/ta/Plugins/iOS/ThinkingSDK/Source/AppLaunch/AppPush/UIApplication+TDPushClick.h @@ -0,0 +1,13 @@ + +#import + +NS_ASSUME_NONNULL_BEGIN + +@interface UIApplication (TDPushClick) + +- (void)thinkingdata_setDelegate:(id )delegate; +@property (nonatomic, copy, nullable) NSDictionary *thinkingdata_launchOptions; + +@end + +NS_ASSUME_NONNULL_END diff --git a/Assets/HCMiniSdk/Third/ta/Plugins/iOS/ThinkingSDK/Source/AppLaunch/AppPush/UIApplication+TDPushClick.h.meta b/Assets/HCMiniSdk/Third/ta/Plugins/iOS/ThinkingSDK/Source/AppLaunch/AppPush/UIApplication+TDPushClick.h.meta new file mode 100644 index 00000000..4f9c082a --- /dev/null +++ b/Assets/HCMiniSdk/Third/ta/Plugins/iOS/ThinkingSDK/Source/AppLaunch/AppPush/UIApplication+TDPushClick.h.meta @@ -0,0 +1,33 @@ +fileFormatVersion: 2 +guid: b039553b9411c4e30b4fc767b7c2714d +PluginImporter: + externalObjects: {} + serializedVersion: 2 + iconMap: {} + executionOrder: {} + defineConstraints: [] + isPreloaded: 0 + isOverridable: 0 + isExplicitlyReferenced: 0 + validateReferences: 1 + platformData: + - first: + Any: + second: + enabled: 0 + settings: {} + - first: + Editor: Editor + second: + enabled: 0 + settings: + DefaultValueInitialized: true + - first: + iPhone: iOS + second: + enabled: 1 + settings: + AddToEmbeddedBinaries: false + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/HCMiniSdk/Third/ta/Plugins/iOS/ThinkingSDK/Source/AppLaunch/AppPush/UIApplication+TDPushClick.m b/Assets/HCMiniSdk/Third/ta/Plugins/iOS/ThinkingSDK/Source/AppLaunch/AppPush/UIApplication+TDPushClick.m new file mode 100644 index 00000000..0e243343 --- /dev/null +++ b/Assets/HCMiniSdk/Third/ta/Plugins/iOS/ThinkingSDK/Source/AppLaunch/AppPush/UIApplication+TDPushClick.m @@ -0,0 +1,29 @@ + +#import "UIApplication+TDPushClick.h" +#import "TDApplicationDelegateProxy.h" +#import + +static void *const kSALaunchOptions = (void *)&kSALaunchOptions; + +@implementation UIApplication (TDPushClick) + +- (void)thinkingdata_setDelegate:(id)delegate { + [TDApplicationDelegateProxy resolveOptionalSelectorsForDelegate:delegate]; + + [self thinkingdata_setDelegate:delegate]; + + if (!self.delegate) { + return; + } + [TDApplicationDelegateProxy proxyDelegate:self.delegate selectors:[NSSet setWithArray:@[@"application:didReceiveLocalNotification:", @"application:didReceiveRemoteNotification:fetchCompletionHandler:"]]]; +} + +- (NSDictionary *)thinkingdata_launchOptions { + return objc_getAssociatedObject(self, kSALaunchOptions); +} + +- (void)setThinkingdata_launchOptions:(NSDictionary *)thinkingdata_launchOptions { + objc_setAssociatedObject(self, kSALaunchOptions, thinkingdata_launchOptions, OBJC_ASSOCIATION_COPY); +} + +@end diff --git a/Assets/HCMiniSdk/Third/ta/Plugins/iOS/ThinkingSDK/Source/AppLaunch/AppPush/UIApplication+TDPushClick.m.meta b/Assets/HCMiniSdk/Third/ta/Plugins/iOS/ThinkingSDK/Source/AppLaunch/AppPush/UIApplication+TDPushClick.m.meta new file mode 100644 index 00000000..8df4fd60 --- /dev/null +++ b/Assets/HCMiniSdk/Third/ta/Plugins/iOS/ThinkingSDK/Source/AppLaunch/AppPush/UIApplication+TDPushClick.m.meta @@ -0,0 +1,33 @@ +fileFormatVersion: 2 +guid: 17463cb6f209545bcbc20aad5129804d +PluginImporter: + externalObjects: {} + serializedVersion: 2 + iconMap: {} + executionOrder: {} + defineConstraints: [] + isPreloaded: 0 + isOverridable: 0 + isExplicitlyReferenced: 0 + validateReferences: 1 + platformData: + - first: + Any: + second: + enabled: 0 + settings: {} + - first: + Editor: Editor + second: + enabled: 0 + settings: + DefaultValueInitialized: true + - first: + iPhone: iOS + second: + enabled: 1 + settings: + AddToEmbeddedBinaries: false + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/HCMiniSdk/Third/ta/Plugins/iOS/ThinkingSDK/Source/AppLaunch/AppPush/UNUserNotificationCenter+TDPushClick.h b/Assets/HCMiniSdk/Third/ta/Plugins/iOS/ThinkingSDK/Source/AppLaunch/AppPush/UNUserNotificationCenter+TDPushClick.h new file mode 100644 index 00000000..3b0adc8c --- /dev/null +++ b/Assets/HCMiniSdk/Third/ta/Plugins/iOS/ThinkingSDK/Source/AppLaunch/AppPush/UNUserNotificationCenter+TDPushClick.h @@ -0,0 +1,14 @@ + +#if __IPHONE_OS_VERSION_MAX_ALLOWED >= __IPHONE_10_0 +#import +#endif + +NS_ASSUME_NONNULL_BEGIN + +@interface UNUserNotificationCenter (TDPushClick) + +- (void)thinkingdata_setDelegate:(id )delegate; + +@end + +NS_ASSUME_NONNULL_END diff --git a/Assets/HCMiniSdk/Third/ta/Plugins/iOS/ThinkingSDK/Source/AppLaunch/AppPush/UNUserNotificationCenter+TDPushClick.h.meta b/Assets/HCMiniSdk/Third/ta/Plugins/iOS/ThinkingSDK/Source/AppLaunch/AppPush/UNUserNotificationCenter+TDPushClick.h.meta new file mode 100644 index 00000000..85d15881 --- /dev/null +++ b/Assets/HCMiniSdk/Third/ta/Plugins/iOS/ThinkingSDK/Source/AppLaunch/AppPush/UNUserNotificationCenter+TDPushClick.h.meta @@ -0,0 +1,33 @@ +fileFormatVersion: 2 +guid: dd78c300cef5f4507a13b638ce74c1e5 +PluginImporter: + externalObjects: {} + serializedVersion: 2 + iconMap: {} + executionOrder: {} + defineConstraints: [] + isPreloaded: 0 + isOverridable: 0 + isExplicitlyReferenced: 0 + validateReferences: 1 + platformData: + - first: + Any: + second: + enabled: 0 + settings: {} + - first: + Editor: Editor + second: + enabled: 0 + settings: + DefaultValueInitialized: true + - first: + iPhone: iOS + second: + enabled: 1 + settings: + AddToEmbeddedBinaries: false + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/HCMiniSdk/Third/ta/Plugins/iOS/ThinkingSDK/Source/AppLaunch/AppPush/UNUserNotificationCenter+TDPushClick.m b/Assets/HCMiniSdk/Third/ta/Plugins/iOS/ThinkingSDK/Source/AppLaunch/AppPush/UNUserNotificationCenter+TDPushClick.m new file mode 100644 index 00000000..2ad56f6e --- /dev/null +++ b/Assets/HCMiniSdk/Third/ta/Plugins/iOS/ThinkingSDK/Source/AppLaunch/AppPush/UNUserNotificationCenter+TDPushClick.m @@ -0,0 +1,18 @@ + +#import "UNUserNotificationCenter+TDPushClick.h" +#import "TDUNUserNotificationCenterDelegateProxy.h" + +@implementation UNUserNotificationCenter (TDPushClick) + +- (void)thinkingdata_setDelegate:(id)delegate { + + [TDUNUserNotificationCenterDelegateProxy resolveOptionalSelectorsForDelegate:delegate]; + + [self thinkingdata_setDelegate:delegate]; + if (!self.delegate) { + return; + } + [TDUNUserNotificationCenterDelegateProxy proxyDelegate:self.delegate selectors:[NSSet setWithArray:@[@"userNotificationCenter:didReceiveNotificationResponse:withCompletionHandler:"]]]; +} + +@end diff --git a/Assets/HCMiniSdk/Third/ta/Plugins/iOS/ThinkingSDK/Source/AppLaunch/AppPush/UNUserNotificationCenter+TDPushClick.m.meta b/Assets/HCMiniSdk/Third/ta/Plugins/iOS/ThinkingSDK/Source/AppLaunch/AppPush/UNUserNotificationCenter+TDPushClick.m.meta new file mode 100644 index 00000000..b9fff434 --- /dev/null +++ b/Assets/HCMiniSdk/Third/ta/Plugins/iOS/ThinkingSDK/Source/AppLaunch/AppPush/UNUserNotificationCenter+TDPushClick.m.meta @@ -0,0 +1,33 @@ +fileFormatVersion: 2 +guid: 73166a65f020c46e8a3c53cfa301c5f2 +PluginImporter: + externalObjects: {} + serializedVersion: 2 + iconMap: {} + executionOrder: {} + defineConstraints: [] + isPreloaded: 0 + isOverridable: 0 + isExplicitlyReferenced: 0 + validateReferences: 1 + platformData: + - first: + Any: + second: + enabled: 0 + settings: {} + - first: + Editor: Editor + second: + enabled: 0 + settings: + DefaultValueInitialized: true + - first: + iPhone: iOS + second: + enabled: 1 + settings: + AddToEmbeddedBinaries: false + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/HCMiniSdk/Third/ta/Plugins/iOS/ThinkingSDK/Source/AppLaunch/HookDelegate.meta b/Assets/HCMiniSdk/Third/ta/Plugins/iOS/ThinkingSDK/Source/AppLaunch/HookDelegate.meta new file mode 100644 index 00000000..06a7a13f --- /dev/null +++ b/Assets/HCMiniSdk/Third/ta/Plugins/iOS/ThinkingSDK/Source/AppLaunch/HookDelegate.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: 0aa41df3a429a4fd8915122407b7001a +folderAsset: yes +DefaultImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/HCMiniSdk/Third/ta/Plugins/iOS/ThinkingSDK/Source/AppLaunch/HookDelegate/NSObject+TDDelegateProxy.h b/Assets/HCMiniSdk/Third/ta/Plugins/iOS/ThinkingSDK/Source/AppLaunch/HookDelegate/NSObject+TDDelegateProxy.h new file mode 100644 index 00000000..022903c4 --- /dev/null +++ b/Assets/HCMiniSdk/Third/ta/Plugins/iOS/ThinkingSDK/Source/AppLaunch/HookDelegate/NSObject+TDDelegateProxy.h @@ -0,0 +1,29 @@ + +#import +#import "TDDelegateProxyObject.h" + +NS_ASSUME_NONNULL_BEGIN + +@interface NSObject (TDDelegateProxy) + +@property (nonatomic, copy, nullable) NSSet *thinkingdata_optionalSelectors; +@property (nonatomic, strong, nullable) TDDelegateProxyObject *thinkingdata_delegateObject; + +/// hook respondsToSelector to resolve optional selectors +/// @param aSelector selector +- (BOOL)thinkingdata_respondsToSelector:(SEL)aSelector; + +@end + +@interface NSProxy (TDDelegateProxy) + +@property (nonatomic, copy, nullable) NSSet *thinkingdata_optionalSelectors; +@property (nonatomic, strong, nullable) TDDelegateProxyObject *thinkingdata_delegateObject; + +/// hook respondsToSelector to resolve optional selectors +/// @param aSelector selector +- (BOOL)thinkingdata_respondsToSelector:(SEL)aSelector; + +@end + +NS_ASSUME_NONNULL_END diff --git a/Assets/HCMiniSdk/Third/ta/Plugins/iOS/ThinkingSDK/Source/AppLaunch/HookDelegate/NSObject+TDDelegateProxy.h.meta b/Assets/HCMiniSdk/Third/ta/Plugins/iOS/ThinkingSDK/Source/AppLaunch/HookDelegate/NSObject+TDDelegateProxy.h.meta new file mode 100644 index 00000000..680c79c7 --- /dev/null +++ b/Assets/HCMiniSdk/Third/ta/Plugins/iOS/ThinkingSDK/Source/AppLaunch/HookDelegate/NSObject+TDDelegateProxy.h.meta @@ -0,0 +1,33 @@ +fileFormatVersion: 2 +guid: c165be5fc3eea4ab0bd9ff520104d3d8 +PluginImporter: + externalObjects: {} + serializedVersion: 2 + iconMap: {} + executionOrder: {} + defineConstraints: [] + isPreloaded: 0 + isOverridable: 0 + isExplicitlyReferenced: 0 + validateReferences: 1 + platformData: + - first: + Any: + second: + enabled: 0 + settings: {} + - first: + Editor: Editor + second: + enabled: 0 + settings: + DefaultValueInitialized: true + - first: + iPhone: iOS + second: + enabled: 1 + settings: + AddToEmbeddedBinaries: false + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/HCMiniSdk/Third/ta/Plugins/iOS/ThinkingSDK/Source/AppLaunch/HookDelegate/NSObject+TDDelegateProxy.m b/Assets/HCMiniSdk/Third/ta/Plugins/iOS/ThinkingSDK/Source/AppLaunch/HookDelegate/NSObject+TDDelegateProxy.m new file mode 100644 index 00000000..6f945461 --- /dev/null +++ b/Assets/HCMiniSdk/Third/ta/Plugins/iOS/ThinkingSDK/Source/AppLaunch/HookDelegate/NSObject+TDDelegateProxy.m @@ -0,0 +1,69 @@ + +#import "NSObject+TDDelegateProxy.h" +#import + +static void *const kTDNSObjectDelegateOptionalSelectorsKey = (void *)&kTDNSObjectDelegateOptionalSelectorsKey; +static void *const kTDNSObjectDelegateObjectKey = (void *)&kTDNSObjectDelegateObjectKey; + +static void *const kTDNSProxyDelegateOptionalSelectorsKey = (void *)&kTDNSProxyDelegateOptionalSelectorsKey; +static void *const kTDNSProxyDelegateObjectKey = (void *)&kTDNSProxyDelegateObjectKey; + +@implementation NSObject (TDDelegateProxy) + +- (NSSet *)thinkingdata_optionalSelectors { + return objc_getAssociatedObject(self, kTDNSObjectDelegateOptionalSelectorsKey); +} + +- (void)setThinkingdata_optionalSelectors:(NSSet *)thinkingdata_optionalSelectors { + objc_setAssociatedObject(self, kTDNSObjectDelegateOptionalSelectorsKey, thinkingdata_optionalSelectors, OBJC_ASSOCIATION_COPY); +} + +- (TDDelegateProxyObject *)thinkingdata_delegateObject { + return objc_getAssociatedObject(self, kTDNSObjectDelegateObjectKey); +} + +- (void)setThinkingdata_delegateObject:(TDDelegateProxyObject *)thinkingdata_delegateObject { + objc_setAssociatedObject(self, kTDNSObjectDelegateObjectKey, thinkingdata_delegateObject, OBJC_ASSOCIATION_RETAIN_NONATOMIC); +} + +- (BOOL)thinkingdata_respondsToSelector:(SEL)aSelector { + if ([self thinkingdata_respondsToSelector:aSelector]) { + return YES; + } + if ([self.thinkingdata_optionalSelectors containsObject:NSStringFromSelector(aSelector)]) { + return YES; + } + return NO; +} + +@end + +@implementation NSProxy (TDDelegateProxy) + +- (NSSet *)thinkingdata_optionalSelectors { + return objc_getAssociatedObject(self, kTDNSProxyDelegateOptionalSelectorsKey); +} + +- (void)setThinkingdata_optionalSelectors:(NSSet *)thinkingdata_optionalSelectors { + objc_setAssociatedObject(self, kTDNSProxyDelegateOptionalSelectorsKey, thinkingdata_optionalSelectors, OBJC_ASSOCIATION_COPY); +} + +- (TDDelegateProxyObject *)thinkingdata_delegateObject { + return objc_getAssociatedObject(self, kTDNSProxyDelegateObjectKey); +} + +- (void)setThinkingdata_delegateObject:(TDDelegateProxyObject *)thinkingdata_delegateObject { + objc_setAssociatedObject(self, kTDNSProxyDelegateObjectKey, thinkingdata_delegateObject, OBJC_ASSOCIATION_RETAIN_NONATOMIC); +} + +- (BOOL)thinkingdata_respondsToSelector:(SEL)aSelector { + if ([self thinkingdata_respondsToSelector:aSelector]) { + return YES; + } + if ([self.thinkingdata_optionalSelectors containsObject:NSStringFromSelector(aSelector)]) { + return YES; + } + return NO; +} + +@end diff --git a/Assets/HCMiniSdk/Third/ta/Plugins/iOS/ThinkingSDK/Source/AppLaunch/HookDelegate/NSObject+TDDelegateProxy.m.meta b/Assets/HCMiniSdk/Third/ta/Plugins/iOS/ThinkingSDK/Source/AppLaunch/HookDelegate/NSObject+TDDelegateProxy.m.meta new file mode 100644 index 00000000..301d84f8 --- /dev/null +++ b/Assets/HCMiniSdk/Third/ta/Plugins/iOS/ThinkingSDK/Source/AppLaunch/HookDelegate/NSObject+TDDelegateProxy.m.meta @@ -0,0 +1,33 @@ +fileFormatVersion: 2 +guid: 852dc5d94530d4aff8a96973c9986ad2 +PluginImporter: + externalObjects: {} + serializedVersion: 2 + iconMap: {} + executionOrder: {} + defineConstraints: [] + isPreloaded: 0 + isOverridable: 0 + isExplicitlyReferenced: 0 + validateReferences: 1 + platformData: + - first: + Any: + second: + enabled: 0 + settings: {} + - first: + Editor: Editor + second: + enabled: 0 + settings: + DefaultValueInitialized: true + - first: + iPhone: iOS + second: + enabled: 1 + settings: + AddToEmbeddedBinaries: false + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/HCMiniSdk/Third/ta/Plugins/iOS/ThinkingSDK/Source/AppLaunch/HookDelegate/TDClassHelper.h b/Assets/HCMiniSdk/Third/ta/Plugins/iOS/ThinkingSDK/Source/AppLaunch/HookDelegate/TDClassHelper.h new file mode 100644 index 00000000..48b0055f --- /dev/null +++ b/Assets/HCMiniSdk/Third/ta/Plugins/iOS/ThinkingSDK/Source/AppLaunch/HookDelegate/TDClassHelper.h @@ -0,0 +1,16 @@ + +#import + +NS_ASSUME_NONNULL_BEGIN + +@interface TDClassHelper : NSObject + ++ (Class _Nullable)allocateClassWithObject:(id)object className:(NSString *)className; + ++ (void)registerClass:(Class)cla; + ++ (BOOL)setObject:(id)object toClass:(Class)cla; + +@end + +NS_ASSUME_NONNULL_END diff --git a/Assets/HCMiniSdk/Third/ta/Plugins/iOS/ThinkingSDK/Source/AppLaunch/HookDelegate/TDClassHelper.h.meta b/Assets/HCMiniSdk/Third/ta/Plugins/iOS/ThinkingSDK/Source/AppLaunch/HookDelegate/TDClassHelper.h.meta new file mode 100644 index 00000000..9806c52e --- /dev/null +++ b/Assets/HCMiniSdk/Third/ta/Plugins/iOS/ThinkingSDK/Source/AppLaunch/HookDelegate/TDClassHelper.h.meta @@ -0,0 +1,33 @@ +fileFormatVersion: 2 +guid: b05b7c406ad1f43d0bb4f1be994d8765 +PluginImporter: + externalObjects: {} + serializedVersion: 2 + iconMap: {} + executionOrder: {} + defineConstraints: [] + isPreloaded: 0 + isOverridable: 0 + isExplicitlyReferenced: 0 + validateReferences: 1 + platformData: + - first: + Any: + second: + enabled: 0 + settings: {} + - first: + Editor: Editor + second: + enabled: 0 + settings: + DefaultValueInitialized: true + - first: + iPhone: iOS + second: + enabled: 1 + settings: + AddToEmbeddedBinaries: false + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/HCMiniSdk/Third/ta/Plugins/iOS/ThinkingSDK/Source/AppLaunch/HookDelegate/TDClassHelper.m b/Assets/HCMiniSdk/Third/ta/Plugins/iOS/ThinkingSDK/Source/AppLaunch/HookDelegate/TDClassHelper.m new file mode 100644 index 00000000..4c7c01a1 --- /dev/null +++ b/Assets/HCMiniSdk/Third/ta/Plugins/iOS/ThinkingSDK/Source/AppLaunch/HookDelegate/TDClassHelper.m @@ -0,0 +1,36 @@ + +#import "TDClassHelper.h" +#import + +@implementation TDClassHelper + ++ (Class _Nullable)allocateClassWithObject:(id)object className:(NSString *)className { + if (!object || className.length <= 0) { + return nil; + } + Class originalClass = object_getClass(object); + Class subclass = NSClassFromString(className); + if (subclass) { + return nil; + } + subclass = objc_allocateClassPair(originalClass, className.UTF8String, 0); + if (class_getInstanceSize(originalClass) != class_getInstanceSize(subclass)) { + return nil; + } + return subclass; +} + ++ (void)registerClass:(Class)cla { + if (cla) { + objc_registerClassPair(cla); + } +} + ++ (BOOL)setObject:(id)object toClass:(Class)cla { + if (cla && object && object_getClass(object) != cla) { + return object_setClass(object, cla); + } + return NO; +} + +@end diff --git a/Assets/HCMiniSdk/Third/ta/Plugins/iOS/ThinkingSDK/Source/AppLaunch/HookDelegate/TDClassHelper.m.meta b/Assets/HCMiniSdk/Third/ta/Plugins/iOS/ThinkingSDK/Source/AppLaunch/HookDelegate/TDClassHelper.m.meta new file mode 100644 index 00000000..6428dd7a --- /dev/null +++ b/Assets/HCMiniSdk/Third/ta/Plugins/iOS/ThinkingSDK/Source/AppLaunch/HookDelegate/TDClassHelper.m.meta @@ -0,0 +1,33 @@ +fileFormatVersion: 2 +guid: aec2711162866493884cdef2cc925bb0 +PluginImporter: + externalObjects: {} + serializedVersion: 2 + iconMap: {} + executionOrder: {} + defineConstraints: [] + isPreloaded: 0 + isOverridable: 0 + isExplicitlyReferenced: 0 + validateReferences: 1 + platformData: + - first: + Any: + second: + enabled: 0 + settings: {} + - first: + Editor: Editor + second: + enabled: 0 + settings: + DefaultValueInitialized: true + - first: + iPhone: iOS + second: + enabled: 1 + settings: + AddToEmbeddedBinaries: false + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/HCMiniSdk/Third/ta/Plugins/iOS/ThinkingSDK/Source/AppLaunch/HookDelegate/TDDelegateProxy.h b/Assets/HCMiniSdk/Third/ta/Plugins/iOS/ThinkingSDK/Source/AppLaunch/HookDelegate/TDDelegateProxy.h new file mode 100644 index 00000000..5a14c769 --- /dev/null +++ b/Assets/HCMiniSdk/Third/ta/Plugins/iOS/ThinkingSDK/Source/AppLaunch/HookDelegate/TDDelegateProxy.h @@ -0,0 +1,25 @@ + +#import + +NS_ASSUME_NONNULL_BEGIN + +@protocol TDHookDelegateProtocol +@optional ++ (NSSet *)optionalSelectors; + +@end + +@interface TDDelegateProxy : NSObject + ++ (void)proxyDelegate:(id)delegate selectors:(NSSet*)selectors; + ++ (void)invokeWithTarget:(NSObject *)target selector:(SEL)selector, ...; + ++ (BOOL)invokeReturnBOOLWithTarget:(NSObject *)target selector:(SEL)selector arg1:(id)arg1 arg2:(id)arg2; ++ (BOOL)invokeReturnBOOLWithTarget:(NSObject *)target selector:(SEL)selector arg1:(id)arg1 arg2:(id)arg2 arg3:(id)arg3; + ++ (void)resolveOptionalSelectorsForDelegate:(id)delegate; + +@end + +NS_ASSUME_NONNULL_END diff --git a/Assets/HCMiniSdk/Third/ta/Plugins/iOS/ThinkingSDK/Source/AppLaunch/HookDelegate/TDDelegateProxy.h.meta b/Assets/HCMiniSdk/Third/ta/Plugins/iOS/ThinkingSDK/Source/AppLaunch/HookDelegate/TDDelegateProxy.h.meta new file mode 100644 index 00000000..9fbacbe2 --- /dev/null +++ b/Assets/HCMiniSdk/Third/ta/Plugins/iOS/ThinkingSDK/Source/AppLaunch/HookDelegate/TDDelegateProxy.h.meta @@ -0,0 +1,33 @@ +fileFormatVersion: 2 +guid: d844d7614eae8439c904288502d39b52 +PluginImporter: + externalObjects: {} + serializedVersion: 2 + iconMap: {} + executionOrder: {} + defineConstraints: [] + isPreloaded: 0 + isOverridable: 0 + isExplicitlyReferenced: 0 + validateReferences: 1 + platformData: + - first: + Any: + second: + enabled: 0 + settings: {} + - first: + Editor: Editor + second: + enabled: 0 + settings: + DefaultValueInitialized: true + - first: + iPhone: iOS + second: + enabled: 1 + settings: + AddToEmbeddedBinaries: false + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/HCMiniSdk/Third/ta/Plugins/iOS/ThinkingSDK/Source/AppLaunch/HookDelegate/TDDelegateProxy.m b/Assets/HCMiniSdk/Third/ta/Plugins/iOS/ThinkingSDK/Source/AppLaunch/HookDelegate/TDDelegateProxy.m new file mode 100644 index 00000000..68dc63bd --- /dev/null +++ b/Assets/HCMiniSdk/Third/ta/Plugins/iOS/ThinkingSDK/Source/AppLaunch/HookDelegate/TDDelegateProxy.m @@ -0,0 +1,200 @@ + +#import "TDDelegateProxy.h" +#import "TDClassHelper.h" +#import "TDMethodHelper.h" +#import "NSObject+TDDelegateProxy.h" +#import + +static NSString * const kTDNSObjectRemoveObserverSelector = @"removeObserver:forKeyPath:"; +static NSString * const kTDNSObjectAddObserverSelector = @"addObserver:forKeyPath:options:context:"; +static NSString * const kTDNSObjectClassSelector = @"class"; + +@implementation TDDelegateProxy + ++ (void)proxyDelegate:(id)delegate selectors:(NSSet *)selectors { + if (object_isClass(delegate) || selectors.count == 0) { + return; + } + + Class proxyClass = [self class]; + NSMutableSet *delegateSelectors = [NSMutableSet setWithSet:selectors]; + + TDDelegateProxyObject *object = [delegate thinkingdata_delegateObject]; + if (!object) { + object = [[TDDelegateProxyObject alloc] initWithDelegate:delegate proxy:proxyClass]; + [delegate setThinkingdata_delegateObject:object]; + } + + [delegateSelectors minusSet:object.selectors]; + if (delegateSelectors.count == 0) { + return; + } + + if (object.thinkingClass) { + [self addInstanceMethodWithSelectors:delegateSelectors fromClass:proxyClass toClass:object.thinkingClass]; + [object.selectors unionSet:delegateSelectors]; + + if (![object_getClass(delegate) isSubclassOfClass:object.thinkingClass]) { + [TDClassHelper setObject:delegate toClass:object.thinkingClass]; + } + return; + } + + if (object.kvoClass) { + if ([delegate isKindOfClass:NSObject.class] && ![object.selectors containsObject:kTDNSObjectRemoveObserverSelector]) { + [delegateSelectors addObject:kTDNSObjectRemoveObserverSelector]; + } + [self addInstanceMethodWithSelectors:delegateSelectors fromClass:proxyClass toClass:object.kvoClass]; + [object.selectors unionSet:delegateSelectors]; + return; + } + + Class thinkingClass = [TDClassHelper allocateClassWithObject:delegate className:object.thinkingClassName]; + [TDClassHelper registerClass:thinkingClass]; + + if ([delegate isKindOfClass:NSObject.class] && ![object.selectors containsObject:kTDNSObjectAddObserverSelector]) { + [delegateSelectors addObject:kTDNSObjectAddObserverSelector]; + } + + if (![object.selectors containsObject:kTDNSObjectClassSelector]) { + [delegateSelectors addObject:kTDNSObjectClassSelector]; + } + + [self addInstanceMethodWithSelectors:delegateSelectors fromClass:proxyClass toClass:thinkingClass]; + [object.selectors unionSet:delegateSelectors]; + + [TDClassHelper setObject:delegate toClass:thinkingClass]; +} + ++ (void)addInstanceMethodWithSelectors:(NSSet *)selectors fromClass:(Class)fromClass toClass:(Class)toClass { + for (NSString *selector in selectors) { + SEL sel = NSSelectorFromString(selector); + [TDMethodHelper addInstanceMethodWithSelector:sel fromClass:fromClass toClass:toClass]; + } +} + ++ (BOOL)invokeReturnBOOLWithTarget:(NSObject *)target selector:(SEL)selector arg1:(id)arg1 arg2:(id)arg2 arg3:(id)arg3 { + Class originalClass = target.thinkingdata_delegateObject.delegateISA; + + struct objc_super targetSuper = { + .receiver = target, + .super_class = originalClass + }; + + BOOL returnValue = NO; + @try { + returnValue = ((BOOL (*)(struct objc_super *, SEL, id, id, id))objc_msgSendSuper)(&targetSuper, selector, arg1, arg2, arg3); + } @catch (NSException *exception) { + NSLog(@"msgSendSuper with exception: %@", exception); + } @finally { + + } + return returnValue; +} + ++ (BOOL)invokeReturnBOOLWithTarget:(NSObject *)target selector:(SEL)selector arg1:(id)arg1 arg2:(id)arg2 { + Class originalClass = target.thinkingdata_delegateObject.delegateISA; + + struct objc_super targetSuper = { + .receiver = target, + .super_class = originalClass + }; + + BOOL returnValue = NO; + @try { + returnValue = ((BOOL (*)(struct objc_super *, SEL, id, id))objc_msgSendSuper)(&targetSuper, selector, arg1, arg2); + } @catch (NSException *exception) { + NSLog(@"msgSendSuper with exception: %@", exception); + } @finally { + + } + return returnValue; +} + ++ (void)invokeWithTarget:(NSObject *)target selector:(SEL)selector, ... { + Class originalClass = target.thinkingdata_delegateObject.delegateISA; + + va_list args; + va_start(args, selector); + id arg1 = nil, arg2 = nil, arg3 = nil, arg4 = nil; + NSInteger count = [NSStringFromSelector(selector) componentsSeparatedByString:@":"].count - 1; + for (NSInteger i = 0; i < count; i++) { + i == 0 ? (arg1 = va_arg(args, id)) : nil; + i == 1 ? (arg2 = va_arg(args, id)) : nil; + i == 2 ? (arg3 = va_arg(args, id)) : nil; + i == 3 ? (arg4 = va_arg(args, id)) : nil; + } + struct objc_super targetSuper = { + .receiver = target, + .super_class = originalClass + }; + + @try { + void (*func)(struct objc_super *, SEL, id, id, id, id) = (void *)&objc_msgSendSuper; + func(&targetSuper, selector, arg1, arg2, arg3, arg4); + } @catch (NSException *exception) { + NSLog(@"msgSendSuper with exception: %@", exception); + } @finally { + va_end(args); + } +} + + ++ (void)resolveOptionalSelectorsForDelegate:(id)delegate { + if (object_isClass(delegate)) { + return; + } + + NSSet *currentOptionalSelectors = ((NSObject *)delegate).thinkingdata_optionalSelectors; + NSMutableSet *optionalSelectors = [[NSMutableSet alloc] init]; + if (currentOptionalSelectors) { + [optionalSelectors unionSet:currentOptionalSelectors]; + } + + if ([self respondsToSelector:@selector(optionalSelectors)] &&[self optionalSelectors]) { + [optionalSelectors unionSet:[self optionalSelectors]]; + } + ((NSObject *)delegate).thinkingdata_optionalSelectors = [optionalSelectors copy]; +} + +@end + +#pragma mark - Class +@implementation TDDelegateProxy (Class) + +- (Class)class { + if (self.thinkingdata_delegateObject.delegateClass) { + return self.thinkingdata_delegateObject.delegateClass; + } + return [super class]; +} + +@end + +#pragma mark - KVO +@implementation TDDelegateProxy (KVO) + +- (void)addObserver:(NSObject *)observer forKeyPath:(NSString *)keyPath options:(NSKeyValueObservingOptions)options context:(void *)context { + [super addObserver:observer forKeyPath:keyPath options:options context:context]; + if (self.thinkingdata_delegateObject) { + [TDMethodHelper replaceInstanceMethodWithDestinationSelector:@selector(class) sourceSelector:@selector(class) fromClass:TDDelegateProxy.class toClass:object_getClass(self)]; + } +} + +- (void)removeObserver:(NSObject *)observer forKeyPath:(NSString *)keyPath { + BOOL oldClassIsKVO = [TDDelegateProxyObject isKVOClass:object_getClass(self)]; + [super removeObserver:observer forKeyPath:keyPath]; + BOOL newClassIsKVO = [TDDelegateProxyObject isKVOClass:object_getClass(self)]; + + if (oldClassIsKVO && !newClassIsKVO) { + Class delegateProxy = self.thinkingdata_delegateObject.delegateProxy; + NSSet *selectors = [self.thinkingdata_delegateObject.selectors copy]; + + [self.thinkingdata_delegateObject removeKVO]; + if ([delegateProxy respondsToSelector:@selector(proxyDelegate:selectors:)]) { + [delegateProxy proxyDelegate:self selectors:selectors]; + } + } +} + +@end diff --git a/Assets/HCMiniSdk/Third/ta/Plugins/iOS/ThinkingSDK/Source/AppLaunch/HookDelegate/TDDelegateProxy.m.meta b/Assets/HCMiniSdk/Third/ta/Plugins/iOS/ThinkingSDK/Source/AppLaunch/HookDelegate/TDDelegateProxy.m.meta new file mode 100644 index 00000000..4e9564ec --- /dev/null +++ b/Assets/HCMiniSdk/Third/ta/Plugins/iOS/ThinkingSDK/Source/AppLaunch/HookDelegate/TDDelegateProxy.m.meta @@ -0,0 +1,33 @@ +fileFormatVersion: 2 +guid: 814fa739d0a0447259f0fda304b44e4e +PluginImporter: + externalObjects: {} + serializedVersion: 2 + iconMap: {} + executionOrder: {} + defineConstraints: [] + isPreloaded: 0 + isOverridable: 0 + isExplicitlyReferenced: 0 + validateReferences: 1 + platformData: + - first: + Any: + second: + enabled: 0 + settings: {} + - first: + Editor: Editor + second: + enabled: 0 + settings: + DefaultValueInitialized: true + - first: + iPhone: iOS + second: + enabled: 1 + settings: + AddToEmbeddedBinaries: false + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/HCMiniSdk/Third/ta/Plugins/iOS/ThinkingSDK/Source/AppLaunch/HookDelegate/TDDelegateProxyObject.h b/Assets/HCMiniSdk/Third/ta/Plugins/iOS/ThinkingSDK/Source/AppLaunch/HookDelegate/TDDelegateProxyObject.h new file mode 100644 index 00000000..76d5b167 --- /dev/null +++ b/Assets/HCMiniSdk/Third/ta/Plugins/iOS/ThinkingSDK/Source/AppLaunch/HookDelegate/TDDelegateProxyObject.h @@ -0,0 +1,34 @@ + +#import + +NS_ASSUME_NONNULL_BEGIN + +@interface TDDelegateProxyObject : NSObject + +@property (nonatomic, strong) Class delegateISA; + +@property (nonatomic, strong, nullable) Class kvoClass; + +@property (nonatomic, copy, nullable) NSString *thinkingClassName; + +@property (nonatomic, strong, readonly, nullable) Class thinkingClass; + +@property (nonatomic, strong) id delegateClass; + +@property (nonatomic, strong) Class delegateProxy; + +@property (nonatomic, strong) NSMutableSet *selectors; + +- (instancetype)initWithDelegate:(id)delegate proxy:(id)proxy; + +- (void)removeKVO; + +@end + +@interface TDDelegateProxyObject (Utils) + ++ (BOOL)isKVOClass:(Class _Nullable)cls; + +@end + +NS_ASSUME_NONNULL_END diff --git a/Assets/HCMiniSdk/Third/ta/Plugins/iOS/ThinkingSDK/Source/AppLaunch/HookDelegate/TDDelegateProxyObject.h.meta b/Assets/HCMiniSdk/Third/ta/Plugins/iOS/ThinkingSDK/Source/AppLaunch/HookDelegate/TDDelegateProxyObject.h.meta new file mode 100644 index 00000000..366ee111 --- /dev/null +++ b/Assets/HCMiniSdk/Third/ta/Plugins/iOS/ThinkingSDK/Source/AppLaunch/HookDelegate/TDDelegateProxyObject.h.meta @@ -0,0 +1,33 @@ +fileFormatVersion: 2 +guid: b66965aa8d4f84c9fbcab5bb32c159a6 +PluginImporter: + externalObjects: {} + serializedVersion: 2 + iconMap: {} + executionOrder: {} + defineConstraints: [] + isPreloaded: 0 + isOverridable: 0 + isExplicitlyReferenced: 0 + validateReferences: 1 + platformData: + - first: + Any: + second: + enabled: 0 + settings: {} + - first: + Editor: Editor + second: + enabled: 0 + settings: + DefaultValueInitialized: true + - first: + iPhone: iOS + second: + enabled: 1 + settings: + AddToEmbeddedBinaries: false + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/HCMiniSdk/Third/ta/Plugins/iOS/ThinkingSDK/Source/AppLaunch/HookDelegate/TDDelegateProxyObject.m b/Assets/HCMiniSdk/Third/ta/Plugins/iOS/ThinkingSDK/Source/AppLaunch/HookDelegate/TDDelegateProxyObject.m new file mode 100644 index 00000000..63164d3c --- /dev/null +++ b/Assets/HCMiniSdk/Third/ta/Plugins/iOS/ThinkingSDK/Source/AppLaunch/HookDelegate/TDDelegateProxyObject.m @@ -0,0 +1,56 @@ + +#import "TDDelegateProxyObject.h" +#import + +NSString * const kTDDelegateClassThinkingSuffix = @"_TD.THINKINGDATA"; +NSString * const kTDDelegateClassKVOPrefix = @"KVONotifying_"; + +@implementation TDDelegateProxyObject + +- (instancetype)initWithDelegate:(id)delegate proxy:(id)proxy { + self = [super init]; + if (self) { + _delegateProxy = proxy; + + _selectors = [NSMutableSet set]; + _delegateClass = [delegate class]; + + Class cla = object_getClass(delegate); + NSString *name = NSStringFromClass(cla); + + if ([name containsString:kTDDelegateClassKVOPrefix]) { + _delegateISA = class_getSuperclass(cla); + _kvoClass = cla; + } else if ([name containsString:kTDDelegateClassThinkingSuffix]) { + _delegateISA = class_getSuperclass(cla); + _thinkingClassName = name; + } else { + _delegateISA = cla; + _thinkingClassName = [NSString stringWithFormat:@"%@%@", name, kTDDelegateClassThinkingSuffix]; + } + } + return self; +} + +- (Class)thinkingClass { + return NSClassFromString(self.thinkingClassName); +} + +- (void)removeKVO { + self.kvoClass = nil; + self.thinkingClassName = [NSString stringWithFormat:@"%@%@", self.delegateISA, kTDDelegateClassThinkingSuffix]; + [self.selectors removeAllObjects]; +} + +@end + +#pragma mark - Utils + +@implementation TDDelegateProxyObject (Utils) + ++ (BOOL)isKVOClass:(Class _Nullable)cls { + return [NSStringFromClass(cls) containsString:kTDDelegateClassKVOPrefix]; +} + +@end + diff --git a/Assets/HCMiniSdk/Third/ta/Plugins/iOS/ThinkingSDK/Source/AppLaunch/HookDelegate/TDDelegateProxyObject.m.meta b/Assets/HCMiniSdk/Third/ta/Plugins/iOS/ThinkingSDK/Source/AppLaunch/HookDelegate/TDDelegateProxyObject.m.meta new file mode 100644 index 00000000..e017f438 --- /dev/null +++ b/Assets/HCMiniSdk/Third/ta/Plugins/iOS/ThinkingSDK/Source/AppLaunch/HookDelegate/TDDelegateProxyObject.m.meta @@ -0,0 +1,33 @@ +fileFormatVersion: 2 +guid: b6c49449459eb4a92bf83ab85a7be1e7 +PluginImporter: + externalObjects: {} + serializedVersion: 2 + iconMap: {} + executionOrder: {} + defineConstraints: [] + isPreloaded: 0 + isOverridable: 0 + isExplicitlyReferenced: 0 + validateReferences: 1 + platformData: + - first: + Any: + second: + enabled: 0 + settings: {} + - first: + Editor: Editor + second: + enabled: 0 + settings: + DefaultValueInitialized: true + - first: + iPhone: iOS + second: + enabled: 1 + settings: + AddToEmbeddedBinaries: false + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/HCMiniSdk/Third/ta/Plugins/iOS/ThinkingSDK/Source/AppLaunch/HookDelegate/TDMethodHelper.h b/Assets/HCMiniSdk/Third/ta/Plugins/iOS/ThinkingSDK/Source/AppLaunch/HookDelegate/TDMethodHelper.h new file mode 100644 index 00000000..68a62118 --- /dev/null +++ b/Assets/HCMiniSdk/Third/ta/Plugins/iOS/ThinkingSDK/Source/AppLaunch/HookDelegate/TDMethodHelper.h @@ -0,0 +1,24 @@ + +#import + +NS_ASSUME_NONNULL_BEGIN + +@interface TDMethodHelper : NSObject + ++ (IMP)implementationOfMethodSelector:(SEL)selector fromClass:(Class)aClass; + ++ (void)addInstanceMethodWithSelector:(SEL)methodSelector fromClass:(Class)fromClass toClass:(Class)toClass; + ++ (void)addInstanceMethodWithDestinationSelector:(SEL)destinationSelector sourceSelector:(SEL)sourceSelector fromClass:(Class)fromClass toClass:(Class)toClass; + ++ (void)addClassMethodWithDestinationSelector:(SEL)destinationSelector sourceSelector:(SEL)sourceSelector fromClass:(Class)fromClass toClass:(Class)toClass; + ++ (IMP _Nullable)replaceInstanceMethodWithDestinationSelector:(SEL)destinationSelector sourceSelector:(SEL)sourceSelector fromClass:(Class)fromClass toClass:(Class)toClass; + +/// swizzle respondsToSelector 方法 +/// 用于处理未实现代理方法也能采集事件的逻辑 ++ (void)swizzleRespondsToSelector; + +@end + +NS_ASSUME_NONNULL_END diff --git a/Assets/HCMiniSdk/Third/ta/Plugins/iOS/ThinkingSDK/Source/AppLaunch/HookDelegate/TDMethodHelper.h.meta b/Assets/HCMiniSdk/Third/ta/Plugins/iOS/ThinkingSDK/Source/AppLaunch/HookDelegate/TDMethodHelper.h.meta new file mode 100644 index 00000000..e1c7854e --- /dev/null +++ b/Assets/HCMiniSdk/Third/ta/Plugins/iOS/ThinkingSDK/Source/AppLaunch/HookDelegate/TDMethodHelper.h.meta @@ -0,0 +1,33 @@ +fileFormatVersion: 2 +guid: b1cc9da14eecc4d23b345a15404edcab +PluginImporter: + externalObjects: {} + serializedVersion: 2 + iconMap: {} + executionOrder: {} + defineConstraints: [] + isPreloaded: 0 + isOverridable: 0 + isExplicitlyReferenced: 0 + validateReferences: 1 + platformData: + - first: + Any: + second: + enabled: 0 + settings: {} + - first: + Editor: Editor + second: + enabled: 0 + settings: + DefaultValueInitialized: true + - first: + iPhone: iOS + second: + enabled: 1 + settings: + AddToEmbeddedBinaries: false + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/HCMiniSdk/Third/ta/Plugins/iOS/ThinkingSDK/Source/AppLaunch/HookDelegate/TDMethodHelper.m b/Assets/HCMiniSdk/Third/ta/Plugins/iOS/ThinkingSDK/Source/AppLaunch/HookDelegate/TDMethodHelper.m new file mode 100644 index 00000000..8f0b01f7 --- /dev/null +++ b/Assets/HCMiniSdk/Third/ta/Plugins/iOS/ThinkingSDK/Source/AppLaunch/HookDelegate/TDMethodHelper.m @@ -0,0 +1,59 @@ + +#import "TDMethodHelper.h" +#import +#import "TDNewSwizzle.h" +#import "NSObject+TDDelegateProxy.h" + +@implementation TDMethodHelper + ++ (IMP)implementationOfMethodSelector:(SEL)selector fromClass:(Class)aClass { + Method aMethod = class_getInstanceMethod(aClass, selector); + return method_getImplementation(aMethod); +} + ++ (void)addInstanceMethodWithSelector:(SEL)methodSelector fromClass:(Class)fromClass toClass:(Class)toClass { + [self addInstanceMethodWithDestinationSelector:methodSelector sourceSelector:methodSelector fromClass:fromClass toClass:toClass]; +} + ++ (void)addInstanceMethodWithDestinationSelector:(SEL)destinationSelector sourceSelector:(SEL)sourceSelector fromClass:(Class)fromClass toClass:(Class)toClass { + Method method = class_getInstanceMethod(fromClass, sourceSelector); + if (!method) { + return; + } + IMP methodIMP = method_getImplementation(method); + const char *types = method_getTypeEncoding(method); + if (!class_addMethod(toClass, destinationSelector, methodIMP, types)) { + IMP destinationIMP = [self implementationOfMethodSelector:destinationSelector fromClass:toClass]; + if (destinationIMP == methodIMP) { + return; + } + class_replaceMethod(toClass, destinationSelector, methodIMP, types); + } +} + ++ (void)addClassMethodWithDestinationSelector:(SEL)destinationSelector sourceSelector:(SEL)sourceSelector fromClass:(Class)fromClass toClass:(Class)toClass { + Method method = class_getClassMethod(fromClass, sourceSelector); + IMP methodIMP = method_getImplementation(method); + const char *types = method_getTypeEncoding(method); + if (!class_addMethod(toClass, destinationSelector, methodIMP, types)) { + class_replaceMethod(toClass, destinationSelector, methodIMP, types); + } +} + ++ (IMP _Nullable)replaceInstanceMethodWithDestinationSelector:(SEL)destinationSelector sourceSelector:(SEL)sourceSelector fromClass:(Class)fromClass toClass:(Class)toClass { + Method method = class_getInstanceMethod(fromClass, sourceSelector); + IMP methodIMP = method_getImplementation(method); + const char *types = method_getTypeEncoding(method); + return class_replaceMethod(toClass, destinationSelector, methodIMP, types); +} + ++ (void)swizzleRespondsToSelector { + static dispatch_once_t onceToken; + dispatch_once(&onceToken, ^{ + [NSObject td_new_swizzleMethod:@selector(respondsToSelector:) + withMethod:@selector(thinkingdata_respondsToSelector:) + error:NULL]; + }); +} + +@end diff --git a/Assets/HCMiniSdk/Third/ta/Plugins/iOS/ThinkingSDK/Source/AppLaunch/HookDelegate/TDMethodHelper.m.meta b/Assets/HCMiniSdk/Third/ta/Plugins/iOS/ThinkingSDK/Source/AppLaunch/HookDelegate/TDMethodHelper.m.meta new file mode 100644 index 00000000..c92533ed --- /dev/null +++ b/Assets/HCMiniSdk/Third/ta/Plugins/iOS/ThinkingSDK/Source/AppLaunch/HookDelegate/TDMethodHelper.m.meta @@ -0,0 +1,33 @@ +fileFormatVersion: 2 +guid: 009c284b5153443e8bff5c9ca6ba32e8 +PluginImporter: + externalObjects: {} + serializedVersion: 2 + iconMap: {} + executionOrder: {} + defineConstraints: [] + isPreloaded: 0 + isOverridable: 0 + isExplicitlyReferenced: 0 + validateReferences: 1 + platformData: + - first: + Any: + second: + enabled: 0 + settings: {} + - first: + Editor: Editor + second: + enabled: 0 + settings: + DefaultValueInitialized: true + - first: + iPhone: iOS + second: + enabled: 1 + settings: + AddToEmbeddedBinaries: false + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/HCMiniSdk/Third/ta/Plugins/iOS/ThinkingSDK/Source/AppLaunch/NewSwizzle.meta b/Assets/HCMiniSdk/Third/ta/Plugins/iOS/ThinkingSDK/Source/AppLaunch/NewSwizzle.meta new file mode 100644 index 00000000..c07a62bd --- /dev/null +++ b/Assets/HCMiniSdk/Third/ta/Plugins/iOS/ThinkingSDK/Source/AppLaunch/NewSwizzle.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: b294828e3aa214401ad6a0db7ebd8a63 +folderAsset: yes +DefaultImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/HCMiniSdk/Third/ta/Plugins/iOS/ThinkingSDK/Source/AppLaunch/NewSwizzle/TDNewSwizzle.h b/Assets/HCMiniSdk/Third/ta/Plugins/iOS/ThinkingSDK/Source/AppLaunch/NewSwizzle/TDNewSwizzle.h new file mode 100755 index 00000000..cb3c0fff --- /dev/null +++ b/Assets/HCMiniSdk/Third/ta/Plugins/iOS/ThinkingSDK/Source/AppLaunch/NewSwizzle/TDNewSwizzle.h @@ -0,0 +1,14 @@ + +#import + +NS_ASSUME_NONNULL_BEGIN + +@interface NSObject (TDNewSwizzle) + ++ (BOOL)td_new_swizzleMethod:(SEL)origSel_ withMethod:(SEL)altSel_ error:(NSError **)error_; ++ (BOOL)td_new_swizzleClassMethod:(SEL)origSel_ withClassMethod:(SEL)altSel_ error:(NSError **)error_; ++ (BOOL)td_new_swizzleMethod:(SEL)origSel_ withClass:(Class)altCla_ withMethod:(SEL)altSel_ error:(NSError **)error_; + +@end + +NS_ASSUME_NONNULL_END diff --git a/Assets/HCMiniSdk/Third/ta/Plugins/iOS/ThinkingSDK/Source/AppLaunch/NewSwizzle/TDNewSwizzle.h.meta b/Assets/HCMiniSdk/Third/ta/Plugins/iOS/ThinkingSDK/Source/AppLaunch/NewSwizzle/TDNewSwizzle.h.meta new file mode 100644 index 00000000..2d0e25ee --- /dev/null +++ b/Assets/HCMiniSdk/Third/ta/Plugins/iOS/ThinkingSDK/Source/AppLaunch/NewSwizzle/TDNewSwizzle.h.meta @@ -0,0 +1,33 @@ +fileFormatVersion: 2 +guid: c2a9df7cedc0046aaad72584161c53f8 +PluginImporter: + externalObjects: {} + serializedVersion: 2 + iconMap: {} + executionOrder: {} + defineConstraints: [] + isPreloaded: 0 + isOverridable: 0 + isExplicitlyReferenced: 0 + validateReferences: 1 + platformData: + - first: + Any: + second: + enabled: 0 + settings: {} + - first: + Editor: Editor + second: + enabled: 0 + settings: + DefaultValueInitialized: true + - first: + iPhone: iOS + second: + enabled: 1 + settings: + AddToEmbeddedBinaries: false + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/HCMiniSdk/Third/ta/Plugins/iOS/ThinkingSDK/Source/AppLaunch/NewSwizzle/TDNewSwizzle.m b/Assets/HCMiniSdk/Third/ta/Plugins/iOS/ThinkingSDK/Source/AppLaunch/NewSwizzle/TDNewSwizzle.m new file mode 100755 index 00000000..10e998e2 --- /dev/null +++ b/Assets/HCMiniSdk/Third/ta/Plugins/iOS/ThinkingSDK/Source/AppLaunch/NewSwizzle/TDNewSwizzle.m @@ -0,0 +1,155 @@ + +#import "TDNewSwizzle.h" + +#if TARGET_OS_IOS + #import + #import +#else + #import +#endif + +#define TDSetNSErrorFor(FUNC, ERROR_VAR, FORMAT,...) \ + if (ERROR_VAR) { \ + NSString *errStr = [NSString stringWithFormat:@"%s: " FORMAT,FUNC,##__VA_ARGS__]; \ + *ERROR_VAR = [NSError errorWithDomain:@"NSCocoaErrorDomain" \ + code:-1 \ + userInfo:[NSDictionary dictionaryWithObject:errStr forKey:NSLocalizedDescriptionKey]]; \ + } +#define TDSetNSError(ERROR_VAR, FORMAT,...) TDSetNSErrorFor(__func__, ERROR_VAR, FORMAT, ##__VA_ARGS__) + +#if OBJC_API_VERSION >= 2 +#define TDGetClass(obj) object_getClass(obj) +#else +#define TDGetClass(obj) (obj ? obj->isa : Nil) +#endif + +@implementation NSObject (TDNewSwizzle) + ++ (BOOL)td_new_swizzleMethod:(SEL)origSel_ withClass:(Class)altCla_ withMethod:(SEL)altSel_ error:(NSError **)error_ { + Method origMethod = class_getInstanceMethod(self, origSel_); + if (!origMethod) { + TDSetNSError(error_, @"original method %@ not found for class %@", NSStringFromSelector(origSel_), [self class]); + return NO; + } + + Method altMethod = class_getInstanceMethod(altCla_, altSel_); + if (!altMethod) { + TDSetNSError(error_, @"alternate method %@ not found for class %@", NSStringFromSelector(altSel_), [altCla_ class]); + return NO; + } + + class_addMethod(self, + origSel_, + class_getMethodImplementation(self, origSel_), + method_getTypeEncoding(origMethod)); + class_addMethod(altCla_, + altSel_, + class_getMethodImplementation(altCla_, altSel_), + method_getTypeEncoding(altMethod)); + + //交换之前,先对自定义方法进行添加 + BOOL didAddMethod = class_addMethod(self, + altSel_, + method_getImplementation(altMethod), + method_getTypeEncoding(altMethod)); + if (didAddMethod) { + method_exchangeImplementations(origMethod, class_getInstanceMethod(self, altSel_)); + } + return didAddMethod; +} + ++ (BOOL)td_new_swizzleMethod:(SEL)origSel_ withMethod:(SEL)altSel_ error:(NSError **)error_ { +#if OBJC_API_VERSION >= 2 + Method origMethod = class_getInstanceMethod(self, origSel_); + if (!origMethod) { + TDSetNSError(error_, @"original method %@ not found for class %@", NSStringFromSelector(origSel_), [self class]); + return NO; + } + + Method altMethod = class_getInstanceMethod(self, altSel_); + if (!altMethod) { + TDSetNSError(error_, @"alternate method %@ not found for class %@", NSStringFromSelector(altSel_), [self class]); + return NO; + } + + class_addMethod(self, + origSel_, + class_getMethodImplementation(self, origSel_), + method_getTypeEncoding(origMethod)); + class_addMethod(self, + altSel_, + class_getMethodImplementation(self, altSel_), + method_getTypeEncoding(altMethod)); + + method_exchangeImplementations(class_getInstanceMethod(self, origSel_), class_getInstanceMethod(self, altSel_)); + return YES; +#else + // Scan for non-inherited methods. + Method directOriginalMethod = NULL, directAlternateMethod = NULL; + + void *iterator = NULL; + struct objc_method_list *mlist = class_nextMethodList(self, &iterator); + while (mlist) { + int method_index = 0; + for (; method_index < mlist->method_count; method_index++) { + if (mlist->method_list[method_index].method_name == origSel_) { + assert(!directOriginalMethod); + directOriginalMethod = &mlist->method_list[method_index]; + } + if (mlist->method_list[method_index].method_name == altSel_) { + assert(!directAlternateMethod); + directAlternateMethod = &mlist->method_list[method_index]; + } + } + mlist = class_nextMethodList(self, &iterator); + } + + // If either method is inherited, copy it up to the target class to make it non-inherited. + if (!directOriginalMethod || !directAlternateMethod) { + Method inheritedOriginalMethod = NULL, inheritedAlternateMethod = NULL; + if (!directOriginalMethod) { + inheritedOriginalMethod = class_getInstanceMethod(self, origSel_); + if (!inheritedOriginalMethod) { + TDSetNSError(error_, @"original method %@ not found for class %@", NSStringFromSelector(origSel_), [self className]); + return NO; + } + } + if (!directAlternateMethod) { + inheritedAlternateMethod = class_getInstanceMethod(self, altSel_); + if (!inheritedAlternateMethod) { + TDSetNSError(error_, @"alternate method %@ not found for class %@", NSStringFromSelector(altSel_), [self className]); + return NO; + } + } + + int hoisted_method_count = !directOriginalMethod && !directAlternateMethod ? 2 : 1; + struct objc_method_list *hoisted_method_list = malloc(sizeof(struct objc_method_list) + (sizeof(struct objc_method)*(hoisted_method_count-1))); + hoisted_method_list->obsolete = NULL; // soothe valgrind - apparently ObjC runtime accesses this value and it shows as uninitialized in valgrind + hoisted_method_list->method_count = hoisted_method_count; + Method hoisted_method = hoisted_method_list->method_list; + + if (!directOriginalMethod) { + bcopy(inheritedOriginalMethod, hoisted_method, sizeof(struct objc_method)); + directOriginalMethod = hoisted_method++; + } + if (!directAlternateMethod) { + bcopy(inheritedAlternateMethod, hoisted_method, sizeof(struct objc_method)); + directAlternateMethod = hoisted_method; + } + class_addMethods(self, hoisted_method_list); + } + + // Swizzle. + IMP temp = directOriginalMethod->method_imp; + directOriginalMethod->method_imp = directAlternateMethod->method_imp; + directAlternateMethod->method_imp = temp; + + return YES; +#endif +} + ++ (BOOL)td_new_swizzleClassMethod:(SEL)origSel_ withClassMethod:(SEL)altSel_ error:(NSError **)error_ { + return [TDGetClass((id)self) td_new_swizzleMethod:origSel_ withMethod:altSel_ error:error_]; +} + +@end diff --git a/Assets/HCMiniSdk/Third/ta/Plugins/iOS/ThinkingSDK/Source/AppLaunch/NewSwizzle/TDNewSwizzle.m.meta b/Assets/HCMiniSdk/Third/ta/Plugins/iOS/ThinkingSDK/Source/AppLaunch/NewSwizzle/TDNewSwizzle.m.meta new file mode 100644 index 00000000..159ba6a3 --- /dev/null +++ b/Assets/HCMiniSdk/Third/ta/Plugins/iOS/ThinkingSDK/Source/AppLaunch/NewSwizzle/TDNewSwizzle.m.meta @@ -0,0 +1,33 @@ +fileFormatVersion: 2 +guid: d8ab506fca17c4ec1815a15a2b7eb5f7 +PluginImporter: + externalObjects: {} + serializedVersion: 2 + iconMap: {} + executionOrder: {} + defineConstraints: [] + isPreloaded: 0 + isOverridable: 0 + isExplicitlyReferenced: 0 + validateReferences: 1 + platformData: + - first: + Any: + second: + enabled: 0 + settings: {} + - first: + Editor: Editor + second: + enabled: 0 + settings: + DefaultValueInitialized: true + - first: + iPhone: iOS + second: + enabled: 1 + settings: + AddToEmbeddedBinaries: false + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/HCMiniSdk/Third/ta/Plugins/iOS/ThinkingSDK/Source/AppLaunch/TDAppLaunchReason.h b/Assets/HCMiniSdk/Third/ta/Plugins/iOS/ThinkingSDK/Source/AppLaunch/TDAppLaunchReason.h new file mode 100755 index 00000000..e7b6240d --- /dev/null +++ b/Assets/HCMiniSdk/Third/ta/Plugins/iOS/ThinkingSDK/Source/AppLaunch/TDAppLaunchReason.h @@ -0,0 +1,31 @@ +// +// TDAppLaunchReason.h +// ThinkingSDK +// +// Created by wwango on 2021/11/17. +// Copyright © 2021 thinkingdata. All rights reserved. + + +#import + +NS_ASSUME_NONNULL_BEGIN + +static NSDictionary *appPushClickDic; + +@interface TDAppLaunchReason : NSObject + +@property(nonatomic, copy) NSDictionary *appLaunchParams; + ++ (TDAppLaunchReason *)sharedInstance; + +- (void)clearAppLaunchParams; + ++ (void)td_ops_push_click:(NSDictionary *)userInfo; + ++ (NSDictionary*)getAppPushDic; + ++ (void)clearAppPushParams; + +@end + +NS_ASSUME_NONNULL_END diff --git a/Assets/HCMiniSdk/Third/ta/Plugins/iOS/ThinkingSDK/Source/AppLaunch/TDAppLaunchReason.h.meta b/Assets/HCMiniSdk/Third/ta/Plugins/iOS/ThinkingSDK/Source/AppLaunch/TDAppLaunchReason.h.meta new file mode 100644 index 00000000..3658010a --- /dev/null +++ b/Assets/HCMiniSdk/Third/ta/Plugins/iOS/ThinkingSDK/Source/AppLaunch/TDAppLaunchReason.h.meta @@ -0,0 +1,33 @@ +fileFormatVersion: 2 +guid: f37b994396cdc4d7780bcb516fcc6d51 +PluginImporter: + externalObjects: {} + serializedVersion: 2 + iconMap: {} + executionOrder: {} + defineConstraints: [] + isPreloaded: 0 + isOverridable: 0 + isExplicitlyReferenced: 0 + validateReferences: 1 + platformData: + - first: + Any: + second: + enabled: 0 + settings: {} + - first: + Editor: Editor + second: + enabled: 0 + settings: + DefaultValueInitialized: true + - first: + iPhone: iOS + second: + enabled: 1 + settings: + AddToEmbeddedBinaries: false + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/HCMiniSdk/Third/ta/Plugins/iOS/ThinkingSDK/Source/AppLaunch/TDAppLaunchReason.m b/Assets/HCMiniSdk/Third/ta/Plugins/iOS/ThinkingSDK/Source/AppLaunch/TDAppLaunchReason.m new file mode 100755 index 00000000..08d07d17 --- /dev/null +++ b/Assets/HCMiniSdk/Third/ta/Plugins/iOS/ThinkingSDK/Source/AppLaunch/TDAppLaunchReason.m @@ -0,0 +1,177 @@ +// +// TDAppLaunchReason.m +// ThinkingSDK +// +// Created by wwango on 2021/11/17. +// Copyright © 2021 thinkingdata. All rights reserved. +// + +#import "TDAppLaunchReason.h" +#import +#import "TDCommonUtil.h" +#import "TDPresetProperties+TDDisProperties.h" +#import "TDAppState.h" +#import "ThinkingAnalyticsSDKPrivate.h" +#import "TDAppDelegateProxyManager.h" +#import "TAPushClickEvent.h" + +@implementation TDAppLaunchReason + + ++ (void)load { + + [TDPresetProperties disPresetProperties]; + + [[NSNotificationCenter defaultCenter] addObserver:[TDAppLaunchReason sharedInstance] selector:@selector(_applicationDidFinishLaunchingNotification:) name:UIApplicationDidFinishLaunchingNotification object:nil]; + [[NSNotificationCenter defaultCenter] addObserver:[TDAppLaunchReason sharedInstance] selector:@selector(_applicationDidEnterBackgroundNotification:) name:UIApplicationDidEnterBackgroundNotification object:nil]; +} + ++ (void)td_ops_push_click:(NSDictionary *)userInfo { + + @try { + if ([userInfo.allKeys containsObject:@"te_extras"] && [userInfo[@"te_extras"] isKindOfClass:[NSString class]]) { + NSData *jsonData = [userInfo[@"te_extras"] dataUsingEncoding:NSUTF8StringEncoding]; + NSError *err; + NSDictionary *responseDic = [NSJSONSerialization JSONObjectWithData:jsonData options:NSJSONReadingMutableContainers error:&err]; + NSDictionary *opsReceiptProperties = responseDic[@"#ops_receipt_properties"]; + if ([opsReceiptProperties isKindOfClass:[NSString class]]) { + NSString *opsStr = (NSString *)opsReceiptProperties; + opsReceiptProperties = [NSJSONSerialization JSONObjectWithData:[opsStr dataUsingEncoding:NSUTF8StringEncoding] options:NSJSONReadingMutableContainers error:&err]; + } + if (opsReceiptProperties && [opsReceiptProperties isKindOfClass:[NSDictionary class]]) { + NSMutableDictionary *dic = [ThinkingAnalyticsSDK _getAllInstances]; + if(dic == nil || dic.count == 0){ + appPushClickDic = opsReceiptProperties; + }else{ + for (NSString *instanceToken in dic.allKeys) { + ThinkingAnalyticsSDK *instance = dic[instanceToken]; + TAPushClickEvent *pushEvent = [[TAPushClickEvent alloc]initWithName: @"ops_push_click"]; + pushEvent.ops = opsReceiptProperties; + [instance autoTrackWithEvent:pushEvent properties:@{}]; + [instance flush]; + } + } + } + } + } @catch (NSException *exception) { + + } +} + ++ (NSDictionary *)getAppPushDic{ + return appPushClickDic; +} + ++ (void)clearAppPushParams{ + appPushClickDic = nil; +} + ++ (TDAppLaunchReason *)sharedInstance { + static dispatch_once_t onceToken; + static TDAppLaunchReason *appLaunchManager; + + dispatch_once(&onceToken, ^{ + appLaunchManager = [TDAppLaunchReason new]; + }); + return appLaunchManager; +} + +- (void)clearAppLaunchParams { + self.appLaunchParams = @{@"url":@"", + @"data":@{}}; +} + +- (void)_applicationDidEnterBackgroundNotification:(NSNotification *)notification { + [self clearAppLaunchParams]; +} + +// 拦截冷启动和热启动的参数 +- (void)_applicationDidFinishLaunchingNotification:(NSNotification *)notification { + + __weak TDAppLaunchReason *weakSelf = self; + + NSDictionary *launchOptions = notification.userInfo; + NSString *url = [self getInitDeeplink:launchOptions]; + NSDictionary *data = [self getInitData:launchOptions]; + + // 发送推送事件 + if (![TDPresetProperties disableOpsReceiptProperties] && launchOptions) { + NSDictionary *remoteNotification = [launchOptions objectForKey:@"UIApplicationLaunchOptionsRemoteNotificationKey"]; + [TDAppLaunchReason td_ops_push_click:remoteNotification]; + } + + // 记录冷启动启动原因 + if (![TDPresetProperties disableStartReason]) { + + if (!launchOptions) { + [weakSelf clearAppLaunchParams]; + } else if ([url isKindOfClass:[NSString class]] && url.length) { + self.appLaunchParams = @{@"url": [TDCommonUtil string:url], + @"data": @{}}; + } else { + self.appLaunchParams = @{@"url": @"", + @"data": [TDCommonUtil dictionary:data]}; + } + } + + UIApplication *application = [TDAppState sharedApplication]; + id applicationDelegate = [application delegate]; + if (applicationDelegate == nil) + { + return; + } + + if (![TDPresetProperties disableStartReason]) { + [[TDAppDelegateProxyManager defaultManager] proxyNotifications]; + } + + if (![TDPresetProperties disableOpsReceiptProperties]) { + [[TDAppDelegateProxyManager defaultManager] proxyNotifications]; + } +} + +- (NSString *)getInitDeeplink:(NSDictionary *)launchOptions { + + if (!launchOptions || ![launchOptions isKindOfClass:[NSDictionary class]]) { + return @""; + } + + if ([launchOptions isKindOfClass:[NSDictionary class]] && + [launchOptions.allKeys containsObject:UIApplicationLaunchOptionsURLKey]) { + + return launchOptions[UIApplicationLaunchOptionsURLKey]; + + } else if ([launchOptions isKindOfClass:[NSDictionary class]] && + [launchOptions.allKeys containsObject:UIApplicationLaunchOptionsUserActivityDictionaryKey]) { + + NSDictionary *userActivityDictionary = launchOptions[UIApplicationLaunchOptionsUserActivityDictionaryKey]; + NSString *type = userActivityDictionary[UIApplicationLaunchOptionsUserActivityTypeKey]; + if ([type isEqualToString:NSUserActivityTypeBrowsingWeb]) { + NSUserActivity *userActivity = userActivityDictionary[@"UIApplicationLaunchOptionsUserActivityKey"]; + return userActivity.webpageURL.absoluteString; + } + } + return @""; +} + +- (NSDictionary *)getInitData:(NSDictionary *)launchOptions { + + if (!launchOptions || ![launchOptions isKindOfClass:[NSDictionary class]]) { + return @{}; + } + + if ([launchOptions.allKeys containsObject:UIApplicationLaunchOptionsLocalNotificationKey]) { + // 本地推送可能会解析不出alertbody,这里特殊处理一下 + UILocalNotification *notification = launchOptions[UIApplicationLaunchOptionsLocalNotificationKey]; + NSMutableDictionary *properties = [[NSMutableDictionary alloc] init]; + properties[@"alertBody"] = notification.alertBody; + if (@available(iOS 8.2, *)) { + properties[@"alertTitle"] = notification.alertTitle; + } + return properties; + } + + return launchOptions; +} + +@end diff --git a/Assets/HCMiniSdk/Third/ta/Plugins/iOS/ThinkingSDK/Source/AppLaunch/TDAppLaunchReason.m.meta b/Assets/HCMiniSdk/Third/ta/Plugins/iOS/ThinkingSDK/Source/AppLaunch/TDAppLaunchReason.m.meta new file mode 100644 index 00000000..449f7f52 --- /dev/null +++ b/Assets/HCMiniSdk/Third/ta/Plugins/iOS/ThinkingSDK/Source/AppLaunch/TDAppLaunchReason.m.meta @@ -0,0 +1,33 @@ +fileFormatVersion: 2 +guid: 2153a11937bd248f793246e3f848aaab +PluginImporter: + externalObjects: {} + serializedVersion: 2 + iconMap: {} + executionOrder: {} + defineConstraints: [] + isPreloaded: 0 + isOverridable: 0 + isExplicitlyReferenced: 0 + validateReferences: 1 + platformData: + - first: + Any: + second: + enabled: 0 + settings: {} + - first: + Editor: Editor + second: + enabled: 0 + settings: + DefaultValueInitialized: true + - first: + iPhone: iOS + second: + enabled: 1 + settings: + AddToEmbeddedBinaries: false + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/HCMiniSdk/Third/ta/Plugins/iOS/ThinkingSDK/Source/AppLifeCycle.meta b/Assets/HCMiniSdk/Third/ta/Plugins/iOS/ThinkingSDK/Source/AppLifeCycle.meta new file mode 100644 index 00000000..22b708e2 --- /dev/null +++ b/Assets/HCMiniSdk/Third/ta/Plugins/iOS/ThinkingSDK/Source/AppLifeCycle.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: 20131090d388c4844a66a22ba19bcf58 +folderAsset: yes +DefaultImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/HCMiniSdk/Third/ta/Plugins/iOS/ThinkingSDK/Source/AppLifeCycle/TAAppLifeCycle.h b/Assets/HCMiniSdk/Third/ta/Plugins/iOS/ThinkingSDK/Source/AppLifeCycle/TAAppLifeCycle.h new file mode 100755 index 00000000..f63165d2 --- /dev/null +++ b/Assets/HCMiniSdk/Third/ta/Plugins/iOS/ThinkingSDK/Source/AppLifeCycle/TAAppLifeCycle.h @@ -0,0 +1,47 @@ +// +// TAAppLifeCycle.h +// ThinkingSDK +// +// Created by Yangxiongon 2022/6/28. +// + +#import + +NS_ASSUME_NONNULL_BEGIN + +/// APP life cycle +typedef NS_ENUM(NSUInteger, TAAppLifeCycleState) { + TAAppLifeCycleStateInit = 1, // init status + TAAppLifeCycleStateBackgroundStart, + TAAppLifeCycleStateStart, + TAAppLifeCycleStateEnd, + TAAppLifeCycleStateTerminate, +}; + +/// When the life cycle status is about to change, this notification will be sent +/// object: The object is the current life cycle object +/// userInfo: Contains two keys kTAAppLifeCycleNewStateKey and kTAAppLifeCycleOldStateKey +extern NSNotificationName const kTAAppLifeCycleStateWillChangeNotification; + +/// When the life cycle status changes, this notification will be sent +/// object: The object is the current lifecycle object +/// userInfo: Contains two keys kTAAppLifeCycleNewStateKey and kTAAppLifeCycleOldStateKey +extern NSNotificationName const kTAAppLifeCycleStateDidChangeNotification; + +/// In the status change notification, get the new status +extern NSString * const kTAAppLifeCycleNewStateKey; + +/// In the status change notification, get the status before the change +extern NSString * const kTAAppLifeCycleOldStateKey; + +@interface TAAppLifeCycle : NSObject + +@property (nonatomic, assign, readonly) TAAppLifeCycleState state; + ++ (void)startMonitor; + ++ (instancetype)shareInstance; + +@end + +NS_ASSUME_NONNULL_END diff --git a/Assets/HCMiniSdk/Third/ta/Plugins/iOS/ThinkingSDK/Source/AppLifeCycle/TAAppLifeCycle.h.meta b/Assets/HCMiniSdk/Third/ta/Plugins/iOS/ThinkingSDK/Source/AppLifeCycle/TAAppLifeCycle.h.meta new file mode 100644 index 00000000..38ae0567 --- /dev/null +++ b/Assets/HCMiniSdk/Third/ta/Plugins/iOS/ThinkingSDK/Source/AppLifeCycle/TAAppLifeCycle.h.meta @@ -0,0 +1,33 @@ +fileFormatVersion: 2 +guid: 885238a5636ac43b7a9be0bfdd0537b2 +PluginImporter: + externalObjects: {} + serializedVersion: 2 + iconMap: {} + executionOrder: {} + defineConstraints: [] + isPreloaded: 0 + isOverridable: 0 + isExplicitlyReferenced: 0 + validateReferences: 1 + platformData: + - first: + Any: + second: + enabled: 0 + settings: {} + - first: + Editor: Editor + second: + enabled: 0 + settings: + DefaultValueInitialized: true + - first: + iPhone: iOS + second: + enabled: 1 + settings: + AddToEmbeddedBinaries: false + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/HCMiniSdk/Third/ta/Plugins/iOS/ThinkingSDK/Source/AppLifeCycle/TAAppLifeCycle.m b/Assets/HCMiniSdk/Third/ta/Plugins/iOS/ThinkingSDK/Source/AppLifeCycle/TAAppLifeCycle.m new file mode 100755 index 00000000..ee53f7f4 --- /dev/null +++ b/Assets/HCMiniSdk/Third/ta/Plugins/iOS/ThinkingSDK/Source/AppLifeCycle/TAAppLifeCycle.m @@ -0,0 +1,246 @@ +// +// TAAppLifeCycle.m +// ThinkingSDK +// +// Created by Yangxiongon 2022/6/28. +// + +#import "TAAppLifeCycle.h" +#import "TDAppState.h" + +#if TARGET_OS_IOS +#import +#endif + +#if __has_include() +#import +#else +#import "TDLogging.h" +#endif + +NSNotificationName const kTAAppLifeCycleStateWillChangeNotification = @"cn.thinkingdata.TAAppLifeCycleStateWillChange"; +NSNotificationName const kTAAppLifeCycleStateDidChangeNotification = @"cn.thinkingdata.TAAppLifeCycleStateDidChange"; +NSString * const kTAAppLifeCycleNewStateKey = @"new"; +NSString * const kTAAppLifeCycleOldStateKey = @"old"; + + +@interface TAAppLifeCycle () +/// status +@property (nonatomic, assign) TAAppLifeCycleState state; + +@end + +@implementation TAAppLifeCycle + ++ (void)startMonitor { + [TAAppLifeCycle shareInstance]; +} + ++ (instancetype)shareInstance { + static dispatch_once_t onceToken; + static TAAppLifeCycle *appLifeCycle = nil; + dispatch_once(&onceToken, ^{ + appLifeCycle = [[TAAppLifeCycle alloc] init]; + }); + return appLifeCycle; +} + +- (instancetype)init { + self = [super init]; + if (self) { + _state = TAAppLifeCycleStateInit; + [self registerListeners]; + [self setupLaunchedState]; + } + return self; +} + +- (void)dealloc { + [[NSNotificationCenter defaultCenter] removeObserver:self]; +} + +- (void)registerListeners { + if ([TDAppState runningInAppExtension]) { + return; + } + + NSNotificationCenter *notificationCenter = [NSNotificationCenter defaultCenter]; +#if TARGET_OS_IOS + [notificationCenter addObserver:self + selector:@selector(applicationDidBecomeActive:) + name:UIApplicationDidBecomeActiveNotification + object:nil]; + + [notificationCenter addObserver:self + selector:@selector(applicationDidEnterBackground:) + name:UIApplicationDidEnterBackgroundNotification + object:nil]; + + [notificationCenter addObserver:self + selector:@selector(applicationWillTerminate:) + name:UIApplicationWillTerminateNotification + object:nil]; + +#elif TARGET_OS_OSX + +// [notificationCenter addObserver:self +// selector:@selector(applicationDidFinishLaunching:) +// name:NSApplicationDidFinishLaunchingNotification +// object:nil]; +// +// [notificationCenter addObserver:self +// selector:@selector(applicationDidBecomeActive:) +// name:NSApplicationDidBecomeActiveNotification +// object:nil]; +// [notificationCenter addObserver:self +// selector:@selector(applicationDidResignActive:) +// name:NSApplicationDidResignActiveNotification +// object:nil]; +// +// [notificationCenter addObserver:self +// selector:@selector(applicationWillTerminate:) +// name:NSApplicationWillTerminateNotification +// object:nil]; +#endif +} + +- (void)setupLaunchedState { + if ([TDAppState runningInAppExtension]) { + return; + } + + dispatch_block_t mainThreadBlock = ^(){ +#if TARGET_OS_IOS + UIApplication *application = [TDAppState sharedApplication]; + BOOL isAppStateBackground = application.applicationState == UIApplicationStateBackground; +#else + BOOL isAppStateBackground = NO; +#endif + [TDAppState shareInstance].relaunchInBackground = isAppStateBackground; + + self.state = isAppStateBackground ? TAAppLifeCycleStateBackgroundStart : TAAppLifeCycleStateStart; + }; + + if (@available(iOS 13.0, *)) { + // The reason why iOS 13 and above modify the status in the block of the asynchronous main queue:+ + // 1. Make sure that the initialization of the SDK has been completed before sending the appstatus change notification. This can ensure that the public properties have been set when the automatic collection management class sends the app_start event (in fact, it can also be achieved by listening to UIApplicationDidFinishLaunchingNotification) + // 2. In a project that contains SceneDelegate, it is accurate to delay obtaining applicationState (obtaining by listening to UIApplicationDidFinishLaunchingNotification is inaccurate) + dispatch_async(dispatch_get_main_queue(), mainThreadBlock); + } else { + // iOS 13 and below handle background wakeup and cold start (non-delayed initialization) by listening to the notification of UIApplicationDidFinishLaunchingNotification: + // 1. When iOS 13 or later wakes up in the background, the block of the asynchronous main queue will not be executed. So you need to listen to UIApplicationDidFinishLaunchingNotification at the same time + // 2. iOS 13 and below will not contain SceneDelegate +#if TARGET_OS_IOS + [[NSNotificationCenter defaultCenter] addObserver:self + selector:@selector(applicationDidFinishLaunching:) + name:UIApplicationDidFinishLaunchingNotification + object:nil]; +#endif + // Handle cold start below iOS 13, where the client delays initialization. UIApplicationDidFinishLaunchingNotification notification has been missed when lazy initialization + dispatch_async(dispatch_get_main_queue(), mainThreadBlock); + } +} + +//MARK: - Notification Action + +- (void)applicationDidFinishLaunching:(NSNotification *)notification { +#if TARGET_OS_IOS + UIApplication *application = [TDAppState sharedApplication]; + BOOL isAppStateBackground = application.applicationState == UIApplicationStateBackground; +#else + BOOL isAppStateBackground = NO; +#endif + + [TDAppState shareInstance].relaunchInBackground = isAppStateBackground; + + self.state = isAppStateBackground ? TAAppLifeCycleStateBackgroundStart : TAAppLifeCycleStateStart; +} + +- (void)applicationDidBecomeActive:(NSNotification *)notification { + TDLogDebug(@"application did become active"); + +#if TARGET_OS_IOS + if (![notification.object isKindOfClass:[UIApplication class]]) { + return; + } + + UIApplication *application = (UIApplication *)notification.object; + if (application.applicationState != UIApplicationStateActive) { + return; + } +#elif TARGET_OS_OSX + if (![notification.object isKindOfClass:[NSApplication class]]) { + return; + } + + NSApplication *application = (NSApplication *)notification.object; + if (!application.isActive) { + return; + } +#endif + + [TDAppState shareInstance].relaunchInBackground = NO; + + self.state = TAAppLifeCycleStateStart; +} + +#if TARGET_OS_IOS +- (void)applicationDidEnterBackground:(NSNotification *)notification { + TDLogDebug(@"application did enter background"); + + if (![notification.object isKindOfClass:[UIApplication class]]) { + return; + } + + UIApplication *application = (UIApplication *)notification.object; + if (application.applicationState != UIApplicationStateBackground) { + return; + } + + self.state = TAAppLifeCycleStateEnd; +} + +#elif TARGET_OS_OSX +- (void)applicationDidResignActive:(NSNotification *)notification { + TDLogDebug(@"application did resignActive"); + + if (![notification.object isKindOfClass:[NSApplication class]]) { + return; + } + + NSApplication *application = (NSApplication *)notification.object; + if (application.isActive) { + return; + } + self.state = TAAppLifeCycleStateEnd; +} +#endif + +- (void)applicationWillTerminate:(NSNotification *)notification { + TDLogDebug(@"application will terminate"); + + self.state = TAAppLifeCycleStateTerminate; +} + +//MARK: - Setter + +- (void)setState:(TAAppLifeCycleState)state { + + if (_state == state) { + return; + } + + [TDAppState shareInstance].isActive = (state == TAAppLifeCycleStateStart); + + NSMutableDictionary *userInfo = [NSMutableDictionary dictionaryWithCapacity:2]; + userInfo[kTAAppLifeCycleNewStateKey] = @(state); + userInfo[kTAAppLifeCycleOldStateKey] = @(_state); + + [[NSNotificationCenter defaultCenter] postNotificationName:kTAAppLifeCycleStateWillChangeNotification object:self userInfo:userInfo]; + + _state = state; + + [[NSNotificationCenter defaultCenter] postNotificationName:kTAAppLifeCycleStateDidChangeNotification object:self userInfo:userInfo]; +} + +@end diff --git a/Assets/HCMiniSdk/Third/ta/Plugins/iOS/ThinkingSDK/Source/AppLifeCycle/TAAppLifeCycle.m.meta b/Assets/HCMiniSdk/Third/ta/Plugins/iOS/ThinkingSDK/Source/AppLifeCycle/TAAppLifeCycle.m.meta new file mode 100644 index 00000000..7452b334 --- /dev/null +++ b/Assets/HCMiniSdk/Third/ta/Plugins/iOS/ThinkingSDK/Source/AppLifeCycle/TAAppLifeCycle.m.meta @@ -0,0 +1,33 @@ +fileFormatVersion: 2 +guid: 90a768aa97d9f4a67a459208b6dc419f +PluginImporter: + externalObjects: {} + serializedVersion: 2 + iconMap: {} + executionOrder: {} + defineConstraints: [] + isPreloaded: 0 + isOverridable: 0 + isExplicitlyReferenced: 0 + validateReferences: 1 + platformData: + - first: + Any: + second: + enabled: 0 + settings: {} + - first: + Editor: Editor + second: + enabled: 0 + settings: + DefaultValueInitialized: true + - first: + iPhone: iOS + second: + enabled: 1 + settings: + AddToEmbeddedBinaries: false + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/HCMiniSdk/Third/ta/Plugins/iOS/ThinkingSDK/Source/AppLifeCycle/TDAppState.h b/Assets/HCMiniSdk/Third/ta/Plugins/iOS/ThinkingSDK/Source/AppLifeCycle/TDAppState.h new file mode 100755 index 00000000..c1053ac5 --- /dev/null +++ b/Assets/HCMiniSdk/Third/ta/Plugins/iOS/ThinkingSDK/Source/AppLifeCycle/TDAppState.h @@ -0,0 +1,28 @@ +// +// TDAppState.h +// ThinkingSDK +// +// Created by wwango on 2021/9/24. +// Copyright © 2021 thinkingdata. All rights reserved. +// + +#import + +NS_ASSUME_NONNULL_BEGIN + +@interface TDAppState : NSObject +/// Whether to start in the background. When the app is woken up by silently pushing the background, or when the location change wakes up the app, value = YES. (thread safe) +@property (atomic, assign) BOOL relaunchInBackground; + +/// Whether the current app is in the foreground +@property (atomic, assign) BOOL isActive; + ++ (instancetype)shareInstance; + ++ (id)sharedApplication; + ++ (BOOL)runningInAppExtension; + +@end + +NS_ASSUME_NONNULL_END diff --git a/Assets/HCMiniSdk/Third/ta/Plugins/iOS/ThinkingSDK/Source/AppLifeCycle/TDAppState.h.meta b/Assets/HCMiniSdk/Third/ta/Plugins/iOS/ThinkingSDK/Source/AppLifeCycle/TDAppState.h.meta new file mode 100644 index 00000000..501b9ecd --- /dev/null +++ b/Assets/HCMiniSdk/Third/ta/Plugins/iOS/ThinkingSDK/Source/AppLifeCycle/TDAppState.h.meta @@ -0,0 +1,33 @@ +fileFormatVersion: 2 +guid: bfe06ac7bb20d44f4b38427283e52402 +PluginImporter: + externalObjects: {} + serializedVersion: 2 + iconMap: {} + executionOrder: {} + defineConstraints: [] + isPreloaded: 0 + isOverridable: 0 + isExplicitlyReferenced: 0 + validateReferences: 1 + platformData: + - first: + Any: + second: + enabled: 0 + settings: {} + - first: + Editor: Editor + second: + enabled: 0 + settings: + DefaultValueInitialized: true + - first: + iPhone: iOS + second: + enabled: 1 + settings: + AddToEmbeddedBinaries: false + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/HCMiniSdk/Third/ta/Plugins/iOS/ThinkingSDK/Source/AppLifeCycle/TDAppState.m b/Assets/HCMiniSdk/Third/ta/Plugins/iOS/ThinkingSDK/Source/AppLifeCycle/TDAppState.m new file mode 100755 index 00000000..f1427bbd --- /dev/null +++ b/Assets/HCMiniSdk/Third/ta/Plugins/iOS/ThinkingSDK/Source/AppLifeCycle/TDAppState.m @@ -0,0 +1,48 @@ +// +// TDAppState.m +// ThinkingSDK +// +// Created by wwango on 2021/9/24. +// Copyright © 2021 thinkingdata. All rights reserved. +// + +#import "TDAppState.h" + +#if TARGET_OS_IOS +#import +#endif + +NSString *_td_lastKnownState; + +@implementation TDAppState + ++ (instancetype)shareInstance { + static dispatch_once_t onceToken; + static TDAppState *appState; + dispatch_once(&onceToken, ^{ + appState = [TDAppState new]; + }); + return appState; +} + ++ (id)sharedApplication { + +#if TARGET_OS_IOS + + if ([self runningInAppExtension]) { + return nil; + } + return [[UIApplication class] performSelector:@selector(sharedApplication)]; + +#endif + return nil; +} + ++ (BOOL)runningInAppExtension { +#if TARGET_OS_IOS + return [[[[NSBundle mainBundle] bundlePath] pathExtension] isEqualToString:@"appex"]; +#endif + return NO; +} + +@end diff --git a/Assets/HCMiniSdk/Third/ta/Plugins/iOS/ThinkingSDK/Source/AppLifeCycle/TDAppState.m.meta b/Assets/HCMiniSdk/Third/ta/Plugins/iOS/ThinkingSDK/Source/AppLifeCycle/TDAppState.m.meta new file mode 100644 index 00000000..eb2d9d07 --- /dev/null +++ b/Assets/HCMiniSdk/Third/ta/Plugins/iOS/ThinkingSDK/Source/AppLifeCycle/TDAppState.m.meta @@ -0,0 +1,33 @@ +fileFormatVersion: 2 +guid: 439283b9eaf2e4d26883e97a319af143 +PluginImporter: + externalObjects: {} + serializedVersion: 2 + iconMap: {} + executionOrder: {} + defineConstraints: [] + isPreloaded: 0 + isOverridable: 0 + isExplicitlyReferenced: 0 + validateReferences: 1 + platformData: + - first: + Any: + second: + enabled: 0 + settings: {} + - first: + Editor: Editor + second: + enabled: 0 + settings: + DefaultValueInitialized: true + - first: + iPhone: iOS + second: + enabled: 1 + settings: + AddToEmbeddedBinaries: false + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/HCMiniSdk/Third/ta/Plugins/iOS/ThinkingSDK/Source/AutoTrack.meta b/Assets/HCMiniSdk/Third/ta/Plugins/iOS/ThinkingSDK/Source/AutoTrack.meta new file mode 100644 index 00000000..db0bd642 --- /dev/null +++ b/Assets/HCMiniSdk/Third/ta/Plugins/iOS/ThinkingSDK/Source/AutoTrack.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: d1b5729d7c0b24bddbf39df25636523b +folderAsset: yes +DefaultImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/HCMiniSdk/Third/ta/Plugins/iOS/ThinkingSDK/Source/AutoTrack/Event.meta b/Assets/HCMiniSdk/Third/ta/Plugins/iOS/ThinkingSDK/Source/AutoTrack/Event.meta new file mode 100644 index 00000000..66b5b3d4 --- /dev/null +++ b/Assets/HCMiniSdk/Third/ta/Plugins/iOS/ThinkingSDK/Source/AutoTrack/Event.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: 60e81b49c2ab941b48f1746f0b7f409d +folderAsset: yes +DefaultImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/HCMiniSdk/Third/ta/Plugins/iOS/ThinkingSDK/Source/AutoTrack/Event/TAAppEndEvent.h b/Assets/HCMiniSdk/Third/ta/Plugins/iOS/ThinkingSDK/Source/AutoTrack/Event/TAAppEndEvent.h new file mode 100755 index 00000000..443ec956 --- /dev/null +++ b/Assets/HCMiniSdk/Third/ta/Plugins/iOS/ThinkingSDK/Source/AutoTrack/Event/TAAppEndEvent.h @@ -0,0 +1,17 @@ +// +// TAAppEndEvent.h +// ThinkingSDK +// +// Created by Yangxiongon 2022/6/17. +// + +#import "TAAutoTrackEvent.h" + +NS_ASSUME_NONNULL_BEGIN + +@interface TAAppEndEvent : TAAutoTrackEvent +@property (nonatomic, copy) NSString *screenName; + +@end + +NS_ASSUME_NONNULL_END diff --git a/Assets/HCMiniSdk/Third/ta/Plugins/iOS/ThinkingSDK/Source/AutoTrack/Event/TAAppEndEvent.h.meta b/Assets/HCMiniSdk/Third/ta/Plugins/iOS/ThinkingSDK/Source/AutoTrack/Event/TAAppEndEvent.h.meta new file mode 100644 index 00000000..097bbeb8 --- /dev/null +++ b/Assets/HCMiniSdk/Third/ta/Plugins/iOS/ThinkingSDK/Source/AutoTrack/Event/TAAppEndEvent.h.meta @@ -0,0 +1,33 @@ +fileFormatVersion: 2 +guid: ab91a24abdc494f7b8c0862a2b45cce3 +PluginImporter: + externalObjects: {} + serializedVersion: 2 + iconMap: {} + executionOrder: {} + defineConstraints: [] + isPreloaded: 0 + isOverridable: 0 + isExplicitlyReferenced: 0 + validateReferences: 1 + platformData: + - first: + Any: + second: + enabled: 0 + settings: {} + - first: + Editor: Editor + second: + enabled: 0 + settings: + DefaultValueInitialized: true + - first: + iPhone: iOS + second: + enabled: 1 + settings: + AddToEmbeddedBinaries: false + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/HCMiniSdk/Third/ta/Plugins/iOS/ThinkingSDK/Source/AutoTrack/Event/TAAppEndEvent.m b/Assets/HCMiniSdk/Third/ta/Plugins/iOS/ThinkingSDK/Source/AutoTrack/Event/TAAppEndEvent.m new file mode 100755 index 00000000..eb1f866e --- /dev/null +++ b/Assets/HCMiniSdk/Third/ta/Plugins/iOS/ThinkingSDK/Source/AutoTrack/Event/TAAppEndEvent.m @@ -0,0 +1,23 @@ +// +// TAAppEndEvent.m +// ThinkingSDK +// +// Created by Yangxiongon 2022/6/17. +// + +#import "TAAppEndEvent.h" +#import "TDPresetProperties+TDDisProperties.h" + +@implementation TAAppEndEvent + +- (NSMutableDictionary *)jsonObject { + NSMutableDictionary *dict = [super jsonObject]; + + if (![TDPresetProperties disableScreenName]) { + self.properties[@"#screen_name"] = self.screenName ?: @""; + } + + return dict; +} + +@end diff --git a/Assets/HCMiniSdk/Third/ta/Plugins/iOS/ThinkingSDK/Source/AutoTrack/Event/TAAppEndEvent.m.meta b/Assets/HCMiniSdk/Third/ta/Plugins/iOS/ThinkingSDK/Source/AutoTrack/Event/TAAppEndEvent.m.meta new file mode 100644 index 00000000..f9cc0725 --- /dev/null +++ b/Assets/HCMiniSdk/Third/ta/Plugins/iOS/ThinkingSDK/Source/AutoTrack/Event/TAAppEndEvent.m.meta @@ -0,0 +1,33 @@ +fileFormatVersion: 2 +guid: 294d54bcf09bf453c8bf7febc52d1dcb +PluginImporter: + externalObjects: {} + serializedVersion: 2 + iconMap: {} + executionOrder: {} + defineConstraints: [] + isPreloaded: 0 + isOverridable: 0 + isExplicitlyReferenced: 0 + validateReferences: 1 + platformData: + - first: + Any: + second: + enabled: 0 + settings: {} + - first: + Editor: Editor + second: + enabled: 0 + settings: + DefaultValueInitialized: true + - first: + iPhone: iOS + second: + enabled: 1 + settings: + AddToEmbeddedBinaries: false + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/HCMiniSdk/Third/ta/Plugins/iOS/ThinkingSDK/Source/AutoTrack/Event/TAAppStartEvent.h b/Assets/HCMiniSdk/Third/ta/Plugins/iOS/ThinkingSDK/Source/AutoTrack/Event/TAAppStartEvent.h new file mode 100755 index 00000000..8c61e3db --- /dev/null +++ b/Assets/HCMiniSdk/Third/ta/Plugins/iOS/ThinkingSDK/Source/AutoTrack/Event/TAAppStartEvent.h @@ -0,0 +1,19 @@ +// +// TAAppStartEvent.h +// ThinkingSDK +// +// Created by Yangxiongon 2022/6/17. +// + +#import "TAAutoTrackEvent.h" + +NS_ASSUME_NONNULL_BEGIN + +@interface TAAppStartEvent : TAAutoTrackEvent +@property (nonatomic, copy) NSString *startReason; +@property (nonatomic, assign) BOOL resumeFromBackground; + + +@end + +NS_ASSUME_NONNULL_END diff --git a/Assets/HCMiniSdk/Third/ta/Plugins/iOS/ThinkingSDK/Source/AutoTrack/Event/TAAppStartEvent.h.meta b/Assets/HCMiniSdk/Third/ta/Plugins/iOS/ThinkingSDK/Source/AutoTrack/Event/TAAppStartEvent.h.meta new file mode 100644 index 00000000..9721a05f --- /dev/null +++ b/Assets/HCMiniSdk/Third/ta/Plugins/iOS/ThinkingSDK/Source/AutoTrack/Event/TAAppStartEvent.h.meta @@ -0,0 +1,33 @@ +fileFormatVersion: 2 +guid: 77af5449a173c4d05aa967435187b647 +PluginImporter: + externalObjects: {} + serializedVersion: 2 + iconMap: {} + executionOrder: {} + defineConstraints: [] + isPreloaded: 0 + isOverridable: 0 + isExplicitlyReferenced: 0 + validateReferences: 1 + platformData: + - first: + Any: + second: + enabled: 0 + settings: {} + - first: + Editor: Editor + second: + enabled: 0 + settings: + DefaultValueInitialized: true + - first: + iPhone: iOS + second: + enabled: 1 + settings: + AddToEmbeddedBinaries: false + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/HCMiniSdk/Third/ta/Plugins/iOS/ThinkingSDK/Source/AutoTrack/Event/TAAppStartEvent.m b/Assets/HCMiniSdk/Third/ta/Plugins/iOS/ThinkingSDK/Source/AutoTrack/Event/TAAppStartEvent.m new file mode 100755 index 00000000..92fdad51 --- /dev/null +++ b/Assets/HCMiniSdk/Third/ta/Plugins/iOS/ThinkingSDK/Source/AutoTrack/Event/TAAppStartEvent.m @@ -0,0 +1,27 @@ +// +// TAAppStartEvent.m +// ThinkingSDK +// +// Created by Yangxiongon 2022/6/17. +// + +#import "TAAppStartEvent.h" +#import +#import "TDPresetProperties+TDDisProperties.h" + +@implementation TAAppStartEvent + +- (NSMutableDictionary *)jsonObject { + NSMutableDictionary *dict = [super jsonObject]; + + if (![TDPresetProperties disableResumeFromBackground]) { + self.properties[@"#resume_from_background"] = @(self.resumeFromBackground); + } + if (![TDPresetProperties disableStartReason]) { + self.properties[@"#start_reason"] = self.startReason; + } + + return dict; +} + +@end diff --git a/Assets/HCMiniSdk/Third/ta/Plugins/iOS/ThinkingSDK/Source/AutoTrack/Event/TAAppStartEvent.m.meta b/Assets/HCMiniSdk/Third/ta/Plugins/iOS/ThinkingSDK/Source/AutoTrack/Event/TAAppStartEvent.m.meta new file mode 100644 index 00000000..e5848742 --- /dev/null +++ b/Assets/HCMiniSdk/Third/ta/Plugins/iOS/ThinkingSDK/Source/AutoTrack/Event/TAAppStartEvent.m.meta @@ -0,0 +1,33 @@ +fileFormatVersion: 2 +guid: 1294c9d002c2c4f879fcc49269cbc7e9 +PluginImporter: + externalObjects: {} + serializedVersion: 2 + iconMap: {} + executionOrder: {} + defineConstraints: [] + isPreloaded: 0 + isOverridable: 0 + isExplicitlyReferenced: 0 + validateReferences: 1 + platformData: + - first: + Any: + second: + enabled: 0 + settings: {} + - first: + Editor: Editor + second: + enabled: 0 + settings: + DefaultValueInitialized: true + - first: + iPhone: iOS + second: + enabled: 1 + settings: + AddToEmbeddedBinaries: false + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/HCMiniSdk/Third/ta/Plugins/iOS/ThinkingSDK/Source/AutoTrack/Event/TAAutoClickEvent.h b/Assets/HCMiniSdk/Third/ta/Plugins/iOS/ThinkingSDK/Source/AutoTrack/Event/TAAutoClickEvent.h new file mode 100755 index 00000000..0ec76bba --- /dev/null +++ b/Assets/HCMiniSdk/Third/ta/Plugins/iOS/ThinkingSDK/Source/AutoTrack/Event/TAAutoClickEvent.h @@ -0,0 +1,22 @@ +// +// TAAutoClickEvent.h +// ThinkingSDK +// +// Created by Yangxiongon 2022/6/15. +// + +#import "TAAutoTrackEvent.h" + +NS_ASSUME_NONNULL_BEGIN + +@interface TAAutoClickEvent : TAAutoTrackEvent +@property (nonatomic, copy) NSString *elementId; +@property (nonatomic, copy) NSString *elementContent; +@property (nonatomic, copy) NSString *elementType; +@property (nonatomic, copy) NSString *elementPosition; +@property (nonatomic, copy) NSString *pageTitle; +@property (nonatomic, copy) NSString *screenName; + +@end + +NS_ASSUME_NONNULL_END diff --git a/Assets/HCMiniSdk/Third/ta/Plugins/iOS/ThinkingSDK/Source/AutoTrack/Event/TAAutoClickEvent.h.meta b/Assets/HCMiniSdk/Third/ta/Plugins/iOS/ThinkingSDK/Source/AutoTrack/Event/TAAutoClickEvent.h.meta new file mode 100644 index 00000000..97ccb3b9 --- /dev/null +++ b/Assets/HCMiniSdk/Third/ta/Plugins/iOS/ThinkingSDK/Source/AutoTrack/Event/TAAutoClickEvent.h.meta @@ -0,0 +1,33 @@ +fileFormatVersion: 2 +guid: e0b6e9b4fa84e40ffa4799dd7aed576d +PluginImporter: + externalObjects: {} + serializedVersion: 2 + iconMap: {} + executionOrder: {} + defineConstraints: [] + isPreloaded: 0 + isOverridable: 0 + isExplicitlyReferenced: 0 + validateReferences: 1 + platformData: + - first: + Any: + second: + enabled: 0 + settings: {} + - first: + Editor: Editor + second: + enabled: 0 + settings: + DefaultValueInitialized: true + - first: + iPhone: iOS + second: + enabled: 1 + settings: + AddToEmbeddedBinaries: false + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/HCMiniSdk/Third/ta/Plugins/iOS/ThinkingSDK/Source/AutoTrack/Event/TAAutoClickEvent.m b/Assets/HCMiniSdk/Third/ta/Plugins/iOS/ThinkingSDK/Source/AutoTrack/Event/TAAutoClickEvent.m new file mode 100755 index 00000000..7db74b00 --- /dev/null +++ b/Assets/HCMiniSdk/Third/ta/Plugins/iOS/ThinkingSDK/Source/AutoTrack/Event/TAAutoClickEvent.m @@ -0,0 +1,38 @@ +// +// TAAutoClickEvent.m +// ThinkingSDK +// +// Created by Yangxiongon 2022/6/15. +// + +#import "TAAutoClickEvent.h" +#import "TDPresetProperties+TDDisProperties.h" + +@implementation TAAutoClickEvent + +- (NSMutableDictionary *)jsonObject { + NSMutableDictionary *dict = [super jsonObject]; + + if (![TDPresetProperties disableScreenName]) { + self.properties[@"#screen_name"] = self.screenName; + } + if (![TDPresetProperties disableElementId]) { + self.properties[@"#element_id"] = self.elementId; + } + if (![TDPresetProperties disableElementType]) { + self.properties[@"#element_type"] = self.elementType; + } + if (![TDPresetProperties disableElementContent]) { + self.properties[@"#element_content"] = self.elementContent; + } + if (![TDPresetProperties disableElementPosition]) { + self.properties[@"#element_position"] = self.elementPosition; + } + if (![TDPresetProperties disableTitle]) { + self.properties[@"#title"] = self.pageTitle; + } + + return dict; +} + +@end diff --git a/Assets/HCMiniSdk/Third/ta/Plugins/iOS/ThinkingSDK/Source/AutoTrack/Event/TAAutoClickEvent.m.meta b/Assets/HCMiniSdk/Third/ta/Plugins/iOS/ThinkingSDK/Source/AutoTrack/Event/TAAutoClickEvent.m.meta new file mode 100644 index 00000000..dbe6e374 --- /dev/null +++ b/Assets/HCMiniSdk/Third/ta/Plugins/iOS/ThinkingSDK/Source/AutoTrack/Event/TAAutoClickEvent.m.meta @@ -0,0 +1,33 @@ +fileFormatVersion: 2 +guid: 22c8f205dbc9a492db570c08357cab4f +PluginImporter: + externalObjects: {} + serializedVersion: 2 + iconMap: {} + executionOrder: {} + defineConstraints: [] + isPreloaded: 0 + isOverridable: 0 + isExplicitlyReferenced: 0 + validateReferences: 1 + platformData: + - first: + Any: + second: + enabled: 0 + settings: {} + - first: + Editor: Editor + second: + enabled: 0 + settings: + DefaultValueInitialized: true + - first: + iPhone: iOS + second: + enabled: 1 + settings: + AddToEmbeddedBinaries: false + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/HCMiniSdk/Third/ta/Plugins/iOS/ThinkingSDK/Source/AutoTrack/Event/TAAutoPageViewEvent.h b/Assets/HCMiniSdk/Third/ta/Plugins/iOS/ThinkingSDK/Source/AutoTrack/Event/TAAutoPageViewEvent.h new file mode 100755 index 00000000..ae1b2bc8 --- /dev/null +++ b/Assets/HCMiniSdk/Third/ta/Plugins/iOS/ThinkingSDK/Source/AutoTrack/Event/TAAutoPageViewEvent.h @@ -0,0 +1,20 @@ +// +// TAAutoPageViewEvent.h +// ThinkingSDK +// +// Created by Yangxiongon 2022/6/15. +// + +#import "TAAutoTrackEvent.h" + +NS_ASSUME_NONNULL_BEGIN + +@interface TAAutoPageViewEvent : TAAutoTrackEvent +@property (nonatomic, copy) NSString *pageUrl; +@property (nonatomic, copy) NSString *referrer; +@property (nonatomic, copy) NSString *pageTitle; +@property (nonatomic, copy) NSString *screenName; + +@end + +NS_ASSUME_NONNULL_END diff --git a/Assets/HCMiniSdk/Third/ta/Plugins/iOS/ThinkingSDK/Source/AutoTrack/Event/TAAutoPageViewEvent.h.meta b/Assets/HCMiniSdk/Third/ta/Plugins/iOS/ThinkingSDK/Source/AutoTrack/Event/TAAutoPageViewEvent.h.meta new file mode 100644 index 00000000..32da605b --- /dev/null +++ b/Assets/HCMiniSdk/Third/ta/Plugins/iOS/ThinkingSDK/Source/AutoTrack/Event/TAAutoPageViewEvent.h.meta @@ -0,0 +1,33 @@ +fileFormatVersion: 2 +guid: dfeb4b3d07e4d4c0e89b139b8d7e4184 +PluginImporter: + externalObjects: {} + serializedVersion: 2 + iconMap: {} + executionOrder: {} + defineConstraints: [] + isPreloaded: 0 + isOverridable: 0 + isExplicitlyReferenced: 0 + validateReferences: 1 + platformData: + - first: + Any: + second: + enabled: 0 + settings: {} + - first: + Editor: Editor + second: + enabled: 0 + settings: + DefaultValueInitialized: true + - first: + iPhone: iOS + second: + enabled: 1 + settings: + AddToEmbeddedBinaries: false + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/HCMiniSdk/Third/ta/Plugins/iOS/ThinkingSDK/Source/AutoTrack/Event/TAAutoPageViewEvent.m b/Assets/HCMiniSdk/Third/ta/Plugins/iOS/ThinkingSDK/Source/AutoTrack/Event/TAAutoPageViewEvent.m new file mode 100755 index 00000000..f38b51d0 --- /dev/null +++ b/Assets/HCMiniSdk/Third/ta/Plugins/iOS/ThinkingSDK/Source/AutoTrack/Event/TAAutoPageViewEvent.m @@ -0,0 +1,31 @@ +// +// TAAutoPageViewEvent.m +// ThinkingSDK +// +// Created by Yangxiongon 2022/6/15. +// + +#import "TAAutoPageViewEvent.h" +#import "TDPresetProperties+TDDisProperties.h" + +@implementation TAAutoPageViewEvent + +- (NSMutableDictionary *)jsonObject { + NSMutableDictionary *dict = [super jsonObject]; + + if (![TDPresetProperties disableScreenName]) { + self.properties[@"#screen_name"] = self.screenName; + } + if (![TDPresetProperties disableTitle]) { + self.properties[@"#title"] = self.pageTitle; + } + if (![TDPresetProperties disableUrl]) { + self.properties[@"#url"] = self.pageUrl; + } + if (![TDPresetProperties disableReferrer]) { + self.properties[@"#referrer"] = self.referrer; + } + return dict; +} + +@end diff --git a/Assets/HCMiniSdk/Third/ta/Plugins/iOS/ThinkingSDK/Source/AutoTrack/Event/TAAutoPageViewEvent.m.meta b/Assets/HCMiniSdk/Third/ta/Plugins/iOS/ThinkingSDK/Source/AutoTrack/Event/TAAutoPageViewEvent.m.meta new file mode 100644 index 00000000..310a5c56 --- /dev/null +++ b/Assets/HCMiniSdk/Third/ta/Plugins/iOS/ThinkingSDK/Source/AutoTrack/Event/TAAutoPageViewEvent.m.meta @@ -0,0 +1,33 @@ +fileFormatVersion: 2 +guid: 2c0bed1add07542e6bcf1fda661ce0d5 +PluginImporter: + externalObjects: {} + serializedVersion: 2 + iconMap: {} + executionOrder: {} + defineConstraints: [] + isPreloaded: 0 + isOverridable: 0 + isExplicitlyReferenced: 0 + validateReferences: 1 + platformData: + - first: + Any: + second: + enabled: 0 + settings: {} + - first: + Editor: Editor + second: + enabled: 0 + settings: + DefaultValueInitialized: true + - first: + iPhone: iOS + second: + enabled: 1 + settings: + AddToEmbeddedBinaries: false + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/HCMiniSdk/Third/ta/Plugins/iOS/ThinkingSDK/Source/AutoTrack/Event/TAAutoTrackEvent.h b/Assets/HCMiniSdk/Third/ta/Plugins/iOS/ThinkingSDK/Source/AutoTrack/Event/TAAutoTrackEvent.h new file mode 100755 index 00000000..b49d549b --- /dev/null +++ b/Assets/HCMiniSdk/Third/ta/Plugins/iOS/ThinkingSDK/Source/AutoTrack/Event/TAAutoTrackEvent.h @@ -0,0 +1,26 @@ +// +// TAAutoTrackEvent.h +// ThinkingSDK +// +// Created by Yangxiongon 2022/6/15. +// + +#import "TATrackEvent.h" +#import "TDConstant.h" + +NS_ASSUME_NONNULL_BEGIN + +@interface TAAutoTrackEvent : TATrackEvent + +/// It is used to record the dynamic public properties of automatic collection events. The dynamic public properties need to be obtained in the current thread where the event occurs +@property (nonatomic, strong) NSDictionary *autoDynamicSuperProperties; + +/// Static public property for logging autocollection events +@property (nonatomic, strong) NSDictionary *autoSuperProperties; + +/// Returns the automatic collection type +- (ThinkingAnalyticsAutoTrackEventType)autoTrackEventType; + +@end + +NS_ASSUME_NONNULL_END diff --git a/Assets/HCMiniSdk/Third/ta/Plugins/iOS/ThinkingSDK/Source/AutoTrack/Event/TAAutoTrackEvent.h.meta b/Assets/HCMiniSdk/Third/ta/Plugins/iOS/ThinkingSDK/Source/AutoTrack/Event/TAAutoTrackEvent.h.meta new file mode 100644 index 00000000..f8402e4d --- /dev/null +++ b/Assets/HCMiniSdk/Third/ta/Plugins/iOS/ThinkingSDK/Source/AutoTrack/Event/TAAutoTrackEvent.h.meta @@ -0,0 +1,33 @@ +fileFormatVersion: 2 +guid: debe332a658c34f4a97564ba712921a6 +PluginImporter: + externalObjects: {} + serializedVersion: 2 + iconMap: {} + executionOrder: {} + defineConstraints: [] + isPreloaded: 0 + isOverridable: 0 + isExplicitlyReferenced: 0 + validateReferences: 1 + platformData: + - first: + Any: + second: + enabled: 0 + settings: {} + - first: + Editor: Editor + second: + enabled: 0 + settings: + DefaultValueInitialized: true + - first: + iPhone: iOS + second: + enabled: 1 + settings: + AddToEmbeddedBinaries: false + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/HCMiniSdk/Third/ta/Plugins/iOS/ThinkingSDK/Source/AutoTrack/Event/TAAutoTrackEvent.m b/Assets/HCMiniSdk/Third/ta/Plugins/iOS/ThinkingSDK/Source/AutoTrack/Event/TAAutoTrackEvent.m new file mode 100755 index 00000000..970a2246 --- /dev/null +++ b/Assets/HCMiniSdk/Third/ta/Plugins/iOS/ThinkingSDK/Source/AutoTrack/Event/TAAutoTrackEvent.m @@ -0,0 +1,58 @@ +// +// TAAutoTrackEvent.m +// ThinkingSDK +// +// Created by Yangxiongon 2022/6/15. +// + +#import "TAAutoTrackEvent.h" +#import "ThinkingAnalyticsSDKPrivate.h" +#import "TDPresetProperties+TDDisProperties.h" + +@implementation TAAutoTrackEvent + +- (NSMutableDictionary *)jsonObject { + NSMutableDictionary *dict = [super jsonObject]; + // Reprocess the duration of automatic collection events, mainly app_start, app_end + // app_start app_end events are collected by the automatic collection management class. There are the following problems: the automatic collection management class and the timeTracker event duration management class are processed by listening to appLifeCycle notifications, so they are not at a precise and unified time point. There will be small errors that need to be eliminated. + // After testing, the error is less than 0.01s. + CGFloat minDuration = 0.01; + if (![TDPresetProperties disableDuration]) { + if (self.foregroundDuration > minDuration) { + self.properties[@"#duration"] = @([NSString stringWithFormat:@"%.3f", self.foregroundDuration].floatValue); + } + } + if (![TDPresetProperties disableBackgroundDuration]) { + if (self.backgroundDuration > minDuration) { + self.properties[@"#background_duration"] = @([NSString stringWithFormat:@"%.3f", self.backgroundDuration].floatValue); + } + } + + return dict; +} + +- (ThinkingAnalyticsAutoTrackEventType)autoTrackEventType { + if ([self.eventName isEqualToString:TD_APP_START_EVENT]) { + return ThinkingAnalyticsEventTypeAppStart; + } else if ([self.eventName isEqualToString:TD_APP_START_BACKGROUND_EVENT]) { + return ThinkingAnalyticsEventTypeAppStart; + } else if ([self.eventName isEqualToString:TD_APP_END_EVENT]) { + return ThinkingAnalyticsEventTypeAppEnd; + } else if ([self.eventName isEqualToString:TD_APP_VIEW_EVENT]) { + return ThinkingAnalyticsEventTypeAppViewScreen; + } else if ([self.eventName isEqualToString:TD_APP_CLICK_EVENT]) { + return ThinkingAnalyticsEventTypeAppClick; + } else if ([self.eventName isEqualToString:TD_APP_CRASH_EVENT]) { + return ThinkingAnalyticsEventTypeAppViewCrash; + } else if ([self.eventName isEqualToString:TD_APP_INSTALL_EVENT]) { + return ThinkingAnalyticsEventTypeAppInstall; + } else { + return ThinkingAnalyticsEventTypeNone; + } +} + +- (void)ta_validateKey:(NSString *)key value:(id)value error:(NSError *__autoreleasing _Nullable *)error { + [TAPropertyValidator validateAutoTrackEventPropertyKey:key value:value error:error]; +} + +@end diff --git a/Assets/HCMiniSdk/Third/ta/Plugins/iOS/ThinkingSDK/Source/AutoTrack/Event/TAAutoTrackEvent.m.meta b/Assets/HCMiniSdk/Third/ta/Plugins/iOS/ThinkingSDK/Source/AutoTrack/Event/TAAutoTrackEvent.m.meta new file mode 100644 index 00000000..f3c41932 --- /dev/null +++ b/Assets/HCMiniSdk/Third/ta/Plugins/iOS/ThinkingSDK/Source/AutoTrack/Event/TAAutoTrackEvent.m.meta @@ -0,0 +1,33 @@ +fileFormatVersion: 2 +guid: 457a15183a12f43288ad47022c24f21d +PluginImporter: + externalObjects: {} + serializedVersion: 2 + iconMap: {} + executionOrder: {} + defineConstraints: [] + isPreloaded: 0 + isOverridable: 0 + isExplicitlyReferenced: 0 + validateReferences: 1 + platformData: + - first: + Any: + second: + enabled: 0 + settings: {} + - first: + Editor: Editor + second: + enabled: 0 + settings: + DefaultValueInitialized: true + - first: + iPhone: iOS + second: + enabled: 1 + settings: + AddToEmbeddedBinaries: false + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/HCMiniSdk/Third/ta/Plugins/iOS/ThinkingSDK/Source/AutoTrack/Event/TAPushClickEvent.h b/Assets/HCMiniSdk/Third/ta/Plugins/iOS/ThinkingSDK/Source/AutoTrack/Event/TAPushClickEvent.h new file mode 100644 index 00000000..e41f2756 --- /dev/null +++ b/Assets/HCMiniSdk/Third/ta/Plugins/iOS/ThinkingSDK/Source/AutoTrack/Event/TAPushClickEvent.h @@ -0,0 +1,16 @@ +// +// TAPushClickEvent.h +// ThinkingSDK +// +// Created by liulongbing on 2023/5/31. +// +#import "TAAutoTrackEvent.h" +NS_ASSUME_NONNULL_BEGIN + +@interface TAPushClickEvent : TAAutoTrackEvent + +@property (nonatomic, strong) NSDictionary *ops; + +@end + +NS_ASSUME_NONNULL_END diff --git a/Assets/HCMiniSdk/Third/ta/Plugins/iOS/ThinkingSDK/Source/AutoTrack/Event/TAPushClickEvent.h.meta b/Assets/HCMiniSdk/Third/ta/Plugins/iOS/ThinkingSDK/Source/AutoTrack/Event/TAPushClickEvent.h.meta new file mode 100644 index 00000000..21be3c75 --- /dev/null +++ b/Assets/HCMiniSdk/Third/ta/Plugins/iOS/ThinkingSDK/Source/AutoTrack/Event/TAPushClickEvent.h.meta @@ -0,0 +1,33 @@ +fileFormatVersion: 2 +guid: 5da924cd82c7e49b6a2d9eafec038882 +PluginImporter: + externalObjects: {} + serializedVersion: 2 + iconMap: {} + executionOrder: {} + defineConstraints: [] + isPreloaded: 0 + isOverridable: 0 + isExplicitlyReferenced: 0 + validateReferences: 1 + platformData: + - first: + Any: + second: + enabled: 0 + settings: {} + - first: + Editor: Editor + second: + enabled: 0 + settings: + DefaultValueInitialized: true + - first: + iPhone: iOS + second: + enabled: 1 + settings: + AddToEmbeddedBinaries: false + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/HCMiniSdk/Third/ta/Plugins/iOS/ThinkingSDK/Source/AutoTrack/Event/TAPushClickEvent.m b/Assets/HCMiniSdk/Third/ta/Plugins/iOS/ThinkingSDK/Source/AutoTrack/Event/TAPushClickEvent.m new file mode 100644 index 00000000..5b4d8a44 --- /dev/null +++ b/Assets/HCMiniSdk/Third/ta/Plugins/iOS/ThinkingSDK/Source/AutoTrack/Event/TAPushClickEvent.m @@ -0,0 +1,18 @@ +// +// TAPushClickEvent.m +// ThinkingSDK +// +// Created by liulongbing on 2023/5/31. +// + +#import "TAPushClickEvent.h" + +@implementation TAPushClickEvent + +- (NSMutableDictionary *)jsonObject { + NSMutableDictionary *dict = [super jsonObject]; + self.properties[@"#ops_receipt_properties"] = self.ops; + return dict; +} + +@end diff --git a/Assets/HCMiniSdk/Third/ta/Plugins/iOS/ThinkingSDK/Source/AutoTrack/Event/TAPushClickEvent.m.meta b/Assets/HCMiniSdk/Third/ta/Plugins/iOS/ThinkingSDK/Source/AutoTrack/Event/TAPushClickEvent.m.meta new file mode 100644 index 00000000..fd085113 --- /dev/null +++ b/Assets/HCMiniSdk/Third/ta/Plugins/iOS/ThinkingSDK/Source/AutoTrack/Event/TAPushClickEvent.m.meta @@ -0,0 +1,33 @@ +fileFormatVersion: 2 +guid: 70ccea408f557438a9f8be087342eab3 +PluginImporter: + externalObjects: {} + serializedVersion: 2 + iconMap: {} + executionOrder: {} + defineConstraints: [] + isPreloaded: 0 + isOverridable: 0 + isExplicitlyReferenced: 0 + validateReferences: 1 + platformData: + - first: + Any: + second: + enabled: 0 + settings: {} + - first: + Editor: Editor + second: + enabled: 0 + settings: + DefaultValueInitialized: true + - first: + iPhone: iOS + second: + enabled: 1 + settings: + AddToEmbeddedBinaries: false + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/HCMiniSdk/Third/ta/Plugins/iOS/ThinkingSDK/Source/AutoTrack/TAAutoTrackProtocol.h b/Assets/HCMiniSdk/Third/ta/Plugins/iOS/ThinkingSDK/Source/AutoTrack/TAAutoTrackProtocol.h new file mode 100755 index 00000000..b10c3863 --- /dev/null +++ b/Assets/HCMiniSdk/Third/ta/Plugins/iOS/ThinkingSDK/Source/AutoTrack/TAAutoTrackProtocol.h @@ -0,0 +1,80 @@ +// +// TAAutoTrackProtocol.h +// ThinkingSDK +// +// Created by Yangxiongon 2022/7/1. +// + +#ifndef TAAutoTrackProtocol_h +#define TAAutoTrackProtocol_h + +#import + +@protocol TDUIViewAutoTrackDelegate + +@optional + +/** + UITableView event properties + + @return event properties + */ +- (NSDictionary *)thinkingAnalytics_tableView:(UITableView *)tableView autoTrackPropertiesAtIndexPath:(NSIndexPath *)indexPath; + +/** + APPID UITableView event properties + + @return event properties + */ +- (NSDictionary *)thinkingAnalyticsWithAppid_tableView:(UITableView *)tableView autoTrackPropertiesAtIndexPath:(NSIndexPath *)indexPath; + +@optional + +/** + UICollectionView event properties + + @return event properties + */ +- (NSDictionary *)thinkingAnalytics_collectionView:(UICollectionView *)collectionView autoTrackPropertiesAtIndexPath:(NSIndexPath *)indexPath; + +/** + APPID UICollectionView event properties + + @return event properties + */ +- (NSDictionary *)thinkingAnalyticsWithAppid_collectionView:(UICollectionView *)collectionView autoTrackPropertiesAtIndexPath:(NSIndexPath *)indexPath; + +@end + + +@protocol TDAutoTracker + +@optional + +- (NSDictionary *)getTrackProperties; + + +- (NSDictionary *)getTrackPropertiesWithAppid; + +@end + +/** + Automatically track the page + */ +@protocol TDScreenAutoTracker + +@optional + +/** + Attributes for custom page view events + */ +- (NSString *)getScreenUrl; + +/** + Configure the properties of the APPID custom page view event + */ +- (NSDictionary *)getScreenUrlWithAppid; + +@end + +#endif /* TAAutoTrackProtocol_h */ diff --git a/Assets/HCMiniSdk/Third/ta/Plugins/iOS/ThinkingSDK/Source/AutoTrack/TAAutoTrackProtocol.h.meta b/Assets/HCMiniSdk/Third/ta/Plugins/iOS/ThinkingSDK/Source/AutoTrack/TAAutoTrackProtocol.h.meta new file mode 100644 index 00000000..83ceaabe --- /dev/null +++ b/Assets/HCMiniSdk/Third/ta/Plugins/iOS/ThinkingSDK/Source/AutoTrack/TAAutoTrackProtocol.h.meta @@ -0,0 +1,33 @@ +fileFormatVersion: 2 +guid: 18165eaf66907443c93552539b274cd0 +PluginImporter: + externalObjects: {} + serializedVersion: 2 + iconMap: {} + executionOrder: {} + defineConstraints: [] + isPreloaded: 0 + isOverridable: 0 + isExplicitlyReferenced: 0 + validateReferences: 1 + platformData: + - first: + Any: + second: + enabled: 0 + settings: {} + - first: + Editor: Editor + second: + enabled: 0 + settings: + DefaultValueInitialized: true + - first: + iPhone: iOS + second: + enabled: 1 + settings: + AddToEmbeddedBinaries: false + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/HCMiniSdk/Third/ta/Plugins/iOS/ThinkingSDK/Source/AutoTrack/TAAutoTrackPublicHeader.h b/Assets/HCMiniSdk/Third/ta/Plugins/iOS/ThinkingSDK/Source/AutoTrack/TAAutoTrackPublicHeader.h new file mode 100755 index 00000000..ef7ab685 --- /dev/null +++ b/Assets/HCMiniSdk/Third/ta/Plugins/iOS/ThinkingSDK/Source/AutoTrack/TAAutoTrackPublicHeader.h @@ -0,0 +1,23 @@ +// +// TAAutoTrackPublicHeader.h +// ThinkingSDK +// +// Created by Yangxiongon 2022/7/1. +// + +#ifndef TAAutoTrackPublicHeader_h +#define TAAutoTrackPublicHeader_h + +#if __has_include() +#import +#else +#import "TAAutoTrackProtocol.h" +#endif + +#if __has_include() +#import +#else +#import "UIView+ThinkingAnalytics.h" +#endif + +#endif /* TAAutoTrackPublicHeader_h */ diff --git a/Assets/HCMiniSdk/Third/ta/Plugins/iOS/ThinkingSDK/Source/AutoTrack/TAAutoTrackPublicHeader.h.meta b/Assets/HCMiniSdk/Third/ta/Plugins/iOS/ThinkingSDK/Source/AutoTrack/TAAutoTrackPublicHeader.h.meta new file mode 100644 index 00000000..6b1d0e8e --- /dev/null +++ b/Assets/HCMiniSdk/Third/ta/Plugins/iOS/ThinkingSDK/Source/AutoTrack/TAAutoTrackPublicHeader.h.meta @@ -0,0 +1,33 @@ +fileFormatVersion: 2 +guid: 0346fe03091074a4ab4c1763dc7d6d5f +PluginImporter: + externalObjects: {} + serializedVersion: 2 + iconMap: {} + executionOrder: {} + defineConstraints: [] + isPreloaded: 0 + isOverridable: 0 + isExplicitlyReferenced: 0 + validateReferences: 1 + platformData: + - first: + Any: + second: + enabled: 0 + settings: {} + - first: + Editor: Editor + second: + enabled: 0 + settings: + DefaultValueInitialized: true + - first: + iPhone: iOS + second: + enabled: 1 + settings: + AddToEmbeddedBinaries: false + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/HCMiniSdk/Third/ta/Plugins/iOS/ThinkingSDK/Source/AutoTrack/TDAutoTrackManager.h b/Assets/HCMiniSdk/Third/ta/Plugins/iOS/ThinkingSDK/Source/AutoTrack/TDAutoTrackManager.h new file mode 100755 index 00000000..24795ef5 --- /dev/null +++ b/Assets/HCMiniSdk/Third/ta/Plugins/iOS/ThinkingSDK/Source/AutoTrack/TDAutoTrackManager.h @@ -0,0 +1,34 @@ +#import "ThinkingAnalyticsSDK.h" +#import "TDColdStartTracker.h" +#import "TDHotStartTracker.h" +#import "TDInstallTracker.h" + +FOUNDATION_EXTERN NSString * const TD_EVENT_PROPERTY_TITLE; +FOUNDATION_EXTERN NSString * const TD_EVENT_PROPERTY_URL_PROPERTY; +FOUNDATION_EXTERN NSString * const TD_EVENT_PROPERTY_REFERRER_URL; +FOUNDATION_EXTERN NSString * const TD_EVENT_PROPERTY_SCREEN_NAME; +FOUNDATION_EXTERN NSString * const TD_EVENT_PROPERTY_ELEMENT_ID; +FOUNDATION_EXTERN NSString * const TD_EVENT_PROPERTY_ELEMENT_TYPE; +FOUNDATION_EXTERN NSString * const TD_EVENT_PROPERTY_ELEMENT_CONTENT; +FOUNDATION_EXTERN NSString * const TD_EVENT_PROPERTY_ELEMENT_POSITION; + +@interface TDAutoTrackManager : NSObject + ++ (instancetype)sharedManager; + +- (void)trackEventView:(UIView *)view; + +- (void)trackEventView:(UIView *)view withIndexPath:(NSIndexPath *)indexPath; + +- (void)trackWithAppid:(NSString *)appid withOption:(ThinkingAnalyticsAutoTrackEventType)type; + +- (void)viewControlWillAppear:(UIViewController *)controller; + ++ (UIViewController *)topPresentedViewController; + +#pragma mark - UNAVAILABLE +- (instancetype)init NS_UNAVAILABLE; ++ (instancetype)new NS_UNAVAILABLE; + +@end + diff --git a/Assets/HCMiniSdk/Third/ta/Plugins/iOS/ThinkingSDK/Source/AutoTrack/TDAutoTrackManager.h.meta b/Assets/HCMiniSdk/Third/ta/Plugins/iOS/ThinkingSDK/Source/AutoTrack/TDAutoTrackManager.h.meta new file mode 100644 index 00000000..7d42a490 --- /dev/null +++ b/Assets/HCMiniSdk/Third/ta/Plugins/iOS/ThinkingSDK/Source/AutoTrack/TDAutoTrackManager.h.meta @@ -0,0 +1,33 @@ +fileFormatVersion: 2 +guid: 1625f60723f8542a69466be0231920f5 +PluginImporter: + externalObjects: {} + serializedVersion: 2 + iconMap: {} + executionOrder: {} + defineConstraints: [] + isPreloaded: 0 + isOverridable: 0 + isExplicitlyReferenced: 0 + validateReferences: 1 + platformData: + - first: + Any: + second: + enabled: 0 + settings: {} + - first: + Editor: Editor + second: + enabled: 0 + settings: + DefaultValueInitialized: true + - first: + iPhone: iOS + second: + enabled: 1 + settings: + AddToEmbeddedBinaries: false + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/HCMiniSdk/Third/ta/Plugins/iOS/ThinkingSDK/Source/AutoTrack/TDAutoTrackManager.m b/Assets/HCMiniSdk/Third/ta/Plugins/iOS/ThinkingSDK/Source/AutoTrack/TDAutoTrackManager.m new file mode 100755 index 00000000..dafd0058 --- /dev/null +++ b/Assets/HCMiniSdk/Third/ta/Plugins/iOS/ThinkingSDK/Source/AutoTrack/TDAutoTrackManager.m @@ -0,0 +1,764 @@ +#import "TDAutoTrackManager.h" + +#import "TDSwizzler.h" +#import "UIViewController+AutoTrack.h" +#import "NSObject+TDSwizzle.h" +#import "TDJSONUtil.h" +#import "UIApplication+AutoTrack.h" +#import "ThinkingAnalyticsSDKPrivate.h" +#import "TDPublicConfig.h" +#import "TAAutoClickEvent.h" +#import "TAAutoPageViewEvent.h" +#import "TAAppLifeCycle.h" +#import "TDAppState.h" +#import "TDRunTime.h" +#import "TDPresetProperties+TDDisProperties.h" + +#import "TAAppStartEvent.h" +#import "TAAppEndEvent.h" +#import "TDAppEndTracker.h" +#import "TDColdStartTracker.h" +#import "TDInstallTracker.h" +#import "TDAppState.h" + +#ifndef TD_LOCK +#define TD_LOCK(lock) dispatch_semaphore_wait(lock, DISPATCH_TIME_FOREVER); +#endif + +#ifndef TD_UNLOCK +#define TD_UNLOCK(lock) dispatch_semaphore_signal(lock); +#endif + +NSString * const TD_EVENT_PROPERTY_TITLE = @"#title"; +NSString * const TD_EVENT_PROPERTY_URL_PROPERTY = @"#url"; +NSString * const TD_EVENT_PROPERTY_REFERRER_URL = @"#referrer"; +NSString * const TD_EVENT_PROPERTY_SCREEN_NAME = @"#screen_name"; +NSString * const TD_EVENT_PROPERTY_ELEMENT_ID = @"#element_id"; +NSString * const TD_EVENT_PROPERTY_ELEMENT_TYPE = @"#element_type"; +NSString * const TD_EVENT_PROPERTY_ELEMENT_CONTENT = @"#element_content"; +NSString * const TD_EVENT_PROPERTY_ELEMENT_POSITION = @"#element_position"; + +@interface TDAutoTrackManager () +@property (atomic, strong) NSMutableDictionary *autoTrackOptions; +@property (nonatomic, strong, nonnull) dispatch_semaphore_t trackOptionLock; +@property (atomic, copy) NSString *referrerViewControllerUrl; +@property (nonatomic, strong) TDHotStartTracker *appHotStartTracker; +@property (nonatomic, strong) TDAppEndTracker *appEndTracker; +@property (nonatomic, strong) TDColdStartTracker *appColdStartTracker; +@property (nonatomic, strong) TDInstallTracker *appInstallTracker; + +@end + + +@implementation TDAutoTrackManager + +#pragma mark - Public + ++ (instancetype)sharedManager { + static dispatch_once_t once; + static TDAutoTrackManager *manager = nil; + dispatch_once(&once, ^{ + manager = [[[TDAutoTrackManager class] alloc] init]; + manager.autoTrackOptions = [NSMutableDictionary new]; + manager.trackOptionLock = dispatch_semaphore_create(1); + [manager registerAppLifeCycleListener]; + }); + return manager; +} + +- (void)trackEventView:(UIView *)view { + [self trackEventView:view withIndexPath:nil]; +} + +- (void)trackEventView:(UIView *)view withIndexPath:(NSIndexPath *)indexPath { + if (view.thinkingAnalyticsIgnoreView) { + return; + } + + NSString *elementId = nil; + NSString *elementType = nil; + NSString *elementContent = nil; + NSString *elementPosition = nil; + NSString *elementPageTitle = nil; + NSString *elementScreenName = nil; + NSMutableDictionary *yx_customProperties = [NSMutableDictionary dictionary]; + + + elementId = view.thinkingAnalyticsViewID; + elementType = NSStringFromClass([view class]); + + + NSMutableDictionary *properties = [[NSMutableDictionary alloc] init]; + properties[TD_EVENT_PROPERTY_ELEMENT_ID] = view.thinkingAnalyticsViewID; + properties[TD_EVENT_PROPERTY_ELEMENT_TYPE] = NSStringFromClass([view class]); + UIViewController *viewController = [self viewControllerForView:view]; + if (viewController != nil) { + NSString *screenName = NSStringFromClass([viewController class]); + properties[TD_EVENT_PROPERTY_SCREEN_NAME] = screenName; + + elementScreenName = screenName; + + NSString *controllerTitle = [self titleFromViewController:viewController]; + if (controllerTitle) { + properties[TD_EVENT_PROPERTY_TITLE] = controllerTitle; + + elementPageTitle = controllerTitle; + } + } + + + NSDictionary *propDict = view.thinkingAnalyticsViewProperties; + if ([propDict isKindOfClass:[NSDictionary class]]) { + [properties addEntriesFromDictionary:propDict]; + + [yx_customProperties addEntriesFromDictionary:propDict]; + } + + UIView *contentView; + NSDictionary *propertyWithAppid; + if (indexPath) { + if ([view isKindOfClass:[UITableView class]]) { + UITableView *tableView = (UITableView *)view; + contentView = [tableView cellForRowAtIndexPath:indexPath]; + if (!contentView) { + [tableView layoutIfNeeded]; + contentView = [tableView cellForRowAtIndexPath:indexPath]; + } + properties[TD_EVENT_PROPERTY_ELEMENT_POSITION] = [NSString stringWithFormat: @"%ld:%ld", (unsigned long)indexPath.section, (unsigned long)indexPath.row]; + + elementPosition = [NSString stringWithFormat: @"%ld:%ld", (unsigned long)indexPath.section, (unsigned long)indexPath.row]; + + if ([tableView.thinkingAnalyticsDelegate conformsToProtocol:@protocol(TDUIViewAutoTrackDelegate)]) { + if ([tableView.thinkingAnalyticsDelegate respondsToSelector:@selector(thinkingAnalytics_tableView:autoTrackPropertiesAtIndexPath:)]) { + NSDictionary *dic = [view.thinkingAnalyticsDelegate thinkingAnalytics_tableView:tableView autoTrackPropertiesAtIndexPath:indexPath]; + if ([dic isKindOfClass:[NSDictionary class]]) { + [properties addEntriesFromDictionary:dic]; + + [yx_customProperties addEntriesFromDictionary:dic]; + + } + } + + if ([tableView.thinkingAnalyticsDelegate respondsToSelector:@selector(thinkingAnalyticsWithAppid_tableView:autoTrackPropertiesAtIndexPath:)]) { + propertyWithAppid = [view.thinkingAnalyticsDelegate thinkingAnalyticsWithAppid_tableView:tableView autoTrackPropertiesAtIndexPath:indexPath]; + } + } + } else if ([view isKindOfClass:[UICollectionView class]]) { + UICollectionView *collectionView = (UICollectionView *)view; + contentView = [collectionView cellForItemAtIndexPath:indexPath]; + if (!contentView) { + [collectionView layoutIfNeeded]; + contentView = [collectionView cellForItemAtIndexPath:indexPath]; + } + properties[TD_EVENT_PROPERTY_ELEMENT_POSITION] = [NSString stringWithFormat: @"%ld:%ld", (unsigned long)indexPath.section, (unsigned long)indexPath.row]; + + elementPosition = [NSString stringWithFormat: @"%ld:%ld", (unsigned long)indexPath.section, (unsigned long)indexPath.row]; + + if ([collectionView.thinkingAnalyticsDelegate conformsToProtocol:@protocol(TDUIViewAutoTrackDelegate)]) { + if ([collectionView.thinkingAnalyticsDelegate respondsToSelector:@selector(thinkingAnalytics_collectionView:autoTrackPropertiesAtIndexPath:)]) { + NSDictionary *dic = [view.thinkingAnalyticsDelegate thinkingAnalytics_collectionView:collectionView autoTrackPropertiesAtIndexPath:indexPath]; + if ([dic isKindOfClass:[NSDictionary class]]) { + [properties addEntriesFromDictionary:dic]; + + [yx_customProperties addEntriesFromDictionary:dic]; + + } + } + if ([collectionView.thinkingAnalyticsDelegate respondsToSelector:@selector(thinkingAnalyticsWithAppid_collectionView:autoTrackPropertiesAtIndexPath:)]) { + propertyWithAppid = [view.thinkingAnalyticsDelegate thinkingAnalyticsWithAppid_collectionView:collectionView autoTrackPropertiesAtIndexPath:indexPath]; + } + } + } + } else { + contentView = view; + properties[TD_EVENT_PROPERTY_ELEMENT_POSITION] = [TDAutoTrackManager getPosition:contentView]; + + elementPosition = [TDAutoTrackManager getPosition:contentView]; + + } + + NSString *content = [TDAutoTrackManager getText:contentView]; + if (content.length > 0) { + properties[TD_EVENT_PROPERTY_ELEMENT_CONTENT] = content; + + elementContent = content; + + } + + + + NSDate *trackDate = [NSDate date]; + for (NSString *appid in self.autoTrackOptions) { + + ThinkingAnalyticsAutoTrackEventType type = (ThinkingAnalyticsAutoTrackEventType)[self.autoTrackOptions[appid] integerValue]; + + if (type & ThinkingAnalyticsEventTypeAppClick) { + + + + + ThinkingAnalyticsSDK *instance = [ThinkingAnalyticsSDK sharedInstanceWithAppid:appid]; + NSMutableDictionary *trackProperties = [properties mutableCopy]; + + NSMutableDictionary *yx_trackProperties = [yx_customProperties mutableCopy]; + + if ([instance isViewTypeIgnored:[view class]]) { + continue; + } + NSDictionary *ignoreViews = view.thinkingAnalyticsIgnoreViewWithAppid; + if (ignoreViews != nil && [[ignoreViews objectForKey:appid] isKindOfClass:[NSNumber class]]) { + BOOL ignore = [[ignoreViews objectForKey:appid] boolValue]; + if (ignore) + continue; + } + + if ([instance isViewControllerIgnored:viewController]) { + continue; + } + + NSDictionary *viewIDs = view.thinkingAnalyticsViewIDWithAppid; + if (viewIDs != nil && [viewIDs objectForKey:appid]) { + trackProperties[TD_EVENT_PROPERTY_ELEMENT_ID] = [viewIDs objectForKey:appid]; + + elementId = [viewIDs objectForKey:appid]; + + } + + NSDictionary *viewProperties = view.thinkingAnalyticsViewPropertiesWithAppid; + if (viewProperties != nil && [viewProperties objectForKey:appid]) { + NSDictionary *properties = [viewProperties objectForKey:appid]; + if ([properties isKindOfClass:[NSDictionary class]]) { + [trackProperties addEntriesFromDictionary:properties]; + + [yx_trackProperties addEntriesFromDictionary:properties]; + } + } + + if (propertyWithAppid) { + NSDictionary *autoTrackproperties = [propertyWithAppid objectForKey:appid]; + if ([autoTrackproperties isKindOfClass:[NSDictionary class]]) { + [trackProperties addEntriesFromDictionary:autoTrackproperties]; + + [yx_trackProperties addEntriesFromDictionary:autoTrackproperties]; + } + } + + TAAutoClickEvent *yx_event = [[TAAutoClickEvent alloc] initWithName:TD_APP_CLICK_EVENT]; + yx_event.time = trackDate; + yx_event.elementId = elementId; + yx_event.elementType = elementType; + yx_event.elementContent = elementContent; + yx_event.elementPosition = elementPosition; + yx_event.pageTitle = elementPageTitle; + yx_event.screenName = elementScreenName; + + [instance autoTrackWithEvent:yx_event properties:yx_trackProperties]; + } + } +} + +- (void)trackWithAppid:(NSString *)appid withOption:(ThinkingAnalyticsAutoTrackEventType)type { + TD_LOCK(self.trackOptionLock); + self.autoTrackOptions[appid] = @(type); + TD_UNLOCK(self.trackOptionLock); + + if (type & ThinkingAnalyticsEventTypeAppClick || type & ThinkingAnalyticsEventTypeAppViewScreen) { + [self swizzleVC]; + } + + if (type & ThinkingAnalyticsEventTypeAppInstall) { + TAAutoTrackEvent *event = [[TAAutoTrackEvent alloc] initWithName:TD_APP_INSTALL_EVENT]; + event.time = [[NSDate date] dateByAddingTimeInterval: -1]; + [self.appInstallTracker trackWithInstanceTag:appid event:event params:nil]; + } + + if (type & ThinkingAnalyticsEventTypeAppEnd) { + ThinkingAnalyticsSDK *instance = [ThinkingAnalyticsSDK sharedInstanceWithAppid:appid]; + [instance timeEvent:TD_APP_END_EVENT]; + } + + if (type & ThinkingAnalyticsEventTypeAppStart) { + dispatch_block_t mainThreadBlock = ^(){ + NSString *eventName = [TDAppState shareInstance].relaunchInBackground ? TD_APP_START_BACKGROUND_EVENT : TD_APP_START_EVENT; + TAAppStartEvent *event = [[TAAppStartEvent alloc] initWithName:eventName]; + event.resumeFromBackground = NO; + if (![TDPresetProperties disableStartReason]) { + NSString *reason = [TDRunTime getAppLaunchReason]; + if (reason && reason.length) { + event.startReason = reason; + } + } + [self.appColdStartTracker trackWithInstanceTag:appid event:event params:nil]; + }; + dispatch_async(dispatch_get_main_queue(), mainThreadBlock); + } + + if (type & ThinkingAnalyticsEventTypeAppViewCrash) { + ThinkingAnalyticsSDK *instance = [ThinkingAnalyticsSDK sharedInstanceWithAppid:appid]; + [[ThinkingExceptionHandler sharedHandler] addThinkingInstance:instance]; + } +} + +- (void)viewControlWillAppear:(UIViewController *)controller { + [self trackViewController:controller]; +} + ++ (UIViewController *)topPresentedViewController { + UIWindow *keyWindow = [self findWindow]; + if (keyWindow != nil && !keyWindow.isKeyWindow) { + [keyWindow makeKeyWindow]; + } + + UIViewController *topController = keyWindow.rootViewController; + if ([topController isKindOfClass:[UINavigationController class]]) { + topController = [(UINavigationController *)topController topViewController]; + } + while (topController.presentedViewController) { + topController = topController.presentedViewController; + } + return topController; +} + +#pragma mark - Private + +- (BOOL)isAutoTrackEventType:(ThinkingAnalyticsAutoTrackEventType)eventType { + BOOL isIgnored = YES; + for (NSString *appid in self.autoTrackOptions) { + ThinkingAnalyticsAutoTrackEventType type = (ThinkingAnalyticsAutoTrackEventType)[self.autoTrackOptions[appid] integerValue]; + isIgnored = !(type & eventType); + if (isIgnored == NO) + break; + } + return !isIgnored; +} + +- (UIViewController *)viewControllerForView:(UIView *)view { + UIResponder *responder = view.nextResponder; + while (responder) { + if ([responder isKindOfClass:[UIViewController class]]) { + if ([responder isKindOfClass:[UINavigationController class]]) { + responder = [(UINavigationController *)responder topViewController]; + continue; + } else if ([responder isKindOfClass:UITabBarController.class]) { + responder = [(UITabBarController *)responder selectedViewController]; + continue; + } + return (UIViewController *)responder; + } + responder = responder.nextResponder; + } + return nil; +} + +- (void)trackViewController:(UIViewController *)controller { + if (![self shouldTrackViewContrller:[controller class]]) { + return; + } + + NSString *pageUrl = nil; + NSString *pageReferrer = nil; + NSString *pageTitle = nil; + NSString *pageScreenName = nil; + NSMutableDictionary *yx_customProperties = [NSMutableDictionary dictionary]; + + NSMutableDictionary *properties = [[NSMutableDictionary alloc] init]; + [properties setValue:NSStringFromClass([controller class]) forKey:TD_EVENT_PROPERTY_SCREEN_NAME]; + + pageScreenName = NSStringFromClass([controller class]); + + NSString *controllerTitle = [self titleFromViewController:controller]; + if (controllerTitle) { + [properties setValue:controllerTitle forKey:TD_EVENT_PROPERTY_TITLE]; + + pageTitle = controllerTitle; + } + + NSDictionary *autoTrackerAppidDic; + if ([controller conformsToProtocol:@protocol(TDAutoTracker)]) { + UIViewController *autoTrackerController = (UIViewController *)controller; + NSDictionary *autoTrackerDic; + if ([controller respondsToSelector:@selector(getTrackPropertiesWithAppid)]) + autoTrackerAppidDic = [autoTrackerController getTrackPropertiesWithAppid]; + if ([controller respondsToSelector:@selector(getTrackProperties)]) + autoTrackerDic = [autoTrackerController getTrackProperties]; + + if ([autoTrackerDic isKindOfClass:[NSDictionary class]]) { + [properties addEntriesFromDictionary:autoTrackerDic]; + + [yx_customProperties addEntriesFromDictionary:autoTrackerDic]; + } + } + + NSDictionary *screenAutoTrackerAppidDic; + if ([controller conformsToProtocol:@protocol(TDScreenAutoTracker)]) { + UIViewController *screenAutoTrackerController = (UIViewController *)controller; + if ([screenAutoTrackerController respondsToSelector:@selector(getScreenUrlWithAppid)]) + screenAutoTrackerAppidDic = [screenAutoTrackerController getScreenUrlWithAppid]; + if ([screenAutoTrackerController respondsToSelector:@selector(getScreenUrl)]) { + NSString *currentUrl = [screenAutoTrackerController getScreenUrl]; + [properties setValue:currentUrl forKey:TD_EVENT_PROPERTY_URL_PROPERTY]; + + pageUrl = currentUrl; + + [properties setValue:_referrerViewControllerUrl forKey:TD_EVENT_PROPERTY_REFERRER_URL]; + + pageReferrer = _referrerViewControllerUrl; + + _referrerViewControllerUrl = currentUrl; + } + } + + NSDate *trackDate = [NSDate date]; + for (NSString *appid in self.autoTrackOptions) { + ThinkingAnalyticsAutoTrackEventType type = [self.autoTrackOptions[appid] integerValue]; + if (type & ThinkingAnalyticsEventTypeAppViewScreen) { + + + + ThinkingAnalyticsSDK *instance = [ThinkingAnalyticsSDK sharedInstanceWithAppid:appid]; + NSMutableDictionary *trackProperties = [properties mutableCopy]; + + NSMutableDictionary *yx_trackProperties = [yx_customProperties mutableCopy]; + + if ([instance isViewControllerIgnored:controller] + || [instance isViewTypeIgnored:[controller class]]) { + continue; + } + + if (autoTrackerAppidDic && [autoTrackerAppidDic objectForKey:appid]) { + NSDictionary *dic = [autoTrackerAppidDic objectForKey:appid]; + if ([dic isKindOfClass:[NSDictionary class]]) { + [trackProperties addEntriesFromDictionary:dic]; + + [yx_trackProperties addEntriesFromDictionary:dic]; + } + } + + if (screenAutoTrackerAppidDic && [screenAutoTrackerAppidDic objectForKey:appid]) { + NSString *screenUrl = [screenAutoTrackerAppidDic objectForKey:appid]; + [trackProperties setValue:screenUrl forKey:TD_EVENT_PROPERTY_URL_PROPERTY]; + + pageUrl = screenUrl; + } + + TAAutoPageViewEvent *pageEvent = [[TAAutoPageViewEvent alloc] initWithName:TD_APP_VIEW_EVENT]; + pageEvent.time = trackDate; + pageEvent.pageUrl = pageUrl; + pageEvent.pageTitle = pageTitle; + pageEvent.referrer = pageReferrer; + pageEvent.screenName = pageScreenName; + + [instance autoTrackWithEvent:pageEvent properties:yx_trackProperties]; + } + } +} + +- (BOOL)shouldTrackViewContrller:(Class)aClass { + return ![TDPublicConfig.controllers containsObject:NSStringFromClass(aClass)]; +} + +- (ThinkingAnalyticsAutoTrackEventType)autoTrackOptionForAppid:(NSString *)appid { + return (ThinkingAnalyticsAutoTrackEventType)[[self.autoTrackOptions objectForKey:appid] integerValue]; +} + +- (void)swizzleSelected:(UIView *)view delegate:(id)delegate { + if ([view isKindOfClass:[UITableView class]] + && [delegate conformsToProtocol:@protocol(UITableViewDelegate)]) { + void (^block)(id, SEL, id, id) = ^(id target, SEL command, UITableView *tableView, NSIndexPath *indexPath) { + [self trackEventView:tableView withIndexPath:indexPath]; + }; + + [TDSwizzler swizzleSelector:@selector(tableView:didSelectRowAtIndexPath:) + onClass:[delegate class] + withBlock:block + named:@"td_table_select"]; + } + + if ([view isKindOfClass:[UICollectionView class]] + && [delegate conformsToProtocol:@protocol(UICollectionViewDelegate)]) { + + void (^block)(id, SEL, id, id) = ^(id target, SEL command, UICollectionView *collectionView, NSIndexPath *indexPath) { + [self trackEventView:collectionView withIndexPath:indexPath]; + }; + [TDSwizzler swizzleSelector:@selector(collectionView:didSelectItemAtIndexPath:) + onClass:[delegate class] + withBlock:block + named:@"td_collection_select"]; + } +} + +- (void)swizzleVC { + static dispatch_once_t onceToken; + dispatch_once(&onceToken, ^{ + void (^tableViewBlock)(UITableView *tableView, + SEL cmd, + id delegate) = + ^(UITableView *tableView, SEL cmd, id delegate) { + if (!delegate) { + return; + } + + [self swizzleSelected:tableView delegate:delegate]; + }; + + [TDSwizzler swizzleSelector:@selector(setDelegate:) + onClass:[UITableView class] + withBlock:tableViewBlock + named:@"td_table_delegate"]; + + void (^collectionViewBlock)(UICollectionView *, SEL, id) = ^(UICollectionView *collectionView, SEL cmd, id delegate) { + if (nil == delegate) { + return; + } + + [self swizzleSelected:collectionView delegate:delegate]; + }; + [TDSwizzler swizzleSelector:@selector(setDelegate:) + onClass:[UICollectionView class] + withBlock:collectionViewBlock + named:@"td_collection_delegate"]; + + + [UIViewController td_swizzleMethod:@selector(viewWillAppear:) + withMethod:@selector(td_autotrack_viewWillAppear:) + error:NULL]; + + [UIApplication td_swizzleMethod:@selector(sendAction:to:from:forEvent:) + withMethod:@selector(td_sendAction:to:from:forEvent:) + error:NULL]; + }); +} + ++ (NSString *)getPosition:(UIView *)view { + NSString *position = nil; + if ([view isKindOfClass:[UIView class]] && view.thinkingAnalyticsIgnoreView) { + return nil; + } + + if ([view isKindOfClass:[UITabBar class]]) { + UITabBar *tabbar = (UITabBar *)view; + position = [NSString stringWithFormat: @"%ld", (long)[tabbar.items indexOfObject:tabbar.selectedItem]]; + } else if ([view isKindOfClass:[UISegmentedControl class]]) { + UISegmentedControl *segment = (UISegmentedControl *)view; + position = [NSString stringWithFormat:@"%ld", (long)segment.selectedSegmentIndex]; + } else if ([view isKindOfClass:[UIProgressView class]]) { + UIProgressView *progress = (UIProgressView *)view; + position = [NSString stringWithFormat:@"%f", progress.progress]; + } else if ([view isKindOfClass:[UIPageControl class]]) { + UIPageControl *pageControl = (UIPageControl *)view; + position = [NSString stringWithFormat:@"%ld", (long)pageControl.currentPage]; + } + + return position; +} + ++ (NSString *)getText:(NSObject *)obj { + NSString *text = nil; + if ([obj isKindOfClass:[UIView class]] && [(UIView *)obj thinkingAnalyticsIgnoreView]) { + return nil; + } + + if ([obj isKindOfClass:[UIButton class]]) { + text = ((UIButton *)obj).currentTitle; + } else if ([obj isKindOfClass:[UITextView class]] || + [obj isKindOfClass:[UITextField class]]) { + //ignore + } else if ([obj isKindOfClass:[UILabel class]]) { + text = ((UILabel *)obj).text; + } else if ([obj isKindOfClass:[UIPickerView class]]) { + UIPickerView *picker = (UIPickerView *)obj; + NSInteger sections = picker.numberOfComponents; + NSMutableArray *titles = [NSMutableArray array]; + + for(NSInteger i = 0; i < sections; i++) { + NSInteger row = [picker selectedRowInComponent:i]; + NSString *title; + if ([picker.delegate + respondsToSelector:@selector(pickerView:titleForRow:forComponent:)]) { + title = [picker.delegate pickerView:picker titleForRow:row forComponent:i]; + } else if ([picker.delegate + respondsToSelector:@selector(pickerView:attributedTitleForRow:forComponent:)]) { + title = [picker.delegate + pickerView:picker + attributedTitleForRow:row forComponent:i].string; + } + [titles addObject:title ?: @""]; + } + if (titles.count > 0) { + text = [titles componentsJoinedByString:@","]; + } + } else if ([obj isKindOfClass:[UIDatePicker class]]) { + UIDatePicker *picker = (UIDatePicker *)obj; + NSDateFormatter *formatter = [[NSDateFormatter alloc] init]; + formatter.dateFormat = kDefaultTimeFormat; + text = [formatter stringFromDate:picker.date]; + } else if ([obj isKindOfClass:[UISegmentedControl class]]) { + UISegmentedControl *segment = (UISegmentedControl *)obj; + text = [NSString stringWithFormat:@"%@", [segment titleForSegmentAtIndex:segment.selectedSegmentIndex]]; + } else if ([obj isKindOfClass:[UISwitch class]]) { + UISwitch *switchItem = (UISwitch *)obj; + text = switchItem.on ? @"on" : @"off"; + } else if ([obj isKindOfClass:[UISlider class]]) { + UISlider *slider = (UISlider *)obj; + text = [NSString stringWithFormat:@"%f", [slider value]]; + } else if ([obj isKindOfClass:[UIStepper class]]) { + UIStepper *step = (UIStepper *)obj; + text = [NSString stringWithFormat:@"%f", [step value]]; + } else { + if ([obj isKindOfClass:[UIView class]]) { + for(UIView *subView in [(UIView *)obj subviews]) { + text = [TDAutoTrackManager getText:subView]; + if ([text isKindOfClass:[NSString class]] && text.length > 0) { + break; + } + } + } + } + return text; +} + +- (NSString *)titleFromViewController:(UIViewController *)viewController { + if (!viewController) { + return nil; + } + + UIView *titleView = viewController.navigationItem.titleView; + NSString *elementContent = nil; + if (titleView) { + elementContent = [TDAutoTrackManager getText:titleView]; + } + + return elementContent.length > 0 ? elementContent : viewController.navigationItem.title; +} + ++ (UIWindow *)findWindow { + UIApplication *application = [TDAppState sharedApplication]; + if (![application isKindOfClass:UIApplication.class]) { + return nil; + } + + UIWindow *window = application.keyWindow; + if (window == nil || window.windowLevel != UIWindowLevelNormal) { + for (window in application.windows) { + if (window.windowLevel == UIWindowLevelNormal) { + break; + } + } + } + + if (@available(iOS 13.0, tvOS 13, *)) { + NSSet *scenes = [[TDAppState sharedApplication] valueForKey:@"connectedScenes"]; + for (id scene in scenes) { + if (window) { + break; + } + + id activationState = [scene valueForKeyPath:@"activationState"]; + BOOL isActive = activationState != nil && [activationState integerValue] == 0; + if (isActive) { + Class WindowScene = NSClassFromString(@"UIWindowScene"); + if ([scene isKindOfClass:WindowScene]) { + NSArray *windows = [scene valueForKeyPath:@"windows"]; + for (UIWindow *w in windows) { + if (w.isKeyWindow) { + window = w; + break; + } + } + } + } + } + } + + return window; +} + +//MARK: - App Life Cycle + +- (void)registerAppLifeCycleListener { + NSNotificationCenter *notificationCenter = [NSNotificationCenter defaultCenter]; + + [notificationCenter addObserver:self selector:@selector(appStateWillChangeNotification:) name:kTAAppLifeCycleStateWillChangeNotification object:nil]; +} + +- (void)appStateWillChangeNotification:(NSNotification *)notification { + TAAppLifeCycleState newState = [[notification.userInfo objectForKey:kTAAppLifeCycleNewStateKey] integerValue]; + TAAppLifeCycleState oldState = [[notification.userInfo objectForKey:kTAAppLifeCycleOldStateKey] integerValue]; + + if (newState == TAAppLifeCycleStateStart) { + for (NSString *appid in self.autoTrackOptions) { + ThinkingAnalyticsAutoTrackEventType type = (ThinkingAnalyticsAutoTrackEventType)[self.autoTrackOptions[appid] integerValue]; + + // Only open the start event of collecting hot start. Cold start event, reported when automatic collection is turned on + if ((type & ThinkingAnalyticsEventTypeAppStart) && oldState != TAAppLifeCycleStateInit) { + NSString *eventName = [TDAppState shareInstance].relaunchInBackground ? TD_APP_START_BACKGROUND_EVENT : TD_APP_START_EVENT; + TAAppStartEvent *event = [[TAAppStartEvent alloc] initWithName:eventName]; + event.resumeFromBackground = YES; + + if (![TDPresetProperties disableStartReason]) { + NSString *reason = [TDRunTime getAppLaunchReason]; + if (reason && reason.length) { + event.startReason = reason; + } + } + [self.appHotStartTracker trackWithInstanceTag:appid event:event params:@{}]; + } + + if (type & ThinkingAnalyticsEventTypeAppEnd) { + + ThinkingAnalyticsSDK *instance = [ThinkingAnalyticsSDK sharedInstanceWithAppid:appid]; + [instance timeEvent:TD_APP_END_EVENT]; + } + } + } else if (newState == TAAppLifeCycleStateEnd) { + for (NSString *appid in self.autoTrackOptions) { + ThinkingAnalyticsAutoTrackEventType type = (ThinkingAnalyticsAutoTrackEventType)[self.autoTrackOptions[appid] integerValue]; + if (type & ThinkingAnalyticsEventTypeAppEnd) { + TAAppEndEvent *event = [[TAAppEndEvent alloc] initWithName:TD_APP_END_EVENT]; + td_dispatch_main_sync_safe(^{ + + NSString *screenName = NSStringFromClass([[TDAutoTrackManager topPresentedViewController] class]); + event.screenName = screenName; + [self.appEndTracker trackWithInstanceTag:appid event:event params:@{}]; + }); + } + + if (type & ThinkingAnalyticsEventTypeAppStart) { + ThinkingAnalyticsSDK *instance = [ThinkingAnalyticsSDK sharedInstanceWithAppid:appid]; + [instance timeEvent:TD_APP_START_EVENT]; + } + } + } +} + +//MARK: - Getter & Setter + +- (TDHotStartTracker *)appHotStartTracker { + if (!_appHotStartTracker) { + _appHotStartTracker = [[TDHotStartTracker alloc] init]; + } + return _appHotStartTracker; +} + +- (TDColdStartTracker *)appColdStartTracker { + if (!_appColdStartTracker) { + _appColdStartTracker = [[TDColdStartTracker alloc] init]; + } + return _appColdStartTracker; +} + +- (TDInstallTracker *)appInstallTracker { + if (!_appInstallTracker) { + _appInstallTracker = [[TDInstallTracker alloc] init]; + } + return _appInstallTracker; +} + +- (TDAppEndTracker *)appEndTracker { + if (!_appEndTracker) { + _appEndTracker = [[TDAppEndTracker alloc] init]; + } + return _appEndTracker; +} + +@end diff --git a/Assets/HCMiniSdk/Third/ta/Plugins/iOS/ThinkingSDK/Source/AutoTrack/TDAutoTrackManager.m.meta b/Assets/HCMiniSdk/Third/ta/Plugins/iOS/ThinkingSDK/Source/AutoTrack/TDAutoTrackManager.m.meta new file mode 100644 index 00000000..c0a1b5d9 --- /dev/null +++ b/Assets/HCMiniSdk/Third/ta/Plugins/iOS/ThinkingSDK/Source/AutoTrack/TDAutoTrackManager.m.meta @@ -0,0 +1,33 @@ +fileFormatVersion: 2 +guid: 4df3c68e4c10242c4a93e8087f0cc5bd +PluginImporter: + externalObjects: {} + serializedVersion: 2 + iconMap: {} + executionOrder: {} + defineConstraints: [] + isPreloaded: 0 + isOverridable: 0 + isExplicitlyReferenced: 0 + validateReferences: 1 + platformData: + - first: + Any: + second: + enabled: 0 + settings: {} + - first: + Editor: Editor + second: + enabled: 0 + settings: + DefaultValueInitialized: true + - first: + iPhone: iOS + second: + enabled: 1 + settings: + AddToEmbeddedBinaries: false + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/HCMiniSdk/Third/ta/Plugins/iOS/ThinkingSDK/Source/AutoTrack/Tracker.meta b/Assets/HCMiniSdk/Third/ta/Plugins/iOS/ThinkingSDK/Source/AutoTrack/Tracker.meta new file mode 100644 index 00000000..7b1ccade --- /dev/null +++ b/Assets/HCMiniSdk/Third/ta/Plugins/iOS/ThinkingSDK/Source/AutoTrack/Tracker.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: c350cba01555c41e4aceb6039c8408a8 +folderAsset: yes +DefaultImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/HCMiniSdk/Third/ta/Plugins/iOS/ThinkingSDK/Source/AutoTrack/Tracker/TDAppEndTracker.h b/Assets/HCMiniSdk/Third/ta/Plugins/iOS/ThinkingSDK/Source/AutoTrack/Tracker/TDAppEndTracker.h new file mode 100755 index 00000000..b8787ad5 --- /dev/null +++ b/Assets/HCMiniSdk/Third/ta/Plugins/iOS/ThinkingSDK/Source/AutoTrack/Tracker/TDAppEndTracker.h @@ -0,0 +1,16 @@ +// +// TDAppEndTracker.h +// ThinkingSDK +// +// Created by Yangxiongon 2022/6/16. +// + +#import "TDAutoTracker.h" + +NS_ASSUME_NONNULL_BEGIN + +@interface TDAppEndTracker : TDAutoTracker + +@end + +NS_ASSUME_NONNULL_END diff --git a/Assets/HCMiniSdk/Third/ta/Plugins/iOS/ThinkingSDK/Source/AutoTrack/Tracker/TDAppEndTracker.h.meta b/Assets/HCMiniSdk/Third/ta/Plugins/iOS/ThinkingSDK/Source/AutoTrack/Tracker/TDAppEndTracker.h.meta new file mode 100644 index 00000000..a415e454 --- /dev/null +++ b/Assets/HCMiniSdk/Third/ta/Plugins/iOS/ThinkingSDK/Source/AutoTrack/Tracker/TDAppEndTracker.h.meta @@ -0,0 +1,33 @@ +fileFormatVersion: 2 +guid: c086add947134424b809df8a51900ab1 +PluginImporter: + externalObjects: {} + serializedVersion: 2 + iconMap: {} + executionOrder: {} + defineConstraints: [] + isPreloaded: 0 + isOverridable: 0 + isExplicitlyReferenced: 0 + validateReferences: 1 + platformData: + - first: + Any: + second: + enabled: 0 + settings: {} + - first: + Editor: Editor + second: + enabled: 0 + settings: + DefaultValueInitialized: true + - first: + iPhone: iOS + second: + enabled: 1 + settings: + AddToEmbeddedBinaries: false + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/HCMiniSdk/Third/ta/Plugins/iOS/ThinkingSDK/Source/AutoTrack/Tracker/TDAppEndTracker.m b/Assets/HCMiniSdk/Third/ta/Plugins/iOS/ThinkingSDK/Source/AutoTrack/Tracker/TDAppEndTracker.m new file mode 100755 index 00000000..76187374 --- /dev/null +++ b/Assets/HCMiniSdk/Third/ta/Plugins/iOS/ThinkingSDK/Source/AutoTrack/Tracker/TDAppEndTracker.m @@ -0,0 +1,12 @@ +// +// TDAppEndTracker.m +// ThinkingSDK +// +// Created by Yangxiongon 2022/6/16. +// + +#import "TDAppEndTracker.h" + +@implementation TDAppEndTracker + +@end diff --git a/Assets/HCMiniSdk/Third/ta/Plugins/iOS/ThinkingSDK/Source/AutoTrack/Tracker/TDAppEndTracker.m.meta b/Assets/HCMiniSdk/Third/ta/Plugins/iOS/ThinkingSDK/Source/AutoTrack/Tracker/TDAppEndTracker.m.meta new file mode 100644 index 00000000..55c1e5d7 --- /dev/null +++ b/Assets/HCMiniSdk/Third/ta/Plugins/iOS/ThinkingSDK/Source/AutoTrack/Tracker/TDAppEndTracker.m.meta @@ -0,0 +1,33 @@ +fileFormatVersion: 2 +guid: 4d35cb2477a7d4d7cb3de90ac7b73eca +PluginImporter: + externalObjects: {} + serializedVersion: 2 + iconMap: {} + executionOrder: {} + defineConstraints: [] + isPreloaded: 0 + isOverridable: 0 + isExplicitlyReferenced: 0 + validateReferences: 1 + platformData: + - first: + Any: + second: + enabled: 0 + settings: {} + - first: + Editor: Editor + second: + enabled: 0 + settings: + DefaultValueInitialized: true + - first: + iPhone: iOS + second: + enabled: 1 + settings: + AddToEmbeddedBinaries: false + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/HCMiniSdk/Third/ta/Plugins/iOS/ThinkingSDK/Source/AutoTrack/Tracker/TDAutoTracker.h b/Assets/HCMiniSdk/Third/ta/Plugins/iOS/ThinkingSDK/Source/AutoTrack/Tracker/TDAutoTracker.h new file mode 100755 index 00000000..88f06d47 --- /dev/null +++ b/Assets/HCMiniSdk/Third/ta/Plugins/iOS/ThinkingSDK/Source/AutoTrack/Tracker/TDAutoTracker.h @@ -0,0 +1,28 @@ +// +// TDAutoTracker.h +// ThinkingSDK +// +// Created by wwango on 2021/10/13. +// Copyright © 2021 thinkingdata. All rights reserved. +// + +#import +#import "ThinkingAnalyticsSDK.h" +#import "TAAutoTrackEvent.h" + +NS_ASSUME_NONNULL_BEGIN + +@interface TDAutoTracker : NSObject + +@property (atomic, assign) BOOL isOneTime; + +@property (atomic, assign) BOOL autoFlush; + +@property (atomic, assign) BOOL additionalCondition; + +- (void)trackWithInstanceTag:(NSString *)instanceName event:(TAAutoTrackEvent *)event params:(nullable NSDictionary *)params; + + +@end + +NS_ASSUME_NONNULL_END diff --git a/Assets/HCMiniSdk/Third/ta/Plugins/iOS/ThinkingSDK/Source/AutoTrack/Tracker/TDAutoTracker.h.meta b/Assets/HCMiniSdk/Third/ta/Plugins/iOS/ThinkingSDK/Source/AutoTrack/Tracker/TDAutoTracker.h.meta new file mode 100644 index 00000000..ce106e8d --- /dev/null +++ b/Assets/HCMiniSdk/Third/ta/Plugins/iOS/ThinkingSDK/Source/AutoTrack/Tracker/TDAutoTracker.h.meta @@ -0,0 +1,33 @@ +fileFormatVersion: 2 +guid: eb845cd4c31074234baa5452aa01b957 +PluginImporter: + externalObjects: {} + serializedVersion: 2 + iconMap: {} + executionOrder: {} + defineConstraints: [] + isPreloaded: 0 + isOverridable: 0 + isExplicitlyReferenced: 0 + validateReferences: 1 + platformData: + - first: + Any: + second: + enabled: 0 + settings: {} + - first: + Editor: Editor + second: + enabled: 0 + settings: + DefaultValueInitialized: true + - first: + iPhone: iOS + second: + enabled: 1 + settings: + AddToEmbeddedBinaries: false + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/HCMiniSdk/Third/ta/Plugins/iOS/ThinkingSDK/Source/AutoTrack/Tracker/TDAutoTracker.m b/Assets/HCMiniSdk/Third/ta/Plugins/iOS/ThinkingSDK/Source/AutoTrack/Tracker/TDAutoTracker.m new file mode 100755 index 00000000..93ae854a --- /dev/null +++ b/Assets/HCMiniSdk/Third/ta/Plugins/iOS/ThinkingSDK/Source/AutoTrack/Tracker/TDAutoTracker.m @@ -0,0 +1,67 @@ +// +// TDAutoTracker.m +// ThinkingSDK +// +// Created by wwango on 2021/10/13. +// Copyright © 2021 thinkingdata. All rights reserved. +// + +#import "TDAutoTracker.h" +#import "ThinkingAnalyticsSDKPrivate.h" + +@interface TDAutoTracker () + +@property (nonatomic, strong) NSMutableDictionary *trackCounts; + +@end + +@implementation TDAutoTracker + +- (instancetype)init +{ + self = [super init]; + if (self) { + _isOneTime = NO; + _autoFlush = YES; + _additionalCondition = YES; + + self.trackCounts = [NSMutableDictionary dictionary]; + } + return self; +} + +- (void)trackWithInstanceTag:(NSString *)instanceName event:(TAAutoTrackEvent *)event params:(NSDictionary *)params { + if ([self canTrackWithInstanceToken:instanceName]) { + ThinkingAnalyticsSDK *instance = [ThinkingAnalyticsSDK sharedInstanceWithAppid:instanceName]; +#ifdef DEBUG + if (!instance) { + @throw [NSException exceptionWithName:@"Thinkingdata Exception" reason:[NSString stringWithFormat:@"check this thinking instance, instanceTag: %@", instanceName] userInfo:nil]; + } +#endif + [instance autoTrackWithEvent:event properties:params]; + + if (self.autoFlush) [instance flush]; + } +} + +- (BOOL)canTrackWithInstanceToken:(NSString *)token { + + if (!self.additionalCondition) { + return NO; + } + + NSInteger trackCount = [self.trackCounts[token] integerValue]; + + if (self.isOneTime && trackCount >= 1) { + return NO; + } + + if (self.isOneTime) { + trackCount++; + self.trackCounts[token] = @(trackCount); + } + + return YES; +} + +@end diff --git a/Assets/HCMiniSdk/Third/ta/Plugins/iOS/ThinkingSDK/Source/AutoTrack/Tracker/TDAutoTracker.m.meta b/Assets/HCMiniSdk/Third/ta/Plugins/iOS/ThinkingSDK/Source/AutoTrack/Tracker/TDAutoTracker.m.meta new file mode 100644 index 00000000..be5a54e2 --- /dev/null +++ b/Assets/HCMiniSdk/Third/ta/Plugins/iOS/ThinkingSDK/Source/AutoTrack/Tracker/TDAutoTracker.m.meta @@ -0,0 +1,33 @@ +fileFormatVersion: 2 +guid: 37c4139007b304431bc20e515eacb5bb +PluginImporter: + externalObjects: {} + serializedVersion: 2 + iconMap: {} + executionOrder: {} + defineConstraints: [] + isPreloaded: 0 + isOverridable: 0 + isExplicitlyReferenced: 0 + validateReferences: 1 + platformData: + - first: + Any: + second: + enabled: 0 + settings: {} + - first: + Editor: Editor + second: + enabled: 0 + settings: + DefaultValueInitialized: true + - first: + iPhone: iOS + second: + enabled: 1 + settings: + AddToEmbeddedBinaries: false + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/HCMiniSdk/Third/ta/Plugins/iOS/ThinkingSDK/Source/AutoTrack/Tracker/TDColdStartTracker.h b/Assets/HCMiniSdk/Third/ta/Plugins/iOS/ThinkingSDK/Source/AutoTrack/Tracker/TDColdStartTracker.h new file mode 100755 index 00000000..9b76e5c9 --- /dev/null +++ b/Assets/HCMiniSdk/Third/ta/Plugins/iOS/ThinkingSDK/Source/AutoTrack/Tracker/TDColdStartTracker.h @@ -0,0 +1,16 @@ +// +// TDColdStartTracker.h +// ThinkingSDK +// +// Created by Yangxiongon 2022/7/1. +// + +#import "TDAutoTracker.h" + +NS_ASSUME_NONNULL_BEGIN + +@interface TDColdStartTracker : TDAutoTracker + +@end + +NS_ASSUME_NONNULL_END diff --git a/Assets/HCMiniSdk/Third/ta/Plugins/iOS/ThinkingSDK/Source/AutoTrack/Tracker/TDColdStartTracker.h.meta b/Assets/HCMiniSdk/Third/ta/Plugins/iOS/ThinkingSDK/Source/AutoTrack/Tracker/TDColdStartTracker.h.meta new file mode 100644 index 00000000..430716a7 --- /dev/null +++ b/Assets/HCMiniSdk/Third/ta/Plugins/iOS/ThinkingSDK/Source/AutoTrack/Tracker/TDColdStartTracker.h.meta @@ -0,0 +1,33 @@ +fileFormatVersion: 2 +guid: 1d55b13ee71a645fb9ac64cf57507008 +PluginImporter: + externalObjects: {} + serializedVersion: 2 + iconMap: {} + executionOrder: {} + defineConstraints: [] + isPreloaded: 0 + isOverridable: 0 + isExplicitlyReferenced: 0 + validateReferences: 1 + platformData: + - first: + Any: + second: + enabled: 0 + settings: {} + - first: + Editor: Editor + second: + enabled: 0 + settings: + DefaultValueInitialized: true + - first: + iPhone: iOS + second: + enabled: 1 + settings: + AddToEmbeddedBinaries: false + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/HCMiniSdk/Third/ta/Plugins/iOS/ThinkingSDK/Source/AutoTrack/Tracker/TDColdStartTracker.m b/Assets/HCMiniSdk/Third/ta/Plugins/iOS/ThinkingSDK/Source/AutoTrack/Tracker/TDColdStartTracker.m new file mode 100755 index 00000000..04fc57aa --- /dev/null +++ b/Assets/HCMiniSdk/Third/ta/Plugins/iOS/ThinkingSDK/Source/AutoTrack/Tracker/TDColdStartTracker.m @@ -0,0 +1,19 @@ +// +// TDColdStartTracker.m +// ThinkingSDK +// +// Created by Yangxiongon 2022/7/1. +// + +#import "TDColdStartTracker.h" + +@implementation TDColdStartTracker + +- (instancetype)init { + if (self = [super init]) { + self.isOneTime = YES; + } + return self; +} + +@end diff --git a/Assets/HCMiniSdk/Third/ta/Plugins/iOS/ThinkingSDK/Source/AutoTrack/Tracker/TDColdStartTracker.m.meta b/Assets/HCMiniSdk/Third/ta/Plugins/iOS/ThinkingSDK/Source/AutoTrack/Tracker/TDColdStartTracker.m.meta new file mode 100644 index 00000000..9b8c06bd --- /dev/null +++ b/Assets/HCMiniSdk/Third/ta/Plugins/iOS/ThinkingSDK/Source/AutoTrack/Tracker/TDColdStartTracker.m.meta @@ -0,0 +1,33 @@ +fileFormatVersion: 2 +guid: f877656a50550492bac50b5751b362a5 +PluginImporter: + externalObjects: {} + serializedVersion: 2 + iconMap: {} + executionOrder: {} + defineConstraints: [] + isPreloaded: 0 + isOverridable: 0 + isExplicitlyReferenced: 0 + validateReferences: 1 + platformData: + - first: + Any: + second: + enabled: 0 + settings: {} + - first: + Editor: Editor + second: + enabled: 0 + settings: + DefaultValueInitialized: true + - first: + iPhone: iOS + second: + enabled: 1 + settings: + AddToEmbeddedBinaries: false + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/HCMiniSdk/Third/ta/Plugins/iOS/ThinkingSDK/Source/AutoTrack/Tracker/TDHotStartTracker.h b/Assets/HCMiniSdk/Third/ta/Plugins/iOS/ThinkingSDK/Source/AutoTrack/Tracker/TDHotStartTracker.h new file mode 100755 index 00000000..4323db2c --- /dev/null +++ b/Assets/HCMiniSdk/Third/ta/Plugins/iOS/ThinkingSDK/Source/AutoTrack/Tracker/TDHotStartTracker.h @@ -0,0 +1,16 @@ +// +// TDHotStartTracker.h +// ThinkingSDK +// +// Created by Yangxiongon 2022/7/1. +// + +#import "TDAutoTracker.h" + +NS_ASSUME_NONNULL_BEGIN + +@interface TDHotStartTracker : TDAutoTracker + +@end + +NS_ASSUME_NONNULL_END diff --git a/Assets/HCMiniSdk/Third/ta/Plugins/iOS/ThinkingSDK/Source/AutoTrack/Tracker/TDHotStartTracker.h.meta b/Assets/HCMiniSdk/Third/ta/Plugins/iOS/ThinkingSDK/Source/AutoTrack/Tracker/TDHotStartTracker.h.meta new file mode 100644 index 00000000..e4279ea1 --- /dev/null +++ b/Assets/HCMiniSdk/Third/ta/Plugins/iOS/ThinkingSDK/Source/AutoTrack/Tracker/TDHotStartTracker.h.meta @@ -0,0 +1,33 @@ +fileFormatVersion: 2 +guid: 4fb20614614b44d0ca7cc5cca29271d1 +PluginImporter: + externalObjects: {} + serializedVersion: 2 + iconMap: {} + executionOrder: {} + defineConstraints: [] + isPreloaded: 0 + isOverridable: 0 + isExplicitlyReferenced: 0 + validateReferences: 1 + platformData: + - first: + Any: + second: + enabled: 0 + settings: {} + - first: + Editor: Editor + second: + enabled: 0 + settings: + DefaultValueInitialized: true + - first: + iPhone: iOS + second: + enabled: 1 + settings: + AddToEmbeddedBinaries: false + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/HCMiniSdk/Third/ta/Plugins/iOS/ThinkingSDK/Source/AutoTrack/Tracker/TDHotStartTracker.m b/Assets/HCMiniSdk/Third/ta/Plugins/iOS/ThinkingSDK/Source/AutoTrack/Tracker/TDHotStartTracker.m new file mode 100755 index 00000000..53cecc0e --- /dev/null +++ b/Assets/HCMiniSdk/Third/ta/Plugins/iOS/ThinkingSDK/Source/AutoTrack/Tracker/TDHotStartTracker.m @@ -0,0 +1,12 @@ +// +// TDHotStartTracker.m +// ThinkingSDK +// +// Created by Yangxiongon 2022/7/1. +// + +#import "TDHotStartTracker.h" + +@implementation TDHotStartTracker + +@end diff --git a/Assets/HCMiniSdk/Third/ta/Plugins/iOS/ThinkingSDK/Source/AutoTrack/Tracker/TDHotStartTracker.m.meta b/Assets/HCMiniSdk/Third/ta/Plugins/iOS/ThinkingSDK/Source/AutoTrack/Tracker/TDHotStartTracker.m.meta new file mode 100644 index 00000000..8c53d0fd --- /dev/null +++ b/Assets/HCMiniSdk/Third/ta/Plugins/iOS/ThinkingSDK/Source/AutoTrack/Tracker/TDHotStartTracker.m.meta @@ -0,0 +1,33 @@ +fileFormatVersion: 2 +guid: ddf70b375e3c245f9a3484f2def07096 +PluginImporter: + externalObjects: {} + serializedVersion: 2 + iconMap: {} + executionOrder: {} + defineConstraints: [] + isPreloaded: 0 + isOverridable: 0 + isExplicitlyReferenced: 0 + validateReferences: 1 + platformData: + - first: + Any: + second: + enabled: 0 + settings: {} + - first: + Editor: Editor + second: + enabled: 0 + settings: + DefaultValueInitialized: true + - first: + iPhone: iOS + second: + enabled: 1 + settings: + AddToEmbeddedBinaries: false + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/HCMiniSdk/Third/ta/Plugins/iOS/ThinkingSDK/Source/AutoTrack/Tracker/TDInstallTracker.h b/Assets/HCMiniSdk/Third/ta/Plugins/iOS/ThinkingSDK/Source/AutoTrack/Tracker/TDInstallTracker.h new file mode 100755 index 00000000..f9f6aebf --- /dev/null +++ b/Assets/HCMiniSdk/Third/ta/Plugins/iOS/ThinkingSDK/Source/AutoTrack/Tracker/TDInstallTracker.h @@ -0,0 +1,17 @@ +// +// TDInstallTracker.h +// ThinkingSDK +// +// Created by wwango on 2021/10/13. +// Copyright © 2021 thinkingdata. All rights reserved. +// + +#import "TDAutoTracker.h" + +NS_ASSUME_NONNULL_BEGIN + +@interface TDInstallTracker : TDAutoTracker + +@end + +NS_ASSUME_NONNULL_END diff --git a/Assets/HCMiniSdk/Third/ta/Plugins/iOS/ThinkingSDK/Source/AutoTrack/Tracker/TDInstallTracker.h.meta b/Assets/HCMiniSdk/Third/ta/Plugins/iOS/ThinkingSDK/Source/AutoTrack/Tracker/TDInstallTracker.h.meta new file mode 100644 index 00000000..17f4ba7f --- /dev/null +++ b/Assets/HCMiniSdk/Third/ta/Plugins/iOS/ThinkingSDK/Source/AutoTrack/Tracker/TDInstallTracker.h.meta @@ -0,0 +1,33 @@ +fileFormatVersion: 2 +guid: b5418cddfc5c94976b671523079f3d99 +PluginImporter: + externalObjects: {} + serializedVersion: 2 + iconMap: {} + executionOrder: {} + defineConstraints: [] + isPreloaded: 0 + isOverridable: 0 + isExplicitlyReferenced: 0 + validateReferences: 1 + platformData: + - first: + Any: + second: + enabled: 0 + settings: {} + - first: + Editor: Editor + second: + enabled: 0 + settings: + DefaultValueInitialized: true + - first: + iPhone: iOS + second: + enabled: 1 + settings: + AddToEmbeddedBinaries: false + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/HCMiniSdk/Third/ta/Plugins/iOS/ThinkingSDK/Source/AutoTrack/Tracker/TDInstallTracker.m b/Assets/HCMiniSdk/Third/ta/Plugins/iOS/ThinkingSDK/Source/AutoTrack/Tracker/TDInstallTracker.m new file mode 100755 index 00000000..26d31cb0 --- /dev/null +++ b/Assets/HCMiniSdk/Third/ta/Plugins/iOS/ThinkingSDK/Source/AutoTrack/Tracker/TDInstallTracker.m @@ -0,0 +1,22 @@ +// +// TDInstallTracker.m +// ThinkingSDK +// +// Created by wwango on 2021/10/13. +// Copyright © 2021 thinkingdata. All rights reserved. +// + +#import "TDInstallTracker.h" +#import "TDDeviceInfo.h" + +@implementation TDInstallTracker + +- (BOOL)isOneTime { + return YES; +} + +- (BOOL)additionalCondition { + return [TDDeviceInfo sharedManager].isFirstOpen; +} + +@end diff --git a/Assets/HCMiniSdk/Third/ta/Plugins/iOS/ThinkingSDK/Source/AutoTrack/Tracker/TDInstallTracker.m.meta b/Assets/HCMiniSdk/Third/ta/Plugins/iOS/ThinkingSDK/Source/AutoTrack/Tracker/TDInstallTracker.m.meta new file mode 100644 index 00000000..2b9d7c9e --- /dev/null +++ b/Assets/HCMiniSdk/Third/ta/Plugins/iOS/ThinkingSDK/Source/AutoTrack/Tracker/TDInstallTracker.m.meta @@ -0,0 +1,33 @@ +fileFormatVersion: 2 +guid: 60a777c3a36f044dca34b330d75949f1 +PluginImporter: + externalObjects: {} + serializedVersion: 2 + iconMap: {} + executionOrder: {} + defineConstraints: [] + isPreloaded: 0 + isOverridable: 0 + isExplicitlyReferenced: 0 + validateReferences: 1 + platformData: + - first: + Any: + second: + enabled: 0 + settings: {} + - first: + Editor: Editor + second: + enabled: 0 + settings: + DefaultValueInitialized: true + - first: + iPhone: iOS + second: + enabled: 1 + settings: + AddToEmbeddedBinaries: false + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/HCMiniSdk/Third/ta/Plugins/iOS/ThinkingSDK/Source/AutoTrack/UIKit.meta b/Assets/HCMiniSdk/Third/ta/Plugins/iOS/ThinkingSDK/Source/AutoTrack/UIKit.meta new file mode 100644 index 00000000..84f1be00 --- /dev/null +++ b/Assets/HCMiniSdk/Third/ta/Plugins/iOS/ThinkingSDK/Source/AutoTrack/UIKit.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: 110fe4351dde84adaaceb4d3d1a724bc +folderAsset: yes +DefaultImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/HCMiniSdk/Third/ta/Plugins/iOS/ThinkingSDK/Source/AutoTrack/UIKit/UIApplication+AutoTrack.h b/Assets/HCMiniSdk/Third/ta/Plugins/iOS/ThinkingSDK/Source/AutoTrack/UIKit/UIApplication+AutoTrack.h new file mode 100755 index 00000000..65604946 --- /dev/null +++ b/Assets/HCMiniSdk/Third/ta/Plugins/iOS/ThinkingSDK/Source/AutoTrack/UIKit/UIApplication+AutoTrack.h @@ -0,0 +1,14 @@ +#import + +NS_ASSUME_NONNULL_BEGIN + +@interface UIApplication (AutoTrack) + +- (BOOL)td_sendAction:(SEL)action + to:(nullable id)to + from:(nullable id)from + forEvent:(nullable UIEvent *)event; + +@end + +NS_ASSUME_NONNULL_END diff --git a/Assets/HCMiniSdk/Third/ta/Plugins/iOS/ThinkingSDK/Source/AutoTrack/UIKit/UIApplication+AutoTrack.h.meta b/Assets/HCMiniSdk/Third/ta/Plugins/iOS/ThinkingSDK/Source/AutoTrack/UIKit/UIApplication+AutoTrack.h.meta new file mode 100644 index 00000000..0c684c3d --- /dev/null +++ b/Assets/HCMiniSdk/Third/ta/Plugins/iOS/ThinkingSDK/Source/AutoTrack/UIKit/UIApplication+AutoTrack.h.meta @@ -0,0 +1,33 @@ +fileFormatVersion: 2 +guid: 4231e3dad819f4cbcba8a5f9f21ec1fb +PluginImporter: + externalObjects: {} + serializedVersion: 2 + iconMap: {} + executionOrder: {} + defineConstraints: [] + isPreloaded: 0 + isOverridable: 0 + isExplicitlyReferenced: 0 + validateReferences: 1 + platformData: + - first: + Any: + second: + enabled: 0 + settings: {} + - first: + Editor: Editor + second: + enabled: 0 + settings: + DefaultValueInitialized: true + - first: + iPhone: iOS + second: + enabled: 1 + settings: + AddToEmbeddedBinaries: false + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/HCMiniSdk/Third/ta/Plugins/iOS/ThinkingSDK/Source/AutoTrack/UIKit/UIApplication+AutoTrack.m b/Assets/HCMiniSdk/Third/ta/Plugins/iOS/ThinkingSDK/Source/AutoTrack/UIKit/UIApplication+AutoTrack.m new file mode 100755 index 00000000..1d3640ff --- /dev/null +++ b/Assets/HCMiniSdk/Third/ta/Plugins/iOS/ThinkingSDK/Source/AutoTrack/UIKit/UIApplication+AutoTrack.m @@ -0,0 +1,24 @@ +#import "UIApplication+AutoTrack.h" +#import "TDAutoTrackManager.h" + +@implementation UIApplication (AutoTrack) + +- (BOOL)td_sendAction:(SEL)action to:(id)to from:(id)from forEvent:(UIEvent *)event { + if ([from isKindOfClass:[UIControl class]]) { + if (([from isKindOfClass:[UISwitch class]] || + [from isKindOfClass:[UISegmentedControl class]] || + [from isKindOfClass:[UIStepper class]])) { + [[TDAutoTrackManager sharedManager] trackEventView:from]; + } + + else if ([event isKindOfClass:[UIEvent class]] && + event.type == UIEventTypeTouches && + [[[event allTouches] anyObject] phase] == UITouchPhaseEnded) { + [[TDAutoTrackManager sharedManager] trackEventView:from]; + } + } + + return [self td_sendAction:action to:to from:from forEvent:event]; +} + +@end diff --git a/Assets/HCMiniSdk/Third/ta/Plugins/iOS/ThinkingSDK/Source/AutoTrack/UIKit/UIApplication+AutoTrack.m.meta b/Assets/HCMiniSdk/Third/ta/Plugins/iOS/ThinkingSDK/Source/AutoTrack/UIKit/UIApplication+AutoTrack.m.meta new file mode 100644 index 00000000..f548302c --- /dev/null +++ b/Assets/HCMiniSdk/Third/ta/Plugins/iOS/ThinkingSDK/Source/AutoTrack/UIKit/UIApplication+AutoTrack.m.meta @@ -0,0 +1,33 @@ +fileFormatVersion: 2 +guid: 894a13b5eda684890a9d7cac8ae3126e +PluginImporter: + externalObjects: {} + serializedVersion: 2 + iconMap: {} + executionOrder: {} + defineConstraints: [] + isPreloaded: 0 + isOverridable: 0 + isExplicitlyReferenced: 0 + validateReferences: 1 + platformData: + - first: + Any: + second: + enabled: 0 + settings: {} + - first: + Editor: Editor + second: + enabled: 0 + settings: + DefaultValueInitialized: true + - first: + iPhone: iOS + second: + enabled: 1 + settings: + AddToEmbeddedBinaries: false + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/HCMiniSdk/Third/ta/Plugins/iOS/ThinkingSDK/Source/AutoTrack/UIKit/UIView+ThinkingAnalytics.h b/Assets/HCMiniSdk/Third/ta/Plugins/iOS/ThinkingSDK/Source/AutoTrack/UIKit/UIView+ThinkingAnalytics.h new file mode 100755 index 00000000..30d41ccf --- /dev/null +++ b/Assets/HCMiniSdk/Third/ta/Plugins/iOS/ThinkingSDK/Source/AutoTrack/UIKit/UIView+ThinkingAnalytics.h @@ -0,0 +1,51 @@ +// +// UIView+ThinkingAnalytics.h +// ThinkingSDK +// +// Created by Yangxiongon 2022/7/1. +// + +#import + +NS_ASSUME_NONNULL_BEGIN + +@interface UIView (ThinkingAnalytics) + +/** + Set the control element ID + */ +@property (copy,nonatomic) NSString *thinkingAnalyticsViewID; + +/** + Configure the control element ID of APPID + */ +@property (strong,nonatomic) NSDictionary *thinkingAnalyticsViewIDWithAppid; + +/** + Ignore the click event of a control + */ +@property (nonatomic,assign) BOOL thinkingAnalyticsIgnoreView; + +/** + Configure APPID to ignore the click event of a control + */ +@property (strong,nonatomic) NSDictionary *thinkingAnalyticsIgnoreViewWithAppid; + +/** + Properties of custom control click event + */ +@property (strong,nonatomic) NSDictionary *thinkingAnalyticsViewProperties; + +/** + Configure the properties of the APPID custom control click event + */ +@property (strong,nonatomic) NSDictionary *thinkingAnalyticsViewPropertiesWithAppid; + +/** + thinkingAnalyticsDelegate + */ +@property (nonatomic, weak, nullable) id thinkingAnalyticsDelegate; + +@end + +NS_ASSUME_NONNULL_END diff --git a/Assets/HCMiniSdk/Third/ta/Plugins/iOS/ThinkingSDK/Source/AutoTrack/UIKit/UIView+ThinkingAnalytics.h.meta b/Assets/HCMiniSdk/Third/ta/Plugins/iOS/ThinkingSDK/Source/AutoTrack/UIKit/UIView+ThinkingAnalytics.h.meta new file mode 100644 index 00000000..981fd57f --- /dev/null +++ b/Assets/HCMiniSdk/Third/ta/Plugins/iOS/ThinkingSDK/Source/AutoTrack/UIKit/UIView+ThinkingAnalytics.h.meta @@ -0,0 +1,33 @@ +fileFormatVersion: 2 +guid: a5a8c330e1377497dba3d444335c5d1d +PluginImporter: + externalObjects: {} + serializedVersion: 2 + iconMap: {} + executionOrder: {} + defineConstraints: [] + isPreloaded: 0 + isOverridable: 0 + isExplicitlyReferenced: 0 + validateReferences: 1 + platformData: + - first: + Any: + second: + enabled: 0 + settings: {} + - first: + Editor: Editor + second: + enabled: 0 + settings: + DefaultValueInitialized: true + - first: + iPhone: iOS + second: + enabled: 1 + settings: + AddToEmbeddedBinaries: false + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/HCMiniSdk/Third/ta/Plugins/iOS/ThinkingSDK/Source/AutoTrack/UIKit/UIView+ThinkingAnalytics.m b/Assets/HCMiniSdk/Third/ta/Plugins/iOS/ThinkingSDK/Source/AutoTrack/UIKit/UIView+ThinkingAnalytics.m new file mode 100755 index 00000000..6cb65092 --- /dev/null +++ b/Assets/HCMiniSdk/Third/ta/Plugins/iOS/ThinkingSDK/Source/AutoTrack/UIKit/UIView+ThinkingAnalytics.m @@ -0,0 +1,77 @@ +// +// UIView+ThinkingAnalytics.m +// ThinkingSDK +// +// Created by Yangxiongon 2022/7/1. +// + +#import "UIView+ThinkingAnalytics.h" +#import + +static char TD_AUTOTRACK_VIEW_ID; +static char TD_AUTOTRACK_VIEW_ID_APPID; +static char TD_AUTOTRACK_VIEW_IGNORE; +static char TD_AUTOTRACK_VIEW_IGNORE_APPID; +static char TD_AUTOTRACK_VIEW_PROPERTIES; +static char TD_AUTOTRACK_VIEW_PROPERTIES_APPID; +static char TD_AUTOTRACK_VIEW_DELEGATE; + +@implementation UIView (ThinkingAnalytics) + +- (NSString *)thinkingAnalyticsViewID { + return objc_getAssociatedObject(self, &TD_AUTOTRACK_VIEW_ID); +} + +- (void)setThinkingAnalyticsViewID:(NSString *)thinkingAnalyticsViewID { + objc_setAssociatedObject(self, &TD_AUTOTRACK_VIEW_ID, thinkingAnalyticsViewID, OBJC_ASSOCIATION_COPY_NONATOMIC); +} + +- (BOOL)thinkingAnalyticsIgnoreView { + return [objc_getAssociatedObject(self, &TD_AUTOTRACK_VIEW_IGNORE) boolValue]; +} + +- (void)setThinkingAnalyticsIgnoreView:(BOOL)thinkingAnalyticsIgnoreView { + objc_setAssociatedObject(self, &TD_AUTOTRACK_VIEW_IGNORE, [NSNumber numberWithBool:thinkingAnalyticsIgnoreView], OBJC_ASSOCIATION_ASSIGN); +} + +- (NSDictionary *)thinkingAnalyticsIgnoreViewWithAppid { + return objc_getAssociatedObject(self, &TD_AUTOTRACK_VIEW_IGNORE_APPID); +} + +- (void)setThinkingAnalyticsIgnoreViewWithAppid:(NSDictionary *)thinkingAnalyticsViewProperties { + objc_setAssociatedObject(self, &TD_AUTOTRACK_VIEW_IGNORE_APPID, thinkingAnalyticsViewProperties, OBJC_ASSOCIATION_RETAIN_NONATOMIC); +} + +- (NSDictionary *)thinkingAnalyticsViewIDWithAppid { + return objc_getAssociatedObject(self, &TD_AUTOTRACK_VIEW_ID_APPID); +} + +- (void)setThinkingAnalyticsViewIDWithAppid:(NSDictionary *)thinkingAnalyticsViewProperties { + objc_setAssociatedObject(self, &TD_AUTOTRACK_VIEW_ID_APPID, thinkingAnalyticsViewProperties, OBJC_ASSOCIATION_RETAIN_NONATOMIC); +} + +- (NSDictionary *)thinkingAnalyticsViewProperties { + return objc_getAssociatedObject(self, &TD_AUTOTRACK_VIEW_PROPERTIES); +} + +- (void)setThinkingAnalyticsViewProperties:(NSDictionary *)thinkingAnalyticsViewProperties { + objc_setAssociatedObject(self, &TD_AUTOTRACK_VIEW_PROPERTIES, thinkingAnalyticsViewProperties, OBJC_ASSOCIATION_RETAIN_NONATOMIC); +} + +- (NSDictionary *)thinkingAnalyticsViewPropertiesWithAppid { + return objc_getAssociatedObject(self, &TD_AUTOTRACK_VIEW_PROPERTIES_APPID); +} + +- (void)setThinkingAnalyticsViewPropertiesWithAppid:(NSDictionary *)thinkingAnalyticsViewProperties { + objc_setAssociatedObject(self, &TD_AUTOTRACK_VIEW_PROPERTIES_APPID, thinkingAnalyticsViewProperties, OBJC_ASSOCIATION_RETAIN_NONATOMIC); +} + +- (id)thinkingAnalyticsDelegate { + return objc_getAssociatedObject(self, &TD_AUTOTRACK_VIEW_DELEGATE); +} + +- (void)setThinkingAnalyticsDelegate:(id)thinkingAnalyticsDelegate { + objc_setAssociatedObject(self, &TD_AUTOTRACK_VIEW_DELEGATE, thinkingAnalyticsDelegate, OBJC_ASSOCIATION_ASSIGN); +} + +@end diff --git a/Assets/HCMiniSdk/Third/ta/Plugins/iOS/ThinkingSDK/Source/AutoTrack/UIKit/UIView+ThinkingAnalytics.m.meta b/Assets/HCMiniSdk/Third/ta/Plugins/iOS/ThinkingSDK/Source/AutoTrack/UIKit/UIView+ThinkingAnalytics.m.meta new file mode 100644 index 00000000..1d00c2c9 --- /dev/null +++ b/Assets/HCMiniSdk/Third/ta/Plugins/iOS/ThinkingSDK/Source/AutoTrack/UIKit/UIView+ThinkingAnalytics.m.meta @@ -0,0 +1,33 @@ +fileFormatVersion: 2 +guid: 386fae234a3a846a98321d5e551238b5 +PluginImporter: + externalObjects: {} + serializedVersion: 2 + iconMap: {} + executionOrder: {} + defineConstraints: [] + isPreloaded: 0 + isOverridable: 0 + isExplicitlyReferenced: 0 + validateReferences: 1 + platformData: + - first: + Any: + second: + enabled: 0 + settings: {} + - first: + Editor: Editor + second: + enabled: 0 + settings: + DefaultValueInitialized: true + - first: + iPhone: iOS + second: + enabled: 1 + settings: + AddToEmbeddedBinaries: false + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/HCMiniSdk/Third/ta/Plugins/iOS/ThinkingSDK/Source/AutoTrack/UIKit/UIViewController+AutoTrack.h b/Assets/HCMiniSdk/Third/ta/Plugins/iOS/ThinkingSDK/Source/AutoTrack/UIKit/UIViewController+AutoTrack.h new file mode 100755 index 00000000..4e2e17c7 --- /dev/null +++ b/Assets/HCMiniSdk/Third/ta/Plugins/iOS/ThinkingSDK/Source/AutoTrack/UIKit/UIViewController+AutoTrack.h @@ -0,0 +1,7 @@ +#import + +@interface UIViewController (AutoTrack) + +- (void)td_autotrack_viewWillAppear:(BOOL)animated; + +@end diff --git a/Assets/HCMiniSdk/Third/ta/Plugins/iOS/ThinkingSDK/Source/AutoTrack/UIKit/UIViewController+AutoTrack.h.meta b/Assets/HCMiniSdk/Third/ta/Plugins/iOS/ThinkingSDK/Source/AutoTrack/UIKit/UIViewController+AutoTrack.h.meta new file mode 100644 index 00000000..39215b85 --- /dev/null +++ b/Assets/HCMiniSdk/Third/ta/Plugins/iOS/ThinkingSDK/Source/AutoTrack/UIKit/UIViewController+AutoTrack.h.meta @@ -0,0 +1,33 @@ +fileFormatVersion: 2 +guid: 529ad0356001a49ae855e1c55175fba5 +PluginImporter: + externalObjects: {} + serializedVersion: 2 + iconMap: {} + executionOrder: {} + defineConstraints: [] + isPreloaded: 0 + isOverridable: 0 + isExplicitlyReferenced: 0 + validateReferences: 1 + platformData: + - first: + Any: + second: + enabled: 0 + settings: {} + - first: + Editor: Editor + second: + enabled: 0 + settings: + DefaultValueInitialized: true + - first: + iPhone: iOS + second: + enabled: 1 + settings: + AddToEmbeddedBinaries: false + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/HCMiniSdk/Third/ta/Plugins/iOS/ThinkingSDK/Source/AutoTrack/UIKit/UIViewController+AutoTrack.m b/Assets/HCMiniSdk/Third/ta/Plugins/iOS/ThinkingSDK/Source/AutoTrack/UIKit/UIViewController+AutoTrack.m new file mode 100755 index 00000000..f563f69b --- /dev/null +++ b/Assets/HCMiniSdk/Third/ta/Plugins/iOS/ThinkingSDK/Source/AutoTrack/UIKit/UIViewController+AutoTrack.m @@ -0,0 +1,16 @@ +#import "UIViewController+AutoTrack.h" +#import "TDAutoTrackManager.h" +#import "TDLogging.h" + +@implementation UIViewController (AutoTrack) + +- (void)td_autotrack_viewWillAppear:(BOOL)animated { + @try { + [[TDAutoTrackManager sharedManager] viewControlWillAppear:self]; + } @catch (NSException *exception) { + TDLogError(@"%@ error: %@", self, exception); + } + [self td_autotrack_viewWillAppear:animated]; +} + +@end diff --git a/Assets/HCMiniSdk/Third/ta/Plugins/iOS/ThinkingSDK/Source/AutoTrack/UIKit/UIViewController+AutoTrack.m.meta b/Assets/HCMiniSdk/Third/ta/Plugins/iOS/ThinkingSDK/Source/AutoTrack/UIKit/UIViewController+AutoTrack.m.meta new file mode 100644 index 00000000..0db0e203 --- /dev/null +++ b/Assets/HCMiniSdk/Third/ta/Plugins/iOS/ThinkingSDK/Source/AutoTrack/UIKit/UIViewController+AutoTrack.m.meta @@ -0,0 +1,33 @@ +fileFormatVersion: 2 +guid: efb2847493fa54184af815adecc38259 +PluginImporter: + externalObjects: {} + serializedVersion: 2 + iconMap: {} + executionOrder: {} + defineConstraints: [] + isPreloaded: 0 + isOverridable: 0 + isExplicitlyReferenced: 0 + validateReferences: 1 + platformData: + - first: + Any: + second: + enabled: 0 + settings: {} + - first: + Editor: Editor + second: + enabled: 0 + settings: + DefaultValueInitialized: true + - first: + iPhone: iOS + second: + enabled: 1 + settings: + AddToEmbeddedBinaries: false + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/HCMiniSdk/Third/ta/Plugins/iOS/ThinkingSDK/Source/Config.meta b/Assets/HCMiniSdk/Third/ta/Plugins/iOS/ThinkingSDK/Source/Config.meta new file mode 100644 index 00000000..18325ff7 --- /dev/null +++ b/Assets/HCMiniSdk/Third/ta/Plugins/iOS/ThinkingSDK/Source/Config.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: c12da08287e3048dabcda0f70108dd46 +folderAsset: yes +DefaultImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/HCMiniSdk/Third/ta/Plugins/iOS/ThinkingSDK/Source/Config/TDConfig.h b/Assets/HCMiniSdk/Third/ta/Plugins/iOS/ThinkingSDK/Source/Config/TDConfig.h new file mode 100755 index 00000000..ec231ff0 --- /dev/null +++ b/Assets/HCMiniSdk/Third/ta/Plugins/iOS/ThinkingSDK/Source/Config/TDConfig.h @@ -0,0 +1,121 @@ +#import + +#if __has_include() +#import +#else +#import "TDConstant.h" +#endif + +#if __has_include() +#import +#else +#import "TDSecurityPolicy.h" +#endif + +#if TARGET_OS_IOS +#if __has_include() +#import +#else +#import "TDSecretKey.h" +#endif +#endif + + + +NS_ASSUME_NONNULL_BEGIN + + + +@interface TDConfig:NSObject +/** + Set automatic burying type + */ +@property (assign, nonatomic) ThinkingAnalyticsAutoTrackEventType autoTrackEventType; +/** + Network environment for data transmission + */ +@property (assign, nonatomic) ThinkingNetworkType networkTypePolicy; +/** + Data upload interval + */ +@property (nonatomic, strong) NSNumber *uploadInterval; +/** + When there is data to upload, when the number of data cache reaches the uploadsize, upload the data immediately + */ +@property (nonatomic, strong) NSNumber *uploadSize; +/** + Event blacklist, event names that are not counted are added here + */ +@property (strong, nonatomic) NSArray *disableEvents; +/** + The maximum number of cached events, the default is 10000, the minimum is 5000 + */ +@property (class, nonatomic) NSInteger maxNumEvents DEPRECATED_MSG_ATTRIBUTE("Please config TAConfigInfo in main info.plist"); +/** + Data cache expiration time, the default is 10 days, the longest is 10 days + */ +@property (class, nonatomic) NSInteger expirationDays DEPRECATED_MSG_ATTRIBUTE("Please config TAConfigInfo in main info.plist"); +/** + appid + */ +@property (atomic, copy) NSString *appid; +/** + instance Token + */ +@property (atomic, copy) NSString *(^getInstanceName)(void); +/** + Server URL + */ +@property (atomic, copy) NSString *configureURL; + +/** + Initialize and configure background self-starting events + YES: Collect background self-starting events + NO: Do not collect background self-starting events + */ +@property (nonatomic, assign) BOOL trackRelaunchedInBackgroundEvents; +/** + Debug Mode +*/ +@property (nonatomic, assign) ThinkingAnalyticsDebugMode debugMode; + +/** +app launchOptions +*/ +@property (nonatomic, copy) NSDictionary *launchOptions; + +/** + Initialize and configure the certificate verification policy +*/ +@property (nonatomic, strong) TDSecurityPolicy *securityPolicy; + +/** + Set default time zone + You can use this time zone to compare the offset of the current time zone and the default time zone +*/ +@property (nonatomic, strong) NSTimeZone *defaultTimeZone; + +/** + instance name +*/ +@property (nonatomic, copy) NSString *name; + ++ (TDConfig *)defaultTDConfig; +- (instancetype)initWithAppId:(NSString *)appId serverUrl:(NSString *)serverUrl; +- (void)updateConfig:(void(^)(NSDictionary *secretKey))block; +- (void)setNetworkType:(ThinkingAnalyticsNetworkType)type; + + +/// enable encryption +@property (nonatomic, assign) BOOL enableEncrypt; + +#if TARGET_OS_IOS +/// Get local key configuration +@property (nonatomic, strong) TDSecretKey *secretKey; +#endif + +/// instance token +- (NSString *)getMapInstanceToken; + +@end +NS_ASSUME_NONNULL_END diff --git a/Assets/HCMiniSdk/Third/ta/Plugins/iOS/ThinkingSDK/Source/Config/TDConfig.h.meta b/Assets/HCMiniSdk/Third/ta/Plugins/iOS/ThinkingSDK/Source/Config/TDConfig.h.meta new file mode 100644 index 00000000..620544fa --- /dev/null +++ b/Assets/HCMiniSdk/Third/ta/Plugins/iOS/ThinkingSDK/Source/Config/TDConfig.h.meta @@ -0,0 +1,33 @@ +fileFormatVersion: 2 +guid: 138e749d506714c15bc9b7134cc64ee2 +PluginImporter: + externalObjects: {} + serializedVersion: 2 + iconMap: {} + executionOrder: {} + defineConstraints: [] + isPreloaded: 0 + isOverridable: 0 + isExplicitlyReferenced: 0 + validateReferences: 1 + platformData: + - first: + Any: + second: + enabled: 0 + settings: {} + - first: + Editor: Editor + second: + enabled: 0 + settings: + DefaultValueInitialized: true + - first: + iPhone: iOS + second: + enabled: 1 + settings: + AddToEmbeddedBinaries: false + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/HCMiniSdk/Third/ta/Plugins/iOS/ThinkingSDK/Source/Config/TDConfig.m b/Assets/HCMiniSdk/Third/ta/Plugins/iOS/ThinkingSDK/Source/Config/TDConfig.m new file mode 100755 index 00000000..9e85ee1f --- /dev/null +++ b/Assets/HCMiniSdk/Third/ta/Plugins/iOS/ThinkingSDK/Source/Config/TDConfig.m @@ -0,0 +1,187 @@ +#import "TDConfig.h" + +#import "TANetwork.h" +#import "ThinkingAnalyticsSDKPrivate.h" +#import "TDSecurityPolicy.h" +#import "TDFile.h" +#import "NSString+TDString.h" + +#define TDSDKSETTINGS_PLIST_SETTING_IMPL(TYPE, PLIST_KEY, GETTER, SETTER, DEFAULT_VALUE, ENABLE_CACHE) \ +static TYPE *g_##PLIST_KEY = nil; \ ++ (TYPE *)GETTER \ +{ \ + if (!g_##PLIST_KEY && ENABLE_CACHE) { \ + g_##PLIST_KEY = [[[NSUserDefaults standardUserDefaults] objectForKey:@#PLIST_KEY] copy]; \ + } \ + if (!g_##PLIST_KEY) { \ + g_##PLIST_KEY = [[[NSBundle mainBundle] objectForInfoDictionaryKey:@#PLIST_KEY] copy] ?: DEFAULT_VALUE; \ + } \ + return g_##PLIST_KEY; \ +} \ ++ (void)SETTER:(TYPE *)value { \ + g_##PLIST_KEY = [value copy]; \ + if (ENABLE_CACHE) { \ + if (value) { \ + [[NSUserDefaults standardUserDefaults] setObject:value forKey:@#PLIST_KEY]; \ + } else { \ + [[NSUserDefaults standardUserDefaults] removeObjectForKey:@#PLIST_KEY]; \ + } \ + } \ +} + + +#define kTAConfigInfo @"TAConfigInfo" + + +static TDConfig * _defaultTDConfig; +static NSDictionary *configInfo; + +@implementation TDConfig + +TDSDKSETTINGS_PLIST_SETTING_IMPL(NSNumber, ThinkingSDKMaxCacheSize, _maxNumEventsNumber, _setMaxNumEventsNumber, @10000, NO); +TDSDKSETTINGS_PLIST_SETTING_IMPL(NSNumber, ThinkingSDKExpirationDays, _expirationDaysNumber, _setExpirationDaysNumber, @10, NO); + ++ (TDConfig *)defaultTDConfig { + static dispatch_once_t onceToken; + dispatch_once(&onceToken, ^{ + _defaultTDConfig = [TDConfig new]; + + }); + return _defaultTDConfig; +} + +- (instancetype)init { + self = [super init]; + if (self) { + _trackRelaunchedInBackgroundEvents = NO; + _autoTrackEventType = ThinkingAnalyticsEventTypeNone; + _networkTypePolicy = ThinkingNetworkTypeWIFI | ThinkingNetworkType3G | ThinkingNetworkType4G | ThinkingNetworkType2G | ThinkingNetworkType5G; + _securityPolicy = [TDSecurityPolicy defaultPolicy]; + _defaultTimeZone = [NSTimeZone localTimeZone]; + +#pragma clang diagnostic push +#pragma clang diagnostic ignored "-Wdeprecated-declarations" + if (!configInfo) { + configInfo = (NSDictionary *)[[[NSBundle mainBundle] infoDictionary] objectForKey: kTAConfigInfo]; + } + + if (configInfo && [configInfo.allKeys containsObject:@"maxNumEvents"]) { + [TDConfig setMaxNumEvents:[configInfo[@"maxNumEvents"] integerValue]]; + } + if (configInfo && [configInfo.allKeys containsObject:@"expirationDays"]) { + [TDConfig setExpirationDays:[configInfo[@"expirationDays"] integerValue]]; + } +#pragma clang diagnostic pop + + } + return self; +} + +- (instancetype)initWithAppId:(NSString *)appId serverUrl:(NSString *)serverUrl +{ + self = [self init]; + if (self) { + _appid = appId; + _configureURL = serverUrl; + } + return self; +} + + +- (void)setName:(NSString *)name { + _name = name.td_trim; +} + +- (void)updateConfig:(void(^)(NSDictionary *secretKey))block { + NSString *serverUrlStr = [NSString stringWithFormat:@"%@/config",self.configureURL]; + TANetwork *network = [[TANetwork alloc] init]; + network.serverURL = [NSURL URLWithString:serverUrlStr]; + network.securityPolicy = _securityPolicy; + + [network fetchRemoteConfig:self.appid handler:^(NSDictionary * _Nonnull result, NSError * _Nullable error) { + if (!error) { + NSInteger uploadInterval = [[result objectForKey:@"sync_interval"] integerValue]; + NSInteger uploadSize = [[result objectForKey:@"sync_batch_size"] integerValue]; + if (uploadInterval != [self->_uploadInterval integerValue] || uploadSize != [self->_uploadSize integerValue]) { + TDFile *file = [[TDFile alloc] initWithAppid:self.appid]; + if (uploadInterval > 0) { + self.uploadInterval = [NSNumber numberWithInteger:uploadInterval]; + [file archiveUploadInterval:self.uploadInterval]; + NSString *name = self.getInstanceName ? self.getInstanceName() : self.appid; + [[ThinkingAnalyticsSDK sharedInstanceWithAppid:name] startFlushTimer]; + } + if (uploadSize > 0) { + self.uploadSize = [NSNumber numberWithInteger:uploadSize]; + [file archiveUploadSize:self.uploadSize]; + } + } + self.disableEvents = [result objectForKey:@"disable_event_list"]; + + if (block) { + block([result objectForKey:@"secret_key"]); + } + } + }]; +} + +- (void)setNetworkType:(ThinkingAnalyticsNetworkType)type { + if (type == TDNetworkTypeDefault) { + _networkTypePolicy = ThinkingNetworkTypeWIFI | ThinkingNetworkType3G | ThinkingNetworkType4G | ThinkingNetworkType2G | ThinkingNetworkType5G; + } else if (type == TDNetworkTypeOnlyWIFI) { + _networkTypePolicy = ThinkingNetworkTypeWIFI; + } else if (type == TDNetworkTypeALL) { + _networkTypePolicy = ThinkingNetworkTypeWIFI | ThinkingNetworkType3G | ThinkingNetworkType4G | ThinkingNetworkType2G | ThinkingNetworkType5G; + } +} + +#pragma mark - NSCopying +- (id)copyWithZone:(NSZone *)zone { + TDConfig *config = [[[self class] allocWithZone:zone] init]; + config.trackRelaunchedInBackgroundEvents = self.trackRelaunchedInBackgroundEvents; + config.autoTrackEventType = self.autoTrackEventType; + config.networkTypePolicy = self.networkTypePolicy; + config.launchOptions = [self.launchOptions copyWithZone:zone]; + config.debugMode = self.debugMode; + config.securityPolicy = [self.securityPolicy copyWithZone:zone]; + config.defaultTimeZone = [self.defaultTimeZone copyWithZone:zone]; + config.name = [self.name copy]; + config.enableEncrypt = self.enableEncrypt; +#if TARGET_OS_IOS + config.secretKey = [self.secretKey copyWithZone:zone]; +#endif + + return config; +} + +#pragma mark - SETTINGS ++ (NSInteger)maxNumEvents { + NSInteger maxNumEvents = [self _maxNumEventsNumber].integerValue; + if (maxNumEvents < 5000) { + maxNumEvents = 5000; + } + return maxNumEvents; +} + ++ (void)setMaxNumEvents:(NSInteger)maxNumEventsNumber { + [self _setMaxNumEventsNumber:@(maxNumEventsNumber)]; +} + ++ (NSInteger)expirationDays { + NSInteger maxNumEvents = [self _expirationDaysNumber].integerValue; + return maxNumEvents >= 0 ? maxNumEvents : 10; +} + ++ (void)setExpirationDays:(NSInteger)expirationDays { + [self _setExpirationDaysNumber:@(expirationDays)]; +} + + +- (NSString *)getMapInstanceToken { + if (self.name && [self.name isKindOfClass:[NSString class]] && self.name.length) { + return self.name; + } else { + return self.appid; + } +} + +@end diff --git a/Assets/HCMiniSdk/Third/ta/Plugins/iOS/ThinkingSDK/Source/Config/TDConfig.m.meta b/Assets/HCMiniSdk/Third/ta/Plugins/iOS/ThinkingSDK/Source/Config/TDConfig.m.meta new file mode 100644 index 00000000..01743a2f --- /dev/null +++ b/Assets/HCMiniSdk/Third/ta/Plugins/iOS/ThinkingSDK/Source/Config/TDConfig.m.meta @@ -0,0 +1,33 @@ +fileFormatVersion: 2 +guid: 8af41e5499deb452491c8aa99ae7e698 +PluginImporter: + externalObjects: {} + serializedVersion: 2 + iconMap: {} + executionOrder: {} + defineConstraints: [] + isPreloaded: 0 + isOverridable: 0 + isExplicitlyReferenced: 0 + validateReferences: 1 + platformData: + - first: + Any: + second: + enabled: 0 + settings: {} + - first: + Editor: Editor + second: + enabled: 0 + settings: + DefaultValueInitialized: true + - first: + iPhone: iOS + second: + enabled: 1 + settings: + AddToEmbeddedBinaries: false + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/HCMiniSdk/Third/ta/Plugins/iOS/ThinkingSDK/Source/Config/TDPublicConfig.h b/Assets/HCMiniSdk/Third/ta/Plugins/iOS/ThinkingSDK/Source/Config/TDPublicConfig.h new file mode 100755 index 00000000..37de6abe --- /dev/null +++ b/Assets/HCMiniSdk/Third/ta/Plugins/iOS/ThinkingSDK/Source/Config/TDPublicConfig.h @@ -0,0 +1,22 @@ +// +// TDPublicConfig.h +// ThinkingSDK +// +// Created by LiHuanan on 2020/9/8. +// Copyright © 2020 thinkingdata. All rights reserved. +// + +#import + +NS_ASSUME_NONNULL_BEGIN + +@interface TDPublicConfig : NSObject + +@property(copy,nonatomic) NSArray* controllers; +@property(copy,nonatomic) NSString* version; ++ (NSArray*)controllers; ++ (NSString*)version; + +@end + +NS_ASSUME_NONNULL_END diff --git a/Assets/HCMiniSdk/Third/ta/Plugins/iOS/ThinkingSDK/Source/Config/TDPublicConfig.h.meta b/Assets/HCMiniSdk/Third/ta/Plugins/iOS/ThinkingSDK/Source/Config/TDPublicConfig.h.meta new file mode 100644 index 00000000..067724ad --- /dev/null +++ b/Assets/HCMiniSdk/Third/ta/Plugins/iOS/ThinkingSDK/Source/Config/TDPublicConfig.h.meta @@ -0,0 +1,33 @@ +fileFormatVersion: 2 +guid: d19be503ed4684ca2a2419354befb2f7 +PluginImporter: + externalObjects: {} + serializedVersion: 2 + iconMap: {} + executionOrder: {} + defineConstraints: [] + isPreloaded: 0 + isOverridable: 0 + isExplicitlyReferenced: 0 + validateReferences: 1 + platformData: + - first: + Any: + second: + enabled: 0 + settings: {} + - first: + Editor: Editor + second: + enabled: 0 + settings: + DefaultValueInitialized: true + - first: + iPhone: iOS + second: + enabled: 1 + settings: + AddToEmbeddedBinaries: false + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/HCMiniSdk/Third/ta/Plugins/iOS/ThinkingSDK/Source/Config/TDPublicConfig.m b/Assets/HCMiniSdk/Third/ta/Plugins/iOS/ThinkingSDK/Source/Config/TDPublicConfig.m new file mode 100755 index 00000000..707e8eec --- /dev/null +++ b/Assets/HCMiniSdk/Third/ta/Plugins/iOS/ThinkingSDK/Source/Config/TDPublicConfig.m @@ -0,0 +1,62 @@ +// +// TDPublicConfig.m +// ThinkingSDK +// +// Created by LiHuanan on 2020/9/8. +// Copyright © 2020 thinkingdata. All rights reserved. +// + +#import "TDPublicConfig.h" +static TDPublicConfig* config; + +@implementation TDPublicConfig ++ (void)load +{ + static dispatch_once_t onceToken; + dispatch_once(&onceToken, ^{ + config = [TDPublicConfig new]; + }); +} +- (instancetype)init +{ + self = [super init]; + if(self) + { + self.controllers = @[ + @"UICompatibilityInputViewController", + @"UIKeyboardCandidateGridCollectionViewController", + @"UIInputWindowController", + @"UIApplicationRotationFollowingController", + @"UIApplicationRotationFollowingControllerNoTouches", + @"UISystemKeyboardDockController", + @"UINavigationController", + @"SFBrowserRemoteViewController", + @"SFSafariViewController", + @"UIAlertController", + @"UIImagePickerController", + @"PUPhotoPickerHostViewController", + @"UIViewController", + @"UITableViewController", + @"UITabBarController", + @"_UIRemoteInputViewController", + @"UIEditingOverlayViewController", + @"_UIAlertControllerTextFieldViewController", + @"UIActivityGroupViewController", + @"_UISFAirDropInstructionsViewController", + @"_UIActivityGroupListViewController", + @"_UIShareExtensionRemoteViewController", + @"SLRemoteComposeViewController", + @"SLComposeViewController", + ]; + } + return self; +} ++ (NSArray*)controllers +{ + return config.controllers; +} ++ (NSString*)version +{ + return @"2.8.6"; +} +@end diff --git a/Assets/HCMiniSdk/Third/ta/Plugins/iOS/ThinkingSDK/Source/Config/TDPublicConfig.m.meta b/Assets/HCMiniSdk/Third/ta/Plugins/iOS/ThinkingSDK/Source/Config/TDPublicConfig.m.meta new file mode 100644 index 00000000..60d8b6b9 --- /dev/null +++ b/Assets/HCMiniSdk/Third/ta/Plugins/iOS/ThinkingSDK/Source/Config/TDPublicConfig.m.meta @@ -0,0 +1,33 @@ +fileFormatVersion: 2 +guid: 2ce9b91a7899b48d08e6a4657935e1a9 +PluginImporter: + externalObjects: {} + serializedVersion: 2 + iconMap: {} + executionOrder: {} + defineConstraints: [] + isPreloaded: 0 + isOverridable: 0 + isExplicitlyReferenced: 0 + validateReferences: 1 + platformData: + - first: + Any: + second: + enabled: 0 + settings: {} + - first: + Editor: Editor + second: + enabled: 0 + settings: + DefaultValueInitialized: true + - first: + iPhone: iOS + second: + enabled: 1 + settings: + AddToEmbeddedBinaries: false + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/HCMiniSdk/Third/ta/Plugins/iOS/ThinkingSDK/Source/Core.meta b/Assets/HCMiniSdk/Third/ta/Plugins/iOS/ThinkingSDK/Source/Core.meta new file mode 100644 index 00000000..dc3cb411 --- /dev/null +++ b/Assets/HCMiniSdk/Third/ta/Plugins/iOS/ThinkingSDK/Source/Core.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: 5ddf05fdbcea74afeabd72839d61d6cc +folderAsset: yes +DefaultImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/HCMiniSdk/Third/ta/Plugins/iOS/ThinkingSDK/Source/Core/CalibratedTime.meta b/Assets/HCMiniSdk/Third/ta/Plugins/iOS/ThinkingSDK/Source/Core/CalibratedTime.meta new file mode 100644 index 00000000..3cb74567 --- /dev/null +++ b/Assets/HCMiniSdk/Third/ta/Plugins/iOS/ThinkingSDK/Source/Core/CalibratedTime.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: 688f4c6c268624477b8d3c35267529b4 +folderAsset: yes +DefaultImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/HCMiniSdk/Third/ta/Plugins/iOS/ThinkingSDK/Source/Core/CalibratedTime/TDCalibratedTime.h b/Assets/HCMiniSdk/Third/ta/Plugins/iOS/ThinkingSDK/Source/Core/CalibratedTime/TDCalibratedTime.h new file mode 100755 index 00000000..fa4f944c --- /dev/null +++ b/Assets/HCMiniSdk/Third/ta/Plugins/iOS/ThinkingSDK/Source/Core/CalibratedTime/TDCalibratedTime.h @@ -0,0 +1,17 @@ +#import + +NS_ASSUME_NONNULL_BEGIN + +@interface TDCalibratedTime : NSObject + +@property (nonatomic, assign) NSTimeInterval systemUptime; +@property (nonatomic, assign) NSTimeInterval serverTime; +@property (nonatomic, assign) BOOL stopCalibrate; + ++ (instancetype)sharedInstance; + +- (void)recalibrationWithTimeInterval:(NSTimeInterval)timestamp; + +@end + +NS_ASSUME_NONNULL_END diff --git a/Assets/HCMiniSdk/Third/ta/Plugins/iOS/ThinkingSDK/Source/Core/CalibratedTime/TDCalibratedTime.h.meta b/Assets/HCMiniSdk/Third/ta/Plugins/iOS/ThinkingSDK/Source/Core/CalibratedTime/TDCalibratedTime.h.meta new file mode 100644 index 00000000..bf0479ce --- /dev/null +++ b/Assets/HCMiniSdk/Third/ta/Plugins/iOS/ThinkingSDK/Source/Core/CalibratedTime/TDCalibratedTime.h.meta @@ -0,0 +1,33 @@ +fileFormatVersion: 2 +guid: 9c4086dd97dfb43a1849fa65a7fcf0f5 +PluginImporter: + externalObjects: {} + serializedVersion: 2 + iconMap: {} + executionOrder: {} + defineConstraints: [] + isPreloaded: 0 + isOverridable: 0 + isExplicitlyReferenced: 0 + validateReferences: 1 + platformData: + - first: + Any: + second: + enabled: 0 + settings: {} + - first: + Editor: Editor + second: + enabled: 0 + settings: + DefaultValueInitialized: true + - first: + iPhone: iOS + second: + enabled: 1 + settings: + AddToEmbeddedBinaries: false + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/HCMiniSdk/Third/ta/Plugins/iOS/ThinkingSDK/Source/Core/CalibratedTime/TDCalibratedTime.m b/Assets/HCMiniSdk/Third/ta/Plugins/iOS/ThinkingSDK/Source/Core/CalibratedTime/TDCalibratedTime.m new file mode 100755 index 00000000..3d131aaf --- /dev/null +++ b/Assets/HCMiniSdk/Third/ta/Plugins/iOS/ThinkingSDK/Source/Core/CalibratedTime/TDCalibratedTime.m @@ -0,0 +1,29 @@ +#import "TDCalibratedTime.h" +#import "TDDeviceInfo.h" + +@implementation TDCalibratedTime + ++ (instancetype)sharedInstance { + static dispatch_once_t once; + static id sharedInstance; + dispatch_once(&once, ^{ + sharedInstance = [[self alloc] init]; + }); + return sharedInstance; +} + +- (instancetype)init { + if (self = [super init]) { + self.serverTime = [[NSDate date] timeIntervalSince1970]; + self.systemUptime = [TDDeviceInfo uptime]; + } + + return self; +} + +- (void)recalibrationWithTimeInterval:(NSTimeInterval)timestamp { + self.serverTime = timestamp; + self.systemUptime = [TDDeviceInfo uptime]; +} + +@end diff --git a/Assets/HCMiniSdk/Third/ta/Plugins/iOS/ThinkingSDK/Source/Core/CalibratedTime/TDCalibratedTime.m.meta b/Assets/HCMiniSdk/Third/ta/Plugins/iOS/ThinkingSDK/Source/Core/CalibratedTime/TDCalibratedTime.m.meta new file mode 100644 index 00000000..34686319 --- /dev/null +++ b/Assets/HCMiniSdk/Third/ta/Plugins/iOS/ThinkingSDK/Source/Core/CalibratedTime/TDCalibratedTime.m.meta @@ -0,0 +1,33 @@ +fileFormatVersion: 2 +guid: 6b0f45e898e4547859cb53c80bd799cd +PluginImporter: + externalObjects: {} + serializedVersion: 2 + iconMap: {} + executionOrder: {} + defineConstraints: [] + isPreloaded: 0 + isOverridable: 0 + isExplicitlyReferenced: 0 + validateReferences: 1 + platformData: + - first: + Any: + second: + enabled: 0 + settings: {} + - first: + Editor: Editor + second: + enabled: 0 + settings: + DefaultValueInitialized: true + - first: + iPhone: iOS + second: + enabled: 1 + settings: + AddToEmbeddedBinaries: false + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/HCMiniSdk/Third/ta/Plugins/iOS/ThinkingSDK/Source/Core/CalibratedTime/TDCalibratedTimeWithNTP.h b/Assets/HCMiniSdk/Third/ta/Plugins/iOS/ThinkingSDK/Source/Core/CalibratedTime/TDCalibratedTimeWithNTP.h new file mode 100755 index 00000000..c53c3a30 --- /dev/null +++ b/Assets/HCMiniSdk/Third/ta/Plugins/iOS/ThinkingSDK/Source/Core/CalibratedTime/TDCalibratedTimeWithNTP.h @@ -0,0 +1,17 @@ +#import + +#if __has_include() +#import +#else +#import "TDCalibratedTime.h" +#endif + +NS_ASSUME_NONNULL_BEGIN + +@interface TDCalibratedTimeWithNTP : TDCalibratedTime + +- (void)recalibrationWithNtps:(NSArray *)ntpServers; + +@end + +NS_ASSUME_NONNULL_END diff --git a/Assets/HCMiniSdk/Third/ta/Plugins/iOS/ThinkingSDK/Source/Core/CalibratedTime/TDCalibratedTimeWithNTP.h.meta b/Assets/HCMiniSdk/Third/ta/Plugins/iOS/ThinkingSDK/Source/Core/CalibratedTime/TDCalibratedTimeWithNTP.h.meta new file mode 100644 index 00000000..765961b1 --- /dev/null +++ b/Assets/HCMiniSdk/Third/ta/Plugins/iOS/ThinkingSDK/Source/Core/CalibratedTime/TDCalibratedTimeWithNTP.h.meta @@ -0,0 +1,33 @@ +fileFormatVersion: 2 +guid: 53322ac3e74d241abb41b753b68e7ff0 +PluginImporter: + externalObjects: {} + serializedVersion: 2 + iconMap: {} + executionOrder: {} + defineConstraints: [] + isPreloaded: 0 + isOverridable: 0 + isExplicitlyReferenced: 0 + validateReferences: 1 + platformData: + - first: + Any: + second: + enabled: 0 + settings: {} + - first: + Editor: Editor + second: + enabled: 0 + settings: + DefaultValueInitialized: true + - first: + iPhone: iOS + second: + enabled: 1 + settings: + AddToEmbeddedBinaries: false + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/HCMiniSdk/Third/ta/Plugins/iOS/ThinkingSDK/Source/Core/CalibratedTime/TDCalibratedTimeWithNTP.m b/Assets/HCMiniSdk/Third/ta/Plugins/iOS/ThinkingSDK/Source/Core/CalibratedTime/TDCalibratedTimeWithNTP.m new file mode 100755 index 00000000..9dd26a50 --- /dev/null +++ b/Assets/HCMiniSdk/Third/ta/Plugins/iOS/ThinkingSDK/Source/Core/CalibratedTime/TDCalibratedTimeWithNTP.m @@ -0,0 +1,88 @@ +#import "TDCalibratedTimeWithNTP.h" +#import "TDNTPServer.h" +#import "TDLogging.h" +#import "TDDeviceInfo.h" + +@interface TDCalibratedTimeWithNTP() +@end + +static dispatch_group_t _ta_ntpGroup; +static NSString *_ta_ntpQueuelabel; +static dispatch_queue_t _ta_ntpSerialQueue; + +@implementation TDCalibratedTimeWithNTP + +@synthesize serverTime = _serverTime; + ++ (instancetype)sharedInstance { + static dispatch_once_t once; + static id sharedInstance; + dispatch_once(&once, ^{ + sharedInstance = [[TDCalibratedTimeWithNTP alloc] init]; + _ta_ntpGroup = dispatch_group_create(); + _ta_ntpQueuelabel = [NSString stringWithFormat:@"cn.thinkingdata.ntp.%p", (void *)self]; + _ta_ntpSerialQueue = dispatch_queue_create([_ta_ntpQueuelabel UTF8String], DISPATCH_QUEUE_SERIAL); + }); + return sharedInstance; +} + +- (void)recalibrationWithNtps:(NSArray *)ntpServers { + + if (_ta_ntpGroup) { + TDLogDebug(@"ntp servers async start"); + } else { + TDLogDebug(@"ntp servers async start, _ntpGroup is nil"); + } + dispatch_group_async(_ta_ntpGroup, _ta_ntpSerialQueue, ^{ + [self startNtp:ntpServers]; + }); +} + +- (NSTimeInterval)serverTime { + + if (_ta_ntpGroup) { + + long ret = dispatch_group_wait(_ta_ntpGroup, dispatch_time(DISPATCH_TIME_NOW, (int64_t)(3 * NSEC_PER_SEC))); + if (ret != 0) { + self.stopCalibrate = YES; + } + return _serverTime; + } else { + self.stopCalibrate = YES; + } + + return 0; + +} + +- (void)startNtp:(NSArray *)ntpServerHost { + NSMutableArray *serverHostArr = [NSMutableArray array]; + for (NSString *host in ntpServerHost) { + if ([host isKindOfClass:[NSString class]] && host.length > 0) { + [serverHostArr addObject:host]; + } + } + NSError *err; + for (NSString *host in serverHostArr) { + TDLogDebug(@"ntp host :%@", host); + err = nil; + TDNTPServer *server = [[TDNTPServer alloc] initWithHostname:host port:123]; + NSTimeInterval offset = [server dateWithError:&err]; + [server disconnect]; + + if (err) { + TDLogDebug(@"ntp failed :%@", err); + } else { + self.systemUptime = [TDDeviceInfo uptime]; + self.serverTime = [[NSDate dateWithTimeIntervalSinceNow:offset] timeIntervalSince1970]; + break; + } + } + + if (err) { + TDLogDebug(@"get ntp time failed"); + self.stopCalibrate = YES; + } +} + +@end diff --git a/Assets/HCMiniSdk/Third/ta/Plugins/iOS/ThinkingSDK/Source/Core/CalibratedTime/TDCalibratedTimeWithNTP.m.meta b/Assets/HCMiniSdk/Third/ta/Plugins/iOS/ThinkingSDK/Source/Core/CalibratedTime/TDCalibratedTimeWithNTP.m.meta new file mode 100644 index 00000000..a2cb2260 --- /dev/null +++ b/Assets/HCMiniSdk/Third/ta/Plugins/iOS/ThinkingSDK/Source/Core/CalibratedTime/TDCalibratedTimeWithNTP.m.meta @@ -0,0 +1,33 @@ +fileFormatVersion: 2 +guid: 8e3adf45980ac46f7a4e2ce5199eae55 +PluginImporter: + externalObjects: {} + serializedVersion: 2 + iconMap: {} + executionOrder: {} + defineConstraints: [] + isPreloaded: 0 + isOverridable: 0 + isExplicitlyReferenced: 0 + validateReferences: 1 + platformData: + - first: + Any: + second: + enabled: 0 + settings: {} + - first: + Editor: Editor + second: + enabled: 0 + settings: + DefaultValueInitialized: true + - first: + iPhone: iOS + second: + enabled: 1 + settings: + AddToEmbeddedBinaries: false + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/HCMiniSdk/Third/ta/Plugins/iOS/ThinkingSDK/Source/Core/CalibratedTime/TDNTPServer.h b/Assets/HCMiniSdk/Third/ta/Plugins/iOS/ThinkingSDK/Source/Core/CalibratedTime/TDNTPServer.h new file mode 100755 index 00000000..fbae756b --- /dev/null +++ b/Assets/HCMiniSdk/Third/ta/Plugins/iOS/ThinkingSDK/Source/Core/CalibratedTime/TDNTPServer.h @@ -0,0 +1,28 @@ + +#import + +@interface TDNTPServer : NSObject + +NS_ASSUME_NONNULL_BEGIN + +@property (readonly, strong, nonatomic) NSString *hostname; + +@property (readonly, assign, nonatomic) NSUInteger port; + +@property (assign, atomic) NSTimeInterval timeout; + +@property (readonly, atomic, getter=isConnected) BOOL connected; + +@property (class, readonly, nonatomic) TDNTPServer *defaultServer; + +- (instancetype)initWithHostname:(NSString *)hostname port:(NSUInteger)port NS_DESIGNATED_INITIALIZER; +- (instancetype)initWithHostname:(NSString *)hostname; +- (instancetype)init; +- (BOOL)connectWithError:(NSError *__autoreleasing _Nullable *_Nullable)error NS_REQUIRES_SUPER; +- (void)disconnect NS_REQUIRES_SUPER; +- (BOOL)syncWithError:(NSError *__autoreleasing _Nullable *_Nullable)error NS_REQUIRES_SUPER; +- (NSTimeInterval)dateWithError:(NSError *__autoreleasing _Nullable *_Nullable)error; + +NS_ASSUME_NONNULL_END + +@end diff --git a/Assets/HCMiniSdk/Third/ta/Plugins/iOS/ThinkingSDK/Source/Core/CalibratedTime/TDNTPServer.h.meta b/Assets/HCMiniSdk/Third/ta/Plugins/iOS/ThinkingSDK/Source/Core/CalibratedTime/TDNTPServer.h.meta new file mode 100644 index 00000000..91c26b21 --- /dev/null +++ b/Assets/HCMiniSdk/Third/ta/Plugins/iOS/ThinkingSDK/Source/Core/CalibratedTime/TDNTPServer.h.meta @@ -0,0 +1,33 @@ +fileFormatVersion: 2 +guid: ed0ed3d6fa4ca47629e866ad91e806fe +PluginImporter: + externalObjects: {} + serializedVersion: 2 + iconMap: {} + executionOrder: {} + defineConstraints: [] + isPreloaded: 0 + isOverridable: 0 + isExplicitlyReferenced: 0 + validateReferences: 1 + platformData: + - first: + Any: + second: + enabled: 0 + settings: {} + - first: + Editor: Editor + second: + enabled: 0 + settings: + DefaultValueInitialized: true + - first: + iPhone: iOS + second: + enabled: 1 + settings: + AddToEmbeddedBinaries: false + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/HCMiniSdk/Third/ta/Plugins/iOS/ThinkingSDK/Source/Core/CalibratedTime/TDNTPServer.m b/Assets/HCMiniSdk/Third/ta/Plugins/iOS/ThinkingSDK/Source/Core/CalibratedTime/TDNTPServer.m new file mode 100755 index 00000000..19584fbc --- /dev/null +++ b/Assets/HCMiniSdk/Third/ta/Plugins/iOS/ThinkingSDK/Source/Core/CalibratedTime/TDNTPServer.m @@ -0,0 +1,217 @@ + +#import "TDNTPServer.h" + +#import "TDNTPTypes.h" +#import "TDLogging.h" + +#import +#import +#import +#import + +@implementation TDNTPServer { + NSTimeInterval _timeout; + int _socket; + + NSTimeInterval _offset; +} + +static const uint32_t kSecondsFrom1900To1970 = 2208988800UL; + +static ufixed64_t ntp_localtime_get_ufixed64() { + struct timeval tv; + gettimeofday(&tv, NULL); + return ufixed64((uint32_t)tv.tv_sec + kSecondsFrom1900To1970, tv.tv_usec * (pow(2, 32) / USEC_PER_SEC)); +} + ++ (TDNTPServer *)defaultServer { + static TDNTPServer *server = nil; + static dispatch_once_t onceToken = 0; + dispatch_once(&onceToken, ^{ + server = [[TDNTPServer alloc] init]; + }); + return server; +} + +- (instancetype)initWithHostname:(NSString *)hostname port:(NSUInteger)port { + self = [super init]; + if (self) { + _hostname = [hostname copy]; + _port = port; + _timeout = 3.0; + _socket = -1; + + _offset = NAN; + } + return self; +} + +- (instancetype)initWithHostname:(NSString *)hostname { + return [self initWithHostname:hostname port:123]; +} + +- (instancetype)init { + return [self initWithHostname:@"pool.ntp.org"]; +} + +- (void)dealloc { + [self disconnect]; +} + +- (void)setTimeout:(NSTimeInterval)timeout { + assert(timeout > 0 && isfinite(timeout)); + @synchronized (self) { + _timeout = timeout; + if (_socket >= 0) { + struct timeval tv = { .tv_sec = _timeout, .tv_usec = (_timeout - trunc(_timeout)) * USEC_PER_SEC }; + setsockopt(_socket, SOL_SOCKET, SO_SNDTIMEO, &tv, sizeof(tv)); + setsockopt(_socket, SOL_SOCKET, SO_RCVTIMEO, &tv, sizeof(tv)); + } + + } +} + +- (NSTimeInterval)timeout { + @synchronized (self) { + return _timeout; + } +} + +- (BOOL)isConnected { + @synchronized (self) { + return _socket >= 0; + } +} + +- (BOOL)connectWithError:(NSError *__autoreleasing _Nullable *_Nullable)error { + @synchronized (self) { + if (_socket >= 0) { + return YES; + } + + struct addrinfo hints = {0}, *addrinfo = NULL; + hints.ai_family = AF_UNSPEC; + hints.ai_socktype = SOCK_DGRAM; + + NSString *port = [[NSString alloc] initWithFormat:@"%lu", (unsigned long) _port]; + + int getaddrinfo_err = getaddrinfo(_hostname.UTF8String, port.UTF8String, &hints, &addrinfo); + if (getaddrinfo_err != 0) { + if (error) { + NSString *errorDescription = [[NSString alloc] initWithUTF8String:gai_strerror(getaddrinfo_err)]; + NSDictionary *errorInfo = [[NSDictionary alloc] initWithObjectsAndKeys:errorDescription, NSLocalizedDescriptionKey, nil]; + *error = [NSError errorWithDomain:@"netdb" code:getaddrinfo_err userInfo:errorInfo]; + } + return NO; + } + + const int sock = socket(addrinfo->ai_family, addrinfo->ai_socktype, addrinfo->ai_protocol); + if (sock < 0) { + if (error) { + *error = [NSError errorWithDomain:NSPOSIXErrorDomain code:errno userInfo:nil]; + } + freeaddrinfo(addrinfo); + return NO; + } + + fcntl(sock, F_SETFL, fcntl(sock, F_GETFL, 0) | O_NONBLOCK); + + struct timeval timeout = { .tv_sec = _timeout, .tv_usec = (_timeout - trunc(_timeout)) * USEC_PER_SEC }; + int connect_err = connect(sock, addrinfo->ai_addr, addrinfo->ai_addrlen) ? errno : 0; + if (connect_err == EINPROGRESS) { + fd_set fd; + FD_ZERO(&fd); + FD_SET(sock, &fd); + + const int select_err = select(sock + 1, &fd, &fd, NULL, &timeout); + if (select_err <= 0) { + connect_err = select_err ? errno : ETIMEDOUT; + } else { + socklen_t optlen = sizeof(connect_err); + getsockopt(sock, SOL_SOCKET, SO_ERROR, &connect_err, &optlen); + } + } + freeaddrinfo(addrinfo); + if (connect_err) { + if (error) { + *error = [NSError errorWithDomain:NSPOSIXErrorDomain code:connect_err userInfo:nil]; + } + close(sock); + return NO; + } + + fcntl(sock, F_SETFL, fcntl(sock, F_GETFL, 0) & ~O_NONBLOCK); + + setsockopt(sock, SOL_SOCKET, SO_SNDTIMEO, &timeout, sizeof(timeout)); + setsockopt(sock, SOL_SOCKET, SO_RCVTIMEO, &timeout, sizeof(timeout)); + + [self willChangeValueForKey:@"connected"]; + _socket = sock; + [self didChangeValueForKey:@"connected"]; + + return YES; + } +} + +- (void)disconnect { + @synchronized (self) { + if (_socket >= 0) { + close(_socket); + + [self willChangeValueForKey:@"connected"]; + _socket = -1; + [self didChangeValueForKey:@"connected"]; + } + } +} + +- (BOOL)syncWithError:(NSError *__autoreleasing _Nullable *_Nullable)error { + @synchronized (self) { + if (![self connectWithError:error]) { + return NO; + } + + ntp_packet_t packet = {0}; + packet.version_number = 4; + packet.mode = 3; + packet.transmit_timestamp = ntp_localtime_get_ufixed64(); + packet = hton_ntp_packet(packet); + const ssize_t send_s = send(_socket, &packet, sizeof(packet), 0); + const int send_err = send_s == sizeof(packet) ? 0 : send_s >= 0 ? EIO : errno; + if (send_err) { + if (error) { + *error = [NSError errorWithDomain:NSPOSIXErrorDomain code:send_err userInfo:nil]; + } + return NO; + } + + const ssize_t recv_s = recv(_socket, &packet, sizeof(packet), 0); + const int recv_err = recv_s == sizeof(packet) ? 0 : recv_s >= 0 ? EIO : errno; + if (recv_err) { + if (error) { + *error = [NSError errorWithDomain:NSPOSIXErrorDomain code:recv_err userInfo:nil]; + } + return NO; + } + + packet = ntoh_ntp_packet(packet); + const double T[4] = { + ufixed64_as_double(packet.originate_timestamp), + ufixed64_as_double(packet.receive_timestamp), + ufixed64_as_double(packet.transmit_timestamp), + ufixed64_as_double(ntp_localtime_get_ufixed64()), + }; + _offset = ((T[1] - T[0]) + (T[2] - T[3])) / 2.0; + + TDLogDebug(@"%s %f", __func__, _offset); + return YES; + } +} + +- (NSTimeInterval)dateWithError:(NSError *__autoreleasing _Nullable *_Nullable)error { + @synchronized (self) { + return isfinite(_offset) || [self syncWithError:error] ? _offset : 0; + } +} + +@end diff --git a/Assets/HCMiniSdk/Third/ta/Plugins/iOS/ThinkingSDK/Source/Core/CalibratedTime/TDNTPServer.m.meta b/Assets/HCMiniSdk/Third/ta/Plugins/iOS/ThinkingSDK/Source/Core/CalibratedTime/TDNTPServer.m.meta new file mode 100644 index 00000000..aaff896b --- /dev/null +++ b/Assets/HCMiniSdk/Third/ta/Plugins/iOS/ThinkingSDK/Source/Core/CalibratedTime/TDNTPServer.m.meta @@ -0,0 +1,33 @@ +fileFormatVersion: 2 +guid: 1d08ebd85d9e34f9eb8e3f7838125705 +PluginImporter: + externalObjects: {} + serializedVersion: 2 + iconMap: {} + executionOrder: {} + defineConstraints: [] + isPreloaded: 0 + isOverridable: 0 + isExplicitlyReferenced: 0 + validateReferences: 1 + platformData: + - first: + Any: + second: + enabled: 0 + settings: {} + - first: + Editor: Editor + second: + enabled: 0 + settings: + DefaultValueInitialized: true + - first: + iPhone: iOS + second: + enabled: 1 + settings: + AddToEmbeddedBinaries: false + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/HCMiniSdk/Third/ta/Plugins/iOS/ThinkingSDK/Source/Core/CalibratedTime/TDNTPTypes.c b/Assets/HCMiniSdk/Third/ta/Plugins/iOS/ThinkingSDK/Source/Core/CalibratedTime/TDNTPTypes.c new file mode 100755 index 00000000..d09df8b9 --- /dev/null +++ b/Assets/HCMiniSdk/Third/ta/Plugins/iOS/ThinkingSDK/Source/Core/CalibratedTime/TDNTPTypes.c @@ -0,0 +1,61 @@ +#include "TDNTPTypes.h" + +#include +#include +#include + +ufixed32_t ufixed32(uint16_t whole, uint16_t fraction) { + return (struct ufixed32) { .whole = whole, .fraction = fraction }; +} + +ufixed64_t ufixed64(uint32_t whole, uint32_t fraction) { + return (struct ufixed64) { .whole = whole, .fraction = fraction }; +} + +double ufixed64_as_double(ufixed64_t uf64) { + return uf64.whole + uf64.fraction * pow(2, -32); +} + +ufixed64_t ufixed64_with_double(double value) { + assert(value >= 0); + return ufixed64(value, (value - trunc(value) * pow(2, 32))); +} + +ufixed32_t hton_ufixed32(ufixed32_t uf32) { + return ufixed32(htons(uf32.whole), htons(uf32.fraction)); +} +ufixed32_t ntoh_ufixed32(ufixed32_t uf32) { + return ufixed32(ntohs(uf32.whole), ntohs(uf32.fraction)); +} + +ufixed64_t hton_ufixed64(ufixed64_t uf64) { + return ufixed64(htonl(uf64.whole), htonl(uf64.fraction)); +} +ufixed64_t ntoh_ufixed64(ufixed64_t uf64) { + return ufixed64(ntohl(uf64.whole), ntohl(uf64.fraction)); +} + +ntp_packet_t hton_ntp_packet(ntp_packet_t p) { + p.root_delay = hton_ufixed32(p.root_delay); + p.root_dispersion = hton_ufixed32(p.root_dispersion); + + p.reference_timestamp = hton_ufixed64(p.reference_timestamp); + p.originate_timestamp = hton_ufixed64(p.originate_timestamp); + p.receive_timestamp = hton_ufixed64(p.receive_timestamp); + p.transmit_timestamp = hton_ufixed64(p.transmit_timestamp); + + return p; +} + +ntp_packet_t ntoh_ntp_packet(ntp_packet_t p) { + p.root_delay = ntoh_ufixed32(p.root_delay); + p.root_dispersion = ntoh_ufixed32(p.root_dispersion); + + p.reference_timestamp = ntoh_ufixed64(p.reference_timestamp); + p.originate_timestamp = ntoh_ufixed64(p.originate_timestamp); + p.receive_timestamp = ntoh_ufixed64(p.receive_timestamp); + p.transmit_timestamp = ntoh_ufixed64(p.transmit_timestamp); + + return p; +} + diff --git a/Assets/HCMiniSdk/Third/ta/Plugins/iOS/ThinkingSDK/Source/Core/CalibratedTime/TDNTPTypes.c.meta b/Assets/HCMiniSdk/Third/ta/Plugins/iOS/ThinkingSDK/Source/Core/CalibratedTime/TDNTPTypes.c.meta new file mode 100644 index 00000000..dc6c7dad --- /dev/null +++ b/Assets/HCMiniSdk/Third/ta/Plugins/iOS/ThinkingSDK/Source/Core/CalibratedTime/TDNTPTypes.c.meta @@ -0,0 +1,33 @@ +fileFormatVersion: 2 +guid: 4a84c90c599a24e37a0d637a38585e5f +PluginImporter: + externalObjects: {} + serializedVersion: 2 + iconMap: {} + executionOrder: {} + defineConstraints: [] + isPreloaded: 0 + isOverridable: 0 + isExplicitlyReferenced: 0 + validateReferences: 1 + platformData: + - first: + Any: + second: + enabled: 0 + settings: {} + - first: + Editor: Editor + second: + enabled: 0 + settings: + DefaultValueInitialized: true + - first: + iPhone: iOS + second: + enabled: 1 + settings: + AddToEmbeddedBinaries: false + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/HCMiniSdk/Third/ta/Plugins/iOS/ThinkingSDK/Source/Core/CalibratedTime/TDNTPTypes.h b/Assets/HCMiniSdk/Third/ta/Plugins/iOS/ThinkingSDK/Source/Core/CalibratedTime/TDNTPTypes.h new file mode 100755 index 00000000..cab6a44f --- /dev/null +++ b/Assets/HCMiniSdk/Third/ta/Plugins/iOS/ThinkingSDK/Source/Core/CalibratedTime/TDNTPTypes.h @@ -0,0 +1,51 @@ +#ifndef NTPTypes_h +#define NTPTypes_h + +#include + +typedef struct ufixed32 { + uint16_t whole, fraction; +} ufixed32_t; + +ufixed32_t ufixed32(uint16_t whole, uint16_t fraction); + +typedef struct ufixed64 { + uint32_t whole, fraction; +} ufixed64_t; + +ufixed64_t ufixed64(uint32_t whole, uint32_t fraction); + +double ufixed64_as_double(ufixed64_t); +ufixed64_t ufixed64_with_double(double); + +typedef struct ntp_packet_t { + uint8_t mode : 3; + uint8_t version_number : 3; + uint8_t leap_indicator : 2; + + uint8_t stratum; + uint8_t poll; + uint8_t precision; + + ufixed32_t root_delay; + ufixed32_t root_dispersion; + uint8_t reference_identifier[4]; + + ufixed64_t reference_timestamp; + ufixed64_t originate_timestamp; + ufixed64_t receive_timestamp; + ufixed64_t transmit_timestamp; +} ntp_packet_t; + + + +ufixed32_t hton_ufixed32(ufixed32_t); +ufixed32_t ntoh_ufixed32(ufixed32_t); + +ufixed64_t hton_ufixed64(ufixed64_t); +ufixed64_t ntoh_ufixed64(ufixed64_t); + +ntp_packet_t hton_ntp_packet(ntp_packet_t); +ntp_packet_t ntoh_ntp_packet(ntp_packet_t); + +#endif diff --git a/Assets/HCMiniSdk/Third/ta/Plugins/iOS/ThinkingSDK/Source/Core/CalibratedTime/TDNTPTypes.h.meta b/Assets/HCMiniSdk/Third/ta/Plugins/iOS/ThinkingSDK/Source/Core/CalibratedTime/TDNTPTypes.h.meta new file mode 100644 index 00000000..641396eb --- /dev/null +++ b/Assets/HCMiniSdk/Third/ta/Plugins/iOS/ThinkingSDK/Source/Core/CalibratedTime/TDNTPTypes.h.meta @@ -0,0 +1,33 @@ +fileFormatVersion: 2 +guid: 1b9833f90e6594be5b030640221f37eb +PluginImporter: + externalObjects: {} + serializedVersion: 2 + iconMap: {} + executionOrder: {} + defineConstraints: [] + isPreloaded: 0 + isOverridable: 0 + isExplicitlyReferenced: 0 + validateReferences: 1 + platformData: + - first: + Any: + second: + enabled: 0 + settings: {} + - first: + Editor: Editor + second: + enabled: 0 + settings: + DefaultValueInitialized: true + - first: + iPhone: iOS + second: + enabled: 1 + settings: + AddToEmbeddedBinaries: false + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/HCMiniSdk/Third/ta/Plugins/iOS/ThinkingSDK/Source/Core/Logger.meta b/Assets/HCMiniSdk/Third/ta/Plugins/iOS/ThinkingSDK/Source/Core/Logger.meta new file mode 100644 index 00000000..0b0d911b --- /dev/null +++ b/Assets/HCMiniSdk/Third/ta/Plugins/iOS/ThinkingSDK/Source/Core/Logger.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: b626e41fb03454133af378740edca88c +folderAsset: yes +DefaultImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/HCMiniSdk/Third/ta/Plugins/iOS/ThinkingSDK/Source/Core/Logger/TDLogging.h b/Assets/HCMiniSdk/Third/ta/Plugins/iOS/ThinkingSDK/Source/Core/Logger/TDLogging.h new file mode 100755 index 00000000..0336c25b --- /dev/null +++ b/Assets/HCMiniSdk/Third/ta/Plugins/iOS/ThinkingSDK/Source/Core/Logger/TDLogging.h @@ -0,0 +1,34 @@ +#import + +#if __has_include() +#import +#else +#import "TDConstant.h" +#endif + + +NS_ASSUME_NONNULL_BEGIN + +#define TDLogDebug(message, ...) TDLogWithType(TDLoggingLevelDebug, message, ##__VA_ARGS__) +#define TDLogInfo(message, ...) TDLogWithType(TDLoggingLevelInfo, message, ##__VA_ARGS__) +#define TDLogError(message, ...) TDLogWithType(TDLoggingLevelError, message, ##__VA_ARGS__) + +#define TDLogWithType(type, message, ...) \ +{ \ +if ([TDLogging sharedInstance].loggingLevel != TDLoggingLevelNone && type <= [TDLogging sharedInstance].loggingLevel) \ +{ \ +[[TDLogging sharedInstance] logCallingFunction:type format:(message), ##__VA_ARGS__]; \ +} \ +} + + + +@interface TDLogging : NSObject + +@property (class, nonatomic, readonly) TDLogging *sharedInstance; +@property (assign, nonatomic) TDLoggingLevel loggingLevel; +- (void)logCallingFunction:(TDLoggingLevel)type format:(id)messageFormat, ...; + +@end + +NS_ASSUME_NONNULL_END diff --git a/Assets/HCMiniSdk/Third/ta/Plugins/iOS/ThinkingSDK/Source/Core/Logger/TDLogging.h.meta b/Assets/HCMiniSdk/Third/ta/Plugins/iOS/ThinkingSDK/Source/Core/Logger/TDLogging.h.meta new file mode 100644 index 00000000..abbfaf67 --- /dev/null +++ b/Assets/HCMiniSdk/Third/ta/Plugins/iOS/ThinkingSDK/Source/Core/Logger/TDLogging.h.meta @@ -0,0 +1,33 @@ +fileFormatVersion: 2 +guid: 353201af06c2742ecb51fd592d15ae2e +PluginImporter: + externalObjects: {} + serializedVersion: 2 + iconMap: {} + executionOrder: {} + defineConstraints: [] + isPreloaded: 0 + isOverridable: 0 + isExplicitlyReferenced: 0 + validateReferences: 1 + platformData: + - first: + Any: + second: + enabled: 0 + settings: {} + - first: + Editor: Editor + second: + enabled: 0 + settings: + DefaultValueInitialized: true + - first: + iPhone: iOS + second: + enabled: 1 + settings: + AddToEmbeddedBinaries: false + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/HCMiniSdk/Third/ta/Plugins/iOS/ThinkingSDK/Source/Core/Logger/TDLogging.m b/Assets/HCMiniSdk/Third/ta/Plugins/iOS/ThinkingSDK/Source/Core/Logger/TDLogging.m new file mode 100755 index 00000000..6f46fc71 --- /dev/null +++ b/Assets/HCMiniSdk/Third/ta/Plugins/iOS/ThinkingSDK/Source/Core/Logger/TDLogging.m @@ -0,0 +1,35 @@ +#import "TDLogging.h" + +#import +#import "TDOSLog.h" + +@implementation TDLogging + ++ (instancetype)sharedInstance { + static dispatch_once_t once; + static id sharedInstance; + dispatch_once(&once, ^{ + sharedInstance = [[self alloc] init]; + }); + return sharedInstance; +} + +- (void)logCallingFunction:(TDLoggingLevel)type format:(id)messageFormat, ... { + if (messageFormat) { + va_list formatList; + va_start(formatList, messageFormat); + NSString *formattedMessage = [[NSString alloc] initWithFormat:messageFormat arguments:formatList]; + va_end(formatList); + +#ifdef __IPHONE_10_0 + if (@available(iOS 10.0, *)) { + [TDOSLog log:NO message:formattedMessage type:type]; + } +#else + NSLog(@"[THINKING] %@", formattedMessage); +#endif + } +} + +@end + diff --git a/Assets/HCMiniSdk/Third/ta/Plugins/iOS/ThinkingSDK/Source/Core/Logger/TDLogging.m.meta b/Assets/HCMiniSdk/Third/ta/Plugins/iOS/ThinkingSDK/Source/Core/Logger/TDLogging.m.meta new file mode 100644 index 00000000..fa7ac788 --- /dev/null +++ b/Assets/HCMiniSdk/Third/ta/Plugins/iOS/ThinkingSDK/Source/Core/Logger/TDLogging.m.meta @@ -0,0 +1,33 @@ +fileFormatVersion: 2 +guid: dd14468bbecaf44909f41f5c1120d419 +PluginImporter: + externalObjects: {} + serializedVersion: 2 + iconMap: {} + executionOrder: {} + defineConstraints: [] + isPreloaded: 0 + isOverridable: 0 + isExplicitlyReferenced: 0 + validateReferences: 1 + platformData: + - first: + Any: + second: + enabled: 0 + settings: {} + - first: + Editor: Editor + second: + enabled: 0 + settings: + DefaultValueInitialized: true + - first: + iPhone: iOS + second: + enabled: 1 + settings: + AddToEmbeddedBinaries: false + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/HCMiniSdk/Third/ta/Plugins/iOS/ThinkingSDK/Source/Core/Logger/TDOSLog.h b/Assets/HCMiniSdk/Third/ta/Plugins/iOS/ThinkingSDK/Source/Core/Logger/TDOSLog.h new file mode 100755 index 00000000..9082a33b --- /dev/null +++ b/Assets/HCMiniSdk/Third/ta/Plugins/iOS/ThinkingSDK/Source/Core/Logger/TDOSLog.h @@ -0,0 +1,45 @@ +#import + +#if __has_include() +#import +#else +#import "TDConstant.h" +#endif + +@class TDLogMessage; +@protocol TDLogger; + +NS_ASSUME_NONNULL_BEGIN + +@interface TDOSLog : NSObject + ++ (void)log:(BOOL)asynchronous + message:(NSString *)message + type:(TDLoggingLevel)type; + +@end + +@protocol TDLogger + +- (void)logMessage:(TDLogMessage *)logMessage; + +@optional + +@property (nonatomic, strong, readonly) dispatch_queue_t loggerQueue; + +@end + +@interface TDLogMessage : NSObject + +- (instancetype)initWithMessage:(NSString *)message + type:(TDLoggingLevel)type; + +@end + +@interface TDAbstractLogger : NSObject + ++ (instancetype)sharedInstance; + +@end + +NS_ASSUME_NONNULL_END diff --git a/Assets/HCMiniSdk/Third/ta/Plugins/iOS/ThinkingSDK/Source/Core/Logger/TDOSLog.h.meta b/Assets/HCMiniSdk/Third/ta/Plugins/iOS/ThinkingSDK/Source/Core/Logger/TDOSLog.h.meta new file mode 100644 index 00000000..d72b571b --- /dev/null +++ b/Assets/HCMiniSdk/Third/ta/Plugins/iOS/ThinkingSDK/Source/Core/Logger/TDOSLog.h.meta @@ -0,0 +1,33 @@ +fileFormatVersion: 2 +guid: 4ec7385e7a18945269f1521978a09b88 +PluginImporter: + externalObjects: {} + serializedVersion: 2 + iconMap: {} + executionOrder: {} + defineConstraints: [] + isPreloaded: 0 + isOverridable: 0 + isExplicitlyReferenced: 0 + validateReferences: 1 + platformData: + - first: + Any: + second: + enabled: 0 + settings: {} + - first: + Editor: Editor + second: + enabled: 0 + settings: + DefaultValueInitialized: true + - first: + iPhone: iOS + second: + enabled: 1 + settings: + AddToEmbeddedBinaries: false + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/HCMiniSdk/Third/ta/Plugins/iOS/ThinkingSDK/Source/Core/Logger/TDOSLog.m b/Assets/HCMiniSdk/Third/ta/Plugins/iOS/ThinkingSDK/Source/Core/Logger/TDOSLog.m new file mode 100755 index 00000000..ce461077 --- /dev/null +++ b/Assets/HCMiniSdk/Third/ta/Plugins/iOS/ThinkingSDK/Source/Core/Logger/TDOSLog.m @@ -0,0 +1,198 @@ +#import "TDOSLog.h" + +#import + +#ifndef DDLOG_MAX_QUEUE_SIZE + #define DDLOG_MAX_QUEUE_SIZE 1000 +#endif + +static void *const GlobalLoggingQueueIdentityKey = (void *)&GlobalLoggingQueueIdentityKey; + +@interface TDOSLog () +{ + id _logger; + dispatch_queue_t _loggerQueue; +} + +@end + +@implementation TDOSLog + +static dispatch_queue_t _loggingQueue; +static dispatch_group_t _loggingGroup; +static dispatch_semaphore_t _queueSemaphore; + ++ (instancetype)sharedInstance { + static id sharedInstance = nil; + + static dispatch_once_t onceToken; + dispatch_once(&onceToken, ^{ + sharedInstance = [[self alloc] init]; + [sharedInstance addLogger:[TDAbstractLogger sharedInstance]]; + }); + + return sharedInstance; +} + ++ (void)initialize { + static dispatch_once_t TDLogOnceToken; + + dispatch_once(&TDLogOnceToken, ^{ + _loggingQueue = dispatch_queue_create("cn.thinking.log", NULL); + _loggingGroup = dispatch_group_create(); + + void *nonNullValue = GlobalLoggingQueueIdentityKey; + dispatch_queue_set_specific(_loggingQueue, GlobalLoggingQueueIdentityKey, nonNullValue, NULL); + + _queueSemaphore = dispatch_semaphore_create(DDLOG_MAX_QUEUE_SIZE); + }); +} + ++ (void)addLogger { + [self.sharedInstance addLogger:[TDAbstractLogger sharedInstance]]; +} + +- (void)addLogger:(id )logger { + dispatch_async(_loggingQueue, ^{ @autoreleasepool { + [self lt_addLogger:logger]; + } }); +} + +- (void)queueLogMessage:(TDLogMessage *)logMessage asynchronously:(BOOL)asyncFlag { + dispatch_block_t logBlock = ^{ + dispatch_semaphore_wait(_queueSemaphore, DISPATCH_TIME_FOREVER); + @autoreleasepool { + [self lt_log:logMessage]; + } + }; + + if (asyncFlag) { + dispatch_async(_loggingQueue, logBlock); + } else if (dispatch_get_specific(GlobalLoggingQueueIdentityKey)) { + logBlock(); + } else { + dispatch_sync(_loggingQueue, logBlock); + } +} + ++ (void)log:(BOOL)asynchronous + message:(NSString *)message + type:(TDLoggingLevel)type { + [self.sharedInstance log:asynchronous message:message type:type]; +} + +- (void)log:(BOOL)asynchronous + message:(NSString *)message + type:(TDLoggingLevel)type { + TDLogMessage *logMessage = [[TDLogMessage alloc] initWithMessage:message type:type]; + [self queueLogMessage:logMessage asynchronously:asynchronous]; +} + +- (void)lt_addLogger:(id )logger { + NSAssert(dispatch_get_specific(GlobalLoggingQueueIdentityKey), + @"This method should only be run on the logging thread/queue"); + const char *loggerQueueName = [@"cn.thinkingdata.analytics.osLogger" UTF8String]; + dispatch_queue_t loggerQueue = dispatch_queue_create(loggerQueueName, NULL); + _logger = logger; + _loggerQueue = loggerQueue; +} + +- (void)lt_log:(TDLogMessage *)logMessage { + NSAssert(dispatch_get_specific(GlobalLoggingQueueIdentityKey), + @"This method should only be run on the logging thread/queue"); + + dispatch_group_async(_loggingGroup, _loggerQueue, ^{ @autoreleasepool { + [self->_logger logMessage:logMessage]; + } }); + + dispatch_group_wait(_loggingGroup, DISPATCH_TIME_FOREVER); + dispatch_semaphore_signal(_queueSemaphore); +} + +@end + +@interface TDLogMessage () +{ +@public + NSString *_message; + TDLoggingLevel _type; +} + +@end + +@implementation TDLogMessage + +- (instancetype)initWithMessage:(NSString *)message + type:(TDLoggingLevel)type { + if ((self = [super init])) { + _message = [message copy]; + _type = type; + } + return self; +} + +@end + +@interface TDAbstractLogger () + +@property (strong, nonatomic, readwrite) os_log_t logger; +@property (class, readonly, strong) TDAbstractLogger *sharedInstance; + +@end + +@implementation TDAbstractLogger + +static TDAbstractLogger *sharedInstance; + ++ (instancetype)sharedInstance { + static dispatch_once_t TDOSLoggerOnceToken; + + dispatch_once(&TDOSLoggerOnceToken, ^{ + sharedInstance = [[[self class] alloc] init]; + }); + + return sharedInstance; +} + +- (os_log_t)getLogger { +#pragma clang diagnostic push +#pragma clang diagnostic ignored "-Wunguarded-availability" + return os_log_create("cn.thinkingdata.analytics.log", "THINKING"); +#pragma clang diagnostic pop +} + +- (os_log_t)logger { + if (_logger == nil) { + _logger = [self getLogger]; + } + return _logger; +} + +- (void)logMessage:(TDLogMessage *)logMessage { +#ifdef __IPHONE_10_0 + if (@available(iOS 10.0, *)) { + NSString *message = logMessage->_message; + if (message != nil) { + const char *msg = [message UTF8String]; + __auto_type logger = [self logger]; + switch (logMessage->_type) { + case TDLoggingLevelDebug: + os_log_debug(logger, "%{public}s", msg); + break; + case TDLoggingLevelInfo: + os_log_info(logger, "%{public}s", msg); + break; + case TDLoggingLevelError: + os_log_error(logger, "%{public}s", msg); + break; + case TDLoggingLevelNone: + default: + break; + } + } + } +#endif +} + +@end + diff --git a/Assets/HCMiniSdk/Third/ta/Plugins/iOS/ThinkingSDK/Source/Core/Logger/TDOSLog.m.meta b/Assets/HCMiniSdk/Third/ta/Plugins/iOS/ThinkingSDK/Source/Core/Logger/TDOSLog.m.meta new file mode 100644 index 00000000..27aaf8b0 --- /dev/null +++ b/Assets/HCMiniSdk/Third/ta/Plugins/iOS/ThinkingSDK/Source/Core/Logger/TDOSLog.m.meta @@ -0,0 +1,33 @@ +fileFormatVersion: 2 +guid: bb174753a9f1944c89569100a0f3da37 +PluginImporter: + externalObjects: {} + serializedVersion: 2 + iconMap: {} + executionOrder: {} + defineConstraints: [] + isPreloaded: 0 + isOverridable: 0 + isExplicitlyReferenced: 0 + validateReferences: 1 + platformData: + - first: + Any: + second: + enabled: 0 + settings: {} + - first: + Editor: Editor + second: + enabled: 0 + settings: + DefaultValueInitialized: true + - first: + iPhone: iOS + second: + enabled: 1 + settings: + AddToEmbeddedBinaries: false + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/HCMiniSdk/Third/ta/Plugins/iOS/ThinkingSDK/Source/Core/TAThreadSafeArray.h b/Assets/HCMiniSdk/Third/ta/Plugins/iOS/ThinkingSDK/Source/Core/TAThreadSafeArray.h new file mode 100755 index 00000000..e587a833 --- /dev/null +++ b/Assets/HCMiniSdk/Third/ta/Plugins/iOS/ThinkingSDK/Source/Core/TAThreadSafeArray.h @@ -0,0 +1,13 @@ +// +// TAThreadSafeArray.h +// ThinkingSDK +// +// Created by Yangxiongon 2022/6/19. +// + +#import + +/// A simple implementation of thread safe mutable array. +@interface TAThreadSafeArray : NSMutableArray + +@end diff --git a/Assets/HCMiniSdk/Third/ta/Plugins/iOS/ThinkingSDK/Source/Core/TAThreadSafeArray.h.meta b/Assets/HCMiniSdk/Third/ta/Plugins/iOS/ThinkingSDK/Source/Core/TAThreadSafeArray.h.meta new file mode 100644 index 00000000..37726b51 --- /dev/null +++ b/Assets/HCMiniSdk/Third/ta/Plugins/iOS/ThinkingSDK/Source/Core/TAThreadSafeArray.h.meta @@ -0,0 +1,33 @@ +fileFormatVersion: 2 +guid: 51a642e9aa64647108381aae8c178071 +PluginImporter: + externalObjects: {} + serializedVersion: 2 + iconMap: {} + executionOrder: {} + defineConstraints: [] + isPreloaded: 0 + isOverridable: 0 + isExplicitlyReferenced: 0 + validateReferences: 1 + platformData: + - first: + Any: + second: + enabled: 0 + settings: {} + - first: + Editor: Editor + second: + enabled: 0 + settings: + DefaultValueInitialized: true + - first: + iPhone: iOS + second: + enabled: 1 + settings: + AddToEmbeddedBinaries: false + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/HCMiniSdk/Third/ta/Plugins/iOS/ThinkingSDK/Source/Core/TAThreadSafeArray.m b/Assets/HCMiniSdk/Third/ta/Plugins/iOS/ThinkingSDK/Source/Core/TAThreadSafeArray.m new file mode 100755 index 00000000..aece95cb --- /dev/null +++ b/Assets/HCMiniSdk/Third/ta/Plugins/iOS/ThinkingSDK/Source/Core/TAThreadSafeArray.m @@ -0,0 +1,372 @@ +// +// TAThreadSafeArray.m +// ThinkingSDK +// +// Created by Yangxiongon 2022/6/19. +// + +#import "TAThreadSafeArray.h" + +#define INIT(...) self = super.init; \ +if (!self) return nil; \ +__VA_ARGS__; \ +if (!_arr) return nil; \ +_lock = dispatch_semaphore_create(1); \ +return self; + + +#define LOCK(...) dispatch_semaphore_wait(_lock, DISPATCH_TIME_FOREVER); \ +__VA_ARGS__; \ +dispatch_semaphore_signal(_lock); + + +@implementation TAThreadSafeArray { + NSMutableArray *_arr; //Subclass a class cluster... + dispatch_semaphore_t _lock; +} + +#pragma mark - init + +- (instancetype)init { + INIT(_arr = [[NSMutableArray alloc] init]); +} + +- (instancetype)initWithCapacity:(NSUInteger)numItems { + INIT(_arr = [[NSMutableArray alloc] initWithCapacity:numItems]); +} + +- (instancetype)initWithArray:(NSArray *)array { + INIT(_arr = [[NSMutableArray alloc] initWithArray:array]); +} + +- (instancetype)initWithObjects:(const id[])objects count:(NSUInteger)cnt { + INIT(_arr = [[NSMutableArray alloc] initWithObjects:objects count:cnt]); +} + +- (instancetype)initWithContentsOfFile:(NSString *)path { + INIT(_arr = [[NSMutableArray alloc] initWithContentsOfFile:path]); +} + +- (instancetype)initWithContentsOfURL:(NSURL *)url { + INIT(_arr = [[NSMutableArray alloc] initWithContentsOfURL:url]); +} + +#pragma mark - method + +- (NSUInteger)count { + LOCK(NSUInteger count = _arr.count); return count; +} + +- (id)objectAtIndex:(NSUInteger)index { + LOCK(id obj = [_arr objectAtIndex:index]); return obj; +} + +- (NSArray *)arrayByAddingObject:(id)anObject { + LOCK(NSArray * arr = [_arr arrayByAddingObject:anObject]); return arr; +} + +- (NSArray *)arrayByAddingObjectsFromArray:(NSArray *)otherArray { + LOCK(NSArray * arr = [_arr arrayByAddingObjectsFromArray:otherArray]); return arr; +} + +- (NSString *)componentsJoinedByString:(NSString *)separator { + LOCK(NSString * str = [_arr componentsJoinedByString:separator]); return str; +} + +- (BOOL)containsObject:(id)anObject { + LOCK(BOOL c = [_arr containsObject:anObject]); return c; +} + +- (NSString *)description { + LOCK(NSString * d = _arr.description); return d; +} + +- (NSString *)descriptionWithLocale:(id)locale { + LOCK(NSString * d = [_arr descriptionWithLocale:locale]); return d; +} + +- (NSString *)descriptionWithLocale:(id)locale indent:(NSUInteger)level { + LOCK(NSString * d = [_arr descriptionWithLocale:locale indent:level]); return d; +} + +- (id)firstObjectCommonWithArray:(NSArray *)otherArray { + LOCK(id o = [_arr firstObjectCommonWithArray:otherArray]); return o; +} + +- (void)getObjects:(id __unsafe_unretained[])objects range:(NSRange)range { + LOCK([_arr getObjects:objects range:range]); +} + +- (NSUInteger)indexOfObject:(id)anObject { + LOCK(NSUInteger i = [_arr indexOfObject:anObject]); return i; +} + +- (NSUInteger)indexOfObject:(id)anObject inRange:(NSRange)range { + LOCK(NSUInteger i = [_arr indexOfObject:anObject inRange:range]); return i; +} + +- (NSUInteger)indexOfObjectIdenticalTo:(id)anObject { + LOCK(NSUInteger i = [_arr indexOfObjectIdenticalTo:anObject]); return i; +} + +- (NSUInteger)indexOfObjectIdenticalTo:(id)anObject inRange:(NSRange)range { + LOCK(NSUInteger i = [_arr indexOfObjectIdenticalTo:anObject inRange:range]); return i; +} + +- (id)firstObject { + LOCK(id o = _arr.firstObject); return o; +} + +- (id)lastObject { + LOCK(id o = _arr.lastObject); return o; +} + +- (NSEnumerator *)objectEnumerator { + LOCK(NSEnumerator * e = [_arr objectEnumerator]); return e; +} + +- (NSEnumerator *)reverseObjectEnumerator { + LOCK(NSEnumerator * e = [_arr reverseObjectEnumerator]); return e; +} + +- (NSData *)sortedArrayHint { + LOCK(NSData * d = [_arr sortedArrayHint]); return d; +} + +- (NSArray *)sortedArrayUsingFunction:(NSInteger (NS_NOESCAPE *)(id, id, void *))comparator context:(void *)context { + LOCK(NSArray * arr = [_arr sortedArrayUsingFunction:comparator context:context]) return arr; +} + +- (NSArray *)sortedArrayUsingFunction:(NSInteger (NS_NOESCAPE *)(id, id, void *))comparator context:(void *)context hint:(NSData *)hint { + LOCK(NSArray * arr = [_arr sortedArrayUsingFunction:comparator context:context hint:hint]); return arr; +} + +- (NSArray *)sortedArrayUsingSelector:(SEL)comparator { + LOCK(NSArray * arr = [_arr sortedArrayUsingSelector:comparator]); return arr; +} + +- (NSArray *)subarrayWithRange:(NSRange)range { + LOCK(NSArray * arr = [_arr subarrayWithRange:range]) return arr; +} + +- (void)makeObjectsPerformSelector:(SEL)aSelector { + LOCK([_arr makeObjectsPerformSelector:aSelector]); +} + +- (void)makeObjectsPerformSelector:(SEL)aSelector withObject:(id)argument { + LOCK([_arr makeObjectsPerformSelector:aSelector withObject:argument]); +} + +- (NSArray *)objectsAtIndexes:(NSIndexSet *)indexes { + LOCK(NSArray * arr = [_arr objectsAtIndexes:indexes]); return arr; +} + +- (id)objectAtIndexedSubscript:(NSUInteger)idx { + LOCK(id o = [_arr objectAtIndexedSubscript:idx]); return o; +} + +- (void)enumerateObjectsUsingBlock:(void (NS_NOESCAPE ^)(id obj, NSUInteger idx, BOOL *stop))block { + LOCK([_arr enumerateObjectsUsingBlock:block]); +} + +- (void)enumerateObjectsWithOptions:(NSEnumerationOptions)opts usingBlock:(void (NS_NOESCAPE ^)(id obj, NSUInteger idx, BOOL *stop))block { + LOCK([_arr enumerateObjectsWithOptions:opts usingBlock:block]); +} + +- (void)enumerateObjectsAtIndexes:(NSIndexSet *)s options:(NSEnumerationOptions)opts usingBlock:(void (NS_NOESCAPE ^)(id obj, NSUInteger idx, BOOL *stop))block { + LOCK([_arr enumerateObjectsAtIndexes:s options:opts usingBlock:block]); +} + +- (NSUInteger)indexOfObjectPassingTest:(BOOL (NS_NOESCAPE ^)(id obj, NSUInteger idx, BOOL *stop))predicate { + LOCK(NSUInteger i = [_arr indexOfObjectPassingTest:predicate]); return i; +} + +- (NSUInteger)indexOfObjectWithOptions:(NSEnumerationOptions)opts passingTest:(BOOL (NS_NOESCAPE ^)(id obj, NSUInteger idx, BOOL *stop))predicate { + LOCK(NSUInteger i = [_arr indexOfObjectWithOptions:opts passingTest:predicate]); return i; +} + +- (NSUInteger)indexOfObjectAtIndexes:(NSIndexSet *)s options:(NSEnumerationOptions)opts passingTest:(BOOL (NS_NOESCAPE ^)(id obj, NSUInteger idx, BOOL *stop))predicate { + LOCK(NSUInteger i = [_arr indexOfObjectAtIndexes:s options:opts passingTest:predicate]); return i; +} + +- (NSIndexSet *)indexesOfObjectsPassingTest:(BOOL (NS_NOESCAPE ^)(id obj, NSUInteger idx, BOOL *stop))predicate { + LOCK(NSIndexSet * i = [_arr indexesOfObjectsPassingTest:predicate]); return i; +} + +- (NSIndexSet *)indexesOfObjectsWithOptions:(NSEnumerationOptions)opts passingTest:(BOOL (NS_NOESCAPE ^)(id obj, NSUInteger idx, BOOL *stop))predicate { + LOCK(NSIndexSet * i = [_arr indexesOfObjectsWithOptions:opts passingTest:predicate]); return i; +} + +- (NSIndexSet *)indexesOfObjectsAtIndexes:(NSIndexSet *)s options:(NSEnumerationOptions)opts passingTest:(BOOL (NS_NOESCAPE ^)(id obj, NSUInteger idx, BOOL *stop))predicate { + LOCK(NSIndexSet * i = [_arr indexesOfObjectsAtIndexes:s options:opts passingTest:predicate]); return i; +} + +- (NSArray *)sortedArrayUsingComparator:(NSComparator NS_NOESCAPE)cmptr { + LOCK(NSArray * a = [_arr sortedArrayUsingComparator:cmptr]); return a; +} + +- (NSArray *)sortedArrayWithOptions:(NSSortOptions)opts usingComparator:(NSComparator NS_NOESCAPE)cmptr { + LOCK(NSArray * a = [_arr sortedArrayWithOptions:opts usingComparator:cmptr]); return a; +} + +- (NSUInteger)indexOfObject:(id)obj inSortedRange:(NSRange)r options:(NSBinarySearchingOptions)opts usingComparator:(NSComparator NS_NOESCAPE)cmp { + LOCK(NSUInteger i = [_arr indexOfObject:obj inSortedRange:r options:opts usingComparator:cmp]); return i; +} + +#pragma mark - mutable + +- (void)addObject:(id)anObject { + LOCK([_arr addObject:anObject]); +} + +- (void)insertObject:(id)anObject atIndex:(NSUInteger)index { + LOCK([_arr insertObject:anObject atIndex:index]); +} + +- (void)removeLastObject { + LOCK([_arr removeLastObject]); +} + +- (void)removeObjectAtIndex:(NSUInteger)index { + LOCK([_arr removeObjectAtIndex:index]); +} + +- (void)replaceObjectAtIndex:(NSUInteger)index withObject:(id)anObject { + LOCK([_arr replaceObjectAtIndex:index withObject:anObject]); +} + +- (void)addObjectsFromArray:(NSArray *)otherArray { + LOCK([_arr addObjectsFromArray:otherArray]); +} + +- (void)exchangeObjectAtIndex:(NSUInteger)idx1 withObjectAtIndex:(NSUInteger)idx2 { + LOCK([_arr exchangeObjectAtIndex:idx1 withObjectAtIndex:idx2]); +} + +- (void)removeAllObjects { + LOCK([_arr removeAllObjects]); +} + +- (void)removeObject:(id)anObject inRange:(NSRange)range { + LOCK([_arr removeObject:anObject inRange:range]); +} + +- (void)removeObject:(id)anObject { + LOCK([_arr removeObject:anObject]); +} + +- (void)removeObjectIdenticalTo:(id)anObject inRange:(NSRange)range { + LOCK([_arr removeObjectIdenticalTo:anObject inRange:range]); +} + +- (void)removeObjectIdenticalTo:(id)anObject { + LOCK([_arr removeObjectIdenticalTo:anObject]); +} + +- (void)removeObjectsInArray:(NSArray *)otherArray { + LOCK([_arr removeObjectsInArray:otherArray]); +} + +- (void)removeObjectsInRange:(NSRange)range { + LOCK([_arr removeObjectsInRange:range]); +} + +- (void)replaceObjectsInRange:(NSRange)range withObjectsFromArray:(NSArray *)otherArray range:(NSRange)otherRange { + LOCK([_arr replaceObjectsInRange:range withObjectsFromArray:otherArray range:otherRange]); +} + +- (void)replaceObjectsInRange:(NSRange)range withObjectsFromArray:(NSArray *)otherArray { + LOCK([_arr replaceObjectsInRange:range withObjectsFromArray:otherArray]); +} + +- (void)setArray:(NSArray *)otherArray { + LOCK([_arr setArray:otherArray]); +} + +- (void)sortUsingFunction:(NSInteger (NS_NOESCAPE *)(id, id, void *))compare context:(void *)context { + LOCK([_arr sortUsingFunction:compare context:context]); +} + +- (void)sortUsingSelector:(SEL)comparator { + LOCK([_arr sortUsingSelector:comparator]); +} + +- (void)insertObjects:(NSArray *)objects atIndexes:(NSIndexSet *)indexes { + LOCK([_arr insertObjects:objects atIndexes:indexes]); +} + +- (void)removeObjectsAtIndexes:(NSIndexSet *)indexes { + LOCK([_arr removeObjectsAtIndexes:indexes]); +} + +- (void)replaceObjectsAtIndexes:(NSIndexSet *)indexes withObjects:(NSArray *)objects { + LOCK([_arr replaceObjectsAtIndexes:indexes withObjects:objects]); +} + +- (void)setObject:(id)obj atIndexedSubscript:(NSUInteger)idx { + LOCK([_arr setObject:obj atIndexedSubscript:idx]); +} + +- (void)sortUsingComparator:(NSComparator NS_NOESCAPE)cmptr { + LOCK([_arr sortUsingComparator:cmptr]); +} + +- (void)sortWithOptions:(NSSortOptions)opts usingComparator:(NSComparator NS_NOESCAPE)cmptr { + LOCK([_arr sortWithOptions:opts usingComparator:cmptr]); +} + +- (BOOL)isEqualToArray:(NSArray *)otherArray { + if (otherArray == self) return YES; + if ([otherArray isKindOfClass:TAThreadSafeArray.class]) { + TAThreadSafeArray *other = (id)otherArray; + BOOL isEqual; + dispatch_semaphore_wait(_lock, DISPATCH_TIME_FOREVER); + dispatch_semaphore_wait(other->_lock, DISPATCH_TIME_FOREVER); + isEqual = [_arr isEqualToArray:other->_arr]; + dispatch_semaphore_signal(other->_lock); + dispatch_semaphore_signal(_lock); + return isEqual; + } + return NO; +} + +#pragma mark - protocol + +- (id)copyWithZone:(NSZone *)zone { + return [self mutableCopyWithZone:zone]; +} + +- (id)mutableCopyWithZone:(NSZone *)zone { + LOCK(id copiedDictionary = [[self.class allocWithZone:zone] initWithArray:_arr]); + return copiedDictionary; +} + +- (NSUInteger)countByEnumeratingWithState:(NSFastEnumerationState *)state + objects:(id __unsafe_unretained[])stackbuf + count:(NSUInteger)len { + LOCK(NSUInteger count = [_arr countByEnumeratingWithState:state objects:stackbuf count:len]); + return count; +} + +- (BOOL)isEqual:(id)object { + if (object == self) return YES; + + if ([object isKindOfClass:TAThreadSafeArray.class]) { + TAThreadSafeArray *other = object; + BOOL isEqual; + dispatch_semaphore_wait(_lock, DISPATCH_TIME_FOREVER); + dispatch_semaphore_wait(other->_lock, DISPATCH_TIME_FOREVER); + isEqual = [_arr isEqual:other->_arr]; + dispatch_semaphore_signal(other->_lock); + dispatch_semaphore_signal(_lock); + return isEqual; + } + return NO; +} + +- (NSUInteger)hash { + LOCK(NSUInteger hash = [_arr hash]); + return hash; +} + +@end diff --git a/Assets/HCMiniSdk/Third/ta/Plugins/iOS/ThinkingSDK/Source/Core/TAThreadSafeArray.m.meta b/Assets/HCMiniSdk/Third/ta/Plugins/iOS/ThinkingSDK/Source/Core/TAThreadSafeArray.m.meta new file mode 100644 index 00000000..a3bbd4c7 --- /dev/null +++ b/Assets/HCMiniSdk/Third/ta/Plugins/iOS/ThinkingSDK/Source/Core/TAThreadSafeArray.m.meta @@ -0,0 +1,33 @@ +fileFormatVersion: 2 +guid: 964bb3061998b45028f985db612bb887 +PluginImporter: + externalObjects: {} + serializedVersion: 2 + iconMap: {} + executionOrder: {} + defineConstraints: [] + isPreloaded: 0 + isOverridable: 0 + isExplicitlyReferenced: 0 + validateReferences: 1 + platformData: + - first: + Any: + second: + enabled: 0 + settings: {} + - first: + Editor: Editor + second: + enabled: 0 + settings: + DefaultValueInitialized: true + - first: + iPhone: iOS + second: + enabled: 1 + settings: + AddToEmbeddedBinaries: false + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/HCMiniSdk/Third/ta/Plugins/iOS/ThinkingSDK/Source/Core/TAThreadSafeDictionary.h b/Assets/HCMiniSdk/Third/ta/Plugins/iOS/ThinkingSDK/Source/Core/TAThreadSafeDictionary.h new file mode 100755 index 00000000..7b87e9b9 --- /dev/null +++ b/Assets/HCMiniSdk/Third/ta/Plugins/iOS/ThinkingSDK/Source/Core/TAThreadSafeDictionary.h @@ -0,0 +1,11 @@ +// +// TAThreadSafeDictionary.h +// + +#import + +/// A simple implementation of thread safe mutable dictionary. +/// +@interface TAThreadSafeDictionary : NSMutableDictionary + +@end diff --git a/Assets/HCMiniSdk/Third/ta/Plugins/iOS/ThinkingSDK/Source/Core/TAThreadSafeDictionary.h.meta b/Assets/HCMiniSdk/Third/ta/Plugins/iOS/ThinkingSDK/Source/Core/TAThreadSafeDictionary.h.meta new file mode 100644 index 00000000..e196b690 --- /dev/null +++ b/Assets/HCMiniSdk/Third/ta/Plugins/iOS/ThinkingSDK/Source/Core/TAThreadSafeDictionary.h.meta @@ -0,0 +1,33 @@ +fileFormatVersion: 2 +guid: 30bd968b74a364f81b213e1d018dabb7 +PluginImporter: + externalObjects: {} + serializedVersion: 2 + iconMap: {} + executionOrder: {} + defineConstraints: [] + isPreloaded: 0 + isOverridable: 0 + isExplicitlyReferenced: 0 + validateReferences: 1 + platformData: + - first: + Any: + second: + enabled: 0 + settings: {} + - first: + Editor: Editor + second: + enabled: 0 + settings: + DefaultValueInitialized: true + - first: + iPhone: iOS + second: + enabled: 1 + settings: + AddToEmbeddedBinaries: false + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/HCMiniSdk/Third/ta/Plugins/iOS/ThinkingSDK/Source/Core/TAThreadSafeDictionary.m b/Assets/HCMiniSdk/Third/ta/Plugins/iOS/ThinkingSDK/Source/Core/TAThreadSafeDictionary.m new file mode 100755 index 00000000..28fcaa58 --- /dev/null +++ b/Assets/HCMiniSdk/Third/ta/Plugins/iOS/ThinkingSDK/Source/Core/TAThreadSafeDictionary.m @@ -0,0 +1,223 @@ +// +// TAThreadSafeDictionary.m +// + +#import "TAThreadSafeDictionary.h" + +#define INIT(...) self = super.init; \ +if (!self) return nil; \ +__VA_ARGS__; \ +if (!_dic) return nil; \ +_lock = dispatch_semaphore_create(1); \ +return self; + + +#define LOCK(...) dispatch_semaphore_wait(_lock, DISPATCH_TIME_FOREVER); \ +__VA_ARGS__; \ +dispatch_semaphore_signal(_lock); + + +@implementation TAThreadSafeDictionary { + NSMutableDictionary *_dic; //Subclass a class cluster... + dispatch_semaphore_t _lock; +} + +#pragma mark - init + +- (instancetype)init { + INIT(_dic = [[NSMutableDictionary alloc] init]); +} + +- (instancetype)initWithObjects:(NSArray *)objects forKeys:(NSArray *)keys { + INIT(_dic = [[NSMutableDictionary alloc] initWithObjects:objects forKeys:keys]); +} + +- (instancetype)initWithCapacity:(NSUInteger)capacity { + INIT(_dic = [[NSMutableDictionary alloc] initWithCapacity:capacity]); +} + +- (instancetype)initWithObjects:(const id[])objects forKeys:(const id [])keys count:(NSUInteger)cnt { + INIT(_dic = [[NSMutableDictionary alloc] initWithObjects:objects forKeys:keys count:cnt]); +} + +- (instancetype)initWithDictionary:(NSDictionary *)otherDictionary { + INIT(_dic = [[NSMutableDictionary alloc] initWithDictionary:otherDictionary]); +} + +- (instancetype)initWithDictionary:(NSDictionary *)otherDictionary copyItems:(BOOL)flag { + INIT(_dic = [[NSMutableDictionary alloc] initWithDictionary:otherDictionary copyItems:flag]); +} + + +#pragma mark - method + +- (NSUInteger)count { + LOCK(NSUInteger c = _dic.count); return c; +} + +- (id)objectForKey:(id)aKey { + LOCK(id o = [_dic objectForKey:aKey]); return o; +} + +- (NSEnumerator *)keyEnumerator { + LOCK(NSEnumerator * e = [_dic keyEnumerator]); return e; +} + +- (NSArray *)allKeys { + LOCK(NSArray * a = [_dic allKeys]); return a; +} + +- (NSArray *)allKeysForObject:(id)anObject { + LOCK(NSArray * a = [_dic allKeysForObject:anObject]); return a; +} + +- (NSArray *)allValues { + LOCK(NSArray * a = [_dic allValues]); return a; +} + +- (NSString *)description { + LOCK(NSString * d = [_dic description]); return d; +} + +- (NSString *)descriptionInStringsFileFormat { + LOCK(NSString * d = [_dic descriptionInStringsFileFormat]); return d; +} + +- (NSString *)descriptionWithLocale:(id)locale { + LOCK(NSString * d = [_dic descriptionWithLocale:locale]); return d; +} + +- (NSString *)descriptionWithLocale:(id)locale indent:(NSUInteger)level { + LOCK(NSString * d = [_dic descriptionWithLocale:locale indent:level]); return d; +} + +- (BOOL)isEqualToDictionary:(NSDictionary *)otherDictionary { + if (otherDictionary == self) return YES; + + if ([otherDictionary isKindOfClass:TAThreadSafeDictionary.class]) { + TAThreadSafeDictionary *other = (id)otherDictionary; + BOOL isEqual; + dispatch_semaphore_wait(_lock, DISPATCH_TIME_FOREVER); + dispatch_semaphore_wait(other->_lock, DISPATCH_TIME_FOREVER); + isEqual = [_dic isEqual:other->_dic]; + dispatch_semaphore_signal(other->_lock); + dispatch_semaphore_signal(_lock); + return isEqual; + } + return NO; +} + +- (NSEnumerator *)objectEnumerator { + LOCK(NSEnumerator * e = [_dic objectEnumerator]); return e; +} + +- (NSArray *)objectsForKeys:(NSArray *)keys notFoundMarker:(id)marker { + LOCK(NSArray * a = [_dic objectsForKeys:keys notFoundMarker:marker]); return a; +} + +- (NSArray *)keysSortedByValueUsingSelector:(SEL)comparator { + LOCK(NSArray * a = [_dic keysSortedByValueUsingSelector:comparator]); return a; +} + +- (void)getObjects:(id __unsafe_unretained[])objects andKeys:(id __unsafe_unretained[])keys { + LOCK([_dic getObjects:objects andKeys:keys]); +} + +- (id)objectForKeyedSubscript:(id)key { + LOCK(id o = [_dic objectForKeyedSubscript:key]); return o; +} + +- (void)enumerateKeysAndObjectsUsingBlock:(void (NS_NOESCAPE ^)(id _Nonnull, id _Nonnull, BOOL * _Nonnull))block { + LOCK([_dic enumerateKeysAndObjectsUsingBlock:block]); +} + +- (void)enumerateKeysAndObjectsWithOptions:(NSEnumerationOptions)opts usingBlock:(void (NS_NOESCAPE ^)(id key, id obj, BOOL *stop))block { + LOCK([_dic enumerateKeysAndObjectsWithOptions:opts usingBlock:block]); +} + +- (NSArray *)keysSortedByValueUsingComparator:(NSComparator NS_NOESCAPE)cmptr { + LOCK(NSArray * a = [_dic keysSortedByValueUsingComparator:cmptr]); return a; +} + +- (NSArray *)keysSortedByValueWithOptions:(NSSortOptions)opts usingComparator:(NSComparator NS_NOESCAPE)cmptr { + LOCK(NSArray * a = [_dic keysSortedByValueWithOptions:opts usingComparator:cmptr]); return a; +} + +- (NSSet *)keysOfEntriesPassingTest:(BOOL (^ NS_NOESCAPE)(id _Nonnull, id _Nonnull, BOOL * _Nonnull))predicate { + LOCK(NSSet * a = [_dic keysOfEntriesPassingTest:predicate]); return a; +} + +- (NSSet *)keysOfEntriesWithOptions:(NSEnumerationOptions)opts passingTest:(BOOL (^ NS_NOESCAPE)(id _Nonnull, id _Nonnull, BOOL * _Nonnull))predicate { + LOCK(NSSet * a = [_dic keysOfEntriesWithOptions:opts passingTest:predicate]); return a; +} + +#pragma mark - mutable + +- (void)removeObjectForKey:(id)aKey { + LOCK([_dic removeObjectForKey:aKey]); +} + +- (void)setObject:(id)anObject forKey:(id )aKey { + LOCK([_dic setObject:anObject forKey:aKey]); +} + +- (void)addEntriesFromDictionary:(NSDictionary *)otherDictionary { + LOCK([_dic addEntriesFromDictionary:otherDictionary]); +} + +- (void)removeAllObjects { + LOCK([_dic removeAllObjects]); +} + +- (void)removeObjectsForKeys:(NSArray *)keyArray { + LOCK([_dic removeObjectsForKeys:keyArray]); +} + +- (void)setDictionary:(NSDictionary *)otherDictionary { + LOCK([_dic setDictionary:otherDictionary]); +} + +- (void)setObject:(id)obj forKeyedSubscript:(id )key { + LOCK([_dic setObject:obj forKeyedSubscript:key]); +} + +#pragma mark - protocol + +- (id)copyWithZone:(NSZone *)zone { + return [self mutableCopyWithZone:zone]; +} + +- (id)mutableCopyWithZone:(NSZone *)zone { + LOCK(id copiedDictionary = [[self.class allocWithZone:zone] initWithDictionary:_dic]); + return copiedDictionary; +} + +- (NSUInteger)countByEnumeratingWithState:(NSFastEnumerationState *)state + objects:(id __unsafe_unretained[])stackbuf + count:(NSUInteger)len { + LOCK(NSUInteger count = [_dic countByEnumeratingWithState:state objects:stackbuf count:len]); + return count; +} + +- (BOOL)isEqual:(id)object { + if (object == self) return YES; + + if ([object isKindOfClass:TAThreadSafeDictionary.class]) { + TAThreadSafeDictionary *other = object; + BOOL isEqual; + dispatch_semaphore_wait(_lock, DISPATCH_TIME_FOREVER); + dispatch_semaphore_wait(other->_lock, DISPATCH_TIME_FOREVER); + isEqual = [_dic isEqual:other->_dic]; + dispatch_semaphore_signal(other->_lock); + dispatch_semaphore_signal(_lock); + return isEqual; + } + return NO; +} + +- (NSUInteger)hash { + LOCK(NSUInteger hash = [_dic hash]); + return hash; +} + +@end diff --git a/Assets/HCMiniSdk/Third/ta/Plugins/iOS/ThinkingSDK/Source/Core/TAThreadSafeDictionary.m.meta b/Assets/HCMiniSdk/Third/ta/Plugins/iOS/ThinkingSDK/Source/Core/TAThreadSafeDictionary.m.meta new file mode 100644 index 00000000..e58f044d --- /dev/null +++ b/Assets/HCMiniSdk/Third/ta/Plugins/iOS/ThinkingSDK/Source/Core/TAThreadSafeDictionary.m.meta @@ -0,0 +1,33 @@ +fileFormatVersion: 2 +guid: 3fa30a7fb757f4ad494aaf1c2eae8376 +PluginImporter: + externalObjects: {} + serializedVersion: 2 + iconMap: {} + executionOrder: {} + defineConstraints: [] + isPreloaded: 0 + isOverridable: 0 + isExplicitlyReferenced: 0 + validateReferences: 1 + platformData: + - first: + Any: + second: + enabled: 0 + settings: {} + - first: + Editor: Editor + second: + enabled: 0 + settings: + DefaultValueInitialized: true + - first: + iPhone: iOS + second: + enabled: 1 + settings: + AddToEmbeddedBinaries: false + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/HCMiniSdk/Third/ta/Plugins/iOS/ThinkingSDK/Source/Core/TDConstant.h b/Assets/HCMiniSdk/Third/ta/Plugins/iOS/ThinkingSDK/Source/Core/TDConstant.h new file mode 100755 index 00000000..f591f318 --- /dev/null +++ b/Assets/HCMiniSdk/Third/ta/Plugins/iOS/ThinkingSDK/Source/Core/TDConstant.h @@ -0,0 +1,210 @@ +// +// TDConstant.h +// ThinkingSDK +// +// Created by LiHuanan on 2020/9/8. +// Copyright © 2020 thinkingdata. All rights reserved. +// + +#import +/** +Debug Mode + +- ThinkingAnalyticsDebugOff : Not enabled by default +*/ +typedef NS_OPTIONS(NSInteger, ThinkingAnalyticsDebugMode) { + /** + Not enabled by default + */ + ThinkingAnalyticsDebugOff = 0, + + /** + Enable DebugOnly Mode, Data is not persisted + */ + ThinkingAnalyticsDebugOnly = 1 << 0, + + /** + Enable Debug Mode,Data will persist + */ + ThinkingAnalyticsDebug = 1 << 1, + + /** + Enable Debug Mode,Data will persist,Equivalent to ThinkingAnalyticsDebug + */ + ThinkingAnalyticsDebugOn = ThinkingAnalyticsDebug, +}; + + +/** + Log Level + + - TDLoggingLevelNone : Not enabled by default + */ +typedef NS_OPTIONS(NSInteger, TDLoggingLevel) { + /** + Not enabled by default + */ + TDLoggingLevelNone = 0, + + /** + Error Log + */ + TDLoggingLevelError = 1 << 0, + + /** + Info Log + */ + TDLoggingLevelInfo = 1 << 1, + + /** + Debug Log + */ + TDLoggingLevelDebug = 1 << 2, +}; + +/** + Https Certificate Verification Mode +*/ +typedef NS_OPTIONS(NSInteger, TDSSLPinningMode) { + /** + The default authentication method will only verify the certificate returned by the server in the system's trusted certificate list + */ + TDSSLPinningModeNone = 0, + + /** + The public key of the verification certificate + */ + TDSSLPinningModePublicKey = 1 << 0, + + /** + Verify all contents of the certificate + */ + TDSSLPinningModeCertificate = 1 << 1 +}; + +/** + Custom HTTPS Authentication +*/ +typedef NSURLSessionAuthChallengeDisposition (^TDURLSessionDidReceiveAuthenticationChallengeBlock)(NSURLSession *_Nullable session, NSURLAuthenticationChallenge *_Nullable challenge, NSURLCredential *_Nullable __autoreleasing *_Nullable credential); + + + +/** + Network Type Enum + + - TDNetworkTypeDefault : 3G、4G、WIFI + */ +typedef NS_OPTIONS(NSInteger, ThinkingAnalyticsNetworkType) { + + /** + 3G、4G、WIFI + */ + TDNetworkTypeDefault = 0, + + /** + only WIFI + */ + TDNetworkTypeOnlyWIFI = 1 << 0, + + /** + 2G、3G、4G、WIFI + */ + TDNetworkTypeALL = 1 << 1, +}; + +/** + Auto-Tracking Enum + + - ThinkingAnalyticsEventTypeNone : auto-tracking is not enabled by default + */ +typedef NS_OPTIONS(NSInteger, ThinkingAnalyticsAutoTrackEventType) { + + /** + auto-tracking is not enabled by default + */ + ThinkingAnalyticsEventTypeNone = 0, + + /* + Active Events + */ + ThinkingAnalyticsEventTypeAppStart = 1 << 0, + + /** + Inactive Events + */ + ThinkingAnalyticsEventTypeAppEnd = 1 << 1, + + /** + Clicked events + */ + ThinkingAnalyticsEventTypeAppClick = 1 << 2, + + /** + View Page Events + */ + ThinkingAnalyticsEventTypeAppViewScreen = 1 << 3, + + /** + Crash Events + */ + ThinkingAnalyticsEventTypeAppViewCrash = 1 << 4, + + /** + Installation Events + */ + ThinkingAnalyticsEventTypeAppInstall = 1 << 5, + /** + All Events + */ + ThinkingAnalyticsEventTypeAll = ThinkingAnalyticsEventTypeAppStart | ThinkingAnalyticsEventTypeAppEnd | ThinkingAnalyticsEventTypeAppClick | ThinkingAnalyticsEventTypeAppInstall | ThinkingAnalyticsEventTypeAppViewCrash | ThinkingAnalyticsEventTypeAppViewScreen + +}; + +typedef NS_OPTIONS(NSInteger, ThinkingNetworkType) { + ThinkingNetworkTypeNONE = 0, + ThinkingNetworkType2G = 1 << 0, + ThinkingNetworkType3G = 1 << 1, + ThinkingNetworkType4G = 1 << 2, + ThinkingNetworkTypeWIFI = 1 << 3, + ThinkingNetworkType5G = 1 << 4, + ThinkingNetworkTypeALL = 0xFF, +}; + + +typedef NS_OPTIONS(NSInteger, TAThirdPartyShareType) { + TAThirdPartyShareTypeNONE = 0, + TAThirdPartyShareTypeAPPSFLYER = 1 << 0, + TAThirdPartyShareTypeIRONSOURCE = 1 << 1, + TAThirdPartyShareTypeADJUST = 1 << 2, + TAThirdPartyShareTypeBRANCH = 1 << 3, + TAThirdPartyShareTypeTOPON = 1 << 4, + TAThirdPartyShareTypeTRACKING = 1 << 5, + TAThirdPartyShareTypeTRADPLUS = 1 << 6, + TAThirdPartyShareTypeAPPLOVIN = 1 << 7, + TAThirdPartyShareTypeKOCHAVA = 1 << 8, + TAThirdPartyShareTypeTALKINGDATA = 1 << 9, + TAThirdPartyShareTypeFIREBASE = 1 << 10, + + + TDThirdPartyShareTypeNONE = TAThirdPartyShareTypeNONE, + TDThirdPartyShareTypeAPPSFLYER = TAThirdPartyShareTypeAPPSFLYER, + TDThirdPartyShareTypeIRONSOURCE = TAThirdPartyShareTypeIRONSOURCE, + TDThirdPartyShareTypeADJUST = TAThirdPartyShareTypeADJUST, + TDThirdPartyShareTypeBRANCH = TAThirdPartyShareTypeBRANCH, + TDThirdPartyShareTypeTOPON = TAThirdPartyShareTypeTOPON, + TDThirdPartyShareTypeTRACKING = TAThirdPartyShareTypeTRACKING, + TDThirdPartyShareTypeTRADPLUS = TAThirdPartyShareTypeTRADPLUS, + +}; + +//MARK: - Data reporting status +typedef NS_ENUM(NSInteger, TATrackStatus) { + /// Suspend reporting + TATrackStatusPause, + /// Stop reporting and clear cache + TATrackStatusStop, + /// Suspend reporting and continue to persist data + TATrackStatusSaveOnly, + /// reset normal + TATrackStatusNormal +}; diff --git a/Assets/HCMiniSdk/Third/ta/Plugins/iOS/ThinkingSDK/Source/Core/TDConstant.h.meta b/Assets/HCMiniSdk/Third/ta/Plugins/iOS/ThinkingSDK/Source/Core/TDConstant.h.meta new file mode 100644 index 00000000..3474c0d5 --- /dev/null +++ b/Assets/HCMiniSdk/Third/ta/Plugins/iOS/ThinkingSDK/Source/Core/TDConstant.h.meta @@ -0,0 +1,33 @@ +fileFormatVersion: 2 +guid: 94705a7cbe2df4db8885907777cf68fd +PluginImporter: + externalObjects: {} + serializedVersion: 2 + iconMap: {} + executionOrder: {} + defineConstraints: [] + isPreloaded: 0 + isOverridable: 0 + isExplicitlyReferenced: 0 + validateReferences: 1 + platformData: + - first: + Any: + second: + enabled: 0 + settings: {} + - first: + Editor: Editor + second: + enabled: 0 + settings: + DefaultValueInitialized: true + - first: + iPhone: iOS + second: + enabled: 1 + settings: + AddToEmbeddedBinaries: false + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/HCMiniSdk/Third/ta/Plugins/iOS/ThinkingSDK/Source/DeviceInfo.meta b/Assets/HCMiniSdk/Third/ta/Plugins/iOS/ThinkingSDK/Source/DeviceInfo.meta new file mode 100644 index 00000000..e1fa0908 --- /dev/null +++ b/Assets/HCMiniSdk/Third/ta/Plugins/iOS/ThinkingSDK/Source/DeviceInfo.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: 573f9b30d37104af0b1e33df00a0c526 +folderAsset: yes +DefaultImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/HCMiniSdk/Third/ta/Plugins/iOS/ThinkingSDK/Source/DeviceInfo/TDDeviceInfo.h b/Assets/HCMiniSdk/Third/ta/Plugins/iOS/ThinkingSDK/Source/DeviceInfo/TDDeviceInfo.h new file mode 100755 index 00000000..54c62355 --- /dev/null +++ b/Assets/HCMiniSdk/Third/ta/Plugins/iOS/ThinkingSDK/Source/DeviceInfo/TDDeviceInfo.h @@ -0,0 +1,35 @@ +#import + +NS_ASSUME_NONNULL_BEGIN + +FOUNDATION_EXTERN NSString *const VERSION; + +@interface TDDeviceInfo : NSObject + ++ (TDDeviceInfo *)sharedManager; + + +@property (nonatomic, copy) NSString *uniqueId; +@property (nonatomic, copy) NSString *deviceId; +@property (nonatomic, copy) NSString *appVersion; +@property (nonatomic, readonly) BOOL isFirstOpen; +@property (nonatomic, copy) NSString *libName; +@property (nonatomic, copy) NSString *libVersion; + ++ (NSString *)libVersion; ++ (NSString*)bundleId; + +- (void)td_updateData; +- (NSDictionary *)td_collectProperties; + ++ (NSDate *)td_getInstallTime; + +- (NSDictionary *)getAutomaticData; + ++ (NSString *)currentRadio; + ++ (NSTimeInterval)uptime; + +@end + +NS_ASSUME_NONNULL_END diff --git a/Assets/HCMiniSdk/Third/ta/Plugins/iOS/ThinkingSDK/Source/DeviceInfo/TDDeviceInfo.h.meta b/Assets/HCMiniSdk/Third/ta/Plugins/iOS/ThinkingSDK/Source/DeviceInfo/TDDeviceInfo.h.meta new file mode 100644 index 00000000..06b82abd --- /dev/null +++ b/Assets/HCMiniSdk/Third/ta/Plugins/iOS/ThinkingSDK/Source/DeviceInfo/TDDeviceInfo.h.meta @@ -0,0 +1,33 @@ +fileFormatVersion: 2 +guid: 7de6737a81af64127a0e9e26437c140f +PluginImporter: + externalObjects: {} + serializedVersion: 2 + iconMap: {} + executionOrder: {} + defineConstraints: [] + isPreloaded: 0 + isOverridable: 0 + isExplicitlyReferenced: 0 + validateReferences: 1 + platformData: + - first: + Any: + second: + enabled: 0 + settings: {} + - first: + Editor: Editor + second: + enabled: 0 + settings: + DefaultValueInitialized: true + - first: + iPhone: iOS + second: + enabled: 1 + settings: + AddToEmbeddedBinaries: false + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/HCMiniSdk/Third/ta/Plugins/iOS/ThinkingSDK/Source/DeviceInfo/TDDeviceInfo.m b/Assets/HCMiniSdk/Third/ta/Plugins/iOS/ThinkingSDK/Source/DeviceInfo/TDDeviceInfo.m new file mode 100755 index 00000000..e5c0c40b --- /dev/null +++ b/Assets/HCMiniSdk/Third/ta/Plugins/iOS/ThinkingSDK/Source/DeviceInfo/TDDeviceInfo.m @@ -0,0 +1,481 @@ +#import "TDDeviceInfo.h" +#import +#import +#import + +#if TARGET_OS_IOS +#import +#elif TARGET_OS_OSX +#import +#endif + +#import "TDKeychainHelper.h" +#import "TDPublicConfig.h" +#import "ThinkingAnalyticsSDKPrivate.h" +#import "TDFile.h" +#import "TDPresetProperties+TDDisProperties.h" +#import + +#define kTDDyldPropertyNames @[@"TDPerformance"] +#define kTDGetPropertySelName @"getPresetProperties" + +#define kDeviceClass @"XY2HU4AX3JI2JJW5MDhjm6wea2x6ymvm28ylmiyh7jkc8axy9mw3em8w" +#define kCurrentDevice @"0a223h444j555cm666uw77722rh985jrj323ae44y5xn5ll5tm5mD5wm6e8y9m0vm32y46i7a89x0yl32c44ml4ye5a3a5" +#define kIdfv @"hj23kik4343j545dk656ke43434hhn534536jj7676tx323423yyx547657iy7678yxf7654hhl32342im3424ww4235w546ew64645w76ll57rx67yF434hj323ao343aa546rk76l323Vx32y32y32x32e3m43w656m76nxy657k657lmd65y657yx5o323aa34kk45rk76k76lm87" +#define kUUIDStr @"323J342J342K342U657K675A87A87U879H0943AX908IJ214KWD54WW87SX98XY3425At769k93l2l548m7r32xyx76769im3234ww6576n8ax89g98k9l97m1w31242" + +#if TARGET_OS_IOS +static CTTelephonyNetworkInfo *__td_TelephonyNetworkInfo; +#endif + +@interface TDDeviceInfo () + +@property (nonatomic, readwrite) BOOL isFirstOpen; +@property (atomic, strong) NSDictionary *automaticData; + +@end + +@implementation TDDeviceInfo + ++ (void)load { +#if TARGET_OS_IOS + __td_TelephonyNetworkInfo = [[CTTelephonyNetworkInfo alloc] init]; +#endif +} + + ++ (TDDeviceInfo *)sharedManager { + static dispatch_once_t onceToken; + static TDDeviceInfo *manager; + dispatch_once(&onceToken, ^{ + manager = [[TDDeviceInfo alloc] init]; + }); + return manager; +} + +- (instancetype)init { + self = [super init]; + if (self) { + self.libName = @"iOS"; + self.libVersion = TDPublicConfig.version; + + NSDictionary *deviceInfo = [self getDeviceUniqueId]; + _uniqueId = [deviceInfo objectForKey:@"uniqueId"]; + _deviceId = [deviceInfo objectForKey:@"deviceId"]; + _appVersion = [[NSBundle mainBundle] infoDictionary][@"CFBundleShortVersionString"]; + + self.automaticData = [self td_collectProperties]; + } + return self; +} + ++ (NSString *)libVersion { + return [self sharedManager].libVersion; +} + +- (void)td_updateData { + self.automaticData = [self td_collectProperties]; +} + +-(NSDictionary *)getAutomaticData { + NSMutableDictionary *dic = [NSMutableDictionary dictionaryWithDictionary:self.automaticData]; + [dic addEntriesFromDictionary:[TDDeviceInfo getAPMParams]]; + self.automaticData = dic; + return self.automaticData; +} + +- (NSDictionary *)td_collectProperties { + NSMutableDictionary *p = [NSMutableDictionary dictionary]; + + if (![TDPresetProperties disableDeviceId]) { + [p setValue:_deviceId forKey:@"#device_id"]; + } + +#if TARGET_OS_IOS + if (![TDPresetProperties disableCarrier]) { + CTCarrier *carrier = nil; + NSString *carrierName = @""; + #ifdef __IPHONE_12_0 + if (@available(iOS 12.1, *)) { + NSArray *carrierKeysArray = [__td_TelephonyNetworkInfo.serviceSubscriberCellularProviders.allKeys sortedArrayUsingSelector:@selector(compare:)]; + carrier = __td_TelephonyNetworkInfo.serviceSubscriberCellularProviders[carrierKeysArray.firstObject]; + if (!carrier.mobileNetworkCode) { + carrier = __td_TelephonyNetworkInfo.serviceSubscriberCellularProviders[carrierKeysArray.lastObject]; + } + } + #endif + + if (!carrier) { + carrier = [__td_TelephonyNetworkInfo subscriberCellularProvider]; + } + + // System characteristics, when the SIM is not installed, the carrierName also has a value, here additionally add the judgment of whether MCC and MNC have values + // MCC, MNC, and isoCountryCode are nil when no SIM card is installed and not within the cellular service range + if (carrier.carrierName && + carrier.carrierName.length > 0 && + carrier.mobileNetworkCode && + carrier.mobileNetworkCode.length > 0) { + carrierName = carrier.carrierName; + } + [p setValue:carrierName forKey:@"#carrier"]; + } +#endif + + if (![TDPresetProperties disableLibVersion]) { + [p setValue:self.libVersion forKey:@"#lib_version"]; + } + if (![TDPresetProperties disableManufacturer]) { + [p setValue:@"Apple" forKey:@"#manufacturer"]; + } + + +#if TARGET_OS_IOS + if (![TDPresetProperties disableDeviceModel]) { + [p setValue:[self td_iphoneType] forKey:@"#device_model"]; + } + + if (![TDPresetProperties disableLib]) { + [p setValue:self.libName forKey:@"#lib"]; + } + + if (![TDPresetProperties disableOs]) { + [p setValue:@"iOS" forKey:@"#os"]; + } + if (![TDPresetProperties disableOsVersion]) { + UIDevice *device = [UIDevice currentDevice]; + [p setValue:[device systemVersion] forKey:@"#os_version"]; + } + if (![TDPresetProperties disableScreenWidth]) { + CGSize size = [UIScreen mainScreen].bounds.size; + [p setValue:@((NSInteger)size.width) forKey:@"#screen_width"]; + } + if (![TDPresetProperties disableScreenHeight]) { + CGSize size = [UIScreen mainScreen].bounds.size; + [p setValue:@((NSInteger)size.height) forKey:@"#screen_height"]; + } + + if (![TDPresetProperties disableDeviceType]) { + if ([[UIDevice currentDevice] userInterfaceIdiom] == UIUserInterfaceIdiomPad) { + [p setValue:@"iPad" forKey:@"#device_type"]; + } else { + [p setValue:@"iPhone" forKey:@"#device_type"]; + } + } +#endif + +#if TARGET_OS_OSX + + if (![TDPresetProperties disableLib]) { + [p setValue:@"Mac OS" forKey:@"#lib"]; + } + + if (![TDPresetProperties disableOs]) { + [p setValue:@"OSX" forKey:@"#os"]; + } + if (![TDPresetProperties disableOsVersion]) { + NSDictionary *sv = [NSDictionary dictionaryWithContentsOfFile:@"/System/Library/CoreServices/SystemVersion.plist"]; + NSString *versionString = [sv objectForKey:@"ProductVersion"]; + [p setValue:versionString forKey:@"#os_version"]; + } +#endif + if (![TDPresetProperties disableSystemLanguage]) { + NSString *preferredLanguages = [[NSLocale preferredLanguages] firstObject]; + if (preferredLanguages && preferredLanguages.length > 0) { + p[@"#system_language"] = [[preferredLanguages componentsSeparatedByString:@"-"] firstObject];; + } + } + [p addEntriesFromDictionary:[TDDeviceInfo getAPMParams]]; + + return [p copy]; +} + ++ (NSString*)bundleId +{ + return [[[NSBundle mainBundle] infoDictionary] objectForKey:@"CFBundleIdentifier"]; +} + +- (NSString *)td_iphoneType { + struct utsname systemInfo; + uname(&systemInfo); + NSString *platform = [NSString stringWithCString:systemInfo.machine encoding:NSASCIIStringEncoding]; + if ([platform isEqualToString:@"iPhone1,1"]) return @"iPhone 2G"; + if ([platform isEqualToString:@"iPhone1,2"]) return @"iPhone 3G"; + if ([platform isEqualToString:@"iPhone2,1"]) return @"iPhone 3GS"; + if ([platform isEqualToString:@"iPhone3,1"]) return @"iPhone 4"; + if ([platform isEqualToString:@"iPhone3,2"]) return @"iPhone 4"; + if ([platform isEqualToString:@"iPhone3,3"]) return @"iPhone 4"; + if ([platform isEqualToString:@"iPhone4,1"]) return @"iPhone 4S"; + if ([platform isEqualToString:@"iPhone5,1"]) return @"iPhone 5"; + if ([platform isEqualToString:@"iPhone5,2"]) return @"iPhone 5"; + if ([platform isEqualToString:@"iPhone5,3"]) return @"iPhone 5c"; + if ([platform isEqualToString:@"iPhone5,4"]) return @"iPhone 5c"; + if ([platform isEqualToString:@"iPhone6,1"]) return @"iPhone 5s"; + if ([platform isEqualToString:@"iPhone6,2"]) return @"iPhone 5s"; + if ([platform isEqualToString:@"iPhone7,1"]) return @"iPhone 6 Plus"; + if ([platform isEqualToString:@"iPhone7,2"]) return @"iPhone 6"; + if ([platform isEqualToString:@"iPhone8,1"]) return @"iPhone 6s"; + if ([platform isEqualToString:@"iPhone8,2"]) return @"iPhone 6s Plus"; + if ([platform isEqualToString:@"iPhone8,4"]) return @"iPhone SE"; + if ([platform isEqualToString:@"iPhone9,1"]) return @"iPhone 7"; + if ([platform isEqualToString:@"iPhone9,2"]) return @"iPhone 7 Plus"; + if ([platform isEqualToString:@"iPod1,1"]) return @"iPod Touch 1G"; + if ([platform isEqualToString:@"iPod2,1"]) return @"iPod Touch 2G"; + if ([platform isEqualToString:@"iPod3,1"]) return @"iPod Touch 3G"; + if ([platform isEqualToString:@"iPod4,1"]) return @"iPod Touch 4G"; + if ([platform isEqualToString:@"iPod5,1"]) return @"iPod Touch 5G"; + if ([platform isEqualToString:@"iPad1,1"]) return @"iPad 1G"; + if ([platform isEqualToString:@"iPad2,1"]) return @"iPad 2"; + if ([platform isEqualToString:@"iPad2,2"]) return @"iPad 2"; + if ([platform isEqualToString:@"iPad2,3"]) return @"iPad 2"; + if ([platform isEqualToString:@"iPad2,4"]) return @"iPad 2"; + if ([platform isEqualToString:@"iPad2,5"]) return @"iPad Mini 1G"; + if ([platform isEqualToString:@"iPad2,6"]) return @"iPad Mini 1G"; + if ([platform isEqualToString:@"iPad2,7"]) return @"iPad Mini 1G"; + if ([platform isEqualToString:@"iPad3,1"]) return @"iPad 3"; + if ([platform isEqualToString:@"iPad3,2"]) return @"iPad 3"; + if ([platform isEqualToString:@"iPad3,3"]) return @"iPad 3"; + if ([platform isEqualToString:@"iPad3,4"]) return @"iPad 4"; + if ([platform isEqualToString:@"iPad3,5"]) return @"iPad 4"; + if ([platform isEqualToString:@"iPad3,6"]) return @"iPad 4"; + if ([platform isEqualToString:@"iPad4,1"]) return @"iPad Air"; + if ([platform isEqualToString:@"iPad4,2"]) return @"iPad Air"; + if ([platform isEqualToString:@"iPad4,3"]) return @"iPad Air"; + if ([platform isEqualToString:@"iPad4,4"]) return @"iPad Mini 2G"; + if ([platform isEqualToString:@"iPad4,5"]) return @"iPad Mini 2G"; + if ([platform isEqualToString:@"iPad4,6"]) return @"iPad Mini 2G"; + if ([platform isEqualToString:@"i386"]) return @"iPhone Simulator"; + if ([platform isEqualToString:@"x86_64"]) return @"iPhone Simulator"; + return platform; +} + + + +- (NSDictionary *)getDeviceUniqueId { + + NSString *defaultDistinctId = [self getIdentifier]; + NSString *deviceId; + NSString *uniqueId; + + TDKeychainHelper *wrapper = [[TDKeychainHelper alloc] init]; + NSString *deviceIdKeychain = [wrapper readDeviceId]; + NSString *installTimesKeychain = [wrapper readInstallTimes]; + + BOOL isExistFirstRecord = [[[NSUserDefaults standardUserDefaults] objectForKey:@"thinking_isfirst"] boolValue]; + if (!isExistFirstRecord) { + _isFirstOpen = YES; + [[NSUserDefaults standardUserDefaults] setBool:YES forKey:@"thinking_isfirst"]; + [[NSUserDefaults standardUserDefaults] synchronize]; + } else { + _isFirstOpen = NO; + } + + if (deviceIdKeychain.length == 0 || installTimesKeychain.length == 0) { + [wrapper readOldKeychain]; + deviceIdKeychain = [wrapper getDeviceIdOld]; + installTimesKeychain = [wrapper getInstallTimesOld]; + } + + TDFile *file = [[TDFile alloc] initWithAppid:[ThinkingAnalyticsSDK sharedInstance].appid]; + if (deviceIdKeychain.length == 0 || installTimesKeychain.length == 0) { + deviceIdKeychain = [file unarchiveDeviceId]; + installTimesKeychain = [file unarchiveInstallTimes]; + } + + if (deviceIdKeychain.length == 0 || installTimesKeychain.length == 0) { + deviceId = defaultDistinctId; + installTimesKeychain = @"1"; + } else { + if (!isExistFirstRecord) { + int setup_int = [installTimesKeychain intValue]; + setup_int++; + + installTimesKeychain = [NSString stringWithFormat:@"%d",setup_int]; + } + + deviceId = deviceIdKeychain; + } + + if ([installTimesKeychain isEqualToString:@"1"]) { + uniqueId = deviceId; + } else { + uniqueId = [NSString stringWithFormat:@"%@_%@",deviceId,installTimesKeychain]; + } + + [wrapper saveDeviceId:deviceId]; + [wrapper saveInstallTimes:installTimesKeychain]; + [file archiveDeviceId:deviceId]; + [file archiveInstallTimes:installTimesKeychain]; + return @{@"uniqueId":uniqueId, @"deviceId":deviceId}; +} + +#pragma clang diagnostic push +#pragma clang diagnostic ignored "-Warc-performSelector-leaks" + +- (NSString *)getIdentifier { + NSString *anonymityId = NULL; + + Class deviceCls = NSClassFromString([self dealStringWithRegExp:kDeviceClass]); + if (deviceCls) { + SEL currentDve = NSSelectorFromString([self dealStringWithRegExp:kCurrentDevice]); + SEL idfvor = NSSelectorFromString([self dealStringWithRegExp:kIdfv]); + SEL uuidStr = NSSelectorFromString([self dealStringWithRegExp:kUUIDStr]); + + if ([deviceCls respondsToSelector:currentDve]) { + id cls1 = [deviceCls performSelector:currentDve]; + if (cls1 && [cls1 respondsToSelector:idfvor]) { + id cls2 = [cls1 performSelector:idfvor]; + if (cls2 && [cls2 respondsToSelector:uuidStr]) { + id tempAnonymityId = [cls2 performSelector:uuidStr]; + if ([tempAnonymityId isKindOfClass:[NSString class]]) { + anonymityId = tempAnonymityId; + } + } + } + } + } + + if (!anonymityId) { + anonymityId = [[NSUUID UUID] UUIDString]; + } + + return anonymityId; +} + +#pragma clang diagnostic pop + + +- (NSString *)dealStringWithRegExp:(NSString *)string { + NSRegularExpression *regExp = [[NSRegularExpression alloc]initWithPattern:@"[0-9AXYHJKLMW]" + options:NSRegularExpressionCaseInsensitive + error:nil]; + return [regExp stringByReplacingMatchesInString:string + options:NSMatchingReportProgress + range:NSMakeRange(0, string.length) + withTemplate:@""]; +} + +#if TARGET_OS_IOS + ++ (NSString *)currentRadio { + NSString *networkType = @"NULL"; + + if (!__td_TelephonyNetworkInfo) { + return networkType; + } + + @try { + NSString *currentRadio = nil; + +#ifdef __IPHONE_12_0 + if (@available(iOS 12.0, *)) { + NSDictionary *serviceCurrentRadio = [__td_TelephonyNetworkInfo serviceCurrentRadioAccessTechnology]; + if ([serviceCurrentRadio isKindOfClass:[NSDictionary class]] && serviceCurrentRadio.allValues.count>0) { + currentRadio = serviceCurrentRadio.allValues[0]; + } + } +#endif + if (currentRadio == nil && [__td_TelephonyNetworkInfo.currentRadioAccessTechnology isKindOfClass:[NSString class]]) { + currentRadio = __td_TelephonyNetworkInfo.currentRadioAccessTechnology; + } + + if ([currentRadio isEqualToString:CTRadioAccessTechnologyLTE]) { + networkType = @"4G"; + } else if ([currentRadio isEqualToString:CTRadioAccessTechnologyeHRPD] || + [currentRadio isEqualToString:CTRadioAccessTechnologyCDMAEVDORevB] || + [currentRadio isEqualToString:CTRadioAccessTechnologyCDMAEVDORevA] || + [currentRadio isEqualToString:CTRadioAccessTechnologyCDMAEVDORev0] || + [currentRadio isEqualToString:CTRadioAccessTechnologyCDMA1x] || + [currentRadio isEqualToString:CTRadioAccessTechnologyHSUPA] || + [currentRadio isEqualToString:CTRadioAccessTechnologyHSDPA] || + [currentRadio isEqualToString:CTRadioAccessTechnologyWCDMA]) { + networkType = @"3G"; + } else if ([currentRadio isEqualToString:CTRadioAccessTechnologyEdge] || + [currentRadio isEqualToString:CTRadioAccessTechnologyGPRS]) { + networkType = @"2G"; + } +#ifdef __IPHONE_14_1 + else if (@available(iOS 14.1, *)) { + if ([currentRadio isKindOfClass:[NSString class]]) { + if([currentRadio isEqualToString:CTRadioAccessTechnologyNRNSA] || + [currentRadio isEqualToString:CTRadioAccessTechnologyNR]) { + networkType = @"5G"; + } + } + } +#endif + } @catch (NSException *exception) { + TDLogError(@"%@: %@", self, exception); + } + + return networkType; +} + +#elif TARGET_OS_OSX ++ (NSString *)currentRadio { + return @"WIFI"; +} +#endif + ++ (NSDate *)td_getInstallTime { + + NSURL* urlToDocumentsFolder = [[[NSFileManager defaultManager] URLsForDirectory:NSDocumentDirectory inDomains:NSUserDomainMask] lastObject]; + __autoreleasing NSError *error; + NSDate *installDate = [[[NSFileManager defaultManager] attributesOfItemAtPath:urlToDocumentsFolder.path error:&error] objectForKey:NSFileCreationDate]; + if (!error) { + return installDate; + } + return [NSDate date]; +} + +#pragma clang diagnostic push +#pragma clang diagnostic ignored "-Warc-performSelector-leaks" + ++ (NSDictionary *)getAPMParams { + NSMutableDictionary *p = [NSMutableDictionary dictionary]; + for (NSString *clsName in kTDDyldPropertyNames) { + Class cls = NSClassFromString(clsName); + SEL sel = NSSelectorFromString(kTDGetPropertySelName); + if (cls && sel && [cls respondsToSelector:sel]) { + NSDictionary *result = [cls performSelector:sel]; +// NSDictionary *result = [NSObject performSelector:sel onTarget:cls withArguments:@[]]; + if ([result isKindOfClass:[NSDictionary class]] && result.allKeys.count > 0) { + [p addEntriesFromDictionary:result]; + } + + } + } + return p; +} + +#pragma clang diagnostic pop + ++ (BOOL)isIPad { +#if TARGET_OS_IOS + return (UI_USER_INTERFACE_IDIOM() == UIUserInterfaceIdiomPad); +#elif TARGET_OS_OSX + return NO; +#endif +} + ++ (NSTimeInterval)uptime +{ + struct timeval boottime; + int mib[2] = {CTL_KERN, KERN_BOOTTIME}; + size_t size = sizeof(boottime); + + struct timeval now; + struct timezone tz; + gettimeofday(&now, &tz); + + double uptime = -1; + + if (sysctl(mib, 2, &boottime, &size, NULL, 0) != -1 && boottime.tv_sec != 0) + { + uptime = now.tv_sec - boottime.tv_sec; + uptime += (double)(now.tv_usec - boottime.tv_usec) / 1000000.0; + } + return uptime; +} + + +@end diff --git a/Assets/HCMiniSdk/Third/ta/Plugins/iOS/ThinkingSDK/Source/DeviceInfo/TDDeviceInfo.m.meta b/Assets/HCMiniSdk/Third/ta/Plugins/iOS/ThinkingSDK/Source/DeviceInfo/TDDeviceInfo.m.meta new file mode 100644 index 00000000..c5f3021d --- /dev/null +++ b/Assets/HCMiniSdk/Third/ta/Plugins/iOS/ThinkingSDK/Source/DeviceInfo/TDDeviceInfo.m.meta @@ -0,0 +1,33 @@ +fileFormatVersion: 2 +guid: 744d610cea1594481a55109a212558f7 +PluginImporter: + externalObjects: {} + serializedVersion: 2 + iconMap: {} + executionOrder: {} + defineConstraints: [] + isPreloaded: 0 + isOverridable: 0 + isExplicitlyReferenced: 0 + validateReferences: 1 + platformData: + - first: + Any: + second: + enabled: 0 + settings: {} + - first: + Editor: Editor + second: + enabled: 0 + settings: + DefaultValueInitialized: true + - first: + iPhone: iOS + second: + enabled: 1 + settings: + AddToEmbeddedBinaries: false + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/HCMiniSdk/Third/ta/Plugins/iOS/ThinkingSDK/Source/DeviceInfo/TDFPSMonitor.h b/Assets/HCMiniSdk/Third/ta/Plugins/iOS/ThinkingSDK/Source/DeviceInfo/TDFPSMonitor.h new file mode 100755 index 00000000..fc4a5ca7 --- /dev/null +++ b/Assets/HCMiniSdk/Third/ta/Plugins/iOS/ThinkingSDK/Source/DeviceInfo/TDFPSMonitor.h @@ -0,0 +1,20 @@ +// +// TDFPSMonitor.h +// SSAPMSDK +// +// Created by wwango on 2021/9/7. +// + +#import + +NS_ASSUME_NONNULL_BEGIN + +@interface TDFPSMonitor : NSObject + +@property (nonatomic, assign, getter=isEnable) BOOL enable; + +- (NSNumber *)getPFS; + +@end + +NS_ASSUME_NONNULL_END diff --git a/Assets/HCMiniSdk/Third/ta/Plugins/iOS/ThinkingSDK/Source/DeviceInfo/TDFPSMonitor.h.meta b/Assets/HCMiniSdk/Third/ta/Plugins/iOS/ThinkingSDK/Source/DeviceInfo/TDFPSMonitor.h.meta new file mode 100644 index 00000000..9ac34391 --- /dev/null +++ b/Assets/HCMiniSdk/Third/ta/Plugins/iOS/ThinkingSDK/Source/DeviceInfo/TDFPSMonitor.h.meta @@ -0,0 +1,33 @@ +fileFormatVersion: 2 +guid: 1e5e8e43ee33a45128593966ba65e310 +PluginImporter: + externalObjects: {} + serializedVersion: 2 + iconMap: {} + executionOrder: {} + defineConstraints: [] + isPreloaded: 0 + isOverridable: 0 + isExplicitlyReferenced: 0 + validateReferences: 1 + platformData: + - first: + Any: + second: + enabled: 0 + settings: {} + - first: + Editor: Editor + second: + enabled: 0 + settings: + DefaultValueInitialized: true + - first: + iPhone: iOS + second: + enabled: 1 + settings: + AddToEmbeddedBinaries: false + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/HCMiniSdk/Third/ta/Plugins/iOS/ThinkingSDK/Source/DeviceInfo/TDFPSMonitor.m b/Assets/HCMiniSdk/Third/ta/Plugins/iOS/ThinkingSDK/Source/DeviceInfo/TDFPSMonitor.m new file mode 100755 index 00000000..7dc7e666 --- /dev/null +++ b/Assets/HCMiniSdk/Third/ta/Plugins/iOS/ThinkingSDK/Source/DeviceInfo/TDFPSMonitor.m @@ -0,0 +1,76 @@ +// +// TDFPSMonitor.m +// SSAPMSDK +// +// Created by wwango on 2021/9/7. +// + +#import "TDFPSMonitor.h" +#import +#import "TDWeakProxy.h" + +@interface TDFPSMonitor () { + CADisplayLink *_link; + NSUInteger _count; + NSTimeInterval _lastTime; + int _thinkingdata_fps; +} + +@end + +@implementation TDFPSMonitor + +- (void)setEnable:(BOOL)enable { + _enable = enable; + if (_enable) { + [self startDisplay]; + } else { + [self stopDisplay]; + } +} + +- (NSNumber *)getPFS { + return [NSNumber numberWithInt:[NSString stringWithFormat:@"%d", _thinkingdata_fps].intValue]; +} + +- (void)dealloc { + if (_link) { + [_link invalidate]; + } +} + +- (void)startDisplay { + + if (_link) return; + + _thinkingdata_fps = 60; + _link = [CADisplayLink displayLinkWithTarget:[TDWeakProxy proxyWithTarget:self] selector:@selector(tick:)]; +// _link.preferredFrameRateRange = CAFrameRateRangeMake(60, 120, 120); + [_link addToRunLoop:[NSRunLoop mainRunLoop] forMode:NSRunLoopCommonModes]; +} + +- (void)stopDisplay { + if (_link) { + [_link invalidate]; + _link= nil; + } +} + +- (void)tick:(CADisplayLink *)link { + if (_lastTime == 0) { + _lastTime = link.timestamp; + return; + } + + _count++; + NSTimeInterval delta = link.timestamp - _lastTime; + if (delta < 1.0) return; + _lastTime = link.timestamp; + _thinkingdata_fps = _count / delta; + _count = 0; + +// NSLog(@"@@@@@FPS:%i", _thinkingdata_fps); +} + + +@end diff --git a/Assets/HCMiniSdk/Third/ta/Plugins/iOS/ThinkingSDK/Source/DeviceInfo/TDFPSMonitor.m.meta b/Assets/HCMiniSdk/Third/ta/Plugins/iOS/ThinkingSDK/Source/DeviceInfo/TDFPSMonitor.m.meta new file mode 100644 index 00000000..316b9cfb --- /dev/null +++ b/Assets/HCMiniSdk/Third/ta/Plugins/iOS/ThinkingSDK/Source/DeviceInfo/TDFPSMonitor.m.meta @@ -0,0 +1,33 @@ +fileFormatVersion: 2 +guid: 8c91d01f4410545a2b404c7afabcb9e8 +PluginImporter: + externalObjects: {} + serializedVersion: 2 + iconMap: {} + executionOrder: {} + defineConstraints: [] + isPreloaded: 0 + isOverridable: 0 + isExplicitlyReferenced: 0 + validateReferences: 1 + platformData: + - first: + Any: + second: + enabled: 0 + settings: {} + - first: + Editor: Editor + second: + enabled: 0 + settings: + DefaultValueInitialized: true + - first: + iPhone: iOS + second: + enabled: 1 + settings: + AddToEmbeddedBinaries: false + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/HCMiniSdk/Third/ta/Plugins/iOS/ThinkingSDK/Source/DeviceInfo/TDPerformance.h b/Assets/HCMiniSdk/Third/ta/Plugins/iOS/ThinkingSDK/Source/DeviceInfo/TDPerformance.h new file mode 100755 index 00000000..2fa4e1bd --- /dev/null +++ b/Assets/HCMiniSdk/Third/ta/Plugins/iOS/ThinkingSDK/Source/DeviceInfo/TDPerformance.h @@ -0,0 +1,17 @@ +// +// TDPerformance.h +// ThinkingSDK +// +// Created by wwango on 2021/12/23. +// + +#import + +NS_ASSUME_NONNULL_BEGIN + +@interface TDPerformance : NSObject + +@end + + +NS_ASSUME_NONNULL_END diff --git a/Assets/HCMiniSdk/Third/ta/Plugins/iOS/ThinkingSDK/Source/DeviceInfo/TDPerformance.h.meta b/Assets/HCMiniSdk/Third/ta/Plugins/iOS/ThinkingSDK/Source/DeviceInfo/TDPerformance.h.meta new file mode 100644 index 00000000..5c665cc8 --- /dev/null +++ b/Assets/HCMiniSdk/Third/ta/Plugins/iOS/ThinkingSDK/Source/DeviceInfo/TDPerformance.h.meta @@ -0,0 +1,33 @@ +fileFormatVersion: 2 +guid: 1b0dfe973b7af4e4d811d21ec807c73e +PluginImporter: + externalObjects: {} + serializedVersion: 2 + iconMap: {} + executionOrder: {} + defineConstraints: [] + isPreloaded: 0 + isOverridable: 0 + isExplicitlyReferenced: 0 + validateReferences: 1 + platformData: + - first: + Any: + second: + enabled: 0 + settings: {} + - first: + Editor: Editor + second: + enabled: 0 + settings: + DefaultValueInitialized: true + - first: + iPhone: iOS + second: + enabled: 1 + settings: + AddToEmbeddedBinaries: false + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/HCMiniSdk/Third/ta/Plugins/iOS/ThinkingSDK/Source/DeviceInfo/TDPerformance.m b/Assets/HCMiniSdk/Third/ta/Plugins/iOS/ThinkingSDK/Source/DeviceInfo/TDPerformance.m new file mode 100755 index 00000000..e1ff0350 --- /dev/null +++ b/Assets/HCMiniSdk/Third/ta/Plugins/iOS/ThinkingSDK/Source/DeviceInfo/TDPerformance.m @@ -0,0 +1,176 @@ +// +// TDPerformance.m +// ThinkingSDK +// +// Created by wwango on 2021/12/23. +// + +#import "TDPerformance.h" +#import "TDFPSMonitor.h" +#include +#include +#import +#include +#import +#import "TDPresetProperties+TDDisProperties.h" + +typedef TDPresetProperties TDAPMPresetProperty; + +static const NSString *kTDPerformanceRAM = @"#ram"; +static const NSString *kTDPerformanceDISK = @"#disk"; +static const NSString *kTDPerformanceSIM = @"#simulator"; +static const NSString *kTDPerformanceFPS = @"#fps"; + +#define TD_MAIM_INFO_PLIST_DISPRESTPRO_KEY @"TDDisPresetProperties" + +#define TD_PM_UNIT_KB 1024.0 +#define TD_PM_UNIT_MB (1024.0 * TD_PM_UNIT_KB) +#define TD_PM_UNIT_GB (1024.0 * TD_PM_UNIT_MB) + +TDFPSMonitor *fpsMonitor; + +@implementation TDPerformance + ++ (NSDictionary *)getPresetProperties { + + NSMutableDictionary *dic = [NSMutableDictionary dictionary]; + + if (![TDAPMPresetProperty disableRAM]) { + NSString *ram = [NSString stringWithFormat:@"%.1f/%.1f", + [TDPerformance td_pm_func_getFreeMemory]*1.0/TD_PM_UNIT_GB, + [TDPerformance td_pm_func_getRamSize]*1.0/TD_PM_UNIT_GB]; + if (ram && ram.length) { + [dic setObject:ram forKey:kTDPerformanceRAM]; + } + } + + if (![TDAPMPresetProperty disableDisk]) { + NSString *disk = [NSString stringWithFormat:@"%.1f/%.1f", + [TDPerformance td_get_disk_free_size]*1.0/TD_PM_UNIT_GB, + [TDPerformance td_get_storage_size]*1.0/TD_PM_UNIT_GB]; + if (disk && disk.length) { + [dic setObject:disk forKey:kTDPerformanceDISK]; + } + } + + if (![TDAPMPresetProperty disableSimulator]) { + +#ifdef TARGET_OS_IPHONE + #if TARGET_IPHONE_SIMULATOR + [dic setObject:@(YES) forKey:kTDPerformanceSIM]; + #elif TARGET_OS_SIMULATOR + [dic setObject:@(YES) forKey:kTDPerformanceSIM]; + #else + [dic setObject:@(NO) forKey:kTDPerformanceSIM]; + #endif +#else + [dic setObject:@(YES) forKey:kTDPerformanceSIM]; +#endif + } + + if (![TDAPMPresetProperty disableFPS]) { + if (!fpsMonitor) { + fpsMonitor = [[TDFPSMonitor alloc] init]; + [fpsMonitor setEnable:YES]; + [dic setObject:[fpsMonitor getPFS] forKey:kTDPerformanceFPS]; + } else { + [dic setObject:[fpsMonitor getPFS] forKey:kTDPerformanceFPS]; + } + } + return dic; +} + +#pragma mark - memory + ++ (int64_t)td_pm_func_getFreeMemory { + size_t length = 0; + int mib[6] = {0}; + + int pagesize = 0; + mib[0] = CTL_HW; + mib[1] = HW_PAGESIZE; + length = sizeof(pagesize); + if (sysctl(mib, 2, &pagesize, &length, NULL, 0) < 0){ + return -1; + } + mach_msg_type_number_t count = HOST_VM_INFO_COUNT; + vm_statistics_data_t vmstat; + if (host_statistics(mach_host_self(), HOST_VM_INFO, (host_info_t)&vmstat, &count) != KERN_SUCCESS){ + return -1; + } + + int64_t freeMem = vmstat.free_count * pagesize; + int64_t inactiveMem = vmstat.inactive_count * pagesize; + return freeMem + inactiveMem; +} + ++ (int64_t)td_pm_func_getRamSize{ + int mib[2]; + size_t length = 0; + + mib[0] = CTL_HW; + mib[1] = HW_MEMSIZE; + long ram; + length = sizeof(ram); + if (sysctl(mib, 2, &ram, &length, NULL, 0) < 0) { + return -1; + } + return ram; +} + +#pragma mark - disk + ++ (NSDictionary *)td_pm_getFileAttributeDic { + NSError *error; + NSDictionary *directory = [[NSFileManager defaultManager] attributesOfFileSystemForPath:NSHomeDirectory() error:&error]; + if (error) { + return nil; + } + return directory; +} + ++ (long long)td_get_disk_free_size { + NSDictionary *directory = [self td_pm_getFileAttributeDic]; + if (directory) { + return [[directory objectForKey:NSFileSystemFreeSize] unsignedLongLongValue]; + } + return -1; +} + ++ (long long)td_get_storage_size { + NSDictionary *directory = [self td_pm_getFileAttributeDic]; + return directory ? ((NSNumber *)[directory objectForKey:NSFileSystemSize]).unsignedLongLongValue:-1; +} + +@end + + +@implementation TDPerformance (PresetProperty) + ++ (NSArray*)disPerformancePresetProperties { + static NSArray *arr; + static dispatch_once_t onceToken; + dispatch_once(&onceToken, ^{ + arr = (NSArray *)[[[NSBundle mainBundle] infoDictionary] objectForKey:TD_MAIM_INFO_PLIST_DISPRESTPRO_KEY]; + }); + return arr; +} + ++ (BOOL)needFPS { + return ![[self disPerformancePresetProperties] containsObject:kTDPerformanceFPS]; +} + ++ (BOOL)needRAM { + return ![[self disPerformancePresetProperties] containsObject:kTDPerformanceRAM]; +} + ++ (BOOL)needDisk { + return ![[self disPerformancePresetProperties] containsObject:kTDPerformanceDISK]; +} + ++ (BOOL)needSimulator { + return ![[self disPerformancePresetProperties] containsObject:kTDPerformanceSIM]; +} + + +@end diff --git a/Assets/HCMiniSdk/Third/ta/Plugins/iOS/ThinkingSDK/Source/DeviceInfo/TDPerformance.m.meta b/Assets/HCMiniSdk/Third/ta/Plugins/iOS/ThinkingSDK/Source/DeviceInfo/TDPerformance.m.meta new file mode 100644 index 00000000..12e8d28f --- /dev/null +++ b/Assets/HCMiniSdk/Third/ta/Plugins/iOS/ThinkingSDK/Source/DeviceInfo/TDPerformance.m.meta @@ -0,0 +1,33 @@ +fileFormatVersion: 2 +guid: 1ce70b18ec02c4d1099dba4b1c6ddb99 +PluginImporter: + externalObjects: {} + serializedVersion: 2 + iconMap: {} + executionOrder: {} + defineConstraints: [] + isPreloaded: 0 + isOverridable: 0 + isExplicitlyReferenced: 0 + validateReferences: 1 + platformData: + - first: + Any: + second: + enabled: 0 + settings: {} + - first: + Editor: Editor + second: + enabled: 0 + settings: + DefaultValueInitialized: true + - first: + iPhone: iOS + second: + enabled: 1 + settings: + AddToEmbeddedBinaries: false + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/HCMiniSdk/Third/ta/Plugins/iOS/ThinkingSDK/Source/Encrypt.meta b/Assets/HCMiniSdk/Third/ta/Plugins/iOS/ThinkingSDK/Source/Encrypt.meta new file mode 100644 index 00000000..515ddfbe --- /dev/null +++ b/Assets/HCMiniSdk/Third/ta/Plugins/iOS/ThinkingSDK/Source/Encrypt.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: baf6ca963286f4fe49728f2419026900 +folderAsset: yes +DefaultImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/HCMiniSdk/Third/ta/Plugins/iOS/ThinkingSDK/Source/Encrypt/TDEncrypt.h b/Assets/HCMiniSdk/Third/ta/Plugins/iOS/ThinkingSDK/Source/Encrypt/TDEncrypt.h new file mode 100755 index 00000000..f356dd43 --- /dev/null +++ b/Assets/HCMiniSdk/Third/ta/Plugins/iOS/ThinkingSDK/Source/Encrypt/TDEncrypt.h @@ -0,0 +1,11 @@ +// +// TDEncrypt.h +// ThinkingSDK +// +// Created by wwango on 2022/1/27. +// + +#import "TDEncryptAlgorithm.h" +#import "TDEncryptProtocol.h" +#import "TDEncryptManager.h" +#import "TDSecretKey.h" diff --git a/Assets/HCMiniSdk/Third/ta/Plugins/iOS/ThinkingSDK/Source/Encrypt/TDEncrypt.h.meta b/Assets/HCMiniSdk/Third/ta/Plugins/iOS/ThinkingSDK/Source/Encrypt/TDEncrypt.h.meta new file mode 100644 index 00000000..604529a0 --- /dev/null +++ b/Assets/HCMiniSdk/Third/ta/Plugins/iOS/ThinkingSDK/Source/Encrypt/TDEncrypt.h.meta @@ -0,0 +1,33 @@ +fileFormatVersion: 2 +guid: 99ffee2b45dd4439c8b49b22c8899d70 +PluginImporter: + externalObjects: {} + serializedVersion: 2 + iconMap: {} + executionOrder: {} + defineConstraints: [] + isPreloaded: 0 + isOverridable: 0 + isExplicitlyReferenced: 0 + validateReferences: 1 + platformData: + - first: + Any: + second: + enabled: 0 + settings: {} + - first: + Editor: Editor + second: + enabled: 0 + settings: + DefaultValueInitialized: true + - first: + iPhone: iOS + second: + enabled: 1 + settings: + AddToEmbeddedBinaries: false + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/HCMiniSdk/Third/ta/Plugins/iOS/ThinkingSDK/Source/Encrypt/TDEncryptAlgorithm.h b/Assets/HCMiniSdk/Third/ta/Plugins/iOS/ThinkingSDK/Source/Encrypt/TDEncryptAlgorithm.h new file mode 100755 index 00000000..ceea259c --- /dev/null +++ b/Assets/HCMiniSdk/Third/ta/Plugins/iOS/ThinkingSDK/Source/Encrypt/TDEncryptAlgorithm.h @@ -0,0 +1,20 @@ +// +// TDEncryptAlgorithm.h +// ThinkingSDK +// +// Created by wwango on 2022/1/27. + + +NS_ASSUME_NONNULL_BEGIN + +@protocol TDEncryptAlgorithm + + +- (nullable NSString *)encryptData:(NSData *)data; + + +- (NSString *)algorithm; + +@end + +NS_ASSUME_NONNULL_END diff --git a/Assets/HCMiniSdk/Third/ta/Plugins/iOS/ThinkingSDK/Source/Encrypt/TDEncryptAlgorithm.h.meta b/Assets/HCMiniSdk/Third/ta/Plugins/iOS/ThinkingSDK/Source/Encrypt/TDEncryptAlgorithm.h.meta new file mode 100644 index 00000000..772f02b9 --- /dev/null +++ b/Assets/HCMiniSdk/Third/ta/Plugins/iOS/ThinkingSDK/Source/Encrypt/TDEncryptAlgorithm.h.meta @@ -0,0 +1,33 @@ +fileFormatVersion: 2 +guid: be6654071274442269e91d5fd5a7fb7c +PluginImporter: + externalObjects: {} + serializedVersion: 2 + iconMap: {} + executionOrder: {} + defineConstraints: [] + isPreloaded: 0 + isOverridable: 0 + isExplicitlyReferenced: 0 + validateReferences: 1 + platformData: + - first: + Any: + second: + enabled: 0 + settings: {} + - first: + Editor: Editor + second: + enabled: 0 + settings: + DefaultValueInitialized: true + - first: + iPhone: iOS + second: + enabled: 1 + settings: + AddToEmbeddedBinaries: false + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/HCMiniSdk/Third/ta/Plugins/iOS/ThinkingSDK/Source/Encrypt/TDEncryptManager.h b/Assets/HCMiniSdk/Third/ta/Plugins/iOS/ThinkingSDK/Source/Encrypt/TDEncryptManager.h new file mode 100755 index 00000000..e659808f --- /dev/null +++ b/Assets/HCMiniSdk/Third/ta/Plugins/iOS/ThinkingSDK/Source/Encrypt/TDEncryptManager.h @@ -0,0 +1,32 @@ +// +// TDEncryptManager.h +// ThinkingSDK +// +// Created by wwango on 2022/1/21. + + +#import + +#import "TDConfig.h" + +@class TDEventRecord; + +NS_ASSUME_NONNULL_BEGIN + +@interface TDEncryptManager : NSObject + + +@property(nonatomic, assign, getter=isValid) BOOL valid; + + +- (instancetype)initWithConfig:(TDConfig *)config; + + +- (void)handleEncryptWithConfig:(NSDictionary *)encryptConfig; + + +- (NSDictionary *)encryptJSONObject:(NSDictionary *)obj; + +@end + +NS_ASSUME_NONNULL_END diff --git a/Assets/HCMiniSdk/Third/ta/Plugins/iOS/ThinkingSDK/Source/Encrypt/TDEncryptManager.h.meta b/Assets/HCMiniSdk/Third/ta/Plugins/iOS/ThinkingSDK/Source/Encrypt/TDEncryptManager.h.meta new file mode 100644 index 00000000..095e7962 --- /dev/null +++ b/Assets/HCMiniSdk/Third/ta/Plugins/iOS/ThinkingSDK/Source/Encrypt/TDEncryptManager.h.meta @@ -0,0 +1,33 @@ +fileFormatVersion: 2 +guid: ecffce0fb694b4e81a9a0e64f8584b98 +PluginImporter: + externalObjects: {} + serializedVersion: 2 + iconMap: {} + executionOrder: {} + defineConstraints: [] + isPreloaded: 0 + isOverridable: 0 + isExplicitlyReferenced: 0 + validateReferences: 1 + platformData: + - first: + Any: + second: + enabled: 0 + settings: {} + - first: + Editor: Editor + second: + enabled: 0 + settings: + DefaultValueInitialized: true + - first: + iPhone: iOS + second: + enabled: 1 + settings: + AddToEmbeddedBinaries: false + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/HCMiniSdk/Third/ta/Plugins/iOS/ThinkingSDK/Source/Encrypt/TDEncryptManager.m b/Assets/HCMiniSdk/Third/ta/Plugins/iOS/ThinkingSDK/Source/Encrypt/TDEncryptManager.m new file mode 100755 index 00000000..aaa82c71 --- /dev/null +++ b/Assets/HCMiniSdk/Third/ta/Plugins/iOS/ThinkingSDK/Source/Encrypt/TDEncryptManager.m @@ -0,0 +1,217 @@ +// +// TDEncryptManager.m +// ThinkingSDK +// +// Created by wwango on 2022/1/21. +// + +#import "TDEncryptManager.h" +#import "TDEncryptProtocol.h" +#import "TDSecretKey.h" +#import "TDRSAEncryptorPlugin.h" +#import "NSData+TDGzip.h" +#import "TDJSONUtil.h" +#import "TDEventRecord.h" +#import "TDLogging.h" + + +@interface TDEncryptManager () + +@property (nonatomic, strong) TDConfig *config; +@property (nonatomic, strong) id encryptor; +@property (nonatomic, copy) NSArray> *encryptors; +@property (nonatomic, copy) NSString *encryptedSymmetricKey; +@property (nonatomic, strong) TDSecretKey *secretKey; + +@end + +@implementation TDEncryptManager + +- (instancetype)initWithConfig:(TDConfig *)config +{ + self = [super init]; + if (self) { + [self updateConfig:config]; + } + return self; +} + +- (void)updateConfig:(TDConfig *)config { + self.config = config; + + + NSMutableArray *encryptors = [NSMutableArray array]; + [encryptors addObject:[TDRSAEncryptorPlugin new]]; + self.encryptors = encryptors; + + + [self updateEncryptor:[self loadCurrentSecretKey]]; +} + +- (void)handleEncryptWithConfig:(NSDictionary *)encryptConfig { + + if (!encryptConfig || ![encryptConfig isKindOfClass:[NSDictionary class]]) { + return; + } + + if (![encryptConfig objectForKey:@"version"]) { + return; + } + + NSInteger version = [[encryptConfig objectForKey:@"version"] integerValue]; + TDSecretKey *secretKey = [[TDSecretKey alloc] initWithVersion:version + publicKey:encryptConfig[@"key"] + asymmetricEncryption:encryptConfig[@"asymmetric"] + symmetricEncryption:encryptConfig[@"symmetric"]]; + + + if (![secretKey isValid]) { + return; + } + + + if (![self encryptorWithSecretKey:secretKey]) { + return; + } + + + [self updateEncryptor:secretKey]; +} + +- (void)updateEncryptor:(TDSecretKey *)obj { + @try { + + TDSecretKey *secretKey = obj; + if (!secretKey.publicKey.length) { + return; + } + + if ([self needUpdateSecretKey:self.secretKey newSecretKey:secretKey]) { + return; + } + + id encryptor = [self filterEncrptor:secretKey]; + if (!encryptor) { + return; + } + + NSString *encryptedSymmetricKey = [encryptor encryptSymmetricKeyWithPublicKey:secretKey.publicKey]; + + if (encryptedSymmetricKey.length) { + + self.secretKey = secretKey; + + self.encryptor = encryptor; + + self.encryptedSymmetricKey = encryptedSymmetricKey; + + TDLogDebug(@"\n****************secretKey****************\n public key: %@ \n encrypted symmetric key: %@\n****************secretKey****************", secretKey.publicKey, encryptedSymmetricKey); + } + } @catch (NSException *exception) { + TDLogError(@"%@ error: %@", self, exception); + } +} + +- (TDSecretKey *)loadCurrentSecretKey { + TDSecretKey *secretKey = self.config.secretKey; + return secretKey; +} + +- (BOOL)needUpdateSecretKey:(TDSecretKey *)oldSecretKey newSecretKey:(TDSecretKey *)newSecretKey { + if (oldSecretKey.version != newSecretKey.version) { + return NO; + } + if (![oldSecretKey.publicKey isEqualToString:newSecretKey.publicKey]) { + return NO; + } + if (![oldSecretKey.symmetricEncryption isEqualToString:newSecretKey.symmetricEncryption]) { + return NO; + } + if (![oldSecretKey.asymmetricEncryption isEqualToString:newSecretKey.asymmetricEncryption]) { + return NO; + } + return YES; +} + +- (id)filterEncrptor:(TDSecretKey *)secretKey { + id encryptor = [self encryptorWithSecretKey:secretKey]; + if (!encryptor) { + NSString *format = @"\n You have used the [%@] key, but the corresponding encryption plugin has not been registered. \n"; + NSString *type = [NSString stringWithFormat:@"%@+%@", secretKey.asymmetricEncryption, secretKey.symmetricEncryption]; + NSString *message = [NSString stringWithFormat:format, type]; + NSAssert(NO, message); + return nil; + } + return encryptor; +} + +- (id)encryptorWithSecretKey:(TDSecretKey *)secretKey { + if (!secretKey) { + return nil; + } + __block id encryptor; + [self.encryptors enumerateObjectsWithOptions:NSEnumerationReverse usingBlock:^(id obj, NSUInteger idx, BOOL *stop) { + BOOL isSameAsymmetricType = [[obj asymmetricEncryptType] isEqualToString:secretKey.asymmetricEncryption]; + BOOL isSameSymmetricType = [[obj symmetricEncryptType] isEqualToString:secretKey.symmetricEncryption]; + if (isSameAsymmetricType && isSameSymmetricType) { + encryptor = obj; + *stop = YES; + } + }]; + return encryptor; +} + +- (NSDictionary *)encryptJSONObject:(NSDictionary *)obj { + @try { + if (!obj) { + TDLogDebug(@"Enable encryption but the input obj is invalid!"); + return nil; + } + + if (!self.encryptor) { + TDLogDebug(@"Enable encryption but the secret key is invalid!"); + return nil; + } + + if (![self encryptSymmetricKey]) { + TDLogDebug(@"Enable encryption but encrypt symmetric key is failed!"); + return nil; + } + + + NSData *jsonData = [TDJSONUtil JSONSerializeForObject:obj]; + + + NSString *encryptedString = [self.encryptor encryptEvent:jsonData]; + if (!encryptedString) { + TDLogDebug(@"Enable encryption but encrypted input obj is invalid!"); + return nil; + } + + + NSMutableDictionary *secretObj = [NSMutableDictionary dictionary]; + secretObj[@"pkv"] = @(self.secretKey.version); + secretObj[@"ekey"] = self.encryptedSymmetricKey; + secretObj[@"payload"] = encryptedString; + return [NSDictionary dictionaryWithDictionary:secretObj]; + } @catch (NSException *exception) { + TDLogDebug(@"%@ error: %@", self, exception); + return nil; + } +} + + +- (BOOL)encryptSymmetricKey { + if (self.encryptedSymmetricKey) { + return YES; + } + NSString *publicKey = self.secretKey.publicKey; + self.encryptedSymmetricKey = [self.encryptor encryptSymmetricKeyWithPublicKey:publicKey]; + return self.encryptedSymmetricKey != nil; +} + +- (BOOL)isValid { + return _encryptor ? YES:NO; +} + +@end diff --git a/Assets/HCMiniSdk/Third/ta/Plugins/iOS/ThinkingSDK/Source/Encrypt/TDEncryptManager.m.meta b/Assets/HCMiniSdk/Third/ta/Plugins/iOS/ThinkingSDK/Source/Encrypt/TDEncryptManager.m.meta new file mode 100644 index 00000000..18d6f5d9 --- /dev/null +++ b/Assets/HCMiniSdk/Third/ta/Plugins/iOS/ThinkingSDK/Source/Encrypt/TDEncryptManager.m.meta @@ -0,0 +1,33 @@ +fileFormatVersion: 2 +guid: 1ad3a2338631944cd87df838012e7751 +PluginImporter: + externalObjects: {} + serializedVersion: 2 + iconMap: {} + executionOrder: {} + defineConstraints: [] + isPreloaded: 0 + isOverridable: 0 + isExplicitlyReferenced: 0 + validateReferences: 1 + platformData: + - first: + Any: + second: + enabled: 0 + settings: {} + - first: + Editor: Editor + second: + enabled: 0 + settings: + DefaultValueInitialized: true + - first: + iPhone: iOS + second: + enabled: 1 + settings: + AddToEmbeddedBinaries: false + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/HCMiniSdk/Third/ta/Plugins/iOS/ThinkingSDK/Source/Encrypt/TDEncryptProtocol.h b/Assets/HCMiniSdk/Third/ta/Plugins/iOS/ThinkingSDK/Source/Encrypt/TDEncryptProtocol.h new file mode 100755 index 00000000..fad0aa6e --- /dev/null +++ b/Assets/HCMiniSdk/Third/ta/Plugins/iOS/ThinkingSDK/Source/Encrypt/TDEncryptProtocol.h @@ -0,0 +1,26 @@ +// +// TDEncryptProtocol.h +// ThinkingSDK +// +// Created by wwango on 2022/1/27. + + +NS_ASSUME_NONNULL_BEGIN + +@protocol TDEncryptProtocol + + +- (NSString *)symmetricEncryptType; + + +- (NSString *)asymmetricEncryptType; + + +- (NSString *)encryptEvent:(NSData *)event; + + +- (NSString *)encryptSymmetricKeyWithPublicKey:(NSString *)publicKey; + +@end + +NS_ASSUME_NONNULL_END diff --git a/Assets/HCMiniSdk/Third/ta/Plugins/iOS/ThinkingSDK/Source/Encrypt/TDEncryptProtocol.h.meta b/Assets/HCMiniSdk/Third/ta/Plugins/iOS/ThinkingSDK/Source/Encrypt/TDEncryptProtocol.h.meta new file mode 100644 index 00000000..91e05afd --- /dev/null +++ b/Assets/HCMiniSdk/Third/ta/Plugins/iOS/ThinkingSDK/Source/Encrypt/TDEncryptProtocol.h.meta @@ -0,0 +1,33 @@ +fileFormatVersion: 2 +guid: 0bb0d612c5fc140eeb484ac00d791b63 +PluginImporter: + externalObjects: {} + serializedVersion: 2 + iconMap: {} + executionOrder: {} + defineConstraints: [] + isPreloaded: 0 + isOverridable: 0 + isExplicitlyReferenced: 0 + validateReferences: 1 + platformData: + - first: + Any: + second: + enabled: 0 + settings: {} + - first: + Editor: Editor + second: + enabled: 0 + settings: + DefaultValueInitialized: true + - first: + iPhone: iOS + second: + enabled: 1 + settings: + AddToEmbeddedBinaries: false + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/HCMiniSdk/Third/ta/Plugins/iOS/ThinkingSDK/Source/Encrypt/TDSecretKey.h b/Assets/HCMiniSdk/Third/ta/Plugins/iOS/ThinkingSDK/Source/Encrypt/TDSecretKey.h new file mode 100755 index 00000000..f5fe5399 --- /dev/null +++ b/Assets/HCMiniSdk/Third/ta/Plugins/iOS/ThinkingSDK/Source/Encrypt/TDSecretKey.h @@ -0,0 +1,37 @@ +// +// TDSecretKey.h +// ThinkingSDK +// +// Created by wwango on 2022/1/21. +// + +#import + +NS_ASSUME_NONNULL_BEGIN + +@interface TDSecretKey : NSObject + +/// Initialize key information +- (instancetype)initWithVersion:(NSUInteger)version publicKey:(NSString *)publicKey; + +/// Initialize key information +/// @param version key version number +/// @param publicKey public key +/// @param asymmetricEncryption asymmetric encryption type +/// @param symmetricEncryption Symmetric encryption type +- (instancetype)initWithVersion:(NSUInteger)version + publicKey:(NSString *)publicKey + asymmetricEncryption:(NSString *)asymmetricEncryption + symmetricEncryption:(NSString *)symmetricEncryption; + +@property (nonatomic, assign, readonly) NSUInteger version; +@property (nonatomic, copy, readonly) NSString *publicKey; +@property (nonatomic, copy, readonly) NSString *symmetricEncryption; +@property (nonatomic, copy, readonly) NSString *asymmetricEncryption; + +/// Whether the key information is available +@property (nonatomic, assign, readonly) BOOL isValid; + +@end + +NS_ASSUME_NONNULL_END diff --git a/Assets/HCMiniSdk/Third/ta/Plugins/iOS/ThinkingSDK/Source/Encrypt/TDSecretKey.h.meta b/Assets/HCMiniSdk/Third/ta/Plugins/iOS/ThinkingSDK/Source/Encrypt/TDSecretKey.h.meta new file mode 100644 index 00000000..66ed025b --- /dev/null +++ b/Assets/HCMiniSdk/Third/ta/Plugins/iOS/ThinkingSDK/Source/Encrypt/TDSecretKey.h.meta @@ -0,0 +1,33 @@ +fileFormatVersion: 2 +guid: ec629b9835a264c5d91241e2774be8d8 +PluginImporter: + externalObjects: {} + serializedVersion: 2 + iconMap: {} + executionOrder: {} + defineConstraints: [] + isPreloaded: 0 + isOverridable: 0 + isExplicitlyReferenced: 0 + validateReferences: 1 + platformData: + - first: + Any: + second: + enabled: 0 + settings: {} + - first: + Editor: Editor + second: + enabled: 0 + settings: + DefaultValueInitialized: true + - first: + iPhone: iOS + second: + enabled: 1 + settings: + AddToEmbeddedBinaries: false + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/HCMiniSdk/Third/ta/Plugins/iOS/ThinkingSDK/Source/Encrypt/TDSecretKey.m b/Assets/HCMiniSdk/Third/ta/Plugins/iOS/ThinkingSDK/Source/Encrypt/TDSecretKey.m new file mode 100755 index 00000000..cf973610 --- /dev/null +++ b/Assets/HCMiniSdk/Third/ta/Plugins/iOS/ThinkingSDK/Source/Encrypt/TDSecretKey.m @@ -0,0 +1,80 @@ +// +// TDSecretKey.m +// ThinkingSDK +// +// Created by wwango on 2022/1/21. +// + +#import "TDSecretKey.h" + +@interface TDSecretKey () + +@property (nonatomic, assign) NSUInteger version; +@property (nonatomic, copy) NSString *publicKey; +@property (nonatomic, copy) NSString *symmetricEncryption; +@property (nonatomic, copy) NSString *asymmetricEncryption; + +@end + +@implementation TDSecretKey + + +- (instancetype)initWithVersion:(NSUInteger)version + publicKey:(NSString *)publicKey { + + return [[TDSecretKey alloc] initWithVersion:version + publicKey:publicKey + asymmetricEncryption:@"RSA" + symmetricEncryption:@"AES"]; +} + +- (instancetype)initWithVersion:(NSUInteger)version + publicKey:(NSString *)publicKey + asymmetricEncryption:(NSString *)asymmetricEncryption + symmetricEncryption:(NSString *)symmetricEncryption { + self = [super init]; + if (self) { + self.version = version; + self.publicKey = publicKey; + self.asymmetricEncryption = asymmetricEncryption; + self.symmetricEncryption = symmetricEncryption; + } + return self; +} + +- (void)encodeWithCoder:(NSCoder *)coder { + [coder encodeInteger:self.version forKey:@"version"]; + [coder encodeObject:self.publicKey forKey:@"publicKey"]; + [coder encodeObject:self.symmetricEncryption forKey:@"symmetricEncrypt"]; + [coder encodeObject:self.asymmetricEncryption forKey:@"asymmetricEncrypt"]; +} + +- (instancetype)initWithCoder:(NSCoder *)coder { + self = [super init]; + if (self) { + self.version = [coder decodeIntegerForKey:@"version"]; + self.publicKey = [coder decodeObjectForKey:@"publicKey"]; + self.symmetricEncryption = [coder decodeObjectForKey:@"symmetricEncrypt"]; + self.asymmetricEncryption = [coder decodeObjectForKey:@"asymmetricEncrypt"]; + } + return self; +} + +- (BOOL)isValid { + if (self.publicKey.length && self.symmetricEncryption.length && self.asymmetricEncryption.length) { + return YES; + } + return NO; +} + +- (id)copyWithZone:(NSZone *)zone { + TDSecretKey *secretKey = [[[self class] allocWithZone:zone] init]; + secretKey.version = self.version; + secretKey.publicKey = [self.publicKey copy]; + secretKey.symmetricEncryption = [self.symmetricEncryption copy]; + secretKey.asymmetricEncryption = [self.asymmetricEncryption copy]; + return secretKey; +} + + +@end diff --git a/Assets/HCMiniSdk/Third/ta/Plugins/iOS/ThinkingSDK/Source/Encrypt/TDSecretKey.m.meta b/Assets/HCMiniSdk/Third/ta/Plugins/iOS/ThinkingSDK/Source/Encrypt/TDSecretKey.m.meta new file mode 100644 index 00000000..1e658b52 --- /dev/null +++ b/Assets/HCMiniSdk/Third/ta/Plugins/iOS/ThinkingSDK/Source/Encrypt/TDSecretKey.m.meta @@ -0,0 +1,33 @@ +fileFormatVersion: 2 +guid: 03c8b384def5542ae8bd608d4b3968ed +PluginImporter: + externalObjects: {} + serializedVersion: 2 + iconMap: {} + executionOrder: {} + defineConstraints: [] + isPreloaded: 0 + isOverridable: 0 + isExplicitlyReferenced: 0 + validateReferences: 1 + platformData: + - first: + Any: + second: + enabled: 0 + settings: {} + - first: + Editor: Editor + second: + enabled: 0 + settings: + DefaultValueInitialized: true + - first: + iPhone: iOS + second: + enabled: 1 + settings: + AddToEmbeddedBinaries: false + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/HCMiniSdk/Third/ta/Plugins/iOS/ThinkingSDK/Source/Encrypt/plugin.meta b/Assets/HCMiniSdk/Third/ta/Plugins/iOS/ThinkingSDK/Source/Encrypt/plugin.meta new file mode 100644 index 00000000..524faa63 --- /dev/null +++ b/Assets/HCMiniSdk/Third/ta/Plugins/iOS/ThinkingSDK/Source/Encrypt/plugin.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: a51f5c933df844bfaa6e322b24b3ed9e +folderAsset: yes +DefaultImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/HCMiniSdk/Third/ta/Plugins/iOS/ThinkingSDK/Source/Encrypt/plugin/TDAESEncryptor.h b/Assets/HCMiniSdk/Third/ta/Plugins/iOS/ThinkingSDK/Source/Encrypt/plugin/TDAESEncryptor.h new file mode 100755 index 00000000..df597898 --- /dev/null +++ b/Assets/HCMiniSdk/Third/ta/Plugins/iOS/ThinkingSDK/Source/Encrypt/plugin/TDAESEncryptor.h @@ -0,0 +1,19 @@ +// +// TDAESEncryptor.h +// ThinkingSDK +// +// Created by wwango on 2022/1/21. +// + +#import +#import "TDEncryptAlgorithm.h" + +NS_ASSUME_NONNULL_BEGIN + +@interface TDAESEncryptor : NSObject + +@property (nonatomic, copy, readonly) NSData *key; + +@end + +NS_ASSUME_NONNULL_END diff --git a/Assets/HCMiniSdk/Third/ta/Plugins/iOS/ThinkingSDK/Source/Encrypt/plugin/TDAESEncryptor.h.meta b/Assets/HCMiniSdk/Third/ta/Plugins/iOS/ThinkingSDK/Source/Encrypt/plugin/TDAESEncryptor.h.meta new file mode 100644 index 00000000..d531101e --- /dev/null +++ b/Assets/HCMiniSdk/Third/ta/Plugins/iOS/ThinkingSDK/Source/Encrypt/plugin/TDAESEncryptor.h.meta @@ -0,0 +1,33 @@ +fileFormatVersion: 2 +guid: 9d1974cff31e245d4a80d7890c19ca79 +PluginImporter: + externalObjects: {} + serializedVersion: 2 + iconMap: {} + executionOrder: {} + defineConstraints: [] + isPreloaded: 0 + isOverridable: 0 + isExplicitlyReferenced: 0 + validateReferences: 1 + platformData: + - first: + Any: + second: + enabled: 0 + settings: {} + - first: + Editor: Editor + second: + enabled: 0 + settings: + DefaultValueInitialized: true + - first: + iPhone: iOS + second: + enabled: 1 + settings: + AddToEmbeddedBinaries: false + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/HCMiniSdk/Third/ta/Plugins/iOS/ThinkingSDK/Source/Encrypt/plugin/TDAESEncryptor.m b/Assets/HCMiniSdk/Third/ta/Plugins/iOS/ThinkingSDK/Source/Encrypt/plugin/TDAESEncryptor.m new file mode 100755 index 00000000..634214a3 --- /dev/null +++ b/Assets/HCMiniSdk/Third/ta/Plugins/iOS/ThinkingSDK/Source/Encrypt/plugin/TDAESEncryptor.m @@ -0,0 +1,85 @@ +// +// TDAESEncryptor.m +// ThinkingSDK +// +// Created by wwango on 2022/1/21. +// + +#import "TDAESEncryptor.h" +#import +#import "TDLogging.h" + +@interface TDAESEncryptor () + +@property (nonatomic, copy, readwrite) NSData *key; + +@end + +@implementation TDAESEncryptor + + +- (NSData *)key { + if (!_key) { + NSUInteger length = 16; + NSString *letters = @"abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789"; + NSMutableString *randomString = [NSMutableString stringWithCapacity:length]; + for (NSUInteger i = 0; i < length; i++) { + [randomString appendFormat: @"%C", [letters characterAtIndex:arc4random_uniform((uint32_t)[letters length])]]; + } + _key = [randomString dataUsingEncoding:NSUTF8StringEncoding]; + } + return _key; +} + + +- (NSString *)algorithm { + return @"AES"; +} + + +- (nullable NSString *)encryptData:(NSData *)obj { + if (!obj) { + return nil; + } + + if (!self.key) { + return nil; + } + + NSData *data = obj; + NSUInteger dataLength = [data length]; + size_t bufferSize = dataLength + kCCBlockSizeAES128; + void *buffer = malloc(bufferSize); + + size_t numBytesEncrypted = 0; + CCCryptorStatus cryptStatus = CCCrypt(kCCEncrypt, + kCCAlgorithmAES128, + kCCOptionPKCS7Padding | kCCOptionECBMode, + [self.key bytes], + kCCBlockSizeAES128, + nil, + [data bytes], + dataLength, + buffer, + bufferSize, + &numBytesEncrypted); + if (cryptStatus == kCCSuccess) { + + NSData *encryptData = [NSData dataWithBytes:buffer length:numBytesEncrypted]; + NSMutableData *ivEncryptData = [NSMutableData data]; + [ivEncryptData appendData:encryptData]; + + free(buffer); + + NSData *base64EncodeData = [ivEncryptData base64EncodedDataWithOptions:NSDataBase64EncodingEndLineWithCarriageReturn]; + NSString *encryptString = [[NSString alloc] initWithData:base64EncodeData encoding:NSUTF8StringEncoding]; + return encryptString; + } else { + free(buffer); + } + return nil; +} + + + +@end diff --git a/Assets/HCMiniSdk/Third/ta/Plugins/iOS/ThinkingSDK/Source/Encrypt/plugin/TDAESEncryptor.m.meta b/Assets/HCMiniSdk/Third/ta/Plugins/iOS/ThinkingSDK/Source/Encrypt/plugin/TDAESEncryptor.m.meta new file mode 100644 index 00000000..9057c28f --- /dev/null +++ b/Assets/HCMiniSdk/Third/ta/Plugins/iOS/ThinkingSDK/Source/Encrypt/plugin/TDAESEncryptor.m.meta @@ -0,0 +1,33 @@ +fileFormatVersion: 2 +guid: 3356f39043a754358aac9d671c6355d0 +PluginImporter: + externalObjects: {} + serializedVersion: 2 + iconMap: {} + executionOrder: {} + defineConstraints: [] + isPreloaded: 0 + isOverridable: 0 + isExplicitlyReferenced: 0 + validateReferences: 1 + platformData: + - first: + Any: + second: + enabled: 0 + settings: {} + - first: + Editor: Editor + second: + enabled: 0 + settings: + DefaultValueInitialized: true + - first: + iPhone: iOS + second: + enabled: 1 + settings: + AddToEmbeddedBinaries: false + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/HCMiniSdk/Third/ta/Plugins/iOS/ThinkingSDK/Source/Encrypt/plugin/TDRSAEncryptor.h b/Assets/HCMiniSdk/Third/ta/Plugins/iOS/ThinkingSDK/Source/Encrypt/plugin/TDRSAEncryptor.h new file mode 100755 index 00000000..ec1bfe86 --- /dev/null +++ b/Assets/HCMiniSdk/Third/ta/Plugins/iOS/ThinkingSDK/Source/Encrypt/plugin/TDRSAEncryptor.h @@ -0,0 +1,19 @@ +// +// TDRSAEncryptor.h +// ThinkingSDK +// +// Created by wwango on 2022/1/21. +// + +#import +#import "TDEncryptAlgorithm.h" + +NS_ASSUME_NONNULL_BEGIN + +@interface TDRSAEncryptor : NSObject + +@property (nonatomic, copy) NSString *key; + +@end + +NS_ASSUME_NONNULL_END diff --git a/Assets/HCMiniSdk/Third/ta/Plugins/iOS/ThinkingSDK/Source/Encrypt/plugin/TDRSAEncryptor.h.meta b/Assets/HCMiniSdk/Third/ta/Plugins/iOS/ThinkingSDK/Source/Encrypt/plugin/TDRSAEncryptor.h.meta new file mode 100644 index 00000000..c1b532dd --- /dev/null +++ b/Assets/HCMiniSdk/Third/ta/Plugins/iOS/ThinkingSDK/Source/Encrypt/plugin/TDRSAEncryptor.h.meta @@ -0,0 +1,33 @@ +fileFormatVersion: 2 +guid: 31a27833643c74455bef05a2933ee2eb +PluginImporter: + externalObjects: {} + serializedVersion: 2 + iconMap: {} + executionOrder: {} + defineConstraints: [] + isPreloaded: 0 + isOverridable: 0 + isExplicitlyReferenced: 0 + validateReferences: 1 + platformData: + - first: + Any: + second: + enabled: 0 + settings: {} + - first: + Editor: Editor + second: + enabled: 0 + settings: + DefaultValueInitialized: true + - first: + iPhone: iOS + second: + enabled: 1 + settings: + AddToEmbeddedBinaries: false + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/HCMiniSdk/Third/ta/Plugins/iOS/ThinkingSDK/Source/Encrypt/plugin/TDRSAEncryptor.m b/Assets/HCMiniSdk/Third/ta/Plugins/iOS/ThinkingSDK/Source/Encrypt/plugin/TDRSAEncryptor.m new file mode 100755 index 00000000..031b1832 --- /dev/null +++ b/Assets/HCMiniSdk/Third/ta/Plugins/iOS/ThinkingSDK/Source/Encrypt/plugin/TDRSAEncryptor.m @@ -0,0 +1,180 @@ +// +// TDRSAEncryptor.m +// ThinkingSDK +// +// Created by wwango on 2022/1/21. +// + +#import "TDRSAEncryptor.h" + +@implementation TDRSAEncryptor + +- (void)setKey:(NSString *)key { + if (!key) { + return; + } + NSString *publicKeyCopy = [key copy]; + publicKeyCopy = [publicKeyCopy stringByReplacingOccurrencesOfString:@"\r" withString:@""]; + publicKeyCopy = [publicKeyCopy stringByReplacingOccurrencesOfString:@"\n" withString:@""]; + publicKeyCopy = [publicKeyCopy stringByReplacingOccurrencesOfString:@"\t" withString:@""]; + publicKeyCopy = [publicKeyCopy stringByReplacingOccurrencesOfString:@" " withString:@""]; + _key = publicKeyCopy; +} + +- (NSString *)algorithm { + return @"RSA"; +} + +- (NSString *)encryptData:(NSData *)data { + if (!data) { + return nil; + } + + NSString *asymmetricPublicKey = self.key; + if (!asymmetricPublicKey) { + return nil; + } + + SecKeyRef keyRef = [self addPublicKey:asymmetricPublicKey]; + if (!keyRef) { + return nil; + } + + const uint8_t *srcbuf = (const uint8_t *)[data bytes]; + size_t srclen = (size_t)data.length; + + size_t block_size = SecKeyGetBlockSize(keyRef) * sizeof(uint8_t); + void *outbuf = malloc(block_size); + size_t src_block_size = block_size - 11; + + NSMutableData *ret = [[NSMutableData alloc] init]; + for(int idx=0; idx src_block_size) { + data_len = src_block_size; + } + + size_t outlen = block_size; + OSStatus status = noErr; + + status = SecKeyEncrypt(keyRef, + kSecPaddingPKCS1, + srcbuf + idx, + data_len, + outbuf, + &outlen + ); + if (status != 0) { + ret = nil; + break; + }else{ + [ret appendBytes:outbuf length:outlen]; + } + } + free(outbuf); + CFRelease(keyRef); + + return [ret base64EncodedStringWithOptions:NSDataBase64EncodingEndLineWithCarriageReturn]; +} + +#pragma mark – Private Methods +- (SecKeyRef)addPublicKey:(NSString *)aymmetricPublicKey { + NSString *key = [aymmetricPublicKey copy]; + + NSData *data = [[NSData alloc] initWithBase64EncodedString:key options:NSDataBase64DecodingIgnoreUnknownCharacters]; + data = [self stripPublicKeyHeader:data]; + if (!data) { + return nil; + } + + //a tag to read/write keychain storage + NSString *tag = @"RSAUtil_PubKey"; + NSData *d_tag = [NSData dataWithBytes:[tag UTF8String] length:[tag length]]; + + // Delete any old lingering key with the same tag + NSMutableDictionary *publicKey = [[NSMutableDictionary alloc] init]; + [publicKey setObject:(__bridge id) kSecClassKey forKey:(__bridge id)kSecClass]; + [publicKey setObject:(__bridge id) kSecAttrKeyTypeRSA forKey:(__bridge id)kSecAttrKeyType]; + [publicKey setObject:d_tag forKey:(__bridge id)kSecAttrApplicationTag]; + SecItemDelete((__bridge CFDictionaryRef)publicKey); + + // Add persistent version of the key to system keychain + [publicKey setObject:data forKey:(__bridge id)kSecValueData]; + [publicKey setObject:(__bridge id) kSecAttrKeyClassPublic forKey:(__bridge id) + kSecAttrKeyClass]; + [publicKey setObject:[NSNumber numberWithBool:YES] forKey:(__bridge id) + kSecReturnPersistentRef]; + + CFTypeRef persistKey = nil; + OSStatus status = SecItemAdd((__bridge CFDictionaryRef)publicKey, &persistKey); + if (persistKey != nil) { + CFRelease(persistKey); + } + if ((status != noErr) && (status != errSecDuplicateItem)) { + return nil; + } + + [publicKey removeObjectForKey:(__bridge id)kSecValueData]; + [publicKey removeObjectForKey:(__bridge id)kSecReturnPersistentRef]; + [publicKey setObject:[NSNumber numberWithBool:YES] forKey:(__bridge id)kSecReturnRef]; + [publicKey setObject:(__bridge id) kSecAttrKeyTypeRSA forKey:(__bridge id)kSecAttrKeyType]; + + // Now fetch the SecKeyRef version of the key + SecKeyRef keyRef = nil; + status = SecItemCopyMatching((__bridge CFDictionaryRef)publicKey, (CFTypeRef *)&keyRef); + if (status != noErr) { + return nil; + } + return keyRef; +} + +- (NSData *)stripPublicKeyHeader:(NSData *)d_key { + // Skip ASN.1 public key header + if (d_key == nil) { + return(nil); + } + + unsigned long len = [d_key length]; + if (!len) { + return(nil); + } + + unsigned char *c_key = (unsigned char *)[d_key bytes]; + unsigned int idx = 0; + + if (c_key[idx++] != 0x30) { + return(nil); + } + + if (c_key[idx] > 0x80) { + idx += c_key[idx] - 0x80 + 1; + } else { + idx++; + } + + // PKCS #1 rsaEncryption szOID_RSA_RSA + static unsigned char seqiod[] = + { 0x30, 0x0d, 0x06, 0x09, 0x2a, 0x86, 0x48, 0x86, 0xf7, 0x0d, 0x01, 0x01, + 0x01, 0x05, 0x00 }; + if (memcmp(&c_key[idx], seqiod, 15)) { + return(nil); + } + idx += 15; + + if (c_key[idx++] != 0x03) { + return(nil); + } + + if (c_key[idx] > 0x80) { + idx += c_key[idx] - 0x80 + 1; + } else { + idx++; + } + if (c_key[idx++] != '\0') { + return(nil); + } + // Now make a new NSData from this buffer + return([NSData dataWithBytes:&c_key[idx] length:len - idx]); +} + +@end diff --git a/Assets/HCMiniSdk/Third/ta/Plugins/iOS/ThinkingSDK/Source/Encrypt/plugin/TDRSAEncryptor.m.meta b/Assets/HCMiniSdk/Third/ta/Plugins/iOS/ThinkingSDK/Source/Encrypt/plugin/TDRSAEncryptor.m.meta new file mode 100644 index 00000000..fec4d448 --- /dev/null +++ b/Assets/HCMiniSdk/Third/ta/Plugins/iOS/ThinkingSDK/Source/Encrypt/plugin/TDRSAEncryptor.m.meta @@ -0,0 +1,33 @@ +fileFormatVersion: 2 +guid: 9bee54e226cda4595abb93c0ebbe11df +PluginImporter: + externalObjects: {} + serializedVersion: 2 + iconMap: {} + executionOrder: {} + defineConstraints: [] + isPreloaded: 0 + isOverridable: 0 + isExplicitlyReferenced: 0 + validateReferences: 1 + platformData: + - first: + Any: + second: + enabled: 0 + settings: {} + - first: + Editor: Editor + second: + enabled: 0 + settings: + DefaultValueInitialized: true + - first: + iPhone: iOS + second: + enabled: 1 + settings: + AddToEmbeddedBinaries: false + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/HCMiniSdk/Third/ta/Plugins/iOS/ThinkingSDK/Source/Encrypt/plugin/TDRSAEncryptorPlugin.h b/Assets/HCMiniSdk/Third/ta/Plugins/iOS/ThinkingSDK/Source/Encrypt/plugin/TDRSAEncryptorPlugin.h new file mode 100755 index 00000000..0d88a720 --- /dev/null +++ b/Assets/HCMiniSdk/Third/ta/Plugins/iOS/ThinkingSDK/Source/Encrypt/plugin/TDRSAEncryptorPlugin.h @@ -0,0 +1,18 @@ +// +// TDRSAEncryptorPlugin.h +// ThinkingSDK +// +// Created by wwango on 2022/1/21. +// + +#import +#import "TDEncryptProtocol.h" +#import "TDRSAEncryptor.h" + +NS_ASSUME_NONNULL_BEGIN + +@interface TDRSAEncryptorPlugin : NSObject + +@end + +NS_ASSUME_NONNULL_END diff --git a/Assets/HCMiniSdk/Third/ta/Plugins/iOS/ThinkingSDK/Source/Encrypt/plugin/TDRSAEncryptorPlugin.h.meta b/Assets/HCMiniSdk/Third/ta/Plugins/iOS/ThinkingSDK/Source/Encrypt/plugin/TDRSAEncryptorPlugin.h.meta new file mode 100644 index 00000000..657c24fc --- /dev/null +++ b/Assets/HCMiniSdk/Third/ta/Plugins/iOS/ThinkingSDK/Source/Encrypt/plugin/TDRSAEncryptorPlugin.h.meta @@ -0,0 +1,33 @@ +fileFormatVersion: 2 +guid: a6d6b82caa9fc42fa81c28fee8c4ad79 +PluginImporter: + externalObjects: {} + serializedVersion: 2 + iconMap: {} + executionOrder: {} + defineConstraints: [] + isPreloaded: 0 + isOverridable: 0 + isExplicitlyReferenced: 0 + validateReferences: 1 + platformData: + - first: + Any: + second: + enabled: 0 + settings: {} + - first: + Editor: Editor + second: + enabled: 0 + settings: + DefaultValueInitialized: true + - first: + iPhone: iOS + second: + enabled: 1 + settings: + AddToEmbeddedBinaries: false + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/HCMiniSdk/Third/ta/Plugins/iOS/ThinkingSDK/Source/Encrypt/plugin/TDRSAEncryptorPlugin.m b/Assets/HCMiniSdk/Third/ta/Plugins/iOS/ThinkingSDK/Source/Encrypt/plugin/TDRSAEncryptorPlugin.m new file mode 100755 index 00000000..97f650e1 --- /dev/null +++ b/Assets/HCMiniSdk/Third/ta/Plugins/iOS/ThinkingSDK/Source/Encrypt/plugin/TDRSAEncryptorPlugin.m @@ -0,0 +1,53 @@ +// +// TDRSAEncryptorPlugin.m +// ThinkingSDK +// +// Created by wwango on 2022/1/21. +// + +#import "TDRSAEncryptorPlugin.h" +#import "TDAESEncryptor.h" +#import "TDRSAEncryptor.h" + +@interface TDRSAEncryptorPlugin () + +@property (nonatomic, strong) TDAESEncryptor *aesEncryptor; +@property (nonatomic, strong) TDRSAEncryptor *rsaEncryptor; + +@end + +@implementation TDRSAEncryptorPlugin + +- (instancetype)init { + self = [super init]; + if (self) { + _aesEncryptor = [[TDAESEncryptor alloc] init]; + _rsaEncryptor = [[TDRSAEncryptor alloc] init]; + } + return self; +} + + +- (NSString *)symmetricEncryptType { + return [_aesEncryptor algorithm]; +} + + +- (NSString *)asymmetricEncryptType { + return [_rsaEncryptor algorithm]; +} + + +- (NSString *)encryptEvent:(NSData *)event { + return [_aesEncryptor encryptData:event]; +} + + +- (NSString *)encryptSymmetricKeyWithPublicKey:(NSString *)publicKey { + if (![_rsaEncryptor.key isEqualToString:publicKey]) { + _rsaEncryptor.key = publicKey; + } + return [_rsaEncryptor encryptData:_aesEncryptor.key]; +} + +@end diff --git a/Assets/HCMiniSdk/Third/ta/Plugins/iOS/ThinkingSDK/Source/Encrypt/plugin/TDRSAEncryptorPlugin.m.meta b/Assets/HCMiniSdk/Third/ta/Plugins/iOS/ThinkingSDK/Source/Encrypt/plugin/TDRSAEncryptorPlugin.m.meta new file mode 100644 index 00000000..0e7eebb7 --- /dev/null +++ b/Assets/HCMiniSdk/Third/ta/Plugins/iOS/ThinkingSDK/Source/Encrypt/plugin/TDRSAEncryptorPlugin.m.meta @@ -0,0 +1,33 @@ +fileFormatVersion: 2 +guid: d4d26e5bdde0c4282bf6539cf6df7001 +PluginImporter: + externalObjects: {} + serializedVersion: 2 + iconMap: {} + executionOrder: {} + defineConstraints: [] + isPreloaded: 0 + isOverridable: 0 + isExplicitlyReferenced: 0 + validateReferences: 1 + platformData: + - first: + Any: + second: + enabled: 0 + settings: {} + - first: + Editor: Editor + second: + enabled: 0 + settings: + DefaultValueInitialized: true + - first: + iPhone: iOS + second: + enabled: 1 + settings: + AddToEmbeddedBinaries: false + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/HCMiniSdk/Third/ta/Plugins/iOS/ThinkingSDK/Source/EventTracker.meta b/Assets/HCMiniSdk/Third/ta/Plugins/iOS/ThinkingSDK/Source/EventTracker.meta new file mode 100644 index 00000000..379345f5 --- /dev/null +++ b/Assets/HCMiniSdk/Third/ta/Plugins/iOS/ThinkingSDK/Source/EventTracker.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: d39d3850ca6b34272af89f0692e73180 +folderAsset: yes +DefaultImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/HCMiniSdk/Third/ta/Plugins/iOS/ThinkingSDK/Source/EventTracker/EventModel.meta b/Assets/HCMiniSdk/Third/ta/Plugins/iOS/ThinkingSDK/Source/EventTracker/EventModel.meta new file mode 100644 index 00000000..d4770b90 --- /dev/null +++ b/Assets/HCMiniSdk/Third/ta/Plugins/iOS/ThinkingSDK/Source/EventTracker/EventModel.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: 9560727ea3c7d4990b4106ce6735a5ff +folderAsset: yes +DefaultImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/HCMiniSdk/Third/ta/Plugins/iOS/ThinkingSDK/Source/EventTracker/EventModel/TABaseEvent+H5.h b/Assets/HCMiniSdk/Third/ta/Plugins/iOS/ThinkingSDK/Source/EventTracker/EventModel/TABaseEvent+H5.h new file mode 100755 index 00000000..fc416b92 --- /dev/null +++ b/Assets/HCMiniSdk/Third/ta/Plugins/iOS/ThinkingSDK/Source/EventTracker/EventModel/TABaseEvent+H5.h @@ -0,0 +1,18 @@ +// +// TABaseEvent+H5.h +// ThinkingSDK +// +// Created by Yangxiongon 2022/6/19. +// + +#import "TABaseEvent.h" + +NS_ASSUME_NONNULL_BEGIN + +@interface TABaseEvent (H5) +@property (nonatomic, copy) NSString *h5TimeString; +@property (nonatomic, strong) NSNumber *h5ZoneOffSet; + +@end + +NS_ASSUME_NONNULL_END diff --git a/Assets/HCMiniSdk/Third/ta/Plugins/iOS/ThinkingSDK/Source/EventTracker/EventModel/TABaseEvent+H5.h.meta b/Assets/HCMiniSdk/Third/ta/Plugins/iOS/ThinkingSDK/Source/EventTracker/EventModel/TABaseEvent+H5.h.meta new file mode 100644 index 00000000..fc7fabe2 --- /dev/null +++ b/Assets/HCMiniSdk/Third/ta/Plugins/iOS/ThinkingSDK/Source/EventTracker/EventModel/TABaseEvent+H5.h.meta @@ -0,0 +1,33 @@ +fileFormatVersion: 2 +guid: b703a771624c64a67b7035b1f8b7aed2 +PluginImporter: + externalObjects: {} + serializedVersion: 2 + iconMap: {} + executionOrder: {} + defineConstraints: [] + isPreloaded: 0 + isOverridable: 0 + isExplicitlyReferenced: 0 + validateReferences: 1 + platformData: + - first: + Any: + second: + enabled: 0 + settings: {} + - first: + Editor: Editor + second: + enabled: 0 + settings: + DefaultValueInitialized: true + - first: + iPhone: iOS + second: + enabled: 1 + settings: + AddToEmbeddedBinaries: false + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/HCMiniSdk/Third/ta/Plugins/iOS/ThinkingSDK/Source/EventTracker/EventModel/TABaseEvent+H5.m b/Assets/HCMiniSdk/Third/ta/Plugins/iOS/ThinkingSDK/Source/EventTracker/EventModel/TABaseEvent+H5.m new file mode 100755 index 00000000..3df6fa99 --- /dev/null +++ b/Assets/HCMiniSdk/Third/ta/Plugins/iOS/ThinkingSDK/Source/EventTracker/EventModel/TABaseEvent+H5.m @@ -0,0 +1,32 @@ +// +// TABaseEvent+H5.m +// ThinkingSDK +// +// Created by Yangxiongon 2022/6/19. +// + +#import "TABaseEvent+H5.h" +#import + +static char TA_EVENT_H5_TIME_STRING; +static char TA_EVENT_H5_ZONE_OFF_SET; + +@implementation TABaseEvent (H5) + +- (NSString *)h5TimeString { + return objc_getAssociatedObject(self, &TA_EVENT_H5_TIME_STRING); +} + +- (void)setH5TimeString:(NSString *)h5TimeString { + objc_setAssociatedObject(self, &TA_EVENT_H5_TIME_STRING, h5TimeString, OBJC_ASSOCIATION_COPY_NONATOMIC); +} + +- (NSNumber *)h5ZoneOffSet { + return objc_getAssociatedObject(self, &TA_EVENT_H5_ZONE_OFF_SET); +} + +- (void)setH5ZoneOffSet:(NSNumber *)h5ZoneOffSet { + objc_setAssociatedObject(self, &TA_EVENT_H5_ZONE_OFF_SET, h5ZoneOffSet, OBJC_ASSOCIATION_RETAIN_NONATOMIC); +} + +@end diff --git a/Assets/HCMiniSdk/Third/ta/Plugins/iOS/ThinkingSDK/Source/EventTracker/EventModel/TABaseEvent+H5.m.meta b/Assets/HCMiniSdk/Third/ta/Plugins/iOS/ThinkingSDK/Source/EventTracker/EventModel/TABaseEvent+H5.m.meta new file mode 100644 index 00000000..484e332a --- /dev/null +++ b/Assets/HCMiniSdk/Third/ta/Plugins/iOS/ThinkingSDK/Source/EventTracker/EventModel/TABaseEvent+H5.m.meta @@ -0,0 +1,33 @@ +fileFormatVersion: 2 +guid: 4e6c4ca25228342e6af767ac2058ebdd +PluginImporter: + externalObjects: {} + serializedVersion: 2 + iconMap: {} + executionOrder: {} + defineConstraints: [] + isPreloaded: 0 + isOverridable: 0 + isExplicitlyReferenced: 0 + validateReferences: 1 + platformData: + - first: + Any: + second: + enabled: 0 + settings: {} + - first: + Editor: Editor + second: + enabled: 0 + settings: + DefaultValueInitialized: true + - first: + iPhone: iOS + second: + enabled: 1 + settings: + AddToEmbeddedBinaries: false + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/HCMiniSdk/Third/ta/Plugins/iOS/ThinkingSDK/Source/EventTracker/EventModel/TABaseEvent.h b/Assets/HCMiniSdk/Third/ta/Plugins/iOS/ThinkingSDK/Source/EventTracker/EventModel/TABaseEvent.h new file mode 100755 index 00000000..b890f238 --- /dev/null +++ b/Assets/HCMiniSdk/Third/ta/Plugins/iOS/ThinkingSDK/Source/EventTracker/EventModel/TABaseEvent.h @@ -0,0 +1,83 @@ +// +// TABaseEvent.h +// ThinkingSDK +// +// Created by Yangxiongon 2022/6/12. +// + +#import +#import "TAPropertyValidator.h" + +NS_ASSUME_NONNULL_BEGIN + +typedef NSString * kTAEventType; + +typedef NS_OPTIONS(NSUInteger, TAEventType) { + TAEventTypeNone = 0, + TAEventTypeTrack = 1 << 0, + TAEventTypeTrackFirst = 1 << 1, + TAEventTypeTrackUpdate = 1 << 2, + TAEventTypeTrackOverwrite = 1 << 3, + TAEventTypeUserSet = 1 << 4, + TAEventTypeUserUnset = 1 << 5, + TAEventTypeUserAdd = 1 << 6, + TAEventTypeUserDel = 1 << 7, + TAEventTypeUserSetOnce = 1 << 8, + TAEventTypeUserAppend = 1 << 9, + TAEventTypeUserUniqueAppend = 1 << 10, + TAEventTypeAll = 0xFFFFFFFF, +}; + +//extern kTAEventType const kTAEventTypeTrack; +//extern kTAEventType const kTAEventTypeTrackFirst; +//extern kTAEventType const kTAEventTypeTrackUpdate; +//extern kTAEventType const kTAEventTypeTrackOverwrite; +//extern kTAEventType const kTAEventTypeUserSet; +//extern kTAEventType const kTAEventTypeUserUnset; +//extern kTAEventType const kTAEventTypeUserAdd; +//extern kTAEventType const kTAEventTypeUserDel; +//extern kTAEventType const kTAEventTypeUserSetOnce; +//extern kTAEventType const kTAEventTypeUserAppend; +//extern kTAEventType const kTAEventTypeUserUniqueAppend; + +typedef NS_OPTIONS(NSInteger, TAEventTimeValueType) { + TAEventTimeValueTypeNone = 0, + TAEventTimeValueTypeTimeOnly = 1 << 0, + TAEventTimeValueTypeTimeAndZone = 1 << 1, +}; + +@interface TABaseEvent : NSObject +@property (nonatomic, assign) TAEventType eventType; +@property (nonatomic, copy) NSString *uuid; +@property (nonatomic, copy) NSString *accountId; +@property (nonatomic, copy) NSString *distinctId; +@property (nonatomic, strong) NSDate *time; +@property (nonatomic, strong) NSTimeZone *timeZone; +@property (nonatomic, strong, readonly) NSDateFormatter *timeFormatter; + +@property (nonatomic, assign) TAEventTimeValueType timeValueType; +@property (nonatomic, strong) NSMutableDictionary *properties; + +@property (nonatomic, assign) BOOL immediately; + +@property (atomic, assign, getter=isTrackPause) BOOL trackPause; + +@property (nonatomic, assign) BOOL isEnabled; + +@property (atomic, assign) BOOL isOptOut; + +- (instancetype)initWithType:(TAEventType)type; + +- (void)validateWithError:(NSError **)error; + +- (NSMutableDictionary *)jsonObject; + +- (NSMutableDictionary *)formatDateWithDict:(NSDictionary *)dict; + +- (NSString *)eventTypeString; + ++ (TAEventType)typeWithTypeString:(NSString *)typeString; + +@end + +NS_ASSUME_NONNULL_END diff --git a/Assets/HCMiniSdk/Third/ta/Plugins/iOS/ThinkingSDK/Source/EventTracker/EventModel/TABaseEvent.h.meta b/Assets/HCMiniSdk/Third/ta/Plugins/iOS/ThinkingSDK/Source/EventTracker/EventModel/TABaseEvent.h.meta new file mode 100644 index 00000000..ecdbe8d2 --- /dev/null +++ b/Assets/HCMiniSdk/Third/ta/Plugins/iOS/ThinkingSDK/Source/EventTracker/EventModel/TABaseEvent.h.meta @@ -0,0 +1,33 @@ +fileFormatVersion: 2 +guid: dafbc7ec396db41b3a73edf669a9f86f +PluginImporter: + externalObjects: {} + serializedVersion: 2 + iconMap: {} + executionOrder: {} + defineConstraints: [] + isPreloaded: 0 + isOverridable: 0 + isExplicitlyReferenced: 0 + validateReferences: 1 + platformData: + - first: + Any: + second: + enabled: 0 + settings: {} + - first: + Editor: Editor + second: + enabled: 0 + settings: + DefaultValueInitialized: true + - first: + iPhone: iOS + second: + enabled: 1 + settings: + AddToEmbeddedBinaries: false + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/HCMiniSdk/Third/ta/Plugins/iOS/ThinkingSDK/Source/EventTracker/EventModel/TABaseEvent.m b/Assets/HCMiniSdk/Third/ta/Plugins/iOS/ThinkingSDK/Source/EventTracker/EventModel/TABaseEvent.m new file mode 100755 index 00000000..fe00edba --- /dev/null +++ b/Assets/HCMiniSdk/Third/ta/Plugins/iOS/ThinkingSDK/Source/EventTracker/EventModel/TABaseEvent.m @@ -0,0 +1,215 @@ +// +// TABaseEvent.m +// ThinkingSDK +// +// Created by Yangxiongon 2022/6/12. +// + +#import "TABaseEvent.h" + +#if __has_include() +#import +#else +#import "TDLogging.h" +#endif + +#import "ThinkingAnalyticsSDKPrivate.h" + +kTAEventType const kTAEventTypeTrack = @"track"; +kTAEventType const kTAEventTypeTrackFirst = @"track_first"; +kTAEventType const kTAEventTypeTrackUpdate = @"track_update"; +kTAEventType const kTAEventTypeTrackOverwrite = @"track_overwrite"; +kTAEventType const kTAEventTypeUserSet = @"user_set"; +kTAEventType const kTAEventTypeUserUnset = @"user_unset"; +kTAEventType const kTAEventTypeUserAdd = @"user_add"; +kTAEventType const kTAEventTypeUserDel = @"user_del"; +kTAEventType const kTAEventTypeUserSetOnce = @"user_setOnce"; +kTAEventType const kTAEventTypeUserAppend = @"user_append"; +kTAEventType const kTAEventTypeUserUniqueAppend = @"user_uniq_append"; + +@interface TABaseEvent () +@property (nonatomic, strong) NSDateFormatter *timeFormatter; + +@end + +@implementation TABaseEvent + +- (instancetype)init +{ + self = [super init]; + if (self) { + + _time = [NSDate date]; + self.timeValueType = TAEventTimeValueTypeNone; + self.uuid = [NSUUID UUID].UUIDString; + } + return self; +} + +- (instancetype)initWithType:(TAEventType)type { + if (self = [self init]) { + self.eventType = type; + } + return self; +} + +- (void)validateWithError:(NSError *__autoreleasing _Nullable *)error { + +} + +- (NSMutableDictionary *)jsonObject { + NSMutableDictionary *dict = [NSMutableDictionary dictionary]; + dict[@"#time"] = self.time; + dict[@"#uuid"] = self.uuid; + dict[@"#type"] = [self eventTypeString]; + if (self.accountId) { + dict[@"#account_id"] = self.accountId; + } + if (self.distinctId) { + dict[@"#distinct_id"] = self.distinctId; + } + dict[@"properties"] = self.properties; + return dict; +} + +- (NSMutableDictionary *)formatDateWithDict:(NSDictionary *)dict { + if (dict == nil || ![dict isKindOfClass:NSDictionary.class]) { + return nil; + } + NSMutableDictionary *mutableDict = nil; + if ([dict isKindOfClass:NSMutableDictionary.class]) { + mutableDict = (NSMutableDictionary *)dict; + } else { + mutableDict = [dict mutableCopy]; + } + + NSArray *keys = dict.allKeys; + for (NSInteger i = 0; i < keys.count; i++) { + id value = dict[keys[i]]; + if ([value isKindOfClass:NSDate.class]) { + NSString *newValue = [self.timeFormatter stringFromDate:(NSDate *)value]; + mutableDict[keys[i]] = newValue; + } else if ([value isKindOfClass:NSDictionary.class]) { + NSDictionary *newValue = [self formatDateWithDict:value]; + mutableDict[keys[i]] = newValue; + } + } + return mutableDict; +} + +- (NSString *)eventTypeString { + switch (self.eventType) { + case TAEventTypeTrack: { + return TD_EVENT_TYPE_TRACK; + } break; + case TAEventTypeTrackFirst: { + + return TD_EVENT_TYPE_TRACK; + } break; + case TAEventTypeTrackUpdate: { + return TD_EVENT_TYPE_TRACK_UPDATE; + } break; + case TAEventTypeTrackOverwrite: { + return TD_EVENT_TYPE_TRACK_OVERWRITE; + } break; + case TAEventTypeUserAdd: { + return TD_EVENT_TYPE_USER_ADD; + } break; + case TAEventTypeUserSet: { + return TD_EVENT_TYPE_USER_SET; + } break; + case TAEventTypeUserUnset: { + return TD_EVENT_TYPE_USER_UNSET; + } break; + case TAEventTypeUserAppend: { + return TD_EVENT_TYPE_USER_APPEND; + } break; + case TAEventTypeUserUniqueAppend: { + return TD_EVENT_TYPE_USER_UNIQ_APPEND; + } break; + case TAEventTypeUserDel: { + return TD_EVENT_TYPE_USER_DEL; + } break; + case TAEventTypeUserSetOnce: { + return TD_EVENT_TYPE_USER_SETONCE; + } break; + + default: + return nil; + break; + } +} + ++ (TAEventType)typeWithTypeString:(NSString *)typeString { + if ([typeString isEqualToString:TD_EVENT_TYPE_TRACK]) { + return TAEventTypeTrack; + } else if ([typeString isEqualToString:TD_EVENT_TYPE_TRACK_FIRST]) { + return TAEventTypeTrack; + } else if ([typeString isEqualToString:TD_EVENT_TYPE_TRACK_UPDATE]) { + return TAEventTypeTrackUpdate; + } else if ([typeString isEqualToString:TD_EVENT_TYPE_TRACK_OVERWRITE]) { + return TAEventTypeTrackOverwrite; + } else if ([typeString isEqualToString:TD_EVENT_TYPE_USER_ADD]) { + return TAEventTypeUserAdd; + } else if ([typeString isEqualToString:TD_EVENT_TYPE_USER_DEL]) { + return TAEventTypeUserDel; + } else if ([typeString isEqualToString:TD_EVENT_TYPE_USER_SET]) { + return TAEventTypeUserSet; + } else if ([typeString isEqualToString:TD_EVENT_TYPE_USER_UNSET]) { + return TAEventTypeUserUnset; + } else if ([typeString isEqualToString:TD_EVENT_TYPE_USER_APPEND]) { + return TAEventTypeUserAppend; + } else if ([typeString isEqualToString:TD_EVENT_TYPE_USER_UNIQ_APPEND]) { + return TAEventTypeUserUniqueAppend; + } else if ([typeString isEqualToString:TD_EVENT_TYPE_USER_SETONCE]) { + return TAEventTypeUserSetOnce; + } + return TAEventTypeNone; +} + +//MARK: - Private + +//MARK: - Delegate + +- (void)ta_validateKey:(NSString *)key value:(id)value error:(NSError *__autoreleasing _Nullable *)error { + +} + +//MARK: - Setter & Getter + +- (NSMutableDictionary *)properties { + if (!_properties) { + _properties = [NSMutableDictionary dictionary]; + } + return _properties; +} + +- (void)setTimeZone:(NSTimeZone *)timeZone { + _timeZone = timeZone; + + + self.timeFormatter.timeZone = timeZone ?: [NSTimeZone localTimeZone]; +} + +- (NSDateFormatter *)timeFormatter { + if (!_timeFormatter) { + _timeFormatter = [[NSDateFormatter alloc] init]; + _timeFormatter.dateFormat = kDefaultTimeFormat; + _timeFormatter.locale = [[NSLocale alloc] initWithLocaleIdentifier:@"en_US"]; + _timeFormatter.calendar = [[NSCalendar alloc] initWithCalendarIdentifier:NSCalendarIdentifierGregorian]; + + _timeFormatter.timeZone = [NSTimeZone localTimeZone]; + } + return _timeFormatter; +} + +- (void)setTime:(NSDate *)time { + + if (time) { + [self willChangeValueForKey:@"time"]; + _time = time; + [self didChangeValueForKey:@"time"]; + } +} + +@end diff --git a/Assets/HCMiniSdk/Third/ta/Plugins/iOS/ThinkingSDK/Source/EventTracker/EventModel/TABaseEvent.m.meta b/Assets/HCMiniSdk/Third/ta/Plugins/iOS/ThinkingSDK/Source/EventTracker/EventModel/TABaseEvent.m.meta new file mode 100644 index 00000000..48804bab --- /dev/null +++ b/Assets/HCMiniSdk/Third/ta/Plugins/iOS/ThinkingSDK/Source/EventTracker/EventModel/TABaseEvent.m.meta @@ -0,0 +1,33 @@ +fileFormatVersion: 2 +guid: c335bc2e01f9b4ea39724ccaa3b88850 +PluginImporter: + externalObjects: {} + serializedVersion: 2 + iconMap: {} + executionOrder: {} + defineConstraints: [] + isPreloaded: 0 + isOverridable: 0 + isExplicitlyReferenced: 0 + validateReferences: 1 + platformData: + - first: + Any: + second: + enabled: 0 + settings: {} + - first: + Editor: Editor + second: + enabled: 0 + settings: + DefaultValueInitialized: true + - first: + iPhone: iOS + second: + enabled: 1 + settings: + AddToEmbeddedBinaries: false + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/HCMiniSdk/Third/ta/Plugins/iOS/ThinkingSDK/Source/EventTracker/EventModel/TATrackEvent.h b/Assets/HCMiniSdk/Third/ta/Plugins/iOS/ThinkingSDK/Source/EventTracker/EventModel/TATrackEvent.h new file mode 100755 index 00000000..63b39102 --- /dev/null +++ b/Assets/HCMiniSdk/Third/ta/Plugins/iOS/ThinkingSDK/Source/EventTracker/EventModel/TATrackEvent.h @@ -0,0 +1,34 @@ +// +// TATrackEvent.h +// ThinkingSDK +// +// Created by Yangxiongon 2022/6/12. +// + +#import "TABaseEvent.h" + +NS_ASSUME_NONNULL_BEGIN + + +@interface TATrackEvent : TABaseEvent +/// eventName +@property (nonatomic, copy) NSString *eventName; +/// Cumulative front activity time +@property (nonatomic, assign) NSTimeInterval foregroundDuration; +/// Cumulative background time +@property (nonatomic, assign) NSTimeInterval backgroundDuration; + +/// Record the boot time node when the event occurred. Used to count the cumulative time of events +@property (nonatomic, assign) NSTimeInterval systemUpTime; + +/// Used to record dynamic public properties, dynamic public properties need to be obtained in the current thread where the event occurs +@property (nonatomic, strong) NSDictionary *dynamicSuperProperties; + +/// Used to document static public properties +@property (nonatomic, strong) NSDictionary *superProperties; + +- (instancetype)initWithName:(NSString *)eventName; + +@end + +NS_ASSUME_NONNULL_END diff --git a/Assets/HCMiniSdk/Third/ta/Plugins/iOS/ThinkingSDK/Source/EventTracker/EventModel/TATrackEvent.h.meta b/Assets/HCMiniSdk/Third/ta/Plugins/iOS/ThinkingSDK/Source/EventTracker/EventModel/TATrackEvent.h.meta new file mode 100644 index 00000000..f6fd7bb3 --- /dev/null +++ b/Assets/HCMiniSdk/Third/ta/Plugins/iOS/ThinkingSDK/Source/EventTracker/EventModel/TATrackEvent.h.meta @@ -0,0 +1,33 @@ +fileFormatVersion: 2 +guid: 7b6de39cfc2e64bcf8026108733ff0ac +PluginImporter: + externalObjects: {} + serializedVersion: 2 + iconMap: {} + executionOrder: {} + defineConstraints: [] + isPreloaded: 0 + isOverridable: 0 + isExplicitlyReferenced: 0 + validateReferences: 1 + platformData: + - first: + Any: + second: + enabled: 0 + settings: {} + - first: + Editor: Editor + second: + enabled: 0 + settings: + DefaultValueInitialized: true + - first: + iPhone: iOS + second: + enabled: 1 + settings: + AddToEmbeddedBinaries: false + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/HCMiniSdk/Third/ta/Plugins/iOS/ThinkingSDK/Source/EventTracker/EventModel/TATrackEvent.m b/Assets/HCMiniSdk/Third/ta/Plugins/iOS/ThinkingSDK/Source/EventTracker/EventModel/TATrackEvent.m new file mode 100755 index 00000000..c905bcd8 --- /dev/null +++ b/Assets/HCMiniSdk/Third/ta/Plugins/iOS/ThinkingSDK/Source/EventTracker/EventModel/TATrackEvent.m @@ -0,0 +1,75 @@ +// +// TATrackEvent.m +// ThinkingSDK +// +// Created by Yangxiongon 2022/6/12. +// + +#import "TATrackEvent.h" +#import "TDPresetProperties.h" +#import "TDPresetProperties+TDDisProperties.h" +#import "NSDate+TAFormat.h" +#import "TDDeviceInfo.h" + +@implementation TATrackEvent + +- (instancetype)initWithName:(NSString *)eventName { + if (self = [self init]) { + self.eventName = eventName; + } + return self; +} + +- (instancetype)init +{ + self = [super init]; + if (self) { + self.eventType = TAEventTypeTrack; + self.systemUpTime = [TDDeviceInfo uptime]; + } + return self; +} + +- (void)validateWithError:(NSError *__autoreleasing _Nullable *)error { + + [TAPropertyValidator validateEventOrPropertyName:self.eventName withError:error]; +} + +- (NSMutableDictionary *)jsonObject { + NSMutableDictionary *dict = [super jsonObject]; + + dict[@"#event_name"] = self.eventName; + + if (![TDPresetProperties disableDuration]) { + if (self.foregroundDuration > 0) { + self.properties[@"#duration"] = @([NSString stringWithFormat:@"%.3f", self.foregroundDuration].floatValue); + } + } + + if (![TDPresetProperties disableBackgroundDuration]) { + if (self.backgroundDuration > 0) { + self.properties[@"#background_duration"] = @([NSString stringWithFormat:@"%.3f", self.backgroundDuration].floatValue); + } + } + + if (self.timeValueType != TAEventTimeValueTypeTimeOnly) { + if (![TDPresetProperties disableZoneOffset]) { + self.properties[@"#zone_offset"] = @([self timeZoneOffset]); + } + } + + return dict; +} + +- (double)timeZoneOffset { + NSTimeZone *tz = self.timeZone ?: [NSTimeZone localTimeZone]; + return [[NSDate date] ta_timeZoneOffset:tz]; +} + +//MARK: - Delegate + +- (void)ta_validateKey:(NSString *)key value:(id)value error:(NSError *__autoreleasing _Nullable *)error { + [TAPropertyValidator validateNormalTrackEventPropertyKey:key value:value error:error]; +} + +@end diff --git a/Assets/HCMiniSdk/Third/ta/Plugins/iOS/ThinkingSDK/Source/EventTracker/EventModel/TATrackEvent.m.meta b/Assets/HCMiniSdk/Third/ta/Plugins/iOS/ThinkingSDK/Source/EventTracker/EventModel/TATrackEvent.m.meta new file mode 100644 index 00000000..ff304a4a --- /dev/null +++ b/Assets/HCMiniSdk/Third/ta/Plugins/iOS/ThinkingSDK/Source/EventTracker/EventModel/TATrackEvent.m.meta @@ -0,0 +1,33 @@ +fileFormatVersion: 2 +guid: e6f7dc16b17424e37ad703bfb58ae073 +PluginImporter: + externalObjects: {} + serializedVersion: 2 + iconMap: {} + executionOrder: {} + defineConstraints: [] + isPreloaded: 0 + isOverridable: 0 + isExplicitlyReferenced: 0 + validateReferences: 1 + platformData: + - first: + Any: + second: + enabled: 0 + settings: {} + - first: + Editor: Editor + second: + enabled: 0 + settings: + DefaultValueInitialized: true + - first: + iPhone: iOS + second: + enabled: 1 + settings: + AddToEmbeddedBinaries: false + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/HCMiniSdk/Third/ta/Plugins/iOS/ThinkingSDK/Source/EventTracker/EventModel/TATrackFirstEvent.h b/Assets/HCMiniSdk/Third/ta/Plugins/iOS/ThinkingSDK/Source/EventTracker/EventModel/TATrackFirstEvent.h new file mode 100755 index 00000000..81bfb997 --- /dev/null +++ b/Assets/HCMiniSdk/Third/ta/Plugins/iOS/ThinkingSDK/Source/EventTracker/EventModel/TATrackFirstEvent.h @@ -0,0 +1,18 @@ +// +// TATrackFirstEvent.h +// ThinkingSDK +// +// Created by Yangxiongon 2022/6/12. +// + +#import "TATrackEvent.h" + +NS_ASSUME_NONNULL_BEGIN + +@interface TATrackFirstEvent : TATrackEvent + +@property (nonatomic, copy) NSString *firstCheckId; + +@end + +NS_ASSUME_NONNULL_END diff --git a/Assets/HCMiniSdk/Third/ta/Plugins/iOS/ThinkingSDK/Source/EventTracker/EventModel/TATrackFirstEvent.h.meta b/Assets/HCMiniSdk/Third/ta/Plugins/iOS/ThinkingSDK/Source/EventTracker/EventModel/TATrackFirstEvent.h.meta new file mode 100644 index 00000000..5b098646 --- /dev/null +++ b/Assets/HCMiniSdk/Third/ta/Plugins/iOS/ThinkingSDK/Source/EventTracker/EventModel/TATrackFirstEvent.h.meta @@ -0,0 +1,33 @@ +fileFormatVersion: 2 +guid: 015447ee21ce64f118f24645df110015 +PluginImporter: + externalObjects: {} + serializedVersion: 2 + iconMap: {} + executionOrder: {} + defineConstraints: [] + isPreloaded: 0 + isOverridable: 0 + isExplicitlyReferenced: 0 + validateReferences: 1 + platformData: + - first: + Any: + second: + enabled: 0 + settings: {} + - first: + Editor: Editor + second: + enabled: 0 + settings: + DefaultValueInitialized: true + - first: + iPhone: iOS + second: + enabled: 1 + settings: + AddToEmbeddedBinaries: false + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/HCMiniSdk/Third/ta/Plugins/iOS/ThinkingSDK/Source/EventTracker/EventModel/TATrackFirstEvent.m b/Assets/HCMiniSdk/Third/ta/Plugins/iOS/ThinkingSDK/Source/EventTracker/EventModel/TATrackFirstEvent.m new file mode 100755 index 00000000..c226cdf1 --- /dev/null +++ b/Assets/HCMiniSdk/Third/ta/Plugins/iOS/ThinkingSDK/Source/EventTracker/EventModel/TATrackFirstEvent.m @@ -0,0 +1,42 @@ +// +// TATrackFirstEvent.m +// ThinkingSDK +// +// Created by Yangxiongon 2022/6/12. +// + +#import "TATrackFirstEvent.h" +#import "TDDeviceInfo.h" + +@implementation TATrackFirstEvent + +- (instancetype)init +{ + self = [super init]; + if (self) { + self.eventType = TAEventTypeTrackFirst; + } + return self; +} + +- (void)validateWithError:(NSError *__autoreleasing _Nullable *)error { + [super validateWithError:error]; + if (*error) { + return; + } + if (self.firstCheckId.length <= 0) { + NSString *errorMsg = @"property 'firstCheckId' cannot be empty which in FirstEvent"; + *error = TAPropertyError(100010, errorMsg); + return; + } +} + +- (NSMutableDictionary *)jsonObject { + NSMutableDictionary *dict = [super jsonObject]; + + dict[@"#first_check_id"] = self.firstCheckId ?: [TDDeviceInfo sharedManager].deviceId; + + return dict; +} + +@end diff --git a/Assets/HCMiniSdk/Third/ta/Plugins/iOS/ThinkingSDK/Source/EventTracker/EventModel/TATrackFirstEvent.m.meta b/Assets/HCMiniSdk/Third/ta/Plugins/iOS/ThinkingSDK/Source/EventTracker/EventModel/TATrackFirstEvent.m.meta new file mode 100644 index 00000000..baa17657 --- /dev/null +++ b/Assets/HCMiniSdk/Third/ta/Plugins/iOS/ThinkingSDK/Source/EventTracker/EventModel/TATrackFirstEvent.m.meta @@ -0,0 +1,33 @@ +fileFormatVersion: 2 +guid: e2c34e98bd3304dbbb3d5a0c7369ae11 +PluginImporter: + externalObjects: {} + serializedVersion: 2 + iconMap: {} + executionOrder: {} + defineConstraints: [] + isPreloaded: 0 + isOverridable: 0 + isExplicitlyReferenced: 0 + validateReferences: 1 + platformData: + - first: + Any: + second: + enabled: 0 + settings: {} + - first: + Editor: Editor + second: + enabled: 0 + settings: + DefaultValueInitialized: true + - first: + iPhone: iOS + second: + enabled: 1 + settings: + AddToEmbeddedBinaries: false + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/HCMiniSdk/Third/ta/Plugins/iOS/ThinkingSDK/Source/EventTracker/EventModel/TATrackOverwriteEvent.h b/Assets/HCMiniSdk/Third/ta/Plugins/iOS/ThinkingSDK/Source/EventTracker/EventModel/TATrackOverwriteEvent.h new file mode 100755 index 00000000..69a23f5a --- /dev/null +++ b/Assets/HCMiniSdk/Third/ta/Plugins/iOS/ThinkingSDK/Source/EventTracker/EventModel/TATrackOverwriteEvent.h @@ -0,0 +1,18 @@ +// +// TATrackOverwriteEvent.h +// ThinkingSDK +// +// Created by Yangxiongon 2022/6/12. +// + +#import "TATrackEvent.h" + +NS_ASSUME_NONNULL_BEGIN + +@interface TATrackOverwriteEvent : TATrackEvent + +@property (nonatomic, copy) NSString *eventId; + +@end + +NS_ASSUME_NONNULL_END diff --git a/Assets/HCMiniSdk/Third/ta/Plugins/iOS/ThinkingSDK/Source/EventTracker/EventModel/TATrackOverwriteEvent.h.meta b/Assets/HCMiniSdk/Third/ta/Plugins/iOS/ThinkingSDK/Source/EventTracker/EventModel/TATrackOverwriteEvent.h.meta new file mode 100644 index 00000000..b4a06856 --- /dev/null +++ b/Assets/HCMiniSdk/Third/ta/Plugins/iOS/ThinkingSDK/Source/EventTracker/EventModel/TATrackOverwriteEvent.h.meta @@ -0,0 +1,33 @@ +fileFormatVersion: 2 +guid: 9f5e52356a1ca49a080eef868663086f +PluginImporter: + externalObjects: {} + serializedVersion: 2 + iconMap: {} + executionOrder: {} + defineConstraints: [] + isPreloaded: 0 + isOverridable: 0 + isExplicitlyReferenced: 0 + validateReferences: 1 + platformData: + - first: + Any: + second: + enabled: 0 + settings: {} + - first: + Editor: Editor + second: + enabled: 0 + settings: + DefaultValueInitialized: true + - first: + iPhone: iOS + second: + enabled: 1 + settings: + AddToEmbeddedBinaries: false + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/HCMiniSdk/Third/ta/Plugins/iOS/ThinkingSDK/Source/EventTracker/EventModel/TATrackOverwriteEvent.m b/Assets/HCMiniSdk/Third/ta/Plugins/iOS/ThinkingSDK/Source/EventTracker/EventModel/TATrackOverwriteEvent.m new file mode 100755 index 00000000..a9c740ef --- /dev/null +++ b/Assets/HCMiniSdk/Third/ta/Plugins/iOS/ThinkingSDK/Source/EventTracker/EventModel/TATrackOverwriteEvent.m @@ -0,0 +1,42 @@ +// +// TATrackOverwriteEvent.m +// ThinkingSDK +// +// Created by Yangxiongon 2022/6/12. +// + +#import "TATrackOverwriteEvent.h" + +@implementation TATrackOverwriteEvent + +- (instancetype)init +{ + self = [super init]; + if (self) { + self.eventType = TAEventTypeTrackOverwrite; + } + return self; +} + +- (NSMutableDictionary *)jsonObject { + NSMutableDictionary *dict = [super jsonObject]; + + dict[@"#event_id"] = self.eventId; + + return dict; +} + + +- (void)validateWithError:(NSError *__autoreleasing _Nullable *)error { + [super validateWithError:error]; + if (*error) { + return; + } + if (self.eventId.length <= 0) { + NSString *errorMsg = @"property 'eventId' cannot be empty which in OverwriteEvent"; + *error = TAPropertyError(100011, errorMsg); + return; + } +} + +@end diff --git a/Assets/HCMiniSdk/Third/ta/Plugins/iOS/ThinkingSDK/Source/EventTracker/EventModel/TATrackOverwriteEvent.m.meta b/Assets/HCMiniSdk/Third/ta/Plugins/iOS/ThinkingSDK/Source/EventTracker/EventModel/TATrackOverwriteEvent.m.meta new file mode 100644 index 00000000..3b35a90d --- /dev/null +++ b/Assets/HCMiniSdk/Third/ta/Plugins/iOS/ThinkingSDK/Source/EventTracker/EventModel/TATrackOverwriteEvent.m.meta @@ -0,0 +1,33 @@ +fileFormatVersion: 2 +guid: e81671f8651dc4e71815a39048dcd8b1 +PluginImporter: + externalObjects: {} + serializedVersion: 2 + iconMap: {} + executionOrder: {} + defineConstraints: [] + isPreloaded: 0 + isOverridable: 0 + isExplicitlyReferenced: 0 + validateReferences: 1 + platformData: + - first: + Any: + second: + enabled: 0 + settings: {} + - first: + Editor: Editor + second: + enabled: 0 + settings: + DefaultValueInitialized: true + - first: + iPhone: iOS + second: + enabled: 1 + settings: + AddToEmbeddedBinaries: false + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/HCMiniSdk/Third/ta/Plugins/iOS/ThinkingSDK/Source/EventTracker/EventModel/TATrackUpdateEvent.h b/Assets/HCMiniSdk/Third/ta/Plugins/iOS/ThinkingSDK/Source/EventTracker/EventModel/TATrackUpdateEvent.h new file mode 100755 index 00000000..845b3bb1 --- /dev/null +++ b/Assets/HCMiniSdk/Third/ta/Plugins/iOS/ThinkingSDK/Source/EventTracker/EventModel/TATrackUpdateEvent.h @@ -0,0 +1,18 @@ +// +// TATrackUpdateEvent.h +// ThinkingSDK +// +// Created by Yangxiongon 2022/6/12. +// + +#import "TATrackEvent.h" + +NS_ASSUME_NONNULL_BEGIN + +@interface TATrackUpdateEvent : TATrackEvent + +@property (nonatomic, copy) NSString *eventId; + +@end + +NS_ASSUME_NONNULL_END diff --git a/Assets/HCMiniSdk/Third/ta/Plugins/iOS/ThinkingSDK/Source/EventTracker/EventModel/TATrackUpdateEvent.h.meta b/Assets/HCMiniSdk/Third/ta/Plugins/iOS/ThinkingSDK/Source/EventTracker/EventModel/TATrackUpdateEvent.h.meta new file mode 100644 index 00000000..4cf858e0 --- /dev/null +++ b/Assets/HCMiniSdk/Third/ta/Plugins/iOS/ThinkingSDK/Source/EventTracker/EventModel/TATrackUpdateEvent.h.meta @@ -0,0 +1,33 @@ +fileFormatVersion: 2 +guid: 69254428783a34880b1af60f4eb3d872 +PluginImporter: + externalObjects: {} + serializedVersion: 2 + iconMap: {} + executionOrder: {} + defineConstraints: [] + isPreloaded: 0 + isOverridable: 0 + isExplicitlyReferenced: 0 + validateReferences: 1 + platformData: + - first: + Any: + second: + enabled: 0 + settings: {} + - first: + Editor: Editor + second: + enabled: 0 + settings: + DefaultValueInitialized: true + - first: + iPhone: iOS + second: + enabled: 1 + settings: + AddToEmbeddedBinaries: false + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/HCMiniSdk/Third/ta/Plugins/iOS/ThinkingSDK/Source/EventTracker/EventModel/TATrackUpdateEvent.m b/Assets/HCMiniSdk/Third/ta/Plugins/iOS/ThinkingSDK/Source/EventTracker/EventModel/TATrackUpdateEvent.m new file mode 100755 index 00000000..7bd99ae7 --- /dev/null +++ b/Assets/HCMiniSdk/Third/ta/Plugins/iOS/ThinkingSDK/Source/EventTracker/EventModel/TATrackUpdateEvent.m @@ -0,0 +1,42 @@ +// +// TATrackUpdateEvent.m +// ThinkingSDK +// +// Created by Yangxiongon 2022/6/12. +// + +#import "TATrackUpdateEvent.h" + +@implementation TATrackUpdateEvent + +- (instancetype)init +{ + self = [super init]; + if (self) { + self.eventType = TAEventTypeTrackUpdate; + } + return self; +} + +- (NSMutableDictionary *)jsonObject { + NSMutableDictionary *dict = [super jsonObject]; + + dict[@"#event_id"] = self.eventId; + + return dict; +} + + +- (void)validateWithError:(NSError *__autoreleasing _Nullable *)error { + [super validateWithError:error]; + if (*error) { + return; + } + if (self.eventId.length <= 0) { + NSString *errorMsg = @"property 'eventId' cannot be empty which in UpdateEvent"; + *error = TAPropertyError(100012, errorMsg); + return; + } +} + +@end diff --git a/Assets/HCMiniSdk/Third/ta/Plugins/iOS/ThinkingSDK/Source/EventTracker/EventModel/TATrackUpdateEvent.m.meta b/Assets/HCMiniSdk/Third/ta/Plugins/iOS/ThinkingSDK/Source/EventTracker/EventModel/TATrackUpdateEvent.m.meta new file mode 100644 index 00000000..65253705 --- /dev/null +++ b/Assets/HCMiniSdk/Third/ta/Plugins/iOS/ThinkingSDK/Source/EventTracker/EventModel/TATrackUpdateEvent.m.meta @@ -0,0 +1,33 @@ +fileFormatVersion: 2 +guid: e82a22bd9875a4dd3bb7347e682cfb2e +PluginImporter: + externalObjects: {} + serializedVersion: 2 + iconMap: {} + executionOrder: {} + defineConstraints: [] + isPreloaded: 0 + isOverridable: 0 + isExplicitlyReferenced: 0 + validateReferences: 1 + platformData: + - first: + Any: + second: + enabled: 0 + settings: {} + - first: + Editor: Editor + second: + enabled: 0 + settings: + DefaultValueInitialized: true + - first: + iPhone: iOS + second: + enabled: 1 + settings: + AddToEmbeddedBinaries: false + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/HCMiniSdk/Third/ta/Plugins/iOS/ThinkingSDK/Source/EventTracker/EventModel/TDEditableEventModel.h b/Assets/HCMiniSdk/Third/ta/Plugins/iOS/ThinkingSDK/Source/EventTracker/EventModel/TDEditableEventModel.h new file mode 100755 index 00000000..98a2f4ee --- /dev/null +++ b/Assets/HCMiniSdk/Third/ta/Plugins/iOS/ThinkingSDK/Source/EventTracker/EventModel/TDEditableEventModel.h @@ -0,0 +1,12 @@ + +#if __has_include() +#import +#else +#import "TDUpdateEventModel.h" +#endif + +#if __has_include() +#import +#else +#import "TDOverwriteEventModel.h" +#endif diff --git a/Assets/HCMiniSdk/Third/ta/Plugins/iOS/ThinkingSDK/Source/EventTracker/EventModel/TDEditableEventModel.h.meta b/Assets/HCMiniSdk/Third/ta/Plugins/iOS/ThinkingSDK/Source/EventTracker/EventModel/TDEditableEventModel.h.meta new file mode 100644 index 00000000..752db9cf --- /dev/null +++ b/Assets/HCMiniSdk/Third/ta/Plugins/iOS/ThinkingSDK/Source/EventTracker/EventModel/TDEditableEventModel.h.meta @@ -0,0 +1,33 @@ +fileFormatVersion: 2 +guid: fba4ca753c9594b94b225ba0619faecc +PluginImporter: + externalObjects: {} + serializedVersion: 2 + iconMap: {} + executionOrder: {} + defineConstraints: [] + isPreloaded: 0 + isOverridable: 0 + isExplicitlyReferenced: 0 + validateReferences: 1 + platformData: + - first: + Any: + second: + enabled: 0 + settings: {} + - first: + Editor: Editor + second: + enabled: 0 + settings: + DefaultValueInitialized: true + - first: + iPhone: iOS + second: + enabled: 1 + settings: + AddToEmbeddedBinaries: false + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/HCMiniSdk/Third/ta/Plugins/iOS/ThinkingSDK/Source/EventTracker/EventModel/TDEventModel.h b/Assets/HCMiniSdk/Third/ta/Plugins/iOS/ThinkingSDK/Source/EventTracker/EventModel/TDEventModel.h new file mode 100755 index 00000000..6a4403ab --- /dev/null +++ b/Assets/HCMiniSdk/Third/ta/Plugins/iOS/ThinkingSDK/Source/EventTracker/EventModel/TDEventModel.h @@ -0,0 +1,31 @@ +#import + +NS_ASSUME_NONNULL_BEGIN + +typedef NS_OPTIONS(NSInteger, TimeValueType) { + TDTimeValueTypeNone = 0, + TDTimeValueTypeTimeOnly = 1 << 0, + TDTimeValueTypeAll = 1 << 1, +}; + +typedef NSString *kEDEventTypeName; + +FOUNDATION_EXTERN kEDEventTypeName const TD_EVENT_TYPE_TRACK_FIRST; +FOUNDATION_EXTERN kEDEventTypeName const TD_EVENT_TYPE_TRACK_UPDATE; +FOUNDATION_EXTERN kEDEventTypeName const TD_EVENT_TYPE_TRACK_OVERWRITE; + +@interface TDEventModel : NSObject + +- (instancetype)init NS_UNAVAILABLE; ++ (instancetype)new NS_UNAVAILABLE; + +@property (nonatomic, copy, readonly) NSString *eventName; +@property (nonatomic, copy, readonly) kEDEventTypeName eventType; // Default is TD_EVENT_TYPE_TRACK + +@property (nonatomic, strong) NSDictionary *properties; + +- (void)configTime:(NSDate *)time timeZone:(NSTimeZone * _Nullable)timeZone; + +@end + +NS_ASSUME_NONNULL_END diff --git a/Assets/HCMiniSdk/Third/ta/Plugins/iOS/ThinkingSDK/Source/EventTracker/EventModel/TDEventModel.h.meta b/Assets/HCMiniSdk/Third/ta/Plugins/iOS/ThinkingSDK/Source/EventTracker/EventModel/TDEventModel.h.meta new file mode 100644 index 00000000..4cbaa8c2 --- /dev/null +++ b/Assets/HCMiniSdk/Third/ta/Plugins/iOS/ThinkingSDK/Source/EventTracker/EventModel/TDEventModel.h.meta @@ -0,0 +1,33 @@ +fileFormatVersion: 2 +guid: 7d7f726d9fabe4abe85bfba590a4d099 +PluginImporter: + externalObjects: {} + serializedVersion: 2 + iconMap: {} + executionOrder: {} + defineConstraints: [] + isPreloaded: 0 + isOverridable: 0 + isExplicitlyReferenced: 0 + validateReferences: 1 + platformData: + - first: + Any: + second: + enabled: 0 + settings: {} + - first: + Editor: Editor + second: + enabled: 0 + settings: + DefaultValueInitialized: true + - first: + iPhone: iOS + second: + enabled: 1 + settings: + AddToEmbeddedBinaries: false + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/HCMiniSdk/Third/ta/Plugins/iOS/ThinkingSDK/Source/EventTracker/EventModel/TDEventModel.m b/Assets/HCMiniSdk/Third/ta/Plugins/iOS/ThinkingSDK/Source/EventTracker/EventModel/TDEventModel.m new file mode 100755 index 00000000..c4c310eb --- /dev/null +++ b/Assets/HCMiniSdk/Third/ta/Plugins/iOS/ThinkingSDK/Source/EventTracker/EventModel/TDEventModel.m @@ -0,0 +1,72 @@ + +#import "TDEventModel.h" +#import "ThinkingAnalyticsSDKPrivate.h" + +kEDEventTypeName const TD_EVENT_TYPE_TRACK_FIRST = @"track_first"; +kEDEventTypeName const TD_EVENT_TYPE_TRACK_UPDATE = @"track_update"; +kEDEventTypeName const TD_EVENT_TYPE_TRACK_OVERWRITE = @"track_overwrite"; + +@interface TDEventModel () + +@property (nonatomic, copy) NSString *eventName; +@property (nonatomic, copy) kEDEventTypeName eventType; + +@end + +@implementation TDEventModel + +- (instancetype)initWithEventName:(NSString *)eventName { + return [self initWithEventName:eventName eventType:TD_EVENT_TYPE_TRACK]; +} + +- (instancetype)initWithEventName:(NSString *)eventName eventType:(kEDEventTypeName)eventType { + if (self = [[[TDEventModel class] alloc] init]) { + self.persist = YES; + self.eventName = eventName ?: @""; + self.eventType = eventType ?: @""; + if ([self.eventType isEqualToString:TD_EVENT_TYPE_TRACK_FIRST]) { + _extraID = [TDDeviceInfo sharedManager].deviceId ?: @""; + } + } + return self; +} + +#pragma mark - Public + +- (void)configTime:(NSDate *)time timeZone:(NSTimeZone *)timeZone { + if (!time || ![time isKindOfClass:[NSDate class]]) { + self.timeValueType = TDTimeValueTypeNone; + } else { + self.time = time; + self.timeZone = timeZone; + + NSDateFormatter *timeFormatter = [[NSDateFormatter alloc] init]; + timeFormatter.dateFormat = kDefaultTimeFormat; + timeFormatter.locale = [[NSLocale alloc] initWithLocaleIdentifier:@"en_US"]; + timeFormatter.calendar = [[NSCalendar alloc] initWithCalendarIdentifier:NSCalendarIdentifierGregorian]; + if (timeZone && [timeZone isKindOfClass:[NSTimeZone class]]) { + self.timeValueType = TDTimeValueTypeAll; + timeFormatter.timeZone = timeZone; + } else { + self.timeValueType = TDTimeValueTypeTimeOnly; + timeFormatter.timeZone = [NSTimeZone localTimeZone]; + } + self.timeString = [timeFormatter stringFromDate:time]; + } +} + +#pragma mark - Setter + +- (void)setExtraID:(NSString *)extraID { + if (extraID.length > 0) { + _extraID = extraID; + } else { + if ([self.eventType isEqualToString:TD_EVENT_TYPE_TRACK_FIRST]) { + TDLogError(@"Invalid firstCheckId. Use device Id"); + } else { + TDLogError(@"Invalid eventId"); + } + } +} + +@end diff --git a/Assets/HCMiniSdk/Third/ta/Plugins/iOS/ThinkingSDK/Source/EventTracker/EventModel/TDEventModel.m.meta b/Assets/HCMiniSdk/Third/ta/Plugins/iOS/ThinkingSDK/Source/EventTracker/EventModel/TDEventModel.m.meta new file mode 100644 index 00000000..9b892366 --- /dev/null +++ b/Assets/HCMiniSdk/Third/ta/Plugins/iOS/ThinkingSDK/Source/EventTracker/EventModel/TDEventModel.m.meta @@ -0,0 +1,33 @@ +fileFormatVersion: 2 +guid: 3de42dea3b4f54381b502e54cf5584a5 +PluginImporter: + externalObjects: {} + serializedVersion: 2 + iconMap: {} + executionOrder: {} + defineConstraints: [] + isPreloaded: 0 + isOverridable: 0 + isExplicitlyReferenced: 0 + validateReferences: 1 + platformData: + - first: + Any: + second: + enabled: 0 + settings: {} + - first: + Editor: Editor + second: + enabled: 0 + settings: + DefaultValueInitialized: true + - first: + iPhone: iOS + second: + enabled: 1 + settings: + AddToEmbeddedBinaries: false + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/HCMiniSdk/Third/ta/Plugins/iOS/ThinkingSDK/Source/EventTracker/EventModel/TDFirstEventModel.h b/Assets/HCMiniSdk/Third/ta/Plugins/iOS/ThinkingSDK/Source/EventTracker/EventModel/TDFirstEventModel.h new file mode 100755 index 00000000..a0d83a9f --- /dev/null +++ b/Assets/HCMiniSdk/Third/ta/Plugins/iOS/ThinkingSDK/Source/EventTracker/EventModel/TDFirstEventModel.h @@ -0,0 +1,19 @@ + +#if __has_include() +#import +#else +#import "TDEventModel.h" +#endif + + +NS_ASSUME_NONNULL_BEGIN + +@interface TDFirstEventModel : TDEventModel + +- (instancetype)initWithEventName:(NSString * _Nullable)eventName; + +- (instancetype)initWithEventName:(NSString * _Nullable)eventName firstCheckID:(NSString *)firstCheckID; + +@end + +NS_ASSUME_NONNULL_END diff --git a/Assets/HCMiniSdk/Third/ta/Plugins/iOS/ThinkingSDK/Source/EventTracker/EventModel/TDFirstEventModel.h.meta b/Assets/HCMiniSdk/Third/ta/Plugins/iOS/ThinkingSDK/Source/EventTracker/EventModel/TDFirstEventModel.h.meta new file mode 100644 index 00000000..f864186c --- /dev/null +++ b/Assets/HCMiniSdk/Third/ta/Plugins/iOS/ThinkingSDK/Source/EventTracker/EventModel/TDFirstEventModel.h.meta @@ -0,0 +1,33 @@ +fileFormatVersion: 2 +guid: 97a7f26110d42427091d0ecc77a0cef1 +PluginImporter: + externalObjects: {} + serializedVersion: 2 + iconMap: {} + executionOrder: {} + defineConstraints: [] + isPreloaded: 0 + isOverridable: 0 + isExplicitlyReferenced: 0 + validateReferences: 1 + platformData: + - first: + Any: + second: + enabled: 0 + settings: {} + - first: + Editor: Editor + second: + enabled: 0 + settings: + DefaultValueInitialized: true + - first: + iPhone: iOS + second: + enabled: 1 + settings: + AddToEmbeddedBinaries: false + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/HCMiniSdk/Third/ta/Plugins/iOS/ThinkingSDK/Source/EventTracker/EventModel/TDFirstEventModel.m b/Assets/HCMiniSdk/Third/ta/Plugins/iOS/ThinkingSDK/Source/EventTracker/EventModel/TDFirstEventModel.m new file mode 100755 index 00000000..11db5a88 --- /dev/null +++ b/Assets/HCMiniSdk/Third/ta/Plugins/iOS/ThinkingSDK/Source/EventTracker/EventModel/TDFirstEventModel.m @@ -0,0 +1,17 @@ +#import "TDFirstEventModel.h" +#import "ThinkingAnalyticsSDKPrivate.h" + +@implementation TDFirstEventModel + +- (instancetype)initWithEventName:(NSString *)eventName { + return [self initWithEventName:eventName eventType:TD_EVENT_TYPE_TRACK_FIRST]; +} + +- (instancetype)initWithEventName:(NSString *)eventName firstCheckID:(NSString *)firstCheckID { + if (self = [self initWithEventName:eventName eventType:TD_EVENT_TYPE_TRACK_FIRST]) { + self.extraID = firstCheckID; + } + return self; +} + +@end diff --git a/Assets/HCMiniSdk/Third/ta/Plugins/iOS/ThinkingSDK/Source/EventTracker/EventModel/TDFirstEventModel.m.meta b/Assets/HCMiniSdk/Third/ta/Plugins/iOS/ThinkingSDK/Source/EventTracker/EventModel/TDFirstEventModel.m.meta new file mode 100644 index 00000000..f95b4c1f --- /dev/null +++ b/Assets/HCMiniSdk/Third/ta/Plugins/iOS/ThinkingSDK/Source/EventTracker/EventModel/TDFirstEventModel.m.meta @@ -0,0 +1,33 @@ +fileFormatVersion: 2 +guid: ef9d0018898d449ac852a035e9776780 +PluginImporter: + externalObjects: {} + serializedVersion: 2 + iconMap: {} + executionOrder: {} + defineConstraints: [] + isPreloaded: 0 + isOverridable: 0 + isExplicitlyReferenced: 0 + validateReferences: 1 + platformData: + - first: + Any: + second: + enabled: 0 + settings: {} + - first: + Editor: Editor + second: + enabled: 0 + settings: + DefaultValueInitialized: true + - first: + iPhone: iOS + second: + enabled: 1 + settings: + AddToEmbeddedBinaries: false + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/HCMiniSdk/Third/ta/Plugins/iOS/ThinkingSDK/Source/EventTracker/EventModel/TDOverwriteEventModel.h b/Assets/HCMiniSdk/Third/ta/Plugins/iOS/ThinkingSDK/Source/EventTracker/EventModel/TDOverwriteEventModel.h new file mode 100755 index 00000000..46a29681 --- /dev/null +++ b/Assets/HCMiniSdk/Third/ta/Plugins/iOS/ThinkingSDK/Source/EventTracker/EventModel/TDOverwriteEventModel.h @@ -0,0 +1,22 @@ +// +// TDOverwriteEventModel.h +// ThinkingSDK +// +// Created by Yangxiongon 2022/7/1. +// + +#if __has_include() +#import +#else +#import "TDEventModel.h" +#endif + +NS_ASSUME_NONNULL_BEGIN + +@interface TDOverwriteEventModel : TDEventModel + +- (instancetype)initWithEventName:(NSString *)eventName eventID:(NSString *)eventID; + +@end + +NS_ASSUME_NONNULL_END diff --git a/Assets/HCMiniSdk/Third/ta/Plugins/iOS/ThinkingSDK/Source/EventTracker/EventModel/TDOverwriteEventModel.h.meta b/Assets/HCMiniSdk/Third/ta/Plugins/iOS/ThinkingSDK/Source/EventTracker/EventModel/TDOverwriteEventModel.h.meta new file mode 100644 index 00000000..03be643d --- /dev/null +++ b/Assets/HCMiniSdk/Third/ta/Plugins/iOS/ThinkingSDK/Source/EventTracker/EventModel/TDOverwriteEventModel.h.meta @@ -0,0 +1,33 @@ +fileFormatVersion: 2 +guid: 5dc01cb9b7f4e42f9b63a0d9d768368f +PluginImporter: + externalObjects: {} + serializedVersion: 2 + iconMap: {} + executionOrder: {} + defineConstraints: [] + isPreloaded: 0 + isOverridable: 0 + isExplicitlyReferenced: 0 + validateReferences: 1 + platformData: + - first: + Any: + second: + enabled: 0 + settings: {} + - first: + Editor: Editor + second: + enabled: 0 + settings: + DefaultValueInitialized: true + - first: + iPhone: iOS + second: + enabled: 1 + settings: + AddToEmbeddedBinaries: false + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/HCMiniSdk/Third/ta/Plugins/iOS/ThinkingSDK/Source/EventTracker/EventModel/TDOverwriteEventModel.m b/Assets/HCMiniSdk/Third/ta/Plugins/iOS/ThinkingSDK/Source/EventTracker/EventModel/TDOverwriteEventModel.m new file mode 100755 index 00000000..7f9de480 --- /dev/null +++ b/Assets/HCMiniSdk/Third/ta/Plugins/iOS/ThinkingSDK/Source/EventTracker/EventModel/TDOverwriteEventModel.m @@ -0,0 +1,20 @@ +// +// TDOverwriteEventModel.m +// ThinkingSDK +// +// Created by Yangxiongon 2022/7/1. +// + +#import "TDOverwriteEventModel.h" +#import "ThinkingAnalyticsSDKPrivate.h" + +@implementation TDOverwriteEventModel + +- (instancetype)initWithEventName:(NSString *)eventName eventID:(NSString *)eventID { + if (self = [self initWithEventName:eventName eventType:TD_EVENT_TYPE_TRACK_OVERWRITE]) { + self.extraID = eventID; + } + return self; +} + +@end diff --git a/Assets/HCMiniSdk/Third/ta/Plugins/iOS/ThinkingSDK/Source/EventTracker/EventModel/TDOverwriteEventModel.m.meta b/Assets/HCMiniSdk/Third/ta/Plugins/iOS/ThinkingSDK/Source/EventTracker/EventModel/TDOverwriteEventModel.m.meta new file mode 100644 index 00000000..473857ac --- /dev/null +++ b/Assets/HCMiniSdk/Third/ta/Plugins/iOS/ThinkingSDK/Source/EventTracker/EventModel/TDOverwriteEventModel.m.meta @@ -0,0 +1,33 @@ +fileFormatVersion: 2 +guid: 30daf01e45573481881a7ae94d3b89a1 +PluginImporter: + externalObjects: {} + serializedVersion: 2 + iconMap: {} + executionOrder: {} + defineConstraints: [] + isPreloaded: 0 + isOverridable: 0 + isExplicitlyReferenced: 0 + validateReferences: 1 + platformData: + - first: + Any: + second: + enabled: 0 + settings: {} + - first: + Editor: Editor + second: + enabled: 0 + settings: + DefaultValueInitialized: true + - first: + iPhone: iOS + second: + enabled: 1 + settings: + AddToEmbeddedBinaries: false + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/HCMiniSdk/Third/ta/Plugins/iOS/ThinkingSDK/Source/EventTracker/EventModel/TDUpdateEventModel.h b/Assets/HCMiniSdk/Third/ta/Plugins/iOS/ThinkingSDK/Source/EventTracker/EventModel/TDUpdateEventModel.h new file mode 100755 index 00000000..b356a609 --- /dev/null +++ b/Assets/HCMiniSdk/Third/ta/Plugins/iOS/ThinkingSDK/Source/EventTracker/EventModel/TDUpdateEventModel.h @@ -0,0 +1,22 @@ +// +// TDUpdateEventModel.h +// ThinkingSDK +// +// Created by Yangxiongon 2022/7/1. +// + +#if __has_include() +#import +#else +#import "TDEventModel.h" +#endif + +NS_ASSUME_NONNULL_BEGIN + +@interface TDUpdateEventModel : TDEventModel + +- (instancetype)initWithEventName:(NSString *)eventName eventID:(NSString *)eventID; + +@end + +NS_ASSUME_NONNULL_END diff --git a/Assets/HCMiniSdk/Third/ta/Plugins/iOS/ThinkingSDK/Source/EventTracker/EventModel/TDUpdateEventModel.h.meta b/Assets/HCMiniSdk/Third/ta/Plugins/iOS/ThinkingSDK/Source/EventTracker/EventModel/TDUpdateEventModel.h.meta new file mode 100644 index 00000000..dbfff148 --- /dev/null +++ b/Assets/HCMiniSdk/Third/ta/Plugins/iOS/ThinkingSDK/Source/EventTracker/EventModel/TDUpdateEventModel.h.meta @@ -0,0 +1,33 @@ +fileFormatVersion: 2 +guid: bab971596eecc447e9515c9c200beeea +PluginImporter: + externalObjects: {} + serializedVersion: 2 + iconMap: {} + executionOrder: {} + defineConstraints: [] + isPreloaded: 0 + isOverridable: 0 + isExplicitlyReferenced: 0 + validateReferences: 1 + platformData: + - first: + Any: + second: + enabled: 0 + settings: {} + - first: + Editor: Editor + second: + enabled: 0 + settings: + DefaultValueInitialized: true + - first: + iPhone: iOS + second: + enabled: 1 + settings: + AddToEmbeddedBinaries: false + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/HCMiniSdk/Third/ta/Plugins/iOS/ThinkingSDK/Source/EventTracker/EventModel/TDUpdateEventModel.m b/Assets/HCMiniSdk/Third/ta/Plugins/iOS/ThinkingSDK/Source/EventTracker/EventModel/TDUpdateEventModel.m new file mode 100755 index 00000000..16aeca77 --- /dev/null +++ b/Assets/HCMiniSdk/Third/ta/Plugins/iOS/ThinkingSDK/Source/EventTracker/EventModel/TDUpdateEventModel.m @@ -0,0 +1,20 @@ +// +// TDUpdateEventModel.m +// ThinkingSDK +// +// Created by Yangxiongon 2022/7/1. +// + +#import "TDUpdateEventModel.h" +#import "ThinkingAnalyticsSDKPrivate.h" + +@implementation TDUpdateEventModel + +- (instancetype)initWithEventName:(NSString *)eventName eventID:(NSString *)eventID { + if (self = [self initWithEventName:eventName eventType:TD_EVENT_TYPE_TRACK_UPDATE]) { + self.extraID = eventID; + } + return self; +} + +@end diff --git a/Assets/HCMiniSdk/Third/ta/Plugins/iOS/ThinkingSDK/Source/EventTracker/EventModel/TDUpdateEventModel.m.meta b/Assets/HCMiniSdk/Third/ta/Plugins/iOS/ThinkingSDK/Source/EventTracker/EventModel/TDUpdateEventModel.m.meta new file mode 100644 index 00000000..b4c198c5 --- /dev/null +++ b/Assets/HCMiniSdk/Third/ta/Plugins/iOS/ThinkingSDK/Source/EventTracker/EventModel/TDUpdateEventModel.m.meta @@ -0,0 +1,33 @@ +fileFormatVersion: 2 +guid: 5a53fbef3fbd443c6b986f13fb2a9b76 +PluginImporter: + externalObjects: {} + serializedVersion: 2 + iconMap: {} + executionOrder: {} + defineConstraints: [] + isPreloaded: 0 + isOverridable: 0 + isExplicitlyReferenced: 0 + validateReferences: 1 + platformData: + - first: + Any: + second: + enabled: 0 + settings: {} + - first: + Editor: Editor + second: + enabled: 0 + settings: + DefaultValueInitialized: true + - first: + iPhone: iOS + second: + enabled: 1 + settings: + AddToEmbeddedBinaries: false + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/HCMiniSdk/Third/ta/Plugins/iOS/ThinkingSDK/Source/EventTracker/EventModel/UserProperty.meta b/Assets/HCMiniSdk/Third/ta/Plugins/iOS/ThinkingSDK/Source/EventTracker/EventModel/UserProperty.meta new file mode 100644 index 00000000..587ba898 --- /dev/null +++ b/Assets/HCMiniSdk/Third/ta/Plugins/iOS/ThinkingSDK/Source/EventTracker/EventModel/UserProperty.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: 3cfc2ce7ca8134bceae9d8f4c9a620ab +folderAsset: yes +DefaultImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/HCMiniSdk/Third/ta/Plugins/iOS/ThinkingSDK/Source/EventTracker/EventModel/UserProperty/TAUserEvent.h b/Assets/HCMiniSdk/Third/ta/Plugins/iOS/ThinkingSDK/Source/EventTracker/EventModel/UserProperty/TAUserEvent.h new file mode 100755 index 00000000..16257402 --- /dev/null +++ b/Assets/HCMiniSdk/Third/ta/Plugins/iOS/ThinkingSDK/Source/EventTracker/EventModel/UserProperty/TAUserEvent.h @@ -0,0 +1,16 @@ +// +// TAUserEvent.h +// ThinkingSDK +// +// Created by Yangxiongon 2022/6/12. +// + +#import "TABaseEvent.h" + +NS_ASSUME_NONNULL_BEGIN + +@interface TAUserEvent : TABaseEvent + +@end + +NS_ASSUME_NONNULL_END diff --git a/Assets/HCMiniSdk/Third/ta/Plugins/iOS/ThinkingSDK/Source/EventTracker/EventModel/UserProperty/TAUserEvent.h.meta b/Assets/HCMiniSdk/Third/ta/Plugins/iOS/ThinkingSDK/Source/EventTracker/EventModel/UserProperty/TAUserEvent.h.meta new file mode 100644 index 00000000..5ba333e5 --- /dev/null +++ b/Assets/HCMiniSdk/Third/ta/Plugins/iOS/ThinkingSDK/Source/EventTracker/EventModel/UserProperty/TAUserEvent.h.meta @@ -0,0 +1,33 @@ +fileFormatVersion: 2 +guid: 1dd36fa16d6fc4116a5e7f3ef58c2738 +PluginImporter: + externalObjects: {} + serializedVersion: 2 + iconMap: {} + executionOrder: {} + defineConstraints: [] + isPreloaded: 0 + isOverridable: 0 + isExplicitlyReferenced: 0 + validateReferences: 1 + platformData: + - first: + Any: + second: + enabled: 0 + settings: {} + - first: + Editor: Editor + second: + enabled: 0 + settings: + DefaultValueInitialized: true + - first: + iPhone: iOS + second: + enabled: 1 + settings: + AddToEmbeddedBinaries: false + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/HCMiniSdk/Third/ta/Plugins/iOS/ThinkingSDK/Source/EventTracker/EventModel/UserProperty/TAUserEvent.m b/Assets/HCMiniSdk/Third/ta/Plugins/iOS/ThinkingSDK/Source/EventTracker/EventModel/UserProperty/TAUserEvent.m new file mode 100755 index 00000000..33fb3dc4 --- /dev/null +++ b/Assets/HCMiniSdk/Third/ta/Plugins/iOS/ThinkingSDK/Source/EventTracker/EventModel/UserProperty/TAUserEvent.m @@ -0,0 +1,35 @@ +// +// TAUserEvent.m +// ThinkingSDK +// +// Created by Yangxiongon 2022/6/12. +// + +#import "TAUserEvent.h" + +@implementation TAUserEvent + +- (instancetype)init +{ + self = [super init]; + if (self) { + self.timeValueType = TAEventTimeValueTypeNone; + } + return self; +} + +//MARK: - Delegate + +- (void)ta_validateKey:(NSString *)key value:(id)value error:(NSError *__autoreleasing _Nullable *)error { + [TAPropertyValidator validateBaseEventPropertyKey:key value:value error:error]; +} + +//MARK: - Setter & Getter + +- (void)setTime:(NSDate *)time { + [super setTime:time]; + + self.timeValueType = time == nil ? TAEventTimeValueTypeNone : TAEventTimeValueTypeTimeOnly; +} + +@end diff --git a/Assets/HCMiniSdk/Third/ta/Plugins/iOS/ThinkingSDK/Source/EventTracker/EventModel/UserProperty/TAUserEvent.m.meta b/Assets/HCMiniSdk/Third/ta/Plugins/iOS/ThinkingSDK/Source/EventTracker/EventModel/UserProperty/TAUserEvent.m.meta new file mode 100644 index 00000000..c5f9b228 --- /dev/null +++ b/Assets/HCMiniSdk/Third/ta/Plugins/iOS/ThinkingSDK/Source/EventTracker/EventModel/UserProperty/TAUserEvent.m.meta @@ -0,0 +1,33 @@ +fileFormatVersion: 2 +guid: 6d5ed8dc063674991a32a9b192815e25 +PluginImporter: + externalObjects: {} + serializedVersion: 2 + iconMap: {} + executionOrder: {} + defineConstraints: [] + isPreloaded: 0 + isOverridable: 0 + isExplicitlyReferenced: 0 + validateReferences: 1 + platformData: + - first: + Any: + second: + enabled: 0 + settings: {} + - first: + Editor: Editor + second: + enabled: 0 + settings: + DefaultValueInitialized: true + - first: + iPhone: iOS + second: + enabled: 1 + settings: + AddToEmbeddedBinaries: false + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/HCMiniSdk/Third/ta/Plugins/iOS/ThinkingSDK/Source/EventTracker/EventModel/UserProperty/TAUserEventAdd.h b/Assets/HCMiniSdk/Third/ta/Plugins/iOS/ThinkingSDK/Source/EventTracker/EventModel/UserProperty/TAUserEventAdd.h new file mode 100755 index 00000000..b69ec612 --- /dev/null +++ b/Assets/HCMiniSdk/Third/ta/Plugins/iOS/ThinkingSDK/Source/EventTracker/EventModel/UserProperty/TAUserEventAdd.h @@ -0,0 +1,16 @@ +// +// TAUserEventAdd.h +// ThinkingSDK +// +// Created by Yangxiongon 2022/7/1. +// + +#import "TAUserEvent.h" + +NS_ASSUME_NONNULL_BEGIN + +@interface TAUserEventAdd : TAUserEvent + +@end + +NS_ASSUME_NONNULL_END diff --git a/Assets/HCMiniSdk/Third/ta/Plugins/iOS/ThinkingSDK/Source/EventTracker/EventModel/UserProperty/TAUserEventAdd.h.meta b/Assets/HCMiniSdk/Third/ta/Plugins/iOS/ThinkingSDK/Source/EventTracker/EventModel/UserProperty/TAUserEventAdd.h.meta new file mode 100644 index 00000000..f07baa03 --- /dev/null +++ b/Assets/HCMiniSdk/Third/ta/Plugins/iOS/ThinkingSDK/Source/EventTracker/EventModel/UserProperty/TAUserEventAdd.h.meta @@ -0,0 +1,33 @@ +fileFormatVersion: 2 +guid: 117c76ffcf61c433aa01967b7574f8fb +PluginImporter: + externalObjects: {} + serializedVersion: 2 + iconMap: {} + executionOrder: {} + defineConstraints: [] + isPreloaded: 0 + isOverridable: 0 + isExplicitlyReferenced: 0 + validateReferences: 1 + platformData: + - first: + Any: + second: + enabled: 0 + settings: {} + - first: + Editor: Editor + second: + enabled: 0 + settings: + DefaultValueInitialized: true + - first: + iPhone: iOS + second: + enabled: 1 + settings: + AddToEmbeddedBinaries: false + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/HCMiniSdk/Third/ta/Plugins/iOS/ThinkingSDK/Source/EventTracker/EventModel/UserProperty/TAUserEventAdd.m b/Assets/HCMiniSdk/Third/ta/Plugins/iOS/ThinkingSDK/Source/EventTracker/EventModel/UserProperty/TAUserEventAdd.m new file mode 100755 index 00000000..53556e5c --- /dev/null +++ b/Assets/HCMiniSdk/Third/ta/Plugins/iOS/ThinkingSDK/Source/EventTracker/EventModel/UserProperty/TAUserEventAdd.m @@ -0,0 +1,36 @@ +// +// TAUserEventAdd.m +// ThinkingSDK +// +// Created by Yangxiongon 2022/7/1. +// + +#import "TAUserEventAdd.h" + +@implementation TAUserEventAdd + +- (instancetype)init { + if (self = [super init]) { + self.eventType = TAEventTypeUserAdd; + } + return self; +} + +- (void)validateWithError:(NSError *__autoreleasing _Nullable *)error { + +} + +//MARK: - Delegate + +- (void)ta_validateKey:(NSString *)key value:(id)value error:(NSError *__autoreleasing _Nullable *)error { + [super ta_validateKey:key value:value error:error]; + if (*error) { + return; + } + if (![value isKindOfClass:NSNumber.class]) { + NSString *errMsg = [NSString stringWithFormat:@"Property value must be type NSNumber. got: %@ %@. ", [value class], value]; + *error = TAPropertyError(10008, errMsg); + } +} + +@end diff --git a/Assets/HCMiniSdk/Third/ta/Plugins/iOS/ThinkingSDK/Source/EventTracker/EventModel/UserProperty/TAUserEventAdd.m.meta b/Assets/HCMiniSdk/Third/ta/Plugins/iOS/ThinkingSDK/Source/EventTracker/EventModel/UserProperty/TAUserEventAdd.m.meta new file mode 100644 index 00000000..61f9dc26 --- /dev/null +++ b/Assets/HCMiniSdk/Third/ta/Plugins/iOS/ThinkingSDK/Source/EventTracker/EventModel/UserProperty/TAUserEventAdd.m.meta @@ -0,0 +1,33 @@ +fileFormatVersion: 2 +guid: 4cedec36a77914da895a01842ba9eee1 +PluginImporter: + externalObjects: {} + serializedVersion: 2 + iconMap: {} + executionOrder: {} + defineConstraints: [] + isPreloaded: 0 + isOverridable: 0 + isExplicitlyReferenced: 0 + validateReferences: 1 + platformData: + - first: + Any: + second: + enabled: 0 + settings: {} + - first: + Editor: Editor + second: + enabled: 0 + settings: + DefaultValueInitialized: true + - first: + iPhone: iOS + second: + enabled: 1 + settings: + AddToEmbeddedBinaries: false + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/HCMiniSdk/Third/ta/Plugins/iOS/ThinkingSDK/Source/EventTracker/EventModel/UserProperty/TAUserEventAppend.h b/Assets/HCMiniSdk/Third/ta/Plugins/iOS/ThinkingSDK/Source/EventTracker/EventModel/UserProperty/TAUserEventAppend.h new file mode 100755 index 00000000..ac04d9e6 --- /dev/null +++ b/Assets/HCMiniSdk/Third/ta/Plugins/iOS/ThinkingSDK/Source/EventTracker/EventModel/UserProperty/TAUserEventAppend.h @@ -0,0 +1,16 @@ +// +// TAUserEventAppend.h +// ThinkingSDK +// +// Created by Yangxiongon 2022/7/1. +// + +#import "TAUserEvent.h" + +NS_ASSUME_NONNULL_BEGIN + +@interface TAUserEventAppend : TAUserEvent + +@end + +NS_ASSUME_NONNULL_END diff --git a/Assets/HCMiniSdk/Third/ta/Plugins/iOS/ThinkingSDK/Source/EventTracker/EventModel/UserProperty/TAUserEventAppend.h.meta b/Assets/HCMiniSdk/Third/ta/Plugins/iOS/ThinkingSDK/Source/EventTracker/EventModel/UserProperty/TAUserEventAppend.h.meta new file mode 100644 index 00000000..c9132028 --- /dev/null +++ b/Assets/HCMiniSdk/Third/ta/Plugins/iOS/ThinkingSDK/Source/EventTracker/EventModel/UserProperty/TAUserEventAppend.h.meta @@ -0,0 +1,33 @@ +fileFormatVersion: 2 +guid: 266a9a17230364c86a2306272f17538b +PluginImporter: + externalObjects: {} + serializedVersion: 2 + iconMap: {} + executionOrder: {} + defineConstraints: [] + isPreloaded: 0 + isOverridable: 0 + isExplicitlyReferenced: 0 + validateReferences: 1 + platformData: + - first: + Any: + second: + enabled: 0 + settings: {} + - first: + Editor: Editor + second: + enabled: 0 + settings: + DefaultValueInitialized: true + - first: + iPhone: iOS + second: + enabled: 1 + settings: + AddToEmbeddedBinaries: false + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/HCMiniSdk/Third/ta/Plugins/iOS/ThinkingSDK/Source/EventTracker/EventModel/UserProperty/TAUserEventAppend.m b/Assets/HCMiniSdk/Third/ta/Plugins/iOS/ThinkingSDK/Source/EventTracker/EventModel/UserProperty/TAUserEventAppend.m new file mode 100755 index 00000000..52e2ecff --- /dev/null +++ b/Assets/HCMiniSdk/Third/ta/Plugins/iOS/ThinkingSDK/Source/EventTracker/EventModel/UserProperty/TAUserEventAppend.m @@ -0,0 +1,32 @@ +// +// TAUserEventAppend.m +// ThinkingSDK +// +// Created by Yangxiongon 2022/7/1. +// + +#import "TAUserEventAppend.h" + +@implementation TAUserEventAppend + +- (instancetype)init { + if (self = [super init]) { + self.eventType = TAEventTypeUserAppend; + } + return self; +} + +//MARK: - Delegate + +- (void)ta_validateKey:(NSString *)key value:(id)value error:(NSError *__autoreleasing _Nullable *)error { + [super ta_validateKey:key value:value error:error]; + if (*error) { + return; + } + if (![value isKindOfClass:NSArray.class]) { + NSString *errMsg = [NSString stringWithFormat:@"Property value must be type NSArray. got: %@ %@. ", [value class], value]; + *error = TAPropertyError(10009, errMsg); + } +} + +@end diff --git a/Assets/HCMiniSdk/Third/ta/Plugins/iOS/ThinkingSDK/Source/EventTracker/EventModel/UserProperty/TAUserEventAppend.m.meta b/Assets/HCMiniSdk/Third/ta/Plugins/iOS/ThinkingSDK/Source/EventTracker/EventModel/UserProperty/TAUserEventAppend.m.meta new file mode 100644 index 00000000..e89e955f --- /dev/null +++ b/Assets/HCMiniSdk/Third/ta/Plugins/iOS/ThinkingSDK/Source/EventTracker/EventModel/UserProperty/TAUserEventAppend.m.meta @@ -0,0 +1,33 @@ +fileFormatVersion: 2 +guid: 86e5ffc6dd5224180a76d1e856050f42 +PluginImporter: + externalObjects: {} + serializedVersion: 2 + iconMap: {} + executionOrder: {} + defineConstraints: [] + isPreloaded: 0 + isOverridable: 0 + isExplicitlyReferenced: 0 + validateReferences: 1 + platformData: + - first: + Any: + second: + enabled: 0 + settings: {} + - first: + Editor: Editor + second: + enabled: 0 + settings: + DefaultValueInitialized: true + - first: + iPhone: iOS + second: + enabled: 1 + settings: + AddToEmbeddedBinaries: false + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/HCMiniSdk/Third/ta/Plugins/iOS/ThinkingSDK/Source/EventTracker/EventModel/UserProperty/TAUserEventDelete.h b/Assets/HCMiniSdk/Third/ta/Plugins/iOS/ThinkingSDK/Source/EventTracker/EventModel/UserProperty/TAUserEventDelete.h new file mode 100755 index 00000000..c0a7e673 --- /dev/null +++ b/Assets/HCMiniSdk/Third/ta/Plugins/iOS/ThinkingSDK/Source/EventTracker/EventModel/UserProperty/TAUserEventDelete.h @@ -0,0 +1,16 @@ +// +// TAUserEventDelete.h +// ThinkingSDK +// +// Created by Yangxiongon 2022/7/1. +// + +#import "TAUserEvent.h" + +NS_ASSUME_NONNULL_BEGIN + +@interface TAUserEventDelete : TAUserEvent + +@end + +NS_ASSUME_NONNULL_END diff --git a/Assets/HCMiniSdk/Third/ta/Plugins/iOS/ThinkingSDK/Source/EventTracker/EventModel/UserProperty/TAUserEventDelete.h.meta b/Assets/HCMiniSdk/Third/ta/Plugins/iOS/ThinkingSDK/Source/EventTracker/EventModel/UserProperty/TAUserEventDelete.h.meta new file mode 100644 index 00000000..0fcb9fb5 --- /dev/null +++ b/Assets/HCMiniSdk/Third/ta/Plugins/iOS/ThinkingSDK/Source/EventTracker/EventModel/UserProperty/TAUserEventDelete.h.meta @@ -0,0 +1,33 @@ +fileFormatVersion: 2 +guid: 2174c8501ad394fbd893b658cc870103 +PluginImporter: + externalObjects: {} + serializedVersion: 2 + iconMap: {} + executionOrder: {} + defineConstraints: [] + isPreloaded: 0 + isOverridable: 0 + isExplicitlyReferenced: 0 + validateReferences: 1 + platformData: + - first: + Any: + second: + enabled: 0 + settings: {} + - first: + Editor: Editor + second: + enabled: 0 + settings: + DefaultValueInitialized: true + - first: + iPhone: iOS + second: + enabled: 1 + settings: + AddToEmbeddedBinaries: false + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/HCMiniSdk/Third/ta/Plugins/iOS/ThinkingSDK/Source/EventTracker/EventModel/UserProperty/TAUserEventDelete.m b/Assets/HCMiniSdk/Third/ta/Plugins/iOS/ThinkingSDK/Source/EventTracker/EventModel/UserProperty/TAUserEventDelete.m new file mode 100755 index 00000000..e076f998 --- /dev/null +++ b/Assets/HCMiniSdk/Third/ta/Plugins/iOS/ThinkingSDK/Source/EventTracker/EventModel/UserProperty/TAUserEventDelete.m @@ -0,0 +1,19 @@ +// +// TAUserEventDelete.m +// ThinkingSDK +// +// Created by Yangxiongon 2022/7/1. +// + +#import "TAUserEventDelete.h" + +@implementation TAUserEventDelete + +- (instancetype)init { + if (self = [super init]) { + self.eventType = TAEventTypeUserDel; + } + return self; +} + +@end diff --git a/Assets/HCMiniSdk/Third/ta/Plugins/iOS/ThinkingSDK/Source/EventTracker/EventModel/UserProperty/TAUserEventDelete.m.meta b/Assets/HCMiniSdk/Third/ta/Plugins/iOS/ThinkingSDK/Source/EventTracker/EventModel/UserProperty/TAUserEventDelete.m.meta new file mode 100644 index 00000000..a6271097 --- /dev/null +++ b/Assets/HCMiniSdk/Third/ta/Plugins/iOS/ThinkingSDK/Source/EventTracker/EventModel/UserProperty/TAUserEventDelete.m.meta @@ -0,0 +1,33 @@ +fileFormatVersion: 2 +guid: 01aca42cdf903469b88b585fccf47d5e +PluginImporter: + externalObjects: {} + serializedVersion: 2 + iconMap: {} + executionOrder: {} + defineConstraints: [] + isPreloaded: 0 + isOverridable: 0 + isExplicitlyReferenced: 0 + validateReferences: 1 + platformData: + - first: + Any: + second: + enabled: 0 + settings: {} + - first: + Editor: Editor + second: + enabled: 0 + settings: + DefaultValueInitialized: true + - first: + iPhone: iOS + second: + enabled: 1 + settings: + AddToEmbeddedBinaries: false + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/HCMiniSdk/Third/ta/Plugins/iOS/ThinkingSDK/Source/EventTracker/EventModel/UserProperty/TAUserEventSet.h b/Assets/HCMiniSdk/Third/ta/Plugins/iOS/ThinkingSDK/Source/EventTracker/EventModel/UserProperty/TAUserEventSet.h new file mode 100755 index 00000000..932d1a5d --- /dev/null +++ b/Assets/HCMiniSdk/Third/ta/Plugins/iOS/ThinkingSDK/Source/EventTracker/EventModel/UserProperty/TAUserEventSet.h @@ -0,0 +1,16 @@ +// +// TAUserEventSet.h +// ThinkingSDK +// +// Created by Yangxiongon 2022/7/1. +// + +#import "TAUserEvent.h" + +NS_ASSUME_NONNULL_BEGIN + +@interface TAUserEventSet : TAUserEvent + +@end + +NS_ASSUME_NONNULL_END diff --git a/Assets/HCMiniSdk/Third/ta/Plugins/iOS/ThinkingSDK/Source/EventTracker/EventModel/UserProperty/TAUserEventSet.h.meta b/Assets/HCMiniSdk/Third/ta/Plugins/iOS/ThinkingSDK/Source/EventTracker/EventModel/UserProperty/TAUserEventSet.h.meta new file mode 100644 index 00000000..808ecb23 --- /dev/null +++ b/Assets/HCMiniSdk/Third/ta/Plugins/iOS/ThinkingSDK/Source/EventTracker/EventModel/UserProperty/TAUserEventSet.h.meta @@ -0,0 +1,33 @@ +fileFormatVersion: 2 +guid: eb2eae3a898a044e8be1ce16eaf0b6ac +PluginImporter: + externalObjects: {} + serializedVersion: 2 + iconMap: {} + executionOrder: {} + defineConstraints: [] + isPreloaded: 0 + isOverridable: 0 + isExplicitlyReferenced: 0 + validateReferences: 1 + platformData: + - first: + Any: + second: + enabled: 0 + settings: {} + - first: + Editor: Editor + second: + enabled: 0 + settings: + DefaultValueInitialized: true + - first: + iPhone: iOS + second: + enabled: 1 + settings: + AddToEmbeddedBinaries: false + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/HCMiniSdk/Third/ta/Plugins/iOS/ThinkingSDK/Source/EventTracker/EventModel/UserProperty/TAUserEventSet.m b/Assets/HCMiniSdk/Third/ta/Plugins/iOS/ThinkingSDK/Source/EventTracker/EventModel/UserProperty/TAUserEventSet.m new file mode 100755 index 00000000..66846e1a --- /dev/null +++ b/Assets/HCMiniSdk/Third/ta/Plugins/iOS/ThinkingSDK/Source/EventTracker/EventModel/UserProperty/TAUserEventSet.m @@ -0,0 +1,19 @@ +// +// TAUserEventSet.m +// ThinkingSDK +// +// Created by Yangxiongon 2022/7/1. +// + +#import "TAUserEventSet.h" + +@implementation TAUserEventSet + +- (instancetype)init { + if (self = [super init]) { + self.eventType = TAEventTypeUserSet; + } + return self; +} + +@end diff --git a/Assets/HCMiniSdk/Third/ta/Plugins/iOS/ThinkingSDK/Source/EventTracker/EventModel/UserProperty/TAUserEventSet.m.meta b/Assets/HCMiniSdk/Third/ta/Plugins/iOS/ThinkingSDK/Source/EventTracker/EventModel/UserProperty/TAUserEventSet.m.meta new file mode 100644 index 00000000..c565a63f --- /dev/null +++ b/Assets/HCMiniSdk/Third/ta/Plugins/iOS/ThinkingSDK/Source/EventTracker/EventModel/UserProperty/TAUserEventSet.m.meta @@ -0,0 +1,33 @@ +fileFormatVersion: 2 +guid: 589c937be1eb549f48c72cce7e037f9d +PluginImporter: + externalObjects: {} + serializedVersion: 2 + iconMap: {} + executionOrder: {} + defineConstraints: [] + isPreloaded: 0 + isOverridable: 0 + isExplicitlyReferenced: 0 + validateReferences: 1 + platformData: + - first: + Any: + second: + enabled: 0 + settings: {} + - first: + Editor: Editor + second: + enabled: 0 + settings: + DefaultValueInitialized: true + - first: + iPhone: iOS + second: + enabled: 1 + settings: + AddToEmbeddedBinaries: false + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/HCMiniSdk/Third/ta/Plugins/iOS/ThinkingSDK/Source/EventTracker/EventModel/UserProperty/TAUserEventSetOnce.h b/Assets/HCMiniSdk/Third/ta/Plugins/iOS/ThinkingSDK/Source/EventTracker/EventModel/UserProperty/TAUserEventSetOnce.h new file mode 100755 index 00000000..7a077ece --- /dev/null +++ b/Assets/HCMiniSdk/Third/ta/Plugins/iOS/ThinkingSDK/Source/EventTracker/EventModel/UserProperty/TAUserEventSetOnce.h @@ -0,0 +1,16 @@ +// +// TAUserEventSetOnce.h +// ThinkingSDK +// +// Created by Yangxiongon 2022/7/1. +// + +#import "TAUserEvent.h" + +NS_ASSUME_NONNULL_BEGIN + +@interface TAUserEventSetOnce : TAUserEvent + +@end + +NS_ASSUME_NONNULL_END diff --git a/Assets/HCMiniSdk/Third/ta/Plugins/iOS/ThinkingSDK/Source/EventTracker/EventModel/UserProperty/TAUserEventSetOnce.h.meta b/Assets/HCMiniSdk/Third/ta/Plugins/iOS/ThinkingSDK/Source/EventTracker/EventModel/UserProperty/TAUserEventSetOnce.h.meta new file mode 100644 index 00000000..6d7dfa76 --- /dev/null +++ b/Assets/HCMiniSdk/Third/ta/Plugins/iOS/ThinkingSDK/Source/EventTracker/EventModel/UserProperty/TAUserEventSetOnce.h.meta @@ -0,0 +1,33 @@ +fileFormatVersion: 2 +guid: 1b5eafe6d2e074e5caed0bf49b17453b +PluginImporter: + externalObjects: {} + serializedVersion: 2 + iconMap: {} + executionOrder: {} + defineConstraints: [] + isPreloaded: 0 + isOverridable: 0 + isExplicitlyReferenced: 0 + validateReferences: 1 + platformData: + - first: + Any: + second: + enabled: 0 + settings: {} + - first: + Editor: Editor + second: + enabled: 0 + settings: + DefaultValueInitialized: true + - first: + iPhone: iOS + second: + enabled: 1 + settings: + AddToEmbeddedBinaries: false + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/HCMiniSdk/Third/ta/Plugins/iOS/ThinkingSDK/Source/EventTracker/EventModel/UserProperty/TAUserEventSetOnce.m b/Assets/HCMiniSdk/Third/ta/Plugins/iOS/ThinkingSDK/Source/EventTracker/EventModel/UserProperty/TAUserEventSetOnce.m new file mode 100755 index 00000000..0829379f --- /dev/null +++ b/Assets/HCMiniSdk/Third/ta/Plugins/iOS/ThinkingSDK/Source/EventTracker/EventModel/UserProperty/TAUserEventSetOnce.m @@ -0,0 +1,19 @@ +// +// TAUserEventSetOnce.m +// ThinkingSDK +// +// Created by Yangxiongon 2022/7/1. +// + +#import "TAUserEventSetOnce.h" + +@implementation TAUserEventSetOnce + +- (instancetype)init { + if (self = [super init]) { + self.eventType = TAEventTypeUserSetOnce; + } + return self; +} + +@end diff --git a/Assets/HCMiniSdk/Third/ta/Plugins/iOS/ThinkingSDK/Source/EventTracker/EventModel/UserProperty/TAUserEventSetOnce.m.meta b/Assets/HCMiniSdk/Third/ta/Plugins/iOS/ThinkingSDK/Source/EventTracker/EventModel/UserProperty/TAUserEventSetOnce.m.meta new file mode 100644 index 00000000..307467c5 --- /dev/null +++ b/Assets/HCMiniSdk/Third/ta/Plugins/iOS/ThinkingSDK/Source/EventTracker/EventModel/UserProperty/TAUserEventSetOnce.m.meta @@ -0,0 +1,33 @@ +fileFormatVersion: 2 +guid: 47df419b2e2b6428fbcf9df660eed595 +PluginImporter: + externalObjects: {} + serializedVersion: 2 + iconMap: {} + executionOrder: {} + defineConstraints: [] + isPreloaded: 0 + isOverridable: 0 + isExplicitlyReferenced: 0 + validateReferences: 1 + platformData: + - first: + Any: + second: + enabled: 0 + settings: {} + - first: + Editor: Editor + second: + enabled: 0 + settings: + DefaultValueInitialized: true + - first: + iPhone: iOS + second: + enabled: 1 + settings: + AddToEmbeddedBinaries: false + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/HCMiniSdk/Third/ta/Plugins/iOS/ThinkingSDK/Source/EventTracker/EventModel/UserProperty/TAUserEventUniqueAppend.h b/Assets/HCMiniSdk/Third/ta/Plugins/iOS/ThinkingSDK/Source/EventTracker/EventModel/UserProperty/TAUserEventUniqueAppend.h new file mode 100755 index 00000000..d5c0d76f --- /dev/null +++ b/Assets/HCMiniSdk/Third/ta/Plugins/iOS/ThinkingSDK/Source/EventTracker/EventModel/UserProperty/TAUserEventUniqueAppend.h @@ -0,0 +1,16 @@ +// +// TAUserEventUniqueAppend.h +// ThinkingSDK +// +// Created by Yangxiongon 2022/7/1. +// + +#import "TAUserEventAppend.h" + +NS_ASSUME_NONNULL_BEGIN + +@interface TAUserEventUniqueAppend : TAUserEventAppend + +@end + +NS_ASSUME_NONNULL_END diff --git a/Assets/HCMiniSdk/Third/ta/Plugins/iOS/ThinkingSDK/Source/EventTracker/EventModel/UserProperty/TAUserEventUniqueAppend.h.meta b/Assets/HCMiniSdk/Third/ta/Plugins/iOS/ThinkingSDK/Source/EventTracker/EventModel/UserProperty/TAUserEventUniqueAppend.h.meta new file mode 100644 index 00000000..01ef20a0 --- /dev/null +++ b/Assets/HCMiniSdk/Third/ta/Plugins/iOS/ThinkingSDK/Source/EventTracker/EventModel/UserProperty/TAUserEventUniqueAppend.h.meta @@ -0,0 +1,33 @@ +fileFormatVersion: 2 +guid: bccae85470bae452bb9e0cb8002328ef +PluginImporter: + externalObjects: {} + serializedVersion: 2 + iconMap: {} + executionOrder: {} + defineConstraints: [] + isPreloaded: 0 + isOverridable: 0 + isExplicitlyReferenced: 0 + validateReferences: 1 + platformData: + - first: + Any: + second: + enabled: 0 + settings: {} + - first: + Editor: Editor + second: + enabled: 0 + settings: + DefaultValueInitialized: true + - first: + iPhone: iOS + second: + enabled: 1 + settings: + AddToEmbeddedBinaries: false + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/HCMiniSdk/Third/ta/Plugins/iOS/ThinkingSDK/Source/EventTracker/EventModel/UserProperty/TAUserEventUniqueAppend.m b/Assets/HCMiniSdk/Third/ta/Plugins/iOS/ThinkingSDK/Source/EventTracker/EventModel/UserProperty/TAUserEventUniqueAppend.m new file mode 100755 index 00000000..b4e7e91c --- /dev/null +++ b/Assets/HCMiniSdk/Third/ta/Plugins/iOS/ThinkingSDK/Source/EventTracker/EventModel/UserProperty/TAUserEventUniqueAppend.m @@ -0,0 +1,19 @@ +// +// TAUserEventUniqueAppend.m +// ThinkingSDK +// +// Created by Yangxiongon 2022/7/1. +// + +#import "TAUserEventUniqueAppend.h" + +@implementation TAUserEventUniqueAppend + +- (instancetype)init { + if (self = [super init]) { + self.eventType = TAEventTypeUserUniqueAppend; + } + return self; +} + +@end diff --git a/Assets/HCMiniSdk/Third/ta/Plugins/iOS/ThinkingSDK/Source/EventTracker/EventModel/UserProperty/TAUserEventUniqueAppend.m.meta b/Assets/HCMiniSdk/Third/ta/Plugins/iOS/ThinkingSDK/Source/EventTracker/EventModel/UserProperty/TAUserEventUniqueAppend.m.meta new file mode 100644 index 00000000..28825080 --- /dev/null +++ b/Assets/HCMiniSdk/Third/ta/Plugins/iOS/ThinkingSDK/Source/EventTracker/EventModel/UserProperty/TAUserEventUniqueAppend.m.meta @@ -0,0 +1,33 @@ +fileFormatVersion: 2 +guid: 5f868d359653e4575bac39d5a14502a9 +PluginImporter: + externalObjects: {} + serializedVersion: 2 + iconMap: {} + executionOrder: {} + defineConstraints: [] + isPreloaded: 0 + isOverridable: 0 + isExplicitlyReferenced: 0 + validateReferences: 1 + platformData: + - first: + Any: + second: + enabled: 0 + settings: {} + - first: + Editor: Editor + second: + enabled: 0 + settings: + DefaultValueInitialized: true + - first: + iPhone: iOS + second: + enabled: 1 + settings: + AddToEmbeddedBinaries: false + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/HCMiniSdk/Third/ta/Plugins/iOS/ThinkingSDK/Source/EventTracker/EventModel/UserProperty/TAUserEventUnset.h b/Assets/HCMiniSdk/Third/ta/Plugins/iOS/ThinkingSDK/Source/EventTracker/EventModel/UserProperty/TAUserEventUnset.h new file mode 100755 index 00000000..96d53af5 --- /dev/null +++ b/Assets/HCMiniSdk/Third/ta/Plugins/iOS/ThinkingSDK/Source/EventTracker/EventModel/UserProperty/TAUserEventUnset.h @@ -0,0 +1,16 @@ +// +// TAUserEventUnset.h +// ThinkingSDK +// +// Created by Yangxiongon 2022/7/1. +// + +#import "TAUserEvent.h" + +NS_ASSUME_NONNULL_BEGIN + +@interface TAUserEventUnset : TAUserEvent + +@end + +NS_ASSUME_NONNULL_END diff --git a/Assets/HCMiniSdk/Third/ta/Plugins/iOS/ThinkingSDK/Source/EventTracker/EventModel/UserProperty/TAUserEventUnset.h.meta b/Assets/HCMiniSdk/Third/ta/Plugins/iOS/ThinkingSDK/Source/EventTracker/EventModel/UserProperty/TAUserEventUnset.h.meta new file mode 100644 index 00000000..03ca1ff4 --- /dev/null +++ b/Assets/HCMiniSdk/Third/ta/Plugins/iOS/ThinkingSDK/Source/EventTracker/EventModel/UserProperty/TAUserEventUnset.h.meta @@ -0,0 +1,33 @@ +fileFormatVersion: 2 +guid: b276d1b9195c1498f9615409add7122a +PluginImporter: + externalObjects: {} + serializedVersion: 2 + iconMap: {} + executionOrder: {} + defineConstraints: [] + isPreloaded: 0 + isOverridable: 0 + isExplicitlyReferenced: 0 + validateReferences: 1 + platformData: + - first: + Any: + second: + enabled: 0 + settings: {} + - first: + Editor: Editor + second: + enabled: 0 + settings: + DefaultValueInitialized: true + - first: + iPhone: iOS + second: + enabled: 1 + settings: + AddToEmbeddedBinaries: false + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/HCMiniSdk/Third/ta/Plugins/iOS/ThinkingSDK/Source/EventTracker/EventModel/UserProperty/TAUserEventUnset.m b/Assets/HCMiniSdk/Third/ta/Plugins/iOS/ThinkingSDK/Source/EventTracker/EventModel/UserProperty/TAUserEventUnset.m new file mode 100755 index 00000000..2759d7ef --- /dev/null +++ b/Assets/HCMiniSdk/Third/ta/Plugins/iOS/ThinkingSDK/Source/EventTracker/EventModel/UserProperty/TAUserEventUnset.m @@ -0,0 +1,19 @@ +// +// TAUserEventUnset.m +// ThinkingSDK +// +// Created by Yangxiongon 2022/7/1. +// + +#import "TAUserEventUnset.h" + +@implementation TAUserEventUnset + +- (instancetype)init { + if (self = [super init]) { + self.eventType = TAEventTypeUserUnset; + } + return self; +} + +@end diff --git a/Assets/HCMiniSdk/Third/ta/Plugins/iOS/ThinkingSDK/Source/EventTracker/EventModel/UserProperty/TAUserEventUnset.m.meta b/Assets/HCMiniSdk/Third/ta/Plugins/iOS/ThinkingSDK/Source/EventTracker/EventModel/UserProperty/TAUserEventUnset.m.meta new file mode 100644 index 00000000..814fc492 --- /dev/null +++ b/Assets/HCMiniSdk/Third/ta/Plugins/iOS/ThinkingSDK/Source/EventTracker/EventModel/UserProperty/TAUserEventUnset.m.meta @@ -0,0 +1,33 @@ +fileFormatVersion: 2 +guid: 917f84afb38a248608ac6ec0f19af424 +PluginImporter: + externalObjects: {} + serializedVersion: 2 + iconMap: {} + executionOrder: {} + defineConstraints: [] + isPreloaded: 0 + isOverridable: 0 + isExplicitlyReferenced: 0 + validateReferences: 1 + platformData: + - first: + Any: + second: + enabled: 0 + settings: {} + - first: + Editor: Editor + second: + enabled: 0 + settings: + DefaultValueInitialized: true + - first: + iPhone: iOS + second: + enabled: 1 + settings: + AddToEmbeddedBinaries: false + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/HCMiniSdk/Third/ta/Plugins/iOS/ThinkingSDK/Source/EventTracker/EventModel/UserProperty/TAUserPropertyHeader.h b/Assets/HCMiniSdk/Third/ta/Plugins/iOS/ThinkingSDK/Source/EventTracker/EventModel/UserProperty/TAUserPropertyHeader.h new file mode 100755 index 00000000..834297a3 --- /dev/null +++ b/Assets/HCMiniSdk/Third/ta/Plugins/iOS/ThinkingSDK/Source/EventTracker/EventModel/UserProperty/TAUserPropertyHeader.h @@ -0,0 +1,19 @@ +// +// TAUserPropertyHeader.h +// ThinkingSDK +// +// Created by Yangxiongon 2022/7/1. +// + +#ifndef TAUserPropertyHeader_h +#define TAUserPropertyHeader_h + +#import "TAUserEventSet.h" +#import "TAUserEventSetOnce.h" +#import "TAUserEventUnset.h" +#import "TAUserEventAdd.h" +#import "TAUserEventDelete.h" +#import "TAUserEventAppend.h" +#import "TAUserEventUniqueAppend.h" + +#endif /* TAUserPropertyHeader_h */ diff --git a/Assets/HCMiniSdk/Third/ta/Plugins/iOS/ThinkingSDK/Source/EventTracker/EventModel/UserProperty/TAUserPropertyHeader.h.meta b/Assets/HCMiniSdk/Third/ta/Plugins/iOS/ThinkingSDK/Source/EventTracker/EventModel/UserProperty/TAUserPropertyHeader.h.meta new file mode 100644 index 00000000..c4544d1d --- /dev/null +++ b/Assets/HCMiniSdk/Third/ta/Plugins/iOS/ThinkingSDK/Source/EventTracker/EventModel/UserProperty/TAUserPropertyHeader.h.meta @@ -0,0 +1,33 @@ +fileFormatVersion: 2 +guid: a0230193383d24011898afe96990fd43 +PluginImporter: + externalObjects: {} + serializedVersion: 2 + iconMap: {} + executionOrder: {} + defineConstraints: [] + isPreloaded: 0 + isOverridable: 0 + isExplicitlyReferenced: 0 + validateReferences: 1 + platformData: + - first: + Any: + second: + enabled: 0 + settings: {} + - first: + Editor: Editor + second: + enabled: 0 + settings: + DefaultValueInitialized: true + - first: + iPhone: iOS + second: + enabled: 1 + settings: + AddToEmbeddedBinaries: false + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/HCMiniSdk/Third/ta/Plugins/iOS/ThinkingSDK/Source/EventTracker/Property.meta b/Assets/HCMiniSdk/Third/ta/Plugins/iOS/ThinkingSDK/Source/EventTracker/Property.meta new file mode 100644 index 00000000..28ccda07 --- /dev/null +++ b/Assets/HCMiniSdk/Third/ta/Plugins/iOS/ThinkingSDK/Source/EventTracker/Property.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: cf30d3548fdac432aaf17971e80d083b +folderAsset: yes +DefaultImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/HCMiniSdk/Third/ta/Plugins/iOS/ThinkingSDK/Source/EventTracker/Property/PresetProperty.meta b/Assets/HCMiniSdk/Third/ta/Plugins/iOS/ThinkingSDK/Source/EventTracker/Property/PresetProperty.meta new file mode 100644 index 00000000..6e48c983 --- /dev/null +++ b/Assets/HCMiniSdk/Third/ta/Plugins/iOS/ThinkingSDK/Source/EventTracker/Property/PresetProperty.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: a37190c86233d46558da005d8fe126d9 +folderAsset: yes +DefaultImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/HCMiniSdk/Third/ta/Plugins/iOS/ThinkingSDK/Source/EventTracker/Property/PresetProperty/TDPresetProperties+TDDisProperties.h b/Assets/HCMiniSdk/Third/ta/Plugins/iOS/ThinkingSDK/Source/EventTracker/Property/PresetProperty/TDPresetProperties+TDDisProperties.h new file mode 100755 index 00000000..a2ee5cb9 --- /dev/null +++ b/Assets/HCMiniSdk/Third/ta/Plugins/iOS/ThinkingSDK/Source/EventTracker/Property/PresetProperty/TDPresetProperties+TDDisProperties.h @@ -0,0 +1,72 @@ +// +// TDPresetProperties+TDDisProperties.h +// ThinkingSDK +// +// Created by wwango on 2021/12/7. +// 不能使用的 + +#if __has_include() +#import +#else +#import "TDPresetProperties.h" +#endif + +NS_ASSUME_NONNULL_BEGIN + +@interface TDPresetProperties (TDDisProperties) + +// - 禁用功能并过滤字段拼接 + +@property(class, nonatomic, readonly) BOOL disableOpsReceiptProperties; +@property(class, nonatomic, readonly) BOOL disableStartReason; +@property(class, nonatomic, readonly) BOOL disableDisk; +@property(class, nonatomic, readonly) BOOL disableRAM; +@property(class, nonatomic, readonly) BOOL disableFPS; +@property(class, nonatomic, readonly) BOOL disableSimulator; +@property(class, nonatomic, readonly) BOOL disableAppVersion; +@property(class, nonatomic, readonly) BOOL disableOsVersion; +@property(class, nonatomic, readonly) BOOL disableManufacturer; +@property(class, nonatomic, readonly) BOOL disableDeviceModel; +@property(class, nonatomic, readonly) BOOL disableScreenHeight; +@property(class, nonatomic, readonly) BOOL disableScreenWidth; +@property(class, nonatomic, readonly) BOOL disableCarrier; +@property(class, nonatomic, readonly) BOOL disableDeviceId; +@property(class, nonatomic, readonly) BOOL disableSystemLanguage; +@property(class, nonatomic, readonly) BOOL disableLib; +@property(class, nonatomic, readonly) BOOL disableLibVersion; +@property(class, nonatomic, readonly) BOOL disableBundleId; +@property(class, nonatomic, readonly) BOOL disableOs; +@property(class, nonatomic, readonly) BOOL disableInstallTime; +@property(class, nonatomic, readonly) BOOL disableDeviceType; +@property(class, nonatomic, readonly) BOOL disableSessionID; +@property(class, nonatomic, readonly) BOOL disableCalibratedTime; + + +// - 只过滤字段 +@property(class, nonatomic, readonly) BOOL disableNetworkType; +@property(class, nonatomic, readonly) BOOL disableZoneOffset; +@property(class, nonatomic, readonly) BOOL disableDuration; +@property(class, nonatomic, readonly) BOOL disableBackgroundDuration; +@property(class, nonatomic, readonly) BOOL disableAppCrashedReason; +@property(class, nonatomic, readonly) BOOL disableResumeFromBackground; +@property(class, nonatomic, readonly) BOOL disableElementId; +@property(class, nonatomic, readonly) BOOL disableElementType; +@property(class, nonatomic, readonly) BOOL disableElementContent; +@property(class, nonatomic, readonly) BOOL disableElementPosition; +@property(class, nonatomic, readonly) BOOL disableElementSelector; +@property(class, nonatomic, readonly) BOOL disableScreenName; +@property(class, nonatomic, readonly) BOOL disableTitle; +@property(class, nonatomic, readonly) BOOL disableUrl; +@property(class, nonatomic, readonly) BOOL disableReferrer; + + +/// 需要过滤的预置属性 ++ (NSArray*)disPresetProperties; + +/// 过滤预置属性 +/// @param dataDic 外层property ++ (void)handleFilterDisPresetProperties:(NSMutableDictionary *)dataDic; + +@end + +NS_ASSUME_NONNULL_END diff --git a/Assets/HCMiniSdk/Third/ta/Plugins/iOS/ThinkingSDK/Source/EventTracker/Property/PresetProperty/TDPresetProperties+TDDisProperties.h.meta b/Assets/HCMiniSdk/Third/ta/Plugins/iOS/ThinkingSDK/Source/EventTracker/Property/PresetProperty/TDPresetProperties+TDDisProperties.h.meta new file mode 100644 index 00000000..630d4fb9 --- /dev/null +++ b/Assets/HCMiniSdk/Third/ta/Plugins/iOS/ThinkingSDK/Source/EventTracker/Property/PresetProperty/TDPresetProperties+TDDisProperties.h.meta @@ -0,0 +1,33 @@ +fileFormatVersion: 2 +guid: 948207637a8ac4e9ba05b56e08215cab +PluginImporter: + externalObjects: {} + serializedVersion: 2 + iconMap: {} + executionOrder: {} + defineConstraints: [] + isPreloaded: 0 + isOverridable: 0 + isExplicitlyReferenced: 0 + validateReferences: 1 + platformData: + - first: + Any: + second: + enabled: 0 + settings: {} + - first: + Editor: Editor + second: + enabled: 0 + settings: + DefaultValueInitialized: true + - first: + iPhone: iOS + second: + enabled: 1 + settings: + AddToEmbeddedBinaries: false + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/HCMiniSdk/Third/ta/Plugins/iOS/ThinkingSDK/Source/EventTracker/Property/PresetProperty/TDPresetProperties+TDDisProperties.m b/Assets/HCMiniSdk/Third/ta/Plugins/iOS/ThinkingSDK/Source/EventTracker/Property/PresetProperty/TDPresetProperties+TDDisProperties.m new file mode 100755 index 00000000..be8a3619 --- /dev/null +++ b/Assets/HCMiniSdk/Third/ta/Plugins/iOS/ThinkingSDK/Source/EventTracker/Property/PresetProperty/TDPresetProperties+TDDisProperties.m @@ -0,0 +1,342 @@ +// +// TDPresetProperties+TDDisProperties.m +// ThinkingSDK +// +// Created by wwango on 2021/12/7. +// + +#import "TDPresetProperties+TDDisProperties.h" + +static BOOL _td_disableOpsReceiptProperties; +static BOOL _td_disableStartReason; +static BOOL _td_disableDisk; +static BOOL _td_disableRAM; +static BOOL _td_disableFPS; +static BOOL _td_disableSimulator; +static BOOL _td_disableAppVersion; +static BOOL _td_disableOsVersion; +static BOOL _td_disableManufacturer; +static BOOL _td_disableDeviceModel; +static BOOL _td_disableScreenHeight; +static BOOL _td_disableScreenWidth; +static BOOL _td_disableCarrier; +static BOOL _td_disableDeviceId; +static BOOL _td_disableSystemLanguage; +static BOOL _td_disableLib; +static BOOL _td_disableLibVersion; +static BOOL _td_disableBundleId; +static BOOL _td_disableOs; +static BOOL _td_disableInstallTime; +static BOOL _td_disableDeviceType; +static BOOL _td_disableSessionID; +static BOOL _td_disableCalibratedTime; + +static BOOL _td_disableNetworkType; +static BOOL _td_disableZoneOffset; +static BOOL _td_disableDuration; +static BOOL _td_disableBackgroundDuration; +static BOOL _td_disableAppCrashedReason; +static BOOL _td_disableResumeFromBackground; +static BOOL _td_disableElementId; +static BOOL _td_disableElementType; +static BOOL _td_disableElementContent; +static BOOL _td_disableElementPosition; +static BOOL _td_disableElementSelector; +static BOOL _td_disableScreenName; +static BOOL _td_disableTitle; +static BOOL _td_disableUrl; +static BOOL _td_disableReferrer; + + +// 推送事件名 +static const NSString *kTDPushInfo = @"ops_push_click"; + +// - 禁用功能并过滤字段拼接 +static const NSString *kTDStartReason = @"#start_reason"; +static const NSString *kTDPerformanceRAM = @"#ram"; +static const NSString *kTDPerformanceDISK = @"#disk"; +static const NSString *kTDPerformanceSIM = @"#simulator"; +static const NSString *kTDPerformanceFPS = @"#fps"; +static const NSString *kTDPresentAppVersion = @"#app_version"; +static const NSString *kTDPresentOsVersion = @"#os_version"; +static const NSString *kTDPresentManufacturer = @"#manufacturer"; +static const NSString *kTDPresentDeviceModel = @"#device_model"; +static const NSString *kTDPresentScreenHeight = @"#screen_height"; +static const NSString *kTDPresentScreenWidth = @"#screen_width"; +static const NSString *kTDPresentCarrier = @"#carrier"; +static const NSString *kTDPresentDeviceId = @"#device_id"; +static const NSString *kTDPresentSystemLanguage = @"#system_language"; +static const NSString *kTDPresentLib = @"#lib"; +static const NSString *kTDPresentLibVersion = @"#lib_version"; +static const NSString *kTDPresentOs = @"#os"; +static const NSString *kTDPresentBundleId = @"#bundle_id"; +static const NSString *kTDPresentInstallTime = @"#install_time"; +static const NSString *kTDPresentDeviceType = @"#device_type"; +static const NSString *kTDPresentSessionID = @"#session_id"; +static const NSString *kTDPresentCalibratedTime = @"#time_calibration"; + + +// - 只过滤字段 +static const NSString *kTDPresentNETWORKTYPE = @"#network_type"; +static const NSString *kTDPresentZONEOFFSET = @"#zone_offset"; +static const NSString *kTDPresentDURATION = @"#duration"; +static const NSString *kTDPresentBACKGROUNDDURATION = @"#background_duration"; +static const NSString *kTDPresentCRASHREASON = @"#app_crashed_reason"; +static const NSString *kTDPresentRESUMEFROMBACKGROUND = @"#resume_from_background"; +static const NSString *kTDPresentELEMENTID = @"#element_id"; +static const NSString *kTDPresentELEMENTTYPE = @"#element_type"; +static const NSString *kTDPresentELEMENTCONTENT = @"#element_content"; +static const NSString *kTDPresentELEMENTPOSITION = @"#element_position"; +static const NSString *kTDPresentELEMENTSELECTOR = @"#element_selector"; +static const NSString *kTDPresentSCREENNAME = @"#screen_name"; +static const NSString *kTDPresentTITLE = @"#title"; +static const NSString *kTDPresentURL = @"#url"; +static const NSString *kTDPresentREFERRER = @"#referrer"; +static const NSString *kTDPresentOpsReceiptProperties = @"#ops_receipt_properties"; + + + +#define TD_MAIM_INFO_PLIST_DISPRESTPRO_KEY @"TDDisPresetProperties" + +@implementation TDPresetProperties (TDDisProperties) + +static NSMutableArray *__td_disPresetProperties; + ++ (NSArray*)disPresetProperties { + static dispatch_once_t onceToken; + dispatch_once(&onceToken, ^{ + + NSArray *disPresetProperties = (NSArray *)[[[NSBundle mainBundle] infoDictionary] objectForKey:TD_MAIM_INFO_PLIST_DISPRESTPRO_KEY]; + + if (disPresetProperties && disPresetProperties.count) { + __td_disPresetProperties = [NSMutableArray arrayWithArray:disPresetProperties]; + + if ([__td_disPresetProperties containsObject:kTDPresentZONEOFFSET]) { + [__td_disPresetProperties removeObject:kTDPresentZONEOFFSET]; + } + + _td_disableStartReason = [__td_disPresetProperties containsObject:kTDStartReason]; + _td_disableDisk = [__td_disPresetProperties containsObject:kTDPerformanceDISK]; + _td_disableRAM = [__td_disPresetProperties containsObject:kTDPerformanceRAM]; + _td_disableFPS = [__td_disPresetProperties containsObject:kTDPerformanceFPS]; + _td_disableSimulator = [__td_disPresetProperties containsObject:kTDPerformanceSIM]; + + _td_disableAppVersion = [__td_disPresetProperties containsObject:kTDPresentAppVersion]; + _td_disableOsVersion = [__td_disPresetProperties containsObject:kTDPresentOsVersion]; + _td_disableManufacturer = [__td_disPresetProperties containsObject:kTDPresentManufacturer]; + _td_disableDeviceModel = [__td_disPresetProperties containsObject:kTDPresentDeviceModel]; + _td_disableScreenHeight = [__td_disPresetProperties containsObject:kTDPresentScreenHeight]; + _td_disableScreenWidth = [__td_disPresetProperties containsObject:kTDPresentScreenWidth]; + _td_disableCarrier = [__td_disPresetProperties containsObject:kTDPresentCarrier]; + _td_disableDeviceId = [__td_disPresetProperties containsObject:kTDPresentDeviceId]; + _td_disableSystemLanguage = [__td_disPresetProperties containsObject:kTDPresentSystemLanguage]; + _td_disableLib = [__td_disPresetProperties containsObject:kTDPresentLib]; + _td_disableLibVersion = [__td_disPresetProperties containsObject:kTDPresentLibVersion]; + _td_disableBundleId = [__td_disPresetProperties containsObject:kTDPresentBundleId]; + _td_disableOs = [__td_disPresetProperties containsObject:kTDPresentOs]; + _td_disableInstallTime = [__td_disPresetProperties containsObject:kTDPresentInstallTime]; + _td_disableDeviceType = [__td_disPresetProperties containsObject:kTDPresentDeviceType]; + //_td_disableSessionID = [__td_disPresetProperties containsObject:kTDPresentSessionID]; + //_td_disableCalibratedTime = [__td_disPresetProperties containsObject:kTDPresentCalibratedTime]; + _td_disableSessionID = YES; + _td_disableCalibratedTime = YES; + + + _td_disableNetworkType = [__td_disPresetProperties containsObject:kTDPresentNETWORKTYPE]; + _td_disableZoneOffset = [__td_disPresetProperties containsObject:kTDPresentZONEOFFSET]; + _td_disableDuration = [__td_disPresetProperties containsObject:kTDPresentDURATION]; + _td_disableBackgroundDuration = [__td_disPresetProperties containsObject:kTDPresentBACKGROUNDDURATION]; + _td_disableAppCrashedReason = [__td_disPresetProperties containsObject:kTDPresentCRASHREASON]; + _td_disableResumeFromBackground = [__td_disPresetProperties containsObject:kTDPresentRESUMEFROMBACKGROUND]; + _td_disableElementId = [__td_disPresetProperties containsObject:kTDPresentELEMENTID]; + _td_disableElementType = [__td_disPresetProperties containsObject:kTDPresentELEMENTTYPE]; + _td_disableElementContent = [__td_disPresetProperties containsObject:kTDPresentELEMENTCONTENT]; + _td_disableElementPosition = [__td_disPresetProperties containsObject:kTDPresentELEMENTPOSITION]; + _td_disableElementSelector = [__td_disPresetProperties containsObject:kTDPresentELEMENTSELECTOR]; + _td_disableScreenName = [__td_disPresetProperties containsObject:kTDPresentSCREENNAME]; + _td_disableTitle = [__td_disPresetProperties containsObject:kTDPresentTITLE]; + _td_disableUrl = [__td_disPresetProperties containsObject:kTDPresentURL]; + _td_disableReferrer = [__td_disPresetProperties containsObject:kTDPresentREFERRER]; + _td_disableOpsReceiptProperties = [__td_disPresetProperties containsObject:kTDPresentOpsReceiptProperties]; + + + } + }); + return __td_disPresetProperties; +} + + ++ (void)handleFilterDisPresetProperties:(NSMutableDictionary *)dataDic +{ + if (!__td_disPresetProperties || !__td_disPresetProperties.count) { + return ; + } + NSArray *propertykeys = dataDic.allKeys; + NSArray *registerkeys = [TDPresetProperties disPresetProperties]; + NSMutableSet *set1 = [NSMutableSet setWithArray:propertykeys]; + NSMutableSet *set2 = [NSMutableSet setWithArray:registerkeys]; + [set1 intersectSet:set2];// 求交集 + if (!set1.allObjects.count) { + return ; + } + [dataDic removeObjectsForKeys:set1.allObjects]; + return ; +} + + ++ (BOOL)disableOpsReceiptProperties { + return _td_disableOpsReceiptProperties; +} + ++ (BOOL)disableStartReason { + return _td_disableStartReason; +} + ++ (BOOL)disableDisk { + return _td_disableDisk; +} + ++ (BOOL)disableRAM { + return _td_disableRAM; +} + ++ (BOOL)disableFPS { + return _td_disableFPS; +} + ++ (BOOL)disableSimulator { + return _td_disableSimulator; +} + + + + ++ (BOOL)disableAppVersion { + return _td_disableAppVersion; +} + ++ (BOOL)disableOsVersion { + return _td_disableOsVersion; +} + ++ (BOOL)disableManufacturer { + return _td_disableManufacturer; +} + ++ (BOOL)disableDeviceId { + return _td_disableDeviceId; +} + ++ (BOOL)disableDeviceModel { + return _td_disableDeviceModel; +} + ++ (BOOL)disableScreenHeight { + return _td_disableScreenHeight; +} + ++ (BOOL)disableScreenWidth { + return _td_disableScreenWidth; +} + ++ (BOOL)disableCarrier { + return _td_disableCarrier; +} + ++ (BOOL)disableSystemLanguage { + return _td_disableSystemLanguage; +} + ++ (BOOL)disableLib { + return _td_disableLib; +} + ++ (BOOL)disableLibVersion { + return _td_disableLibVersion; +} + ++ (BOOL)disableOs { + return _td_disableOs; +} + ++ (BOOL)disableBundleId { + return _td_disableBundleId; +} + ++ (BOOL)disableInstallTime { + return _td_disableInstallTime; +} + ++ (BOOL)disableDeviceType { + return _td_disableDeviceType; +} + ++ (BOOL)disableNetworkType { + return _td_disableNetworkType; +} + ++ (BOOL)disableZoneOffset { + return _td_disableZoneOffset; +} + ++ (BOOL)disableDuration { + return _td_disableDuration; +} + ++ (BOOL)disableBackgroundDuration { + return _td_disableBackgroundDuration; +} + ++ (BOOL)disableAppCrashedReason { + return _td_disableAppCrashedReason; +} + ++ (BOOL)disableResumeFromBackground { + return _td_disableResumeFromBackground; +} + ++ (BOOL)disableElementId { + return _td_disableElementId; +} + ++ (BOOL)disableElementType { + return _td_disableElementType; +} + ++ (BOOL)disableElementContent { + return _td_disableElementContent; +} + ++ (BOOL)disableElementPosition { + return _td_disableElementPosition; +} + ++ (BOOL)disableElementSelector { + return _td_disableElementSelector; +} + ++ (BOOL)disableScreenName { + return _td_disableScreenName; +} + ++ (BOOL)disableTitle { + return _td_disableTitle; +} + ++ (BOOL)disableUrl { + return _td_disableUrl; +} + ++ (BOOL)disableReferrer { + return _td_disableReferrer; +} + ++ (BOOL)disableSessionID { + return _td_disableSessionID; +} + ++ (BOOL)disableCalibratedTime { + return _td_disableCalibratedTime; +} + +@end diff --git a/Assets/HCMiniSdk/Third/ta/Plugins/iOS/ThinkingSDK/Source/EventTracker/Property/PresetProperty/TDPresetProperties+TDDisProperties.m.meta b/Assets/HCMiniSdk/Third/ta/Plugins/iOS/ThinkingSDK/Source/EventTracker/Property/PresetProperty/TDPresetProperties+TDDisProperties.m.meta new file mode 100644 index 00000000..2d05eb26 --- /dev/null +++ b/Assets/HCMiniSdk/Third/ta/Plugins/iOS/ThinkingSDK/Source/EventTracker/Property/PresetProperty/TDPresetProperties+TDDisProperties.m.meta @@ -0,0 +1,33 @@ +fileFormatVersion: 2 +guid: 4bbcb9181bc0c477f8397c31a0846c62 +PluginImporter: + externalObjects: {} + serializedVersion: 2 + iconMap: {} + executionOrder: {} + defineConstraints: [] + isPreloaded: 0 + isOverridable: 0 + isExplicitlyReferenced: 0 + validateReferences: 1 + platformData: + - first: + Any: + second: + enabled: 0 + settings: {} + - first: + Editor: Editor + second: + enabled: 0 + settings: + DefaultValueInitialized: true + - first: + iPhone: iOS + second: + enabled: 1 + settings: + AddToEmbeddedBinaries: false + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/HCMiniSdk/Third/ta/Plugins/iOS/ThinkingSDK/Source/EventTracker/Property/PresetProperty/TDPresetProperties.h b/Assets/HCMiniSdk/Third/ta/Plugins/iOS/ThinkingSDK/Source/EventTracker/Property/PresetProperty/TDPresetProperties.h new file mode 100755 index 00000000..0848f23d --- /dev/null +++ b/Assets/HCMiniSdk/Third/ta/Plugins/iOS/ThinkingSDK/Source/EventTracker/Property/PresetProperty/TDPresetProperties.h @@ -0,0 +1,36 @@ +// +// TDPresetProperties.h +// ThinkingSDK +// +// Created by huangdiao on 2021/5/25. +// Copyright © 2021 thinkingdata. All rights reserved. +// + +#import + +NS_ASSUME_NONNULL_BEGIN + +@interface TDPresetProperties : NSObject + +@property (nonatomic, copy, readonly) NSString *bundle_id; +@property (nonatomic, copy, readonly) NSString *carrier; +@property (nonatomic, copy, readonly) NSString *device_id; +@property (nonatomic, copy, readonly) NSString *device_model; +@property (nonatomic, copy, readonly) NSString *manufacturer; +@property (nonatomic, copy, readonly) NSString *network_type; +@property (nonatomic, copy, readonly) NSString *os; +@property (nonatomic, copy, readonly) NSString *os_version; +@property (nonatomic, copy, readonly) NSNumber *screen_height; +@property (nonatomic, copy, readonly) NSNumber *screen_width; +@property (nonatomic, copy, readonly) NSString *system_language; +@property (nonatomic, copy, readonly) NSNumber *zone_offset; +@property (nonatomic, copy, readonly) NSString *install_time; + +/** + * The key of the returned event preset property starts with "#", and it is not recommended to use it directly as the property of the event + */ +- (NSDictionary *)toEventPresetProperties; + +@end + +NS_ASSUME_NONNULL_END diff --git a/Assets/HCMiniSdk/Third/ta/Plugins/iOS/ThinkingSDK/Source/EventTracker/Property/PresetProperty/TDPresetProperties.h.meta b/Assets/HCMiniSdk/Third/ta/Plugins/iOS/ThinkingSDK/Source/EventTracker/Property/PresetProperty/TDPresetProperties.h.meta new file mode 100644 index 00000000..855f2acd --- /dev/null +++ b/Assets/HCMiniSdk/Third/ta/Plugins/iOS/ThinkingSDK/Source/EventTracker/Property/PresetProperty/TDPresetProperties.h.meta @@ -0,0 +1,33 @@ +fileFormatVersion: 2 +guid: 83cf78232b10643d8991295f5c525a16 +PluginImporter: + externalObjects: {} + serializedVersion: 2 + iconMap: {} + executionOrder: {} + defineConstraints: [] + isPreloaded: 0 + isOverridable: 0 + isExplicitlyReferenced: 0 + validateReferences: 1 + platformData: + - first: + Any: + second: + enabled: 0 + settings: {} + - first: + Editor: Editor + second: + enabled: 0 + settings: + DefaultValueInitialized: true + - first: + iPhone: iOS + second: + enabled: 1 + settings: + AddToEmbeddedBinaries: false + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/HCMiniSdk/Third/ta/Plugins/iOS/ThinkingSDK/Source/EventTracker/Property/PresetProperty/TDPresetProperties.m b/Assets/HCMiniSdk/Third/ta/Plugins/iOS/ThinkingSDK/Source/EventTracker/Property/PresetProperty/TDPresetProperties.m new file mode 100755 index 00000000..c15cf884 --- /dev/null +++ b/Assets/HCMiniSdk/Third/ta/Plugins/iOS/ThinkingSDK/Source/EventTracker/Property/PresetProperty/TDPresetProperties.m @@ -0,0 +1,88 @@ +// +// TDPresetProperties.m +// ThinkingSDK +// +// Created by huangdiao on 2021/5/25. +// Copyright © 2021 thinkingdata. All rights reserved. +// + +#import "TDPresetProperties.h" +#import "TDPresetProperties+TDDisProperties.h" + +@interface TDPresetProperties () + +@property (nonatomic, copy, readwrite) NSString *bundle_id; +@property (nonatomic, copy, readwrite) NSString *carrier; +@property (nonatomic, copy, readwrite) NSString *device_id; +@property (nonatomic, copy, readwrite) NSString *device_model; +@property (nonatomic, copy, readwrite) NSString *manufacturer; +@property (nonatomic, copy, readwrite) NSString *network_type; +@property (nonatomic, copy, readwrite) NSString *os; +@property (nonatomic, copy, readwrite) NSString *os_version; +@property (nonatomic, copy, readwrite) NSNumber *screen_height; +@property (nonatomic, copy, readwrite) NSNumber *screen_width; +@property (nonatomic, copy, readwrite) NSString *system_language; +@property (nonatomic, copy, readwrite) NSNumber *zone_offset; +@property (nonatomic, copy, readwrite) NSString *install_time; + +@property (nonatomic, copy) NSDictionary *presetProperties; + +@end + +@implementation TDPresetProperties + +- (instancetype)initWithDictionary:(NSDictionary *)dict { + self = [super init]; + if (self) { + [self updateValuesWithDictionary:dict]; + } + return self; +} + + + +- (void)updateValuesWithDictionary:(NSDictionary *)dict { + _bundle_id = dict[@"#bundle_id"]?:@""; + _carrier = dict[@"#carrier"]?:@""; + _device_id = dict[@"#device_id"]?:@""; + _device_model = dict[@"#device_model"]?:@""; + _manufacturer = dict[@"#manufacturer"]?:@""; + _network_type = dict[@"#network_type"]?:@""; + _os = dict[@"#os"]?:@""; + _os_version = dict[@"#os_version"]?:@""; + _screen_height = dict[@"#screen_height"]?:@(0); + _screen_width = dict[@"#screen_width"]?:@(0); + _system_language = dict[@"#system_language"]?:@""; + _zone_offset = dict[@"#zone_offset"]?:@(0); + _install_time = dict[@"#install_time"]?:@""; + + _presetProperties = [NSDictionary dictionaryWithDictionary:dict]; + + NSMutableDictionary *updateProperties = [_presetProperties mutableCopy]; + NSArray *propertykeys = updateProperties.allKeys; + NSArray *registerkeys = [TDPresetProperties disPresetProperties]; + NSMutableSet *set1 = [NSMutableSet setWithArray:propertykeys]; + NSMutableSet *set2 = [NSMutableSet setWithArray:registerkeys]; + [set1 intersectSet:set2]; + if (set1.allObjects.count) { + [updateProperties removeObjectsForKeys:set1.allObjects]; + } + + if ([updateProperties.allKeys containsObject:@"#lib"]) { + [updateProperties removeObjectForKey:@"#lib"]; + } + if ([updateProperties.allKeys containsObject:@"#lib_version"]) { + [updateProperties removeObjectForKey:@"#lib_version"]; + } + if ([updateProperties.allKeys containsObject:@"#time_calibration"]) { + [updateProperties removeObjectForKey:@"#time_calibration"]; + } + + _presetProperties = updateProperties; +} + +- (NSDictionary *)toEventPresetProperties { + return [_presetProperties copy]; +} + +@end diff --git a/Assets/HCMiniSdk/Third/ta/Plugins/iOS/ThinkingSDK/Source/EventTracker/Property/PresetProperty/TDPresetProperties.m.meta b/Assets/HCMiniSdk/Third/ta/Plugins/iOS/ThinkingSDK/Source/EventTracker/Property/PresetProperty/TDPresetProperties.m.meta new file mode 100644 index 00000000..c10ac233 --- /dev/null +++ b/Assets/HCMiniSdk/Third/ta/Plugins/iOS/ThinkingSDK/Source/EventTracker/Property/PresetProperty/TDPresetProperties.m.meta @@ -0,0 +1,33 @@ +fileFormatVersion: 2 +guid: f018a983fe7734bc8bd84d772a0f0f06 +PluginImporter: + externalObjects: {} + serializedVersion: 2 + iconMap: {} + executionOrder: {} + defineConstraints: [] + isPreloaded: 0 + isOverridable: 0 + isExplicitlyReferenced: 0 + validateReferences: 1 + platformData: + - first: + Any: + second: + enabled: 0 + settings: {} + - first: + Editor: Editor + second: + enabled: 0 + settings: + DefaultValueInitialized: true + - first: + iPhone: iOS + second: + enabled: 1 + settings: + AddToEmbeddedBinaries: false + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/HCMiniSdk/Third/ta/Plugins/iOS/ThinkingSDK/Source/EventTracker/Property/PropertyPlugins.meta b/Assets/HCMiniSdk/Third/ta/Plugins/iOS/ThinkingSDK/Source/EventTracker/Property/PropertyPlugins.meta new file mode 100644 index 00000000..0ea69e6f --- /dev/null +++ b/Assets/HCMiniSdk/Third/ta/Plugins/iOS/ThinkingSDK/Source/EventTracker/Property/PropertyPlugins.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: 4410ea0e2817247de9eadf648fa01ac7 +folderAsset: yes +DefaultImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/HCMiniSdk/Third/ta/Plugins/iOS/ThinkingSDK/Source/EventTracker/Property/PropertyPlugins/TAPresetPropertyPlugin.h b/Assets/HCMiniSdk/Third/ta/Plugins/iOS/ThinkingSDK/Source/EventTracker/Property/PropertyPlugins/TAPresetPropertyPlugin.h new file mode 100755 index 00000000..9fc76db1 --- /dev/null +++ b/Assets/HCMiniSdk/Third/ta/Plugins/iOS/ThinkingSDK/Source/EventTracker/Property/PropertyPlugins/TAPresetPropertyPlugin.h @@ -0,0 +1,23 @@ +// +// TAPresetPropertyPlugin.h +// ThinkingSDK +// +// Created by Yangxiongon 2022/6/12. +// + +#if TARGET_OS_IOS +#import +#endif +#import "TAPropertyPluginManager.h" + +NS_ASSUME_NONNULL_BEGIN + +@interface TAPresetPropertyPlugin : NSObject + +@property(nonatomic, copy)NSString *instanceToken; + +@property (nonatomic, strong) NSTimeZone *defaultTimeZone; + +@end + +NS_ASSUME_NONNULL_END diff --git a/Assets/HCMiniSdk/Third/ta/Plugins/iOS/ThinkingSDK/Source/EventTracker/Property/PropertyPlugins/TAPresetPropertyPlugin.h.meta b/Assets/HCMiniSdk/Third/ta/Plugins/iOS/ThinkingSDK/Source/EventTracker/Property/PropertyPlugins/TAPresetPropertyPlugin.h.meta new file mode 100644 index 00000000..5fe313ac --- /dev/null +++ b/Assets/HCMiniSdk/Third/ta/Plugins/iOS/ThinkingSDK/Source/EventTracker/Property/PropertyPlugins/TAPresetPropertyPlugin.h.meta @@ -0,0 +1,33 @@ +fileFormatVersion: 2 +guid: 0c162e314458c40c59147d22a4765e6e +PluginImporter: + externalObjects: {} + serializedVersion: 2 + iconMap: {} + executionOrder: {} + defineConstraints: [] + isPreloaded: 0 + isOverridable: 0 + isExplicitlyReferenced: 0 + validateReferences: 1 + platformData: + - first: + Any: + second: + enabled: 0 + settings: {} + - first: + Editor: Editor + second: + enabled: 0 + settings: + DefaultValueInitialized: true + - first: + iPhone: iOS + second: + enabled: 1 + settings: + AddToEmbeddedBinaries: false + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/HCMiniSdk/Third/ta/Plugins/iOS/ThinkingSDK/Source/EventTracker/Property/PropertyPlugins/TAPresetPropertyPlugin.m b/Assets/HCMiniSdk/Third/ta/Plugins/iOS/ThinkingSDK/Source/EventTracker/Property/PropertyPlugins/TAPresetPropertyPlugin.m new file mode 100755 index 00000000..e2d7801c --- /dev/null +++ b/Assets/HCMiniSdk/Third/ta/Plugins/iOS/ThinkingSDK/Source/EventTracker/Property/PropertyPlugins/TAPresetPropertyPlugin.m @@ -0,0 +1,61 @@ +// +// TAPresetPropertyPlugin.m +// ThinkingSDK +// +// Created by Yangxiongon 2022/6/12. +// + +#import "TAPresetPropertyPlugin.h" +#import "TDPresetProperties.h" +#import "TDPresetProperties+TDDisProperties.h" +#import "TDDeviceInfo.h" +#import "TAReachability.h" +#import "NSDate+TAFormat.h" + +@interface TAPresetPropertyPlugin () +@property (nonatomic, strong) NSMutableDictionary *properties; + +@end + +@implementation TAPresetPropertyPlugin + +- (instancetype)init +{ + self = [super init]; + if (self) { + self.properties = [NSMutableDictionary dictionary]; + } + return self; +} + +- (void)start { + if (![TDPresetProperties disableAppVersion]) { + self.properties[@"#app_version"] = [TDDeviceInfo sharedManager].appVersion; + } + if (![TDPresetProperties disableBundleId]) { + self.properties[@"#bundle_id"] = [TDDeviceInfo bundleId]; + } + + if (![TDPresetProperties disableInstallTime]) { + NSString *timeString = [[TDDeviceInfo td_getInstallTime] ta_formatWithTimeZone:self.defaultTimeZone formatString: @"yyyy-MM-dd HH:mm:ss.SSS"]; + if (timeString && [timeString isKindOfClass:[NSString class]] && timeString.length){ + self.properties[@"#install_time"] = timeString; + } + } +} + +- (void)asyncGetPropertyCompletion:(TAPropertyPluginCompletion)completion { + NSMutableDictionary *mutableDict = [NSMutableDictionary dictionary]; + + [mutableDict addEntriesFromDictionary:[[TDDeviceInfo sharedManager] getAutomaticData]]; + + if (![TDPresetProperties disableNetworkType]) { + mutableDict[@"#network_type"] = [[TAReachability shareInstance] networkState]; + } + + if (completion) { + completion(mutableDict); + } +} + +@end diff --git a/Assets/HCMiniSdk/Third/ta/Plugins/iOS/ThinkingSDK/Source/EventTracker/Property/PropertyPlugins/TAPresetPropertyPlugin.m.meta b/Assets/HCMiniSdk/Third/ta/Plugins/iOS/ThinkingSDK/Source/EventTracker/Property/PropertyPlugins/TAPresetPropertyPlugin.m.meta new file mode 100644 index 00000000..f38b398e --- /dev/null +++ b/Assets/HCMiniSdk/Third/ta/Plugins/iOS/ThinkingSDK/Source/EventTracker/Property/PropertyPlugins/TAPresetPropertyPlugin.m.meta @@ -0,0 +1,33 @@ +fileFormatVersion: 2 +guid: 7771dc48ed0714574a33996e2c47d366 +PluginImporter: + externalObjects: {} + serializedVersion: 2 + iconMap: {} + executionOrder: {} + defineConstraints: [] + isPreloaded: 0 + isOverridable: 0 + isExplicitlyReferenced: 0 + validateReferences: 1 + platformData: + - first: + Any: + second: + enabled: 0 + settings: {} + - first: + Editor: Editor + second: + enabled: 0 + settings: + DefaultValueInitialized: true + - first: + iPhone: iOS + second: + enabled: 1 + settings: + AddToEmbeddedBinaries: false + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/HCMiniSdk/Third/ta/Plugins/iOS/ThinkingSDK/Source/EventTracker/Property/PropertyPlugins/TAPropertyPluginManager.h b/Assets/HCMiniSdk/Third/ta/Plugins/iOS/ThinkingSDK/Source/EventTracker/Property/PropertyPlugins/TAPropertyPluginManager.h new file mode 100755 index 00000000..31074803 --- /dev/null +++ b/Assets/HCMiniSdk/Third/ta/Plugins/iOS/ThinkingSDK/Source/EventTracker/Property/PropertyPlugins/TAPropertyPluginManager.h @@ -0,0 +1,42 @@ +// +// TAPropertyPluginManager.h +// ThinkingSDK +// +// Created by Yangxiongon 2022/6/12. +// + +#import +#import "TABaseEvent.h" + +NS_ASSUME_NONNULL_BEGIN + +typedef void(^TAPropertyPluginCompletion)(NSDictionary *properties); + +@protocol TAPropertyPluginProtocol + +@property(nonatomic, copy)NSString *instanceToken; + +- (NSDictionary *)properties; + +@optional + +- (void)start; + +- (TAEventType)eventTypeFilter; + +- (void)asyncGetPropertyCompletion:(TAPropertyPluginCompletion)completion; + +@end + + +@interface TAPropertyPluginManager : NSObject + +- (void)registerPropertyPlugin:(id)plugin; + +- (NSMutableDictionary *)currentPropertiesForPluginClasses:(NSArray *)classes; + +- (NSMutableDictionary *)propertiesWithEventType:(TAEventType)type; + +@end + +NS_ASSUME_NONNULL_END diff --git a/Assets/HCMiniSdk/Third/ta/Plugins/iOS/ThinkingSDK/Source/EventTracker/Property/PropertyPlugins/TAPropertyPluginManager.h.meta b/Assets/HCMiniSdk/Third/ta/Plugins/iOS/ThinkingSDK/Source/EventTracker/Property/PropertyPlugins/TAPropertyPluginManager.h.meta new file mode 100644 index 00000000..b8a8d890 --- /dev/null +++ b/Assets/HCMiniSdk/Third/ta/Plugins/iOS/ThinkingSDK/Source/EventTracker/Property/PropertyPlugins/TAPropertyPluginManager.h.meta @@ -0,0 +1,33 @@ +fileFormatVersion: 2 +guid: e708d3a6b2d3b456e8a6049df86d03b1 +PluginImporter: + externalObjects: {} + serializedVersion: 2 + iconMap: {} + executionOrder: {} + defineConstraints: [] + isPreloaded: 0 + isOverridable: 0 + isExplicitlyReferenced: 0 + validateReferences: 1 + platformData: + - first: + Any: + second: + enabled: 0 + settings: {} + - first: + Editor: Editor + second: + enabled: 0 + settings: + DefaultValueInitialized: true + - first: + iPhone: iOS + second: + enabled: 1 + settings: + AddToEmbeddedBinaries: false + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/HCMiniSdk/Third/ta/Plugins/iOS/ThinkingSDK/Source/EventTracker/Property/PropertyPlugins/TAPropertyPluginManager.m b/Assets/HCMiniSdk/Third/ta/Plugins/iOS/ThinkingSDK/Source/EventTracker/Property/PropertyPlugins/TAPropertyPluginManager.m new file mode 100755 index 00000000..77953504 --- /dev/null +++ b/Assets/HCMiniSdk/Third/ta/Plugins/iOS/ThinkingSDK/Source/EventTracker/Property/PropertyPlugins/TAPropertyPluginManager.m @@ -0,0 +1,127 @@ +// +// TAPropertyPluginManager.m +// ThinkingSDK +// +// Created by Yangxiongon 2022/6/12. +// + +#import "TAPropertyPluginManager.h" + +@interface TAPropertyPluginManager () +@property (nonatomic, strong) NSMutableArray> *plugins; + +@end + + +@implementation TAPropertyPluginManager + +//MARK: - Public Methods + +- (instancetype)init { + self = [super init]; + if (self) { + self.plugins = [NSMutableArray array]; + } + return self; +} + +- (void)registerPropertyPlugin:(id)plugin { + BOOL isResponds = [plugin respondsToSelector:@selector(properties)]; + NSAssert(isResponds, @"properties plugin must implement `- properties` method!"); + if (!isResponds) { + return; + } + + // delete old plugin + for (id object in self.plugins) { + if (object.class == plugin.class) { + [self.plugins removeObject:object]; + break; + } + } + [self.plugins addObject:plugin]; + + + if ([plugin respondsToSelector:@selector(start)]) { + [plugin start]; + } +} + +- (NSMutableDictionary *)currentPropertiesForPluginClasses:(NSArray *)classes { + NSArray *plugins = [self.plugins copy]; + NSMutableArray> *matchResult = [NSMutableArray array]; + + for (id obj in plugins) { + + for (Class cla in classes) { + if ([obj isKindOfClass:cla]) { + [matchResult addObject:obj]; + break; + } + } + } + + NSMutableDictionary *pluginProperties = [self propertiesWithPlugins:matchResult]; + + return pluginProperties; +} + +- (NSMutableDictionary *)propertiesWithEventType:(TAEventType)type { + + NSArray *plugins = [self.plugins copy]; + NSMutableArray> *matchResult = [NSMutableArray array]; + for (id obj in plugins) { + if ([self isMatchedWithPlugin:obj eventType:type]) { + [matchResult addObject:obj]; + } + } + return [self propertiesWithPlugins:matchResult]; +} + +//MARK: - Private Methods + +- (NSMutableDictionary *)propertiesWithPlugins:(NSArray> *)plugins { + NSMutableDictionary *properties = [NSMutableDictionary dictionary]; + + dispatch_semaphore_t semaphore; + for (id plugin in plugins) { + if ([plugin respondsToSelector:@selector(asyncGetPropertyCompletion:)]) { + + semaphore = dispatch_semaphore_create(0); + [plugin asyncGetPropertyCompletion:^(NSDictionary * _Nonnull dict) { + [properties addEntriesFromDictionary:dict]; + dispatch_semaphore_signal(semaphore); + }]; + } + + NSDictionary *pluginProperties = [plugin respondsToSelector:@selector(properties)] ? plugin.properties : nil; + if (pluginProperties) { + [properties addEntriesFromDictionary:pluginProperties]; + } + if (semaphore) { + + dispatch_semaphore_wait(semaphore, dispatch_time(DISPATCH_TIME_NOW, (int64_t)(0.5 * NSEC_PER_SEC))); + } + + semaphore = nil; + } + return properties; +} + +- (BOOL)isMatchedWithPlugin:(id)plugin eventType:(TAEventType)type { + TAEventType eventTypeFilter; + + if (![plugin respondsToSelector:@selector(eventTypeFilter)]) { + // If the plug-in does not implement the type filtering method, it will only be added for track type data by default, including the first event, updateable event, and rewritable event. In addition to user attribute events + eventTypeFilter = TAEventTypeTrack | TAEventTypeTrackFirst | TAEventTypeTrackUpdate | TAEventTypeTrackOverwrite; + } else { + eventTypeFilter = plugin.eventTypeFilter; + } + + if ((eventTypeFilter & type) == type) { + return YES; + } + return NO; +} + +@end diff --git a/Assets/HCMiniSdk/Third/ta/Plugins/iOS/ThinkingSDK/Source/EventTracker/Property/PropertyPlugins/TAPropertyPluginManager.m.meta b/Assets/HCMiniSdk/Third/ta/Plugins/iOS/ThinkingSDK/Source/EventTracker/Property/PropertyPlugins/TAPropertyPluginManager.m.meta new file mode 100644 index 00000000..439420db --- /dev/null +++ b/Assets/HCMiniSdk/Third/ta/Plugins/iOS/ThinkingSDK/Source/EventTracker/Property/PropertyPlugins/TAPropertyPluginManager.m.meta @@ -0,0 +1,33 @@ +fileFormatVersion: 2 +guid: ad19ddcadd5da4a76999c929613426eb +PluginImporter: + externalObjects: {} + serializedVersion: 2 + iconMap: {} + executionOrder: {} + defineConstraints: [] + isPreloaded: 0 + isOverridable: 0 + isExplicitlyReferenced: 0 + validateReferences: 1 + platformData: + - first: + Any: + second: + enabled: 0 + settings: {} + - first: + Editor: Editor + second: + enabled: 0 + settings: + DefaultValueInitialized: true + - first: + iPhone: iOS + second: + enabled: 1 + settings: + AddToEmbeddedBinaries: false + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/HCMiniSdk/Third/ta/Plugins/iOS/ThinkingSDK/Source/EventTracker/Property/PropertyPlugins/TASessionIdManager.h b/Assets/HCMiniSdk/Third/ta/Plugins/iOS/ThinkingSDK/Source/EventTracker/Property/PropertyPlugins/TASessionIdManager.h new file mode 100644 index 00000000..0fd05aeb --- /dev/null +++ b/Assets/HCMiniSdk/Third/ta/Plugins/iOS/ThinkingSDK/Source/EventTracker/Property/PropertyPlugins/TASessionIdManager.h @@ -0,0 +1,19 @@ +// +// TASessionIdManager.h +// ThinkingSDK +// +// Created by Charles on 6.12.22. +// + +#import + + +NS_ASSUME_NONNULL_BEGIN + +@interface TASessionIdManager : NSObject + ++ (instancetype)shareInstance; + +@end + +NS_ASSUME_NONNULL_END diff --git a/Assets/HCMiniSdk/Third/ta/Plugins/iOS/ThinkingSDK/Source/EventTracker/Property/PropertyPlugins/TASessionIdManager.h.meta b/Assets/HCMiniSdk/Third/ta/Plugins/iOS/ThinkingSDK/Source/EventTracker/Property/PropertyPlugins/TASessionIdManager.h.meta new file mode 100644 index 00000000..ea33a33f --- /dev/null +++ b/Assets/HCMiniSdk/Third/ta/Plugins/iOS/ThinkingSDK/Source/EventTracker/Property/PropertyPlugins/TASessionIdManager.h.meta @@ -0,0 +1,33 @@ +fileFormatVersion: 2 +guid: 2dfeafb0621994b6982ef7d0a2e9ef0e +PluginImporter: + externalObjects: {} + serializedVersion: 2 + iconMap: {} + executionOrder: {} + defineConstraints: [] + isPreloaded: 0 + isOverridable: 0 + isExplicitlyReferenced: 0 + validateReferences: 1 + platformData: + - first: + Any: + second: + enabled: 0 + settings: {} + - first: + Editor: Editor + second: + enabled: 0 + settings: + DefaultValueInitialized: true + - first: + iPhone: iOS + second: + enabled: 1 + settings: + AddToEmbeddedBinaries: false + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/HCMiniSdk/Third/ta/Plugins/iOS/ThinkingSDK/Source/EventTracker/Property/PropertyPlugins/TASessionIdManager.m b/Assets/HCMiniSdk/Third/ta/Plugins/iOS/ThinkingSDK/Source/EventTracker/Property/PropertyPlugins/TASessionIdManager.m new file mode 100644 index 00000000..4110b905 --- /dev/null +++ b/Assets/HCMiniSdk/Third/ta/Plugins/iOS/ThinkingSDK/Source/EventTracker/Property/PropertyPlugins/TASessionIdManager.m @@ -0,0 +1,75 @@ +// +// TASessionIdManager.m +// ThinkingSDK +// +// Created by Charles on 6.12.22. +// + +#if TARGET_OS_IOS +#import +#endif +#import "TASessionIdManager.h" +#import "TAAppLifeCycle.h" +#import "TDAppState.h" +#import "ThinkingAnalyticsSDKPrivate.h" + +@implementation TASessionIdManager + ++ (instancetype)shareInstance { + static dispatch_once_t onceToken; + static id instance = nil; + dispatch_once(&onceToken, ^{ + instance = [[[self class] alloc] init]; + }); + return instance; +} + +- (instancetype)init +{ + self = [super init]; + if (self) { + [self registerAppLifeCycleListener]; + } + return self; +} + +- (void)registerAppLifeCycleListener { + if ([TDAppState runningInAppExtension]) { + return; + } + + NSNotificationCenter *notificationCenter = [NSNotificationCenter defaultCenter]; +#if TARGET_OS_IOS + + [notificationCenter addObserver:self selector:@selector(appStateWillChangeNotification:) name:kTAAppLifeCycleStateWillChangeNotification object:nil]; + +#endif +} + + +- (void)appStateWillChangeNotification:(NSNotification *)notification { + TAAppLifeCycleState newState = [[notification.userInfo objectForKey:kTAAppLifeCycleNewStateKey] integerValue]; + TAAppLifeCycleState oldState = [[notification.userInfo objectForKey:kTAAppLifeCycleOldStateKey] integerValue]; + + if (oldState == TAAppLifeCycleStateInit) { + return; + } + + if (newState == TAAppLifeCycleStateStart) { + @synchronized ([self class]) { + [self updateSessionId]; + } + } +} + +- (void)updateSessionId { +// NSMutableDictionary *dic = [ThinkingAnalyticsSDK _getAllInstances]; +// for (NSString *instanceToken in dic.allKeys) { +// ThinkingAnalyticsSDK *instance = dic[instanceToken]; +// if ([instance isKindOfClass:[ThinkingAnalyticsSDK class]]) { +// [instance.sessionidPlugin updateSessionId]; +// } +// } +} + +@end diff --git a/Assets/HCMiniSdk/Third/ta/Plugins/iOS/ThinkingSDK/Source/EventTracker/Property/PropertyPlugins/TASessionIdManager.m.meta b/Assets/HCMiniSdk/Third/ta/Plugins/iOS/ThinkingSDK/Source/EventTracker/Property/PropertyPlugins/TASessionIdManager.m.meta new file mode 100644 index 00000000..ef1bf9a7 --- /dev/null +++ b/Assets/HCMiniSdk/Third/ta/Plugins/iOS/ThinkingSDK/Source/EventTracker/Property/PropertyPlugins/TASessionIdManager.m.meta @@ -0,0 +1,33 @@ +fileFormatVersion: 2 +guid: 7ad11ac70a64340549c95804d915c710 +PluginImporter: + externalObjects: {} + serializedVersion: 2 + iconMap: {} + executionOrder: {} + defineConstraints: [] + isPreloaded: 0 + isOverridable: 0 + isExplicitlyReferenced: 0 + validateReferences: 1 + platformData: + - first: + Any: + second: + enabled: 0 + settings: {} + - first: + Editor: Editor + second: + enabled: 0 + settings: + DefaultValueInitialized: true + - first: + iPhone: iOS + second: + enabled: 1 + settings: + AddToEmbeddedBinaries: false + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/HCMiniSdk/Third/ta/Plugins/iOS/ThinkingSDK/Source/EventTracker/Property/PropertyPlugins/TASessionIdPropertyPlugin.h b/Assets/HCMiniSdk/Third/ta/Plugins/iOS/ThinkingSDK/Source/EventTracker/Property/PropertyPlugins/TASessionIdPropertyPlugin.h new file mode 100644 index 00000000..5e500e43 --- /dev/null +++ b/Assets/HCMiniSdk/Third/ta/Plugins/iOS/ThinkingSDK/Source/EventTracker/Property/PropertyPlugins/TASessionIdPropertyPlugin.h @@ -0,0 +1,23 @@ +// +// TASessionIdPropertyPlugin.h +// ThinkingSDK +// +// Created by Charles on 28.11.22. +// + +#if TARGET_OS_IOS +#import +#endif +#import "TAPropertyPluginManager.h" + +NS_ASSUME_NONNULL_BEGIN + +@interface TASessionIdPropertyPlugin : NSObject + +@property(nonatomic, copy)NSString *instanceToken; + +- (void)updateSessionId; + +@end + +NS_ASSUME_NONNULL_END diff --git a/Assets/HCMiniSdk/Third/ta/Plugins/iOS/ThinkingSDK/Source/EventTracker/Property/PropertyPlugins/TASessionIdPropertyPlugin.h.meta b/Assets/HCMiniSdk/Third/ta/Plugins/iOS/ThinkingSDK/Source/EventTracker/Property/PropertyPlugins/TASessionIdPropertyPlugin.h.meta new file mode 100644 index 00000000..7ac4ecf8 --- /dev/null +++ b/Assets/HCMiniSdk/Third/ta/Plugins/iOS/ThinkingSDK/Source/EventTracker/Property/PropertyPlugins/TASessionIdPropertyPlugin.h.meta @@ -0,0 +1,33 @@ +fileFormatVersion: 2 +guid: 621a62e5bfcd14aff8fb5192fa01aa6d +PluginImporter: + externalObjects: {} + serializedVersion: 2 + iconMap: {} + executionOrder: {} + defineConstraints: [] + isPreloaded: 0 + isOverridable: 0 + isExplicitlyReferenced: 0 + validateReferences: 1 + platformData: + - first: + Any: + second: + enabled: 0 + settings: {} + - first: + Editor: Editor + second: + enabled: 0 + settings: + DefaultValueInitialized: true + - first: + iPhone: iOS + second: + enabled: 1 + settings: + AddToEmbeddedBinaries: false + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/HCMiniSdk/Third/ta/Plugins/iOS/ThinkingSDK/Source/EventTracker/Property/PropertyPlugins/TASessionIdPropertyPlugin.m b/Assets/HCMiniSdk/Third/ta/Plugins/iOS/ThinkingSDK/Source/EventTracker/Property/PropertyPlugins/TASessionIdPropertyPlugin.m new file mode 100644 index 00000000..759bd8aa --- /dev/null +++ b/Assets/HCMiniSdk/Third/ta/Plugins/iOS/ThinkingSDK/Source/EventTracker/Property/PropertyPlugins/TASessionIdPropertyPlugin.m @@ -0,0 +1,66 @@ +// +// TASessionIdPropertyPlugin.m +// ThinkingSDK +// +// Created by Charles on 28.11.22. +// + +#import "TASessionIdPropertyPlugin.h" +#import "TDPresetProperties.h" +#import "TDPresetProperties+TDDisProperties.h" +#import "TAAppLifeCycle.h" +#import "TDFile.h" +#import "TDAppState.h" + +@interface TASessionIdPropertyPlugin () +@property (nonatomic, strong) NSMutableDictionary *properties; +@property (nonatomic, strong) TDFile *file; +@property (atomic, assign) long long sessionid; +@property (atomic, copy) NSString *sessionidString; +@end + + +@implementation TASessionIdPropertyPlugin + +- (instancetype)init +{ + self = [super init]; + if (self) { + self.properties = [NSMutableDictionary dictionary]; + + } + return self; +} + +- (void)updateSessionId { +#if TARGET_OS_IOS + if (![TDPresetProperties disableSessionID]) { + @synchronized ([self class]) { + self.sessionid ++; + self.sessionidString = [NSString stringWithFormat:@"%@_%lld", [NSUUID UUID].UUIDString, self.sessionid]; + [self.file archiveSessionID:self.sessionid]; + self.properties[@"#session_id"] = self.sessionidString; + } + } +#endif +} + +- (void)start { + if (![TDPresetProperties disableSessionID]) { + @synchronized ([self class]) { + if (!self.file) { + self.file = [[TDFile alloc] initWithAppid:self.instanceToken]; + } + self.sessionid = [self.file unarchiveSessionID]; + [self updateSessionId]; + } + + } +} + +- (void)asyncGetPropertyCompletion:(TAPropertyPluginCompletion)completion { + +} + + +@end diff --git a/Assets/HCMiniSdk/Third/ta/Plugins/iOS/ThinkingSDK/Source/EventTracker/Property/PropertyPlugins/TASessionIdPropertyPlugin.m.meta b/Assets/HCMiniSdk/Third/ta/Plugins/iOS/ThinkingSDK/Source/EventTracker/Property/PropertyPlugins/TASessionIdPropertyPlugin.m.meta new file mode 100644 index 00000000..c0187b22 --- /dev/null +++ b/Assets/HCMiniSdk/Third/ta/Plugins/iOS/ThinkingSDK/Source/EventTracker/Property/PropertyPlugins/TASessionIdPropertyPlugin.m.meta @@ -0,0 +1,33 @@ +fileFormatVersion: 2 +guid: af8d282725fca4565aa8fd1c4cd278b9 +PluginImporter: + externalObjects: {} + serializedVersion: 2 + iconMap: {} + executionOrder: {} + defineConstraints: [] + isPreloaded: 0 + isOverridable: 0 + isExplicitlyReferenced: 0 + validateReferences: 1 + platformData: + - first: + Any: + second: + enabled: 0 + settings: {} + - first: + Editor: Editor + second: + enabled: 0 + settings: + DefaultValueInitialized: true + - first: + iPhone: iOS + second: + enabled: 1 + settings: + AddToEmbeddedBinaries: false + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/HCMiniSdk/Third/ta/Plugins/iOS/ThinkingSDK/Source/EventTracker/Property/TAAutoTrackSuperProperty.h b/Assets/HCMiniSdk/Third/ta/Plugins/iOS/ThinkingSDK/Source/EventTracker/Property/TAAutoTrackSuperProperty.h new file mode 100755 index 00000000..f66ee5a0 --- /dev/null +++ b/Assets/HCMiniSdk/Third/ta/Plugins/iOS/ThinkingSDK/Source/EventTracker/Property/TAAutoTrackSuperProperty.h @@ -0,0 +1,34 @@ +// +// TAAutoTrackSuperProperty.h +// ThinkingSDK +// +// Created by Yangxiongon 2022/6/19. +// + +#import +#import "TDConstant.h" + +NS_ASSUME_NONNULL_BEGIN + +@interface TAAutoTrackSuperProperty : NSObject + +- (void)registerSuperProperties:(NSDictionary *)properties withType:(ThinkingAnalyticsAutoTrackEventType)type; + +- (NSDictionary *)currentSuperPropertiesWithEventName:(NSString *)eventName; + +- (void)registerDynamicSuperProperties:(NSDictionary *(^)(ThinkingAnalyticsAutoTrackEventType, NSDictionary *))dynamicSuperProperties; + +- (NSDictionary *)obtainDynamicSuperPropertiesWithType:(ThinkingAnalyticsAutoTrackEventType)type currentProperties:(NSDictionary *)properties; + +/// Only used for auto track in Unity3D environment +/// - Parameter dynamicSuperProperties: dynamic properties +- (void)registerAutoTrackDynamicProperties:(NSDictionary *(^ _Nullable)(void))dynamicSuperProperties; + +/// Only used for auto track in Unity3D environment +- (NSDictionary *)obtainAutoTrackDynamicSuperProperties; + +- (void)clearSuperProperties; + +@end + +NS_ASSUME_NONNULL_END diff --git a/Assets/HCMiniSdk/Third/ta/Plugins/iOS/ThinkingSDK/Source/EventTracker/Property/TAAutoTrackSuperProperty.h.meta b/Assets/HCMiniSdk/Third/ta/Plugins/iOS/ThinkingSDK/Source/EventTracker/Property/TAAutoTrackSuperProperty.h.meta new file mode 100644 index 00000000..8ea87d39 --- /dev/null +++ b/Assets/HCMiniSdk/Third/ta/Plugins/iOS/ThinkingSDK/Source/EventTracker/Property/TAAutoTrackSuperProperty.h.meta @@ -0,0 +1,33 @@ +fileFormatVersion: 2 +guid: 077a34e22278d48b1be23509de10caf0 +PluginImporter: + externalObjects: {} + serializedVersion: 2 + iconMap: {} + executionOrder: {} + defineConstraints: [] + isPreloaded: 0 + isOverridable: 0 + isExplicitlyReferenced: 0 + validateReferences: 1 + platformData: + - first: + Any: + second: + enabled: 0 + settings: {} + - first: + Editor: Editor + second: + enabled: 0 + settings: + DefaultValueInitialized: true + - first: + iPhone: iOS + second: + enabled: 1 + settings: + AddToEmbeddedBinaries: false + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/HCMiniSdk/Third/ta/Plugins/iOS/ThinkingSDK/Source/EventTracker/Property/TAAutoTrackSuperProperty.m b/Assets/HCMiniSdk/Third/ta/Plugins/iOS/ThinkingSDK/Source/EventTracker/Property/TAAutoTrackSuperProperty.m new file mode 100755 index 00000000..1c3454f3 --- /dev/null +++ b/Assets/HCMiniSdk/Third/ta/Plugins/iOS/ThinkingSDK/Source/EventTracker/Property/TAAutoTrackSuperProperty.m @@ -0,0 +1,121 @@ +// +// TAAutoTrackSuperProperty.m +// ThinkingSDK +// +// Created by Yangxiongon 2022/6/19. +// + +#import "TAAutoTrackSuperProperty.h" +#import "ThinkingAnalyticsSDKPrivate.h" + +@interface TAAutoTrackSuperProperty () +@property (atomic, strong) NSMutableDictionary *eventProperties; +@property (nonatomic, copy) NSDictionary *(^dynamicSuperProperties)(ThinkingAnalyticsAutoTrackEventType type, NSDictionary *properties); +/// Only used for auto track in Unity3D environment +@property (nonatomic, copy) NSDictionary *(^autoTrackDynamicSuperProperties)(void); + +@end + +@implementation TAAutoTrackSuperProperty + +- (instancetype)init +{ + self = [super init]; + if (self) { + self.eventProperties = [NSMutableDictionary dictionary]; + } + return self; +} + +- (void)registerSuperProperties:(NSDictionary *)properties withType:(ThinkingAnalyticsAutoTrackEventType)type { + NSDictionary *autoTypes = @{ + @(ThinkingAnalyticsEventTypeAppStart) : TD_APP_START_EVENT, + @(ThinkingAnalyticsEventTypeAppEnd) : TD_APP_END_EVENT, + @(ThinkingAnalyticsEventTypeAppClick) : TD_APP_CLICK_EVENT, + @(ThinkingAnalyticsEventTypeAppInstall) : TD_APP_INSTALL_EVENT, + @(ThinkingAnalyticsEventTypeAppViewCrash) : TD_APP_CRASH_EVENT, + @(ThinkingAnalyticsEventTypeAppViewScreen) : TD_APP_VIEW_EVENT + }; + + NSArray *typeKeys = autoTypes.allKeys; + for (NSInteger i = 0; i < typeKeys.count; i++) { + NSNumber *key = typeKeys[i]; + ThinkingAnalyticsAutoTrackEventType eventType = key.integerValue; + if ((type & eventType) == eventType) { + NSString *eventName = autoTypes[key]; + if (properties) { + + NSDictionary *oldProperties = self.eventProperties[eventName]; + if (oldProperties && [oldProperties isKindOfClass:[NSDictionary class]]) { + NSMutableDictionary *mutiOldProperties = [oldProperties mutableCopy]; + [mutiOldProperties addEntriesFromDictionary:properties]; + self.eventProperties[eventName] = mutiOldProperties; + } else { + self.eventProperties[eventName] = properties; + } + + + if (eventType == ThinkingAnalyticsEventTypeAppStart) { + NSDictionary *startParam = self.eventProperties[TD_APP_START_EVENT]; + if (startParam && [startParam isKindOfClass:[NSDictionary class]]) { + self.eventProperties[TD_APP_START_BACKGROUND_EVENT] = startParam; + } + } + } + } + } +} + + +- (NSDictionary *)currentSuperPropertiesWithEventName:(NSString *)eventName { + NSDictionary *autoEventProperty = [self.eventProperties objectForKey:eventName]; + + NSDictionary *validProperties = [TAPropertyValidator validateProperties:[autoEventProperty copy]]; + return validProperties; +} + +- (void)registerDynamicSuperProperties:(NSDictionary *(^)(ThinkingAnalyticsAutoTrackEventType, NSDictionary *))dynamicSuperProperties { + @synchronized (self) { + self.dynamicSuperProperties = dynamicSuperProperties; + } +} + +- (NSDictionary *)obtainDynamicSuperPropertiesWithType:(ThinkingAnalyticsAutoTrackEventType)type currentProperties:(NSDictionary *)properties { + @synchronized (self) { + if (self.dynamicSuperProperties) { + NSDictionary *result = self.dynamicSuperProperties(type, properties); + + NSDictionary *validProperties = [TAPropertyValidator validateProperties:[result copy]]; + return validProperties; + } + return nil; + } +} + +- (void)registerAutoTrackDynamicProperties:(NSDictionary * _Nonnull (^)(void))dynamicSuperProperties { + @synchronized (self) { + self.autoTrackDynamicSuperProperties = dynamicSuperProperties; + } +} + +- (NSDictionary *)obtainAutoTrackDynamicSuperProperties { + @synchronized (self) { + if (self.autoTrackDynamicSuperProperties) { + NSDictionary *properties = self.autoTrackDynamicSuperProperties(); + + NSDictionary *validProperties = [TAPropertyValidator validateProperties:[properties copy]]; + return validProperties; + } + return nil; + } +} + +- (void)clearSuperProperties { + self.eventProperties = [@{} mutableCopy]; +} + +//MARK: - Private Methods + + + +@end diff --git a/Assets/HCMiniSdk/Third/ta/Plugins/iOS/ThinkingSDK/Source/EventTracker/Property/TAAutoTrackSuperProperty.m.meta b/Assets/HCMiniSdk/Third/ta/Plugins/iOS/ThinkingSDK/Source/EventTracker/Property/TAAutoTrackSuperProperty.m.meta new file mode 100644 index 00000000..e926f82f --- /dev/null +++ b/Assets/HCMiniSdk/Third/ta/Plugins/iOS/ThinkingSDK/Source/EventTracker/Property/TAAutoTrackSuperProperty.m.meta @@ -0,0 +1,33 @@ +fileFormatVersion: 2 +guid: bfc123edd0e6c492aaf8a3f552784e2c +PluginImporter: + externalObjects: {} + serializedVersion: 2 + iconMap: {} + executionOrder: {} + defineConstraints: [] + isPreloaded: 0 + isOverridable: 0 + isExplicitlyReferenced: 0 + validateReferences: 1 + platformData: + - first: + Any: + second: + enabled: 0 + settings: {} + - first: + Editor: Editor + second: + enabled: 0 + settings: + DefaultValueInitialized: true + - first: + iPhone: iOS + second: + enabled: 1 + settings: + AddToEmbeddedBinaries: false + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/HCMiniSdk/Third/ta/Plugins/iOS/ThinkingSDK/Source/EventTracker/Property/TASuperProperty.h b/Assets/HCMiniSdk/Third/ta/Plugins/iOS/ThinkingSDK/Source/EventTracker/Property/TASuperProperty.h new file mode 100755 index 00000000..c53045c8 --- /dev/null +++ b/Assets/HCMiniSdk/Third/ta/Plugins/iOS/ThinkingSDK/Source/EventTracker/Property/TASuperProperty.h @@ -0,0 +1,35 @@ +// +// TASuperProperty.h +// ThinkingSDK +// +// Created by Yangxiongon 2022/6/10. +// +// Methods related to static public properties of this class are not thread-safe; methods related to dynamic public properties are thread-safe. + +#import + +NS_ASSUME_NONNULL_BEGIN + +@interface TASuperProperty : NSObject + +#pragma mark - UNAVAILABLE +- (instancetype)init NS_UNAVAILABLE; ++ (instancetype)new NS_UNAVAILABLE; + +- (instancetype)initWithToken:(NSString *)token isLight:(BOOL)isLight; + +- (void)registerSuperProperties:(NSDictionary *)properties; + +- (void)unregisterSuperProperty:(NSString *)property; + +- (void)clearSuperProperties; + +- (NSDictionary *)currentSuperProperties; + +- (void)registerDynamicSuperProperties:(NSDictionary *(^ _Nullable)(void))dynamicSuperProperties; + +- (NSDictionary *)obtainDynamicSuperProperties; + +@end + +NS_ASSUME_NONNULL_END diff --git a/Assets/HCMiniSdk/Third/ta/Plugins/iOS/ThinkingSDK/Source/EventTracker/Property/TASuperProperty.h.meta b/Assets/HCMiniSdk/Third/ta/Plugins/iOS/ThinkingSDK/Source/EventTracker/Property/TASuperProperty.h.meta new file mode 100644 index 00000000..04d7cfed --- /dev/null +++ b/Assets/HCMiniSdk/Third/ta/Plugins/iOS/ThinkingSDK/Source/EventTracker/Property/TASuperProperty.h.meta @@ -0,0 +1,33 @@ +fileFormatVersion: 2 +guid: b4598cd5dd5884106805279685630834 +PluginImporter: + externalObjects: {} + serializedVersion: 2 + iconMap: {} + executionOrder: {} + defineConstraints: [] + isPreloaded: 0 + isOverridable: 0 + isExplicitlyReferenced: 0 + validateReferences: 1 + platformData: + - first: + Any: + second: + enabled: 0 + settings: {} + - first: + Editor: Editor + second: + enabled: 0 + settings: + DefaultValueInitialized: true + - first: + iPhone: iOS + second: + enabled: 1 + settings: + AddToEmbeddedBinaries: false + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/HCMiniSdk/Third/ta/Plugins/iOS/ThinkingSDK/Source/EventTracker/Property/TASuperProperty.m b/Assets/HCMiniSdk/Third/ta/Plugins/iOS/ThinkingSDK/Source/EventTracker/Property/TASuperProperty.m new file mode 100755 index 00000000..598fc081 --- /dev/null +++ b/Assets/HCMiniSdk/Third/ta/Plugins/iOS/ThinkingSDK/Source/EventTracker/Property/TASuperProperty.m @@ -0,0 +1,106 @@ +// +// TASuperProperty.m +// ThinkingSDK +// +// Created by Yangxiongon 2022/6/10. +// + +#import "TASuperProperty.h" +#import "TAPropertyValidator.h" +#import "TDLogging.h" +#import "TDFile.h" + +@interface TASuperProperty () +///multi-instance identifier +@property (nonatomic, copy) NSString *token; +/// static public property +@property (atomic, strong) NSDictionary *superProperties; +/// dynamic public properties +@property (nonatomic, copy) NSDictionary *(^dynamicSuperProperties)(void); +@property (nonatomic, strong) TDFile *file; +@property (nonatomic, assign) BOOL isLight; + +@end + +@implementation TASuperProperty + +- (instancetype)initWithToken:(NSString *)token isLight:(BOOL)isLight { + if (self = [super init]) { + NSAssert(token.length > 0, @"token cant empty"); + self.token = token; + self.isLight = isLight; + if (!isLight) { + + self.file = [[TDFile alloc] initWithAppid:token]; + self.superProperties = [self.file unarchiveSuperProperties]; + } + } + return self; +} + +- (void)registerSuperProperties:(NSDictionary *)properties { + properties = [properties copy]; + + properties = [TAPropertyValidator validateProperties:properties]; + if (properties.count <= 0) { + TDLogError(@"%@ propertieDict error.", properties); + return; + } + + + NSMutableDictionary *tmp = [NSMutableDictionary dictionaryWithDictionary:self.superProperties]; + + [tmp addEntriesFromDictionary:properties]; + self.superProperties = [NSDictionary dictionaryWithDictionary:tmp]; + + + [self.file archiveSuperProperties:self.superProperties]; +} + +- (void)unregisterSuperProperty:(NSString *)property { + NSError *error = nil; + [TAPropertyValidator validateEventOrPropertyName:property withError:&error]; + if (error) { + return; + } + + NSMutableDictionary *tmp = [NSMutableDictionary dictionaryWithDictionary:self.superProperties]; + tmp[property] = nil; + self.superProperties = [NSDictionary dictionaryWithDictionary:tmp]; + + [self.file archiveSuperProperties:self.superProperties]; +} + +- (void)clearSuperProperties { + self.superProperties = @{}; + [self.file archiveSuperProperties:self.superProperties]; +} + +- (NSDictionary *)currentSuperProperties { + if (self.superProperties) { + return [TAPropertyValidator validateProperties:[self.superProperties copy]]; + } else { + return @{}; + } +} + +- (void)registerDynamicSuperProperties:(NSDictionary *(^ _Nullable)(void))dynamicSuperProperties { + @synchronized (self) { + self.dynamicSuperProperties = dynamicSuperProperties; + } +} + + +- (NSDictionary *)obtainDynamicSuperProperties { + @synchronized (self) { + if (self.dynamicSuperProperties) { + NSDictionary *properties = self.dynamicSuperProperties(); + + NSDictionary *validProperties = [TAPropertyValidator validateProperties:[properties copy]]; + return validProperties; + } + return nil; + } +} + +@end diff --git a/Assets/HCMiniSdk/Third/ta/Plugins/iOS/ThinkingSDK/Source/EventTracker/Property/TASuperProperty.m.meta b/Assets/HCMiniSdk/Third/ta/Plugins/iOS/ThinkingSDK/Source/EventTracker/Property/TASuperProperty.m.meta new file mode 100644 index 00000000..7697aa8d --- /dev/null +++ b/Assets/HCMiniSdk/Third/ta/Plugins/iOS/ThinkingSDK/Source/EventTracker/Property/TASuperProperty.m.meta @@ -0,0 +1,33 @@ +fileFormatVersion: 2 +guid: 22a1c8f36af4841c49db24aea47cefd8 +PluginImporter: + externalObjects: {} + serializedVersion: 2 + iconMap: {} + executionOrder: {} + defineConstraints: [] + isPreloaded: 0 + isOverridable: 0 + isExplicitlyReferenced: 0 + validateReferences: 1 + platformData: + - first: + Any: + second: + enabled: 0 + settings: {} + - first: + Editor: Editor + second: + enabled: 0 + settings: + DefaultValueInitialized: true + - first: + iPhone: iOS + second: + enabled: 1 + settings: + AddToEmbeddedBinaries: false + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/HCMiniSdk/Third/ta/Plugins/iOS/ThinkingSDK/Source/EventTracker/Property/Validate.meta b/Assets/HCMiniSdk/Third/ta/Plugins/iOS/ThinkingSDK/Source/EventTracker/Property/Validate.meta new file mode 100644 index 00000000..54418818 --- /dev/null +++ b/Assets/HCMiniSdk/Third/ta/Plugins/iOS/ThinkingSDK/Source/EventTracker/Property/Validate.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: 860147d4f77334254a37e4e9d5bbec1a +folderAsset: yes +DefaultImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/HCMiniSdk/Third/ta/Plugins/iOS/ThinkingSDK/Source/EventTracker/Property/Validate/NSArray+TAProperty.h b/Assets/HCMiniSdk/Third/ta/Plugins/iOS/ThinkingSDK/Source/EventTracker/Property/Validate/NSArray+TAProperty.h new file mode 100755 index 00000000..a1b55c73 --- /dev/null +++ b/Assets/HCMiniSdk/Third/ta/Plugins/iOS/ThinkingSDK/Source/EventTracker/Property/Validate/NSArray+TAProperty.h @@ -0,0 +1,17 @@ +// +// NSArray+TAProperty.h +// Adjust +// +// Created by Yangxiongon 2022/7/1. +// + +#import +#import "TAValidatorProtocol.h" + +NS_ASSUME_NONNULL_BEGIN + +@interface NSArray (TAProperty) + +@end + +NS_ASSUME_NONNULL_END diff --git a/Assets/HCMiniSdk/Third/ta/Plugins/iOS/ThinkingSDK/Source/EventTracker/Property/Validate/NSArray+TAProperty.h.meta b/Assets/HCMiniSdk/Third/ta/Plugins/iOS/ThinkingSDK/Source/EventTracker/Property/Validate/NSArray+TAProperty.h.meta new file mode 100644 index 00000000..bfd45d74 --- /dev/null +++ b/Assets/HCMiniSdk/Third/ta/Plugins/iOS/ThinkingSDK/Source/EventTracker/Property/Validate/NSArray+TAProperty.h.meta @@ -0,0 +1,33 @@ +fileFormatVersion: 2 +guid: 68b8ef80c9b774415a2b97255c507ebf +PluginImporter: + externalObjects: {} + serializedVersion: 2 + iconMap: {} + executionOrder: {} + defineConstraints: [] + isPreloaded: 0 + isOverridable: 0 + isExplicitlyReferenced: 0 + validateReferences: 1 + platformData: + - first: + Any: + second: + enabled: 0 + settings: {} + - first: + Editor: Editor + second: + enabled: 0 + settings: + DefaultValueInitialized: true + - first: + iPhone: iOS + second: + enabled: 1 + settings: + AddToEmbeddedBinaries: false + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/HCMiniSdk/Third/ta/Plugins/iOS/ThinkingSDK/Source/EventTracker/Property/Validate/NSArray+TAProperty.m b/Assets/HCMiniSdk/Third/ta/Plugins/iOS/ThinkingSDK/Source/EventTracker/Property/Validate/NSArray+TAProperty.m new file mode 100755 index 00000000..070496d2 --- /dev/null +++ b/Assets/HCMiniSdk/Third/ta/Plugins/iOS/ThinkingSDK/Source/EventTracker/Property/Validate/NSArray+TAProperty.m @@ -0,0 +1,16 @@ +// +// NSArray+TAProperty.m +// Adjust +// +// Created by Yangxiongon 2022/7/1. +// + +#import "NSArray+TAProperty.h" + +@implementation NSArray (TAProperty) + +- (void)ta_validatePropertyValueWithError:(NSError *__autoreleasing _Nullable *)error { + +} + +@end diff --git a/Assets/HCMiniSdk/Third/ta/Plugins/iOS/ThinkingSDK/Source/EventTracker/Property/Validate/NSArray+TAProperty.m.meta b/Assets/HCMiniSdk/Third/ta/Plugins/iOS/ThinkingSDK/Source/EventTracker/Property/Validate/NSArray+TAProperty.m.meta new file mode 100644 index 00000000..483ccddc --- /dev/null +++ b/Assets/HCMiniSdk/Third/ta/Plugins/iOS/ThinkingSDK/Source/EventTracker/Property/Validate/NSArray+TAProperty.m.meta @@ -0,0 +1,33 @@ +fileFormatVersion: 2 +guid: 8dd7d22ed7b914bb9977bbb0e00f6357 +PluginImporter: + externalObjects: {} + serializedVersion: 2 + iconMap: {} + executionOrder: {} + defineConstraints: [] + isPreloaded: 0 + isOverridable: 0 + isExplicitlyReferenced: 0 + validateReferences: 1 + platformData: + - first: + Any: + second: + enabled: 0 + settings: {} + - first: + Editor: Editor + second: + enabled: 0 + settings: + DefaultValueInitialized: true + - first: + iPhone: iOS + second: + enabled: 1 + settings: + AddToEmbeddedBinaries: false + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/HCMiniSdk/Third/ta/Plugins/iOS/ThinkingSDK/Source/EventTracker/Property/Validate/NSDate+TAProperty.h b/Assets/HCMiniSdk/Third/ta/Plugins/iOS/ThinkingSDK/Source/EventTracker/Property/Validate/NSDate+TAProperty.h new file mode 100755 index 00000000..7125b539 --- /dev/null +++ b/Assets/HCMiniSdk/Third/ta/Plugins/iOS/ThinkingSDK/Source/EventTracker/Property/Validate/NSDate+TAProperty.h @@ -0,0 +1,17 @@ +// +// NSDate+TAProperty.h +// Adjust +// +// Created by Yangxiongon 2022/7/1. +// + +#import +#import "TAValidatorProtocol.h" + +NS_ASSUME_NONNULL_BEGIN + +@interface NSDate (TAProperty) + +@end + +NS_ASSUME_NONNULL_END diff --git a/Assets/HCMiniSdk/Third/ta/Plugins/iOS/ThinkingSDK/Source/EventTracker/Property/Validate/NSDate+TAProperty.h.meta b/Assets/HCMiniSdk/Third/ta/Plugins/iOS/ThinkingSDK/Source/EventTracker/Property/Validate/NSDate+TAProperty.h.meta new file mode 100644 index 00000000..8713b25a --- /dev/null +++ b/Assets/HCMiniSdk/Third/ta/Plugins/iOS/ThinkingSDK/Source/EventTracker/Property/Validate/NSDate+TAProperty.h.meta @@ -0,0 +1,33 @@ +fileFormatVersion: 2 +guid: a21348345a83a40cfa41d1d1f0fe25d5 +PluginImporter: + externalObjects: {} + serializedVersion: 2 + iconMap: {} + executionOrder: {} + defineConstraints: [] + isPreloaded: 0 + isOverridable: 0 + isExplicitlyReferenced: 0 + validateReferences: 1 + platformData: + - first: + Any: + second: + enabled: 0 + settings: {} + - first: + Editor: Editor + second: + enabled: 0 + settings: + DefaultValueInitialized: true + - first: + iPhone: iOS + second: + enabled: 1 + settings: + AddToEmbeddedBinaries: false + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/HCMiniSdk/Third/ta/Plugins/iOS/ThinkingSDK/Source/EventTracker/Property/Validate/NSDate+TAProperty.m b/Assets/HCMiniSdk/Third/ta/Plugins/iOS/ThinkingSDK/Source/EventTracker/Property/Validate/NSDate+TAProperty.m new file mode 100755 index 00000000..5c0809cf --- /dev/null +++ b/Assets/HCMiniSdk/Third/ta/Plugins/iOS/ThinkingSDK/Source/EventTracker/Property/Validate/NSDate+TAProperty.m @@ -0,0 +1,16 @@ +// +// NSDate+TAProperty.m +// Adjust +// +// Created by Yangxiongon 2022/7/1. +// + +#import "NSDate+TAProperty.h" + +@implementation NSDate (TAProperty) + +- (void)ta_validatePropertyValueWithError:(NSError *__autoreleasing _Nullable *)error { + +} + +@end diff --git a/Assets/HCMiniSdk/Third/ta/Plugins/iOS/ThinkingSDK/Source/EventTracker/Property/Validate/NSDate+TAProperty.m.meta b/Assets/HCMiniSdk/Third/ta/Plugins/iOS/ThinkingSDK/Source/EventTracker/Property/Validate/NSDate+TAProperty.m.meta new file mode 100644 index 00000000..aaf3f02f --- /dev/null +++ b/Assets/HCMiniSdk/Third/ta/Plugins/iOS/ThinkingSDK/Source/EventTracker/Property/Validate/NSDate+TAProperty.m.meta @@ -0,0 +1,33 @@ +fileFormatVersion: 2 +guid: 06de83c7a4bb44b8f8e1abf6f58cfd7e +PluginImporter: + externalObjects: {} + serializedVersion: 2 + iconMap: {} + executionOrder: {} + defineConstraints: [] + isPreloaded: 0 + isOverridable: 0 + isExplicitlyReferenced: 0 + validateReferences: 1 + platformData: + - first: + Any: + second: + enabled: 0 + settings: {} + - first: + Editor: Editor + second: + enabled: 0 + settings: + DefaultValueInitialized: true + - first: + iPhone: iOS + second: + enabled: 1 + settings: + AddToEmbeddedBinaries: false + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/HCMiniSdk/Third/ta/Plugins/iOS/ThinkingSDK/Source/EventTracker/Property/Validate/NSDictionary+TAProperty.h b/Assets/HCMiniSdk/Third/ta/Plugins/iOS/ThinkingSDK/Source/EventTracker/Property/Validate/NSDictionary+TAProperty.h new file mode 100755 index 00000000..7a4ad8b1 --- /dev/null +++ b/Assets/HCMiniSdk/Third/ta/Plugins/iOS/ThinkingSDK/Source/EventTracker/Property/Validate/NSDictionary+TAProperty.h @@ -0,0 +1,17 @@ +// +// NSDictionary+TAProperty.h +// Adjust +// +// Created by Yangxiongon 2022/7/1. +// + +#import +#import "TAValidatorProtocol.h" + +NS_ASSUME_NONNULL_BEGIN + +@interface NSDictionary (TAProperty) + +@end + +NS_ASSUME_NONNULL_END diff --git a/Assets/HCMiniSdk/Third/ta/Plugins/iOS/ThinkingSDK/Source/EventTracker/Property/Validate/NSDictionary+TAProperty.h.meta b/Assets/HCMiniSdk/Third/ta/Plugins/iOS/ThinkingSDK/Source/EventTracker/Property/Validate/NSDictionary+TAProperty.h.meta new file mode 100644 index 00000000..b420e7e3 --- /dev/null +++ b/Assets/HCMiniSdk/Third/ta/Plugins/iOS/ThinkingSDK/Source/EventTracker/Property/Validate/NSDictionary+TAProperty.h.meta @@ -0,0 +1,33 @@ +fileFormatVersion: 2 +guid: d23dfd6d4d5ef472fa502ddb488e646d +PluginImporter: + externalObjects: {} + serializedVersion: 2 + iconMap: {} + executionOrder: {} + defineConstraints: [] + isPreloaded: 0 + isOverridable: 0 + isExplicitlyReferenced: 0 + validateReferences: 1 + platformData: + - first: + Any: + second: + enabled: 0 + settings: {} + - first: + Editor: Editor + second: + enabled: 0 + settings: + DefaultValueInitialized: true + - first: + iPhone: iOS + second: + enabled: 1 + settings: + AddToEmbeddedBinaries: false + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/HCMiniSdk/Third/ta/Plugins/iOS/ThinkingSDK/Source/EventTracker/Property/Validate/NSDictionary+TAProperty.m b/Assets/HCMiniSdk/Third/ta/Plugins/iOS/ThinkingSDK/Source/EventTracker/Property/Validate/NSDictionary+TAProperty.m new file mode 100755 index 00000000..f7bf0ee6 --- /dev/null +++ b/Assets/HCMiniSdk/Third/ta/Plugins/iOS/ThinkingSDK/Source/EventTracker/Property/Validate/NSDictionary+TAProperty.m @@ -0,0 +1,16 @@ +// +// NSDictionary+TAProperty.m +// Adjust +// +// Created by Yangxiongon 2022/7/1. +// + +#import "NSDictionary+TAProperty.h" + +@implementation NSDictionary (TAProperty) + +- (void)ta_validatePropertyValueWithError:(NSError *__autoreleasing _Nullable *)error { + +} + +@end diff --git a/Assets/HCMiniSdk/Third/ta/Plugins/iOS/ThinkingSDK/Source/EventTracker/Property/Validate/NSDictionary+TAProperty.m.meta b/Assets/HCMiniSdk/Third/ta/Plugins/iOS/ThinkingSDK/Source/EventTracker/Property/Validate/NSDictionary+TAProperty.m.meta new file mode 100644 index 00000000..857217ed --- /dev/null +++ b/Assets/HCMiniSdk/Third/ta/Plugins/iOS/ThinkingSDK/Source/EventTracker/Property/Validate/NSDictionary+TAProperty.m.meta @@ -0,0 +1,33 @@ +fileFormatVersion: 2 +guid: a15cb34151c9844608743cf8350fb34e +PluginImporter: + externalObjects: {} + serializedVersion: 2 + iconMap: {} + executionOrder: {} + defineConstraints: [] + isPreloaded: 0 + isOverridable: 0 + isExplicitlyReferenced: 0 + validateReferences: 1 + platformData: + - first: + Any: + second: + enabled: 0 + settings: {} + - first: + Editor: Editor + second: + enabled: 0 + settings: + DefaultValueInitialized: true + - first: + iPhone: iOS + second: + enabled: 1 + settings: + AddToEmbeddedBinaries: false + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/HCMiniSdk/Third/ta/Plugins/iOS/ThinkingSDK/Source/EventTracker/Property/Validate/NSNumber+TAProperty.h b/Assets/HCMiniSdk/Third/ta/Plugins/iOS/ThinkingSDK/Source/EventTracker/Property/Validate/NSNumber+TAProperty.h new file mode 100755 index 00000000..010aa079 --- /dev/null +++ b/Assets/HCMiniSdk/Third/ta/Plugins/iOS/ThinkingSDK/Source/EventTracker/Property/Validate/NSNumber+TAProperty.h @@ -0,0 +1,17 @@ +// +// NSNumber+TAProperty.h +// Adjust +// +// Created by Yangxiongon 2022/7/1. +// + +#import +#import "TAValidatorProtocol.h" + +NS_ASSUME_NONNULL_BEGIN + +@interface NSNumber (TAProperty) + +@end + +NS_ASSUME_NONNULL_END diff --git a/Assets/HCMiniSdk/Third/ta/Plugins/iOS/ThinkingSDK/Source/EventTracker/Property/Validate/NSNumber+TAProperty.h.meta b/Assets/HCMiniSdk/Third/ta/Plugins/iOS/ThinkingSDK/Source/EventTracker/Property/Validate/NSNumber+TAProperty.h.meta new file mode 100644 index 00000000..0f7d0d90 --- /dev/null +++ b/Assets/HCMiniSdk/Third/ta/Plugins/iOS/ThinkingSDK/Source/EventTracker/Property/Validate/NSNumber+TAProperty.h.meta @@ -0,0 +1,33 @@ +fileFormatVersion: 2 +guid: 6f7931a0232ed492b81944f336868459 +PluginImporter: + externalObjects: {} + serializedVersion: 2 + iconMap: {} + executionOrder: {} + defineConstraints: [] + isPreloaded: 0 + isOverridable: 0 + isExplicitlyReferenced: 0 + validateReferences: 1 + platformData: + - first: + Any: + second: + enabled: 0 + settings: {} + - first: + Editor: Editor + second: + enabled: 0 + settings: + DefaultValueInitialized: true + - first: + iPhone: iOS + second: + enabled: 1 + settings: + AddToEmbeddedBinaries: false + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/HCMiniSdk/Third/ta/Plugins/iOS/ThinkingSDK/Source/EventTracker/Property/Validate/NSNumber+TAProperty.m b/Assets/HCMiniSdk/Third/ta/Plugins/iOS/ThinkingSDK/Source/EventTracker/Property/Validate/NSNumber+TAProperty.m new file mode 100755 index 00000000..89fd3ae0 --- /dev/null +++ b/Assets/HCMiniSdk/Third/ta/Plugins/iOS/ThinkingSDK/Source/EventTracker/Property/Validate/NSNumber+TAProperty.m @@ -0,0 +1,20 @@ +// +// NSNumber+TAProperty.m +// Adjust +// +// Created by Yangxiongon 2022/7/1. +// + +#import "NSNumber+TAProperty.h" + +@implementation NSNumber (TAProperty) + +- (void)ta_validatePropertyValueWithError:(NSError *__autoreleasing _Nullable *)error { + if ([self doubleValue] > 9999999999999.999 || [self doubleValue] < -9999999999999.999) { + NSString *errorMsg = [NSString stringWithFormat:@"The number value [%@] is invalid.", self]; + TDLogError(errorMsg); + *error = TAPropertyError(10009, errorMsg); + } +} + +@end diff --git a/Assets/HCMiniSdk/Third/ta/Plugins/iOS/ThinkingSDK/Source/EventTracker/Property/Validate/NSNumber+TAProperty.m.meta b/Assets/HCMiniSdk/Third/ta/Plugins/iOS/ThinkingSDK/Source/EventTracker/Property/Validate/NSNumber+TAProperty.m.meta new file mode 100644 index 00000000..487a923e --- /dev/null +++ b/Assets/HCMiniSdk/Third/ta/Plugins/iOS/ThinkingSDK/Source/EventTracker/Property/Validate/NSNumber+TAProperty.m.meta @@ -0,0 +1,33 @@ +fileFormatVersion: 2 +guid: ab9f77682341e4caab2c9bc15b8edde4 +PluginImporter: + externalObjects: {} + serializedVersion: 2 + iconMap: {} + executionOrder: {} + defineConstraints: [] + isPreloaded: 0 + isOverridable: 0 + isExplicitlyReferenced: 0 + validateReferences: 1 + platformData: + - first: + Any: + second: + enabled: 0 + settings: {} + - first: + Editor: Editor + second: + enabled: 0 + settings: + DefaultValueInitialized: true + - first: + iPhone: iOS + second: + enabled: 1 + settings: + AddToEmbeddedBinaries: false + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/HCMiniSdk/Third/ta/Plugins/iOS/ThinkingSDK/Source/EventTracker/Property/Validate/NSString+TAProperty.h b/Assets/HCMiniSdk/Third/ta/Plugins/iOS/ThinkingSDK/Source/EventTracker/Property/Validate/NSString+TAProperty.h new file mode 100755 index 00000000..711dfa4b --- /dev/null +++ b/Assets/HCMiniSdk/Third/ta/Plugins/iOS/ThinkingSDK/Source/EventTracker/Property/Validate/NSString+TAProperty.h @@ -0,0 +1,17 @@ +// +// NSString+TAProperty.h +// Adjust +// +// Created by Yangxiongon 2022/7/1. +// + +#import +#import "TAValidatorProtocol.h" + +NS_ASSUME_NONNULL_BEGIN + +@interface NSString (TAProperty) + +@end + +NS_ASSUME_NONNULL_END diff --git a/Assets/HCMiniSdk/Third/ta/Plugins/iOS/ThinkingSDK/Source/EventTracker/Property/Validate/NSString+TAProperty.h.meta b/Assets/HCMiniSdk/Third/ta/Plugins/iOS/ThinkingSDK/Source/EventTracker/Property/Validate/NSString+TAProperty.h.meta new file mode 100644 index 00000000..72edb27b --- /dev/null +++ b/Assets/HCMiniSdk/Third/ta/Plugins/iOS/ThinkingSDK/Source/EventTracker/Property/Validate/NSString+TAProperty.h.meta @@ -0,0 +1,33 @@ +fileFormatVersion: 2 +guid: 960562e2d5ca94fbc8fc46b0e396a9b9 +PluginImporter: + externalObjects: {} + serializedVersion: 2 + iconMap: {} + executionOrder: {} + defineConstraints: [] + isPreloaded: 0 + isOverridable: 0 + isExplicitlyReferenced: 0 + validateReferences: 1 + platformData: + - first: + Any: + second: + enabled: 0 + settings: {} + - first: + Editor: Editor + second: + enabled: 0 + settings: + DefaultValueInitialized: true + - first: + iPhone: iOS + second: + enabled: 1 + settings: + AddToEmbeddedBinaries: false + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/HCMiniSdk/Third/ta/Plugins/iOS/ThinkingSDK/Source/EventTracker/Property/Validate/NSString+TAProperty.m b/Assets/HCMiniSdk/Third/ta/Plugins/iOS/ThinkingSDK/Source/EventTracker/Property/Validate/NSString+TAProperty.m new file mode 100755 index 00000000..5751a817 --- /dev/null +++ b/Assets/HCMiniSdk/Third/ta/Plugins/iOS/ThinkingSDK/Source/EventTracker/Property/Validate/NSString+TAProperty.m @@ -0,0 +1,36 @@ +// +// NSString+TAProperty.m +// Adjust +// +// Created by Yangxiongon 2022/7/1. +// + +#import "NSString+TAProperty.h" + + +static NSInteger kTAPropertyNameMaxLength = 50; + +@implementation NSString (TAProperty) + +- (void)ta_validatePropertyKeyWithError:(NSError *__autoreleasing _Nullable *)error { + if (self.length == 0) { + NSString *errorMsg = @"Property key or Event name is empty"; + TDLogError(errorMsg); + *error = TAPropertyError(10003, errorMsg); + return; + } + + if (self.length > kTAPropertyNameMaxLength) { + NSString *errorMsg = [NSString stringWithFormat:@"Property key or Event name %@'s length is longer than %ld", self, kTAPropertyNameMaxLength]; + TDLogError(errorMsg); + *error = TAPropertyError(10006, errorMsg); + return; + } + *error = nil; +} + +- (void)ta_validatePropertyValueWithError:(NSError *__autoreleasing _Nullable *)error { + +} + +@end diff --git a/Assets/HCMiniSdk/Third/ta/Plugins/iOS/ThinkingSDK/Source/EventTracker/Property/Validate/NSString+TAProperty.m.meta b/Assets/HCMiniSdk/Third/ta/Plugins/iOS/ThinkingSDK/Source/EventTracker/Property/Validate/NSString+TAProperty.m.meta new file mode 100644 index 00000000..4d51f1ac --- /dev/null +++ b/Assets/HCMiniSdk/Third/ta/Plugins/iOS/ThinkingSDK/Source/EventTracker/Property/Validate/NSString+TAProperty.m.meta @@ -0,0 +1,33 @@ +fileFormatVersion: 2 +guid: b26e8932d6cf44f19983c1c70e984f64 +PluginImporter: + externalObjects: {} + serializedVersion: 2 + iconMap: {} + executionOrder: {} + defineConstraints: [] + isPreloaded: 0 + isOverridable: 0 + isExplicitlyReferenced: 0 + validateReferences: 1 + platformData: + - first: + Any: + second: + enabled: 0 + settings: {} + - first: + Editor: Editor + second: + enabled: 0 + settings: + DefaultValueInitialized: true + - first: + iPhone: iOS + second: + enabled: 1 + settings: + AddToEmbeddedBinaries: false + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/HCMiniSdk/Third/ta/Plugins/iOS/ThinkingSDK/Source/EventTracker/Property/Validate/TAPropertyDefaultValidator.h b/Assets/HCMiniSdk/Third/ta/Plugins/iOS/ThinkingSDK/Source/EventTracker/Property/Validate/TAPropertyDefaultValidator.h new file mode 100755 index 00000000..3d8ceb60 --- /dev/null +++ b/Assets/HCMiniSdk/Third/ta/Plugins/iOS/ThinkingSDK/Source/EventTracker/Property/Validate/TAPropertyDefaultValidator.h @@ -0,0 +1,17 @@ +// +// TAPropertyDefaultValidator.h +// Adjust +// +// Created by Yangxiongon 2022/7/1. +// + +#import +#import "TAValidatorProtocol.h" + +NS_ASSUME_NONNULL_BEGIN + +@interface TAPropertyDefaultValidator : NSObject + +@end + +NS_ASSUME_NONNULL_END diff --git a/Assets/HCMiniSdk/Third/ta/Plugins/iOS/ThinkingSDK/Source/EventTracker/Property/Validate/TAPropertyDefaultValidator.h.meta b/Assets/HCMiniSdk/Third/ta/Plugins/iOS/ThinkingSDK/Source/EventTracker/Property/Validate/TAPropertyDefaultValidator.h.meta new file mode 100644 index 00000000..7c06d239 --- /dev/null +++ b/Assets/HCMiniSdk/Third/ta/Plugins/iOS/ThinkingSDK/Source/EventTracker/Property/Validate/TAPropertyDefaultValidator.h.meta @@ -0,0 +1,33 @@ +fileFormatVersion: 2 +guid: 10209cc3f32864661980616a08fba498 +PluginImporter: + externalObjects: {} + serializedVersion: 2 + iconMap: {} + executionOrder: {} + defineConstraints: [] + isPreloaded: 0 + isOverridable: 0 + isExplicitlyReferenced: 0 + validateReferences: 1 + platformData: + - first: + Any: + second: + enabled: 0 + settings: {} + - first: + Editor: Editor + second: + enabled: 0 + settings: + DefaultValueInitialized: true + - first: + iPhone: iOS + second: + enabled: 1 + settings: + AddToEmbeddedBinaries: false + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/HCMiniSdk/Third/ta/Plugins/iOS/ThinkingSDK/Source/EventTracker/Property/Validate/TAPropertyDefaultValidator.m b/Assets/HCMiniSdk/Third/ta/Plugins/iOS/ThinkingSDK/Source/EventTracker/Property/Validate/TAPropertyDefaultValidator.m new file mode 100755 index 00000000..8335d6c8 --- /dev/null +++ b/Assets/HCMiniSdk/Third/ta/Plugins/iOS/ThinkingSDK/Source/EventTracker/Property/Validate/TAPropertyDefaultValidator.m @@ -0,0 +1,17 @@ +// +// TAPropertyDefaultValidator.m +// Adjust +// +// Created by Yangxiongon 2022/7/1. +// + +#import "TAPropertyDefaultValidator.h" +#import "TAPropertyValidator.h" + +@implementation TAPropertyDefaultValidator + +- (void)ta_validateKey:(NSString *)key value:(id)value error:(NSError *__autoreleasing _Nullable *)error { + [TAPropertyValidator validateBaseEventPropertyKey:key value:value error:error]; +} + +@end diff --git a/Assets/HCMiniSdk/Third/ta/Plugins/iOS/ThinkingSDK/Source/EventTracker/Property/Validate/TAPropertyDefaultValidator.m.meta b/Assets/HCMiniSdk/Third/ta/Plugins/iOS/ThinkingSDK/Source/EventTracker/Property/Validate/TAPropertyDefaultValidator.m.meta new file mode 100644 index 00000000..65160151 --- /dev/null +++ b/Assets/HCMiniSdk/Third/ta/Plugins/iOS/ThinkingSDK/Source/EventTracker/Property/Validate/TAPropertyDefaultValidator.m.meta @@ -0,0 +1,33 @@ +fileFormatVersion: 2 +guid: 2b07ec42e4638498b82f0400d0c836cb +PluginImporter: + externalObjects: {} + serializedVersion: 2 + iconMap: {} + executionOrder: {} + defineConstraints: [] + isPreloaded: 0 + isOverridable: 0 + isExplicitlyReferenced: 0 + validateReferences: 1 + platformData: + - first: + Any: + second: + enabled: 0 + settings: {} + - first: + Editor: Editor + second: + enabled: 0 + settings: + DefaultValueInitialized: true + - first: + iPhone: iOS + second: + enabled: 1 + settings: + AddToEmbeddedBinaries: false + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/HCMiniSdk/Third/ta/Plugins/iOS/ThinkingSDK/Source/EventTracker/Property/Validate/TAPropertyValidator.h b/Assets/HCMiniSdk/Third/ta/Plugins/iOS/ThinkingSDK/Source/EventTracker/Property/Validate/TAPropertyValidator.h new file mode 100755 index 00000000..2dc1c7a7 --- /dev/null +++ b/Assets/HCMiniSdk/Third/ta/Plugins/iOS/ThinkingSDK/Source/EventTracker/Property/Validate/TAPropertyValidator.h @@ -0,0 +1,30 @@ +// +// TAPropertyValidator.h +// Adjust +// +// Created by Yangxiongon 2022/6/10. +// + +#import +#import "TAValidatorProtocol.h" + +NS_ASSUME_NONNULL_BEGIN + +@interface TAPropertyValidator : NSObject + ++ (void)validateEventOrPropertyName:(NSString *)name withError:(NSError **)error; + ++ (void)validateBaseEventPropertyKey:(NSString *)key value:(NSString *)value error:(NSError **)error; + ++ (void)validateNormalTrackEventPropertyKey:(NSString *)key value:(NSString *)value error:(NSError **)error; + ++ (void)validateAutoTrackEventPropertyKey:(NSString *)key value:(NSString *)value error:(NSError **)error; + + ++ (NSMutableDictionary *)validateProperties:(NSDictionary *)properties; + ++ (NSMutableDictionary *)validateProperties:(NSDictionary *)properties validator:(id)validator; + +@end + +NS_ASSUME_NONNULL_END diff --git a/Assets/HCMiniSdk/Third/ta/Plugins/iOS/ThinkingSDK/Source/EventTracker/Property/Validate/TAPropertyValidator.h.meta b/Assets/HCMiniSdk/Third/ta/Plugins/iOS/ThinkingSDK/Source/EventTracker/Property/Validate/TAPropertyValidator.h.meta new file mode 100644 index 00000000..c61d24cb --- /dev/null +++ b/Assets/HCMiniSdk/Third/ta/Plugins/iOS/ThinkingSDK/Source/EventTracker/Property/Validate/TAPropertyValidator.h.meta @@ -0,0 +1,33 @@ +fileFormatVersion: 2 +guid: 30aac18434029486499fe3f92aac80de +PluginImporter: + externalObjects: {} + serializedVersion: 2 + iconMap: {} + executionOrder: {} + defineConstraints: [] + isPreloaded: 0 + isOverridable: 0 + isExplicitlyReferenced: 0 + validateReferences: 1 + platformData: + - first: + Any: + second: + enabled: 0 + settings: {} + - first: + Editor: Editor + second: + enabled: 0 + settings: + DefaultValueInitialized: true + - first: + iPhone: iOS + second: + enabled: 1 + settings: + AddToEmbeddedBinaries: false + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/HCMiniSdk/Third/ta/Plugins/iOS/ThinkingSDK/Source/EventTracker/Property/Validate/TAPropertyValidator.m b/Assets/HCMiniSdk/Third/ta/Plugins/iOS/ThinkingSDK/Source/EventTracker/Property/Validate/TAPropertyValidator.m new file mode 100755 index 00000000..c6049b1f --- /dev/null +++ b/Assets/HCMiniSdk/Third/ta/Plugins/iOS/ThinkingSDK/Source/EventTracker/Property/Validate/TAPropertyValidator.m @@ -0,0 +1,133 @@ +// +// TAPropertyValidator.m +// Adjust +// +// Created by Yangxiongon 2022/6/10. +// + +#import "TAPropertyValidator.h" +#import "NSString+TAProperty.h" +#import "TAPropertyDefaultValidator.h" + +@implementation TAPropertyValidator + +/// Custom attribute name format validation +static NSString *const kTANormalTrackProperNameValidateRegularExpression = @"^[a-zA-Z][a-zA-Z\\d_]*$"; +/// Custom attribute name regularization +static NSRegularExpression *_regexForNormalTrackValidateKey; + +/// Automatic collection, custom attribute name format validation. All automatic collection of custom attributes needs to meet the following rules +static NSString *const kTAAutoTrackProperNameValidateRegularExpression = @"^([a-zA-Z][a-zA-Z\\d_]{0,49}|\\#(resume_from_background|app_crashed_reason|screen_name|referrer|title|url|element_id|element_type|element_content|element_position|background_duration|start_reason))$"; + +static NSRegularExpression *_regexForAutoTrackValidateKey; + ++ (void)validateEventOrPropertyName:(NSString *)name withError:(NSError *__autoreleasing _Nullable *)error { + if (!name) { + NSString *errorMsg = @"Property key or Event name is empty"; + TDLogError(errorMsg); + *error = TAPropertyError(10003, errorMsg); + return; + } + if (![name isKindOfClass:NSString.class]) { + NSString *errorMsg = [NSString stringWithFormat:@"Property key or Event name is not NSString: [%@]", name]; + TDLogError(errorMsg); + *error = TAPropertyError(10007, errorMsg); + return; + } + + [name ta_validatePropertyKeyWithError:error]; +} + ++ (void)validateBaseEventPropertyKey:(NSString *)key value:(NSString *)value error:(NSError **)error { + + if (![key conformsToProtocol:@protocol(TAPropertyKeyValidating)]) { + NSString *errMsg = [NSString stringWithFormat:@"The property KEY must be NSString. got: %@ %@", [key class], key]; + TDLogError(errMsg); + *error = TAPropertyError(10001, errMsg); + return; + } + [(id )key ta_validatePropertyKeyWithError:error]; + if (*error) { + return; + } + + + if (![value conformsToProtocol:@protocol(TAPropertyValueValidating)]) { + NSString *errMsg = [NSString stringWithFormat:@"Property value must be type NSString, NSNumber, NSDate, NSDictionary or NSArray. got: %@ %@. ", [value class], value]; + TDLogError(errMsg); + *error = TAPropertyError(10002, errMsg); + return; + } + [(id )value ta_validatePropertyValueWithError:error]; +} + ++ (void)validateNormalTrackEventPropertyKey:(NSString *)key value:(NSString *)value error:(NSError **)error { + [self validateBaseEventPropertyKey:key value:value error:error]; + if (*error) { + return; + } + + static dispatch_once_t onceToken; + dispatch_once(&onceToken, ^{ + _regexForNormalTrackValidateKey = [NSRegularExpression regularExpressionWithPattern:kTANormalTrackProperNameValidateRegularExpression options:NSRegularExpressionCaseInsensitive error:nil]; + }); + if (!_regexForNormalTrackValidateKey) { + NSString *errorMsg = @"Property Key validate regular expression init failed"; + TDLogError(errorMsg); + *error = TAPropertyError(10004, errorMsg); + return; + } + NSRange range = NSMakeRange(0, key.length); + if ([_regexForNormalTrackValidateKey numberOfMatchesInString:key options:0 range:range] < 1) { + NSString *errorMsg = [NSString stringWithFormat:@"Property Key or Event name: [%@] is invalid.", key]; + TDLogError(errorMsg); + *error = TAPropertyError(10005, errorMsg); + return; + } +} + ++ (void)validateAutoTrackEventPropertyKey:(NSString *)key value:(NSString *)value error:(NSError **)error { + [self validateBaseEventPropertyKey:key value:value error:error]; + if (*error) { + return; + } + + static dispatch_once_t onceToken; + dispatch_once(&onceToken, ^{ + _regexForAutoTrackValidateKey = [NSRegularExpression regularExpressionWithPattern:kTAAutoTrackProperNameValidateRegularExpression options:NSRegularExpressionCaseInsensitive error:nil]; + }); + if (!_regexForAutoTrackValidateKey) { + NSString *errorMsg = @"Property Key validate regular expression init failed"; + TDLogError(errorMsg); + *error = TAPropertyError(10004, errorMsg); + return; + } + NSRange range = NSMakeRange(0, key.length); + if ([_regexForAutoTrackValidateKey numberOfMatchesInString:key options:0 range:range] < 1) { + NSString *errorMsg = [NSString stringWithFormat:@"Property Key or Event name: [%@] is invalid.", key]; + TDLogError(errorMsg); + *error = TAPropertyError(10005, errorMsg); + return; + } +} + ++ (NSMutableDictionary *)validateProperties:(NSDictionary *)properties { + return [self validateProperties:properties validator:[[TAPropertyDefaultValidator alloc] init]]; +} + ++ (NSMutableDictionary *)validateProperties:(NSDictionary *)properties validator:(id)validator { + if (![properties isKindOfClass:[NSDictionary class]] || ![validator conformsToProtocol:@protocol(TAEventPropertyValidating)]) { + return nil; + } + + for (id key in properties) { + NSError *error = nil; + id value = properties[key]; + + + [validator ta_validateKey:key value:value error:&error]; + } + return [properties copy]; +} + +@end diff --git a/Assets/HCMiniSdk/Third/ta/Plugins/iOS/ThinkingSDK/Source/EventTracker/Property/Validate/TAPropertyValidator.m.meta b/Assets/HCMiniSdk/Third/ta/Plugins/iOS/ThinkingSDK/Source/EventTracker/Property/Validate/TAPropertyValidator.m.meta new file mode 100644 index 00000000..aff2de51 --- /dev/null +++ b/Assets/HCMiniSdk/Third/ta/Plugins/iOS/ThinkingSDK/Source/EventTracker/Property/Validate/TAPropertyValidator.m.meta @@ -0,0 +1,33 @@ +fileFormatVersion: 2 +guid: ee617ee92c42749bdb76ba510b8968fd +PluginImporter: + externalObjects: {} + serializedVersion: 2 + iconMap: {} + executionOrder: {} + defineConstraints: [] + isPreloaded: 0 + isOverridable: 0 + isExplicitlyReferenced: 0 + validateReferences: 1 + platformData: + - first: + Any: + second: + enabled: 0 + settings: {} + - first: + Editor: Editor + second: + enabled: 0 + settings: + DefaultValueInitialized: true + - first: + iPhone: iOS + second: + enabled: 1 + settings: + AddToEmbeddedBinaries: false + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/HCMiniSdk/Third/ta/Plugins/iOS/ThinkingSDK/Source/EventTracker/Property/Validate/TAValidatorProtocol.h b/Assets/HCMiniSdk/Third/ta/Plugins/iOS/ThinkingSDK/Source/EventTracker/Property/Validate/TAValidatorProtocol.h new file mode 100755 index 00000000..58eab5a8 --- /dev/null +++ b/Assets/HCMiniSdk/Third/ta/Plugins/iOS/ThinkingSDK/Source/EventTracker/Property/Validate/TAValidatorProtocol.h @@ -0,0 +1,45 @@ +// +// TAValidatorProtocol.h +// ThinkingSDK +// +// Created by Yangxiongon 2022/7/1. +// + +#ifndef TAValidatorProtocol_h +#define TAValidatorProtocol_h + +#import + +#if __has_include() +#import +#else +#import "TDLogging.h" +#endif + +#define TAPropertyError(errorCode, errorMsg) \ + [NSError errorWithDomain:@"ThinkingAnalyticsErrorDomain" \ + code:errorCode \ + userInfo:@{NSLocalizedDescriptionKey:errorMsg}] \ + + +@protocol TAPropertyKeyValidating + +- (void)ta_validatePropertyKeyWithError:(NSError **)error; + +@end + +/// The validator protocol of the attribute value, used to verify the attribute value +@protocol TAPropertyValueValidating + +- (void)ta_validatePropertyValueWithError:(NSError **)error; + +@end + +/// The validator protocol of event properties, used to verify the key-value of a certain property +@protocol TAEventPropertyValidating + +- (void)ta_validateKey:(NSString *)key value:(id)value error:(NSError **)error; + +@end + +#endif /* TAValidatorProtocol_h */ diff --git a/Assets/HCMiniSdk/Third/ta/Plugins/iOS/ThinkingSDK/Source/EventTracker/Property/Validate/TAValidatorProtocol.h.meta b/Assets/HCMiniSdk/Third/ta/Plugins/iOS/ThinkingSDK/Source/EventTracker/Property/Validate/TAValidatorProtocol.h.meta new file mode 100644 index 00000000..93e88ce5 --- /dev/null +++ b/Assets/HCMiniSdk/Third/ta/Plugins/iOS/ThinkingSDK/Source/EventTracker/Property/Validate/TAValidatorProtocol.h.meta @@ -0,0 +1,33 @@ +fileFormatVersion: 2 +guid: a81d6b532737d49888d8e97d1a2ec085 +PluginImporter: + externalObjects: {} + serializedVersion: 2 + iconMap: {} + executionOrder: {} + defineConstraints: [] + isPreloaded: 0 + isOverridable: 0 + isExplicitlyReferenced: 0 + validateReferences: 1 + platformData: + - first: + Any: + second: + enabled: 0 + settings: {} + - first: + Editor: Editor + second: + enabled: 0 + settings: + DefaultValueInitialized: true + - first: + iPhone: iOS + second: + enabled: 1 + settings: + AddToEmbeddedBinaries: false + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/HCMiniSdk/Third/ta/Plugins/iOS/ThinkingSDK/Source/EventTracker/TAEventTracker.h b/Assets/HCMiniSdk/Third/ta/Plugins/iOS/ThinkingSDK/Source/EventTracker/TAEventTracker.h new file mode 100755 index 00000000..ed830fb8 --- /dev/null +++ b/Assets/HCMiniSdk/Third/ta/Plugins/iOS/ThinkingSDK/Source/EventTracker/TAEventTracker.h @@ -0,0 +1,45 @@ +// +// TAEventTracker.h +// ThinkingSDK +// +// Created by Yangxiongon 2022/6/19. +// + +#import + +#if __has_include() +#import +#else +#import "TDConstant.h" +#endif + +#import "TDSecurityPolicy.h" +#import "ThinkingAnalyticsSDKPrivate.h" + +NS_ASSUME_NONNULL_BEGIN + +@class TAEventTracker; + +@interface TAEventTracker : NSObject + ++ (dispatch_queue_t)td_networkQueue; + +- (instancetype)initWithQueue:(dispatch_queue_t)queue instanceToken:(NSString *)instanceToken; + +- (void)flush; + +- (void)track:(NSDictionary *)event immediately:(BOOL)immediately saveOnly:(BOOL)isSaveOnly; + +- (NSInteger)saveEventsData:(NSDictionary *)data; + +- (void)_asyncWithCompletion:(void(^)(void))completion; + +- (void)syncSendAllData; + +#pragma mark - UNAVAILABLE +- (instancetype)init NS_UNAVAILABLE; ++ (instancetype)new NS_UNAVAILABLE; + +@end + +NS_ASSUME_NONNULL_END diff --git a/Assets/HCMiniSdk/Third/ta/Plugins/iOS/ThinkingSDK/Source/EventTracker/TAEventTracker.h.meta b/Assets/HCMiniSdk/Third/ta/Plugins/iOS/ThinkingSDK/Source/EventTracker/TAEventTracker.h.meta new file mode 100644 index 00000000..d665a069 --- /dev/null +++ b/Assets/HCMiniSdk/Third/ta/Plugins/iOS/ThinkingSDK/Source/EventTracker/TAEventTracker.h.meta @@ -0,0 +1,33 @@ +fileFormatVersion: 2 +guid: 25a31294aac8a4437966d219b2661337 +PluginImporter: + externalObjects: {} + serializedVersion: 2 + iconMap: {} + executionOrder: {} + defineConstraints: [] + isPreloaded: 0 + isOverridable: 0 + isExplicitlyReferenced: 0 + validateReferences: 1 + platformData: + - first: + Any: + second: + enabled: 0 + settings: {} + - first: + Editor: Editor + second: + enabled: 0 + settings: + DefaultValueInitialized: true + - first: + iPhone: iOS + second: + enabled: 1 + settings: + AddToEmbeddedBinaries: false + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/HCMiniSdk/Third/ta/Plugins/iOS/ThinkingSDK/Source/EventTracker/TAEventTracker.m b/Assets/HCMiniSdk/Third/ta/Plugins/iOS/ThinkingSDK/Source/EventTracker/TAEventTracker.m new file mode 100755 index 00000000..7b7937a9 --- /dev/null +++ b/Assets/HCMiniSdk/Third/ta/Plugins/iOS/ThinkingSDK/Source/EventTracker/TAEventTracker.m @@ -0,0 +1,305 @@ +// +// TAEventTracker.m +// ThinkingSDK +// +// Created by Yangxiongon 2022/6/19. +// + +#import "TAEventTracker.h" +#import "TANetwork.h" +#import "TAReachability.h" +#import "TDEventRecord.h" + +static dispatch_queue_t td_networkQueue; + +@interface TAEventTracker () +@property (atomic, strong) TANetwork *network; +@property (atomic, strong) TDConfig *config; +@property (atomic, strong) dispatch_queue_t queue; +@property (nonatomic, strong) TDSqliteDataQueue *dataQueue; + +@end + +@implementation TAEventTracker + ++ (void)initialize { + static dispatch_once_t ThinkingOnceToken; + dispatch_once(&ThinkingOnceToken, ^{ + NSString *queuelabel = [NSString stringWithFormat:@"cn.thinkingdata.%p", (void *)self]; + NSString *networkLabel = [queuelabel stringByAppendingString:@".network"]; + td_networkQueue = dispatch_queue_create([networkLabel UTF8String], DISPATCH_QUEUE_SERIAL); + }); +} + ++ (dispatch_queue_t)td_networkQueue { + return td_networkQueue; +} + +- (instancetype)initWithQueue:(dispatch_queue_t)queue instanceToken:(nonnull NSString *)instanceToken { + if (self = [self init]) { + self.queue = queue; + self.config = [ThinkingAnalyticsSDK sharedInstanceWithAppid:instanceToken].config; + self.network = [self generateNetworkWithConfig:self.config]; + self.dataQueue = [TDSqliteDataQueue sharedInstanceWithAppid:[self.config getMapInstanceToken]]; + } + return self; +} + +- (TANetwork *)generateNetworkWithConfig:(TDConfig *)config { + TANetwork *network = [[TANetwork alloc] init]; + network.debugMode = config.debugMode; + network.appid = config.appid; + network.sessionDidReceiveAuthenticationChallenge = config.securityPolicy.sessionDidReceiveAuthenticationChallenge; + network.serverURL = [NSURL URLWithString:[NSString stringWithFormat:@"%@/sync", config.configureURL]]; + network.serverDebugURL = [NSURL URLWithString:[NSString stringWithFormat:@"%@/data_debug", config.configureURL]]; + network.securityPolicy = config.securityPolicy; + return network; +} + +//MARK: - Public + +- (void)track:(NSDictionary *)event immediately:(BOOL)immediately saveOnly:(BOOL)isSaveOnly { + ThinkingAnalyticsDebugMode debugMode = self.config.debugMode; + NSInteger count = 0; + if (debugMode == ThinkingAnalyticsDebugOnly || debugMode == ThinkingAnalyticsDebug) { + + if (isSaveOnly) { + return; + } + TDLogDebug(@"queueing debug data: %@", event); + dispatch_async(self.queue, ^{ + dispatch_async(td_networkQueue, ^{ + [self flushDebugEvent:event]; + }); + }); + // ThinkingAnalyticsDebug Mode After the data is sent, it will still be stored locally, so it is necessary to query the database data to determine whether the number of records is sufficient for uploading + @synchronized (TDSqliteDataQueue.class) { + count = [self.dataQueue sqliteCountForAppid:[self.config getMapInstanceToken]]; + } + } else { + if (immediately) { + + if (isSaveOnly) { + return; + } + TDLogDebug(@"queueing data flush immediately:%@", event); + dispatch_async(self.queue, ^{ + dispatch_async(td_networkQueue, ^{ + [self flushImmediately:event]; + }); + }); + } else { + TDLogDebug(@"queueing data:%@", event); + count = [self saveEventsData:event]; + } + } + if (count >= [self.config.uploadSize integerValue]) { + + if (isSaveOnly) { + return; + } + TDLogDebug(@"flush action, count: %ld, uploadSize: %d",count, [self.config.uploadSize integerValue]); + [self flush]; + } +} + +- (void)flushImmediately:(NSDictionary *)event { + [self.network flushEvents:@[event]]; +} + +- (NSInteger)saveEventsData:(NSDictionary *)data { + NSMutableDictionary *event = [[NSMutableDictionary alloc] initWithDictionary:data]; + NSInteger count = 0; + @synchronized (TDSqliteDataQueue.class) { + + if (_config.enableEncrypt) { +#if TARGET_OS_IOS + NSDictionary *encryptData = [[ThinkingAnalyticsSDK sharedInstanceWithAppid:self.config.appid].encryptManager encryptJSONObject:event]; + if (encryptData == nil) { + encryptData = event; + } + count = [self.dataQueue addObject:encryptData withAppid:[self.config getMapInstanceToken]]; +#elif TARGET_OS_OSX + count = [self.dataQueue addObject:event withAppid:[self.config getMapInstanceToken]]; +#endif + } else { + count = [self.dataQueue addObject:event withAppid:[self.config getMapInstanceToken]]; + } + } + return count; +} + +- (void)flushDebugEvent:(NSDictionary *)event { + if (self.config.debugMode == ThinkingAnalyticsDebug || self.config.debugMode == ThinkingAnalyticsDebugOnly) { + int debugResult = [self.network flushDebugEvents:event withAppid:self.config.appid]; + if (debugResult == -1) { + // Downgrade + if (self.config.debugMode == ThinkingAnalyticsDebug) { + dispatch_async(self.queue, ^{ + [self saveEventsData:event]; + }); + + self.config.debugMode = ThinkingAnalyticsDebugOff; + self.network.debugMode = ThinkingAnalyticsDebugOff; + } else if (self.config.debugMode == ThinkingAnalyticsDebugOnly) { + TDLogDebug(@"The data will be discarded due to this device is not allowed to debug:%@", event); + } + } + else if (debugResult == -2) { + TDLogDebug(@"Exception occurred when sending message to Server:%@", event); + if (self.config.debugMode == ThinkingAnalyticsDebug) { + + dispatch_async(self.queue, ^{ + [self saveEventsData:event]; + }); + } + } + } else { + + NSInteger count = [self saveEventsData:event]; + if (count >= [self.config.uploadSize integerValue]) { + [self flush]; + } + } +} + +- (void)flush { + [self _asyncWithCompletion:^{}]; +} + +/// Synchronize data asynchronously (synchronize data in the local database to TA) +/// Need to add this event to the serialQueue queue +/// In some scenarios, event warehousing and sending network requests happen at the same time. Event storage is performed in serialQueue, and data reporting is performed in networkQueue. To ensure that events are stored first, you need to add the reported data operation to serialQueue +- (void)_asyncWithCompletion:(void(^)(void))completion { + + void(^block)(void) = ^{ + dispatch_async(td_networkQueue, ^{ + [self _syncWithSize:kBatchSize completion:completion]; + }); + }; + if (dispatch_queue_get_label(DISPATCH_CURRENT_QUEUE_LABEL) == dispatch_queue_get_label(self.queue)) { + block(); + } else { + dispatch_async(self.queue, block); + } +} + +/// Synchronize data (synchronize the data in the local database to TA) +/// @param size The maximum number of items obtained from the database each time, the default is 50 +/// @param completion synchronous callback +/// This method needs to be performed in networkQueue, and will continue to send network requests until the data in the database is sent +- (void)_syncWithSize:(NSUInteger)size completion:(void(^)(void))completion { + + + NSString *networkType = [[TAReachability shareInstance] networkState]; + if (!([TAReachability convertNetworkType:networkType] & self.config.networkTypePolicy)) { + if (completion) { + completion(); + } + return; + } + + NSArray *recordArray; + NSArray *recodIds; + NSArray *uuids; + @synchronized (TDSqliteDataQueue.class) { + + NSArray *records = [self.dataQueue getFirstRecords:kBatchSize withAppid:[self.config getMapInstanceToken]]; + NSArray *encryptRecords = [self encryptEventRecords:records]; + NSMutableArray *indexs = [[NSMutableArray alloc] initWithCapacity:encryptRecords.count]; + NSMutableArray *recordContents = [[NSMutableArray alloc] initWithCapacity:encryptRecords.count]; + for (TDEventRecord *record in encryptRecords) { + [indexs addObject:record.index]; + [recordContents addObject:record.event]; + } + recodIds = indexs; + recordArray = recordContents; + + + uuids = [self.dataQueue upadteRecordIds:recodIds]; + } + + + if (recordArray.count == 0 || uuids.count == 0) { + if (completion) { + completion(); + } + return; + } + + + + BOOL flushSucc = YES; + while (recordArray.count > 0 && uuids.count > 0 && flushSucc) { + flushSucc = [self.network flushEvents:recordArray]; + if (flushSucc) { + @synchronized (TDSqliteDataQueue.class) { + BOOL ret = [self.dataQueue removeDataWithuids:uuids]; + if (!ret) { + break; + } + + NSArray *records = [self.dataQueue getFirstRecords:kBatchSize withAppid:[self.config getMapInstanceToken]]; + NSArray *encryptRecords = [self encryptEventRecords:records]; + NSMutableArray *indexs = [[NSMutableArray alloc] initWithCapacity:encryptRecords.count]; + NSMutableArray *recordContents = [[NSMutableArray alloc] initWithCapacity:encryptRecords.count]; + for (TDEventRecord *record in encryptRecords) { + [indexs addObject:record.index]; + [recordContents addObject:record.event]; + } + recodIds = indexs; + recordArray = recordContents; + + + uuids = [self.dataQueue upadteRecordIds:recodIds]; + } + } else { + break; + } + } + if (completion) { + completion(); + } +} + +- (NSArray *)encryptEventRecords:(NSArray *)records { +#if TARGET_OS_IOS + NSMutableArray *encryptRecords = [NSMutableArray arrayWithCapacity:records.count]; + + TDEncryptManager *encryptManager = [ThinkingAnalyticsSDK sharedInstanceWithAppid:[self.config getMapInstanceToken]].encryptManager; + + if (self.config.enableEncrypt && encryptManager.isValid) { + for (TDEventRecord *record in records) { + + if (record.encrypted) { + + [encryptRecords addObject:record]; + } else { + + NSDictionary *obj = [encryptManager encryptJSONObject:record.event]; + if (obj) { + [record setSecretObject:obj]; + [encryptRecords addObject:record]; + } else { + [encryptRecords addObject:record]; + } + } + } + return encryptRecords.count == 0 ? records : encryptRecords; + } else { + return records; + } +#elif TARGET_OS_OSX + return records; +#endif +} + +- (void)syncSendAllData { + dispatch_sync(td_networkQueue, ^{}); +} + + +//MARK: - Setter & Getter + + +@end diff --git a/Assets/HCMiniSdk/Third/ta/Plugins/iOS/ThinkingSDK/Source/EventTracker/TAEventTracker.m.meta b/Assets/HCMiniSdk/Third/ta/Plugins/iOS/ThinkingSDK/Source/EventTracker/TAEventTracker.m.meta new file mode 100644 index 00000000..11bf973a --- /dev/null +++ b/Assets/HCMiniSdk/Third/ta/Plugins/iOS/ThinkingSDK/Source/EventTracker/TAEventTracker.m.meta @@ -0,0 +1,33 @@ +fileFormatVersion: 2 +guid: 76cc4a8ecec114ad3b0f46f4ffef5827 +PluginImporter: + externalObjects: {} + serializedVersion: 2 + iconMap: {} + executionOrder: {} + defineConstraints: [] + isPreloaded: 0 + isOverridable: 0 + isExplicitlyReferenced: 0 + validateReferences: 1 + platformData: + - first: + Any: + second: + enabled: 0 + settings: {} + - first: + Editor: Editor + second: + enabled: 0 + settings: + DefaultValueInitialized: true + - first: + iPhone: iOS + second: + enabled: 1 + settings: + AddToEmbeddedBinaries: false + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/HCMiniSdk/Third/ta/Plugins/iOS/ThinkingSDK/Source/EventTracker/TrackDuration.meta b/Assets/HCMiniSdk/Third/ta/Plugins/iOS/ThinkingSDK/Source/EventTracker/TrackDuration.meta new file mode 100644 index 00000000..81b4af79 --- /dev/null +++ b/Assets/HCMiniSdk/Third/ta/Plugins/iOS/ThinkingSDK/Source/EventTracker/TrackDuration.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: 42a60c1e385b74b2da608fb4a875b5f2 +folderAsset: yes +DefaultImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/HCMiniSdk/Third/ta/Plugins/iOS/ThinkingSDK/Source/EventTracker/TrackDuration/TATrackTimer.h b/Assets/HCMiniSdk/Third/ta/Plugins/iOS/ThinkingSDK/Source/EventTracker/TrackDuration/TATrackTimer.h new file mode 100755 index 00000000..a311c813 --- /dev/null +++ b/Assets/HCMiniSdk/Third/ta/Plugins/iOS/ThinkingSDK/Source/EventTracker/TrackDuration/TATrackTimer.h @@ -0,0 +1,33 @@ +// +// TATrackTimer.h +// ThinkingSDK +// +// Created by Yangxiongon 2022/6/1. +// Copyright © 2022 thinking. All rights reserved. +// + +#import + +NS_ASSUME_NONNULL_BEGIN + +@interface TATrackTimer : NSObject + +- (void)trackEvent:(NSString *)eventName withSystemUptime:(NSTimeInterval)systemUptime; + +- (void)enterForegroundWithSystemUptime:(NSTimeInterval)systemUptime; + +- (void)enterBackgroundWithSystemUptime:(NSTimeInterval)systemUptime; + +- (NSTimeInterval)foregroundDurationOfEvent:(NSString * _Nonnull)eventName isActive:(BOOL)isActive systemUptime:(NSTimeInterval)systemUptime; + +- (NSTimeInterval)backgroundDurationOfEvent:(NSString * _Nonnull)eventName isActive:(BOOL)isActive systemUptime:(NSTimeInterval)systemUptime; + +- (void)removeEvent:(NSString * _Nonnull)eventName; + +- (BOOL)isExistEvent:(NSString * _Nonnull)eventName; + +- (void)clear; + +@end + +NS_ASSUME_NONNULL_END diff --git a/Assets/HCMiniSdk/Third/ta/Plugins/iOS/ThinkingSDK/Source/EventTracker/TrackDuration/TATrackTimer.h.meta b/Assets/HCMiniSdk/Third/ta/Plugins/iOS/ThinkingSDK/Source/EventTracker/TrackDuration/TATrackTimer.h.meta new file mode 100644 index 00000000..f0cf3a6c --- /dev/null +++ b/Assets/HCMiniSdk/Third/ta/Plugins/iOS/ThinkingSDK/Source/EventTracker/TrackDuration/TATrackTimer.h.meta @@ -0,0 +1,33 @@ +fileFormatVersion: 2 +guid: 02df16e16437346039195db4c5a720e9 +PluginImporter: + externalObjects: {} + serializedVersion: 2 + iconMap: {} + executionOrder: {} + defineConstraints: [] + isPreloaded: 0 + isOverridable: 0 + isExplicitlyReferenced: 0 + validateReferences: 1 + platformData: + - first: + Any: + second: + enabled: 0 + settings: {} + - first: + Editor: Editor + second: + enabled: 0 + settings: + DefaultValueInitialized: true + - first: + iPhone: iOS + second: + enabled: 1 + settings: + AddToEmbeddedBinaries: false + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/HCMiniSdk/Third/ta/Plugins/iOS/ThinkingSDK/Source/EventTracker/TrackDuration/TATrackTimer.m b/Assets/HCMiniSdk/Third/ta/Plugins/iOS/ThinkingSDK/Source/EventTracker/TrackDuration/TATrackTimer.m new file mode 100755 index 00000000..af2b91e0 --- /dev/null +++ b/Assets/HCMiniSdk/Third/ta/Plugins/iOS/ThinkingSDK/Source/EventTracker/TrackDuration/TATrackTimer.m @@ -0,0 +1,125 @@ +// +// TATrackTimer.m +// ThinkingSDK +// +// Created by Yangxiongon 2022/6/1. +// Copyright © 2022 thinking. All rights reserved. +// + +#import "TATrackTimer.h" +#import "TATrackTimerItem.h" +#import "TAThreadSafeDictionary.h" +#import "TDDeviceInfo.h" + +@interface TATrackTimer () +@property (nonatomic, strong) TAThreadSafeDictionary *events; + +@end + +@implementation TATrackTimer + +- (instancetype)init +{ + self = [super init]; + if (self) { + self.events = [TAThreadSafeDictionary dictionary]; + } + return self; +} + +- (void)trackEvent:(NSString *)eventName withSystemUptime:(NSTimeInterval)systemUptime { + if (!eventName.length) { + return; + } + TATrackTimerItem *item = [[TATrackTimerItem alloc] init]; + item.beginTime = systemUptime ?: [TDDeviceInfo uptime]; + self.events[eventName] = item; +} + +- (void)enterForegroundWithSystemUptime:(NSTimeInterval)systemUptime { + NSArray *keys = [self.events allKeys]; + for (NSString *key in keys) { + TATrackTimerItem *item = self.events[key]; + item.beginTime = systemUptime; + if (item.enterBackgroundTime == 0) { + item.backgroundDuration = 0; + } else { + item.backgroundDuration = systemUptime - item.enterBackgroundTime + item.backgroundDuration; + } + } +} + +- (void)enterBackgroundWithSystemUptime:(NSTimeInterval)systemUptime { + NSArray *keys = [self.events allKeys]; + for (NSString *key in keys) { + TATrackTimerItem *item = self.events[key]; + item.enterBackgroundTime = systemUptime; + item.foregroundDuration = systemUptime - item.beginTime + item.foregroundDuration; + } +} + +- (NSTimeInterval)foregroundDurationOfEvent:(NSString *)eventName isActive:(BOOL)isActive systemUptime:(NSTimeInterval)systemUptime { + if (!eventName.length) { + return 0; + } + TATrackTimerItem *item = self.events[eventName]; + if (!item) { + return 0; + } + + if (isActive) { + NSTimeInterval duration = systemUptime - item.beginTime + item.foregroundDuration; + return [self validateDuration:duration eventName:eventName]; + } else { + return [self validateDuration:item.foregroundDuration eventName:eventName]; + } + +} + +- (NSTimeInterval)backgroundDurationOfEvent:(NSString *)eventName isActive:(BOOL)isActive systemUptime:(NSTimeInterval)systemUptime { + if (!eventName.length) { + return 0; + } + TATrackTimerItem *item = self.events[eventName]; + if (!item) { + return 0; + } + if (isActive) { + return [self validateDuration:item.backgroundDuration eventName:eventName]; + } else { + NSTimeInterval duration = 0; + if (item.enterBackgroundTime == 0) { + duration = 0; + } else { + duration = systemUptime - item.enterBackgroundTime + item.backgroundDuration; + } + return [self validateDuration:duration eventName:eventName]; + } +} + +- (void)removeEvent:(NSString *)eventName { + [self.events removeObjectForKey:eventName]; +} + +- (BOOL)isExistEvent:(NSString *)eventName { + return self.events[eventName] != nil; +} + +- (void)clear { + [self.events removeAllObjects]; +} + +//MARK: - Private Methods + +- (NSTimeInterval)validateDuration:(NSTimeInterval)duration eventName:(NSString *)eventName { + NSInteger max = 3600 * 24; + if (duration >= max) { + return max; + } + + return duration; +} + +@end + + diff --git a/Assets/HCMiniSdk/Third/ta/Plugins/iOS/ThinkingSDK/Source/EventTracker/TrackDuration/TATrackTimer.m.meta b/Assets/HCMiniSdk/Third/ta/Plugins/iOS/ThinkingSDK/Source/EventTracker/TrackDuration/TATrackTimer.m.meta new file mode 100644 index 00000000..46163f8b --- /dev/null +++ b/Assets/HCMiniSdk/Third/ta/Plugins/iOS/ThinkingSDK/Source/EventTracker/TrackDuration/TATrackTimer.m.meta @@ -0,0 +1,33 @@ +fileFormatVersion: 2 +guid: a721e1fffac1e4ceebd6fd82cc5ae5e0 +PluginImporter: + externalObjects: {} + serializedVersion: 2 + iconMap: {} + executionOrder: {} + defineConstraints: [] + isPreloaded: 0 + isOverridable: 0 + isExplicitlyReferenced: 0 + validateReferences: 1 + platformData: + - first: + Any: + second: + enabled: 0 + settings: {} + - first: + Editor: Editor + second: + enabled: 0 + settings: + DefaultValueInitialized: true + - first: + iPhone: iOS + second: + enabled: 1 + settings: + AddToEmbeddedBinaries: false + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/HCMiniSdk/Third/ta/Plugins/iOS/ThinkingSDK/Source/EventTracker/TrackDuration/TATrackTimerItem.h b/Assets/HCMiniSdk/Third/ta/Plugins/iOS/ThinkingSDK/Source/EventTracker/TrackDuration/TATrackTimerItem.h new file mode 100755 index 00000000..87931ff9 --- /dev/null +++ b/Assets/HCMiniSdk/Third/ta/Plugins/iOS/ThinkingSDK/Source/EventTracker/TrackDuration/TATrackTimerItem.h @@ -0,0 +1,25 @@ +// +// TATrackTimerItem.h +// ThinkingSDK +// +// Created by Yangxiongon 2022/6/1. +// Copyright © 2022 thinking. All rights reserved. +// + +#import + +NS_ASSUME_NONNULL_BEGIN + +@interface TATrackTimerItem : NSObject +/// The moment when the event starts to be recorded (the total time the device has been running) +@property (nonatomic, assign) NSTimeInterval beginTime; +/// Accumulated time in the foreground +@property (nonatomic, assign) NSTimeInterval foregroundDuration; +/// The time the event entered the background (total time the device has been running) +@property (nonatomic, assign) NSTimeInterval enterBackgroundTime; +/// accumulated time in the background +@property (nonatomic, assign) NSTimeInterval backgroundDuration; + +@end + +NS_ASSUME_NONNULL_END diff --git a/Assets/HCMiniSdk/Third/ta/Plugins/iOS/ThinkingSDK/Source/EventTracker/TrackDuration/TATrackTimerItem.h.meta b/Assets/HCMiniSdk/Third/ta/Plugins/iOS/ThinkingSDK/Source/EventTracker/TrackDuration/TATrackTimerItem.h.meta new file mode 100644 index 00000000..eb57d4d2 --- /dev/null +++ b/Assets/HCMiniSdk/Third/ta/Plugins/iOS/ThinkingSDK/Source/EventTracker/TrackDuration/TATrackTimerItem.h.meta @@ -0,0 +1,33 @@ +fileFormatVersion: 2 +guid: b9079b5ca242b4772b1a94d607ce0f99 +PluginImporter: + externalObjects: {} + serializedVersion: 2 + iconMap: {} + executionOrder: {} + defineConstraints: [] + isPreloaded: 0 + isOverridable: 0 + isExplicitlyReferenced: 0 + validateReferences: 1 + platformData: + - first: + Any: + second: + enabled: 0 + settings: {} + - first: + Editor: Editor + second: + enabled: 0 + settings: + DefaultValueInitialized: true + - first: + iPhone: iOS + second: + enabled: 1 + settings: + AddToEmbeddedBinaries: false + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/HCMiniSdk/Third/ta/Plugins/iOS/ThinkingSDK/Source/EventTracker/TrackDuration/TATrackTimerItem.m b/Assets/HCMiniSdk/Third/ta/Plugins/iOS/ThinkingSDK/Source/EventTracker/TrackDuration/TATrackTimerItem.m new file mode 100755 index 00000000..e2cee1c4 --- /dev/null +++ b/Assets/HCMiniSdk/Third/ta/Plugins/iOS/ThinkingSDK/Source/EventTracker/TrackDuration/TATrackTimerItem.m @@ -0,0 +1,17 @@ +// +// TATrackTimerItem.m +// ThinkingSDK +// +// Created by Yangxiongon 2022/6/1. +// Copyright © 2022 thinking. All rights reserved. +// + +#import "TATrackTimerItem.h" + +@implementation TATrackTimerItem + +-(NSString *)description { + return [NSString stringWithFormat:@"beginTime: %lf, foregroundDuration: %lf, enterBackgroundTime: %lf, backgroundDuration: %lf", _beginTime, _foregroundDuration, _enterBackgroundTime, _backgroundDuration];; +} + +@end diff --git a/Assets/HCMiniSdk/Third/ta/Plugins/iOS/ThinkingSDK/Source/EventTracker/TrackDuration/TATrackTimerItem.m.meta b/Assets/HCMiniSdk/Third/ta/Plugins/iOS/ThinkingSDK/Source/EventTracker/TrackDuration/TATrackTimerItem.m.meta new file mode 100644 index 00000000..56b5ed47 --- /dev/null +++ b/Assets/HCMiniSdk/Third/ta/Plugins/iOS/ThinkingSDK/Source/EventTracker/TrackDuration/TATrackTimerItem.m.meta @@ -0,0 +1,33 @@ +fileFormatVersion: 2 +guid: 5cf39076613f447f286ae90e210745ad +PluginImporter: + externalObjects: {} + serializedVersion: 2 + iconMap: {} + executionOrder: {} + defineConstraints: [] + isPreloaded: 0 + isOverridable: 0 + isExplicitlyReferenced: 0 + validateReferences: 1 + platformData: + - first: + Any: + second: + enabled: 0 + settings: {} + - first: + Editor: Editor + second: + enabled: 0 + settings: + DefaultValueInitialized: true + - first: + iPhone: iOS + second: + enabled: 1 + settings: + AddToEmbeddedBinaries: false + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/HCMiniSdk/Third/ta/Plugins/iOS/ThinkingSDK/Source/Exception.meta b/Assets/HCMiniSdk/Third/ta/Plugins/iOS/ThinkingSDK/Source/Exception.meta new file mode 100644 index 00000000..de99cb0d --- /dev/null +++ b/Assets/HCMiniSdk/Third/ta/Plugins/iOS/ThinkingSDK/Source/Exception.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: 424ad4c901eb74799ac16ee8ebcf5c5a +folderAsset: yes +DefaultImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/HCMiniSdk/Third/ta/Plugins/iOS/ThinkingSDK/Source/Exception/ThinkingExceptionHandler.h b/Assets/HCMiniSdk/Third/ta/Plugins/iOS/ThinkingSDK/Source/Exception/ThinkingExceptionHandler.h new file mode 100755 index 00000000..6919fa86 --- /dev/null +++ b/Assets/HCMiniSdk/Third/ta/Plugins/iOS/ThinkingSDK/Source/Exception/ThinkingExceptionHandler.h @@ -0,0 +1,21 @@ +#import + +#import "ThinkingAnalyticsSDKPrivate.h" + +NS_ASSUME_NONNULL_BEGIN + +@interface ThinkingExceptionHandler : NSObject + +@property (nonatomic, strong) NSHashTable *thinkingAnalyticsSDKInstances; + +@property (nonatomic) NSUncaughtExceptionHandler *td_lastExceptionHandler; + +@property (nonatomic, unsafe_unretained) struct sigaction *td_signalHandlers; + ++ (instancetype)sharedHandler; + +- (void)addThinkingInstance:(ThinkingAnalyticsSDK *)instance; + +@end + +NS_ASSUME_NONNULL_END diff --git a/Assets/HCMiniSdk/Third/ta/Plugins/iOS/ThinkingSDK/Source/Exception/ThinkingExceptionHandler.h.meta b/Assets/HCMiniSdk/Third/ta/Plugins/iOS/ThinkingSDK/Source/Exception/ThinkingExceptionHandler.h.meta new file mode 100644 index 00000000..e3d8c779 --- /dev/null +++ b/Assets/HCMiniSdk/Third/ta/Plugins/iOS/ThinkingSDK/Source/Exception/ThinkingExceptionHandler.h.meta @@ -0,0 +1,33 @@ +fileFormatVersion: 2 +guid: 324500141046444d2b21f6b4a110accc +PluginImporter: + externalObjects: {} + serializedVersion: 2 + iconMap: {} + executionOrder: {} + defineConstraints: [] + isPreloaded: 0 + isOverridable: 0 + isExplicitlyReferenced: 0 + validateReferences: 1 + platformData: + - first: + Any: + second: + enabled: 0 + settings: {} + - first: + Editor: Editor + second: + enabled: 0 + settings: + DefaultValueInitialized: true + - first: + iPhone: iOS + second: + enabled: 1 + settings: + AddToEmbeddedBinaries: false + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/HCMiniSdk/Third/ta/Plugins/iOS/ThinkingSDK/Source/Exception/ThinkingExceptionHandler.m b/Assets/HCMiniSdk/Third/ta/Plugins/iOS/ThinkingSDK/Source/Exception/ThinkingExceptionHandler.m new file mode 100755 index 00000000..8c62b34a --- /dev/null +++ b/Assets/HCMiniSdk/Third/ta/Plugins/iOS/ThinkingSDK/Source/Exception/ThinkingExceptionHandler.m @@ -0,0 +1,179 @@ +#import "ThinkingExceptionHandler.h" + +#include +#include +#import "TDLogging.h" +#import "TDPresetProperties+TDDisProperties.h" + +static NSString * const TDUncaughtExceptionHandlerSignalExceptionName = @"UncaughtExceptionHandlerSignalExceptionName"; +static NSString * const TDUncaughtExceptionHandlerSignalKey = @"UncaughtExceptionHandlerSignalKey"; +static int TDSignals[] = {SIGILL, SIGABRT, SIGBUS, SIGSEGV, SIGFPE, SIGPIPE, SIGTRAP}; +static volatile atomic_int_fast32_t TDExceptionCount = 0; +static const atomic_int_fast32_t TDExceptionMaximum = 9; + +@implementation ThinkingExceptionHandler + ++ (instancetype)sharedHandler { + static ThinkingExceptionHandler *gSharedHandler = nil; + static dispatch_once_t onceToken; + dispatch_once(&onceToken, ^{ + gSharedHandler = [[ThinkingExceptionHandler alloc] init]; + }); + return gSharedHandler; +} + +- (instancetype)init { + self = [super init]; + if (self) { + _thinkingAnalyticsSDKInstances = [NSHashTable weakObjectsHashTable]; + _td_signalHandlers = calloc(NSIG, sizeof(struct sigaction)); + [self setupHandlers]; + } + return self; +} + +- (void)setupHandlers { + _td_lastExceptionHandler = NSGetUncaughtExceptionHandler(); + NSSetUncaughtExceptionHandler(&TDHandleException); + + struct sigaction action; + sigemptyset(&action.sa_mask); + action.sa_flags = SA_SIGINFO; + action.sa_sigaction = &TDSignalHandler; + for (int i = 0; i < sizeof(TDSignals) / sizeof(int); i++) { + struct sigaction prev_action; + int err = sigaction(TDSignals[i], &action, &prev_action); + if (err == 0) { + memcpy(_td_signalHandlers + TDSignals[i], &prev_action, sizeof(prev_action)); + } else { + TDLogError(@"Error Signal: %d", TDSignals[i]); + } + } +} + +static void TDHandleException(NSException *exception) { + ThinkingExceptionHandler *handler = [ThinkingExceptionHandler sharedHandler]; + + atomic_int_fast32_t exceptionCount = atomic_fetch_add_explicit(&TDExceptionCount, 1, memory_order_relaxed); + if (exceptionCount <= TDExceptionMaximum) { + [handler td_handleUncaughtException:exception]; + } + if (handler.td_lastExceptionHandler) { + handler.td_lastExceptionHandler(exception); + } +} + +static void TDSignalHandler(int signalNumber, struct __siginfo *info, void *context) { + ThinkingExceptionHandler *handler = [ThinkingExceptionHandler sharedHandler]; + NSMutableDictionary *crashInfo; + NSString *reason; + NSException *exception; + + atomic_int_fast32_t exceptionCount = atomic_fetch_add_explicit(&TDExceptionCount, 1, memory_order_relaxed); + if (exceptionCount <= TDExceptionMaximum) { + [crashInfo setObject:[NSNumber numberWithInt:signalNumber] forKey:TDUncaughtExceptionHandlerSignalKey]; + reason = [NSString stringWithFormat:@"Signal %d was raised.", signalNumber]; + exception = [NSException exceptionWithName:TDUncaughtExceptionHandlerSignalExceptionName reason:reason userInfo:crashInfo]; + [handler td_handleUncaughtException:exception]; + } + + struct sigaction prev_action = handler.td_signalHandlers[signalNumber]; + if (prev_action.sa_handler == SIG_DFL) { + signal(signalNumber, SIG_DFL); + raise(signalNumber); + return; + } + if (prev_action.sa_flags & SA_SIGINFO) { + if (prev_action.sa_sigaction) { + prev_action.sa_sigaction(signalNumber, info, context); + } + } else if (prev_action.sa_handler) { + prev_action.sa_handler(signalNumber); + } +} + + +- (void)td_handleUncaughtException:(NSException *)exception { + NSDate *trackDate = [NSDate date]; + NSDictionary *dic = [self td_getCrashInfo:exception]; + for (ThinkingAnalyticsSDK *instance in self.thinkingAnalyticsSDKInstances) { + TAAutoTrackEvent *crashEvent = [[TAAutoTrackEvent alloc] initWithName:TD_APP_CRASH_EVENT]; + crashEvent.time = trackDate; + [instance autoTrackWithEvent:crashEvent properties:dic]; + + if (![instance isAutoTrackEventTypeIgnored:ThinkingAnalyticsEventTypeAppEnd]) { + TAAutoTrackEvent *appEndEvent = [[TAAutoTrackEvent alloc] initWithName:TD_APP_END_EVENT]; + appEndEvent.time = trackDate; + [instance autoTrackWithEvent:appEndEvent properties:nil]; + } + } + + dispatch_sync([ThinkingAnalyticsSDK td_trackQueue], ^{}); + dispatch_sync([ThinkingAnalyticsSDK td_networkQueue], ^{}); + + NSSetUncaughtExceptionHandler(NULL); + for (int i = 0; i < sizeof(TDSignals) / sizeof(int); i++) { + signal(TDSignals[i], SIG_DFL); + } +} + +- (NSMutableDictionary *)td_getCrashInfo:(NSException *)exception { + NSMutableDictionary *properties = [[NSMutableDictionary alloc] init]; + + + if ([TDPresetProperties disableAppCrashedReason]) { + return properties; + } + + NSString *crashStr; + @try { + if ([exception callStackSymbols]) { + crashStr = [NSString stringWithFormat:@"Exception Reason:%@\nException Stack:%@", [exception reason], [exception callStackSymbols]]; + } else { + NSString *exceptionStack = [[NSThread callStackSymbols] componentsJoinedByString:@"\n"]; + crashStr = [NSString stringWithFormat:@"%@ %@", [exception reason], exceptionStack]; + } + crashStr = [crashStr stringByReplacingOccurrencesOfString:@"\n" withString:@"
"]; + + NSUInteger strLength = [((NSString *)crashStr) lengthOfBytesUsingEncoding:NSUTF8StringEncoding]; + NSUInteger strMaxLength = TA_PROPERTY_CRASH_LENGTH_LIMIT; + if (strLength > strMaxLength) { + crashStr = [NSMutableString stringWithString:[self limitString:crashStr withLength:strMaxLength - 1]]; + } + + [properties setValue:crashStr forKey:TD_CRASH_REASON]; + } @catch(NSException *exception) { + TDLogError(@"%@ error: %@", self, exception); + } + return properties; +} + +- (NSString *)limitString:(NSString *)originalString withLength:(NSInteger)length { + NSStringEncoding encoding = CFStringConvertEncodingToNSStringEncoding(kCFStringEncodingUTF8); + NSData *originalData = [originalString dataUsingEncoding:encoding]; + NSData *subData = [originalData subdataWithRange:NSMakeRange(0, length)]; + NSString *limitString = [[NSString alloc] initWithData:subData encoding:encoding]; + + NSInteger index = 1; + while (index <= 3 && !limitString) { + if (length > index) { + subData = [originalData subdataWithRange:NSMakeRange(0, length - index)]; + limitString = [[NSString alloc] initWithData:subData encoding:encoding]; + } + index ++; + } + + if (!limitString) { + return originalString; + } + return limitString; +} + +- (void)addThinkingInstance:(ThinkingAnalyticsSDK *)instance { + NSParameterAssert(instance != nil); + if (![self.thinkingAnalyticsSDKInstances containsObject:instance]) { + [self.thinkingAnalyticsSDKInstances addObject:instance]; + } +} + +@end diff --git a/Assets/HCMiniSdk/Third/ta/Plugins/iOS/ThinkingSDK/Source/Exception/ThinkingExceptionHandler.m.meta b/Assets/HCMiniSdk/Third/ta/Plugins/iOS/ThinkingSDK/Source/Exception/ThinkingExceptionHandler.m.meta new file mode 100644 index 00000000..a8812a33 --- /dev/null +++ b/Assets/HCMiniSdk/Third/ta/Plugins/iOS/ThinkingSDK/Source/Exception/ThinkingExceptionHandler.m.meta @@ -0,0 +1,33 @@ +fileFormatVersion: 2 +guid: 117c7c030e0b54e6e8f897168f54a42a +PluginImporter: + externalObjects: {} + serializedVersion: 2 + iconMap: {} + executionOrder: {} + defineConstraints: [] + isPreloaded: 0 + isOverridable: 0 + isExplicitlyReferenced: 0 + validateReferences: 1 + platformData: + - first: + Any: + second: + enabled: 0 + settings: {} + - first: + Editor: Editor + second: + enabled: 0 + settings: + DefaultValueInitialized: true + - first: + iPhone: iOS + second: + enabled: 1 + settings: + AddToEmbeddedBinaries: false + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/HCMiniSdk/Third/ta/Plugins/iOS/ThinkingSDK/Source/Extension.meta b/Assets/HCMiniSdk/Third/ta/Plugins/iOS/ThinkingSDK/Source/Extension.meta new file mode 100644 index 00000000..13c168cd --- /dev/null +++ b/Assets/HCMiniSdk/Third/ta/Plugins/iOS/ThinkingSDK/Source/Extension.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: f6281fd6e40514383a3715cdbec97b68 +folderAsset: yes +DefaultImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/HCMiniSdk/Third/ta/Plugins/iOS/ThinkingSDK/Source/Extension/TAAppExtensionAnalytic.h b/Assets/HCMiniSdk/Third/ta/Plugins/iOS/ThinkingSDK/Source/Extension/TAAppExtensionAnalytic.h new file mode 100755 index 00000000..33e6938e --- /dev/null +++ b/Assets/HCMiniSdk/Third/ta/Plugins/iOS/ThinkingSDK/Source/Extension/TAAppExtensionAnalytic.h @@ -0,0 +1,45 @@ +// +// TAAppExtensionAnalytic.h +// ThinkingSDK +// +// Created by Yangxiongon 2022/5/25. +// Copyright © 2022 thinking. All rights reserved. +// + +#import + +NS_ASSUME_NONNULL_BEGIN + +/// key: event name in App Extension +extern NSString * const kTAAppExtensionEventName; +/// key: event properties in App Extension +extern NSString * const kTAAppExtensionEventProperties; +/// key: event properties +extern NSString * const kTAAppExtensionTime; +/// key: event properties +extern NSString * const kTAAppExtensionEventPropertiesSource; + +@interface TAAppExtensionAnalytic : NSObject + ++ (void)calibrateTime:(NSTimeInterval)timestamp; + ++ (void)calibrateTimeWithNtp:(NSString *)ntpServer; + +/// Initialize an event collection object +/// @param instanceName The unique identifier of the event collection object +/// @param appGroupId share App Group ID ++ (TAAppExtensionAnalytic *)analyticWithInstanceName:(NSString * _Nonnull)instanceName appGroupId:(NSString * _Nonnull)appGroupId; + +/// write event +/// @param eventName eventName +/// @param properties properties +/// @return Whether (YES/NO) write success +- (BOOL)writeEvent:(NSString * _Nonnull)eventName properties:(NSDictionary * _Nullable)properties; + +- (NSArray *)readAllEvents; + +- (BOOL)deleteEvents; + +@end + +NS_ASSUME_NONNULL_END diff --git a/Assets/HCMiniSdk/Third/ta/Plugins/iOS/ThinkingSDK/Source/Extension/TAAppExtensionAnalytic.h.meta b/Assets/HCMiniSdk/Third/ta/Plugins/iOS/ThinkingSDK/Source/Extension/TAAppExtensionAnalytic.h.meta new file mode 100644 index 00000000..56771861 --- /dev/null +++ b/Assets/HCMiniSdk/Third/ta/Plugins/iOS/ThinkingSDK/Source/Extension/TAAppExtensionAnalytic.h.meta @@ -0,0 +1,33 @@ +fileFormatVersion: 2 +guid: d29b61a9bf83b4bfb91793d274d453b9 +PluginImporter: + externalObjects: {} + serializedVersion: 2 + iconMap: {} + executionOrder: {} + defineConstraints: [] + isPreloaded: 0 + isOverridable: 0 + isExplicitlyReferenced: 0 + validateReferences: 1 + platformData: + - first: + Any: + second: + enabled: 0 + settings: {} + - first: + Editor: Editor + second: + enabled: 0 + settings: + DefaultValueInitialized: true + - first: + iPhone: iOS + second: + enabled: 1 + settings: + AddToEmbeddedBinaries: false + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/HCMiniSdk/Third/ta/Plugins/iOS/ThinkingSDK/Source/Extension/TAAppExtensionAnalytic.m b/Assets/HCMiniSdk/Third/ta/Plugins/iOS/ThinkingSDK/Source/Extension/TAAppExtensionAnalytic.m new file mode 100755 index 00000000..9811247d --- /dev/null +++ b/Assets/HCMiniSdk/Third/ta/Plugins/iOS/ThinkingSDK/Source/Extension/TAAppExtensionAnalytic.m @@ -0,0 +1,222 @@ +// +// TAAppExtensionAnalytic.m +// ThinkingSDK +// +// Created by Yangxiongon 2022/5/25. +// Copyright © 2022 thinking. All rights reserved. +// + +#import "TAAppExtensionAnalytic.h" +#import "TAAppExtensionAnalyticConfig.h" + +#if __has_include() +#import +#else +#import "TDCalibratedTimeWithNTP.h" +#endif + +#if __has_include() +#import +#import +#else +#import "TDCalibratedTime.h" +#import "TDDeviceInfo.h" +#endif + + +NSString * const kTAAppExtensionEventName = @"ta_app_extension_event_name"; +NSString * const kTAAppExtensionEventProperties = @"ta_app_extension_properties"; +NSString * const kTAAppExtensionTime = @"time"; +NSString * const kTAAppExtensionEventPropertiesSource = @"from_app_extension"; + +@interface TAAppExtensionAnalytic() +@property (nonatomic, strong) TAAppExtensionAnalyticConfig *config; + +@end + +void *TAAppExtensionQueueTag = &TAAppExtensionQueueTag; + +static NSMutableDictionary *_instances; + +static dispatch_queue_t _appExtensionQueue; + +static TDCalibratedTime *_calibrateTimeManage; + +@implementation TAAppExtensionAnalytic + +//MARK: - Public Methods + ++ (void)initialize { + static dispatch_once_t onceToken; + dispatch_once(&onceToken, ^{ + _instances = [NSMutableDictionary dictionary]; + + _appExtensionQueue = dispatch_queue_create("cn.thinkingdata.appExtensionQueue", DISPATCH_QUEUE_SERIAL); + dispatch_queue_set_specific(_appExtensionQueue, TAAppExtensionQueueTag, &TAAppExtensionQueueTag, NULL); + }); +} + ++ (TAAppExtensionAnalytic *)analyticWithInstanceName:(NSString * _Nonnull)instanceName appGroupId:(NSString * _Nonnull)appGroupId { + @synchronized (self) { + TAAppExtensionAnalyticConfig *config = [[TAAppExtensionAnalyticConfig alloc] init]; + config.instanceName = instanceName; + config.appGroupId = appGroupId; + TAAppExtensionAnalytic *analytic = [self analyticWithConfig:config]; + return analytic; + } +} + ++ (TAAppExtensionAnalytic *)analyticWithConfig:(TAAppExtensionAnalyticConfig *)config { + @synchronized (self) { + if (![config.instanceName isKindOfClass:NSString.class] || !config.instanceName.length) { + return nil; + } + if (![config.appGroupId isKindOfClass:NSString.class] || !config.appGroupId.length) { + return nil; + } + if (_instances[config.instanceName]) { + return _instances[config.instanceName]; + } else { + TAAppExtensionAnalytic *analytic = [[TAAppExtensionAnalytic alloc] init]; + analytic.config = config; + _instances[config.instanceName] = analytic; + return analytic; + } + } +} + ++ (void)calibrateTime:(NSTimeInterval)timestamp { + _calibrateTimeManage = [TDCalibratedTime sharedInstance]; + [[TDCalibratedTime sharedInstance] recalibrationWithTimeInterval:timestamp/1000.]; +} + ++ (void)calibrateTimeWithNtp:(NSString *)ntpServer { + if ([ntpServer isKindOfClass:[NSString class]] && ntpServer.length > 0) { + _calibrateTimeManage = [TDCalibratedTimeWithNTP sharedInstance]; + [[TDCalibratedTimeWithNTP sharedInstance] recalibrationWithNtps:@[ntpServer]]; + } +} + +- (BOOL)writeEvent:(NSString *)eventName properties:(NSDictionary *)properties { + @try { + if (![eventName isKindOfClass:NSString.class] || !eventName.length) { + return NO; + } + if (properties && ![properties isKindOfClass:NSDictionary.class]) { + return NO; + } + + NSMutableDictionary *mutableProperties = [NSMutableDictionary dictionaryWithDictionary:properties]; + mutableProperties[kTAAppExtensionEventPropertiesSource] = @(true); + + __block BOOL result = NO; + dispatch_block_t block = ^{ + NSDictionary *event = @{ + kTAAppExtensionEventName: eventName, + kTAAppExtensionEventProperties: mutableProperties, + kTAAppExtensionTime: [self calibrateDate:[NSDate date]], + }; + NSString *path = [self filePathForApplicationGroup]; + if(![[NSFileManager defaultManager] fileExistsAtPath:path]) { + NSDictionary *attributes = nil; +#if TARGET_OS_IOS + attributes = [NSDictionary dictionaryWithObject:NSFileProtectionComplete forKey:NSFileProtectionKey]; +#endif + [[NSFileManager defaultManager] createFileAtPath:path contents:nil attributes:attributes]; + } + NSMutableArray *mutableArray = [[NSMutableArray alloc] initWithContentsOfFile:path]; + if (mutableArray.count) { + [mutableArray addObject:event]; + } else { + mutableArray = [NSMutableArray arrayWithObject:event]; + } + NSError *err = NULL; + NSData *data= [NSPropertyListSerialization dataWithPropertyList:mutableArray format:NSPropertyListBinaryFormat_v1_0 options:0 error:&err]; + if (path.length && data.length) { + result = [data writeToFile:path options:NSDataWritingAtomic error:nil]; + } + }; + if (dispatch_get_specific(TAAppExtensionQueueTag)) { + block(); + } else { + dispatch_sync(_appExtensionQueue, block); + } + return result; + } @catch (NSException *exception) { + return NO; + } +} + +- (NSArray *)readAllEvents { + @try { + __block NSArray *dataArray = @[]; + dispatch_block_t block = ^() { + NSString *path = [self filePathForApplicationGroup]; + NSMutableArray *array = [[NSMutableArray alloc] initWithContentsOfFile:path]; + dataArray = array; + }; + if (dispatch_get_specific(TAAppExtensionQueueTag)) { + block(); + } else { + dispatch_sync(_appExtensionQueue, block); + } + return dataArray; + } @catch (NSException *exception) { + return @[]; + } +} + +- (BOOL)deleteEvents { + @try { + __block BOOL result = NO; + dispatch_block_t block = ^{ + NSString *path = [self filePathForApplicationGroup]; + NSMutableArray *array = [[NSMutableArray alloc] init]; + NSData *data= [NSPropertyListSerialization dataWithPropertyList:array format:NSPropertyListBinaryFormat_v1_0 options:0 error:nil]; + if (path.length && data.length) { + result = [data writeToFile:path options:NSDataWritingAtomic error:nil]; + } + }; + if (dispatch_get_specific(TAAppExtensionQueueTag)) { + block(); + } else { + dispatch_sync(_appExtensionQueue, block); + } + return result ; + } @catch (NSException *exception) { + return NO; + } +} + +//MARK: - Private Methods + +- (NSString *)filePathForApplicationGroup { + @try { + __block NSString *filePath = nil; + dispatch_block_t block = ^() { + NSString *fileName = [NSString stringWithFormat:@"thinking_data_events_%@.plist", self.config.instanceName]; + NSURL *pathUrl = [[[NSFileManager defaultManager] containerURLForSecurityApplicationGroupIdentifier:self.config.appGroupId] URLByAppendingPathComponent:fileName]; + filePath = pathUrl.path; + }; + if (dispatch_get_specific(TAAppExtensionQueueTag)) { + block(); + } else { + dispatch_sync(_appExtensionQueue, block); + } + return filePath; + } @catch (NSException *exception) { + return nil; + } +} + +- (NSDate *)calibrateDate:(NSDate *)date { + if (_calibrateTimeManage && !_calibrateTimeManage.stopCalibrate) { + NSTimeInterval systemUptime = [TDDeviceInfo uptime]; + NSTimeInterval outTime = systemUptime - _calibrateTimeManage.systemUptime; + NSDate *serverDate = [NSDate dateWithTimeIntervalSince1970:(_calibrateTimeManage.serverTime + outTime)]; + return serverDate; + } + return date; +} + +@end diff --git a/Assets/HCMiniSdk/Third/ta/Plugins/iOS/ThinkingSDK/Source/Extension/TAAppExtensionAnalytic.m.meta b/Assets/HCMiniSdk/Third/ta/Plugins/iOS/ThinkingSDK/Source/Extension/TAAppExtensionAnalytic.m.meta new file mode 100644 index 00000000..39718c3d --- /dev/null +++ b/Assets/HCMiniSdk/Third/ta/Plugins/iOS/ThinkingSDK/Source/Extension/TAAppExtensionAnalytic.m.meta @@ -0,0 +1,33 @@ +fileFormatVersion: 2 +guid: ffe0bce5d4ab84b068f25717f9182286 +PluginImporter: + externalObjects: {} + serializedVersion: 2 + iconMap: {} + executionOrder: {} + defineConstraints: [] + isPreloaded: 0 + isOverridable: 0 + isExplicitlyReferenced: 0 + validateReferences: 1 + platformData: + - first: + Any: + second: + enabled: 0 + settings: {} + - first: + Editor: Editor + second: + enabled: 0 + settings: + DefaultValueInitialized: true + - first: + iPhone: iOS + second: + enabled: 1 + settings: + AddToEmbeddedBinaries: false + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/HCMiniSdk/Third/ta/Plugins/iOS/ThinkingSDK/Source/Extension/TAAppExtensionAnalyticConfig.h b/Assets/HCMiniSdk/Third/ta/Plugins/iOS/ThinkingSDK/Source/Extension/TAAppExtensionAnalyticConfig.h new file mode 100755 index 00000000..d2f1b92f --- /dev/null +++ b/Assets/HCMiniSdk/Third/ta/Plugins/iOS/ThinkingSDK/Source/Extension/TAAppExtensionAnalyticConfig.h @@ -0,0 +1,20 @@ +// +// TAAppExtensionAnalyticConfig.h +// Pods +// +// Created by Yangxiongon 2022/5/31. +// + +#import + +NS_ASSUME_NONNULL_BEGIN + +@interface TAAppExtensionAnalyticConfig : NSObject +/// instance tag +@property (nonatomic, copy) NSString *instanceName; +/// app group identifier +@property (nonatomic, copy) NSString *appGroupId; + +@end + +NS_ASSUME_NONNULL_END diff --git a/Assets/HCMiniSdk/Third/ta/Plugins/iOS/ThinkingSDK/Source/Extension/TAAppExtensionAnalyticConfig.h.meta b/Assets/HCMiniSdk/Third/ta/Plugins/iOS/ThinkingSDK/Source/Extension/TAAppExtensionAnalyticConfig.h.meta new file mode 100644 index 00000000..2fda0c53 --- /dev/null +++ b/Assets/HCMiniSdk/Third/ta/Plugins/iOS/ThinkingSDK/Source/Extension/TAAppExtensionAnalyticConfig.h.meta @@ -0,0 +1,33 @@ +fileFormatVersion: 2 +guid: caf2548d944054aea9e5ac386f6ab816 +PluginImporter: + externalObjects: {} + serializedVersion: 2 + iconMap: {} + executionOrder: {} + defineConstraints: [] + isPreloaded: 0 + isOverridable: 0 + isExplicitlyReferenced: 0 + validateReferences: 1 + platformData: + - first: + Any: + second: + enabled: 0 + settings: {} + - first: + Editor: Editor + second: + enabled: 0 + settings: + DefaultValueInitialized: true + - first: + iPhone: iOS + second: + enabled: 1 + settings: + AddToEmbeddedBinaries: false + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/HCMiniSdk/Third/ta/Plugins/iOS/ThinkingSDK/Source/Extension/TAAppExtensionAnalyticConfig.m b/Assets/HCMiniSdk/Third/ta/Plugins/iOS/ThinkingSDK/Source/Extension/TAAppExtensionAnalyticConfig.m new file mode 100755 index 00000000..d7ede5c0 --- /dev/null +++ b/Assets/HCMiniSdk/Third/ta/Plugins/iOS/ThinkingSDK/Source/Extension/TAAppExtensionAnalyticConfig.m @@ -0,0 +1,12 @@ +// +// TAAppExtensionAnalyticConfig.m +// Pods +// +// Created by Yangxiongon 2022/5/31. +// + +#import "TAAppExtensionAnalyticConfig.h" + +@implementation TAAppExtensionAnalyticConfig + +@end diff --git a/Assets/HCMiniSdk/Third/ta/Plugins/iOS/ThinkingSDK/Source/Extension/TAAppExtensionAnalyticConfig.m.meta b/Assets/HCMiniSdk/Third/ta/Plugins/iOS/ThinkingSDK/Source/Extension/TAAppExtensionAnalyticConfig.m.meta new file mode 100644 index 00000000..27350b04 --- /dev/null +++ b/Assets/HCMiniSdk/Third/ta/Plugins/iOS/ThinkingSDK/Source/Extension/TAAppExtensionAnalyticConfig.m.meta @@ -0,0 +1,33 @@ +fileFormatVersion: 2 +guid: 37d85022a16cd4c149edc9d524f30953 +PluginImporter: + externalObjects: {} + serializedVersion: 2 + iconMap: {} + executionOrder: {} + defineConstraints: [] + isPreloaded: 0 + isOverridable: 0 + isExplicitlyReferenced: 0 + validateReferences: 1 + platformData: + - first: + Any: + second: + enabled: 0 + settings: {} + - first: + Editor: Editor + second: + enabled: 0 + settings: + DefaultValueInitialized: true + - first: + iPhone: iOS + second: + enabled: 1 + settings: + AddToEmbeddedBinaries: false + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/HCMiniSdk/Third/ta/Plugins/iOS/ThinkingSDK/Source/Network.meta b/Assets/HCMiniSdk/Third/ta/Plugins/iOS/ThinkingSDK/Source/Network.meta new file mode 100644 index 00000000..c36ad052 --- /dev/null +++ b/Assets/HCMiniSdk/Third/ta/Plugins/iOS/ThinkingSDK/Source/Network.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: a0ac6f354c3474862987da42fe4db1aa +folderAsset: yes +DefaultImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/HCMiniSdk/Third/ta/Plugins/iOS/ThinkingSDK/Source/Network/TANetwork.h b/Assets/HCMiniSdk/Third/ta/Plugins/iOS/ThinkingSDK/Source/Network/TANetwork.h new file mode 100755 index 00000000..e2b34cce --- /dev/null +++ b/Assets/HCMiniSdk/Third/ta/Plugins/iOS/ThinkingSDK/Source/Network/TANetwork.h @@ -0,0 +1,27 @@ +#import + +#import "ThinkingAnalyticsSDKPrivate.h" + +NS_ASSUME_NONNULL_BEGIN + +typedef void (^TDFlushConfigBlock)(NSDictionary *result, NSError * _Nullable error); + +@interface TANetwork : NSObject + +@property (nonatomic, copy) NSString *appid; +@property (nonatomic, strong) NSURL *serverURL; + +@property (nonatomic, strong) NSURL *serverDebugURL; +@property (nonatomic, assign) ThinkingAnalyticsDebugMode debugMode; +@property (nonatomic, strong) TDSecurityPolicy *securityPolicy; +@property (nonatomic, copy) TDURLSessionDidReceiveAuthenticationChallengeBlock sessionDidReceiveAuthenticationChallenge; + +- (BOOL)flushEvents:(NSArray *)events; +//- (void)flushEvents:(NSArray *)recordArray completion:(nullable void(^)(BOOL))completion; +- (void)fetchRemoteConfig:(NSString *)appid handler:(TDFlushConfigBlock)handler; +- (int)flushDebugEvents:(NSDictionary *)record withAppid:(NSString *)appid; + +@end + +NS_ASSUME_NONNULL_END + diff --git a/Assets/HCMiniSdk/Third/ta/Plugins/iOS/ThinkingSDK/Source/Network/TANetwork.h.meta b/Assets/HCMiniSdk/Third/ta/Plugins/iOS/ThinkingSDK/Source/Network/TANetwork.h.meta new file mode 100644 index 00000000..89fe951a --- /dev/null +++ b/Assets/HCMiniSdk/Third/ta/Plugins/iOS/ThinkingSDK/Source/Network/TANetwork.h.meta @@ -0,0 +1,33 @@ +fileFormatVersion: 2 +guid: e738aeace517d4800b67f4a001537d69 +PluginImporter: + externalObjects: {} + serializedVersion: 2 + iconMap: {} + executionOrder: {} + defineConstraints: [] + isPreloaded: 0 + isOverridable: 0 + isExplicitlyReferenced: 0 + validateReferences: 1 + platformData: + - first: + Any: + second: + enabled: 0 + settings: {} + - first: + Editor: Editor + second: + enabled: 0 + settings: + DefaultValueInitialized: true + - first: + iPhone: iOS + second: + enabled: 1 + settings: + AddToEmbeddedBinaries: false + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/HCMiniSdk/Third/ta/Plugins/iOS/ThinkingSDK/Source/Network/TANetwork.m b/Assets/HCMiniSdk/Third/ta/Plugins/iOS/ThinkingSDK/Source/Network/TANetwork.m new file mode 100755 index 00000000..d9dbf05c --- /dev/null +++ b/Assets/HCMiniSdk/Third/ta/Plugins/iOS/ThinkingSDK/Source/Network/TANetwork.m @@ -0,0 +1,309 @@ +#import "TANetwork.h" + +#import "NSData+TDGzip.h" +#import "TDJSONUtil.h" +#import "TDLogging.h" +#import "TDSecurityPolicy.h" +#import "TDAppState.h" + +#if TARGET_OS_IOS +#import "TDToastView.h" +#endif + +static NSString *kTAIntegrationType = @"TA-Integration-Type"; +static NSString *kTAIntegrationVersion = @"TA-Integration-Version"; +static NSString *kTAIntegrationCount = @"TA-Integration-Count"; +static NSString *kTAIntegrationExtra = @"TA-Integration-Extra"; +static NSString *kTADatasType = @"TA-Datas-Type"; + +@implementation TANetwork + +- (NSURLSession *)sharedURLSession { + static NSURLSession *sharedSession = nil; + @synchronized(self) { + if (sharedSession == nil) { + NSURLSessionConfiguration *sessionConfig = [NSURLSessionConfiguration defaultSessionConfiguration]; + sharedSession = [NSURLSession sessionWithConfiguration:sessionConfig delegate:self delegateQueue:nil]; + } + } + return sharedSession; +} + +- (NSString *)URLEncode:(NSString *)string { + NSString *encodedString = [string stringByAddingPercentEncodingWithAllowedCharacters:[[NSCharacterSet characterSetWithCharactersInString:@"?!@#$^&%*+,:;='\"`<>()[]{}/\\| "] invertedSet]]; + return encodedString; +} + +- (int)flushDebugEvents:(NSDictionary *)record withAppid:(NSString *)appid { + __block int debugResult = -1; + NSMutableDictionary *recordDic = [record mutableCopy]; + NSMutableDictionary *properties = [[recordDic objectForKey:@"properties"] mutableCopy]; + + if ([ThinkingAnalyticsSDK isTrackEvent:[record objectForKey:@"#type"]]) { + @synchronized ([TDDeviceInfo sharedManager]) { + [properties addEntriesFromDictionary:[[TDDeviceInfo sharedManager] getAutomaticData]]; + } + } + [recordDic setObject:properties forKey:@"properties"]; + NSString *jsonString = [TDJSONUtil JSONStringForObject:recordDic]; + NSMutableURLRequest *request = [self buildDebugRequestWithJSONString:jsonString withAppid:appid withDeviceId:[[[TDDeviceInfo sharedManager] getAutomaticData] objectForKey:@"#device_id"]]; + dispatch_semaphore_t flushSem = dispatch_semaphore_create(0); + + void (^block)(NSData *, NSURLResponse *, NSError *) = ^(NSData *data, NSURLResponse *response, NSError *error) { + + if (error || ![response isKindOfClass:[NSHTTPURLResponse class]]) { + debugResult = -2; + TDLogError(@"Debug Networking error:%@", error); + [self callbackNetworkErrorWithRequest:jsonString error:error.debugDescription]; + dispatch_semaphore_signal(flushSem); + return; + } + NSHTTPURLResponse *urlResponse = (NSHTTPURLResponse *)response; + if ([urlResponse statusCode] == 200) { + NSError *err; + + if (!data) { + return; + } + + NSDictionary *retDic = [NSJSONSerialization JSONObjectWithData:data options:kNilOptions error:&err]; + if (err) { + TDLogError(@"Debug data json error:%@", err); + debugResult = -2; + } else if ([[retDic objectForKey:@"errorLevel"] isEqualToNumber:[NSNumber numberWithInt:1]]) { + debugResult = 1; + NSArray* errorProperties = [retDic objectForKey:@"errorProperties"]; + NSMutableString *errorStr = [NSMutableString string]; + for (id obj in errorProperties) { + NSString *errorReasons = [obj objectForKey:@"errorReason"]; + NSString *propertyName = [obj objectForKey:@"propertyName"]; + [errorStr appendFormat:@" propertyName:%@ errorReasons:%@\n", propertyName, errorReasons]; + } + TDLogError(@"Debug data error:%@", errorStr); + } else if ([[retDic objectForKey:@"errorLevel"] isEqualToNumber:[NSNumber numberWithInt:2]]) { + debugResult = 2; + NSString *errorReasons = [[retDic objectForKey:@"errorReasons"] componentsJoinedByString:@" "]; + TDLogError(@"Debug data error:%@", errorReasons); + } else if ([[retDic objectForKey:@"errorLevel"] isEqualToNumber:[NSNumber numberWithInt:0]]) { + debugResult = 0; + TDLogDebug(@"Verify data success."); + } else if ([[retDic objectForKey:@"errorLevel"] isEqualToNumber:[NSNumber numberWithInt:-1]]) { + debugResult = -1; + NSString *errorReasons = [[retDic objectForKey:@"errorReasons"] componentsJoinedByString:@" "]; + TDLogError(@"Debug mode error:%@", errorReasons); + } + + static dispatch_once_t onceToken; + dispatch_once(&onceToken, ^{ + if (debugResult == 0 || debugResult == 1 || debugResult == 2) { +#if TARGET_OS_IOS + dispatch_async(dispatch_get_main_queue(), ^{ + UIApplication *application = [TDAppState sharedApplication]; + if (![application isKindOfClass:UIApplication.class]) { + return; + } + UIWindow *window = application.keyWindow; + [TDToastView showInWindow:window text:[NSString stringWithFormat:@"The current mode is:%@", self.debugMode == ThinkingAnalyticsDebugOnly ? @"DebugOnly(Data is not persisted) \n The test joint debugging stage is allowed to open \n Please turn off the Debug function before the official launch" : @"Debug"] duration:2.0]; + }); +#endif + } + }); + + @try { + if ([retDic isKindOfClass:[NSDictionary class]]) { + if ([[(NSDictionary *)retDic objectForKey:@"errorLevel"] integerValue] != 0) { + NSData *jsonData = [NSJSONSerialization dataWithJSONObject:retDic options:NSJSONWritingPrettyPrinted error:NULL]; + NSString *string = [[NSString alloc] initWithData:jsonData encoding:NSUTF8StringEncoding]; + [self callbackNetworkErrorWithRequest:jsonString error:string]; + } + } + } @catch (NSException *exception) { + + } + } else { + debugResult = -2; + NSString *urlResponse = [[NSString alloc] initWithData:data encoding:NSUTF8StringEncoding]; + TDLogError(@"%@", [NSString stringWithFormat:@"Debug %@ network failed with response '%@'.", self, urlResponse]); + [self callbackNetworkErrorWithRequest:jsonString error:urlResponse]; + } + dispatch_semaphore_signal(flushSem); + }; + + NSURLSessionDataTask *task = [[self sharedURLSession] dataTaskWithRequest:request completionHandler:block]; + [task resume]; + + dispatch_semaphore_wait(flushSem, DISPATCH_TIME_FOREVER); + return debugResult; +} + +- (BOOL)flushEvents:(NSArray *)recordArray { + __block BOOL flushSucc = YES; + UInt64 time = [[NSDate date] timeIntervalSince1970] * 1000; + NSDictionary *flushDic = @{ + @"data": recordArray, + @"#app_id": self.appid, + @"#flush_time": @(time), + }; + + __block BOOL isEncrypt; + [recordArray enumerateObjectsUsingBlock:^(NSDictionary * _Nonnull obj, NSUInteger idx, BOOL * _Nonnull stop) { + if ([obj.allKeys containsObject:@"ekey"]) { + isEncrypt = YES; + *stop = YES; + } + }]; + + NSString *jsonString = [TDJSONUtil JSONStringForObject:flushDic]; + NSMutableURLRequest *request = [self buildRequestWithJSONString:jsonString]; + [request addValue:[TDDeviceInfo sharedManager].libName forHTTPHeaderField:kTAIntegrationType]; + [request addValue:[TDDeviceInfo sharedManager].libVersion forHTTPHeaderField:kTAIntegrationVersion]; + [request addValue:@(recordArray.count).stringValue forHTTPHeaderField:kTAIntegrationCount]; + [request addValue:@"iOS" forHTTPHeaderField:kTAIntegrationExtra]; + if (isEncrypt) { + [request addValue:@"1" forHTTPHeaderField:kTADatasType]; + } +// [request addValue:@"Keep-Alive" forHTTPHeaderField:@"Connection"]; +// [request addValue:@"timeout=15,max=100" forHTTPHeaderField:@"Keep-Alive"]; + + dispatch_semaphore_t flushSem = dispatch_semaphore_create(0); + + void (^block)(NSData *, NSURLResponse *, NSError *) = ^(NSData *data, NSURLResponse *response, NSError *error) { + if (error || ![response isKindOfClass:[NSHTTPURLResponse class]]) { + flushSucc = NO; + TDLogError(@"Networking error:%@", error); + [self callbackNetworkErrorWithRequest:jsonString error:error.debugDescription]; + dispatch_semaphore_signal(flushSem); + return; + } + + NSHTTPURLResponse *urlResponse = (NSHTTPURLResponse *)response; + if ([urlResponse statusCode] == 200) { + flushSucc = YES; + TDLogDebug(@"flush success sendContent---->:%@",flushDic); + if (!data) { + return; + } + id result = [NSJSONSerialization JSONObjectWithData:data options:kNilOptions error:nil]; + TDLogDebug(@"flush success responseData---->%@",result); + + @try { + if ([result isKindOfClass:[NSDictionary class]]) { + if ([[(NSDictionary *)result objectForKey:@"code"] integerValue] != 0) { + NSData *jsonData = [NSJSONSerialization dataWithJSONObject:result options:NSJSONWritingPrettyPrinted error:NULL]; + NSString *string = [[NSString alloc] initWithData:jsonData encoding:NSUTF8StringEncoding]; + [self callbackNetworkErrorWithRequest:jsonString error:string]; + } + } + } @catch (NSException *exception) { + + } + + } else { + flushSucc = NO; + NSString *urlResponse = [[NSString alloc] initWithData:data encoding:NSUTF8StringEncoding]; + TDLogError(@"%@", [NSString stringWithFormat:@"%@ network failed with response '%@'.", self, urlResponse]); + [self callbackNetworkErrorWithRequest:jsonString error:urlResponse]; + } + + dispatch_semaphore_signal(flushSem); + }; + + NSURLSessionDataTask *task = [[self sharedURLSession] dataTaskWithRequest:request completionHandler:block]; + [task resume]; + dispatch_semaphore_wait(flushSem, DISPATCH_TIME_FOREVER); + return flushSucc; +} + +- (void)callbackNetworkErrorWithRequest:(NSString *)request error:(NSString *)error { + if (request == nil && error == nil) return; + + ThinkingAnalyticsSDK *tdSDK = [ThinkingAnalyticsSDK sharedInstanceWithAppid:self.appid]; + if (tdSDK.errorCallback) { + NSInteger code = 10001; + NSString *errorMsg = error; + NSString *ext = request; + tdSDK.errorCallback(code, errorMsg, ext); + } +} + +- (NSMutableURLRequest *)buildRequestWithJSONString:(NSString *)jsonString { + + NSData *zippedData = [NSData td_gzipData:[jsonString dataUsingEncoding:NSUTF8StringEncoding]]; + NSString *postBody = [zippedData base64EncodedStringWithOptions:0]; + NSMutableURLRequest *request = [NSMutableURLRequest requestWithURL:self.serverURL]; +// NSMutableURLRequest *request = [NSMutableURLRequest requestWithURL:[NSURL URLWithString:@"http://192.168.20.23:8991/sync"]]; + [request setHTTPMethod:@"POST"]; + [request setHTTPBody:[postBody dataUsingEncoding:NSUTF8StringEncoding]]; + NSString *contentType = [NSString stringWithFormat:@"text/plain"]; + [request addValue:contentType forHTTPHeaderField:@"Content-Type"]; + [request setTimeoutInterval:60.0]; + return request; +} + +- (NSMutableURLRequest *)buildDebugRequestWithJSONString:(NSString *)jsonString withAppid:(NSString *)appid withDeviceId:(NSString *)deviceId { + // dryRun=0, if the verification is passed, it will be put into storage. dryRun=1, no storage + int dryRun = _debugMode == ThinkingAnalyticsDebugOnly ? 1 : 0; + NSString *postData = [NSString stringWithFormat:@"appid=%@&source=client&dryRun=%d&deviceId=%@&data=%@", appid, dryRun, deviceId, [self URLEncode:jsonString]]; + NSMutableURLRequest *request = [NSMutableURLRequest requestWithURL:self.serverDebugURL]; + [request setHTTPMethod:@"POST"]; + request.HTTPBody = [postData dataUsingEncoding:NSUTF8StringEncoding]; + return request; +} + +- (void)fetchRemoteConfig:(NSString *)appid handler:(TDFlushConfigBlock)handler { + void (^block)(NSData *, NSURLResponse *, NSError *) = ^(NSData *data, NSURLResponse *response, NSError *error) { + if (error || ![response isKindOfClass:[NSHTTPURLResponse class]]) { + TDLogError(@"Fetch remote config network failed:%@", error); + return; + } + NSError *err; + if (!data) { + return; + } + NSDictionary *ret = [NSJSONSerialization JSONObjectWithData:data options:kNilOptions error:&err]; + if (err) { + TDLogError(@"Fetch remote config json error:%@", err); + } else if ([ret isKindOfClass:[NSDictionary class]] && [ret[@"code"] isEqualToNumber:[NSNumber numberWithInt:0]]) { + TDLogDebug(@"Fetch remote config for %@ : %@", appid, [ret objectForKey:@"data"]); + handler([ret objectForKey:@"data"], error); + } else { + TDLogError(@"Fetch remote config failed"); + } + }; + NSString *urlStr = [NSString stringWithFormat:@"%@?appid=%@", self.serverURL, appid]; + NSMutableURLRequest *request = [NSMutableURLRequest requestWithURL:[NSURL URLWithString:urlStr]]; + [request setHTTPMethod:@"Get"]; + NSURLSessionDataTask *task = [[self sharedURLSession] dataTaskWithRequest:request completionHandler:block]; + [task resume]; +} + +#pragma mark - NSURLSessionDelegate +- (void)URLSession:(NSURLSession *)session didReceiveChallenge:(NSURLAuthenticationChallenge *)challenge completionHandler:(void (^)(NSURLSessionAuthChallengeDisposition, NSURLCredential * _Nullable))completionHandler { + NSURLSessionAuthChallengeDisposition disposition = NSURLSessionAuthChallengePerformDefaultHandling; + NSURLCredential *credential = nil; + + if (self.sessionDidReceiveAuthenticationChallenge) { + disposition = self.sessionDidReceiveAuthenticationChallenge(session, challenge, &credential); + } else { + if ([challenge.protectionSpace.authenticationMethod isEqualToString:NSURLAuthenticationMethodServerTrust]) { + if ([self.securityPolicy evaluateServerTrust:challenge.protectionSpace.serverTrust forDomain:challenge.protectionSpace.host]) { + credential = [NSURLCredential credentialForTrust:challenge.protectionSpace.serverTrust]; + if (credential) { + disposition = NSURLSessionAuthChallengeUseCredential; + } else { + disposition = NSURLSessionAuthChallengePerformDefaultHandling; + } + } else { + disposition = NSURLSessionAuthChallengeCancelAuthenticationChallenge; + } + } else { + disposition = NSURLSessionAuthChallengePerformDefaultHandling; + } + } + + if (completionHandler) { + completionHandler(disposition, credential); + } +} + +@end diff --git a/Assets/HCMiniSdk/Third/ta/Plugins/iOS/ThinkingSDK/Source/Network/TANetwork.m.meta b/Assets/HCMiniSdk/Third/ta/Plugins/iOS/ThinkingSDK/Source/Network/TANetwork.m.meta new file mode 100644 index 00000000..ce9c8af4 --- /dev/null +++ b/Assets/HCMiniSdk/Third/ta/Plugins/iOS/ThinkingSDK/Source/Network/TANetwork.m.meta @@ -0,0 +1,33 @@ +fileFormatVersion: 2 +guid: ef6cf0b1b18cd48f8a765969be10421a +PluginImporter: + externalObjects: {} + serializedVersion: 2 + iconMap: {} + executionOrder: {} + defineConstraints: [] + isPreloaded: 0 + isOverridable: 0 + isExplicitlyReferenced: 0 + validateReferences: 1 + platformData: + - first: + Any: + second: + enabled: 0 + settings: {} + - first: + Editor: Editor + second: + enabled: 0 + settings: + DefaultValueInitialized: true + - first: + iPhone: iOS + second: + enabled: 1 + settings: + AddToEmbeddedBinaries: false + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/HCMiniSdk/Third/ta/Plugins/iOS/ThinkingSDK/Source/Network/TAReachability.h b/Assets/HCMiniSdk/Third/ta/Plugins/iOS/ThinkingSDK/Source/Network/TAReachability.h new file mode 100755 index 00000000..d1b4e133 --- /dev/null +++ b/Assets/HCMiniSdk/Third/ta/Plugins/iOS/ThinkingSDK/Source/Network/TAReachability.h @@ -0,0 +1,28 @@ +// +// TAReachability.h +// ThinkingSDK +// +// Created by Yangxiongon 2022/6/1. +// + +#import +#import "TDConstant.h" + +NS_ASSUME_NONNULL_BEGIN + +@interface TAReachability : NSObject + ++ (ThinkingNetworkType)convertNetworkType:(NSString *)networkType; + ++ (instancetype)shareInstance; + +- (void)startMonitoring; + +- (void)stopMonitoring; + +- (NSString *)networkState; + + +@end + +NS_ASSUME_NONNULL_END diff --git a/Assets/HCMiniSdk/Third/ta/Plugins/iOS/ThinkingSDK/Source/Network/TAReachability.h.meta b/Assets/HCMiniSdk/Third/ta/Plugins/iOS/ThinkingSDK/Source/Network/TAReachability.h.meta new file mode 100644 index 00000000..a3425190 --- /dev/null +++ b/Assets/HCMiniSdk/Third/ta/Plugins/iOS/ThinkingSDK/Source/Network/TAReachability.h.meta @@ -0,0 +1,33 @@ +fileFormatVersion: 2 +guid: e3e998dc29ec64a9eb9aa11e8ce99568 +PluginImporter: + externalObjects: {} + serializedVersion: 2 + iconMap: {} + executionOrder: {} + defineConstraints: [] + isPreloaded: 0 + isOverridable: 0 + isExplicitlyReferenced: 0 + validateReferences: 1 + platformData: + - first: + Any: + second: + enabled: 0 + settings: {} + - first: + Editor: Editor + second: + enabled: 0 + settings: + DefaultValueInitialized: true + - first: + iPhone: iOS + second: + enabled: 1 + settings: + AddToEmbeddedBinaries: false + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/HCMiniSdk/Third/ta/Plugins/iOS/ThinkingSDK/Source/Network/TAReachability.m b/Assets/HCMiniSdk/Third/ta/Plugins/iOS/ThinkingSDK/Source/Network/TAReachability.m new file mode 100755 index 00000000..aecf1e7f --- /dev/null +++ b/Assets/HCMiniSdk/Third/ta/Plugins/iOS/ThinkingSDK/Source/Network/TAReachability.m @@ -0,0 +1,192 @@ +// +// TAReachability.m +// ThinkingSDK +// +// Created by Yangxiongon 2022/6/1. +// + +#import "TAReachability.h" +#import +#import + +#if __has_include() +#import +#else +#import "TDLogging.h" +#endif + + +@interface TAReachability () +#if TARGET_OS_IOS +@property (atomic, assign) SCNetworkReachabilityRef reachability; +#endif +@property (nonatomic, assign) BOOL isWifi; +@property (nonatomic, assign) BOOL isWwan; + +@end + +@implementation TAReachability + +#if TARGET_OS_IOS +static void ThinkingReachabilityCallback(SCNetworkReachabilityRef target, SCNetworkReachabilityFlags flags, void *info) { + TAReachability *instance = (__bridge TAReachability *)info; + if (instance && [instance isKindOfClass:[TAReachability class]]) { + [instance reachabilityChanged:flags]; + } +} +#endif + +//MARK: - Public Methods + ++ (instancetype)shareInstance { + static dispatch_once_t onceToken; + static TAReachability *reachability = nil; + dispatch_once(&onceToken, ^{ + reachability = [[TAReachability alloc] init]; + }); + return reachability; +} + +#if TARGET_OS_IOS + +- (NSString *)networkState { + if (self.isWifi) { + return @"WIFI"; + } else if (self.isWwan) { + return [self currentRadio]; + } else { + return @"NULL"; + } +} + +- (void)startMonitoring { + [self stopMonitoring]; + + SCNetworkReachabilityRef reachability = SCNetworkReachabilityCreateWithName(NULL,"thinkingdata.cn"); + self.reachability = reachability; + + if (self.reachability != NULL) { + SCNetworkReachabilityFlags flags; + BOOL didRetrieveFlags = SCNetworkReachabilityGetFlags(self.reachability, &flags); + if (didRetrieveFlags) { + self.isWifi = (flags & kSCNetworkReachabilityFlagsReachable) && !(flags & kSCNetworkReachabilityFlagsIsWWAN); + self.isWwan = (flags & kSCNetworkReachabilityFlagsIsWWAN); + } + + SCNetworkReachabilityContext context = {0, (__bridge void *)self, NULL, NULL, NULL}; + if (SCNetworkReachabilitySetCallback(self.reachability, ThinkingReachabilityCallback, &context)) { + if (!SCNetworkReachabilityScheduleWithRunLoop(self.reachability, CFRunLoopGetMain(), kCFRunLoopCommonModes)) { + SCNetworkReachabilitySetCallback(self.reachability, NULL, NULL); + } + } + } +} + +- (void)stopMonitoring { + if (!self.reachability) { + return; + } + SCNetworkReachabilityUnscheduleFromRunLoop(self.reachability, CFRunLoopGetMain(), kCFRunLoopCommonModes); +} + ++ (ThinkingNetworkType)convertNetworkType:(NSString *)networkType { + if ([@"NULL" isEqualToString:networkType]) { + return ThinkingNetworkTypeALL; + } else if ([@"WIFI" isEqualToString:networkType]) { + return ThinkingNetworkTypeWIFI; + } else if ([@"2G" isEqualToString:networkType]) { + return ThinkingNetworkType2G; + } else if ([@"3G" isEqualToString:networkType]) { + return ThinkingNetworkType3G; + } else if ([@"4G" isEqualToString:networkType]) { + return ThinkingNetworkType4G; + }else if([@"5G"isEqualToString:networkType]) + { + return ThinkingNetworkType5G; + } + return ThinkingNetworkTypeNONE; +} + +//MARK: - Private Methods + +- (void)reachabilityChanged:(SCNetworkReachabilityFlags)flags { + self.isWifi = (flags & kSCNetworkReachabilityFlagsReachable) && !(flags & kSCNetworkReachabilityFlagsIsWWAN); + self.isWwan = (flags & kSCNetworkReachabilityFlagsIsWWAN); +} + +- (NSString *)currentRadio { + NSString *networkType = @"NULL"; + @try { + static CTTelephonyNetworkInfo *info = nil; + static dispatch_once_t onceToken; + dispatch_once(&onceToken, ^{ + info = [[CTTelephonyNetworkInfo alloc] init]; + }); + NSString *currentRadio = nil; +#ifdef __IPHONE_12_0 + if (@available(iOS 12.0, *)) { + NSDictionary *serviceCurrentRadio = [info serviceCurrentRadioAccessTechnology]; + if ([serviceCurrentRadio isKindOfClass:[NSDictionary class]] && serviceCurrentRadio.allValues.count>0) { + currentRadio = serviceCurrentRadio.allValues[0]; + } + } +#endif + if (currentRadio == nil && [info.currentRadioAccessTechnology isKindOfClass:[NSString class]]) { + currentRadio = info.currentRadioAccessTechnology; + } + + if ([currentRadio isEqualToString:CTRadioAccessTechnologyLTE]) { + networkType = @"4G"; + } else if ([currentRadio isEqualToString:CTRadioAccessTechnologyeHRPD] || + [currentRadio isEqualToString:CTRadioAccessTechnologyCDMAEVDORevB] || + [currentRadio isEqualToString:CTRadioAccessTechnologyCDMAEVDORevA] || + [currentRadio isEqualToString:CTRadioAccessTechnologyCDMAEVDORev0] || + [currentRadio isEqualToString:CTRadioAccessTechnologyCDMA1x] || + [currentRadio isEqualToString:CTRadioAccessTechnologyHSUPA] || + [currentRadio isEqualToString:CTRadioAccessTechnologyHSDPA] || + [currentRadio isEqualToString:CTRadioAccessTechnologyWCDMA]) { + networkType = @"3G"; + } else if ([currentRadio isEqualToString:CTRadioAccessTechnologyEdge] || + [currentRadio isEqualToString:CTRadioAccessTechnologyGPRS]) { + networkType = @"2G"; + } +#ifdef __IPHONE_14_1 + else if (@available(iOS 14.1, *)) { + if ([currentRadio isKindOfClass:[NSString class]]) { + if([currentRadio isEqualToString:CTRadioAccessTechnologyNRNSA] || + [currentRadio isEqualToString:CTRadioAccessTechnologyNR]) { + networkType = @"5G"; + } + } + } +#endif + } @catch (NSException *exception) { + TDLogError(@"%@: %@", self, exception); + } + + return networkType; +} + +#elif TARGET_OS_OSX + ++ (ThinkingNetworkType)convertNetworkType:(NSString *)networkType { + return ThinkingNetworkTypeWIFI; +} + +- (void)startMonitoring { +} + +- (void)stopMonitoring { +} + +- (NSString *)currentRadio { + return @"WIFI"; +} + +- (NSString *)networkState { + return @"WIFI"; +} + +#endif + +@end diff --git a/Assets/HCMiniSdk/Third/ta/Plugins/iOS/ThinkingSDK/Source/Network/TAReachability.m.meta b/Assets/HCMiniSdk/Third/ta/Plugins/iOS/ThinkingSDK/Source/Network/TAReachability.m.meta new file mode 100644 index 00000000..4a8ecc04 --- /dev/null +++ b/Assets/HCMiniSdk/Third/ta/Plugins/iOS/ThinkingSDK/Source/Network/TAReachability.m.meta @@ -0,0 +1,33 @@ +fileFormatVersion: 2 +guid: da4a73b2c2a4b44cbaf0b0fd5b11fc1e +PluginImporter: + externalObjects: {} + serializedVersion: 2 + iconMap: {} + executionOrder: {} + defineConstraints: [] + isPreloaded: 0 + isOverridable: 0 + isExplicitlyReferenced: 0 + validateReferences: 1 + platformData: + - first: + Any: + second: + enabled: 0 + settings: {} + - first: + Editor: Editor + second: + enabled: 0 + settings: + DefaultValueInitialized: true + - first: + iPhone: iOS + second: + enabled: 1 + settings: + AddToEmbeddedBinaries: false + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/HCMiniSdk/Third/ta/Plugins/iOS/ThinkingSDK/Source/Network/TDSecurityPolicy.h b/Assets/HCMiniSdk/Third/ta/Plugins/iOS/ThinkingSDK/Source/Network/TDSecurityPolicy.h new file mode 100755 index 00000000..f15a3c68 --- /dev/null +++ b/Assets/HCMiniSdk/Third/ta/Plugins/iOS/ThinkingSDK/Source/Network/TDSecurityPolicy.h @@ -0,0 +1,50 @@ + +/** + Thinks AFNetworking: https://github.com/AFNetworking/AFNetworking + */ +#import + +#if __has_include() +#import +#else +#import "TDConstant.h" +#endif + +NS_ASSUME_NONNULL_BEGIN + + +@interface TDSecurityPolicy: NSObject + +@property (nonatomic, assign) BOOL allowInvalidCertificates; +@property (nonatomic, assign) BOOL validatesDomainName; +@property (nonatomic, copy) TDURLSessionDidReceiveAuthenticationChallengeBlock sessionDidReceiveAuthenticationChallenge; ++ (instancetype)policyWithPinningMode:(TDSSLPinningMode)pinningMode; ++ (instancetype)defaultPolicy; +- (BOOL)evaluateServerTrust:(SecTrustRef)serverTrust forDomain:(NSString *)domain; + +@end + +#ifndef __Require_Quiet + #define __Require_Quiet(assertion, exceptionLabel) \ + do \ + { \ + if ( __builtin_expect(!(assertion), 0) ) \ + { \ + goto exceptionLabel; \ + } \ + } while ( 0 ) +#endif + +#ifndef __Require_noErr_Quiet + #define __Require_noErr_Quiet(errorCode, exceptionLabel) \ + do \ + { \ + if ( __builtin_expect(0 != (errorCode), 0) ) \ + { \ + goto exceptionLabel; \ + } \ + } while ( 0 ) +#endif + + +NS_ASSUME_NONNULL_END diff --git a/Assets/HCMiniSdk/Third/ta/Plugins/iOS/ThinkingSDK/Source/Network/TDSecurityPolicy.h.meta b/Assets/HCMiniSdk/Third/ta/Plugins/iOS/ThinkingSDK/Source/Network/TDSecurityPolicy.h.meta new file mode 100644 index 00000000..58808da8 --- /dev/null +++ b/Assets/HCMiniSdk/Third/ta/Plugins/iOS/ThinkingSDK/Source/Network/TDSecurityPolicy.h.meta @@ -0,0 +1,33 @@ +fileFormatVersion: 2 +guid: 9781dc44aea76461dbad775986c949f1 +PluginImporter: + externalObjects: {} + serializedVersion: 2 + iconMap: {} + executionOrder: {} + defineConstraints: [] + isPreloaded: 0 + isOverridable: 0 + isExplicitlyReferenced: 0 + validateReferences: 1 + platformData: + - first: + Any: + second: + enabled: 0 + settings: {} + - first: + Editor: Editor + second: + enabled: 0 + settings: + DefaultValueInitialized: true + - first: + iPhone: iOS + second: + enabled: 1 + settings: + AddToEmbeddedBinaries: false + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/HCMiniSdk/Third/ta/Plugins/iOS/ThinkingSDK/Source/Network/TDSecurityPolicy.m b/Assets/HCMiniSdk/Third/ta/Plugins/iOS/ThinkingSDK/Source/Network/TDSecurityPolicy.m new file mode 100755 index 00000000..c0f61aff --- /dev/null +++ b/Assets/HCMiniSdk/Third/ta/Plugins/iOS/ThinkingSDK/Source/Network/TDSecurityPolicy.m @@ -0,0 +1,248 @@ +#import "TDSecurityPolicy.h" + +#import "TDLogging.h" + +static id TDPublicKeyForCertificate(NSData *certificate) { + id allowedPublicKey = nil; + SecCertificateRef allowedCertificate; + SecPolicyRef policy = nil; + SecTrustRef allowedTrust = nil; + SecTrustResultType result; + + allowedCertificate = SecCertificateCreateWithData(NULL, (__bridge CFDataRef)certificate); + __Require_Quiet(allowedCertificate != NULL, _out); + + policy = SecPolicyCreateBasicX509(); + __Require_noErr_Quiet(SecTrustCreateWithCertificates(allowedCertificate, policy, &allowedTrust), _out); + __Require_noErr_Quiet(SecTrustEvaluate(allowedTrust, &result), _out); + + allowedPublicKey = (__bridge_transfer id)SecTrustCopyPublicKey(allowedTrust); + +_out: + if (allowedTrust) { + CFRelease(allowedTrust); + } + + if (policy) { + CFRelease(policy); + } + + if (allowedCertificate) { + CFRelease(allowedCertificate); + } + + return allowedPublicKey; +} + +static BOOL TDServerTrustIsValid(SecTrustRef serverTrust) { + BOOL isValid = NO; + SecTrustResultType result; + __Require_noErr_Quiet(SecTrustEvaluate(serverTrust, &result), _out); + + isValid = (result == kSecTrustResultUnspecified || result == kSecTrustResultProceed); + +_out: + return isValid; +} + +static NSArray * TDCertificateTrustChainForServerTrust(SecTrustRef serverTrust) { + CFIndex certificateCount = SecTrustGetCertificateCount(serverTrust); + NSMutableArray *trustChain = [NSMutableArray arrayWithCapacity:(NSUInteger)certificateCount]; + + for (CFIndex i = 0; i < certificateCount; i++) { + SecCertificateRef certificate = SecTrustGetCertificateAtIndex(serverTrust, i); + [trustChain addObject:(__bridge_transfer NSData *)SecCertificateCopyData(certificate)]; + } + + return [NSArray arrayWithArray:trustChain]; +} + +static NSArray * TDPublicKeyTrustChainForServerTrust(SecTrustRef serverTrust) { + SecPolicyRef policy = SecPolicyCreateBasicX509(); + CFIndex certificateCount = SecTrustGetCertificateCount(serverTrust); + NSMutableArray *trustChain = [NSMutableArray arrayWithCapacity:(NSUInteger)certificateCount]; + for (CFIndex i = 0; i < certificateCount; i++) { + SecCertificateRef certificate = SecTrustGetCertificateAtIndex(serverTrust, i); + + SecCertificateRef someCertificates[] = {certificate}; + CFArrayRef certificates = CFArrayCreate(NULL, (const void **)someCertificates, 1, NULL); + + SecTrustRef trust; + __Require_noErr_Quiet(SecTrustCreateWithCertificates(certificates, policy, &trust), _out); + + SecTrustResultType result; + __Require_noErr_Quiet(SecTrustEvaluate(trust, &result), _out); + + [trustChain addObject:(__bridge_transfer id)SecTrustCopyPublicKey(trust)]; + + _out: + if (trust) { + CFRelease(trust); + } + + if (certificates) { + CFRelease(certificates); + } + + continue; + } + CFRelease(policy); + + return [NSArray arrayWithArray:trustChain]; +} + +static BOOL TDSecKeyIsEqualToKey(SecKeyRef key1, SecKeyRef key2) { + return [(__bridge id)key1 isEqual:(__bridge id)key2]; +} + +@interface TDSecurityPolicy () + +@property (nonatomic, assign) TDSSLPinningMode SSLPinningMode; +@property (nonatomic, strong, nullable) NSSet *pinnedCertificates; +@property (readwrite, nonatomic, strong) NSSet *pinnedPublicKeys; + +@end + +@implementation TDSecurityPolicy + +- (instancetype)init { + self = [super init]; + if (!self) { + return nil; + } + + self.validatesDomainName = YES; + + return self; +} + ++ (NSSet *)certificatesInBundle:(NSBundle *)bundle { + NSArray *paths = [bundle pathsForResourcesOfType:@"cer" inDirectory:@"."]; + + NSMutableSet *certificates = [NSMutableSet setWithCapacity:[paths count]]; + for (NSString *path in paths) { + NSData *certificateData = [NSData dataWithContentsOfFile:path]; + [certificates addObject:certificateData]; + } + + return [NSSet setWithSet:certificates]; +} + ++ (NSSet *)defaultPinnedCertificates { + static NSSet *_defaultPinnedCertificates = nil; + static dispatch_once_t onceToken; + dispatch_once(&onceToken, ^{ + NSBundle *bundle = [NSBundle bundleForClass:[self class]]; + _defaultPinnedCertificates = [self certificatesInBundle:bundle]; + }); + + return _defaultPinnedCertificates; +} + ++ (instancetype)defaultPolicy { + TDSecurityPolicy *securityPolicy = [[self alloc] init]; + securityPolicy.SSLPinningMode = TDSSLPinningModeNone; + return securityPolicy; +} + ++ (instancetype)policyWithPinningMode:(TDSSLPinningMode)pinningMode { + return [self policyWithPinningMode:pinningMode withPinnedCertificates:[self defaultPinnedCertificates]]; +} + ++ (instancetype)policyWithPinningMode:(TDSSLPinningMode)pinningMode withPinnedCertificates:(NSSet *)pinnedCertificates { + TDSecurityPolicy *securityPolicy = [[self alloc] init]; + securityPolicy.SSLPinningMode = pinningMode; + [securityPolicy setPinnedCertificates:pinnedCertificates]; + return securityPolicy; +} + +- (void)setPinnedCertificates:(NSSet *)pinnedCertificates { + _pinnedCertificates = pinnedCertificates; + + if (self.pinnedCertificates) { + NSMutableSet *mutablePinnedPublicKeys = [NSMutableSet setWithCapacity:[self.pinnedCertificates count]]; + for (NSData *certificate in self.pinnedCertificates) { + id publicKey = TDPublicKeyForCertificate(certificate); + if (publicKey) { + [mutablePinnedPublicKeys addObject:publicKey]; + } + } + self.pinnedPublicKeys = [NSSet setWithSet:mutablePinnedPublicKeys]; + } else { + self.pinnedPublicKeys = nil; + } +} + +- (BOOL)evaluateServerTrust:(SecTrustRef)serverTrust forDomain:(NSString *)domain { + if (domain && self.allowInvalidCertificates && self.validatesDomainName && (self.SSLPinningMode == TDSSLPinningModeNone || [self.pinnedCertificates count] == 0)) { + TDLogDebug(@"In order to validate a domain name for self signed certificates, you MUST use pinning."); + return NO; + } + + NSMutableArray *policies = [NSMutableArray array]; + if (self.validatesDomainName) { + [policies addObject:(__bridge_transfer id)SecPolicyCreateSSL(true, (__bridge CFStringRef)domain)]; + } else { + [policies addObject:(__bridge_transfer id)SecPolicyCreateBasicX509()]; + } + + SecTrustSetPolicies(serverTrust, (__bridge CFArrayRef)policies); + + if (self.SSLPinningMode == TDSSLPinningModeNone) { + return self.allowInvalidCertificates || TDServerTrustIsValid(serverTrust); + } else if (!TDServerTrustIsValid(serverTrust) && !self.allowInvalidCertificates) { + return NO; + } + + switch (self.SSLPinningMode) { + case TDSSLPinningModeCertificate: { + NSMutableArray *pinnedCertificates = [NSMutableArray array]; + for (NSData *certificateData in self.pinnedCertificates) { + [pinnedCertificates addObject:(__bridge_transfer id)SecCertificateCreateWithData(NULL, (__bridge CFDataRef)certificateData)]; + } + SecTrustSetAnchorCertificates(serverTrust, (__bridge CFArrayRef)pinnedCertificates); + + if (!TDServerTrustIsValid(serverTrust)) { + return NO; + } + + NSArray *serverCertificates = TDCertificateTrustChainForServerTrust(serverTrust); + for (NSData *trustChainCertificate in [serverCertificates reverseObjectEnumerator]) { + if ([self.pinnedCertificates containsObject:trustChainCertificate]) { + return YES; + } + } + return NO; + } + case TDSSLPinningModePublicKey: { + NSUInteger trustedPublicKeyCount = 0; + NSArray *publicKeys = TDPublicKeyTrustChainForServerTrust(serverTrust); + + for (id trustChainPublicKey in publicKeys) { + for (id pinnedPublicKey in self.pinnedPublicKeys) { + if (TDSecKeyIsEqualToKey((__bridge SecKeyRef)trustChainPublicKey, (__bridge SecKeyRef)pinnedPublicKey)) { + trustedPublicKeyCount += 1; + } + } + } + return trustedPublicKeyCount > 0; + } + + default: + return NO; + } + + return NO; +} + +#pragma mark - NSCopying +- (instancetype)copyWithZone:(NSZone *)zone { + TDSecurityPolicy *securityPolicy = [[[self class] allocWithZone:zone] init]; + securityPolicy.SSLPinningMode = self.SSLPinningMode; + securityPolicy.allowInvalidCertificates = self.allowInvalidCertificates; + securityPolicy.validatesDomainName = self.validatesDomainName; + securityPolicy.pinnedCertificates = [self.pinnedCertificates copyWithZone:zone]; + return securityPolicy; +} + +@end diff --git a/Assets/HCMiniSdk/Third/ta/Plugins/iOS/ThinkingSDK/Source/Network/TDSecurityPolicy.m.meta b/Assets/HCMiniSdk/Third/ta/Plugins/iOS/ThinkingSDK/Source/Network/TDSecurityPolicy.m.meta new file mode 100644 index 00000000..1e726c65 --- /dev/null +++ b/Assets/HCMiniSdk/Third/ta/Plugins/iOS/ThinkingSDK/Source/Network/TDSecurityPolicy.m.meta @@ -0,0 +1,33 @@ +fileFormatVersion: 2 +guid: 11369661a3b6e47e9a9b7c0607c9db2c +PluginImporter: + externalObjects: {} + serializedVersion: 2 + iconMap: {} + executionOrder: {} + defineConstraints: [] + isPreloaded: 0 + isOverridable: 0 + isExplicitlyReferenced: 0 + validateReferences: 1 + platformData: + - first: + Any: + second: + enabled: 0 + settings: {} + - first: + Editor: Editor + second: + enabled: 0 + settings: + DefaultValueInitialized: true + - first: + iPhone: iOS + second: + enabled: 1 + settings: + AddToEmbeddedBinaries: false + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/HCMiniSdk/Third/ta/Plugins/iOS/ThinkingSDK/Source/Router.meta b/Assets/HCMiniSdk/Third/ta/Plugins/iOS/ThinkingSDK/Source/Router.meta new file mode 100644 index 00000000..2318b42f --- /dev/null +++ b/Assets/HCMiniSdk/Third/ta/Plugins/iOS/ThinkingSDK/Source/Router.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: 1e62cbb5e85d24e80b6722fb3b19311c +folderAsset: yes +DefaultImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/HCMiniSdk/Third/ta/Plugins/iOS/ThinkingSDK/Source/Router/TAAnnotation.h b/Assets/HCMiniSdk/Third/ta/Plugins/iOS/ThinkingSDK/Source/Router/TAAnnotation.h new file mode 100755 index 00000000..6273b5b4 --- /dev/null +++ b/Assets/HCMiniSdk/Third/ta/Plugins/iOS/ThinkingSDK/Source/Router/TAAnnotation.h @@ -0,0 +1,38 @@ +// +// TAAnnotation.h +// Pods +// +// Created by wwango on 2022/10/8. +// + +#import + +NS_ASSUME_NONNULL_BEGIN + +#ifndef ThinkingModSectName + +#define ThinkingModSectName "ThinkingMods" + +#endif + +#ifndef ThinkingServiceSectName + +#define ThinkingServiceSectName "ThinkingServices" + +#endif + + +#define ThinkingDATA(sectname) __attribute((used, section("__DATA,"#sectname" "))) + + +#define ThinkingMod(name) \ +char * k##name##_mod ThinkingDATA(ThinkingMods) = ""#name""; + +#define ThinkingService(servicename,impl) \ +char * k##servicename##_service ThinkingDATA(ThinkingServices) = "{ \""#servicename"\" : \""#impl"\"}"; + +@interface TAAnnotation : NSObject + +@end + +NS_ASSUME_NONNULL_END diff --git a/Assets/HCMiniSdk/Third/ta/Plugins/iOS/ThinkingSDK/Source/Router/TAAnnotation.h.meta b/Assets/HCMiniSdk/Third/ta/Plugins/iOS/ThinkingSDK/Source/Router/TAAnnotation.h.meta new file mode 100644 index 00000000..e466efab --- /dev/null +++ b/Assets/HCMiniSdk/Third/ta/Plugins/iOS/ThinkingSDK/Source/Router/TAAnnotation.h.meta @@ -0,0 +1,33 @@ +fileFormatVersion: 2 +guid: 802859497812f4b568a206511e971b19 +PluginImporter: + externalObjects: {} + serializedVersion: 2 + iconMap: {} + executionOrder: {} + defineConstraints: [] + isPreloaded: 0 + isOverridable: 0 + isExplicitlyReferenced: 0 + validateReferences: 1 + platformData: + - first: + Any: + second: + enabled: 0 + settings: {} + - first: + Editor: Editor + second: + enabled: 0 + settings: + DefaultValueInitialized: true + - first: + iPhone: iOS + second: + enabled: 1 + settings: + AddToEmbeddedBinaries: false + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/HCMiniSdk/Third/ta/Plugins/iOS/ThinkingSDK/Source/Router/TAAnnotation.m b/Assets/HCMiniSdk/Third/ta/Plugins/iOS/ThinkingSDK/Source/Router/TAAnnotation.m new file mode 100755 index 00000000..971c41c5 --- /dev/null +++ b/Assets/HCMiniSdk/Third/ta/Plugins/iOS/ThinkingSDK/Source/Router/TAAnnotation.m @@ -0,0 +1,89 @@ +// +// TAAnnotation.m +// Pods +// +// Created by wwango on 2022/10/8. +// + +#import "TAAnnotation.h" +#include +#include +#include +#include +#import +#import +#include +#import "TAModuleManager.h" +#import "TAServiceManager.h" + +NSArray* _TAReadConfiguration(char *sectionName,const struct mach_header *mhp); +static void dyld_callback(const struct mach_header *mhp, intptr_t vmaddr_slide) +{ + //register mods + NSArray *mods = _TAReadConfiguration(ThinkingModSectName, mhp); + for (NSString *modName in mods) { + Class cls; + if (modName) { + cls = NSClassFromString(modName); + + if (cls) { + [[TAModuleManager sharedManager] registerDynamicModule:cls]; + } + } + } + + //register services + NSArray *services = _TAReadConfiguration(ThinkingServiceSectName,mhp); + for (NSString *map in services) { + NSData *jsonData = [map dataUsingEncoding:NSUTF8StringEncoding]; + NSError *error = nil; + id json = [NSJSONSerialization JSONObjectWithData:jsonData options:0 error:&error]; + if (!error) { + if ([json isKindOfClass:[NSDictionary class]] && [json allKeys].count) { + + NSString *protocol = [json allKeys][0]; + NSString *clsName = [json allValues][0]; + + if (protocol && clsName) { + [[TAServiceManager sharedManager] registerService:NSProtocolFromString(protocol) implClass:NSClassFromString(clsName)]; + } + + } + } + } +} + +NSArray* _TAReadConfiguration(char *sectionName,const struct mach_header *mhp) +{ + NSMutableArray *configs = [NSMutableArray array]; + unsigned long size = 0; +#ifndef __LP64__ + uintptr_t *memory = (uintptr_t*)getsectiondata(mhp, SEG_DATA, sectionName, &size); +#else + const struct mach_header_64 *mhp64 = (const struct mach_header_64 *)mhp; + uintptr_t *memory = (uintptr_t*)getsectiondata(mhp64, SEG_DATA, sectionName, &size); +#endif + + unsigned long counter = size/sizeof(void*); + for(int idx = 0; idx < counter; ++idx){ + char *string = (char*)memory[idx]; + NSString *str = [NSString stringWithUTF8String:string]; + if(!str)continue; + + NSLog(@"config = %@", str); + if(str) [configs addObject:str]; + } + + return configs; +} + +__attribute__((constructor)) void __ta_init_dyld_addImage() { + _dyld_register_func_for_add_image(dyld_callback); +} + +@implementation TAAnnotation + + +@end + + diff --git a/Assets/HCMiniSdk/Third/ta/Plugins/iOS/ThinkingSDK/Source/Router/TAAnnotation.m.meta b/Assets/HCMiniSdk/Third/ta/Plugins/iOS/ThinkingSDK/Source/Router/TAAnnotation.m.meta new file mode 100644 index 00000000..cb4c4c4d --- /dev/null +++ b/Assets/HCMiniSdk/Third/ta/Plugins/iOS/ThinkingSDK/Source/Router/TAAnnotation.m.meta @@ -0,0 +1,33 @@ +fileFormatVersion: 2 +guid: 8ece1a0b2a8d747a0866dd45a5966a10 +PluginImporter: + externalObjects: {} + serializedVersion: 2 + iconMap: {} + executionOrder: {} + defineConstraints: [] + isPreloaded: 0 + isOverridable: 0 + isExplicitlyReferenced: 0 + validateReferences: 1 + platformData: + - first: + Any: + second: + enabled: 0 + settings: {} + - first: + Editor: Editor + second: + enabled: 0 + settings: + DefaultValueInitialized: true + - first: + iPhone: iOS + second: + enabled: 1 + settings: + AddToEmbeddedBinaries: false + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/HCMiniSdk/Third/ta/Plugins/iOS/ThinkingSDK/Source/Router/TAContext.h b/Assets/HCMiniSdk/Third/ta/Plugins/iOS/ThinkingSDK/Source/Router/TAContext.h new file mode 100755 index 00000000..de66e003 --- /dev/null +++ b/Assets/HCMiniSdk/Third/ta/Plugins/iOS/ThinkingSDK/Source/Router/TAContext.h @@ -0,0 +1,28 @@ +// +// TAContext.h +// ThinkingSDK.default-Base-Core-Extension-Router-Util-iOS +// +// Created by wwango on 2022/10/7. +// + +#import + +NS_ASSUME_NONNULL_BEGIN + +@interface TAContext : NSObject + +@property(nonatomic, strong) UIApplication *application; + +@property(nonatomic, strong) NSDictionary *launchOptions; + ++ (instancetype)shareInstance; + +- (void)addServiceWithImplInstance:(id)implInstance serviceName:(NSString *)serviceName; + +- (void)removeServiceWithServiceName:(NSString *)serviceName; + +- (id)getServiceInstanceFromServiceName:(NSString *)serviceName; + +@end + +NS_ASSUME_NONNULL_END diff --git a/Assets/HCMiniSdk/Third/ta/Plugins/iOS/ThinkingSDK/Source/Router/TAContext.h.meta b/Assets/HCMiniSdk/Third/ta/Plugins/iOS/ThinkingSDK/Source/Router/TAContext.h.meta new file mode 100644 index 00000000..d6aa8623 --- /dev/null +++ b/Assets/HCMiniSdk/Third/ta/Plugins/iOS/ThinkingSDK/Source/Router/TAContext.h.meta @@ -0,0 +1,33 @@ +fileFormatVersion: 2 +guid: b5cca9539091b4cf888035ed5ee3f781 +PluginImporter: + externalObjects: {} + serializedVersion: 2 + iconMap: {} + executionOrder: {} + defineConstraints: [] + isPreloaded: 0 + isOverridable: 0 + isExplicitlyReferenced: 0 + validateReferences: 1 + platformData: + - first: + Any: + second: + enabled: 0 + settings: {} + - first: + Editor: Editor + second: + enabled: 0 + settings: + DefaultValueInitialized: true + - first: + iPhone: iOS + second: + enabled: 1 + settings: + AddToEmbeddedBinaries: false + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/HCMiniSdk/Third/ta/Plugins/iOS/ThinkingSDK/Source/Router/TAContext.m b/Assets/HCMiniSdk/Third/ta/Plugins/iOS/ThinkingSDK/Source/Router/TAContext.m new file mode 100755 index 00000000..20aac5bd --- /dev/null +++ b/Assets/HCMiniSdk/Third/ta/Plugins/iOS/ThinkingSDK/Source/Router/TAContext.m @@ -0,0 +1,68 @@ +// +// TAContext.m +// ThinkingSDK.default-Base-Core-Extension-Router-Util-iOS +// +// Created by wwango on 2022/10/7. +// + +#import "TAContext.h" + +@interface TAContext() + +@property(nonatomic, strong) NSMutableDictionary *modulesByName; + +@property(nonatomic, strong) NSMutableDictionary *servicesByName; + +@end + + +@implementation TAContext + ++ (instancetype)shareInstance +{ + static dispatch_once_t p; + static id instance = nil; + + dispatch_once(&p, ^{ + instance = [[[self class] alloc] init]; + }); + + return instance; +} + +- (void)addServiceWithImplInstance:(id)implInstance serviceName:(NSString *)serviceName +{ + [[TAContext shareInstance].servicesByName setObject:implInstance forKey:serviceName]; +} + +- (void)removeServiceWithServiceName:(NSString *)serviceName +{ + [[TAContext shareInstance].servicesByName removeObjectForKey:serviceName]; +} + +- (id)getServiceInstanceFromServiceName:(NSString *)serviceName +{ + return [[TAContext shareInstance].servicesByName objectForKey:serviceName]; +} + +- (instancetype)init +{ + self = [super init]; + if (self) { + self.modulesByName = [[NSMutableDictionary alloc] initWithCapacity:1]; + self.servicesByName = [[NSMutableDictionary alloc] initWithCapacity:1]; + } + + return self; +} + +- (instancetype)copyWithZone:(NSZone *)zone { + TAContext *context = [[self.class allocWithZone:zone] init]; + + context.application = self.application; + context.launchOptions = self.launchOptions; + + return context; +} + +@end diff --git a/Assets/HCMiniSdk/Third/ta/Plugins/iOS/ThinkingSDK/Source/Router/TAContext.m.meta b/Assets/HCMiniSdk/Third/ta/Plugins/iOS/ThinkingSDK/Source/Router/TAContext.m.meta new file mode 100644 index 00000000..cbc156ae --- /dev/null +++ b/Assets/HCMiniSdk/Third/ta/Plugins/iOS/ThinkingSDK/Source/Router/TAContext.m.meta @@ -0,0 +1,33 @@ +fileFormatVersion: 2 +guid: beb55ca7b80af4087a84c2c6d3d3b226 +PluginImporter: + externalObjects: {} + serializedVersion: 2 + iconMap: {} + executionOrder: {} + defineConstraints: [] + isPreloaded: 0 + isOverridable: 0 + isExplicitlyReferenced: 0 + validateReferences: 1 + platformData: + - first: + Any: + second: + enabled: 0 + settings: {} + - first: + Editor: Editor + second: + enabled: 0 + settings: + DefaultValueInitialized: true + - first: + iPhone: iOS + second: + enabled: 1 + settings: + AddToEmbeddedBinaries: false + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/HCMiniSdk/Third/ta/Plugins/iOS/ThinkingSDK/Source/Router/TAModuleManager.h b/Assets/HCMiniSdk/Third/ta/Plugins/iOS/ThinkingSDK/Source/Router/TAModuleManager.h new file mode 100755 index 00000000..6ffeff8f --- /dev/null +++ b/Assets/HCMiniSdk/Third/ta/Plugins/iOS/ThinkingSDK/Source/Router/TAModuleManager.h @@ -0,0 +1,72 @@ +// +// TAModuleManager.h +// Pods +// +// Created by wwango on 2022/10/8. +// + +#import + +NS_ASSUME_NONNULL_BEGIN + +typedef NS_ENUM(NSUInteger, TAModuleLevel) +{ + TAModuleBasic = 0, + TAModuleNormal = 1 +}; + +typedef NS_ENUM(NSInteger, TAModuleEventType) +{ + TAMSetupEvent = 0, + TAMInitEvent, + TAMTearDownEvent, + TAMSplashEvent, + TAMQuickActionEvent, + TAMWillResignActiveEvent, + TAMDidEnterBackgroundEvent, + TAMWillEnterForegroundEvent, + TAMDidBecomeActiveEvent, + TAMWillTerminateEvent, + TAMUnmountEvent, + TAMOpenURLEvent, + TAMDidReceiveMemoryWarningEvent, + TAMDidFailToRegisterForRemoteNotificationsEvent, + TAMDidRegisterForRemoteNotificationsEvent, + TAMDidReceiveRemoteNotificationEvent, + TAMDidReceiveLocalNotificationEvent, + TAMWillPresentNotificationEvent, + TAMDidReceiveNotificationResponseEvent, + TAMWillContinueUserActivityEvent, + TAMContinueUserActivityEvent, + TAMDidFailToContinueUserActivityEvent, + TAMDidUpdateUserActivityEvent, + TAMDidCustomEvent = 1000 + +}; + +@interface TAModuleManager : NSObject + ++ (instancetype)sharedManager; + +// If you do not comply with set Level protocol, the default Normal +- (void)registerDynamicModule:(Class)moduleClass; + +- (void)unRegisterDynamicModule:(Class)moduleClass; + +- (void)loadLocalModules; + +- (void)registedAllModules; + +- (void)registerCustomEvent:(NSInteger)eventType + withModuleInstance:(id)moduleInstance + andSelectorStr:(NSString *)selectorStr; + +- (void)triggerEvent:(NSInteger)eventType; + +- (void)triggerEvent:(NSInteger)eventType + withCustomParam:(NSDictionary *)customParam; + + +@end + +NS_ASSUME_NONNULL_END diff --git a/Assets/HCMiniSdk/Third/ta/Plugins/iOS/ThinkingSDK/Source/Router/TAModuleManager.h.meta b/Assets/HCMiniSdk/Third/ta/Plugins/iOS/ThinkingSDK/Source/Router/TAModuleManager.h.meta new file mode 100644 index 00000000..340d9e7e --- /dev/null +++ b/Assets/HCMiniSdk/Third/ta/Plugins/iOS/ThinkingSDK/Source/Router/TAModuleManager.h.meta @@ -0,0 +1,33 @@ +fileFormatVersion: 2 +guid: 01897ac610d9c45838e45ecd24fd53d8 +PluginImporter: + externalObjects: {} + serializedVersion: 2 + iconMap: {} + executionOrder: {} + defineConstraints: [] + isPreloaded: 0 + isOverridable: 0 + isExplicitlyReferenced: 0 + validateReferences: 1 + platformData: + - first: + Any: + second: + enabled: 0 + settings: {} + - first: + Editor: Editor + second: + enabled: 0 + settings: + DefaultValueInitialized: true + - first: + iPhone: iOS + second: + enabled: 1 + settings: + AddToEmbeddedBinaries: false + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/HCMiniSdk/Third/ta/Plugins/iOS/ThinkingSDK/Source/Router/TAModuleManager.m b/Assets/HCMiniSdk/Third/ta/Plugins/iOS/ThinkingSDK/Source/Router/TAModuleManager.m new file mode 100755 index 00000000..bdc89e11 --- /dev/null +++ b/Assets/HCMiniSdk/Third/ta/Plugins/iOS/ThinkingSDK/Source/Router/TAModuleManager.m @@ -0,0 +1,509 @@ +// +// TAModuleManager.m +// Pods +// +// Created by wwango on 2022/10/8. +// + +#import "TAModuleManager.h" +#import "TAModuleProtocol.h" +#import "TAContext.h" + +#define kTAModuleArrayKey @"moduleClasses" +#define kTAModuleInfoNameKey @"moduleClass" +#define kTAModuleInfoLevelKey @"moduleLevel" +#define kTAModuleInfoPriorityKey @"modulePriority" +#define kTAModuleInfoHasInstantiatedKey @"moduleHasInstantiated" + +static NSString *kTASetupSelector = @"modSetUp:"; +static NSString *kTAInitSelector = @"modInit:"; +static NSString *kTASplashSeletor = @"modSplash:"; +static NSString *kTATearDownSelector = @"modTearDown:"; +static NSString *kTAWillResignActiveSelector = @"modWillResignActive:"; +static NSString *kTADidEnterBackgroundSelector = @"modDidEnterBackground:"; +static NSString *kTAWillEnterForegroundSelector = @"modWillEnterForeground:"; +static NSString *kTADidBecomeActiveSelector = @"modDidBecomeActive:"; +static NSString *kTAWillTerminateSelector = @"modWillTerminate:"; +static NSString *kTAUnmountEventSelector = @"modUnmount:"; +static NSString *kTAQuickActionSelector = @"modQuickAction:"; +static NSString *kTAOpenURLSelector = @"modOpenURL:"; +static NSString *kTADidReceiveMemoryWarningSelector = @"modDidReceiveMemoryWaring:"; +static NSString *kTAFailToRegisterForRemoteNotificationsSelector = @"modDidFailToRegisterForRemoteNotifications:"; +static NSString *kTADidRegisterForRemoteNotificationsSelector = @"modDidRegisterForRemoteNotifications:"; +static NSString *kTADidReceiveRemoteNotificationsSelector = @"modDidReceiveRemoteNotification:"; +static NSString *kTADidReceiveLocalNotificationsSelector = @"modDidReceiveLocalNotification:"; +static NSString *kTAWillPresentNotificationSelector = @"modWillPresentNotification:"; +static NSString *kTADidReceiveNotificationResponseSelector = @"modDidReceiveNotificationResponse:"; +static NSString *kTAWillContinueUserActivitySelector = @"modWillContinueUserActivity:"; +static NSString *kTAContinueUserActivitySelector = @"modContinueUserActivity:"; +static NSString *kTADidUpdateContinueUserActivitySelector = @"modDidUpdateContinueUserActivity:"; +static NSString *kTAFailToContinueUserActivitySelector = @"modDidFailToContinueUserActivity:"; +static NSString *kTAHandleWatchKitExtensionRequestSelector = @"modHandleWatchKitExtensionRequest:"; +static NSString *kTAAppCustomSelector = @"modDidCustomEvent:"; + + +@interface TAModuleManager () + +@property(nonatomic, strong) NSMutableArray *TAModuleDynamicClasses; + +@property(nonatomic, strong) NSMutableArray *TAModuleInfos; +@property(nonatomic, strong) NSMutableArray *TAModules; + +@property(nonatomic, strong) NSMutableDictionary> *> *TAModulesByEvent; +@property(nonatomic, strong) NSMutableDictionary *TASelectorByEvent; + +@end + + +@implementation TAModuleManager + + ++ (instancetype)sharedManager +{ + static id sharedManager = nil; + static dispatch_once_t onceToken = 0; + dispatch_once(&onceToken, ^{ + sharedManager = [[TAModuleManager alloc] init]; + }); + return sharedManager; +} + +- (void)loadLocalModules +{ + +} + +- (void)registerDynamicModule:(Class)moduleClass +{ + [self addModuleFromObject:moduleClass]; +} + +- (void)unRegisterDynamicModule:(Class)moduleClass { + if (!moduleClass) { + return; + } + [self.TAModuleInfos filterUsingPredicate:[NSPredicate predicateWithFormat:@"%@!=%@", kTAModuleInfoNameKey, NSStringFromClass(moduleClass)]]; + __block NSInteger index = -1; + [self.TAModules enumerateObjectsUsingBlock:^(id _Nonnull obj, NSUInteger idx, BOOL * _Nonnull stop) { + if ([obj isKindOfClass:moduleClass]) { + index = idx; + *stop = YES; + } + }]; + if (index >= 0) { + [self.TAModules removeObjectAtIndex:index]; + } + [self.TAModulesByEvent enumerateKeysAndObjectsUsingBlock:^(NSNumber * _Nonnull key, NSMutableArray> * _Nonnull obj, BOOL * _Nonnull stop) { + __block NSInteger index = -1; + [obj enumerateObjectsUsingBlock:^(id _Nonnull obj, NSUInteger idx, BOOL * _Nonnull stop) { + if ([obj isKindOfClass:moduleClass]) { + index = idx; + *stop = NO; + } + }]; + if (index >= 0) { + [obj removeObjectAtIndex:index]; + } + }]; +} + +- (void)registedAllModules +{ + [self.TAModuleInfos sortUsingComparator:^NSComparisonResult(NSDictionary *module1, NSDictionary *module2) { + NSNumber *module1Level = (NSNumber *)[module1 objectForKey:kTAModuleInfoLevelKey]; + NSNumber *module2Level = (NSNumber *)[module2 objectForKey:kTAModuleInfoLevelKey]; + if (module1Level.integerValue != module2Level.integerValue) { + return module1Level.integerValue > module2Level.integerValue; + } else { + NSNumber *module1Priority = (NSNumber *)[module1 objectForKey:kTAModuleInfoPriorityKey]; + NSNumber *module2Priority = (NSNumber *)[module2 objectForKey:kTAModuleInfoPriorityKey]; + return module1Priority.integerValue < module2Priority.integerValue; + } + }]; + + NSMutableArray *tmpArray = [NSMutableArray array]; + + //module init + [self.TAModuleInfos enumerateObjectsUsingBlock:^(NSDictionary *module, NSUInteger idx, BOOL * _Nonnull stop) { + + NSString *classStr = [module objectForKey:kTAModuleInfoNameKey]; + + Class moduleClass = NSClassFromString(classStr); + BOOL hasInstantiated = ((NSNumber *)[module objectForKey:kTAModuleInfoHasInstantiatedKey]).boolValue; + if (NSStringFromClass(moduleClass) && !hasInstantiated) { + id moduleInstance = [[moduleClass alloc] init]; + [tmpArray addObject:moduleInstance]; + } + + }]; + +// [self.BHModules removeAllObjects]; + + [self.TAModules addObjectsFromArray:tmpArray]; + + [self registerAllSystemEvents]; +} + +- (void)registerCustomEvent:(NSInteger)eventType + withModuleInstance:(id)moduleInstance + andSelectorStr:(NSString *)selectorStr { + if (eventType < 1000) { + return; + } + [self registerEvent:eventType withModuleInstance:moduleInstance andSelectorStr:selectorStr]; +} + +- (void)triggerEvent:(NSInteger)eventType +{ + [self triggerEvent:eventType withCustomParam:nil]; +} + +- (void)triggerEvent:(NSInteger)eventType + withCustomParam:(NSDictionary *)customParam { + [self handleModuleEvent:eventType forTarget:nil withCustomParam:customParam]; +} + +#pragma mark - life loop + +- (instancetype)init +{ + self = [super init]; + if (self) { + self.TAModuleDynamicClasses = [NSMutableArray array]; + } + return self; +} + + +#pragma mark - private + +- (TAModuleLevel)checkModuleLevel:(NSUInteger)level +{ + switch (level) { + case 0: + return TAModuleBasic; + break; + case 1: + return TAModuleNormal; + break; + default: + break; + } + //default normal + return TAModuleNormal; +} + + +- (void)addModuleFromObject:(id)object +{ + Class class; + NSString *moduleName = nil; + + if (object) { + class = object; + moduleName = NSStringFromClass(class); + } else { + return ; + } + + __block BOOL flag = YES; + [self.TAModules enumerateObjectsUsingBlock:^(id _Nonnull obj, NSUInteger idx, BOOL * _Nonnull stop) { + if ([obj isKindOfClass:class]) { + flag = NO; + *stop = YES; + } + }]; + if (!flag) { + return; + } + + if ([class conformsToProtocol:@protocol(TAModuleProtocol)]) { + NSMutableDictionary *moduleInfo = [NSMutableDictionary dictionary]; + + BOOL responseBasicLevel = [class instancesRespondToSelector:@selector(basicModuleLevel)]; + + int levelInt = 1; + + if (responseBasicLevel) { + levelInt = 0; + } + + [moduleInfo setObject:@(levelInt) forKey:kTAModuleInfoLevelKey]; + if (moduleName) { + [moduleInfo setObject:moduleName forKey:kTAModuleInfoNameKey]; + } + + [self.TAModuleInfos addObject:moduleInfo]; + + id moduleInstance = [[class alloc] init]; + [self.TAModules addObject:moduleInstance]; + [moduleInfo setObject:@(YES) forKey:kTAModuleInfoHasInstantiatedKey]; + [self.TAModules sortUsingComparator:^NSComparisonResult(id moduleInstance1, id moduleInstance2) { + NSNumber *module1Level = @(TAModuleNormal); + NSNumber *module2Level = @(TAModuleNormal); + if ([moduleInstance1 respondsToSelector:@selector(basicModuleLevel)]) { + module1Level = @(TAModuleBasic); + } + if ([moduleInstance2 respondsToSelector:@selector(basicModuleLevel)]) { + module2Level = @(TAModuleBasic); + } + if (module1Level.integerValue != module2Level.integerValue) { + return module1Level.integerValue > module2Level.integerValue; + } else { + NSInteger module1Priority = 0; + NSInteger module2Priority = 0; + if ([moduleInstance1 respondsToSelector:@selector(modulePriority)]) { + module1Priority = [moduleInstance1 modulePriority]; + } + if ([moduleInstance2 respondsToSelector:@selector(modulePriority)]) { + module2Priority = [moduleInstance2 modulePriority]; + } + return module1Priority < module2Priority; + } + }]; + [self registerEventsByModuleInstance:moduleInstance]; + } +} + +- (void)registerAllSystemEvents +{ + [self.TAModules enumerateObjectsUsingBlock:^(id moduleInstance, NSUInteger idx, BOOL * _Nonnull stop) { + [self registerEventsByModuleInstance:moduleInstance]; + }]; +} + +- (void)registerEventsByModuleInstance:(id)moduleInstance +{ + NSArray *events = self.TASelectorByEvent.allKeys; + [events enumerateObjectsUsingBlock:^(NSNumber * _Nonnull obj, NSUInteger idx, BOOL * _Nonnull stop) { + [self registerEvent:obj.integerValue withModuleInstance:moduleInstance andSelectorStr:self.TASelectorByEvent[obj]]; + }]; +} + +- (void)registerEvent:(NSInteger)eventType + withModuleInstance:(id)moduleInstance + andSelectorStr:(NSString *)selectorStr { + SEL selector = NSSelectorFromString(selectorStr); + if (!selector || ![moduleInstance respondsToSelector:selector]) { + return; + } + NSNumber *eventTypeNumber = @(eventType); + if (!self.TASelectorByEvent[eventTypeNumber]) { + [self.TASelectorByEvent setObject:selectorStr forKey:eventTypeNumber]; + } + if (!self.TAModulesByEvent[eventTypeNumber]) { + [self.TAModulesByEvent setObject:@[].mutableCopy forKey:eventTypeNumber]; + } + NSMutableArray *eventModules = [self.TAModulesByEvent objectForKey:eventTypeNumber]; + if (![eventModules containsObject:moduleInstance]) { + [eventModules addObject:moduleInstance]; + [eventModules sortUsingComparator:^NSComparisonResult(id moduleInstance1, id moduleInstance2) { + NSNumber *module1Level = @(TAModuleNormal); + NSNumber *module2Level = @(TAModuleNormal); + if ([moduleInstance1 respondsToSelector:@selector(basicModuleLevel)]) { + module1Level = @(TAModuleBasic); + } + if ([moduleInstance2 respondsToSelector:@selector(basicModuleLevel)]) { + module2Level = @(TAModuleBasic); + } + if (module1Level.integerValue != module2Level.integerValue) { + return module1Level.integerValue > module2Level.integerValue; + } else { + NSInteger module1Priority = 0; + NSInteger module2Priority = 0; + if ([moduleInstance1 respondsToSelector:@selector(modulePriority)]) { + module1Priority = [moduleInstance1 modulePriority]; + } + if ([moduleInstance2 respondsToSelector:@selector(modulePriority)]) { + module2Priority = [moduleInstance2 modulePriority]; + } + return module1Priority < module2Priority; + } + }]; + } +} + + +#pragma mark - property setter or getter +- (NSMutableArray *)TAModuleInfos { + if (!_TAModuleInfos) { + _TAModuleInfos = @[].mutableCopy; + } + return _TAModuleInfos; +} + +- (NSMutableArray *)TAModules +{ + if (!_TAModules) { + _TAModules = [NSMutableArray array]; + } + return _TAModules; +} + +- (NSMutableDictionary> *> *)TAModulesByEvent +{ + if (!_TAModulesByEvent) { + _TAModulesByEvent = @{}.mutableCopy; + } + return _TAModulesByEvent; +} + +- (NSMutableDictionary *)TASelectorByEvent +{ + if (!_TASelectorByEvent) { + _TASelectorByEvent = @{ + @(TAMSetupEvent):kTASetupSelector, + @(TAMInitEvent):kTAInitSelector, + @(TAMTearDownEvent):kTATearDownSelector, + @(TAMSplashEvent):kTASplashSeletor, + @(TAMWillResignActiveEvent):kTAWillResignActiveSelector, + @(TAMDidEnterBackgroundEvent):kTADidEnterBackgroundSelector, + @(TAMWillEnterForegroundEvent):kTAWillEnterForegroundSelector, + @(TAMDidBecomeActiveEvent):kTADidBecomeActiveSelector, + @(TAMWillTerminateEvent):kTAWillTerminateSelector, + @(TAMUnmountEvent):kTAUnmountEventSelector, + @(TAMOpenURLEvent):kTAOpenURLSelector, + @(TAMDidReceiveMemoryWarningEvent):kTADidReceiveMemoryWarningSelector, + + @(TAMDidReceiveRemoteNotificationEvent):kTADidReceiveRemoteNotificationsSelector, + @(TAMWillPresentNotificationEvent):kTAWillPresentNotificationSelector, + @(TAMDidReceiveNotificationResponseEvent):kTADidReceiveNotificationResponseSelector, + + @(TAMDidFailToRegisterForRemoteNotificationsEvent):kTAFailToRegisterForRemoteNotificationsSelector, + @(TAMDidRegisterForRemoteNotificationsEvent):kTADidRegisterForRemoteNotificationsSelector, + + @(TAMDidReceiveLocalNotificationEvent):kTADidReceiveLocalNotificationsSelector, + + @(TAMWillContinueUserActivityEvent):kTAWillContinueUserActivitySelector, + + @(TAMContinueUserActivityEvent):kTAContinueUserActivitySelector, + + @(TAMDidFailToContinueUserActivityEvent):kTAFailToContinueUserActivitySelector, + + @(TAMDidUpdateUserActivityEvent):kTADidUpdateContinueUserActivitySelector, + + @(TAMQuickActionEvent):kTAQuickActionSelector, + @(TAMDidCustomEvent):kTAAppCustomSelector, + }.mutableCopy; + } + return _TASelectorByEvent; +} + +#pragma mark - module protocol +- (void)handleModuleEvent:(NSInteger)eventType + forTarget:(id)target + withCustomParam:(NSDictionary *)customParam +{ + switch (eventType) { + case TAMInitEvent: + //special + [self handleModulesInitEventForTarget:nil withCustomParam :customParam]; + break; + case TAMTearDownEvent: + //special + [self handleModulesTearDownEventForTarget:nil withCustomParam:customParam]; + break; + default: { + NSString *selectorStr = [self.TASelectorByEvent objectForKey:@(eventType)]; + [self handleModuleEvent:eventType forTarget:nil withSeletorStr:selectorStr andCustomParam:customParam]; + } + break; + } + +} + +- (void)handleModulesInitEventForTarget:(id)target + withCustomParam:(NSDictionary *)customParam +{ + TAContext *context = [TAContext shareInstance].copy; + + NSArray> *moduleInstances; + if (target) { + moduleInstances = @[target]; + } else { + moduleInstances = [self.TAModulesByEvent objectForKey:@(TAMInitEvent)]; + } + + [moduleInstances enumerateObjectsUsingBlock:^(id moduleInstance, NSUInteger idx, BOOL * _Nonnull stop) { + __weak __typeof(&*self) wself = self; + void ( ^ bk )(void); + bk = ^(){ + __strong __typeof(&*self) sself = wself; + if (sself) { + if ([moduleInstance respondsToSelector:@selector(modInit:)]) { + [moduleInstance modInit:context]; + } + } + }; + + if ([moduleInstance respondsToSelector:@selector(async)]) { + BOOL async = [moduleInstance async]; + + if (async) { + dispatch_async(dispatch_get_main_queue(), ^{ + bk(); + }); + + } else { + bk(); + } + } else { + bk(); + } + }]; +} + +- (void)handleModulesTearDownEventForTarget:(id)target + withCustomParam:(NSDictionary *)customParam +{ + TAContext *context = [TAContext shareInstance].copy; + + NSArray> *moduleInstances; + if (target) { + moduleInstances = @[target]; + } else { + moduleInstances = [self.TAModulesByEvent objectForKey:@(TAMTearDownEvent)]; + } + + //Reverse Order to unload + for (int i = (int)moduleInstances.count - 1; i >= 0; i--) { + id moduleInstance = [moduleInstances objectAtIndex:i]; + if (moduleInstance && [moduleInstance respondsToSelector:@selector(modTearDown:)]) { + [moduleInstance modTearDown:context]; + } + } +} + + +- (void)handleModuleEvent:(NSInteger)eventType + forTarget:(id)target + withSeletorStr:(NSString *)selectorStr + andCustomParam:(NSDictionary *)customParam +{ + TAContext *context = [TAContext shareInstance].copy; + if (!selectorStr.length) { + selectorStr = [self.TASelectorByEvent objectForKey:@(eventType)]; + } + SEL seletor = NSSelectorFromString(selectorStr); + if (!seletor) { + selectorStr = [self.TASelectorByEvent objectForKey:@(eventType)]; + seletor = NSSelectorFromString(selectorStr); + } + NSArray> *moduleInstances; + if (target) { + moduleInstances = @[target]; + } else { + moduleInstances = [self.TAModulesByEvent objectForKey:@(eventType)]; + } + [moduleInstances enumerateObjectsUsingBlock:^(id moduleInstance, NSUInteger idx, BOOL * _Nonnull stop) { + if ([moduleInstance respondsToSelector:seletor]) { +#pragma clang diagnostic push +#pragma clang diagnostic ignored "-Warc-performSelector-leaks" + [moduleInstance performSelector:seletor withObject:context]; +#pragma clang diagnostic pop + } + }]; +} + + +@end diff --git a/Assets/HCMiniSdk/Third/ta/Plugins/iOS/ThinkingSDK/Source/Router/TAModuleManager.m.meta b/Assets/HCMiniSdk/Third/ta/Plugins/iOS/ThinkingSDK/Source/Router/TAModuleManager.m.meta new file mode 100644 index 00000000..4b8a8dfe --- /dev/null +++ b/Assets/HCMiniSdk/Third/ta/Plugins/iOS/ThinkingSDK/Source/Router/TAModuleManager.m.meta @@ -0,0 +1,33 @@ +fileFormatVersion: 2 +guid: da4c218c7c38e4c4193eba5a2a2e6ef1 +PluginImporter: + externalObjects: {} + serializedVersion: 2 + iconMap: {} + executionOrder: {} + defineConstraints: [] + isPreloaded: 0 + isOverridable: 0 + isExplicitlyReferenced: 0 + validateReferences: 1 + platformData: + - first: + Any: + second: + enabled: 0 + settings: {} + - first: + Editor: Editor + second: + enabled: 0 + settings: + DefaultValueInitialized: true + - first: + iPhone: iOS + second: + enabled: 1 + settings: + AddToEmbeddedBinaries: false + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/HCMiniSdk/Third/ta/Plugins/iOS/ThinkingSDK/Source/Router/TAModuleProtocol.h b/Assets/HCMiniSdk/Third/ta/Plugins/iOS/ThinkingSDK/Source/Router/TAModuleProtocol.h new file mode 100755 index 00000000..39a89449 --- /dev/null +++ b/Assets/HCMiniSdk/Third/ta/Plugins/iOS/ThinkingSDK/Source/Router/TAModuleProtocol.h @@ -0,0 +1,81 @@ +// +// TAModuleProtocol.h +// ThinkingSDK.default-Base-Core-Extension-Router-Util-iOS +// +// Created by wwango on 2022/10/7. +// + +#import + +#define TA_EXPORT_MODULE(isAsync) \ ++ (void)load { [[TAModuleManager sharedManager] registerDynamicModule:[self class]]; } \ +-(BOOL)async { return [[NSString stringWithUTF8String:#isAsync] boolValue];} + +@class TAContext; + + +NS_ASSUME_NONNULL_BEGIN + +@protocol TAModuleProtocol + +@optional + +- (void)basicModuleLevel; + +- (NSInteger)modulePriority; + +- (BOOL)async; + +- (void)modSetUp:(TAContext *)context; + +- (void)modInit:(TAContext *)context; + +- (void)modSplash:(TAContext *)context; + +- (void)modQuickAction:(TAContext *)context; + +- (void)modTearDown:(TAContext *)context; + +- (void)modWillResignActive:(TAContext *)context; + +- (void)modDidEnterBackground:(TAContext *)context; + +- (void)modWillEnterForeground:(TAContext *)context; + +- (void)modDidBecomeActive:(TAContext *)context; + +- (void)modWillTerminate:(TAContext *)context; + +- (void)modUnmount:(TAContext *)context; + +- (void)modOpenURL:(TAContext *)context; + +- (void)modDidReceiveMemoryWaring:(TAContext *)context; + +- (void)modDidFailToRegisterForRemoteNotifications:(TAContext *)context; + +- (void)modDidRegisterForRemoteNotifications:(TAContext *)context; + +- (void)modDidReceiveRemoteNotification:(TAContext *)context; + +- (void)modDidReceiveLocalNotification:(TAContext *)context; + +- (void)modWillPresentNotification:(TAContext *)context; + +- (void)modDidReceiveNotificationResponse:(TAContext *)context; + +- (void)modWillContinueUserActivity:(TAContext *)context; + +- (void)modContinueUserActivity:(TAContext *)context; + +- (void)modDidFailToContinueUserActivity:(TAContext *)context; + +- (void)modDidUpdateContinueUserActivity:(TAContext *)context; + +- (void)modHandleWatchKitExtensionRequest:(TAContext *)context; + +- (void)modDidCustomEvent:(TAContext *)context; + +@end + +NS_ASSUME_NONNULL_END diff --git a/Assets/HCMiniSdk/Third/ta/Plugins/iOS/ThinkingSDK/Source/Router/TAModuleProtocol.h.meta b/Assets/HCMiniSdk/Third/ta/Plugins/iOS/ThinkingSDK/Source/Router/TAModuleProtocol.h.meta new file mode 100644 index 00000000..e42e279e --- /dev/null +++ b/Assets/HCMiniSdk/Third/ta/Plugins/iOS/ThinkingSDK/Source/Router/TAModuleProtocol.h.meta @@ -0,0 +1,33 @@ +fileFormatVersion: 2 +guid: 9e62ae8b8641e48f0955719f8ae00a20 +PluginImporter: + externalObjects: {} + serializedVersion: 2 + iconMap: {} + executionOrder: {} + defineConstraints: [] + isPreloaded: 0 + isOverridable: 0 + isExplicitlyReferenced: 0 + validateReferences: 1 + platformData: + - first: + Any: + second: + enabled: 0 + settings: {} + - first: + Editor: Editor + second: + enabled: 0 + settings: + DefaultValueInitialized: true + - first: + iPhone: iOS + second: + enabled: 1 + settings: + AddToEmbeddedBinaries: false + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/HCMiniSdk/Third/ta/Plugins/iOS/ThinkingSDK/Source/Router/TARouter.h b/Assets/HCMiniSdk/Third/ta/Plugins/iOS/ThinkingSDK/Source/Router/TARouter.h new file mode 100755 index 00000000..3a5fe481 --- /dev/null +++ b/Assets/HCMiniSdk/Third/ta/Plugins/iOS/ThinkingSDK/Source/Router/TARouter.h @@ -0,0 +1,38 @@ +// +// TARouter.h +// Pods +// +// Created by wwango on 2022/10/8. +// + +#import + +NS_ASSUME_NONNULL_BEGIN + +static NSString *const TARURLSchemeGlobalKey = @"URLGlobalScheme"; +static NSString *const TARURLHostCallService = @"call.service.thinkingdata"; +static NSString *const TARURLHostRegister = @"register.thinking"; +static NSString *const TARURLSubPathSplitPattern = @"."; +static NSString *const TARURLQueryParamsKey = @"params"; + +typedef void(^TARPathComponentCustomHandler)(NSDictionary *params); + +@interface TARouter : NSObject + +- (instancetype)init NS_UNAVAILABLE; ++ (instancetype)new NS_UNAVAILABLE; + ++ (instancetype)globalRouter; ++ (instancetype)routerForScheme:(NSString *)scheme; + +//url - > com.thinkingdata://call.service/pathComponentKey.protocolName.selector/...?params={}(value url encode) ++ (BOOL)canOpenURL:(NSURL *)URL; ++ (BOOL)openURL:(NSURL *)URL; ++ (BOOL)openURL:(NSURL *)URL + withParams:(NSDictionary *> *)params; ++ (BOOL)openURL:(NSURL *)URL + withParams:(NSDictionary *> *)params + andThen:(void(^)(NSString *pathComponentKey, id obj, id returnValue))then; +@end + +NS_ASSUME_NONNULL_END diff --git a/Assets/HCMiniSdk/Third/ta/Plugins/iOS/ThinkingSDK/Source/Router/TARouter.h.meta b/Assets/HCMiniSdk/Third/ta/Plugins/iOS/ThinkingSDK/Source/Router/TARouter.h.meta new file mode 100644 index 00000000..b4bf8642 --- /dev/null +++ b/Assets/HCMiniSdk/Third/ta/Plugins/iOS/ThinkingSDK/Source/Router/TARouter.h.meta @@ -0,0 +1,33 @@ +fileFormatVersion: 2 +guid: 6ac006a6088da4b4aba7a9bd9c10501b +PluginImporter: + externalObjects: {} + serializedVersion: 2 + iconMap: {} + executionOrder: {} + defineConstraints: [] + isPreloaded: 0 + isOverridable: 0 + isExplicitlyReferenced: 0 + validateReferences: 1 + platformData: + - first: + Any: + second: + enabled: 0 + settings: {} + - first: + Editor: Editor + second: + enabled: 0 + settings: + DefaultValueInitialized: true + - first: + iPhone: iOS + second: + enabled: 1 + settings: + AddToEmbeddedBinaries: false + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/HCMiniSdk/Third/ta/Plugins/iOS/ThinkingSDK/Source/Router/TARouter.m b/Assets/HCMiniSdk/Third/ta/Plugins/iOS/ThinkingSDK/Source/Router/TARouter.m new file mode 100755 index 00000000..74631677 --- /dev/null +++ b/Assets/HCMiniSdk/Third/ta/Plugins/iOS/ThinkingSDK/Source/Router/TARouter.m @@ -0,0 +1,491 @@ +// +// TARouter.m +// Pods +// +// Created by wwango on 2022/10/8. +// + +#import "TARouter.h" +#import "TAServiceProtocol.h" +#import "TAServiceManager.h" +#import + +@interface NSObject (TARetType) + ++ (id)bh_getReturnFromInv:(NSInvocation *)inv withSig:(NSMethodSignature *)sig; + +@end + +@implementation NSObject (TARetType) + ++ (id)bh_getReturnFromInv:(NSInvocation *)inv withSig:(NSMethodSignature *)sig { + NSUInteger length = [sig methodReturnLength]; + if (length == 0) return nil; + + char *type = (char *)[sig methodReturnType]; + while (*type == 'r' || // const + *type == 'n' || // in + *type == 'N' || // inout + *type == 'o' || // out + *type == 'O' || // bycopy + *type == 'R' || // byref + *type == 'V') { // oneway + type++; // cutoff useless prefix + } + +#define ta_return_with_number(_type_) \ +do { \ +_type_ ret; \ +[inv getReturnValue:&ret]; \ +return @(ret); \ +} while (0) + + switch (*type) { + case 'v': return nil; // void + case 'B': ta_return_with_number(bool); + case 'c': ta_return_with_number(char); + case 'C': ta_return_with_number(unsigned char); + case 's': ta_return_with_number(short); + case 'S': ta_return_with_number(unsigned short); + case 'i': ta_return_with_number(int); + case 'I': ta_return_with_number(unsigned int); + case 'l': ta_return_with_number(int); + case 'L': ta_return_with_number(unsigned int); + case 'q': ta_return_with_number(long long); + case 'Q': ta_return_with_number(unsigned long long); + case 'f': ta_return_with_number(float); + case 'd': ta_return_with_number(double); + case 'D': { // long double + long double ret; + [inv getReturnValue:&ret]; + return [NSNumber numberWithDouble:ret]; + }; + + case '@': { // id + id ret = nil; + [inv getReturnValue:&ret]; + return ret; + }; + + case '#': { // Class + Class ret = nil; + [inv getReturnValue:&ret]; + return ret; + }; + + default: { // struct / union / SEL / void* / unknown + const char *objCType = [sig methodReturnType]; + char *buf = calloc(1, length); + if (!buf) return nil; + [inv getReturnValue:buf]; + NSValue *value = [NSValue valueWithBytes:buf objCType:objCType]; + free(buf); + return value; + }; + } +#undef ta_return_with_number +} + +@end + +static NSString *const TARClassRegex = @"(?<=T@\")(.*)(?=\",)"; + + +typedef NS_ENUM(NSUInteger, TARUsage) { + TARUsageUnknown, + TARUsageCallService, +}; + + +static NSMutableDictionary *routerByScheme = nil; + + +@interface TARPathComponent : NSObject + +@property (nonatomic, copy) NSString *key; +@property (nonatomic, strong) Class mClass; +@property (nonatomic, copy) NSDictionary *params; +@property (nonatomic, copy) TARPathComponentCustomHandler handler; + +@end + +@implementation TARPathComponent + +@end + +static NSString *TARURLGlobalScheme = nil; + +@interface TARouter () + +@property (nonatomic, strong) NSMutableDictionary *pathComponentByKey; +@property (nonatomic, copy) NSString *scheme; + +@end + +@implementation TARouter + +#pragma mark - property init +- (NSMutableDictionary *)pathComponentByKey { + if (!_pathComponentByKey) { + _pathComponentByKey = @{}.mutableCopy; + } + return _pathComponentByKey; +} + +#pragma mark - router init + ++ (instancetype)globalRouter +{ + if (!TARURLGlobalScheme) { + TARURLGlobalScheme = @"com.thinkingdata"; + } + return [self routerForScheme:TARURLGlobalScheme]; +} ++ (instancetype)routerForScheme:(NSString *)scheme +{ + if (!scheme.length) { + return nil; + } + + TARouter *router = nil; + + static dispatch_once_t onceToken; + dispatch_once(&onceToken, ^{ + routerByScheme = @{}.mutableCopy; + }); + + if (!routerByScheme[scheme]) { + router = [[self alloc] init]; + router.scheme = scheme; + [routerByScheme setObject:router forKey:scheme]; + } else { + router = [routerByScheme objectForKey:scheme]; + } + + return router; +} + ++ (void)unRegisterRouterForScheme:(NSString *)scheme +{ + if (!scheme.length) { + return; + } + + [routerByScheme removeObjectForKey:scheme]; +} ++ (void)unRegisterAllRouters +{ + [routerByScheme removeAllObjects]; +} + +- (void)addPathComponent:(NSString *)pathComponentKey + forClass:(Class)mClass +{ + [self addPathComponent:pathComponentKey forClass:mClass handler:nil]; +} +//handler is a custom module or service init function +- (void)addPathComponent:(NSString *)pathComponentKey + forClass:(Class)mClass + handler:(TARPathComponentCustomHandler)handler +{ + TARPathComponent *pathComponent = [[TARPathComponent alloc] init]; + pathComponent.key = pathComponentKey; + pathComponent.mClass = mClass; + pathComponent.handler = handler; + [self.pathComponentByKey setObject:pathComponent forKey:pathComponentKey]; +} +- (void)removePathComponent:(NSString *)pathComponentKey +{ + [self.pathComponentByKey removeObjectForKey:pathComponentKey]; +} + ++ (BOOL)canOpenURL:(NSURL *)URL +{ + if (!URL) { + return NO; + } + NSString *scheme = URL.scheme; + if (!scheme.length) { + return NO; + } + + NSString *host = URL.host; + TARUsage usage = [self usage:host]; + if (usage == TARUsageUnknown) { + return NO; + } + + TARouter *router = [self routerForScheme:scheme]; + + NSArray *pathComponents = URL.pathComponents; + + __block BOOL flag = YES; + + [pathComponents enumerateObjectsUsingBlock:^(NSString * _Nonnull obj, NSUInteger idx, BOOL * _Nonnull stop) { + NSArray * subPaths = [obj componentsSeparatedByString:TARURLSubPathSplitPattern]; + + if ([subPaths.firstObject isEqualToString:@"/"]) { + return; + } + + if (!subPaths.count) { + flag = NO; + *stop = NO; + return; + } + NSString *pathComponentKey = subPaths.firstObject; + + + if (router.pathComponentByKey[pathComponentKey]) { + return; + } + Class mClass = NSClassFromString(pathComponentKey); + if (!mClass) { + flag = NO; + *stop = NO; + return; + } + switch (usage) { + case TARUsageCallService: { + if (subPaths.count < 3) { + flag = NO; + *stop = NO; + return; + } + NSString *protocolStr = subPaths[1]; + NSString *selectorStr = subPaths[2]; + Protocol *protocol = NSProtocolFromString(protocolStr); + SEL selector = NSSelectorFromString(selectorStr); + if (!protocol || + !selector || + ![mClass conformsToProtocol:protocol] || + ![mClass instancesRespondToSelector:selector]) { + flag = NO; + *stop = NO; + return; + } + } break; + default: + break; + } + }]; + + return flag; +} + + ++ (BOOL)openURL:(NSURL *)URL +{ + return [self openURL:URL withParams:nil andThen:nil]; +} ++ (BOOL)openURL:(NSURL *)URL + withParams:(NSDictionary *> *)params +{ + return [self openURL:URL withParams:params andThen:nil]; +} ++ (BOOL)openURL:(NSURL *)URL + withParams:(NSDictionary *> *)params + andThen:(void(^)(NSString *pathComponentKey, id obj, id returnValue))then +{ + if (![self canOpenURL:URL]) { + return NO; + } + + NSString *scheme = URL.scheme; + TARouter *router = [self routerForScheme:scheme]; + + NSString *host = URL.host; + TARUsage usage = [self usage:host]; + + NSDictionary *queryDic = [self queryDicFromURL:URL]; + NSString *paramsJson = [queryDic objectForKey:TARURLQueryParamsKey]; + NSDictionary *> *allURLParams = [self paramsFromJson:paramsJson]; + + NSArray *pathComponents = URL.pathComponents; + + [pathComponents enumerateObjectsUsingBlock:^(NSString * _Nonnull obj, NSUInteger idx, BOOL * _Nonnull stop) { + if (![obj isEqualToString:@"/"]) { + + NSArray * subPaths = [obj componentsSeparatedByString:TARURLSubPathSplitPattern]; + NSString *pathComponentKey = subPaths.firstObject; + + Class mClass; + TARPathComponentCustomHandler handler; + TARPathComponent *pathComponent = [router.pathComponentByKey objectForKey:pathComponentKey]; + if (pathComponent) { + mClass = pathComponent.mClass; + handler = pathComponent.handler; + } else { + mClass = NSClassFromString(pathComponentKey); + } + + NSDictionary *URLParams = [allURLParams objectForKey:pathComponentKey]; + NSDictionary *funcParams = [params objectForKey:pathComponentKey]; + NSDictionary *finalParams = [self solveURLParams:URLParams withFuncParams:funcParams forClass:usage == TARUsageCallService ? nil : mClass]; + + if (handler) { + handler(finalParams); + return; + } + + NSString *protocolStr; + Protocol *protocol; + if (subPaths.count >= 2) { + protocolStr = subPaths[1]; + protocol = NSProtocolFromString(protocolStr); + } + + id obj; + id returnValue; + + switch (usage) { + case TARUsageCallService: { + NSString *selectorStr = subPaths[2]; + SEL selector = NSSelectorFromString(selectorStr); + obj = [[TAServiceManager sharedManager] createService:protocol]; + returnValue = [self safePerformAction:selector forTarget:obj withParams:finalParams]; + } break; + default: + break; + } + !then?:then(pathComponentKey, obj, returnValue); + } + }]; + + return YES; +} + + +#pragma mark - private ++ (TARUsage)usage:(NSString *)usagePattern +{ + usagePattern = usagePattern.lowercaseString; + if ([usagePattern isEqualToString:TARURLHostCallService]) { + return TARUsageCallService; + } + return TARUsageUnknown; +} + ++ (NSDictionary *)queryDicFromURL:(NSURL *)URL +{ + if (!URL) { + return nil; + } + if ([UIDevice currentDevice].systemVersion.floatValue < 8) { + NSMutableDictionary *dic = @{}.mutableCopy; + NSString *query = URL.query; + NSArray *queryStrs = [query componentsSeparatedByString:@"&"]; + [queryStrs enumerateObjectsUsingBlock:^(NSString * _Nonnull obj, NSUInteger idx, BOOL * _Nonnull stop) { + NSArray *keyValue = [obj componentsSeparatedByString:@"="]; + if (keyValue.count >= 2) { + NSString *key = keyValue[0]; + NSString *value = keyValue[1]; + [dic setObject:value forKey:key]; + } + }]; + return dic; + } else { + NSURLComponents *URLComponents = [NSURLComponents componentsWithURL:URL + resolvingAgainstBaseURL:NO]; + NSArray *queryItems = URLComponents.queryItems; + NSMutableDictionary *dic = @{}.mutableCopy; + for (NSURLQueryItem *item in queryItems) { + if (item.name && item.value) { + [dic setObject:item.value forKey:item.name]; + } + } + return dic; + } +} + ++ (NSDictionary *> *)paramsFromJson:(NSString *)json +{ + if (!json.length) { + return nil; + } + NSError *error; + NSDictionary *dic = [NSJSONSerialization JSONObjectWithData:[json dataUsingEncoding:NSUTF8StringEncoding] options:0 error:&error]; + if (error) { + NSLog(@"TARouter [Error] Wrong URL Query Format: \n%@", error.description); + } + return dic; +} + + ++ (NSDictionary *)solveURLParams:(NSDictionary *)URLParams + withFuncParams:(NSDictionary *)funcParams + forClass:(Class)mClass +{ + if (!URLParams) { + URLParams = @{}; + } + NSMutableDictionary *params = URLParams.mutableCopy; + NSArray *funcParamKeys = funcParams.allKeys; + [funcParamKeys enumerateObjectsUsingBlock:^(id _Nonnull obj, NSUInteger idx, BOOL * _Nonnull stop) { + [params setObject:funcParams[obj] forKey:obj]; + }]; + if (mClass) { + NSArray *paramKeys = params.allKeys; + [paramKeys enumerateObjectsUsingBlock:^(NSString * _Nonnull obj, NSUInteger idx, BOOL * _Nonnull stop) { + objc_property_t prop = class_getProperty(mClass, obj.UTF8String); + if (!prop) { + [params removeObjectForKey:obj]; + } else { + NSString *propAttr = [[NSString alloc] initWithCString:property_getAttributes(prop) encoding:NSUTF8StringEncoding]; + NSRange range = [propAttr rangeOfString:TARClassRegex options:NSRegularExpressionSearch]; + if (range.length != 0) { + NSString *propClassName = [propAttr substringWithRange:range]; + Class propClass = objc_getClass([propClassName UTF8String]); + if ([propClass isSubclassOfClass:[NSString class]] && [params[obj] isKindOfClass:[NSNumber class]]) { + [params setObject:[NSString stringWithFormat:@"%@", params[obj]] forKey:obj]; + } else if ([propClass isSubclassOfClass:[NSNumber class]] && [params[obj] isKindOfClass:[NSString class]]) { + [params setObject:@(((NSString *)params[obj]).doubleValue) forKey:obj]; + } + + } + } + }]; + } + return params; +} + ++ (void)setObject:(id)object + withPropertys:(NSDictionary *)propertys +{ + if (!object) { + return; + } + [propertys enumerateKeysAndObjectsUsingBlock:^(NSString * _Nonnull key, id _Nonnull obj, BOOL * _Nonnull stop) { + [object setValue:obj forKey:key]; + }]; +} + ++ (id)safePerformAction:(SEL)action + forTarget:(NSObject *)target + withParams:(NSDictionary *)params +{ + NSMethodSignature * sig = [target methodSignatureForSelector:action]; + if (!sig) { return nil; } + NSInvocation *inv = [NSInvocation invocationWithMethodSignature:sig]; + if (!inv) { return nil; } + [inv setTarget:target]; + [inv setSelector:action]; + NSArray *keys = params.allKeys; + keys = [keys sortedArrayUsingComparator:^NSComparisonResult(NSString * _Nonnull obj1, NSString * _Nonnull obj2) { + if (obj1.integerValue < obj2.integerValue) { + return NSOrderedAscending; + } else if (obj1.integerValue == obj2.integerValue) { + return NSOrderedSame; + } else { + return NSOrderedDescending; + } + }]; + [keys enumerateObjectsUsingBlock:^(NSString * _Nonnull obj, NSUInteger idx, BOOL * _Nonnull stop) { + id value = params[obj]; + [inv setArgument:&value atIndex:idx+2]; + }]; + [inv invoke]; + return [NSObject bh_getReturnFromInv:inv withSig:sig]; +} + +@end diff --git a/Assets/HCMiniSdk/Third/ta/Plugins/iOS/ThinkingSDK/Source/Router/TARouter.m.meta b/Assets/HCMiniSdk/Third/ta/Plugins/iOS/ThinkingSDK/Source/Router/TARouter.m.meta new file mode 100644 index 00000000..8a84af9e --- /dev/null +++ b/Assets/HCMiniSdk/Third/ta/Plugins/iOS/ThinkingSDK/Source/Router/TARouter.m.meta @@ -0,0 +1,33 @@ +fileFormatVersion: 2 +guid: 21c34e28b6fa5400b809156f250bf6a4 +PluginImporter: + externalObjects: {} + serializedVersion: 2 + iconMap: {} + executionOrder: {} + defineConstraints: [] + isPreloaded: 0 + isOverridable: 0 + isExplicitlyReferenced: 0 + validateReferences: 1 + platformData: + - first: + Any: + second: + enabled: 0 + settings: {} + - first: + Editor: Editor + second: + enabled: 0 + settings: + DefaultValueInitialized: true + - first: + iPhone: iOS + second: + enabled: 1 + settings: + AddToEmbeddedBinaries: false + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/HCMiniSdk/Third/ta/Plugins/iOS/ThinkingSDK/Source/Router/TAServiceManager.h b/Assets/HCMiniSdk/Third/ta/Plugins/iOS/ThinkingSDK/Source/Router/TAServiceManager.h new file mode 100755 index 00000000..e0463671 --- /dev/null +++ b/Assets/HCMiniSdk/Third/ta/Plugins/iOS/ThinkingSDK/Source/Router/TAServiceManager.h @@ -0,0 +1,28 @@ +// +// TAServiceManager.h +// ThinkingSDK.default-Base-Core-Extension-Router-Util-iOS +// +// Created by wwango on 2022/10/7. +// + +#import + +NS_ASSUME_NONNULL_BEGIN + +@interface TAServiceManager : NSObject + +@property (nonatomic, assign) BOOL enableException; + ++ (instancetype)sharedManager; + +- (void)registerLocalServices; + +- (void)registerService:(Protocol *)service implClass:(Class)implClass; + +- (id)createService:(Protocol *)service; +- (id)createService:(Protocol *)service withServiceName:(NSString *)serviceName; +- (id)createService:(Protocol *)service withServiceName:(NSString *)serviceName shouldCache:(BOOL)shouldCache; + +@end + +NS_ASSUME_NONNULL_END diff --git a/Assets/HCMiniSdk/Third/ta/Plugins/iOS/ThinkingSDK/Source/Router/TAServiceManager.h.meta b/Assets/HCMiniSdk/Third/ta/Plugins/iOS/ThinkingSDK/Source/Router/TAServiceManager.h.meta new file mode 100644 index 00000000..130b7bb8 --- /dev/null +++ b/Assets/HCMiniSdk/Third/ta/Plugins/iOS/ThinkingSDK/Source/Router/TAServiceManager.h.meta @@ -0,0 +1,33 @@ +fileFormatVersion: 2 +guid: 93df7349b563b4b79a5c46db99fbefd5 +PluginImporter: + externalObjects: {} + serializedVersion: 2 + iconMap: {} + executionOrder: {} + defineConstraints: [] + isPreloaded: 0 + isOverridable: 0 + isExplicitlyReferenced: 0 + validateReferences: 1 + platformData: + - first: + Any: + second: + enabled: 0 + settings: {} + - first: + Editor: Editor + second: + enabled: 0 + settings: + DefaultValueInitialized: true + - first: + iPhone: iOS + second: + enabled: 1 + settings: + AddToEmbeddedBinaries: false + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/HCMiniSdk/Third/ta/Plugins/iOS/ThinkingSDK/Source/Router/TAServiceManager.m b/Assets/HCMiniSdk/Third/ta/Plugins/iOS/ThinkingSDK/Source/Router/TAServiceManager.m new file mode 100755 index 00000000..160279d1 --- /dev/null +++ b/Assets/HCMiniSdk/Third/ta/Plugins/iOS/ThinkingSDK/Source/Router/TAServiceManager.m @@ -0,0 +1,163 @@ +// +// TAServiceManager.m +// ThinkingSDK.default-Base-Core-Extension-Router-Util-iOS +// +// Created by wwango on 2022/10/7. +// + +#import "TAServiceManager.h" +#import "TAContext.h" +#import "TAAnnotation.h" +#import + +static const NSString *kTAService = @"service"; +static const NSString *kTAImpl = @"impl"; + +@interface TAServiceManager() + +@property (nonatomic, strong) NSMutableDictionary *allServicesDict; +@property (nonatomic, strong) NSRecursiveLock *lock; + +@end + +@implementation TAServiceManager + ++ (instancetype)sharedManager +{ + static id sharedManager = nil; + static dispatch_once_t onceToken = 0; + dispatch_once(&onceToken, ^{ + sharedManager = [[self alloc] init]; + }); + return sharedManager; +} + +- (void)registerLocalServices +{ + +} + +- (void)registerService:(Protocol *)service implClass:(Class)implClass +{ + NSParameterAssert(service != nil); + NSParameterAssert(implClass != nil); + + if (![implClass conformsToProtocol:service]) { + if (self.enableException) { + @throw [NSException exceptionWithName:NSInternalInconsistencyException reason:[NSString stringWithFormat:@"%@ module does not comply with %@ protocol", NSStringFromClass(implClass), NSStringFromProtocol(service)] userInfo:nil]; + } + return; + } + + if ([self checkValidService:service]) { + if (self.enableException) { + @throw [NSException exceptionWithName:NSInternalInconsistencyException reason:[NSString stringWithFormat:@"%@ protocol has been registed", NSStringFromProtocol(service)] userInfo:nil]; + } + return; + } + + NSString *key = NSStringFromProtocol(service); + NSString *value = NSStringFromClass(implClass); + + if (key.length > 0 && value.length > 0) { + [self.lock lock]; + [self.allServicesDict addEntriesFromDictionary:@{key:value}]; + [self.lock unlock]; + } + +} + +- (id)createService:(Protocol *)service +{ + return [self createService:service withServiceName:nil]; +} + +- (id)createService:(Protocol *)service withServiceName:(NSString *)serviceName { + return [self createService:service withServiceName:serviceName shouldCache:YES]; +} + +- (id)createService:(Protocol *)service withServiceName:(NSString *)serviceName shouldCache:(BOOL)shouldCache { + if (!serviceName.length) { + serviceName = NSStringFromProtocol(service); + } + id implInstance = nil; + + if (![self checkValidService:service]) { + if (self.enableException) { + @throw [NSException exceptionWithName:NSInternalInconsistencyException reason:[NSString stringWithFormat:@"%@ protocol does not been registed", NSStringFromProtocol(service)] userInfo:nil]; + } + + } + + NSString *serviceStr = serviceName; + if (shouldCache) { + id protocolImpl = [[TAContext shareInstance] getServiceInstanceFromServiceName:serviceStr]; + if (protocolImpl) { + return protocolImpl; + } + } + + Class implClass = [self serviceImplClass:service]; + if ([[implClass class] respondsToSelector:@selector(singleton)]) { + if ([[implClass class] performSelector:@selector(singleton)]) { + if ([[implClass class] respondsToSelector:@selector(shareInstance)]) + implInstance = [[implClass class] shareInstance]; + else + implInstance = [[implClass alloc] init]; + if (shouldCache) { + [[TAContext shareInstance] addServiceWithImplInstance:implInstance serviceName:serviceStr]; + return implInstance; + } else { + return implInstance; + } + } + } + return [[implClass alloc] init]; +} + +#pragma mark - private +- (Class)serviceImplClass:(Protocol *)service +{ + NSString *serviceImpl = [[self servicesDict] objectForKey:NSStringFromProtocol(service)]; + if (serviceImpl.length > 0) { + return NSClassFromString(serviceImpl); + } + return nil; +} + +- (BOOL)checkValidService:(Protocol *)service +{ + NSString *serviceImpl = [[self servicesDict] objectForKey:NSStringFromProtocol(service)]; + if (serviceImpl.length > 0) { + return YES; + } + return NO; +} + +- (NSMutableDictionary *)allServicesDict +{ + if (!_allServicesDict) { + _allServicesDict = [NSMutableDictionary dictionary]; + } + return _allServicesDict; +} + +- (NSRecursiveLock *)lock +{ + if (!_lock) { + _lock = [[NSRecursiveLock alloc] init]; + } + return _lock; +} + +- (NSDictionary *)servicesDict +{ + [self.lock lock]; + NSDictionary *dict = [self.allServicesDict copy]; + [self.lock unlock]; + return dict; +} + + + +@end diff --git a/Assets/HCMiniSdk/Third/ta/Plugins/iOS/ThinkingSDK/Source/Router/TAServiceManager.m.meta b/Assets/HCMiniSdk/Third/ta/Plugins/iOS/ThinkingSDK/Source/Router/TAServiceManager.m.meta new file mode 100644 index 00000000..ae9ace9e --- /dev/null +++ b/Assets/HCMiniSdk/Third/ta/Plugins/iOS/ThinkingSDK/Source/Router/TAServiceManager.m.meta @@ -0,0 +1,33 @@ +fileFormatVersion: 2 +guid: 98f2938bde4744111884fc671b940d3e +PluginImporter: + externalObjects: {} + serializedVersion: 2 + iconMap: {} + executionOrder: {} + defineConstraints: [] + isPreloaded: 0 + isOverridable: 0 + isExplicitlyReferenced: 0 + validateReferences: 1 + platformData: + - first: + Any: + second: + enabled: 0 + settings: {} + - first: + Editor: Editor + second: + enabled: 0 + settings: + DefaultValueInitialized: true + - first: + iPhone: iOS + second: + enabled: 1 + settings: + AddToEmbeddedBinaries: false + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/HCMiniSdk/Third/ta/Plugins/iOS/ThinkingSDK/Source/Router/TAServiceProtocol.h b/Assets/HCMiniSdk/Third/ta/Plugins/iOS/ThinkingSDK/Source/Router/TAServiceProtocol.h new file mode 100755 index 00000000..a4a16a65 --- /dev/null +++ b/Assets/HCMiniSdk/Third/ta/Plugins/iOS/ThinkingSDK/Source/Router/TAServiceProtocol.h @@ -0,0 +1,22 @@ +// +// TAServiceProtocol.h +// ThinkingSDK.default-Base-Core-Extension-Router-Util-iOS +// +// Created by wwango on 2022/10/7. +// + +#import + +NS_ASSUME_NONNULL_BEGIN + +@protocol TAServiceProtocol + +@optional + ++ (BOOL)singleton; + ++ (id)shareInstance; + +@end + +NS_ASSUME_NONNULL_END diff --git a/Assets/HCMiniSdk/Third/ta/Plugins/iOS/ThinkingSDK/Source/Router/TAServiceProtocol.h.meta b/Assets/HCMiniSdk/Third/ta/Plugins/iOS/ThinkingSDK/Source/Router/TAServiceProtocol.h.meta new file mode 100644 index 00000000..693e1d39 --- /dev/null +++ b/Assets/HCMiniSdk/Third/ta/Plugins/iOS/ThinkingSDK/Source/Router/TAServiceProtocol.h.meta @@ -0,0 +1,33 @@ +fileFormatVersion: 2 +guid: ded8d31faf72545589532f19e7ad7327 +PluginImporter: + externalObjects: {} + serializedVersion: 2 + iconMap: {} + executionOrder: {} + defineConstraints: [] + isPreloaded: 0 + isOverridable: 0 + isExplicitlyReferenced: 0 + validateReferences: 1 + platformData: + - first: + Any: + second: + enabled: 0 + settings: {} + - first: + Editor: Editor + second: + enabled: 0 + settings: + DefaultValueInitialized: true + - first: + iPhone: iOS + second: + enabled: 1 + settings: + AddToEmbeddedBinaries: false + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/HCMiniSdk/Third/ta/Plugins/iOS/ThinkingSDK/Source/Store.meta b/Assets/HCMiniSdk/Third/ta/Plugins/iOS/ThinkingSDK/Source/Store.meta new file mode 100644 index 00000000..9d8ca713 --- /dev/null +++ b/Assets/HCMiniSdk/Third/ta/Plugins/iOS/ThinkingSDK/Source/Store.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: de79325140491402e88158d3e68becea +folderAsset: yes +DefaultImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/HCMiniSdk/Third/ta/Plugins/iOS/ThinkingSDK/Source/Store/TDFile.h b/Assets/HCMiniSdk/Third/ta/Plugins/iOS/ThinkingSDK/Source/Store/TDFile.h new file mode 100755 index 00000000..2f756da0 --- /dev/null +++ b/Assets/HCMiniSdk/Third/ta/Plugins/iOS/ThinkingSDK/Source/Store/TDFile.h @@ -0,0 +1,63 @@ +// +// TDFile.h +// ThinkingSDK +// +// Created by LiHuanan on 2020/9/8. +// Copyright © 2020 thinkingdata. All rights reserved. +// + +#import + +NS_ASSUME_NONNULL_BEGIN + +@interface TDFile : NSObject + +@property(strong,nonatomic) NSString* appid; + +- (instancetype)initWithAppid:(NSString*)appid; + +- (void)archiveSessionID:(long long)sessionid; +- (long long)unarchiveSessionID ; + +- (void)archiveIdentifyId:(nullable NSString *)identifyId; +- (NSString*)unarchiveIdentifyID ; + +- (void)archiveAccountID:(nullable NSString *)accountID; +- (NSString*)unarchiveAccountID ; + +- (void)archiveUploadSize:(NSNumber *)uploadSize; +- (NSNumber*)unarchiveUploadSize; + +- (void)archiveUploadInterval:(NSNumber *)uploadInterval; +- (NSNumber*)unarchiveUploadInterval; + + +- (void)archiveSuperProperties:(nullable NSDictionary *)superProperties; +- (NSDictionary*)unarchiveSuperProperties; + +- (void)archiveTrackPause:(BOOL)trackPause; +- (BOOL)unarchiveTrackPause; + +- (void)archiveOptOut:(BOOL)optOut; +- (BOOL)unarchiveOptOut; + +- (void)archiveIsEnabled:(BOOL)isEnabled; +- (BOOL)unarchiveEnabled; + +- (void)archiveDeviceId:(NSString *)deviceId; +- (NSString *)unarchiveDeviceId; + +- (void)archiveInstallTimes:(NSString *)installTimes; +- (NSString *)unarchiveInstallTimes; + +- (BOOL)archiveObject:(id)object withFilePath:(NSString *)filePath; + +- (BOOL)addSkipBackupAttributeToItemAtPath:(NSString *)filePathString; +// Compatible with old versions +- (NSString*)unarchiveOldLoginId; +// Compatible with old versions +- (void)deleteOldLoginId; + +@end; + +NS_ASSUME_NONNULL_END diff --git a/Assets/HCMiniSdk/Third/ta/Plugins/iOS/ThinkingSDK/Source/Store/TDFile.h.meta b/Assets/HCMiniSdk/Third/ta/Plugins/iOS/ThinkingSDK/Source/Store/TDFile.h.meta new file mode 100644 index 00000000..73e984b1 --- /dev/null +++ b/Assets/HCMiniSdk/Third/ta/Plugins/iOS/ThinkingSDK/Source/Store/TDFile.h.meta @@ -0,0 +1,33 @@ +fileFormatVersion: 2 +guid: edc5e228d7fc2439a826a347e3f63e4f +PluginImporter: + externalObjects: {} + serializedVersion: 2 + iconMap: {} + executionOrder: {} + defineConstraints: [] + isPreloaded: 0 + isOverridable: 0 + isExplicitlyReferenced: 0 + validateReferences: 1 + platformData: + - first: + Any: + second: + enabled: 0 + settings: {} + - first: + Editor: Editor + second: + enabled: 0 + settings: + DefaultValueInitialized: true + - first: + iPhone: iOS + second: + enabled: 1 + settings: + AddToEmbeddedBinaries: false + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/HCMiniSdk/Third/ta/Plugins/iOS/ThinkingSDK/Source/Store/TDFile.m b/Assets/HCMiniSdk/Third/ta/Plugins/iOS/ThinkingSDK/Source/Store/TDFile.m new file mode 100755 index 00000000..ab6aa511 --- /dev/null +++ b/Assets/HCMiniSdk/Third/ta/Plugins/iOS/ThinkingSDK/Source/Store/TDFile.m @@ -0,0 +1,283 @@ +// +// TDFile.m +// ThinkingSDK +// +// Created by LiHuanan on 2020/9/8. +// Copyright © 2020 thinkingdata. All rights reserved. +// + +#import "TDFile.h" +#import "TDLogging.h" +#import "TDJSONUtil.h" + +@implementation TDFile + +- (instancetype)initWithAppid:(NSString*)appid +{ + self = [super init]; + if(self) + { + self.appid = appid; + } + return self; +} + +- (void)archiveSessionID:(long long)sessionid { + NSString *filePath = [self sessionIdFilePath]; + if (![self archiveObject:@(sessionid) withFilePath:filePath]) { + TDLogError(@"%@ unable to archive identifyId", self); + } +} +- (long long)unarchiveSessionID { + return [[self unarchiveFromFile:[self sessionIdFilePath] asClass:[NSNumber class]] longLongValue]; +} + + +- (void)archiveIdentifyId:(NSString *)identifyId { + + NSString *filePath = [self identifyIdFilePath]; + if (![self archiveObject:[identifyId copy] withFilePath:filePath]) { + TDLogError(@"%@ unable to archive identifyId", self); + } +} + +- (NSString*)unarchiveIdentifyID { + return [self unarchiveFromFile:[self identifyIdFilePath] asClass:[NSString class]]; +} + +- (NSString*)unarchiveAccountID { + return [self unarchiveFromFile:[self accountIDFilePath] asClass:[NSString class]]; +} + +- (void)archiveUploadSize:(NSNumber *)uploadSize { + NSString *filePath = [self uploadSizeFilePath]; + if (![self archiveObject:uploadSize withFilePath:filePath]) { + TDLogError(@"%@ unable to archive uploadSize", self); + } +} +- (NSNumber*)unarchiveUploadSize { + NSNumber* uploadSize = [self unarchiveFromFile:[self uploadSizeFilePath] asClass:[NSNumber class]]; + if (!uploadSize) { + uploadSize = [NSNumber numberWithInteger:30]; + } + return uploadSize; +} + +- (void)archiveUploadInterval:(NSNumber *)uploadInterval { + NSString *filePath = [self uploadIntervalFilePath]; + if (![self archiveObject:uploadInterval withFilePath:filePath]) { + TDLogError(@"%@ unable to archive uploadInterval", self); + } +} + +- (NSNumber*)unarchiveUploadInterval { + NSNumber* uploadInterval = [self unarchiveFromFile:[self uploadIntervalFilePath] asClass:[NSNumber class]]; + if (!uploadInterval) { + uploadInterval = [NSNumber numberWithInteger:30]; + } + return uploadInterval; +} + +- (void)archiveAccountID:(NSString *)accountID { + NSString *filePath = [self accountIDFilePath]; + if (![self archiveObject:[accountID copy] withFilePath:filePath]) { + TDLogError(@"%@ unable to archive accountID", self); + } +} + +- (void)archiveSuperProperties:(NSDictionary *)superProperties { + NSString *filePath = [self superPropertiesFilePath]; + if (![self archiveObject:[superProperties copy] withFilePath:filePath]) { + TDLogError(@"%@ unable to archive superProperties", self); + } +} + +- (NSDictionary*)unarchiveSuperProperties { + return [self unarchiveFromFile:[self superPropertiesFilePath] asClass:[NSDictionary class]]; +} + +- (void)archiveTrackPause:(BOOL)trackPause { + NSString *filePath = [self trackPauseFilePath]; + if (![self archiveObject:[NSNumber numberWithBool:trackPause] withFilePath:filePath]) { + TDLogError(@"%@ unable to archive trackPause", self); + } +} + +- (BOOL)unarchiveTrackPause { + NSNumber *trackPause = (NSNumber *)[self unarchiveFromFile:[self trackPauseFilePath] asClass:[NSNumber class]]; + return [trackPause boolValue]; +} + +- (void)archiveOptOut:(BOOL)optOut { + NSString *filePath = [self optOutFilePath]; + if (![self archiveObject:[NSNumber numberWithBool:optOut] withFilePath:filePath]) { + TDLogError(@"%@ unable to archive isOptOut", self); + } +} + +- (BOOL)unarchiveOptOut { + NSNumber *optOut = (NSNumber *)[self unarchiveFromFile:[self optOutFilePath] asClass:[NSNumber class]]; + return [optOut boolValue]; +} + +- (void)archiveIsEnabled:(BOOL)isEnabled { + NSString *filePath = [self enabledFilePath]; + if (![self archiveObject:[NSNumber numberWithBool:isEnabled] withFilePath:filePath]) { + TDLogError(@"%@ unable to archive isEnabled", self); + } +} + +- (BOOL)unarchiveEnabled { + NSNumber *enabled = (NSNumber *)[self unarchiveFromFile:[self enabledFilePath] asClass:[NSNumber class]]; + if (enabled == nil) { + return YES; + } else { + return [enabled boolValue]; + } +} + +- (void)archiveDeviceId:(NSString *)deviceId { + NSString *filePath = [self deviceIdFilePath]; + if (![self archiveObject:[deviceId copy] withFilePath:filePath]) { + TDLogError(@"%@ unable to archive deviceId", self); + } +} + +- (NSString *)unarchiveDeviceId { + return [self unarchiveFromFile:[self deviceIdFilePath] asClass:[NSString class]]; +} + +- (void)archiveInstallTimes:(NSString *)installTimes { + NSString *filePath = [self installTimesFilePath]; + if (![self archiveObject:[installTimes copy] withFilePath:filePath]) { + TDLogError(@"%@ unable to archive installTimes", self); + } +} + +- (NSString *)unarchiveInstallTimes { + return [self unarchiveFromFile:[self installTimesFilePath] asClass:[NSString class]]; +} + +- (BOOL)archiveObject:(id)object withFilePath:(NSString *)filePath { + @try { + if (![NSKeyedArchiver archiveRootObject:object toFile:filePath]) { + return NO; + } + } @catch (NSException *exception) { + TDLogError(@"Got exception: %@, reason: %@. You can only send to Thinking values that inherit from NSObject and implement NSCoding.", exception.name, exception.reason); + return NO; + } + + [self addSkipBackupAttributeToItemAtPath:filePath]; + return YES; +} + +- (BOOL)addSkipBackupAttributeToItemAtPath:(NSString *)filePathString { + NSURL *URL = [NSURL fileURLWithPath:filePathString]; + assert([[NSFileManager defaultManager] fileExistsAtPath:[URL path]]); + + NSError *error = nil; + BOOL success = [URL setResourceValue:[NSNumber numberWithBool:YES] + forKey:NSURLIsExcludedFromBackupKey error:&error]; + if (!success) { + TDLogError(@"Error excluding %@ from backup %@", [URL lastPathComponent], error); + } + return success; +} + +- (id)unarchiveFromFile:(NSString *)filePath asClass:(Class)class { + id unarchivedData = nil; + @try { + unarchivedData = [NSKeyedUnarchiver unarchiveObjectWithFile:filePath]; + if (![unarchivedData isKindOfClass:class]) { + unarchivedData = nil; + } + } + @catch (NSException *exception) { + TDLogError(@"Error unarchive in %@", filePath); + unarchivedData = nil; + NSError *error = NULL; + BOOL removed = [[NSFileManager defaultManager] removeItemAtPath:filePath error:&error]; + if (!removed) { + TDLogDebug(@"Error remove file in %@, error: %@", filePath, error); + } + } + return unarchivedData; +} + +- (NSString *)superPropertiesFilePath { + return [self persistenceFilePath:@"superProperties"]; +} + +- (NSString *)accountIDFilePath { + return [self persistenceFilePath:@"accountID"]; +} + +- (NSString *)uploadSizeFilePath { + return [self persistenceFilePath:@"uploadSize"]; +} + +- (NSString *)uploadIntervalFilePath { + return [self persistenceFilePath:@"uploadInterval"]; +} + +- (NSString *)identifyIdFilePath { + return [self persistenceFilePath:@"identifyId"]; +} + +- (NSString *)sessionIdFilePath { + return [self persistenceFilePath:@"sessionId"]; +} + +- (NSString *)enabledFilePath { + return [self persistenceFilePath:@"isEnabled"]; +} + +- (NSString *)trackPauseFilePath { + return [self persistenceFilePath:@"trackPause"]; +} + +- (NSString *)optOutFilePath { + return [self persistenceFilePath:@"optOut"]; +} + +- (NSString *)deviceIdFilePath { + return [self persistenceFilePath:@"deviceId"]; +} + +- (NSString *)installTimesFilePath { + return [self persistenceFilePath:@"installTimes"]; +} + +- (NSString *)persistenceFilePath:(NSString *)data{ + NSString *filename = [NSString stringWithFormat:@"thinking-%@-%@.plist", self.appid, data]; + return [[NSSearchPathForDirectoriesInDomains(NSLibraryDirectory, NSUserDomainMask, YES) lastObject] + stringByAppendingPathComponent:filename]; +} + +- (NSString*)unarchiveOldLoginId { + return [[NSUserDefaults standardUserDefaults] objectForKey:@"thinkingdata_accountId"]; +} + +- (void)deleteOldLoginId { + [[NSUserDefaults standardUserDefaults] removeObjectForKey:@"thinkingdata_accountId"]; + [[NSUserDefaults standardUserDefaults] synchronize]; +} + +- (NSString *)description { + NSMutableDictionary *dic = [NSMutableDictionary dictionary]; + [dic setObject:self.appid forKey:@"appid"]; + [dic setObject:[self unarchiveIdentifyID]?:@"" forKey:@"distincid"]; + [dic setObject:[self unarchiveAccountID]?:@"" forKey:@"accountID"]; + [dic setObject:[self unarchiveUploadSize] forKey:@"uploadSize"]; + [dic setObject:[self unarchiveUploadInterval] forKey:@"uploadInterval"]; + [dic setObject:[self unarchiveSuperProperties]?:@{} forKey:@"superProperties"]; + [dic setObject:[NSNumber numberWithBool:[self unarchiveOptOut] ]forKey:@"optOut"]; + [dic setObject:[NSNumber numberWithBool:[self unarchiveEnabled]] forKey:@"isEnabled"]; + [dic setObject:[NSNumber numberWithBool:[self unarchiveTrackPause]] forKey:@"isTrackPause"]; + [dic setObject:[self unarchiveDeviceId]?:@"" forKey:@"deviceId"]; + [dic setObject:[self unarchiveInstallTimes]?:@"" forKey:@"installTimes"]; + return [TDJSONUtil JSONStringForObject:dic]; +} + +@end diff --git a/Assets/HCMiniSdk/Third/ta/Plugins/iOS/ThinkingSDK/Source/Store/TDFile.m.meta b/Assets/HCMiniSdk/Third/ta/Plugins/iOS/ThinkingSDK/Source/Store/TDFile.m.meta new file mode 100644 index 00000000..e2d777d9 --- /dev/null +++ b/Assets/HCMiniSdk/Third/ta/Plugins/iOS/ThinkingSDK/Source/Store/TDFile.m.meta @@ -0,0 +1,33 @@ +fileFormatVersion: 2 +guid: 4b3d46619dada4e3fbbf81943c05f348 +PluginImporter: + externalObjects: {} + serializedVersion: 2 + iconMap: {} + executionOrder: {} + defineConstraints: [] + isPreloaded: 0 + isOverridable: 0 + isExplicitlyReferenced: 0 + validateReferences: 1 + platformData: + - first: + Any: + second: + enabled: 0 + settings: {} + - first: + Editor: Editor + second: + enabled: 0 + settings: + DefaultValueInitialized: true + - first: + iPhone: iOS + second: + enabled: 1 + settings: + AddToEmbeddedBinaries: false + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/HCMiniSdk/Third/ta/Plugins/iOS/ThinkingSDK/Source/Store/TDKeychainHelper.h b/Assets/HCMiniSdk/Third/ta/Plugins/iOS/ThinkingSDK/Source/Store/TDKeychainHelper.h new file mode 100755 index 00000000..99b4daa1 --- /dev/null +++ b/Assets/HCMiniSdk/Third/ta/Plugins/iOS/ThinkingSDK/Source/Store/TDKeychainHelper.h @@ -0,0 +1,14 @@ +#import + +@interface TDKeychainHelper : NSObject + +- (void)saveDeviceId:(NSString *)string; +- (void)saveInstallTimes:(NSString *)string; +- (void)readOldKeychain; + +- (NSString *)readDeviceId; +- (NSString *)readInstallTimes; +- (NSString *)getInstallTimesOld; +- (NSString *)getDeviceIdOld; + +@end diff --git a/Assets/HCMiniSdk/Third/ta/Plugins/iOS/ThinkingSDK/Source/Store/TDKeychainHelper.h.meta b/Assets/HCMiniSdk/Third/ta/Plugins/iOS/ThinkingSDK/Source/Store/TDKeychainHelper.h.meta new file mode 100644 index 00000000..3ab157f7 --- /dev/null +++ b/Assets/HCMiniSdk/Third/ta/Plugins/iOS/ThinkingSDK/Source/Store/TDKeychainHelper.h.meta @@ -0,0 +1,33 @@ +fileFormatVersion: 2 +guid: 73497cc4e0a42458da46d1a0ad6013f1 +PluginImporter: + externalObjects: {} + serializedVersion: 2 + iconMap: {} + executionOrder: {} + defineConstraints: [] + isPreloaded: 0 + isOverridable: 0 + isExplicitlyReferenced: 0 + validateReferences: 1 + platformData: + - first: + Any: + second: + enabled: 0 + settings: {} + - first: + Editor: Editor + second: + enabled: 0 + settings: + DefaultValueInitialized: true + - first: + iPhone: iOS + second: + enabled: 1 + settings: + AddToEmbeddedBinaries: false + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/HCMiniSdk/Third/ta/Plugins/iOS/ThinkingSDK/Source/Store/TDKeychainHelper.m b/Assets/HCMiniSdk/Third/ta/Plugins/iOS/ThinkingSDK/Source/Store/TDKeychainHelper.m new file mode 100755 index 00000000..17a4a344 --- /dev/null +++ b/Assets/HCMiniSdk/Third/ta/Plugins/iOS/ThinkingSDK/Source/Store/TDKeychainHelper.m @@ -0,0 +1,121 @@ +#import "TDKeychainHelper.h" +#import "TDLogging.h" + +static NSString * const TDKeychainService = @"com.thinkingddata.analytics.service"; +static NSString * const TDInstallTimes = @"com.thinkingddata.analytics.installtimes"; +static NSString * const TDDeviceID = @"com.thinkingddata.analytics.deviceid"; + +@interface TDKeychainHelper () + +@property (atomic, strong) NSDictionary *oldKeychain; + +@end + +@implementation TDKeychainHelper + +- (void)saveItem:(NSString *)string forKey:(NSString *)key { + NSData *encodeData = [string dataUsingEncoding:NSUTF8StringEncoding]; + NSString *originPassword = [self dataForKey:key]; + if (originPassword.length > 0) { + NSMutableDictionary *updateAttributes = [NSMutableDictionary dictionary]; + updateAttributes[(__bridge id)kSecValueData] = encodeData; + NSMutableDictionary *query = [self keychainQueryWithAccount:key]; + OSStatus statusCode = SecItemUpdate((__bridge CFDictionaryRef)query,(__bridge CFDictionaryRef)updateAttributes); + if (statusCode != noErr) { + TDLogError(@"Keychain Update Error" ); + } + } else { + NSMutableDictionary *attributes = [self keychainQueryWithAccount:key]; + attributes[(__bridge id)kSecValueData] = encodeData; + OSStatus statusCode = SecItemAdd((__bridge CFDictionaryRef)attributes, nil); + if (statusCode != noErr) { + TDLogError(@"Keychain Add Error"); + } + } +} + +- (void)saveInstallTimes:(NSString *)string { + [self saveItem:string forKey:TDInstallTimes]; +} + +- (void)saveDeviceId:(NSString *)string { + [self saveItem:string forKey:TDDeviceID]; +} + +- (NSString *)dataForKey:(NSString *)key { + NSMutableDictionary *attributes = [self keychainQueryWithAccount:key]; + attributes[(__bridge id)kSecMatchLimit] = (__bridge id)(kSecMatchLimitOne); + attributes[(__bridge id)kSecReturnData] = (__bridge id)(kCFBooleanTrue); + CFTypeRef data = nil; + OSStatus status = SecItemCopyMatching((__bridge CFDictionaryRef)attributes,(CFTypeRef *)&data); + if (status != errSecSuccess) { + return nil; + } + NSData *encodeData = [NSData dataWithData:(__bridge NSData *)data]; + if (data) { + CFRelease(data); + } + if (encodeData) { + return [[NSString alloc] initWithData:encodeData encoding:NSUTF8StringEncoding]; + } + + return nil; +} + +- (void)readOldKeychain { + NSMutableDictionary *genericPasswordQuery = [[NSMutableDictionary alloc] init]; + [genericPasswordQuery setObject:(__bridge id)kSecClassGenericPassword forKey:(__bridge id)kSecClass]; + [genericPasswordQuery setObject:@"ThinkingdataService" forKey:(__bridge id)kSecAttrGeneric]; + [genericPasswordQuery setObject:(__bridge id)kSecMatchLimitOne forKey:(__bridge id)kSecMatchLimit]; + [genericPasswordQuery setObject:(id)kCFBooleanTrue forKey:(__bridge id)kSecReturnAttributes]; + NSDictionary *tempQuery = [NSDictionary dictionaryWithDictionary:genericPasswordQuery]; + CFTypeRef cfDictionary = NULL; + if (SecItemCopyMatching((__bridge CFDictionaryRef)tempQuery, &cfDictionary) == noErr) { + NSMutableDictionary *returnDict = [NSMutableDictionary dictionaryWithDictionary:(__bridge_transfer NSDictionary *)cfDictionary]; + [returnDict setObject:(id)kCFBooleanTrue forKey:(__bridge id)kSecReturnData]; + [returnDict setObject:(__bridge id)kSecClassGenericPassword forKey:(__bridge id)kSecClass]; + + OSStatus keychainErr = noErr; + CFTypeRef cfXmlData = NULL; + keychainErr = SecItemCopyMatching((__bridge CFDictionaryRef)returnDict, &cfXmlData); + + if (keychainErr == noErr) { + NSData *xmlData = (__bridge_transfer NSData *)cfXmlData; + NSPropertyListFormat fmt; + NSDictionary *resultsInfo = [NSPropertyListSerialization propertyListWithData:xmlData options:NSPropertyListMutableContainersAndLeaves format:&fmt error:nil]; + self.oldKeychain = resultsInfo; + } + } +} + +- (NSString *)getInstallTimesOld { + if (self.oldKeychain) + return [NSString stringWithFormat:@"%@",[self.oldKeychain objectForKey:@"thinking_setup_index"]]; + return nil; +} + +- (NSString *)getDeviceIdOld { + if (self.oldKeychain) + return [self.oldKeychain objectForKey:@"thinking_device_id"]; + return nil; +} + +- (NSString *)readDeviceId { + NSString *data = [self dataForKey:TDDeviceID]; + return data; +} + +- (NSString *)readInstallTimes { + NSString *data = [self dataForKey:TDInstallTimes]; + return data; +} + +- (NSMutableDictionary *)keychainQueryWithAccount:(NSString *)account { + NSMutableDictionary *query = [NSMutableDictionary dictionary]; + query[(__bridge id)kSecClass] = (__bridge id)kSecClassGenericPassword; + query[(__bridge id)kSecAttrService] = TDKeychainService; + query[(__bridge id)kSecAttrAccount] = account; + return query; +} + +@end diff --git a/Assets/HCMiniSdk/Third/ta/Plugins/iOS/ThinkingSDK/Source/Store/TDKeychainHelper.m.meta b/Assets/HCMiniSdk/Third/ta/Plugins/iOS/ThinkingSDK/Source/Store/TDKeychainHelper.m.meta new file mode 100644 index 00000000..82ad8f4a --- /dev/null +++ b/Assets/HCMiniSdk/Third/ta/Plugins/iOS/ThinkingSDK/Source/Store/TDKeychainHelper.m.meta @@ -0,0 +1,33 @@ +fileFormatVersion: 2 +guid: b93c3eb20b626476baf8b47dbec8bf2e +PluginImporter: + externalObjects: {} + serializedVersion: 2 + iconMap: {} + executionOrder: {} + defineConstraints: [] + isPreloaded: 0 + isOverridable: 0 + isExplicitlyReferenced: 0 + validateReferences: 1 + platformData: + - first: + Any: + second: + enabled: 0 + settings: {} + - first: + Editor: Editor + second: + enabled: 0 + settings: + DefaultValueInitialized: true + - first: + iPhone: iOS + second: + enabled: 1 + settings: + AddToEmbeddedBinaries: false + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/HCMiniSdk/Third/ta/Plugins/iOS/ThinkingSDK/Source/Store/TDSqliteDataQueue.h b/Assets/HCMiniSdk/Third/ta/Plugins/iOS/ThinkingSDK/Source/Store/TDSqliteDataQueue.h new file mode 100755 index 00000000..7b86803b --- /dev/null +++ b/Assets/HCMiniSdk/Third/ta/Plugins/iOS/ThinkingSDK/Source/Store/TDSqliteDataQueue.h @@ -0,0 +1,19 @@ +#import + +@class TDEventRecord; + +@interface TDSqliteDataQueue : NSObject + ++ (TDSqliteDataQueue *)sharedInstanceWithAppid:(NSString *)appid; +- (NSInteger)addObject:(id)obj withAppid:(NSString *)appid; +- (NSArray *)getFirstRecords:(NSUInteger)recordSize withAppid:(NSString *)appid; +- (BOOL)removeFirstRecords:(NSUInteger)recordSize withAppid:(NSString *)appid; +- (void)deleteAll:(NSString *)appid; +- (NSInteger)sqliteCountForAppid:(NSString *)appid; +- (void)addColumnText:(NSString *)columnText; + +- (NSArray *)upadteRecordIds:(NSArray *)recordIds; +- (BOOL)removeDataWithuids:(NSArray *)recordIDs; + +@end + diff --git a/Assets/HCMiniSdk/Third/ta/Plugins/iOS/ThinkingSDK/Source/Store/TDSqliteDataQueue.h.meta b/Assets/HCMiniSdk/Third/ta/Plugins/iOS/ThinkingSDK/Source/Store/TDSqliteDataQueue.h.meta new file mode 100644 index 00000000..9a1788a6 --- /dev/null +++ b/Assets/HCMiniSdk/Third/ta/Plugins/iOS/ThinkingSDK/Source/Store/TDSqliteDataQueue.h.meta @@ -0,0 +1,33 @@ +fileFormatVersion: 2 +guid: e7000d0d7ca0c4b6185f8ea0d2719dc2 +PluginImporter: + externalObjects: {} + serializedVersion: 2 + iconMap: {} + executionOrder: {} + defineConstraints: [] + isPreloaded: 0 + isOverridable: 0 + isExplicitlyReferenced: 0 + validateReferences: 1 + platformData: + - first: + Any: + second: + enabled: 0 + settings: {} + - first: + Editor: Editor + second: + enabled: 0 + settings: + DefaultValueInitialized: true + - first: + iPhone: iOS + second: + enabled: 1 + settings: + AddToEmbeddedBinaries: false + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/HCMiniSdk/Third/ta/Plugins/iOS/ThinkingSDK/Source/Store/TDSqliteDataQueue.m b/Assets/HCMiniSdk/Third/ta/Plugins/iOS/ThinkingSDK/Source/Store/TDSqliteDataQueue.m new file mode 100755 index 00000000..8ff907a3 --- /dev/null +++ b/Assets/HCMiniSdk/Third/ta/Plugins/iOS/ThinkingSDK/Source/Store/TDSqliteDataQueue.m @@ -0,0 +1,347 @@ +#import "TDSqliteDataQueue.h" +#import + +#import "TDLogging.h" +#import "TDJSONUtil.h" +#import "TDConfig.h" +#import "TDEventRecord.h" + +@implementation TDSqliteDataQueue { + sqlite3 *_database; + NSInteger _allmessageCount; +} + +- (void) closeDatabase { + sqlite3_close(_database); + sqlite3_shutdown(); +} + +- (void) dealloc { + [self closeDatabase]; +} + ++ (TDSqliteDataQueue *)sharedInstanceWithAppid:(NSString *)appid { + static TDSqliteDataQueue *sharedInstance = nil; + static dispatch_once_t onceToken; + dispatch_once(&onceToken, ^{ + NSString *filepath = [[NSSearchPathForDirectoriesInDomains(NSLibraryDirectory, NSUserDomainMask, YES) lastObject] stringByAppendingPathComponent:@"TDData-data.plist"]; + sharedInstance = [[self alloc] initWithPath:filepath withAppid:appid]; + TDLogDebug(@"sqlite path:%@", filepath); + }); + return sharedInstance; +} + +- (id)initWithPath:(NSString *)filePath withAppid:(NSString *)appid { + self = [super init]; + if (sqlite3_initialize() != SQLITE_OK) { + return nil; + } + if (sqlite3_open_v2([filePath UTF8String], &_database, SQLITE_OPEN_READWRITE | SQLITE_OPEN_CREATE, NULL) == SQLITE_OK ) { + NSString *_sql = @"create table if not exists TDData (id INTEGER PRIMARY KEY AUTOINCREMENT, content TEXT, appid TEXT, creatAt INTEGER)"; + char *errorMsg; + if (sqlite3_exec(_database, [_sql UTF8String], NULL, NULL, &errorMsg)==SQLITE_OK) { + } else { + return nil; + } + + _allmessageCount = [self sqliteCount]; + + if (![self isExistColumnInTable:@"appid"] || ![self isExistColumnInTable:@"creatAt"]) { + [self addColumn:appid]; + } else if (_allmessageCount > 0) { + [self delExpiredData]; + } + + if (![self isExistColumnInTable:@"uuid"]) { + [self addColumnText:@"uuid"]; + } + + } else { + return nil; + } + return self; +} + +- (void)addColumn:(NSString *)appid { + int epochInterval = [[NSDate date] timeIntervalSince1970]; + NSString *query; + if (appid.length > 0 && [appid isKindOfClass: [NSString class]]) + query = [NSString stringWithFormat:@"alter table TDData add 'appid' TEXT default \"%@\"", appid]; + else + query = [NSString stringWithFormat:@"alter table TDData add 'appid' TEXT"]; + NSString *query2 = [NSString stringWithFormat:@"alter table TDData add 'creatAt' INTEGER default %d ", epochInterval]; + char *errMsg; + @try { + sqlite3_exec(_database, [query UTF8String], NULL, NULL, &errMsg); + sqlite3_exec(_database, [query2 UTF8String], NULL, NULL, &errMsg); + } @catch (NSException *exception) { + TDLogError(@"addColumn: %@", exception); + } +} + +- (void)addColumnText:(NSString *)columnText { + NSString *query = [NSString stringWithFormat:@"alter table TDData add '%@' TEXT", columnText];; + char *errMsg; + @try { + sqlite3_exec(_database, [query UTF8String], NULL, NULL, &errMsg); + } @catch (NSException *exception) { + TDLogError(@"addColumn: %@", exception); + } +} + +- (BOOL)isExistColumnInTable:(NSString *)column { + sqlite3_stmt *statement = nil; + NSString *sql = [NSString stringWithFormat:@"PRAGMA table_info(TDData)"]; + if (sqlite3_prepare_v2(_database, [sql UTF8String], -1, &statement, NULL) != SQLITE_OK ) { + sqlite3_finalize(statement); + return NO; + } + while (sqlite3_step(statement) == SQLITE_ROW) { + NSString *columntem = [[NSString alloc] initWithCString:(char *)sqlite3_column_text(statement, 1) encoding:NSUTF8StringEncoding]; + + if ([column isEqualToString:columntem]) { + sqlite3_finalize(statement); + return YES; + } + } + sqlite3_finalize(statement); + return NO; +} + +- (void)delExpiredData { + NSTimeInterval oneDay = 24*60*60*1; + NSDate *date = [[NSDate alloc] initWithTimeIntervalSinceNow: -oneDay * [TDConfig expirationDays]]; + int expirationDate = [date timeIntervalSince1970]; + [self removeOldRecords:expirationDate]; +} + +- (NSInteger)addObject:(id)obj withAppid:(NSString *)appid { + NSUInteger maxCacheSize = [TDConfig maxNumEvents]; + if (_allmessageCount >= maxCacheSize) { + [self removeFirstRecords:100 withAppid:nil]; + } + + NSString *jsonStr = [TDJSONUtil JSONStringForObject:obj]; + if (!jsonStr) { + return [self sqliteCountForAppid:appid]; + } + NSTimeInterval epochInterval = [[NSDate date] timeIntervalSince1970]; + NSString *query = @"INSERT INTO TDData(content, appid, creatAt) values(?, ?, ?)"; + sqlite3_stmt *insertStatement; + int rc; + rc = sqlite3_prepare_v2(_database, [query UTF8String],-1, &insertStatement, nil); + if (rc == SQLITE_OK) { + sqlite3_bind_text(insertStatement, 1, [jsonStr UTF8String], -1, SQLITE_TRANSIENT); + sqlite3_bind_text(insertStatement, 2, [appid UTF8String], -1, SQLITE_TRANSIENT); + sqlite3_bind_int(insertStatement, 3, epochInterval); + + rc = sqlite3_step(insertStatement); + if (rc == SQLITE_DONE) { + _allmessageCount ++; + } + } + + sqlite3_finalize(insertStatement); + return [self sqliteCountForAppid:appid]; +} + +- (NSArray *)getFirstRecords:(NSUInteger)recordSize withAppid:(NSString *)appid { + if (_allmessageCount == 0) { + return @[]; + } + + NSMutableArray *records = [[NSMutableArray alloc] init]; + NSString *query = @"SELECT id,content FROM TDData where appid=? ORDER BY id ASC LIMIT ?"; + sqlite3_stmt *stmt = NULL; + int rc = sqlite3_prepare_v2(_database, [query UTF8String], -1, &stmt, NULL); + if (rc == SQLITE_OK) { + sqlite3_bind_text(stmt, 1, [appid UTF8String], -1, SQLITE_TRANSIENT); + sqlite3_bind_int(stmt, 2, (int)recordSize); + while (sqlite3_step(stmt) == SQLITE_ROW) { + sqlite3_int64 index = sqlite3_column_int64(stmt, 0); + char *jsonChar = (char *)sqlite3_column_text(stmt, 1); + if (!jsonChar) { + continue; + } + + NSData *jsonData = [[NSString stringWithUTF8String:jsonChar] dataUsingEncoding:NSUTF8StringEncoding]; + NSError *err; + if (jsonData) { + NSDictionary *eventDict = [NSJSONSerialization JSONObjectWithData:jsonData + options:NSJSONReadingMutableContainers + error:&err]; + if (!err && [eventDict isKindOfClass:[NSDictionary class]]) { + [records addObject:[[TDEventRecord alloc] initWithIndex:[NSNumber numberWithLongLong:index] content:eventDict]]; + } + } + + } + } + sqlite3_finalize(stmt); + return records; +} + +- (BOOL)removeDataWithuids:(NSArray *)uids { + + if (uids.count == 0) { + return NO; + } + + NSString *query = [NSString stringWithFormat:@"DELETE FROM TDData WHERE uuid IN (%@);", [uids componentsJoinedByString:@","]]; + sqlite3_stmt *stmt; + + if (sqlite3_prepare_v2(_database, query.UTF8String, -1, &stmt, NULL) != SQLITE_OK) { + TDLogError(@"Delete records Error: %s", sqlite3_errmsg(_database)); + return NO; + } + BOOL success = YES; + if (sqlite3_step(stmt) != SQLITE_DONE) { + TDLogError(@"Delete records Error: %s", sqlite3_errmsg(_database)); + success = NO; + } + sqlite3_finalize(stmt); + _allmessageCount = [self sqliteCount]; + return YES; +} + +- (BOOL)removeFirstRecords:(NSUInteger)recordSize withAppid:(NSString *)appid { + NSString *query; + + if (appid.length == 0) { + query = @"DELETE FROM TDData WHERE id IN (SELECT id FROM TDData ORDER BY id ASC LIMIT ?)"; + } else { + query = @"DELETE FROM TDData WHERE id IN (SELECT id FROM TDData where appid=? ORDER BY id ASC LIMIT ?)"; + } + + sqlite3_stmt *stmt = NULL; + int rc = sqlite3_prepare_v2(_database, [query UTF8String], -1, &stmt, NULL); + + if (rc == SQLITE_OK) { + if (appid.length == 0) { + sqlite3_bind_int(stmt, 1, (int)recordSize); + } else { + sqlite3_bind_text(stmt, 1, [appid UTF8String], -1, SQLITE_TRANSIENT); + sqlite3_bind_int(stmt, 2, (int)recordSize); + } + rc = sqlite3_step(stmt); + if (rc != SQLITE_DONE && rc != SQLITE_OK) { + sqlite3_finalize(stmt); + return NO; + } + } else { + sqlite3_finalize(stmt); + return NO; + } + sqlite3_finalize(stmt); + _allmessageCount = [self sqliteCount]; + return YES; +} + +- (NSArray *)upadteRecordIds:(NSArray *)recordIds { + if (recordIds.count == 0) { + return @[]; + } + NSMutableArray *uids = [NSMutableArray arrayWithCapacity:recordIds.count]; + [recordIds enumerateObjectsUsingBlock:^(NSNumber *recordId, NSUInteger idx, BOOL * _Nonnull stop) { + NSString *uuid = [self rand13NumString]; + NSString *query = [NSString stringWithFormat:@"UPDATE TDData SET uuid = '%@' WHERE id = %lld;", uuid, [recordId longLongValue]]; + if ([self execUpdateSQL:query]) { + [uids addObject:uuid]; + } + }]; + return uids; +} + + + +-(NSString *)rand13NumString +{ + int NUMBER_OF_CHARS = 13; + + char data[NUMBER_OF_CHARS]; + + for (int x = 0; x < NUMBER_OF_CHARS; data[x++] = (char)('1' + (arc4random_uniform(9)))); + + NSString *numString = [[NSString alloc] initWithBytes:data length:NUMBER_OF_CHARS encoding:NSUTF8StringEncoding]; + + return numString; +} + + +- (BOOL)execUpdateSQL:(NSString *)sql { + + sqlite3_stmt *stmt; + if (sqlite3_prepare_v2(_database, sql.UTF8String, -1, &stmt, NULL) != SQLITE_OK) { + TDLogError(@"Update Records Error: %s", sqlite3_errmsg(_database)); + sqlite3_finalize(stmt); + return NO; + } + if (sqlite3_step(stmt) != SQLITE_DONE) { + TDLogError(@"Update Records Error: %s", sqlite3_errmsg(_database)); + sqlite3_finalize(stmt); + return NO; + } + sqlite3_finalize(stmt); + return YES; +} + +- (BOOL)removeOldRecords:(int)timestamp { + NSString *query = @"DELETE FROM TDData WHERE creatAt 0) { + sqlite3_bind_text(stmt, 1, [appid UTF8String], -1, SQLITE_TRANSIENT); + } + if (sqlite3_step(stmt) == SQLITE_ROW) { + count = sqlite3_column_int(stmt, 0); + } + } + + sqlite3_finalize(stmt); + return count; +} + +- (void)deleteAll:(NSString *)appid { + if ([appid isKindOfClass:[NSString class]] && appid.length > 0) { + NSString *query = @"DELETE FROM TDData where appid=? "; + + sqlite3_stmt *stmt = NULL; + int rc = sqlite3_prepare_v2(_database, [query UTF8String], -1, &stmt, NULL); + if (rc == SQLITE_OK) { + sqlite3_bind_text(stmt, 1, [appid UTF8String], -1, SQLITE_TRANSIENT); + sqlite3_step(stmt); + } + sqlite3_finalize(stmt); + + _allmessageCount = [self sqliteCount]; + } +} + +@end diff --git a/Assets/HCMiniSdk/Third/ta/Plugins/iOS/ThinkingSDK/Source/Store/TDSqliteDataQueue.m.meta b/Assets/HCMiniSdk/Third/ta/Plugins/iOS/ThinkingSDK/Source/Store/TDSqliteDataQueue.m.meta new file mode 100644 index 00000000..849a4615 --- /dev/null +++ b/Assets/HCMiniSdk/Third/ta/Plugins/iOS/ThinkingSDK/Source/Store/TDSqliteDataQueue.m.meta @@ -0,0 +1,33 @@ +fileFormatVersion: 2 +guid: fcb464e18d497453b9d760cdc73d5a7a +PluginImporter: + externalObjects: {} + serializedVersion: 2 + iconMap: {} + executionOrder: {} + defineConstraints: [] + isPreloaded: 0 + isOverridable: 0 + isExplicitlyReferenced: 0 + validateReferences: 1 + platformData: + - first: + Any: + second: + enabled: 0 + settings: {} + - first: + Editor: Editor + second: + enabled: 0 + settings: + DefaultValueInitialized: true + - first: + iPhone: iOS + second: + enabled: 1 + settings: + AddToEmbeddedBinaries: false + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/HCMiniSdk/Third/ta/Plugins/iOS/ThinkingSDK/Source/TDRuntime.meta b/Assets/HCMiniSdk/Third/ta/Plugins/iOS/ThinkingSDK/Source/TDRuntime.meta new file mode 100644 index 00000000..da6e7ae3 --- /dev/null +++ b/Assets/HCMiniSdk/Third/ta/Plugins/iOS/ThinkingSDK/Source/TDRuntime.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: 23ef5fa3cb4a04bd89ceda45207f37df +folderAsset: yes +DefaultImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/HCMiniSdk/Third/ta/Plugins/iOS/ThinkingSDK/Source/TDRuntime/Swizzle.meta b/Assets/HCMiniSdk/Third/ta/Plugins/iOS/ThinkingSDK/Source/TDRuntime/Swizzle.meta new file mode 100644 index 00000000..b5252129 --- /dev/null +++ b/Assets/HCMiniSdk/Third/ta/Plugins/iOS/ThinkingSDK/Source/TDRuntime/Swizzle.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: 3e629251785524cfbbb3397293417874 +folderAsset: yes +DefaultImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/HCMiniSdk/Third/ta/Plugins/iOS/ThinkingSDK/Source/TDRuntime/Swizzle/NSObject+TDSwizzle.h b/Assets/HCMiniSdk/Third/ta/Plugins/iOS/ThinkingSDK/Source/TDRuntime/Swizzle/NSObject+TDSwizzle.h new file mode 100755 index 00000000..679aeea1 --- /dev/null +++ b/Assets/HCMiniSdk/Third/ta/Plugins/iOS/ThinkingSDK/Source/TDRuntime/Swizzle/NSObject+TDSwizzle.h @@ -0,0 +1,10 @@ +#import + +NS_ASSUME_NONNULL_BEGIN +@interface NSObject (TDSwizzle) + ++ (BOOL)td_swizzleMethod:(SEL)origSel withMethod:(SEL)altSel error:(NSError **)error; ++ (BOOL)td_swizzleClassMethod:(SEL)origSel withClassMethod:(SEL)altSel error:(NSError **)error; + +@end +NS_ASSUME_NONNULL_END diff --git a/Assets/HCMiniSdk/Third/ta/Plugins/iOS/ThinkingSDK/Source/TDRuntime/Swizzle/NSObject+TDSwizzle.h.meta b/Assets/HCMiniSdk/Third/ta/Plugins/iOS/ThinkingSDK/Source/TDRuntime/Swizzle/NSObject+TDSwizzle.h.meta new file mode 100644 index 00000000..80563863 --- /dev/null +++ b/Assets/HCMiniSdk/Third/ta/Plugins/iOS/ThinkingSDK/Source/TDRuntime/Swizzle/NSObject+TDSwizzle.h.meta @@ -0,0 +1,33 @@ +fileFormatVersion: 2 +guid: 72eee1f705cf140559b12462d0d8cc9c +PluginImporter: + externalObjects: {} + serializedVersion: 2 + iconMap: {} + executionOrder: {} + defineConstraints: [] + isPreloaded: 0 + isOverridable: 0 + isExplicitlyReferenced: 0 + validateReferences: 1 + platformData: + - first: + Any: + second: + enabled: 0 + settings: {} + - first: + Editor: Editor + second: + enabled: 0 + settings: + DefaultValueInitialized: true + - first: + iPhone: iOS + second: + enabled: 1 + settings: + AddToEmbeddedBinaries: false + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/HCMiniSdk/Third/ta/Plugins/iOS/ThinkingSDK/Source/TDRuntime/Swizzle/NSObject+TDSwizzle.m b/Assets/HCMiniSdk/Third/ta/Plugins/iOS/ThinkingSDK/Source/TDRuntime/Swizzle/NSObject+TDSwizzle.m new file mode 100755 index 00000000..7f70f72f --- /dev/null +++ b/Assets/HCMiniSdk/Third/ta/Plugins/iOS/ThinkingSDK/Source/TDRuntime/Swizzle/NSObject+TDSwizzle.m @@ -0,0 +1,41 @@ +#import "NSObject+TDSwizzle.h" + +#if TARGET_OS_IPHONE +#import +#import +#else +#import +#endif + +@implementation NSObject (TDSwizzle) + ++ (BOOL)td_swizzleMethod:(SEL)origSel withMethod:(SEL)altSel error:(NSError **)error { + Method origMethod = class_getInstanceMethod(self, origSel); + if (!origMethod) { + return NO; + } + + Method altMethod = class_getInstanceMethod(self, altSel); + if (!altMethod) { + return NO; + } + + class_addMethod(self, + origSel, + class_getMethodImplementation(self, origSel), + method_getTypeEncoding(origMethod)); + class_addMethod(self, + altSel, + class_getMethodImplementation(self, altSel), + method_getTypeEncoding(altMethod)); + + method_exchangeImplementations(class_getInstanceMethod(self, origSel), class_getInstanceMethod(self, altSel)); + + return YES; +} + ++ (BOOL)td_swizzleClassMethod:(SEL)origSel withClassMethod:(SEL)altSel error:(NSError **)error { + return [object_getClass((id)self) td_swizzleMethod:origSel withMethod:altSel error:error]; +} + +@end diff --git a/Assets/HCMiniSdk/Third/ta/Plugins/iOS/ThinkingSDK/Source/TDRuntime/Swizzle/NSObject+TDSwizzle.m.meta b/Assets/HCMiniSdk/Third/ta/Plugins/iOS/ThinkingSDK/Source/TDRuntime/Swizzle/NSObject+TDSwizzle.m.meta new file mode 100644 index 00000000..06853783 --- /dev/null +++ b/Assets/HCMiniSdk/Third/ta/Plugins/iOS/ThinkingSDK/Source/TDRuntime/Swizzle/NSObject+TDSwizzle.m.meta @@ -0,0 +1,33 @@ +fileFormatVersion: 2 +guid: 8c12a2223933c43b39244660c43cae9c +PluginImporter: + externalObjects: {} + serializedVersion: 2 + iconMap: {} + executionOrder: {} + defineConstraints: [] + isPreloaded: 0 + isOverridable: 0 + isExplicitlyReferenced: 0 + validateReferences: 1 + platformData: + - first: + Any: + second: + enabled: 0 + settings: {} + - first: + Editor: Editor + second: + enabled: 0 + settings: + DefaultValueInitialized: true + - first: + iPhone: iOS + second: + enabled: 1 + settings: + AddToEmbeddedBinaries: false + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/HCMiniSdk/Third/ta/Plugins/iOS/ThinkingSDK/Source/TDRuntime/Swizzle/TDSwizzler.h b/Assets/HCMiniSdk/Third/ta/Plugins/iOS/ThinkingSDK/Source/TDRuntime/Swizzle/TDSwizzler.h new file mode 100755 index 00000000..48407ce4 --- /dev/null +++ b/Assets/HCMiniSdk/Third/ta/Plugins/iOS/ThinkingSDK/Source/TDRuntime/Swizzle/TDSwizzler.h @@ -0,0 +1,13 @@ +#import + +#pragma clang diagnostic push +#pragma clang diagnostic ignored "-Wstrict-prototypes" +typedef void (^swizzleBlock)(); +#pragma clang diagnostic pop + +@interface TDSwizzler : NSObject + ++ (void)swizzleSelector:(SEL)aSelector onClass:(Class)aClass withBlock:(swizzleBlock)block named:(NSString *)aName; ++ (void)unswizzleSelector:(SEL)aSelector onClass:(Class)aClass named:(NSString *)aName; + +@end diff --git a/Assets/HCMiniSdk/Third/ta/Plugins/iOS/ThinkingSDK/Source/TDRuntime/Swizzle/TDSwizzler.h.meta b/Assets/HCMiniSdk/Third/ta/Plugins/iOS/ThinkingSDK/Source/TDRuntime/Swizzle/TDSwizzler.h.meta new file mode 100644 index 00000000..f45263b8 --- /dev/null +++ b/Assets/HCMiniSdk/Third/ta/Plugins/iOS/ThinkingSDK/Source/TDRuntime/Swizzle/TDSwizzler.h.meta @@ -0,0 +1,33 @@ +fileFormatVersion: 2 +guid: 33ad60578ee5c4d2c9c842ea9ca3d6bf +PluginImporter: + externalObjects: {} + serializedVersion: 2 + iconMap: {} + executionOrder: {} + defineConstraints: [] + isPreloaded: 0 + isOverridable: 0 + isExplicitlyReferenced: 0 + validateReferences: 1 + platformData: + - first: + Any: + second: + enabled: 0 + settings: {} + - first: + Editor: Editor + second: + enabled: 0 + settings: + DefaultValueInitialized: true + - first: + iPhone: iOS + second: + enabled: 1 + settings: + AddToEmbeddedBinaries: false + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/HCMiniSdk/Third/ta/Plugins/iOS/ThinkingSDK/Source/TDRuntime/Swizzle/TDSwizzler.m b/Assets/HCMiniSdk/Third/ta/Plugins/iOS/ThinkingSDK/Source/TDRuntime/Swizzle/TDSwizzler.m new file mode 100755 index 00000000..78a47691 --- /dev/null +++ b/Assets/HCMiniSdk/Third/ta/Plugins/iOS/ThinkingSDK/Source/TDRuntime/Swizzle/TDSwizzler.m @@ -0,0 +1,241 @@ +#import "TDSwizzler.h" + +#import +#import "TDLogging.h" + +#define MAPTABLE_ID(x) (__bridge id)((void *)x) + +#define MIN_ARGS 2 +#define MAX_ARGS 4 + +@interface TDSwizzle : NSObject + +@property (nonatomic, assign) Class class; +@property (nonatomic, assign) SEL selector; +@property (nonatomic, assign) IMP originalMethod; +@property (nonatomic, assign) uint numArgs; +@property (nonatomic, copy) NSMapTable *blocks; + +- (instancetype)initWithBlock:(swizzleBlock)aBlock + named:(NSString *)aName + forClass:(Class)aClass + selector:(SEL)aSelector + originalMethod:(IMP)aMethod; + +@end + +static NSMapTable *swizzles; + +static void td_swizzledMethod_2(id self, SEL _cmd) { + Method aMethod = class_getInstanceMethod([self class], _cmd); + TDSwizzle *swizzle = (TDSwizzle *)[swizzles objectForKey:MAPTABLE_ID(aMethod)]; + if (swizzle) { + ((void(*)(id, SEL))swizzle.originalMethod)(self, _cmd); + + NSEnumerator *blocks = [swizzle.blocks objectEnumerator]; + swizzleBlock block; + while((block = [blocks nextObject])) { + + block(self, _cmd); + } + } +} + +static void td_swizzledMethod_3(id self, SEL _cmd, id arg) { + Method aMethod = class_getInstanceMethod([self class], _cmd); + TDSwizzle *swizzle = (TDSwizzle *)[swizzles objectForKey:MAPTABLE_ID(aMethod)]; + if (swizzle) { + ((void(*)(id, SEL, id))swizzle.originalMethod)(self, _cmd, arg); + + NSEnumerator *blocks = [swizzle.blocks objectEnumerator]; + swizzleBlock block; + while((block = [blocks nextObject])) { + block(self, _cmd, arg); + } + } +} + +static void td_swizzledMethod_4(id self, SEL _cmd, id arg, id arg2) { + Method aMethod = class_getInstanceMethod([self class], _cmd); + TDSwizzle *swizzle = (TDSwizzle *)[swizzles objectForKey:(__bridge id)((void *)aMethod)]; + if (swizzle) { + ((void(*)(id, SEL, id, id))swizzle.originalMethod)(self, _cmd, arg, arg2); + + NSEnumerator *blocks = [swizzle.blocks objectEnumerator]; + swizzleBlock block; + while((block = [blocks nextObject])) { + block(self, _cmd, arg, arg2); + } + } +} + +#pragma clang diagnostic push +#pragma clang diagnostic ignored "-Wstrict-prototypes" +static void (*td_swizzledMethods[MAX_ARGS - MIN_ARGS + 1])() = {td_swizzledMethod_2, td_swizzledMethod_3, td_swizzledMethod_4}; +#pragma clang diagnostic pop + +@implementation TDSwizzler + ++ (void)load { + swizzles = [NSMapTable mapTableWithKeyOptions:(NSPointerFunctionsOpaqueMemory | NSPointerFunctionsOpaquePersonality) + valueOptions:(NSPointerFunctionsStrongMemory | NSPointerFunctionsObjectPointerPersonality)]; +} + ++ (TDSwizzle *)swizzleForMethod:(Method)aMethod { + return (TDSwizzle *)[swizzles objectForKey:MAPTABLE_ID(aMethod)]; +} + ++ (void)removeSwizzleForMethod:(Method)aMethod { + [swizzles removeObjectForKey:MAPTABLE_ID(aMethod)]; +} + ++ (void)setSwizzle:(TDSwizzle *)swizzle forMethod:(Method)aMethod { + [swizzles setObject:swizzle forKey:MAPTABLE_ID(aMethod)]; +} + ++ (BOOL)isLocallyDefinedMethod:(Method)aMethod onClass:(Class)aClass { + uint count; + BOOL isLocal = NO; + Method *methods = class_copyMethodList(aClass, &count); + for (NSUInteger i = 0; i < count; i++) { + if (aMethod == methods[i]) { + isLocal = YES; + break; + } + } + free(methods); + return isLocal; +} + ++ (void)swizzleSelector:(SEL)aSelector + onClass:(Class)aClass + withBlock:(swizzleBlock)aBlock + named:(NSString *)aName { + Method aMethod = class_getInstanceMethod(aClass, aSelector); + if (!aMethod) { + TDLogInfo(@"SwizzleException:Cannot find method for %@ on %@",NSStringFromSelector(aSelector), NSStringFromClass(aClass)); + return; + } + + uint numArgs = method_getNumberOfArguments(aMethod); + if (numArgs < MIN_ARGS || numArgs > MAX_ARGS) { + TDLogError(@"Cannot swizzle method with %d args", numArgs); + } + + IMP swizzledMethod = (IMP)td_swizzledMethods[numArgs - 2]; + [TDSwizzler swizzleSelector:aSelector onClass:aClass withBlock:aBlock andSwizzleMethod:swizzledMethod named:aName]; +} + ++ (void)swizzleSelector:(SEL)aSelector + onClass:(Class)aClass + withBlock:(swizzleBlock)aBlock + andSwizzleMethod:(IMP)aSwizzleMethod + named:(NSString *)aName { + Method aMethod = class_getInstanceMethod(aClass, aSelector); + if (!aMethod) { + TDLogError(@"Cannot find method for %@ on %@", NSStringFromSelector(aSelector), NSStringFromClass(aClass)); + } + + BOOL isLocal = [self isLocallyDefinedMethod:aMethod onClass:aClass]; + TDSwizzle *swizzle = [self swizzleForMethod:aMethod]; + + if (isLocal) { + if (!swizzle) { + IMP originalMethod = method_getImplementation(aMethod); + + // Replace the local implementation of this method with the swizzled one + method_setImplementation(aMethod, aSwizzleMethod); + + // Create and add the swizzle + @try { + swizzle = [[TDSwizzle alloc] initWithBlock:aBlock named:aName forClass:aClass selector:aSelector originalMethod:originalMethod]; + } @catch (NSException *exception) { + TDLogError(@"%@ error: %@", self, exception); + } + [self setSwizzle:swizzle forMethod:aMethod]; + } else { + [swizzle.blocks setObject:aBlock forKey:aName]; + } + } else { + IMP originalMethod = swizzle ? swizzle.originalMethod : method_getImplementation(aMethod); + + // Add the swizzle as a new local method on the class. + if (!class_addMethod(aClass, aSelector, aSwizzleMethod, method_getTypeEncoding(aMethod))) { + TDLogError(@"Could not add swizzled for %@::%@, even though it didn't already exist locally", NSStringFromClass(aClass), NSStringFromSelector(aSelector)); + } + // Now re-get the Method, it should be the one we just added. + Method newMethod = class_getInstanceMethod(aClass, aSelector); + if (aMethod == newMethod) { + TDLogError(@"Newly added method for %@::%@ was the same as the old method", NSStringFromClass(aClass), NSStringFromSelector(aSelector)); + } + + TDSwizzle *newSwizzle = [[TDSwizzle alloc] initWithBlock:aBlock named:aName forClass:aClass selector:aSelector originalMethod:originalMethod]; + [self setSwizzle:newSwizzle forMethod:newMethod]; + } +} + ++ (void)unswizzleSelector:(SEL)aSelector onClass:(Class)aClass { + Method aMethod = class_getInstanceMethod(aClass, aSelector); + TDSwizzle *swizzle = [self swizzleForMethod:aMethod]; + if (swizzle) { + method_setImplementation(aMethod, swizzle.originalMethod); + [self removeSwizzleForMethod:aMethod]; + } +} + +/* + Remove the named swizzle from the given class/selector. If aName is nil, remove all + swizzles for this class/selector + */ ++ (void)unswizzleSelector:(SEL)aSelector onClass:(Class)aClass named:(NSString *)aName { + Method aMethod = class_getInstanceMethod(aClass, aSelector); + TDSwizzle *swizzle = [self swizzleForMethod:aMethod]; + if (swizzle) { + if (aName) { + [swizzle.blocks removeObjectForKey:aName]; + } + if (!aName || [swizzle.blocks count] == 0) { + method_setImplementation(aMethod, swizzle.originalMethod); + [self removeSwizzleForMethod:aMethod]; + } + } +} + +@end + + +@implementation TDSwizzle + +- (instancetype)init { + if ((self = [super init])) { + self.blocks = [NSMapTable mapTableWithKeyOptions:(NSPointerFunctionsStrongMemory | NSPointerFunctionsObjectPersonality) + valueOptions:(NSPointerFunctionsStrongMemory | NSPointerFunctionsObjectPointerPersonality)]; + } + return self; +} + +- (instancetype)initWithBlock:(swizzleBlock)aBlock + named:(NSString *)aName + forClass:(Class)aClass + selector:(SEL)aSelector + originalMethod:(IMP)aMethod { + if ((self = [self init])) { + self.class = aClass; + self.selector = aSelector; + self.originalMethod = aMethod; + [self.blocks setObject:aBlock forKey:aName]; + } + return self; +} + +- (NSString *)description { + NSString *descriptors = @""; + NSString *key; + NSEnumerator *keys = [self.blocks keyEnumerator]; + while ((key = [keys nextObject])) { + descriptors = [descriptors stringByAppendingFormat:@"\t%@ : %@\n", key, [self.blocks objectForKey:key]]; + } + return [NSString stringWithFormat:@"Swizzle on %@::%@ [\n%@]", NSStringFromClass(self.class), NSStringFromSelector(self.selector), descriptors]; +} + +@end diff --git a/Assets/HCMiniSdk/Third/ta/Plugins/iOS/ThinkingSDK/Source/TDRuntime/Swizzle/TDSwizzler.m.meta b/Assets/HCMiniSdk/Third/ta/Plugins/iOS/ThinkingSDK/Source/TDRuntime/Swizzle/TDSwizzler.m.meta new file mode 100644 index 00000000..19119865 --- /dev/null +++ b/Assets/HCMiniSdk/Third/ta/Plugins/iOS/ThinkingSDK/Source/TDRuntime/Swizzle/TDSwizzler.m.meta @@ -0,0 +1,33 @@ +fileFormatVersion: 2 +guid: e89ff6f66840d4d93bc0daf780c702cd +PluginImporter: + externalObjects: {} + serializedVersion: 2 + iconMap: {} + executionOrder: {} + defineConstraints: [] + isPreloaded: 0 + isOverridable: 0 + isExplicitlyReferenced: 0 + validateReferences: 1 + platformData: + - first: + Any: + second: + enabled: 0 + settings: {} + - first: + Editor: Editor + second: + enabled: 0 + settings: + DefaultValueInitialized: true + - first: + iPhone: iOS + second: + enabled: 1 + settings: + AddToEmbeddedBinaries: false + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/HCMiniSdk/Third/ta/Plugins/iOS/ThinkingSDK/Source/TDRuntime/TDRunTime.h b/Assets/HCMiniSdk/Third/ta/Plugins/iOS/ThinkingSDK/Source/TDRuntime/TDRunTime.h new file mode 100755 index 00000000..ab653f6d --- /dev/null +++ b/Assets/HCMiniSdk/Third/ta/Plugins/iOS/ThinkingSDK/Source/TDRuntime/TDRunTime.h @@ -0,0 +1,21 @@ +// +// TDRunTime.h +// ThinkingSDK +// +// Created by wwango on 2021/12/30. +// When used for plug-in, get the class name and parameters through reflection +// This class is not thread-safe, pay attention to multi-threading issues when using it + + +#import + +NS_ASSUME_NONNULL_BEGIN + +@interface TDRunTime : NSObject + +// start reason ++ (NSString *)getAppLaunchReason; + +@end + +NS_ASSUME_NONNULL_END diff --git a/Assets/HCMiniSdk/Third/ta/Plugins/iOS/ThinkingSDK/Source/TDRuntime/TDRunTime.h.meta b/Assets/HCMiniSdk/Third/ta/Plugins/iOS/ThinkingSDK/Source/TDRuntime/TDRunTime.h.meta new file mode 100644 index 00000000..ba56b07b --- /dev/null +++ b/Assets/HCMiniSdk/Third/ta/Plugins/iOS/ThinkingSDK/Source/TDRuntime/TDRunTime.h.meta @@ -0,0 +1,33 @@ +fileFormatVersion: 2 +guid: c588a4c82821e47059a09450a1a60e46 +PluginImporter: + externalObjects: {} + serializedVersion: 2 + iconMap: {} + executionOrder: {} + defineConstraints: [] + isPreloaded: 0 + isOverridable: 0 + isExplicitlyReferenced: 0 + validateReferences: 1 + platformData: + - first: + Any: + second: + enabled: 0 + settings: {} + - first: + Editor: Editor + second: + enabled: 0 + settings: + DefaultValueInitialized: true + - first: + iPhone: iOS + second: + enabled: 1 + settings: + AddToEmbeddedBinaries: false + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/HCMiniSdk/Third/ta/Plugins/iOS/ThinkingSDK/Source/TDRuntime/TDRunTime.m b/Assets/HCMiniSdk/Third/ta/Plugins/iOS/ThinkingSDK/Source/TDRuntime/TDRunTime.m new file mode 100755 index 00000000..be550b7f --- /dev/null +++ b/Assets/HCMiniSdk/Third/ta/Plugins/iOS/ThinkingSDK/Source/TDRuntime/TDRunTime.m @@ -0,0 +1,46 @@ +// +// TDRunTime.m +// ThinkingSDK +// +// Created by wwango on 2021/12/30. +// + +#import "TDRunTime.h" +#import "TDJSONUtil.h" +#import "TDPresetProperties+TDDisProperties.h" + +@implementation TDRunTime + +#pragma clang diagnostic push +#pragma clang diagnostic ignored "-Wundeclared-selector" + ++ (NSString *)getAppLaunchReason { + // start reason + Class cls = NSClassFromString(@"TDAppLaunchReason"); + id appLaunch = [cls performSelector:@selector(sharedInstance)]; + + if (appLaunch && + [appLaunch respondsToSelector:@selector(appLaunchParams)] && + !TDPresetProperties.disableStartReason) + { + NSDictionary *startReason = [appLaunch performSelector:@selector(appLaunchParams)]; + NSString *url = startReason[@"url"]; + NSDictionary *data = startReason[@"data"]; + if (url.length == 0 && data.allKeys.count == 0) { + return @""; + } else { + if (data.allKeys.count == 0) { + startReason = @{@"url":url, @"data":@""}; + } + NSString *startReasonString = [TDJSONUtil JSONStringForObject:startReason]; + if (startReasonString && startReasonString.length) { + return startReasonString; + } + } + } + return @""; +} + +#pragma clang diagnostic pop + +@end diff --git a/Assets/HCMiniSdk/Third/ta/Plugins/iOS/ThinkingSDK/Source/TDRuntime/TDRunTime.m.meta b/Assets/HCMiniSdk/Third/ta/Plugins/iOS/ThinkingSDK/Source/TDRuntime/TDRunTime.m.meta new file mode 100644 index 00000000..b78db788 --- /dev/null +++ b/Assets/HCMiniSdk/Third/ta/Plugins/iOS/ThinkingSDK/Source/TDRuntime/TDRunTime.m.meta @@ -0,0 +1,33 @@ +fileFormatVersion: 2 +guid: 5c8f9c55d29814f058c83973709b59d9 +PluginImporter: + externalObjects: {} + serializedVersion: 2 + iconMap: {} + executionOrder: {} + defineConstraints: [] + isPreloaded: 0 + isOverridable: 0 + isExplicitlyReferenced: 0 + validateReferences: 1 + platformData: + - first: + Any: + second: + enabled: 0 + settings: {} + - first: + Editor: Editor + second: + enabled: 0 + settings: + DefaultValueInitialized: true + - first: + iPhone: iOS + second: + enabled: 1 + settings: + AddToEmbeddedBinaries: false + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/HCMiniSdk/Third/ta/Plugins/iOS/ThinkingSDK/Source/Util.meta b/Assets/HCMiniSdk/Third/ta/Plugins/iOS/ThinkingSDK/Source/Util.meta new file mode 100644 index 00000000..7d756701 --- /dev/null +++ b/Assets/HCMiniSdk/Third/ta/Plugins/iOS/ThinkingSDK/Source/Util.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: 25157fdc2a1044168862c6c03f435462 +folderAsset: yes +DefaultImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/HCMiniSdk/Third/ta/Plugins/iOS/ThinkingSDK/Source/Util/Category.meta b/Assets/HCMiniSdk/Third/ta/Plugins/iOS/ThinkingSDK/Source/Util/Category.meta new file mode 100644 index 00000000..9aa4aac6 --- /dev/null +++ b/Assets/HCMiniSdk/Third/ta/Plugins/iOS/ThinkingSDK/Source/Util/Category.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: b37051d2565fd43dfba2108cdecdd66f +folderAsset: yes +DefaultImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/HCMiniSdk/Third/ta/Plugins/iOS/ThinkingSDK/Source/Util/Category/NSData+TDGzip.h b/Assets/HCMiniSdk/Third/ta/Plugins/iOS/ThinkingSDK/Source/Util/Category/NSData+TDGzip.h new file mode 100755 index 00000000..f701ea34 --- /dev/null +++ b/Assets/HCMiniSdk/Third/ta/Plugins/iOS/ThinkingSDK/Source/Util/Category/NSData+TDGzip.h @@ -0,0 +1,7 @@ +#import + +@interface NSData (TDGzip) + ++ (NSData *)td_gzipData:(NSData *)dataa; + +@end diff --git a/Assets/HCMiniSdk/Third/ta/Plugins/iOS/ThinkingSDK/Source/Util/Category/NSData+TDGzip.h.meta b/Assets/HCMiniSdk/Third/ta/Plugins/iOS/ThinkingSDK/Source/Util/Category/NSData+TDGzip.h.meta new file mode 100644 index 00000000..be31ae8f --- /dev/null +++ b/Assets/HCMiniSdk/Third/ta/Plugins/iOS/ThinkingSDK/Source/Util/Category/NSData+TDGzip.h.meta @@ -0,0 +1,33 @@ +fileFormatVersion: 2 +guid: 10aa5f70d373b47bda4b3c6615c5beaf +PluginImporter: + externalObjects: {} + serializedVersion: 2 + iconMap: {} + executionOrder: {} + defineConstraints: [] + isPreloaded: 0 + isOverridable: 0 + isExplicitlyReferenced: 0 + validateReferences: 1 + platformData: + - first: + Any: + second: + enabled: 0 + settings: {} + - first: + Editor: Editor + second: + enabled: 0 + settings: + DefaultValueInitialized: true + - first: + iPhone: iOS + second: + enabled: 1 + settings: + AddToEmbeddedBinaries: false + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/HCMiniSdk/Third/ta/Plugins/iOS/ThinkingSDK/Source/Util/Category/NSData+TDGzip.m b/Assets/HCMiniSdk/Third/ta/Plugins/iOS/ThinkingSDK/Source/Util/Category/NSData+TDGzip.m new file mode 100755 index 00000000..4a11699d --- /dev/null +++ b/Assets/HCMiniSdk/Third/ta/Plugins/iOS/ThinkingSDK/Source/Util/Category/NSData+TDGzip.m @@ -0,0 +1,40 @@ +#import "NSData+TDGzip.h" +#import "zlib.h" +#import "TDLogging.h" + +@implementation NSData (TDGzip) + ++ (NSData *)td_gzipData:(NSData *)dataa { + if (!dataa || [dataa length] == 0) { + TDLogDebug(@"gzip error, return nil "); + return nil; + } + + z_stream zlibStreamStruct; + zlibStreamStruct.zalloc = Z_NULL; + zlibStreamStruct.zfree = Z_NULL; + zlibStreamStruct.opaque = Z_NULL; + zlibStreamStruct.total_out = 0; + zlibStreamStruct.next_in = (Bytef *)[dataa bytes]; + zlibStreamStruct.avail_in = (uInt)[dataa length]; + + int initError = deflateInit2(&zlibStreamStruct, Z_DEFAULT_COMPRESSION, Z_DEFLATED, (15+16), 8, Z_DEFAULT_STRATEGY); + + if (initError != Z_OK) return nil; + + NSMutableData *gzipData = [NSMutableData dataWithLength:[dataa length] * 1.01 + 21]; + int deflateStatus; + + do { + zlibStreamStruct.next_out = [gzipData mutableBytes] + zlibStreamStruct.total_out; + zlibStreamStruct.avail_out = (uInt)([gzipData length] - zlibStreamStruct.total_out); + deflateStatus = deflate(&zlibStreamStruct, Z_FINISH); + } while (deflateStatus == Z_OK); + + if (deflateStatus != Z_STREAM_END) return nil; + deflateEnd(&zlibStreamStruct); + [gzipData setLength:zlibStreamStruct.total_out]; + return gzipData; +} + +@end diff --git a/Assets/HCMiniSdk/Third/ta/Plugins/iOS/ThinkingSDK/Source/Util/Category/NSData+TDGzip.m.meta b/Assets/HCMiniSdk/Third/ta/Plugins/iOS/ThinkingSDK/Source/Util/Category/NSData+TDGzip.m.meta new file mode 100644 index 00000000..26147e20 --- /dev/null +++ b/Assets/HCMiniSdk/Third/ta/Plugins/iOS/ThinkingSDK/Source/Util/Category/NSData+TDGzip.m.meta @@ -0,0 +1,33 @@ +fileFormatVersion: 2 +guid: 175f559a1edeb4a7f9409f67ea1aa491 +PluginImporter: + externalObjects: {} + serializedVersion: 2 + iconMap: {} + executionOrder: {} + defineConstraints: [] + isPreloaded: 0 + isOverridable: 0 + isExplicitlyReferenced: 0 + validateReferences: 1 + platformData: + - first: + Any: + second: + enabled: 0 + settings: {} + - first: + Editor: Editor + second: + enabled: 0 + settings: + DefaultValueInitialized: true + - first: + iPhone: iOS + second: + enabled: 1 + settings: + AddToEmbeddedBinaries: false + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/HCMiniSdk/Third/ta/Plugins/iOS/ThinkingSDK/Source/Util/Category/NSDate+TAFormat.h b/Assets/HCMiniSdk/Third/ta/Plugins/iOS/ThinkingSDK/Source/Util/Category/NSDate+TAFormat.h new file mode 100755 index 00000000..fe51ece9 --- /dev/null +++ b/Assets/HCMiniSdk/Third/ta/Plugins/iOS/ThinkingSDK/Source/Util/Category/NSDate+TAFormat.h @@ -0,0 +1,25 @@ +// +// NSDate+TAFormat.h +// ThinkingSDK +// +// Created by Yangxiongon 2022/6/19. +// + +#import + +NS_ASSUME_NONNULL_BEGIN + +@interface NSDate (TAFormat) + +/// input the time zone +/// @param timeZone timeZone +- (double)ta_timeZoneOffset:(NSTimeZone *)timeZone; + +/// Format NSDate +/// @param timeZone timeZone +/// @param formatString formatString +- (NSString *)ta_formatWithTimeZone:(NSTimeZone *)timeZone formatString:(NSString *)formatString; + +@end + +NS_ASSUME_NONNULL_END diff --git a/Assets/HCMiniSdk/Third/ta/Plugins/iOS/ThinkingSDK/Source/Util/Category/NSDate+TAFormat.h.meta b/Assets/HCMiniSdk/Third/ta/Plugins/iOS/ThinkingSDK/Source/Util/Category/NSDate+TAFormat.h.meta new file mode 100644 index 00000000..1bb0a623 --- /dev/null +++ b/Assets/HCMiniSdk/Third/ta/Plugins/iOS/ThinkingSDK/Source/Util/Category/NSDate+TAFormat.h.meta @@ -0,0 +1,33 @@ +fileFormatVersion: 2 +guid: ce52f25fa7ca74bc0b03fd1942b90c37 +PluginImporter: + externalObjects: {} + serializedVersion: 2 + iconMap: {} + executionOrder: {} + defineConstraints: [] + isPreloaded: 0 + isOverridable: 0 + isExplicitlyReferenced: 0 + validateReferences: 1 + platformData: + - first: + Any: + second: + enabled: 0 + settings: {} + - first: + Editor: Editor + second: + enabled: 0 + settings: + DefaultValueInitialized: true + - first: + iPhone: iOS + second: + enabled: 1 + settings: + AddToEmbeddedBinaries: false + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/HCMiniSdk/Third/ta/Plugins/iOS/ThinkingSDK/Source/Util/Category/NSDate+TAFormat.m b/Assets/HCMiniSdk/Third/ta/Plugins/iOS/ThinkingSDK/Source/Util/Category/NSDate+TAFormat.m new file mode 100755 index 00000000..bf4f6560 --- /dev/null +++ b/Assets/HCMiniSdk/Third/ta/Plugins/iOS/ThinkingSDK/Source/Util/Category/NSDate+TAFormat.m @@ -0,0 +1,29 @@ +// +// NSDate+TAFormat.m +// ThinkingSDK +// +// Created by Yangxiongon 2022/6/19. +// + +#import "NSDate+TAFormat.h" + +@implementation NSDate (TAFormat) + +- (double)ta_timeZoneOffset:(NSTimeZone *)timeZone { + if (!timeZone) { + return 0; + } + NSInteger sourceGMTOffset = [timeZone secondsFromGMTForDate:self]; + return (double)(sourceGMTOffset/3600.0); +} + +- (NSString *)ta_formatWithTimeZone:(NSTimeZone *)timeZone formatString:(NSString *)formatString { + NSDateFormatter *timeFormatter = [[NSDateFormatter alloc] init]; + timeFormatter.dateFormat = formatString; + timeFormatter.locale = [[NSLocale alloc] initWithLocaleIdentifier:@"en_US"]; + timeFormatter.calendar = [[NSCalendar alloc] initWithCalendarIdentifier:NSCalendarIdentifierGregorian]; + timeFormatter.timeZone = timeZone; + return [timeFormatter stringFromDate:self]; +} + +@end diff --git a/Assets/HCMiniSdk/Third/ta/Plugins/iOS/ThinkingSDK/Source/Util/Category/NSDate+TAFormat.m.meta b/Assets/HCMiniSdk/Third/ta/Plugins/iOS/ThinkingSDK/Source/Util/Category/NSDate+TAFormat.m.meta new file mode 100644 index 00000000..c4df2568 --- /dev/null +++ b/Assets/HCMiniSdk/Third/ta/Plugins/iOS/ThinkingSDK/Source/Util/Category/NSDate+TAFormat.m.meta @@ -0,0 +1,33 @@ +fileFormatVersion: 2 +guid: 52537316e66524679b1b24f6c6d62f99 +PluginImporter: + externalObjects: {} + serializedVersion: 2 + iconMap: {} + executionOrder: {} + defineConstraints: [] + isPreloaded: 0 + isOverridable: 0 + isExplicitlyReferenced: 0 + validateReferences: 1 + platformData: + - first: + Any: + second: + enabled: 0 + settings: {} + - first: + Editor: Editor + second: + enabled: 0 + settings: + DefaultValueInitialized: true + - first: + iPhone: iOS + second: + enabled: 1 + settings: + AddToEmbeddedBinaries: false + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/HCMiniSdk/Third/ta/Plugins/iOS/ThinkingSDK/Source/Util/Category/NSDictionary+TDJsonOutput.h b/Assets/HCMiniSdk/Third/ta/Plugins/iOS/ThinkingSDK/Source/Util/Category/NSDictionary+TDJsonOutput.h new file mode 100755 index 00000000..56f9f686 --- /dev/null +++ b/Assets/HCMiniSdk/Third/ta/Plugins/iOS/ThinkingSDK/Source/Util/Category/NSDictionary+TDJsonOutput.h @@ -0,0 +1,17 @@ +// +// NSDictionary+TDJsonOutput.h +// ThinkingSDK +// +// Created by huangdiao on 2021/3/18. +// Copyright © 2021 thinkingdata. All rights reserved. +// + +#import + +NS_ASSUME_NONNULL_BEGIN + +@interface NSDictionary (TDJsonOutput) + +@end + +NS_ASSUME_NONNULL_END diff --git a/Assets/HCMiniSdk/Third/ta/Plugins/iOS/ThinkingSDK/Source/Util/Category/NSDictionary+TDJsonOutput.h.meta b/Assets/HCMiniSdk/Third/ta/Plugins/iOS/ThinkingSDK/Source/Util/Category/NSDictionary+TDJsonOutput.h.meta new file mode 100644 index 00000000..3ce57247 --- /dev/null +++ b/Assets/HCMiniSdk/Third/ta/Plugins/iOS/ThinkingSDK/Source/Util/Category/NSDictionary+TDJsonOutput.h.meta @@ -0,0 +1,33 @@ +fileFormatVersion: 2 +guid: 6dcaf30c4b0eb430b8244e993dc551a4 +PluginImporter: + externalObjects: {} + serializedVersion: 2 + iconMap: {} + executionOrder: {} + defineConstraints: [] + isPreloaded: 0 + isOverridable: 0 + isExplicitlyReferenced: 0 + validateReferences: 1 + platformData: + - first: + Any: + second: + enabled: 0 + settings: {} + - first: + Editor: Editor + second: + enabled: 0 + settings: + DefaultValueInitialized: true + - first: + iPhone: iOS + second: + enabled: 1 + settings: + AddToEmbeddedBinaries: false + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/HCMiniSdk/Third/ta/Plugins/iOS/ThinkingSDK/Source/Util/Category/NSDictionary+TDJsonOutput.m b/Assets/HCMiniSdk/Third/ta/Plugins/iOS/ThinkingSDK/Source/Util/Category/NSDictionary+TDJsonOutput.m new file mode 100755 index 00000000..759620dc --- /dev/null +++ b/Assets/HCMiniSdk/Third/ta/Plugins/iOS/ThinkingSDK/Source/Util/Category/NSDictionary+TDJsonOutput.m @@ -0,0 +1,30 @@ +// +// NSDictionary+TDJsonOutput.m +// ThinkingSDK +// +// Created by huangdiao on 2021/3/18. +// Copyright © 2021 thinkingdata. All rights reserved. +// + +#import "NSDictionary+TDJsonOutput.h" + +@implementation NSDictionary (TDJsonOutput) + +- (NSString *)descriptionWithLocale:(nullable id)locale { + if ([NSJSONSerialization isValidJSONObject:self]) { + NSString *output = nil; + @try { + NSData *jsonData = [NSJSONSerialization dataWithJSONObject:self options:NSJSONWritingPrettyPrinted error:nil]; + output = [[NSString alloc] initWithData:jsonData encoding:NSUTF8StringEncoding]; + output = [output stringByReplacingOccurrencesOfString:@"\\/" withString:@"/"]; + } + @catch (NSException *exception) { + output = self.description; + } + return output; + } else { + return self.description; + } +} + +@end diff --git a/Assets/HCMiniSdk/Third/ta/Plugins/iOS/ThinkingSDK/Source/Util/Category/NSDictionary+TDJsonOutput.m.meta b/Assets/HCMiniSdk/Third/ta/Plugins/iOS/ThinkingSDK/Source/Util/Category/NSDictionary+TDJsonOutput.m.meta new file mode 100644 index 00000000..2796bb71 --- /dev/null +++ b/Assets/HCMiniSdk/Third/ta/Plugins/iOS/ThinkingSDK/Source/Util/Category/NSDictionary+TDJsonOutput.m.meta @@ -0,0 +1,33 @@ +fileFormatVersion: 2 +guid: 53a00c2672fe24a528f94803871d160f +PluginImporter: + externalObjects: {} + serializedVersion: 2 + iconMap: {} + executionOrder: {} + defineConstraints: [] + isPreloaded: 0 + isOverridable: 0 + isExplicitlyReferenced: 0 + validateReferences: 1 + platformData: + - first: + Any: + second: + enabled: 0 + settings: {} + - first: + Editor: Editor + second: + enabled: 0 + settings: + DefaultValueInitialized: true + - first: + iPhone: iOS + second: + enabled: 1 + settings: + AddToEmbeddedBinaries: false + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/HCMiniSdk/Third/ta/Plugins/iOS/ThinkingSDK/Source/Util/Category/NSObject+TDUtil.h b/Assets/HCMiniSdk/Third/ta/Plugins/iOS/ThinkingSDK/Source/Util/Category/NSObject+TDUtil.h new file mode 100755 index 00000000..b60ab65a --- /dev/null +++ b/Assets/HCMiniSdk/Third/ta/Plugins/iOS/ThinkingSDK/Source/Util/Category/NSObject+TDUtil.h @@ -0,0 +1,19 @@ +// +// NSObject+TDUtil.h +// ThinkingSDK +// +// Created by wwango on 2021/10/18. +// Copyright © 2021 thinkingdata. All rights reserved. +// + +#import + +NS_ASSUME_NONNULL_BEGIN + +@interface NSObject (TDUtil) + ++ (id)performSelector:(SEL)selector onTarget:(id)target withArguments:(NSArray *)arguments; + +@end + +NS_ASSUME_NONNULL_END diff --git a/Assets/HCMiniSdk/Third/ta/Plugins/iOS/ThinkingSDK/Source/Util/Category/NSObject+TDUtil.h.meta b/Assets/HCMiniSdk/Third/ta/Plugins/iOS/ThinkingSDK/Source/Util/Category/NSObject+TDUtil.h.meta new file mode 100644 index 00000000..43eb3112 --- /dev/null +++ b/Assets/HCMiniSdk/Third/ta/Plugins/iOS/ThinkingSDK/Source/Util/Category/NSObject+TDUtil.h.meta @@ -0,0 +1,33 @@ +fileFormatVersion: 2 +guid: 1ab5993d5baaf4457b1b7f166e9bbbe1 +PluginImporter: + externalObjects: {} + serializedVersion: 2 + iconMap: {} + executionOrder: {} + defineConstraints: [] + isPreloaded: 0 + isOverridable: 0 + isExplicitlyReferenced: 0 + validateReferences: 1 + platformData: + - first: + Any: + second: + enabled: 0 + settings: {} + - first: + Editor: Editor + second: + enabled: 0 + settings: + DefaultValueInitialized: true + - first: + iPhone: iOS + second: + enabled: 1 + settings: + AddToEmbeddedBinaries: false + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/HCMiniSdk/Third/ta/Plugins/iOS/ThinkingSDK/Source/Util/Category/NSObject+TDUtil.m b/Assets/HCMiniSdk/Third/ta/Plugins/iOS/ThinkingSDK/Source/Util/Category/NSObject+TDUtil.m new file mode 100755 index 00000000..fb161a8e --- /dev/null +++ b/Assets/HCMiniSdk/Third/ta/Plugins/iOS/ThinkingSDK/Source/Util/Category/NSObject+TDUtil.m @@ -0,0 +1,185 @@ +// +// NSObject+TDUtil.m +// ThinkingSDK +// +// Created by wwango on 2021/10/18. +// Copyright © 2021 thinkingdata. All rights reserved. +// + +#import "NSObject+TDUtil.h" +#import + +#if TARGET_OS_IOS +#import +#endif + +@implementation NSObject (TDUtil) + ++ (NSValue *)valueForPrimitivePointer:(void *)pointer objCType:(const char *)type +{ + // CASE marcro inspired by https://www.mikeash.com/pyblog/friday-qa-2013-02-08-lets-build-key-value-coding.html +#define CASE(ctype, selectorpart) \ +if(strcmp(type, @encode(ctype)) == 0) { \ +return [NSNumber numberWith ## selectorpart: *(ctype *)pointer]; \ +} + + CASE(BOOL, Bool); + CASE(unsigned char, UnsignedChar); + CASE(short, Short); + CASE(unsigned short, UnsignedShort); + CASE(int, Int); + CASE(unsigned int, UnsignedInt); + CASE(long, Long); + CASE(unsigned long, UnsignedLong); + CASE(long long, LongLong); + CASE(unsigned long long, UnsignedLongLong); + CASE(float, Float); + CASE(double, Double); + +#undef CASE + + NSValue *value = nil; + @try { + value = [NSValue valueWithBytes:pointer objCType:type]; + } @catch (NSException *exception) { + // Certain type encodings are not supported by valueWithBytes:objCType:. Just fail silently if an exception is thrown. + } + + return value; +} + + ++ (BOOL)isTollFreeBridgedValue:(id)value forCFType:(const char *)typeEncoding +{ + // See https://developer.apple.com/library/ios/documentation/general/conceptual/CocoaEncyclopedia/Toll-FreeBridgin/Toll-FreeBridgin.html +#define CASE(cftype, foundationClass) \ +if(strcmp(typeEncoding, @encode(cftype)) == 0) { \ +return [value isKindOfClass:[foundationClass class]]; \ +} + + CASE(CFArrayRef, NSArray); + CASE(CFAttributedStringRef, NSAttributedString); + CASE(CFCalendarRef, NSCalendar); + CASE(CFCharacterSetRef, NSCharacterSet); + CASE(CFDataRef, NSData); + CASE(CFDateRef, NSDate); + CASE(CFDictionaryRef, NSDictionary); + CASE(CFErrorRef, NSError); + CASE(CFLocaleRef, NSLocale); + CASE(CFMutableArrayRef, NSMutableArray); + CASE(CFMutableAttributedStringRef, NSMutableAttributedString); + CASE(CFMutableCharacterSetRef, NSMutableCharacterSet); + CASE(CFMutableDataRef, NSMutableData); + CASE(CFMutableDictionaryRef, NSMutableDictionary); + CASE(CFMutableSetRef, NSMutableSet); + CASE(CFMutableStringRef, NSMutableString); + CASE(CFNumberRef, NSNumber); + CASE(CFReadStreamRef, NSInputStream); + CASE(CFRunLoopTimerRef, NSTimer); + CASE(CFSetRef, NSSet); + CASE(CFStringRef, NSString); + CASE(CFTimeZoneRef, NSTimeZone); + CASE(CFURLRef, NSURL); + CASE(CFWriteStreamRef, NSOutputStream); + +#undef CASE + + return NO; +} + + ++ (id)performSelector:(SEL)selector onTarget:(id)target withArguments:(NSArray *)arguments{ + + if ([target respondsToSelector:selector]) { + + NSMethodSignature *signature = [target methodSignatureForSelector:selector]; + NSInvocation *invocation = [NSInvocation invocationWithMethodSignature:signature]; + [invocation setTarget:target]; + [invocation setSelector:selector]; + [invocation retainArguments]; + + // Always self and _cmd + NSUInteger numberOfArguments = [signature numberOfArguments]; + for (NSUInteger argumentIndex = 2; argumentIndex < numberOfArguments; argumentIndex++) { + NSUInteger argumentsArrayIndex = argumentIndex - 2; + + id argumentObject = [arguments count] > argumentsArrayIndex ? [arguments objectAtIndex:argumentsArrayIndex] : nil; + + // NSNull in the arguments array can be passed as a placeholder to indicate nil. We only need to set the argument if it will be non-nil. + if (argumentObject && ![argumentObject isKindOfClass:[NSNull class]]) { + const char *typeEncodingCString = [signature getArgumentTypeAtIndex:argumentIndex]; + if (typeEncodingCString[0] == @encode(id)[0] || typeEncodingCString[0] == @encode(Class)[0] || [self isTollFreeBridgedValue:argumentObject forCFType:typeEncodingCString]) { + // Object + [invocation setArgument:&argumentObject atIndex:argumentIndex]; + } else if (strcmp(typeEncodingCString, @encode(CGColorRef)) == 0 +#if TARGET_OS_IOS + && [argumentObject isKindOfClass:[UIColor class]] +#elif TARGET_OS_OSX + && [argumentObject isKindOfClass:[NSColor class]] +#endif + ) { + // Bridging UIColor to CGColorRef + CGColorRef colorRef = [argumentObject CGColor]; + [invocation setArgument:&colorRef atIndex:argumentIndex]; + } else if ([argumentObject isKindOfClass:[NSValue class]]) { + // Primitive boxed in NSValue + NSValue *argumentValue = (NSValue *)argumentObject; + + // Ensure that the type encoding on the NSValue matches the type encoding of the argument in the method signature + if (strcmp([argumentValue objCType], typeEncodingCString) != 0) { + return nil; + } + + NSUInteger bufferSize = 0; + @try { + // NSGetSizeAndAlignment barfs on type encoding for bitfields. + NSGetSizeAndAlignment(typeEncodingCString, &bufferSize, NULL); + } @catch (NSException *exception) { } + + if (bufferSize > 0) { + void *buffer = calloc(bufferSize, 1); + [argumentValue getValue:buffer]; + [invocation setArgument:buffer atIndex:argumentIndex]; + free(buffer); + } + } + } + } + + // Try to invoke the invocation but guard against an exception being thrown. + BOOL successfullyInvoked = NO; + @try { + // Some methods are not fit to be called... + // Looking at you -[UIResponder(UITextInputAdditions) _caretRect] + [invocation invoke]; + successfullyInvoked = YES; + } @catch (NSException *exception) { + // Bummer... + } + + // Retreive the return value and box if necessary. + id returnObject = nil; + if (successfullyInvoked) { + const char *returnType = [signature methodReturnType]; + if (returnType[0] == @encode(id)[0] || returnType[0] == @encode(Class)[0]) { + __unsafe_unretained id objectReturnedFromMethod = nil; + [invocation getReturnValue:&objectReturnedFromMethod]; + returnObject = objectReturnedFromMethod; + } else if (returnType[0] != @encode(void)[0]) { + void *returnValue = malloc([signature methodReturnLength]); + if (returnValue) { + [invocation getReturnValue:returnValue]; + returnObject = [self valueForPrimitivePointer:returnValue objCType:returnType]; + free(returnValue); + } + } + } + + return returnObject; + } + + return nil; +} + + +@end diff --git a/Assets/HCMiniSdk/Third/ta/Plugins/iOS/ThinkingSDK/Source/Util/Category/NSObject+TDUtil.m.meta b/Assets/HCMiniSdk/Third/ta/Plugins/iOS/ThinkingSDK/Source/Util/Category/NSObject+TDUtil.m.meta new file mode 100644 index 00000000..223a86a5 --- /dev/null +++ b/Assets/HCMiniSdk/Third/ta/Plugins/iOS/ThinkingSDK/Source/Util/Category/NSObject+TDUtil.m.meta @@ -0,0 +1,33 @@ +fileFormatVersion: 2 +guid: 4bc8c4ead3507483e85343120a67c2cf +PluginImporter: + externalObjects: {} + serializedVersion: 2 + iconMap: {} + executionOrder: {} + defineConstraints: [] + isPreloaded: 0 + isOverridable: 0 + isExplicitlyReferenced: 0 + validateReferences: 1 + platformData: + - first: + Any: + second: + enabled: 0 + settings: {} + - first: + Editor: Editor + second: + enabled: 0 + settings: + DefaultValueInitialized: true + - first: + iPhone: iOS + second: + enabled: 1 + settings: + AddToEmbeddedBinaries: false + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/HCMiniSdk/Third/ta/Plugins/iOS/ThinkingSDK/Source/Util/Category/NSString+TDString.h b/Assets/HCMiniSdk/Third/ta/Plugins/iOS/ThinkingSDK/Source/Util/Category/NSString+TDString.h new file mode 100755 index 00000000..b9447d3a --- /dev/null +++ b/Assets/HCMiniSdk/Third/ta/Plugins/iOS/ThinkingSDK/Source/Util/Category/NSString+TDString.h @@ -0,0 +1,21 @@ +// +// NSString+TDString.h +// ThinkingSDK +// +// Created by wwango on 2021/10/11. +// Copyright © 2021 thinkingdata. All rights reserved. +// + +#import + +NS_ASSUME_NONNULL_BEGIN + +@interface NSString (TDString) + +- (NSString *)td_trim; + +- (NSString * _Nullable)ta_formatUrlString; + +@end + +NS_ASSUME_NONNULL_END diff --git a/Assets/HCMiniSdk/Third/ta/Plugins/iOS/ThinkingSDK/Source/Util/Category/NSString+TDString.h.meta b/Assets/HCMiniSdk/Third/ta/Plugins/iOS/ThinkingSDK/Source/Util/Category/NSString+TDString.h.meta new file mode 100644 index 00000000..3ce051c2 --- /dev/null +++ b/Assets/HCMiniSdk/Third/ta/Plugins/iOS/ThinkingSDK/Source/Util/Category/NSString+TDString.h.meta @@ -0,0 +1,33 @@ +fileFormatVersion: 2 +guid: 001e956454f044758ab02322eac9c098 +PluginImporter: + externalObjects: {} + serializedVersion: 2 + iconMap: {} + executionOrder: {} + defineConstraints: [] + isPreloaded: 0 + isOverridable: 0 + isExplicitlyReferenced: 0 + validateReferences: 1 + platformData: + - first: + Any: + second: + enabled: 0 + settings: {} + - first: + Editor: Editor + second: + enabled: 0 + settings: + DefaultValueInitialized: true + - first: + iPhone: iOS + second: + enabled: 1 + settings: + AddToEmbeddedBinaries: false + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/HCMiniSdk/Third/ta/Plugins/iOS/ThinkingSDK/Source/Util/Category/NSString+TDString.m b/Assets/HCMiniSdk/Third/ta/Plugins/iOS/ThinkingSDK/Source/Util/Category/NSString+TDString.m new file mode 100755 index 00000000..5a95c996 --- /dev/null +++ b/Assets/HCMiniSdk/Third/ta/Plugins/iOS/ThinkingSDK/Source/Util/Category/NSString+TDString.m @@ -0,0 +1,37 @@ +// +// NSString+TDString.m +// ThinkingSDK +// +// Created by wwango on 2021/10/11. +// Copyright © 2021 thinkingdata. All rights reserved. +// + +#import "NSString+TDString.h" + +@implementation NSString (TDString) + +- (NSString *)td_trim { + NSString *string = [self stringByReplacingOccurrencesOfString:@" " withString:@""]; + string = [string stringByReplacingOccurrencesOfString:@"\r" withString:@""]; + string = [string stringByReplacingOccurrencesOfString:@"\n" withString:@""]; + return string; +} + +- (NSString *)ta_formatUrlString { + NSString *urlString = [self stringByTrimmingCharactersInSet:[NSCharacterSet whitespaceCharacterSet]]; + + NSURL *url = [NSURL URLWithString:urlString]; + NSString *scheme = [url scheme]; + NSString *host = [url host]; + NSNumber *port = [url port]; + + if (scheme && scheme.length>0 && host && host.length>0) { + urlString = [NSString stringWithFormat:@"%@://%@", scheme, host]; + if (port && [port stringValue]) { + urlString = [urlString stringByAppendingFormat:@":%@", [port stringValue]]; + } + } + return urlString; +} + +@end diff --git a/Assets/HCMiniSdk/Third/ta/Plugins/iOS/ThinkingSDK/Source/Util/Category/NSString+TDString.m.meta b/Assets/HCMiniSdk/Third/ta/Plugins/iOS/ThinkingSDK/Source/Util/Category/NSString+TDString.m.meta new file mode 100644 index 00000000..787af75c --- /dev/null +++ b/Assets/HCMiniSdk/Third/ta/Plugins/iOS/ThinkingSDK/Source/Util/Category/NSString+TDString.m.meta @@ -0,0 +1,33 @@ +fileFormatVersion: 2 +guid: 36ce4c8cee851492c9300c38f270d4b5 +PluginImporter: + externalObjects: {} + serializedVersion: 2 + iconMap: {} + executionOrder: {} + defineConstraints: [] + isPreloaded: 0 + isOverridable: 0 + isExplicitlyReferenced: 0 + validateReferences: 1 + platformData: + - first: + Any: + second: + enabled: 0 + settings: {} + - first: + Editor: Editor + second: + enabled: 0 + settings: + DefaultValueInitialized: true + - first: + iPhone: iOS + second: + enabled: 1 + settings: + AddToEmbeddedBinaries: false + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/HCMiniSdk/Third/ta/Plugins/iOS/ThinkingSDK/Source/Util/TDCheck.h b/Assets/HCMiniSdk/Third/ta/Plugins/iOS/ThinkingSDK/Source/Util/TDCheck.h new file mode 100755 index 00000000..59eca16b --- /dev/null +++ b/Assets/HCMiniSdk/Third/ta/Plugins/iOS/ThinkingSDK/Source/Util/TDCheck.h @@ -0,0 +1,36 @@ +// +// TDCheck.h +// ThinkingSDK +// +// Created by wwango on 2021/9/10. +// Copyright © 2021 thinkingdata. All rights reserved. +// + +#import + +NS_ASSUME_NONNULL_BEGIN + +#define TD_CHECK_NIL(_object) (_object == nil || [_object isKindOfClass:[NSNull class]]) + +#define TD_CHECK_CLASS(_object, _class) (!TD_CHECK_NIL(_object) && [_object isKindOfClass:[_class class]]) + +#define TD_CHECK_CLASS_NSString(_object) TD_CHECK_CLASS(_object, [NSString class]) +#define TD_CHECK_CLASS_NSNumber(_object) TD_CHECK_CLASS(_object, [NSNumber class]) +#define TD_CHECK_CLASS_NSArray(_object) TD_CHECK_CLASS(_object, [NSArray class]) +#define TD_CHECK_CLASS_NSData(_object) TD_CHECK_CLASS(_object, [NSData class]) +#define TD_CHECK_CLASS_NSDate(_object) TD_CHECK_CLASS(_object, [NSDate class]) +#define TD_CHECK_CLASS_NSDictionary(_object) TD_CHECK_CLASS(_object, [NSDictionary class]) + +#define TD_Valid_NSString(_object) (TD_CHECK_CLASS_NSString(_object) && (_object.length > 0)) +#define TD_Valid_NSArray(_object) (TD_CHECK_CLASS_NSArray(_object) && (_object.count > 0)) +#define TD_Valid_NSData(_object) (TD_CHECK_CLASS_NSData(_object) && (_object.length > 0)) +#define TD_Valid_NSDictionary(_object) (TD_CHECK_CLASS_NSDictionary(_object) && (_object.allKeys.count > 0)) + +@interface TDCheck : NSObject + ++ (NSDictionary *)td_checkToJSONObjectRecursive:(NSDictionary *)properties timeFormatter:(NSDateFormatter *)timeFormatter; + +@end + + +NS_ASSUME_NONNULL_END diff --git a/Assets/HCMiniSdk/Third/ta/Plugins/iOS/ThinkingSDK/Source/Util/TDCheck.h.meta b/Assets/HCMiniSdk/Third/ta/Plugins/iOS/ThinkingSDK/Source/Util/TDCheck.h.meta new file mode 100644 index 00000000..e1aa12ba --- /dev/null +++ b/Assets/HCMiniSdk/Third/ta/Plugins/iOS/ThinkingSDK/Source/Util/TDCheck.h.meta @@ -0,0 +1,33 @@ +fileFormatVersion: 2 +guid: 3174e763d579e48f885f7bbf52454067 +PluginImporter: + externalObjects: {} + serializedVersion: 2 + iconMap: {} + executionOrder: {} + defineConstraints: [] + isPreloaded: 0 + isOverridable: 0 + isExplicitlyReferenced: 0 + validateReferences: 1 + platformData: + - first: + Any: + second: + enabled: 0 + settings: {} + - first: + Editor: Editor + second: + enabled: 0 + settings: + DefaultValueInitialized: true + - first: + iPhone: iOS + second: + enabled: 1 + settings: + AddToEmbeddedBinaries: false + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/HCMiniSdk/Third/ta/Plugins/iOS/ThinkingSDK/Source/Util/TDCheck.m b/Assets/HCMiniSdk/Third/ta/Plugins/iOS/ThinkingSDK/Source/Util/TDCheck.m new file mode 100755 index 00000000..2bb5f8d3 --- /dev/null +++ b/Assets/HCMiniSdk/Third/ta/Plugins/iOS/ThinkingSDK/Source/Util/TDCheck.m @@ -0,0 +1,68 @@ +// +// TDCheck.m +// ThinkingSDK +// +// Created by wwango on 2021/9/10. +// Copyright © 2021 thinkingdata. All rights reserved. +// + +#import "TDCheck.h" +#import "TDLogging.h" + +@implementation TDCheck + ++ (NSDictionary *)td_checkToJSONObjectRecursive:(NSDictionary *)properties timeFormatter:(NSDateFormatter *)timeFormatter { + return (NSDictionary *)[self td_checkToObjectRecursive:properties timeFormatter:timeFormatter]; +} + +// Five basic types: list, time, Boolean, value, text, list only supports basic data types +// Advanced data types: object, object group ++ (NSObject *)td_checkToObjectRecursive:(NSObject *)properties timeFormatter:(NSDateFormatter *)timeFormatter { + if (TD_CHECK_NIL(properties)) { + return properties; + } else if (TD_CHECK_CLASS_NSDictionary(properties)) { + NSDictionary *propertyDic = [(NSDictionary *)properties copy]; + NSMutableDictionary *propertiesDic = [NSMutableDictionary dictionaryWithDictionary:propertyDic]; + for (NSString *key in [propertyDic keyEnumerator]) { + NSObject *newValue = [self td_checkToJSONObjectRecursive:propertyDic[key] timeFormatter:timeFormatter]; + propertiesDic[key] = newValue; + } + return propertiesDic; + } else if (TD_CHECK_CLASS_NSArray(properties)) { + NSMutableArray *arrayItem = [(NSArray *)properties mutableCopy]; + for (int i = 0; i < arrayItem.count ; i++) { + id item = [self td_checkToJSONObjectRecursive:arrayItem[i] timeFormatter:timeFormatter]; + if (item) arrayItem[i] = item; + } + return arrayItem; + } else if (TD_CHECK_CLASS_NSDate(properties)) { + NSString *dateStr = [timeFormatter stringFromDate:(NSDate *)properties]; + return dateStr; + } else { + return properties; + } +} + +// old method +//inline static NSDictionary *_td_old_checkToJSONObject(NSDictionary *properties, NSDateFormatter *timeFormatter) { +// NSMutableDictionary *propertiesDic = [NSMutableDictionary dictionaryWithDictionary:properties]; +// for (NSString *key in [properties keyEnumerator]) { +// if ([properties[key] isKindOfClass:[NSDate class]]) { +// NSString *dateStr = [timeFormatter stringFromDate:(NSDate *)properties[key]]; +// propertiesDic[key] = dateStr; +// } else if ([properties[key] isKindOfClass:[NSArray class]]) { +// NSMutableArray *arrayItem = [properties[key] mutableCopy]; +// for (int i = 0; i < arrayItem.count ; i++) { +// if ([arrayItem[i] isKindOfClass:[NSDate class]]) { +// NSString *dateStr = [timeFormatter stringFromDate:(NSDate *)arrayItem[i]]; +// arrayItem[i] = dateStr; +// } +// } +// propertiesDic[key] = arrayItem; +// } +// } +// return propertiesDic; +//} + + +@end diff --git a/Assets/HCMiniSdk/Third/ta/Plugins/iOS/ThinkingSDK/Source/Util/TDCheck.m.meta b/Assets/HCMiniSdk/Third/ta/Plugins/iOS/ThinkingSDK/Source/Util/TDCheck.m.meta new file mode 100644 index 00000000..456e875d --- /dev/null +++ b/Assets/HCMiniSdk/Third/ta/Plugins/iOS/ThinkingSDK/Source/Util/TDCheck.m.meta @@ -0,0 +1,33 @@ +fileFormatVersion: 2 +guid: 956605faf624745158ad0a460ca710b9 +PluginImporter: + externalObjects: {} + serializedVersion: 2 + iconMap: {} + executionOrder: {} + defineConstraints: [] + isPreloaded: 0 + isOverridable: 0 + isExplicitlyReferenced: 0 + validateReferences: 1 + platformData: + - first: + Any: + second: + enabled: 0 + settings: {} + - first: + Editor: Editor + second: + enabled: 0 + settings: + DefaultValueInitialized: true + - first: + iPhone: iOS + second: + enabled: 1 + settings: + AddToEmbeddedBinaries: false + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/HCMiniSdk/Third/ta/Plugins/iOS/ThinkingSDK/Source/Util/TDCommonUtil.h b/Assets/HCMiniSdk/Third/ta/Plugins/iOS/ThinkingSDK/Source/Util/TDCommonUtil.h new file mode 100755 index 00000000..214daa8e --- /dev/null +++ b/Assets/HCMiniSdk/Third/ta/Plugins/iOS/ThinkingSDK/Source/Util/TDCommonUtil.h @@ -0,0 +1,21 @@ +// +// TDCommonUtil.h +// ThinkingSDK +// +// Created by wwango on 2022/1/11. +// + +#import + +NS_ASSUME_NONNULL_BEGIN + +@interface TDCommonUtil : NSObject + ++ (NSString *)string:(NSString *)string; + ++ (NSDictionary *)dictionary:(NSDictionary *)dic; + +@end + +NS_ASSUME_NONNULL_END + diff --git a/Assets/HCMiniSdk/Third/ta/Plugins/iOS/ThinkingSDK/Source/Util/TDCommonUtil.h.meta b/Assets/HCMiniSdk/Third/ta/Plugins/iOS/ThinkingSDK/Source/Util/TDCommonUtil.h.meta new file mode 100644 index 00000000..60bcc161 --- /dev/null +++ b/Assets/HCMiniSdk/Third/ta/Plugins/iOS/ThinkingSDK/Source/Util/TDCommonUtil.h.meta @@ -0,0 +1,33 @@ +fileFormatVersion: 2 +guid: cdbf44bbd4cb144ff979af417b5774cf +PluginImporter: + externalObjects: {} + serializedVersion: 2 + iconMap: {} + executionOrder: {} + defineConstraints: [] + isPreloaded: 0 + isOverridable: 0 + isExplicitlyReferenced: 0 + validateReferences: 1 + platformData: + - first: + Any: + second: + enabled: 0 + settings: {} + - first: + Editor: Editor + second: + enabled: 0 + settings: + DefaultValueInitialized: true + - first: + iPhone: iOS + second: + enabled: 1 + settings: + AddToEmbeddedBinaries: false + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/HCMiniSdk/Third/ta/Plugins/iOS/ThinkingSDK/Source/Util/TDCommonUtil.m b/Assets/HCMiniSdk/Third/ta/Plugins/iOS/ThinkingSDK/Source/Util/TDCommonUtil.m new file mode 100755 index 00000000..5116c689 --- /dev/null +++ b/Assets/HCMiniSdk/Third/ta/Plugins/iOS/ThinkingSDK/Source/Util/TDCommonUtil.m @@ -0,0 +1,28 @@ +// +// TDCommonUtil.m +// ThinkingSDK +// +// Created by wwango on 2022/1/11. +// + +#import "TDCommonUtil.h" + +@implementation TDCommonUtil + ++ (NSString *)string:(NSString *)string { + if ([string isKindOfClass:[NSString class]] && string.length) { + return string; + } else { + return @""; + } +} + ++ (NSDictionary *)dictionary:(NSDictionary *)dic { + if (dic && [dic isKindOfClass:[NSDictionary class]] && dic.allKeys.count) { + return dic; + } else { + return @{}; + } +} + +@end diff --git a/Assets/HCMiniSdk/Third/ta/Plugins/iOS/ThinkingSDK/Source/Util/TDCommonUtil.m.meta b/Assets/HCMiniSdk/Third/ta/Plugins/iOS/ThinkingSDK/Source/Util/TDCommonUtil.m.meta new file mode 100644 index 00000000..d50e166b --- /dev/null +++ b/Assets/HCMiniSdk/Third/ta/Plugins/iOS/ThinkingSDK/Source/Util/TDCommonUtil.m.meta @@ -0,0 +1,33 @@ +fileFormatVersion: 2 +guid: 646b3aad38f76494ba9bbbb79ce88007 +PluginImporter: + externalObjects: {} + serializedVersion: 2 + iconMap: {} + executionOrder: {} + defineConstraints: [] + isPreloaded: 0 + isOverridable: 0 + isExplicitlyReferenced: 0 + validateReferences: 1 + platformData: + - first: + Any: + second: + enabled: 0 + settings: {} + - first: + Editor: Editor + second: + enabled: 0 + settings: + DefaultValueInitialized: true + - first: + iPhone: iOS + second: + enabled: 1 + settings: + AddToEmbeddedBinaries: false + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/HCMiniSdk/Third/ta/Plugins/iOS/ThinkingSDK/Source/Util/TDJSONUtil.h b/Assets/HCMiniSdk/Third/ta/Plugins/iOS/ThinkingSDK/Source/Util/TDJSONUtil.h new file mode 100755 index 00000000..2a1fe03d --- /dev/null +++ b/Assets/HCMiniSdk/Third/ta/Plugins/iOS/ThinkingSDK/Source/Util/TDJSONUtil.h @@ -0,0 +1,13 @@ +#import + +NS_ASSUME_NONNULL_BEGIN + +@interface TDJSONUtil : NSObject + ++ (NSString *)JSONStringForObject:(id)object; + ++ (NSData *)JSONSerializeForObject:(id)object; + +@end + +NS_ASSUME_NONNULL_END diff --git a/Assets/HCMiniSdk/Third/ta/Plugins/iOS/ThinkingSDK/Source/Util/TDJSONUtil.h.meta b/Assets/HCMiniSdk/Third/ta/Plugins/iOS/ThinkingSDK/Source/Util/TDJSONUtil.h.meta new file mode 100644 index 00000000..b40fdc49 --- /dev/null +++ b/Assets/HCMiniSdk/Third/ta/Plugins/iOS/ThinkingSDK/Source/Util/TDJSONUtil.h.meta @@ -0,0 +1,33 @@ +fileFormatVersion: 2 +guid: d2ad60173c70c49378862b12ee202ee6 +PluginImporter: + externalObjects: {} + serializedVersion: 2 + iconMap: {} + executionOrder: {} + defineConstraints: [] + isPreloaded: 0 + isOverridable: 0 + isExplicitlyReferenced: 0 + validateReferences: 1 + platformData: + - first: + Any: + second: + enabled: 0 + settings: {} + - first: + Editor: Editor + second: + enabled: 0 + settings: + DefaultValueInitialized: true + - first: + iPhone: iOS + second: + enabled: 1 + settings: + AddToEmbeddedBinaries: false + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/HCMiniSdk/Third/ta/Plugins/iOS/ThinkingSDK/Source/Util/TDJSONUtil.m b/Assets/HCMiniSdk/Third/ta/Plugins/iOS/ThinkingSDK/Source/Util/TDJSONUtil.m new file mode 100755 index 00000000..2acd8e47 --- /dev/null +++ b/Assets/HCMiniSdk/Third/ta/Plugins/iOS/ThinkingSDK/Source/Util/TDJSONUtil.m @@ -0,0 +1,87 @@ +#import "TDJSONUtil.h" +//#import "TDLogging.h" + +@implementation TDJSONUtil + ++ (NSString *)JSONStringForObject:(id)obj { + NSData *data = [self JSONSerializeForObject:obj]; + if (!data) { + return nil; + } + return [[NSString alloc] initWithData:data encoding:NSUTF8StringEncoding]; +} + ++ (NSData *)JSONSerializeForObject:(id)object { + + id obj = [TDJSONUtil JSONSerializableObjectForObject:object]; + NSData *data = nil; + + + + @try { + if ([NSJSONSerialization isValidJSONObject:obj]) { + data = [NSJSONSerialization dataWithJSONObject:obj options:0 error:NULL]; + } + } + @catch (NSException *exception) { + + } + + + return data; +} + ++ (id)JSONSerializableObjectForObject:(id)object { + if ([object isKindOfClass:[NSString class]]) { + return object; + } else if ([object isKindOfClass:[NSNumber class]]) { + + if ([object stringValue] && [[object stringValue] rangeOfString:@"."].location != NSNotFound) { + return [NSDecimalNumber decimalNumberWithDecimal:((NSNumber *)object).decimalValue]; + } + if ([object stringValue] && ([[object stringValue] rangeOfString:@"e"].location != NSNotFound || + [[object stringValue] rangeOfString:@"E"].location != NSNotFound )) { + return [NSDecimalNumber decimalNumberWithDecimal:((NSNumber *)object).decimalValue]; + } + return object; + } else if ([object isKindOfClass:[NSArray class]]) { + NSMutableArray *array = [[NSMutableArray alloc] init]; + for (id obj in (NSArray *)object) { + id convertedObj = [self JSONSerializableObjectForObject:obj]; + [self array:array addObject:convertedObj]; + } + return array; + } else if ([object isKindOfClass:[NSDictionary class]]) { + NSMutableDictionary *dictionary = [[NSMutableDictionary alloc] init]; + [(NSDictionary *)object enumerateKeysAndObjectsUsingBlock:^(id key, id obj, BOOL *dictionaryStop) { + [self dictionary:dictionary + setObject:[self JSONSerializableObjectForObject:obj] + forKey:key]; + }]; + return dictionary; + } else if ([object isKindOfClass:[NSArray class]]) { + NSMutableArray *array = [[NSMutableArray alloc] init]; + for (id obj in (NSArray *)object) { + id convertedObj = [self JSONSerializableObjectForObject:obj]; + [self array:array addObject:convertedObj]; + } + object = array; + } + + NSString *s = [object description]; + return s; +} + ++ (void)array:(NSMutableArray *)array addObject:(id)object { + if (object) { + [array addObject:object]; + } +} + ++ (void)dictionary:(NSMutableDictionary *)dictionary setObject:(id)object forKey:(id)key { + if (object && key) { + dictionary[key] = object; + } +} + +@end diff --git a/Assets/HCMiniSdk/Third/ta/Plugins/iOS/ThinkingSDK/Source/Util/TDJSONUtil.m.meta b/Assets/HCMiniSdk/Third/ta/Plugins/iOS/ThinkingSDK/Source/Util/TDJSONUtil.m.meta new file mode 100644 index 00000000..c9b5f8b2 --- /dev/null +++ b/Assets/HCMiniSdk/Third/ta/Plugins/iOS/ThinkingSDK/Source/Util/TDJSONUtil.m.meta @@ -0,0 +1,33 @@ +fileFormatVersion: 2 +guid: 8a9f967f5ccef4cfabe351bd702cc8cf +PluginImporter: + externalObjects: {} + serializedVersion: 2 + iconMap: {} + executionOrder: {} + defineConstraints: [] + isPreloaded: 0 + isOverridable: 0 + isExplicitlyReferenced: 0 + validateReferences: 1 + platformData: + - first: + Any: + second: + enabled: 0 + settings: {} + - first: + Editor: Editor + second: + enabled: 0 + settings: + DefaultValueInitialized: true + - first: + iPhone: iOS + second: + enabled: 1 + settings: + AddToEmbeddedBinaries: false + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/HCMiniSdk/Third/ta/Plugins/iOS/ThinkingSDK/Source/Util/TDSDKUtil.h b/Assets/HCMiniSdk/Third/ta/Plugins/iOS/ThinkingSDK/Source/Util/TDSDKUtil.h new file mode 100755 index 00000000..5e9a8973 --- /dev/null +++ b/Assets/HCMiniSdk/Third/ta/Plugins/iOS/ThinkingSDK/Source/Util/TDSDKUtil.h @@ -0,0 +1,17 @@ +// +// TDUtil.h +// ThinkingSDK +// +// Created by LiHuanan on 2020/9/8. +// Copyright © 2020 thinkingdata. All rights reserved. +// + +#import + +NS_ASSUME_NONNULL_BEGIN + +@interface TDSDKUtil : NSObject + +@end + +NS_ASSUME_NONNULL_END diff --git a/Assets/HCMiniSdk/Third/ta/Plugins/iOS/ThinkingSDK/Source/Util/TDSDKUtil.h.meta b/Assets/HCMiniSdk/Third/ta/Plugins/iOS/ThinkingSDK/Source/Util/TDSDKUtil.h.meta new file mode 100644 index 00000000..b949e41b --- /dev/null +++ b/Assets/HCMiniSdk/Third/ta/Plugins/iOS/ThinkingSDK/Source/Util/TDSDKUtil.h.meta @@ -0,0 +1,33 @@ +fileFormatVersion: 2 +guid: 4b3d4c8f9a5e94ad2a1cbc415bf27aef +PluginImporter: + externalObjects: {} + serializedVersion: 2 + iconMap: {} + executionOrder: {} + defineConstraints: [] + isPreloaded: 0 + isOverridable: 0 + isExplicitlyReferenced: 0 + validateReferences: 1 + platformData: + - first: + Any: + second: + enabled: 0 + settings: {} + - first: + Editor: Editor + second: + enabled: 0 + settings: + DefaultValueInitialized: true + - first: + iPhone: iOS + second: + enabled: 1 + settings: + AddToEmbeddedBinaries: false + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/HCMiniSdk/Third/ta/Plugins/iOS/ThinkingSDK/Source/Util/TDSDKUtil.m b/Assets/HCMiniSdk/Third/ta/Plugins/iOS/ThinkingSDK/Source/Util/TDSDKUtil.m new file mode 100755 index 00000000..db9c0f52 --- /dev/null +++ b/Assets/HCMiniSdk/Third/ta/Plugins/iOS/ThinkingSDK/Source/Util/TDSDKUtil.m @@ -0,0 +1,13 @@ +// +// TDUtil.m +// ThinkingSDK +// +// Created by LiHuanan on 2020/9/8. +// Copyright © 2020 thinkingdata. All rights reserved. +// + +#import "TDSDKUtil.h" + +@implementation TDSDKUtil + +@end diff --git a/Assets/HCMiniSdk/Third/ta/Plugins/iOS/ThinkingSDK/Source/Util/TDSDKUtil.m.meta b/Assets/HCMiniSdk/Third/ta/Plugins/iOS/ThinkingSDK/Source/Util/TDSDKUtil.m.meta new file mode 100644 index 00000000..ff4bb976 --- /dev/null +++ b/Assets/HCMiniSdk/Third/ta/Plugins/iOS/ThinkingSDK/Source/Util/TDSDKUtil.m.meta @@ -0,0 +1,33 @@ +fileFormatVersion: 2 +guid: a56c0e17f9b4643af98c0a4f64548a75 +PluginImporter: + externalObjects: {} + serializedVersion: 2 + iconMap: {} + executionOrder: {} + defineConstraints: [] + isPreloaded: 0 + isOverridable: 0 + isExplicitlyReferenced: 0 + validateReferences: 1 + platformData: + - first: + Any: + second: + enabled: 0 + settings: {} + - first: + Editor: Editor + second: + enabled: 0 + settings: + DefaultValueInitialized: true + - first: + iPhone: iOS + second: + enabled: 1 + settings: + AddToEmbeddedBinaries: false + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/HCMiniSdk/Third/ta/Plugins/iOS/ThinkingSDK/Source/Util/TDWeakProxy.h b/Assets/HCMiniSdk/Third/ta/Plugins/iOS/ThinkingSDK/Source/Util/TDWeakProxy.h new file mode 100755 index 00000000..2abb6c5d --- /dev/null +++ b/Assets/HCMiniSdk/Third/ta/Plugins/iOS/ThinkingSDK/Source/Util/TDWeakProxy.h @@ -0,0 +1,24 @@ +// +// TDWeakProxy.h +// ThinkingSDK +// +// Created by wwango on 2021/9/15. +// Copyright © 2021 thinkingdata. All rights reserved. +// + +#import + +NS_ASSUME_NONNULL_BEGIN + +@interface TDWeakProxy : NSProxy + +@property (nullable, nonatomic, weak, readonly) id target; + +- (instancetype)initWithTarget:(id)target; + ++ (instancetype)proxyWithTarget:(id)target; + + +@end + +NS_ASSUME_NONNULL_END diff --git a/Assets/HCMiniSdk/Third/ta/Plugins/iOS/ThinkingSDK/Source/Util/TDWeakProxy.h.meta b/Assets/HCMiniSdk/Third/ta/Plugins/iOS/ThinkingSDK/Source/Util/TDWeakProxy.h.meta new file mode 100644 index 00000000..25581bfa --- /dev/null +++ b/Assets/HCMiniSdk/Third/ta/Plugins/iOS/ThinkingSDK/Source/Util/TDWeakProxy.h.meta @@ -0,0 +1,33 @@ +fileFormatVersion: 2 +guid: 26287937f0ac74abeaed5f1da5b092ed +PluginImporter: + externalObjects: {} + serializedVersion: 2 + iconMap: {} + executionOrder: {} + defineConstraints: [] + isPreloaded: 0 + isOverridable: 0 + isExplicitlyReferenced: 0 + validateReferences: 1 + platformData: + - first: + Any: + second: + enabled: 0 + settings: {} + - first: + Editor: Editor + second: + enabled: 0 + settings: + DefaultValueInitialized: true + - first: + iPhone: iOS + second: + enabled: 1 + settings: + AddToEmbeddedBinaries: false + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/HCMiniSdk/Third/ta/Plugins/iOS/ThinkingSDK/Source/Util/TDWeakProxy.m b/Assets/HCMiniSdk/Third/ta/Plugins/iOS/ThinkingSDK/Source/Util/TDWeakProxy.m new file mode 100755 index 00000000..81384d2d --- /dev/null +++ b/Assets/HCMiniSdk/Third/ta/Plugins/iOS/ThinkingSDK/Source/Util/TDWeakProxy.m @@ -0,0 +1,81 @@ +// +// TDWeakProxy.m +// ThinkingSDK +// +// Created by wwango on 2021/9/15. +// Copyright © 2021 thinkingdata. All rights reserved. +// + +#import "TDWeakProxy.h" + +@implementation TDWeakProxy + + +- (instancetype)initWithTarget:(id)target { + _target = target; + return self; +} + ++ (instancetype)proxyWithTarget:(id)target { + return [[TDWeakProxy alloc] initWithTarget:target]; +} + +- (id)forwardingTargetForSelector:(SEL)selector { + return _target; +} + +- (void)forwardInvocation:(NSInvocation *)invocation { + void *null = NULL; + [invocation setReturnValue:&null]; +} + +- (NSMethodSignature *)methodSignatureForSelector:(SEL)selector { + return [NSObject instanceMethodSignatureForSelector:@selector(init)]; +} + +- (BOOL)respondsToSelector:(SEL)aSelector { + return [_target respondsToSelector:aSelector]; +} + +- (BOOL)isEqual:(id)object { + return [_target isEqual:object]; +} + +- (NSUInteger)hash { + return [_target hash]; +} + +- (Class)superclass { + return [_target superclass]; +} + +- (Class)class { + return [_target class]; +} + +- (BOOL)isKindOfClass:(Class)aClass { + return [_target isKindOfClass:aClass]; +} + +- (BOOL)isMemberOfClass:(Class)aClass { + return [_target isMemberOfClass:aClass]; +} + +- (BOOL)conformsToProtocol:(Protocol *)aProtocol { + return [_target conformsToProtocol:aProtocol]; +} + +- (BOOL)isProxy { + return YES; +} + +- (NSString *)description { + return [_target description]; +} + +- (NSString *)debugDescription { + return [_target debugDescription]; +} + + +@end diff --git a/Assets/HCMiniSdk/Third/ta/Plugins/iOS/ThinkingSDK/Source/Util/TDWeakProxy.m.meta b/Assets/HCMiniSdk/Third/ta/Plugins/iOS/ThinkingSDK/Source/Util/TDWeakProxy.m.meta new file mode 100644 index 00000000..6628f785 --- /dev/null +++ b/Assets/HCMiniSdk/Third/ta/Plugins/iOS/ThinkingSDK/Source/Util/TDWeakProxy.m.meta @@ -0,0 +1,33 @@ +fileFormatVersion: 2 +guid: a6edacb4206a84710b119b660398b43d +PluginImporter: + externalObjects: {} + serializedVersion: 2 + iconMap: {} + executionOrder: {} + defineConstraints: [] + isPreloaded: 0 + isOverridable: 0 + isExplicitlyReferenced: 0 + validateReferences: 1 + platformData: + - first: + Any: + second: + enabled: 0 + settings: {} + - first: + Editor: Editor + second: + enabled: 0 + settings: + DefaultValueInitialized: true + - first: + iPhone: iOS + second: + enabled: 1 + settings: + AddToEmbeddedBinaries: false + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/HCMiniSdk/Third/ta/Plugins/iOS/ThinkingSDK/Source/Util/Toast.meta b/Assets/HCMiniSdk/Third/ta/Plugins/iOS/ThinkingSDK/Source/Util/Toast.meta new file mode 100644 index 00000000..8d209359 --- /dev/null +++ b/Assets/HCMiniSdk/Third/ta/Plugins/iOS/ThinkingSDK/Source/Util/Toast.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: d3b65b21752394ebb9fdbe302e35724c +folderAsset: yes +DefaultImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/HCMiniSdk/Third/ta/Plugins/iOS/ThinkingSDK/Source/Util/Toast/TDToastView.h b/Assets/HCMiniSdk/Third/ta/Plugins/iOS/ThinkingSDK/Source/Util/Toast/TDToastView.h new file mode 100755 index 00000000..d42b0c54 --- /dev/null +++ b/Assets/HCMiniSdk/Third/ta/Plugins/iOS/ThinkingSDK/Source/Util/Toast/TDToastView.h @@ -0,0 +1,11 @@ +#import + +NS_ASSUME_NONNULL_BEGIN + +@interface TDToastView : UIView + ++ (instancetype)showInWindow:(UIWindow *)window text:(NSString *)text duration:(NSTimeInterval)duration; + +@end + +NS_ASSUME_NONNULL_END diff --git a/Assets/HCMiniSdk/Third/ta/Plugins/iOS/ThinkingSDK/Source/Util/Toast/TDToastView.h.meta b/Assets/HCMiniSdk/Third/ta/Plugins/iOS/ThinkingSDK/Source/Util/Toast/TDToastView.h.meta new file mode 100644 index 00000000..abb0b8a8 --- /dev/null +++ b/Assets/HCMiniSdk/Third/ta/Plugins/iOS/ThinkingSDK/Source/Util/Toast/TDToastView.h.meta @@ -0,0 +1,33 @@ +fileFormatVersion: 2 +guid: 614c10a06303d446984eac9d03f7ba07 +PluginImporter: + externalObjects: {} + serializedVersion: 2 + iconMap: {} + executionOrder: {} + defineConstraints: [] + isPreloaded: 0 + isOverridable: 0 + isExplicitlyReferenced: 0 + validateReferences: 1 + platformData: + - first: + Any: + second: + enabled: 0 + settings: {} + - first: + Editor: Editor + second: + enabled: 0 + settings: + DefaultValueInitialized: true + - first: + iPhone: iOS + second: + enabled: 1 + settings: + AddToEmbeddedBinaries: false + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/HCMiniSdk/Third/ta/Plugins/iOS/ThinkingSDK/Source/Util/Toast/TDToastView.m b/Assets/HCMiniSdk/Third/ta/Plugins/iOS/ThinkingSDK/Source/Util/Toast/TDToastView.m new file mode 100755 index 00000000..f92a475a --- /dev/null +++ b/Assets/HCMiniSdk/Third/ta/Plugins/iOS/ThinkingSDK/Source/Util/Toast/TDToastView.m @@ -0,0 +1,97 @@ +#import "TDToastView.h" + +@implementation TDToastView +{ + UITextView *_textView; +} + +#define TOAST_HORIZONTAL_PADDING 20.0 +#define TOAST_VERTICAL_PADDING 15.0 + +- (instancetype)initWithFrame:(CGRect)frame { + if ((self = [super initWithFrame:frame])) { + _textView = [[UITextView alloc] initWithFrame:CGRectZero]; + _textView.opaque = NO; + _textView.editable = NO; + _textView.selectable = NO; + _textView.textColor = [UIColor whiteColor]; + _textView.backgroundColor = [UIColor clearColor]; + _textView.userInteractionEnabled = YES; + [self addSubview:_textView]; + self.alpha = 0.9; + self.backgroundColor = [UIColor darkGrayColor]; + self.layer.cornerRadius = 20.0; + self.opaque = NO; + self.userInteractionEnabled = YES; + [self addGestureRecognizer:[[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(_tapHandler:)]]; + } + return self; +} + ++ (instancetype)showInWindow:(UIWindow *)window text:(NSString *)text duration:(NSTimeInterval)duration { + TDToastView *toast = [[self alloc] initWithFrame:CGRectZero]; + toast.text = text; + [toast showInWindow:window duration:duration]; + return toast; +} + + +- (void)showInWindow:(UIWindow *)window duration:(NSTimeInterval)duration { + if (window == nil) { + return; + } + CGRect windowBounds = CGRectInset(window.bounds, 20.0, 20.0); + CGRect toastBounds = CGRectZero; + toastBounds.size = [self sizeThatFits:windowBounds.size]; + self.bounds = toastBounds; + self.center = CGPointMake(CGRectGetMidX(windowBounds), CGRectGetMidY(windowBounds)); + CGFloat alpha = self.alpha; + self.alpha = 0.0; + [window addSubview:self]; + [UIView animateWithDuration:0.3 animations:^{ + self.alpha = alpha; + } completion:^(BOOL finishedShowing) { + dispatch_after(dispatch_time(DISPATCH_TIME_NOW, (int64_t)(duration * NSEC_PER_SEC)), dispatch_get_main_queue(), ^{ + [self dismiss]; + }); + }]; +} + +- (NSString *)text { + return _textView.text; +} + +- (void)setText:(NSString *)text { + _textView.text = text; +} + +- (void)dismiss { + if (!self.superview) { + return; + } + [UIView animateWithDuration:0.3 animations:^{ + self.alpha = 0.0; + } completion:^(BOOL finishedHiding) { + [self removeFromSuperview]; + }]; +} + +- (void)_tapHandler:(UITapGestureRecognizer *)tapGestureRecognizer { + [self dismiss]; +} + +- (void)layoutSubviews { + [super layoutSubviews]; + _textView.frame = CGRectInset(self.bounds, TOAST_HORIZONTAL_PADDING, TOAST_VERTICAL_PADDING); +} + +- (CGSize)sizeThatFits:(CGSize)size { + CGSize textConstrainedSize = CGSizeMake(size.width - 2 * TOAST_HORIZONTAL_PADDING, + size.height - 2 * TOAST_VERTICAL_PADDING); + CGSize textSize = [_textView sizeThatFits:textConstrainedSize]; + CGFloat width = MIN(size.width, textSize.width + 2 * TOAST_HORIZONTAL_PADDING); + CGFloat height = MIN(size.height, textSize.height + 2 * TOAST_VERTICAL_PADDING); + return CGSizeMake(width, height); +} + +@end diff --git a/Assets/HCMiniSdk/Third/ta/Plugins/iOS/ThinkingSDK/Source/Util/Toast/TDToastView.m.meta b/Assets/HCMiniSdk/Third/ta/Plugins/iOS/ThinkingSDK/Source/Util/Toast/TDToastView.m.meta new file mode 100644 index 00000000..f156f987 --- /dev/null +++ b/Assets/HCMiniSdk/Third/ta/Plugins/iOS/ThinkingSDK/Source/Util/Toast/TDToastView.m.meta @@ -0,0 +1,33 @@ +fileFormatVersion: 2 +guid: 2fafada4f4d8d4cccbb91bb529d695a9 +PluginImporter: + externalObjects: {} + serializedVersion: 2 + iconMap: {} + executionOrder: {} + defineConstraints: [] + isPreloaded: 0 + isOverridable: 0 + isExplicitlyReferenced: 0 + validateReferences: 1 + platformData: + - first: + Any: + second: + enabled: 0 + settings: {} + - first: + Editor: Editor + second: + enabled: 0 + settings: + DefaultValueInitialized: true + - first: + iPhone: iOS + second: + enabled: 1 + settings: + AddToEmbeddedBinaries: false + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/HCMiniSdk/Third/ta/Plugins/iOS/ThinkingSDK/Source/main.meta b/Assets/HCMiniSdk/Third/ta/Plugins/iOS/ThinkingSDK/Source/main.meta new file mode 100644 index 00000000..c6447345 --- /dev/null +++ b/Assets/HCMiniSdk/Third/ta/Plugins/iOS/ThinkingSDK/Source/main.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: e6e61b2e4e2f1466785d1454a550de40 +folderAsset: yes +DefaultImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/HCMiniSdk/Third/ta/Plugins/iOS/ThinkingSDK/Source/main/LightThinkingAnalyticsSDK.m b/Assets/HCMiniSdk/Third/ta/Plugins/iOS/ThinkingSDK/Source/main/LightThinkingAnalyticsSDK.m new file mode 100755 index 00000000..0cb2b74b --- /dev/null +++ b/Assets/HCMiniSdk/Third/ta/Plugins/iOS/ThinkingSDK/Source/main/LightThinkingAnalyticsSDK.m @@ -0,0 +1,119 @@ +#import "ThinkingAnalyticsSDKPrivate.h" +#import "TDLogging.h" + +@implementation LightThinkingAnalyticsSDK + +- (instancetype)initWithAPPID:(NSString *)appID withServerURL:(NSString *)serverURL withConfig:(TDConfig *)config { + if (self = [self initLight:appID withServerURL:serverURL withConfig:config]) { + } + + return self; +} + +- (void)login:(NSString *)accountId { + if ([self hasDisabled]) + return; + + if (![accountId isKindOfClass:[NSString class]] || accountId.length == 0) { + TDLogError(@"accountId invald", accountId); + return; + } + + @synchronized (self.accountId) { + self.accountId = accountId; + } +} + +- (void)logout { + if ([self hasDisabled]) + return; + + @synchronized (self.accountId) { + self.accountId = nil; + }; +} + +- (void)identify:(NSString *)distinctId { + if ([self hasDisabled]) + return; + + if (![distinctId isKindOfClass:[NSString class]] || distinctId.length == 0) { + TDLogError(@"identify cannot null"); + return; + } + + @synchronized (self.identifyId) { + self.identifyId = distinctId; + }; +} + +- (NSString *)getDistinctId { + return [self.identifyId copy]; +} + +- (void)enableAutoTrack:(ThinkingAnalyticsAutoTrackEventType)eventType { + return; +} + +- (void)flush { + return; +} + +#pragma mark - EnableTracking +- (void)enableTracking:(BOOL)enabled { + TDLogDebug(@"%@light instance: enableTracking...", self); + self.isEnabled = enabled; +} + +- (void)optOutTracking { + TDLogDebug(@"%@light instance: optOutTracking...", self); + self.isEnabled = NO; +} + +- (void)optOutTrackingAndDeleteUser { + TDLogDebug(@"%@light instance: optOutTrackingAndDeleteUser...", self); + self.isEnabled = NO; +} + +- (void)optInTracking { + TDLogDebug(@"%@light instance: optInTracking...", self); + self.isEnabled = YES; +} + + + +- (void)setTrackStatus: (TATrackStatus)status { + switch (status) { + + case TATrackStatusPause: { + TDLogDebug(@"%@light instance - switchTrackStatus: TATrackStatusStop...", self); + self.isEnabled = NO; + break; + } + + case TATrackStatusStop: { + TDLogDebug(@"%@light instance - switchTrackStatus: TATrackStatusStopAndClean...", self); + self.isEnabled = NO; + break; + } + + case TATrackStatusSaveOnly: { + TDLogDebug(@"%@light instance - switchTrackStatus: TATrackStatusPausePost...", self); + self.trackPause = YES; + break; + } + + case TATrackStatusNormal: { + TDLogDebug(@"%@light instance - switchTrackStatus: TATrackStatusRestartAll...", self); + self.trackPause = NO; + self.isEnabled = YES; + [self flush]; + break; + } + default: + break; + } +} + + +@end diff --git a/Assets/HCMiniSdk/Third/ta/Plugins/iOS/ThinkingSDK/Source/main/LightThinkingAnalyticsSDK.m.meta b/Assets/HCMiniSdk/Third/ta/Plugins/iOS/ThinkingSDK/Source/main/LightThinkingAnalyticsSDK.m.meta new file mode 100644 index 00000000..a20c3101 --- /dev/null +++ b/Assets/HCMiniSdk/Third/ta/Plugins/iOS/ThinkingSDK/Source/main/LightThinkingAnalyticsSDK.m.meta @@ -0,0 +1,33 @@ +fileFormatVersion: 2 +guid: 6ea8076903d3c4e979c5765a2dfc7c59 +PluginImporter: + externalObjects: {} + serializedVersion: 2 + iconMap: {} + executionOrder: {} + defineConstraints: [] + isPreloaded: 0 + isOverridable: 0 + isExplicitlyReferenced: 0 + validateReferences: 1 + platformData: + - first: + Any: + second: + enabled: 0 + settings: {} + - first: + Editor: Editor + second: + enabled: 0 + settings: + DefaultValueInitialized: true + - first: + iPhone: iOS + second: + enabled: 1 + settings: + AddToEmbeddedBinaries: false + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/HCMiniSdk/Third/ta/Plugins/iOS/ThinkingSDK/Source/main/TDEventRecord.h b/Assets/HCMiniSdk/Third/ta/Plugins/iOS/ThinkingSDK/Source/main/TDEventRecord.h new file mode 100755 index 00000000..9cfb65a2 --- /dev/null +++ b/Assets/HCMiniSdk/Third/ta/Plugins/iOS/ThinkingSDK/Source/main/TDEventRecord.h @@ -0,0 +1,33 @@ +// +// TDEventRecord.h +// ThinkingSDK +// +// Created by wwango on 2022/1/24. +// + +#import + +NS_ASSUME_NONNULL_BEGIN + +@interface TDEventRecord : NSObject + +// Due to historical reasons, there is no event identifier stored in the database +// Record index when fetching data, update uuid before reporting data, remove data according to uuid after successful reporting +@property (nonatomic, copy) NSString *uuid; +@property (nonatomic, strong) NSNumber *index; + +@property (nonatomic, copy, readonly) NSString *content; +@property (nonatomic, copy, readonly) NSDictionary *event; +@property (nonatomic, assign) BOOL encrypted; +@property (nonatomic, copy, readonly) NSString *ekey; + + +- (instancetype)initWithIndex:(NSNumber *)index content:(NSDictionary *)content; +- (instancetype)initWithContent:(NSDictionary *)content; + +- (void)setSecretObject:(NSDictionary *)obj; + +- (NSString *)flushContent:(NSString *)appid; +@end + +NS_ASSUME_NONNULL_END diff --git a/Assets/HCMiniSdk/Third/ta/Plugins/iOS/ThinkingSDK/Source/main/TDEventRecord.h.meta b/Assets/HCMiniSdk/Third/ta/Plugins/iOS/ThinkingSDK/Source/main/TDEventRecord.h.meta new file mode 100644 index 00000000..bf9fd7f7 --- /dev/null +++ b/Assets/HCMiniSdk/Third/ta/Plugins/iOS/ThinkingSDK/Source/main/TDEventRecord.h.meta @@ -0,0 +1,33 @@ +fileFormatVersion: 2 +guid: 19e98fbcb790d46a39bcbc8615cbf6ae +PluginImporter: + externalObjects: {} + serializedVersion: 2 + iconMap: {} + executionOrder: {} + defineConstraints: [] + isPreloaded: 0 + isOverridable: 0 + isExplicitlyReferenced: 0 + validateReferences: 1 + platformData: + - first: + Any: + second: + enabled: 0 + settings: {} + - first: + Editor: Editor + second: + enabled: 0 + settings: + DefaultValueInitialized: true + - first: + iPhone: iOS + second: + enabled: 1 + settings: + AddToEmbeddedBinaries: false + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/HCMiniSdk/Third/ta/Plugins/iOS/ThinkingSDK/Source/main/TDEventRecord.m b/Assets/HCMiniSdk/Third/ta/Plugins/iOS/ThinkingSDK/Source/main/TDEventRecord.m new file mode 100755 index 00000000..bd97a4ce --- /dev/null +++ b/Assets/HCMiniSdk/Third/ta/Plugins/iOS/ThinkingSDK/Source/main/TDEventRecord.m @@ -0,0 +1,97 @@ +// +// TDEventRecord.m +// ThinkingSDK +// +// Created by wwango on 2022/1/24. +// + +#import "TDEventRecord.h" + +#import "TDJSONUtil.h" + +static NSString * const TDEncryptRecordKeyEKey = @"ekey"; +static NSString * const TDEncryptRecordKeyPayload = @"payload"; + +@implementation TDEventRecord { + NSMutableDictionary *_event; +} + + +- (instancetype)initWithEvent:(NSDictionary *)event type:(NSString *)type { + if (self = [super init]) { + + _event = [event mutableCopy]; + _encrypted = _event[TDEncryptRecordKeyEKey] != nil; + } + return self; +} + +- (instancetype)initWithUUID:(NSString *)uuid content:(NSDictionary *)content { + if (self = [super init]) { + _uuid = uuid; + + if (content && [content isKindOfClass:[NSDictionary class]]) { + _event = [NSMutableDictionary dictionaryWithDictionary:content]; + _encrypted = _event[TDEncryptRecordKeyEKey] != nil; + } + } + return self; +} + +- (instancetype)initWithIndex:(NSNumber *)index content:(NSDictionary *)content { + if (self = [super init]) { + _index = index; + + if (content && [content isKindOfClass:[NSDictionary class]]) { + _event = [NSMutableDictionary dictionaryWithDictionary:content]; + _encrypted = _event[TDEncryptRecordKeyEKey] != nil; + } + } + return self; +} + +- (instancetype)initWithContent:(NSDictionary *)content { + if (self = [super init]) { + if (content && [content isKindOfClass:[NSDictionary class]]) { + _event = [NSMutableDictionary dictionaryWithDictionary:content]; + _encrypted = _event[TDEncryptRecordKeyEKey] != nil; + } + } + return self; +} + +- (NSString *)ekey { + return _event[TDEncryptRecordKeyEKey]; +} + +- (void)setSecretObject:(NSDictionary *)obj { + if (!obj || ![obj isKindOfClass:[NSDictionary class]]) { + return; + } + [_event removeAllObjects]; + [_event addEntriesFromDictionary:obj]; + + _encrypted = YES; +} + +- (BOOL)isValid { + return self.event.count > 0; +} + +- (NSString *)content { + return [TDJSONUtil JSONStringForObject:self.event]; +} + +- (NSString *)flushContent:(NSString *)appid { + if (![self isValid]) { + return nil; + } + + UInt64 time = [[NSDate date] timeIntervalSince1970] * 1000; + _event[@"#flush_time"] = @(time); + _event[@"#app_id"] =appid; + + return self.content; +} + +@end diff --git a/Assets/HCMiniSdk/Third/ta/Plugins/iOS/ThinkingSDK/Source/main/TDEventRecord.m.meta b/Assets/HCMiniSdk/Third/ta/Plugins/iOS/ThinkingSDK/Source/main/TDEventRecord.m.meta new file mode 100644 index 00000000..beac4b83 --- /dev/null +++ b/Assets/HCMiniSdk/Third/ta/Plugins/iOS/ThinkingSDK/Source/main/TDEventRecord.m.meta @@ -0,0 +1,33 @@ +fileFormatVersion: 2 +guid: 6e0174f92ad0744b496118cbb4b634a8 +PluginImporter: + externalObjects: {} + serializedVersion: 2 + iconMap: {} + executionOrder: {} + defineConstraints: [] + isPreloaded: 0 + isOverridable: 0 + isExplicitlyReferenced: 0 + validateReferences: 1 + platformData: + - first: + Any: + second: + enabled: 0 + settings: {} + - first: + Editor: Editor + second: + enabled: 0 + settings: + DefaultValueInitialized: true + - first: + iPhone: iOS + second: + enabled: 1 + settings: + AddToEmbeddedBinaries: false + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/HCMiniSdk/Third/ta/Plugins/iOS/ThinkingSDK/Source/main/ThinkingAnalyticsSDK.h b/Assets/HCMiniSdk/Third/ta/Plugins/iOS/ThinkingSDK/Source/main/ThinkingAnalyticsSDK.h new file mode 100755 index 00000000..bd693f45 --- /dev/null +++ b/Assets/HCMiniSdk/Third/ta/Plugins/iOS/ThinkingSDK/Source/main/ThinkingAnalyticsSDK.h @@ -0,0 +1,520 @@ +#import + +#if TARGET_OS_IOS +#import + +#if __has_include() +#import +#else +#import "TAAutoTrackPublicHeader.h" +#endif + +#elif TARGET_OS_OSX +#import +#endif + +#if __has_include() +#import +#else +#import "TDFirstEventModel.h" +#endif + +#if __has_include() +#import +#else +#import "TDEditableEventModel.h" +#endif + + +#if __has_include() +#import +#else +#import "TDConfig.h" +#endif + +#if __has_include() +#import +#else +#import "TDPresetProperties.h" +#endif + + +NS_ASSUME_NONNULL_BEGIN + +/** + SDK VERSION = 2.8.6 + ThinkingData API + + ## Initialization + + ```objective-c + ThinkingAnalyticsSDK *instance = [ThinkingAnalyticsSDK startWithAppId:@"YOUR_APPID" withUrl:@"YOUR_SERVER_URL"]; + ``` + + ## Track Event + + ```objective-c + instance.track("some_event"); + ``` +or + ```objective-c + [[ThinkingAnalyticsSDK sharedInstanceWithAppid:@"YOUR_APPID"] track:@"some_event"]; + ``` + If you only have one instance in your project, you can also use + ```objective-c + [[ThinkingAnalyticsSDK sharedInstance] track:@"some_event"]; + ``` + ## Detailed Documentation + http://doc.thinkingdata.cn/tgamanual/installation/ios_sdk_installation.html + + */ +@interface ThinkingAnalyticsSDK : NSObject + +#pragma mark - Tracking + +/** + Get default instance + + @return SDK instance + */ ++ (nullable ThinkingAnalyticsSDK *)sharedInstance; + +/** + Get one instance according to appid or instanceName + + @param appid APP ID or instanceName + @return SDK instance + */ ++ (nullable ThinkingAnalyticsSDK *)sharedInstanceWithAppid:(NSString *)appid; + +/** + Initialization method + After the SDK initialization is complete, the saved instance can be obtained through this api + + @param appId appId + @param url server url + @return one instance + */ ++ (ThinkingAnalyticsSDK *)startWithAppId:(NSString *)appId withUrl:(NSString *)url; + +/** + Initialization method + After the SDK initialization is complete, the saved instance can be obtained through this api + + @param config initialization configuration + @return one instance + */ ++ (ThinkingAnalyticsSDK *)startWithConfig:(nullable TDConfig *)config; + +/** + Initialization method + After the SDK initialization is complete, the saved instance can be obtained through this api + + @param appId appId + @param url server url + @param config initialization configuration object + @return one instance + */ ++ (ThinkingAnalyticsSDK *)startWithAppId:(NSString *)appId withUrl:(NSString *)url withConfig:(nullable TDConfig *)config; + + +#pragma mark - Action Track + +/** + Track Events + + @param event event name + */ +- (void)track:(NSString *)event; + + +/** + Track Events + + @param event event name + @param propertieDict event properties + */ +- (void)track:(NSString *)event properties:(nullable NSDictionary *)propertieDict; + +/** + Track Events + + @param event event name + @param propertieDict event properties + @param time event trigger time + */ +- (void)track:(NSString *)event properties:(nullable NSDictionary *)propertieDict time:(NSDate *)time __attribute__((deprecated("please use track:properties:time:timeZone: method"))); + +/** + Track Events + + @param event event name + @param propertieDict event properties + @param time event trigger time + @param timeZone event trigger time time zone + */ +- (void)track:(NSString *)event properties:(nullable NSDictionary *)propertieDict time:(NSDate *)time timeZone:(NSTimeZone *)timeZone; + +/** + Track Events + + @param eventModel event Model + */ +- (void)trackWithEventModel:(TDEventModel *)eventModel; + +/** + Get the events collected in the App Extension and report them + + @param appGroupId The app group id required for data sharing + */ +- (void)trackFromAppExtensionWithAppGroupId:(NSString *)appGroupId; + +#pragma mark - + +/** + Timing Events + Record the event duration, call this method to start the timing, stop the timing when the target event is uploaded, and add the attribute #duration to the event properties, in seconds. + */ +- (void)timeEvent:(NSString *)event; + +/** + Identify + Set the distinct ID to replace the default UUID distinct ID. + */ +- (void)identify:(NSString *)distinctId; + +/** + Get Distinctid + Get a visitor ID: The #distinct_id value in the reported data. + */ +- (NSString *)getDistinctId; + +/** + Get sdk version + */ ++ (NSString *)getSDKVersion; + +/** + Login + Set the account ID. Each setting overrides the previous value. Login events will not be uploaded. + + @param accountId account ID + */ +- (void)login:(NSString *)accountId; + +/** + Logout + Clearing the account ID will not upload user logout events. + */ +- (void)logout; + +/** + User_Set + Sets the user property, replacing the original value with the new value if the property already exists. + + @param properties user properties + */ +- (void)user_set:(NSDictionary *)properties; + +/** + User_Set + + @param properties user properties + @param time event trigger time +*/ +- (void)user_set:(NSDictionary *)properties withTime:(NSDate * _Nullable)time; + +/** + User_Unset + + @param propertyName user properties + */ +- (void)user_unset:(NSString *)propertyName; + +/** + User_Unset + Reset user properties. + + @param propertyName user properties + @param time event trigger time +*/ +- (void)user_unset:(NSString *)propertyName withTime:(NSDate * _Nullable)time; + +/** + User_SetOnce + Sets a single user attribute, ignoring the new attribute value if the attribute already exists. + + @param properties user properties + */ +- (void)user_setOnce:(NSDictionary *)properties; + +/** + User_SetOnce + + @param properties user properties + @param time event trigger time +*/ +- (void)user_setOnce:(NSDictionary *)properties withTime:(NSDate * _Nullable)time; + +/** + User_Add + Adds the numeric type user attributes. + + @param properties user properties + */ +- (void)user_add:(NSDictionary *)properties; + +/** + User_Add + + @param properties user properties + @param time event trigger time +*/ +- (void)user_add:(NSDictionary *)properties withTime:(NSDate * _Nullable)time; + +/** + User_Add + + @param propertyName propertyName + @param propertyValue propertyValue + */ +- (void)user_add:(NSString *)propertyName andPropertyValue:(NSNumber *)propertyValue; + +/** + User_Add + + @param propertyName propertyName + @param propertyValue propertyValue + @param time event trigger time +*/ +- (void)user_add:(NSString *)propertyName andPropertyValue:(NSNumber *)propertyValue withTime:(NSDate * _Nullable)time; + +/** + User_Delete + Delete the user attributes,This operation is not reversible and should be performed with caution. + */ +- (void)user_delete; + +/** + User_Delete + + @param time event trigger time + */ +- (void)user_delete:(NSDate * _Nullable)time; + +/** + User_Append + Append a user attribute of the List type. + + @param properties user properties +*/ +- (void)user_append:(NSDictionary *)properties; + +/** + User_Append + The element appended to the library needs to be done to remove the processing,and then import. + + @param properties user properties + @param time event trigger time +*/ +- (void)user_append:(NSDictionary *)properties withTime:(NSDate * _Nullable)time; + +/** + User_UniqAppend + + @param properties user properties +*/ +- (void)user_uniqAppend:(NSDictionary *)properties; + +/** + User_UniqAppend + + @param properties user properties + @param time event trigger time +*/ +- (void)user_uniqAppend:(NSDictionary *)properties withTime:(NSDate * _Nullable)time; + ++ (void)setCustomerLibInfoWithLibName:(NSString *)libName libVersion:(NSString *)libVersion; + +/** + Static Super Properties + Set the public event attribute, which will be included in every event uploaded after that. The public event properties are saved without setting them each time. + * + */ +- (void)setSuperProperties:(NSDictionary *)properties; + +/** + Unset Super Property + Clears a public event attribute. + */ +- (void)unsetSuperProperty:(NSString *)property; + +/** + Clear Super Properties + Clear all public event attributes. + */ +- (void)clearSuperProperties; + +/** + Get Static Super Properties + Gets the public event properties that have been set. + */ +- (NSDictionary *)currentSuperProperties; + +/** + Dynamic super properties + Set dynamic public properties. Each event uploaded after that will contain a public event attribute. + */ +- (void)registerDynamicSuperProperties:(NSDictionary *(^)(void))dynamicSuperProperties; + + +/** + Dynamic super properties in auto track environment + Set dynamic public properties. Each event uploaded after that will contain a public event attribute. + */ +- (void)setAutoTrackDynamicProperties:(NSDictionary *(^)(void))dynamicSuperProperties; + +/** + Register TD error callback + + @param errorCallback + code = 10001, + ext = "string or json string", + errorMsg = "error" + */ +- (void)registerErrorCallback:(void(^)(NSInteger code, NSString * _Nullable errorMsg, NSString * _Nullable ext))errorCallback; + +/** + Gets prefabricated properties for all events. + */ +- (TDPresetProperties *)getPresetProperties; + +/** + Set the network conditions for uploading. By default, the SDK will set the network conditions as 3G, 4G and Wifi to upload data + */ +- (void)setNetworkType:(ThinkingAnalyticsNetworkType)type; + +#if TARGET_OS_IOS + +/** + Enable Auto-Tracking + + @param eventType Auto-Tracking type + + detailed documentation http://doc.thinkingdata.cn/tgamanual/installation/ios_sdk_installation/ios_sdk_autotrack.html + */ +- (void)enableAutoTrack:(ThinkingAnalyticsAutoTrackEventType)eventType; + +/** + Enable the auto tracking function. + + @param eventType Auto-Tracking type + @param properties properties + */ +- (void)enableAutoTrack:(ThinkingAnalyticsAutoTrackEventType)eventType properties:(NSDictionary *)properties; + +/** + Enable the auto tracking function. + + @param eventType Auto-Tracking type + @param callback callback + In the callback, eventType indicates the type of automatic collection, properties indicates the event properties before storage, and this block can return a dictionary for adding new properties + */ +- (void)enableAutoTrack:(ThinkingAnalyticsAutoTrackEventType)eventType callback:(NSDictionary *(^)(ThinkingAnalyticsAutoTrackEventType eventType, NSDictionary *properties))callback; + +/** + Set and Update the value of a custom property for Auto-Tracking + + @param eventType A list of ThinkingAnalyticsAutoTrackEventType, indicating the types of automatic collection events that need to be enabled + @param properties properties + */ +- (void)setAutoTrackProperties:(ThinkingAnalyticsAutoTrackEventType)eventType properties:(NSDictionary *)properties; + +/** + Ignore the Auto-Tracking of a page + + @param controllers Ignore the name of the UIViewController + */ +- (void)ignoreAutoTrackViewControllers:(NSArray *)controllers; + +/** + Ignore the Auto-Tracking of click event + + @param aClass ignored controls Class + */ +- (void)ignoreViewType:(Class)aClass; + +#endif + +//MARK: - + +/** + Get DeviceId + */ +- (NSString *)getDeviceId; + +/** + H5 is connected with the native APP SDK and used in conjunction with the addWebViewUserAgent interface + + @param webView webView + @param request NSURLRequest request + @return YES:Process this request NO: This request has not been processed + + detailed documentation http://doc.thinkingdata.cn/tgamanual/installation/h5_app_integrate.html + */ +- (BOOL)showUpWebView:(id)webView WithRequest:(NSURLRequest *)request; + +/** + When connecting data with H5, you need to call this interface to configure UserAgent + */ +- (void)addWebViewUserAgent; + +/** + Set Log level + + */ ++ (void)setLogLevel:(TDLoggingLevel)level; + +/** + Empty the cache queue. When this api is called, the data in the current cache queue will attempt to be reported. + If the report succeeds, local cache data will be deleted. + */ +- (void)flush; + +/** + Switch reporting status + + @param status TATrackStatus reporting status + */ +- (void)setTrackStatus: (TATrackStatus)status; + +- (void)enableTracking:(BOOL)enabled DEPRECATED_MSG_ATTRIBUTE("Please use instance method setTrackStatus: TATrackStatusPause"); + +- (void)optOutTracking DEPRECATED_MSG_ATTRIBUTE("Please use instance method setTrackStatus: TATrackStatusStop"); + +- (void)optOutTrackingAndDeleteUser DEPRECATED_MSG_ATTRIBUTE("Please use instance method setTrackStatus: TATrackStatusStop"); + +- (void)optInTracking DEPRECATED_MSG_ATTRIBUTE("Please use instance method setTrackStatus: TATrackStatusNormal"); + +/** + Create a light instance + */ +- (ThinkingAnalyticsSDK *)createLightInstance; + ++ (void)calibrateTimeWithNtp:(NSString *)ntpServer; + ++ (void)calibrateTime:(NSTimeInterval)timestamp; + +- (NSString *)getTimeString:(NSDate *)date; + +#if TARGET_OS_IOS +- (void)enableThirdPartySharing:(TAThirdPartyShareType)type; + +- (void)enableThirdPartySharing:(TAThirdPartyShareType)type customMap:(NSDictionary *)customMap; +#endif + ++ (nullable NSString *)getLocalRegion; + +@end + +NS_ASSUME_NONNULL_END diff --git a/Assets/HCMiniSdk/Third/ta/Plugins/iOS/ThinkingSDK/Source/main/ThinkingAnalyticsSDK.h.meta b/Assets/HCMiniSdk/Third/ta/Plugins/iOS/ThinkingSDK/Source/main/ThinkingAnalyticsSDK.h.meta new file mode 100644 index 00000000..9033870b --- /dev/null +++ b/Assets/HCMiniSdk/Third/ta/Plugins/iOS/ThinkingSDK/Source/main/ThinkingAnalyticsSDK.h.meta @@ -0,0 +1,33 @@ +fileFormatVersion: 2 +guid: 148eb28cb0e494f208a263fa8b46ec91 +PluginImporter: + externalObjects: {} + serializedVersion: 2 + iconMap: {} + executionOrder: {} + defineConstraints: [] + isPreloaded: 0 + isOverridable: 0 + isExplicitlyReferenced: 0 + validateReferences: 1 + platformData: + - first: + Any: + second: + enabled: 0 + settings: {} + - first: + Editor: Editor + second: + enabled: 0 + settings: + DefaultValueInitialized: true + - first: + iPhone: iOS + second: + enabled: 1 + settings: + AddToEmbeddedBinaries: false + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/HCMiniSdk/Third/ta/Plugins/iOS/ThinkingSDK/Source/main/ThinkingAnalyticsSDK.m b/Assets/HCMiniSdk/Third/ta/Plugins/iOS/ThinkingSDK/Source/main/ThinkingAnalyticsSDK.m new file mode 100755 index 00000000..6dcdf266 --- /dev/null +++ b/Assets/HCMiniSdk/Third/ta/Plugins/iOS/ThinkingSDK/Source/main/ThinkingAnalyticsSDK.m @@ -0,0 +1,1471 @@ +#import "ThinkingAnalyticsSDKPrivate.h" + +#if TARGET_OS_IOS +#import "TDAutoTrackManager.h" +//#import "TARouter.h" +#import "TDAppLaunchReason.h" +#import "TAPushClickEvent.h" +#endif + +#import "TDCalibratedTimeWithNTP.h" +#import "TDConfig.h" +#import "TDPublicConfig.h" +#import "TDFile.h" +#import "TDCheck.h" +#import "TDJSONUtil.h" +#import "NSString+TDString.h" +#import "TDPresetProperties+TDDisProperties.h" +#import "TDAppState.h" +#import "TDEventRecord.h" +#import "TAAppExtensionAnalytic.h" +#import "TAReachability.h" +#import "TAAppLifeCycle.h" +//#import "TASessionIdPropertyPlugin.h" +//#import "TASessionIdManager.h" + + +#if !__has_feature(objc_arc) +#error The ThinkingSDK library must be compiled with ARC enabled +#endif + +#define td_force_inline __inline__ __attribute__((always_inline)) + +@interface TDPresetProperties (ThinkingAnalytics) + +- (instancetype)initWithDictionary:(NSDictionary *)dict; +- (void)updateValuesWithDictionary:(NSDictionary *)dict; + +@end + +@interface ThinkingAnalyticsSDK () +@property (nonatomic, strong) TAEventTracker *eventTracker; +@property (strong,nonatomic) TDFile *file; + +@end + +@implementation ThinkingAnalyticsSDK + +static NSMutableDictionary *instances; +static NSString *defaultProjectAppid; +static TDCalibratedTime *calibratedTime; +static dispatch_queue_t td_trackQueue; + ++ (nullable ThinkingAnalyticsSDK *)sharedInstance { + if (instances.count == 0) { + TDLogError(@"sharedInstance called before creating a Thinking instance"); + return nil; + } + return instances[defaultProjectAppid]; +} + ++ (ThinkingAnalyticsSDK *)sharedInstanceWithAppid:(NSString *)appid { + appid = appid.td_trim; + if (instances[appid]) { + return instances[appid]; + } else { + TDLogError(@"sharedInstanceWithAppid called before creating a Thinking instance"); + return nil; + } +} + ++ (ThinkingAnalyticsSDK *)startWithAppId:(NSString *)appId withUrl:(NSString *)url withConfig:(TDConfig *)config { + appId = appId.td_trim; + + NSString *name = config.name; + if (name && [name isKindOfClass:[NSString class]] && name.length) { + if (instances[name]) { + return instances[name]; + } else { + return [[self alloc] initWithAppkey:appId withServerURL:url withConfig:config]; + } + } + + if (instances[appId]) { + return instances[appId]; + } else if (![url isKindOfClass:[NSString class]] || url.length == 0) { + return nil; + } + return [[self alloc] initWithAppkey:appId withServerURL:url withConfig:config]; +} + ++ (ThinkingAnalyticsSDK *)startWithAppId:(NSString *)appId withUrl:(NSString *)url { + return [ThinkingAnalyticsSDK startWithAppId:appId withUrl:url withConfig:nil]; +} + + ++ (ThinkingAnalyticsSDK *)startWithConfig:(nullable TDConfig *)config { + return [ThinkingAnalyticsSDK startWithAppId:config.appid withUrl:config.configureURL withConfig:config]; +} + +- (instancetype)init:(NSString *)appID { + if (self = [super init]) { + static dispatch_once_t onceToken; + dispatch_once(&onceToken, ^{ + instances = [NSMutableDictionary dictionary]; + defaultProjectAppid = appID; + }); + } + return self; +} + ++ (void)initialize { + static dispatch_once_t ThinkingOnceToken; + dispatch_once(&ThinkingOnceToken, ^{ + NSString *queuelabel = [NSString stringWithFormat:@"cn.thinkingdata.%p", (void *)self]; + td_trackQueue = dispatch_queue_create([queuelabel UTF8String], DISPATCH_QUEUE_SERIAL); + }); +} + ++ (dispatch_queue_t)td_trackQueue { + return td_trackQueue; +} + +- (instancetype)initLight:(NSString *)appid withServerURL:(NSString *)serverURL withConfig:(TDConfig *)config { + if (self = [self init]) { + serverURL = [serverURL ta_formatUrlString]; + self.isEnabled = YES; + + self.appid = appid; + self.serverURL = serverURL; + self.config = [config copy]; + self.config.appid = appid; + self.config.configureURL = serverURL; + self.config.appid = appid; + + self.superProperty = [[TASuperProperty alloc] initWithToken:[self td_getMapInstanceTag] isLight:YES]; + + self.trackTimer = [[TATrackTimer alloc] init]; + + if (![TDPresetProperties disableNetworkType]) { + [[TAReachability shareInstance] startMonitoring]; + } + + self.file = [[TDFile alloc] initWithAppid:appid]; + + self.dataQueue = [TDSqliteDataQueue sharedInstanceWithAppid:appid]; + if (self.dataQueue == nil) { + TDLogError(@"SqliteException: init SqliteDataQueue failed"); + } + + self.eventTracker = [[TAEventTracker alloc] initWithQueue:td_trackQueue instanceToken:[config getMapInstanceToken]]; + } + return self; +} + +- (instancetype)initWithAppkey:(NSString *)appid withServerURL:(NSString *)serverURL withConfig:(TDConfig *)config { + if (self = [self init:appid]) { + + [TDAppState shareInstance]; + // [TASessionIdManager shareInstance]; + + serverURL = [serverURL ta_formatUrlString]; + self.serverURL = serverURL; + self.appid = appid; + + if (!config) { + config = TDConfig.defaultTDConfig; + } + + _config = [config copy]; + _config.appid = appid; + _config.configureURL = serverURL; + + instances[[self td_getMapInstanceTag]] = self; + + self.file = [[TDFile alloc] initWithAppid:[self td_getMapInstanceTag]]; + [self retrievePersistedData]; + + self.superProperty = [[TASuperProperty alloc] initWithToken:[self td_getMapInstanceTag] isLight:NO]; + + self.propertyPluginManager = [[TAPropertyPluginManager alloc] init]; + TAPresetPropertyPlugin *presetPlugin = [[TAPresetPropertyPlugin alloc] init]; + presetPlugin.defaultTimeZone = config.defaultTimeZone; + [self.propertyPluginManager registerPropertyPlugin:presetPlugin]; + + NSString *instanceName = [self td_getMapInstanceTag]; + + _config.getInstanceName = ^NSString * _Nonnull{ + return instanceName; + }; + + /* remove session plugin + TASessionIdPropertyPlugin *sessionidPlugin = [[TASessionIdPropertyPlugin alloc] init]; + sessionidPlugin.instanceToken = instanceName; + self.sessionidPlugin = sessionidPlugin; + [self.propertyPluginManager registerPropertyPlugin:sessionidPlugin]; + */ +#if TARGET_OS_IOS + + if (_config.enableEncrypt) { + self.encryptManager = [[TDEncryptManager alloc] initWithConfig:config]; + } + + __weak __typeof(self)weakSelf = self; + [_config updateConfig:^(NSDictionary * _Nonnull secretKey) { + if (weakSelf.config.enableEncrypt && secretKey) { + [weakSelf.encryptManager handleEncryptWithConfig:secretKey]; + } + }]; + +#elif TARGET_OS_OSX + [_config updateConfig:^(NSDictionary * _Nonnull secretKey) {}]; +#endif + + self.trackTimer = [[TATrackTimer alloc] init]; + + _ignoredViewControllers = [[NSMutableSet alloc] init]; + _ignoredViewTypeList = [[NSMutableSet alloc] init]; + + self.dataQueue = [TDSqliteDataQueue sharedInstanceWithAppid:[self td_getMapInstanceTag]]; + if (self.dataQueue == nil) { + TDLogError(@"SqliteException: init SqliteDataQueue failed"); + } + + if (![TDPresetProperties disableNetworkType]) { + [[TAReachability shareInstance] startMonitoring]; + } + + self.eventTracker = [[TAEventTracker alloc] initWithQueue:td_trackQueue instanceToken:[_config getMapInstanceToken]]; + + [self startFlushTimer]; + + [TAAppLifeCycle startMonitor]; + + [self registerAppLifeCycleListener]; + +#if TARGET_OS_IOS + NSDictionary* ops = [TDAppLaunchReason getAppPushDic]; + if(ops != nil){ + TAPushClickEvent *pushEvent = [[TAPushClickEvent alloc]initWithName: @"ops_push_click"]; + pushEvent.ops = ops; + [self autoTrackWithEvent:pushEvent properties:@{}]; + [self flush]; + } + [TDAppLaunchReason clearAppPushParams]; +#endif + + if ([self ableMapInstanceTag]) { + TDLogInfo(@"Thinking Analytics %@ SDK %@ instance initialized successfully with mode: %@, Instance Name: %@, APP ID: %@, server url: %@, device ID: %@", [[TDDeviceInfo sharedManager] libName] ,[TDDeviceInfo libVersion], [self modeEnumToString:_config.debugMode], _config.name, appid, serverURL, [self getDeviceId]); + + } else { + TDLogInfo(@"Thinking Analytics %@ SDK %@ instance initialized successfully with mode: %@, APP ID: %@, server url: %@, device ID: %@", [[TDDeviceInfo sharedManager] libName], [TDDeviceInfo libVersion], [self modeEnumToString:_config.debugMode], appid, serverURL, [self getDeviceId]); + + } + + } + return self; +} + +- (void)registerAppLifeCycleListener { + NSNotificationCenter *notificationCenter = [NSNotificationCenter defaultCenter]; + + [notificationCenter addObserver:self selector:@selector(appStateWillChangeNotification:) name:kTAAppLifeCycleStateWillChangeNotification object:nil]; + [notificationCenter addObserver:self selector:@selector(appStateDidChangeNotification:) name:kTAAppLifeCycleStateDidChangeNotification object:nil]; +} + +- (NSString*)modeEnumToString:(ThinkingAnalyticsDebugMode)enumVal { + NSArray *modeEnumArray = [[NSArray alloc] initWithObjects:kModeEnumArray]; + return [modeEnumArray objectAtIndex:enumVal]; +} + +- (BOOL)ableMapInstanceTag { + return _config.name && [_config.name isKindOfClass:[NSString class]] && _config.name.length; +} + +- (NSString *)td_getMapInstanceTag { + return [self.config getMapInstanceToken]; +} + +- (NSString *)description { + if ([self ableMapInstanceTag]) { + return [NSString stringWithFormat:@"", (void *)self, _config.name, self.appid, self.serverURL]; + } else { + return [NSString stringWithFormat:@"", (void *)self, self.appid, self.serverURL]; + } +} + ++ (id)sharedUIApplication { + return [TDAppState sharedApplication]; +} + +- (void)setTrackStatus: (TATrackStatus)status { + switch (status) { + case TATrackStatusPause: { + TDLogDebug(@"%@ switchTrackStatus: TATrackStatusPause...", self); + [self enableTracking:NO]; + break; + } + case TATrackStatusStop: { + TDLogDebug(@"%@ switchTrackStatus: TATrackStatusStop...", self); + [self doOptOutTracking]; + break; + } + case TATrackStatusSaveOnly: { + TDLogDebug(@"%@ switchTrackStatus: TATrackStatusSaveOnly...", self); + self.trackPause = YES; + self.isEnabled = YES; + self.isOptOut = NO; + dispatch_async(td_trackQueue, ^{ + [self.file archiveTrackPause:YES]; + [self.file archiveIsEnabled:YES]; + [self.file archiveOptOut:NO]; + }); + break; + } + case TATrackStatusNormal: { + TDLogDebug(@"%@ switchTrackStatus: TATrackStatusNormal...", self); + self.trackPause = NO; + self.isEnabled = YES; + self.isOptOut = NO; + dispatch_async(td_trackQueue, ^{ + [self.file archiveTrackPause:NO]; + [self.file archiveIsEnabled:self.isEnabled]; + [self.file archiveOptOut:NO]; + }); + [self flush]; + break; + } + default: + break; + } +} + +#pragma mark - EnableTracking +- (void)enableTracking:(BOOL)enabled { + self.isEnabled = enabled; + dispatch_async(td_trackQueue, ^{ + [self.file archiveIsEnabled:self.isEnabled]; + }); +} + +- (void)optOutTracking { + TDLogDebug(@"%@ optOutTracking...", self); + [self doOptOutTracking]; +} + +- (void)optOutTrackingAndDeleteUser { + TDLogDebug(@"%@ optOutTrackingAndDeleteUser...", self); + TAUserEventDelete *deleteEvent = [[TAUserEventDelete alloc] init]; + deleteEvent.immediately = YES; + [self asyncUserEventObject:deleteEvent properties:nil isH5:NO]; + + [self doOptOutTracking]; +} + +- (void)optInTracking { + TDLogDebug(@"%@ optInTracking...", self); + self.isOptOut = NO; + dispatch_async(td_trackQueue, ^{ + [self.file archiveOptOut:NO]; + }); +} + +- (BOOL)hasDisabled { + return !self.isEnabled || self.isOptOut; +} + +- (void)doOptOutTracking { + self.isOptOut = YES; + +#if TARGET_OS_IOS + @synchronized (self.autoTrackSuperProperty) { + [self.autoTrackSuperProperty clearSuperProperties]; + } +#endif + + [self.superProperty registerDynamicSuperProperties:nil]; + + void(^block)(void) = ^{ + [self.dataQueue deleteAll:[self td_getMapInstanceTag]]; + [self.trackTimer clear]; + [self.superProperty clearSuperProperties]; + self.identifyId = [TDDeviceInfo sharedManager].uniqueId; + self.accountId = nil; + + [self.file archiveAccountID:nil]; + [self.file archiveIdentifyId:nil]; + [self.file archiveSuperProperties:nil]; + [self.file archiveOptOut:YES]; + }; + if (dispatch_queue_get_label(DISPATCH_CURRENT_QUEUE_LABEL) == dispatch_queue_get_label(td_trackQueue)) { + block(); + } else { + dispatch_async(td_trackQueue, block); + } +} + +#pragma mark - LightInstance +- (ThinkingAnalyticsSDK *)createLightInstance { + ThinkingAnalyticsSDK *lightInstance = [[LightThinkingAnalyticsSDK alloc] initWithAPPID:self.appid withServerURL:self.serverURL withConfig:self.config]; + lightInstance.identifyId = [TDDeviceInfo sharedManager].uniqueId; + lightInstance.propertyPluginManager = self.propertyPluginManager; + return lightInstance; +} + +#pragma mark - Persistence +- (void)retrievePersistedData { + self.accountId = [self.file unarchiveAccountID]; + self.identifyId = [self.file unarchiveIdentifyID]; + self.trackPause = [self.file unarchiveTrackPause]; + self.isEnabled = [self.file unarchiveEnabled]; + self.isOptOut = [self.file unarchiveOptOut]; + self.config.uploadSize = [self.file unarchiveUploadSize]; + self.config.uploadInterval = [self.file unarchiveUploadInterval]; + if (self.identifyId.length == 0) { + self.identifyId = [TDDeviceInfo sharedManager].uniqueId; + } + if (self.accountId.length == 0) { + self.accountId = [self.file unarchiveAccountID]; + [self.file archiveAccountID:self.accountId]; + [self.file deleteOldLoginId]; + } +} + +- (void)deleteAll { + dispatch_async(td_trackQueue, ^{ + @synchronized (TDSqliteDataQueue.class) { + [self.dataQueue deleteAll:[self td_getMapInstanceTag]]; + } + }); +} + +//MARK: - AppLifeCycle + +- (void)appStateWillChangeNotification:(NSNotification *)notification { + TAAppLifeCycleState newState = [[notification.userInfo objectForKey:kTAAppLifeCycleNewStateKey] integerValue]; + + if (newState == TAAppLifeCycleStateEnd) { + [self stopFlushTimer]; + } +} + + +- (void)appStateDidChangeNotification:(NSNotification *)notification { + TAAppLifeCycleState newState = [[notification.userInfo objectForKey:kTAAppLifeCycleNewStateKey] integerValue]; + + if (newState == TAAppLifeCycleStateStart) { + [self startFlushTimer]; + + // 更新时长统计 + NSTimeInterval systemUpTime = [TDDeviceInfo uptime]; + [self.trackTimer enterForegroundWithSystemUptime:systemUpTime]; + } else if (newState == TAAppLifeCycleStateEnd) { + // 更新事件时长统计 + NSTimeInterval systemUpTime = [TDDeviceInfo uptime]; + [self.trackTimer enterBackgroundWithSystemUptime:systemUpTime]; + +#if TARGET_OS_IOS + UIApplication *application = [TDAppState sharedApplication];; + __block UIBackgroundTaskIdentifier backgroundTaskIdentifier = UIBackgroundTaskInvalid; + void (^endBackgroundTask)(void) = ^() { + [application endBackgroundTask:backgroundTaskIdentifier]; + backgroundTaskIdentifier = UIBackgroundTaskInvalid; + }; + backgroundTaskIdentifier = [application beginBackgroundTaskWithExpirationHandler:endBackgroundTask]; + + [self.eventTracker _asyncWithCompletion:endBackgroundTask]; +#else + [self.eventTracker flush]; +#endif + + } else if (newState == TAAppLifeCycleStateTerminate) { + dispatch_sync(td_trackQueue, ^{}); + [self.eventTracker syncSendAllData]; + } +} + +// MARK: - + +- (void)setNetworkType:(ThinkingAnalyticsNetworkType)type { + if ([self hasDisabled]) + return; + + [self.config setNetworkType:type]; +} + ++ (NSString *)getNetWorkStates { + return [[TAReachability shareInstance] networkState]; +} + +//MARK: - Track + +- (void)track:(NSString *)event { + [self track:event properties:nil]; +} + +- (void)track:(NSString *)event properties:(NSDictionary *)propertiesDict { +#pragma clang diagnostic push +#pragma clang diagnostic ignored "-Wnonnull" + [self track:event properties:propertiesDict time:nil timeZone:nil]; +#pragma clang diagnostic pop +} + +// deprecated +- (void)track:(NSString *)event properties:(NSDictionary *)propertiesDict time:(NSDate *)time { +#pragma clang diagnostic push +#pragma clang diagnostic ignored "-Wnonnull" + [self track:event properties:propertiesDict time:time timeZone:nil]; +#pragma clang diagnostic pop +} + +- (void)track:(NSString *)event properties:(nullable NSDictionary *)properties time:(NSDate *)time timeZone:(NSTimeZone *)timeZone { + TATrackEvent *trackEvent = [[TATrackEvent alloc] initWithName:event]; + // TDLogDebug(@"##### track.systemUpTime: %lf", trackEvent.systemUpTime); + [self configEventTimeValueWithEvent:trackEvent time:time timeZone:timeZone]; + [self handleTimeEvent:trackEvent]; + [self asyncTrackEventObject:trackEvent properties:properties isH5:NO]; +} + +- (void)trackWithEventModel:(TDEventModel *)eventModel { + TATrackEvent *baseEvent = nil; + if ([eventModel.eventType isEqualToString:TD_EVENT_TYPE_TRACK_FIRST]) { + TATrackFirstEvent *trackEvent = [[TATrackFirstEvent alloc] initWithName:eventModel.eventName]; + [self configEventTimeValueWithEvent:trackEvent time:eventModel.time timeZone:eventModel.timeZone]; + trackEvent.firstCheckId = eventModel.extraID; + baseEvent = trackEvent; + } else if ([eventModel.eventType isEqualToString:TD_EVENT_TYPE_TRACK_UPDATE]) { + TATrackUpdateEvent *trackEvent = [[TATrackUpdateEvent alloc] initWithName:eventModel.eventName]; + [self configEventTimeValueWithEvent:trackEvent time:eventModel.time timeZone:eventModel.timeZone]; + trackEvent.eventId = eventModel.extraID; + baseEvent = trackEvent; + } else if ([eventModel.eventType isEqualToString:TD_EVENT_TYPE_TRACK_OVERWRITE]) { + TATrackOverwriteEvent *trackEvent = [[TATrackOverwriteEvent alloc] initWithName:eventModel.eventName]; + [self configEventTimeValueWithEvent:trackEvent time:eventModel.time timeZone:eventModel.timeZone]; + trackEvent.eventId = eventModel.extraID; + baseEvent = trackEvent; + } else if ([eventModel.eventType isEqualToString:TD_EVENT_TYPE_TRACK]) { + TATrackEvent *trackEvent = [[TATrackEvent alloc] initWithName:eventModel.eventName]; + [self configEventTimeValueWithEvent:trackEvent time:eventModel.time timeZone:eventModel.timeZone]; + baseEvent = trackEvent; + } + [self asyncTrackEventObject:baseEvent properties:eventModel.properties isH5:NO]; +} + +- (void)trackFromAppExtensionWithAppGroupId:(NSString *)appGroupId { + @try { + if (appGroupId == nil || [appGroupId isEqualToString:@""]) { + return; + } + + TAAppExtensionAnalytic *analytic = [TAAppExtensionAnalytic analyticWithInstanceName:[self td_getMapInstanceTag] appGroupId:appGroupId]; + NSArray *eventArray = [analytic readAllEvents]; + if (eventArray) { + for (NSDictionary *dict in eventArray) { + NSString *eventName = dict[kTAAppExtensionEventName]; + NSDictionary *properties = dict[kTAAppExtensionEventProperties]; + NSDate *time = dict[kTAAppExtensionTime]; + // track event + if ([time isKindOfClass:NSDate.class]) { +#pragma clang diagnostic push +#pragma clang diagnostic ignored "-Wnonnull" + [self track:eventName properties:properties time:time timeZone:nil]; +#pragma clang diagnostic pop + } else { + [self track:eventName properties:properties]; + } + } + [analytic deleteEvents]; + } + } @catch (NSException *exception) { + return; + } +} + +#pragma mark - Private + +- (void)asyncTrackEventObject:(TATrackEvent *)event properties:(NSDictionary *)properties isH5:(BOOL)isH5 { + + event.isEnabled = self.isEnabled; + event.trackPause = self.isTrackPause; + event.isOptOut = self.isOptOut; + event.accountId = self.accountId; + event.distinctId = self.identifyId; + + event.dynamicSuperProperties = [self.superProperty obtainDynamicSuperProperties]; + dispatch_async(td_trackQueue, ^{ + [self trackEvent:event properties:properties isH5:isH5]; + }); +} + +- (void)asyncUserEventObject:(TAUserEvent *)event properties:(NSDictionary *)properties isH5:(BOOL)isH5 { + + event.isEnabled = self.isEnabled; + event.trackPause = self.isTrackPause; + event.isOptOut = self.isOptOut; + event.accountId = self.accountId; + event.distinctId = self.identifyId; + + [self configEventTimeValueWithEvent:event time:event.time timeZone:event.timeZone]; + + dispatch_async(td_trackQueue, ^{ + [self trackUserEvent:event properties:properties isH5:NO]; + }); +} + +- (void)configEventTimeValueWithEvent:(TABaseEvent *)event time:(NSDate *)time timeZone:(NSTimeZone *)timeZone { + event.timeZone = timeZone ?: self.config.defaultTimeZone; + if (time) { + event.time = time; + if (timeZone == nil) { + event.timeValueType = TAEventTimeValueTypeTimeOnly; + } else { + event.timeValueType = TAEventTimeValueTypeTimeAndZone; + } + } else { + if (calibratedTime && !calibratedTime.stopCalibrate) { + NSTimeInterval outTime = [TDDeviceInfo uptime] - calibratedTime.systemUptime; + NSDate *serverDate = [NSDate dateWithTimeIntervalSince1970:(calibratedTime.serverTime + outTime)]; + event.time = serverDate; + event.timeValueType = TAEventTimeValueTypeTimeAndZone; + }else{ + event.timeValueType = TAEventTimeValueTypeNone; + } + } +} + ++ (BOOL)isTrackEvent:(NSString *)eventType { + return [TD_EVENT_TYPE_TRACK isEqualToString:eventType] + || [TD_EVENT_TYPE_TRACK_FIRST isEqualToString:eventType] + || [TD_EVENT_TYPE_TRACK_UPDATE isEqualToString:eventType] + || [TD_EVENT_TYPE_TRACK_OVERWRITE isEqualToString:eventType] + ; +} + +#pragma mark - User + +- (void)user_add:(NSString *)propertyName andPropertyValue:(NSNumber *)propertyValue { + [self user_add:propertyName andPropertyValue:propertyValue withTime:nil]; +} + +- (void)user_add:(NSString *)propertyName andPropertyValue:(NSNumber *)propertyValue withTime:(NSDate *)time { + if (propertyName && propertyValue) { + [self user_add:@{propertyName: propertyValue} withTime:time]; + } +} + +- (void)user_add:(NSDictionary *)properties { + [self user_add:properties withTime:nil]; +} + +- (void)user_add:(NSDictionary *)properties withTime:(NSDate *)time { + TAUserEventAdd *event = [[TAUserEventAdd alloc] init]; + event.time = time; + [self asyncUserEventObject:event properties:properties isH5:NO]; +} + +- (void)user_setOnce:(NSDictionary *)properties { + [self user_setOnce:properties withTime:nil]; +} + +- (void)user_setOnce:(NSDictionary *)properties withTime:(NSDate *)time { + TAUserEventSetOnce *event = [[TAUserEventSetOnce alloc] init]; + event.time = time; + [self asyncUserEventObject:event properties:properties isH5:NO]; +} + +- (void)user_set:(NSDictionary *)properties { + [self user_set:properties withTime:nil]; +} + +- (void)user_set:(NSDictionary *)properties withTime:(NSDate *)time { + TAUserEventSet *event = [[TAUserEventSet alloc] init]; + event.time = time; + [self asyncUserEventObject:event properties:properties isH5:NO]; +} + +- (void)user_unset:(NSString *)propertyName { + [self user_unset:propertyName withTime:nil]; +} + +- (void)user_unset:(NSString *)propertyName withTime:(NSDate *)time { + if ([propertyName isKindOfClass:[NSString class]] && propertyName.length > 0) { + NSDictionary *properties = @{propertyName: @0}; + TAUserEventUnset *event = [[TAUserEventUnset alloc] init]; + event.time = time; + [self asyncUserEventObject:event properties:properties isH5:NO]; + } +} + +- (void)user_delete { + [self user_delete:nil]; +} + +- (void)user_delete:(NSDate *)time { + TAUserEventDelete *event = [[TAUserEventDelete alloc] init]; + event.time = time; + [self asyncUserEventObject:event properties:nil isH5:NO]; +} + +- (void)user_append:(NSDictionary *)properties { + [self user_append:properties withTime:nil]; +} + +- (void)user_append:(NSDictionary *)properties withTime:(NSDate *)time { + TAUserEventAppend *event = [[TAUserEventAppend alloc] init]; + event.time = time; + [self asyncUserEventObject:event properties:properties isH5:NO]; +} + +- (void)user_uniqAppend:(NSDictionary *)properties { + [self user_uniqAppend:properties withTime:nil]; +} + +- (void)user_uniqAppend:(NSDictionary *)properties withTime:(NSDate *)time { + TAUserEventUniqueAppend *event = [[TAUserEventUniqueAppend alloc] init]; + event.time = time; + [self asyncUserEventObject:event properties:properties isH5:NO]; +} + +//MARK: - + ++ (void)setCustomerLibInfoWithLibName:(NSString *)libName libVersion:(NSString *)libVersion { + if (libName.length > 0) { + [TDDeviceInfo sharedManager].libName = libName; + } + if (libVersion.length > 0) { + [TDDeviceInfo sharedManager].libVersion = libVersion; + } + [[TDDeviceInfo sharedManager] td_updateData]; +} + +- (NSString *)getAccountId { + return _accountId; +} + +- (NSString *)getDistinctId { + return [self.identifyId copy]; +} + ++ (NSString *)getSDKVersion { + return TDPublicConfig.version; +} + +- (NSString *)getDeviceId { + return [TDDeviceInfo sharedManager].deviceId; +} + +- (void)registerDynamicSuperProperties:(NSDictionary *(^)(void)) dynamicSuperProperties { + if ([self hasDisabled]) { + return; + } + @synchronized (self.superProperty) { + [self.superProperty registerDynamicSuperProperties:dynamicSuperProperties]; + } +} + +- (void)setAutoTrackDynamicProperties:(NSDictionary * _Nonnull (^)(void))dynamicSuperProperties { + if ([self hasDisabled]) { + return; + } + @synchronized (self.autoTrackSuperProperty) { + [self.autoTrackSuperProperty registerAutoTrackDynamicProperties:dynamicSuperProperties]; + } +} + +- (void)registerErrorCallback:(void (^)(NSInteger, NSString * _Nullable, NSString * _Nullable))errorCallback { + self.errorCallback = errorCallback; +} + +- (void)setSuperProperties:(NSDictionary *)properties { + if ([self hasDisabled]) { + return; + } + + dispatch_async(td_trackQueue, ^{ + [self.superProperty registerSuperProperties:properties]; + }); +} + +- (void)unsetSuperProperty:(NSString *)propertyKey { + if ([self hasDisabled]) { + return; + } + dispatch_async(td_trackQueue, ^{ + [self.superProperty unregisterSuperProperty:propertyKey]; + }); +} + +- (void)clearSuperProperties { + if ([self hasDisabled]) { + return; + } + dispatch_async(td_trackQueue, ^{ + [self.superProperty clearSuperProperties]; + }); +} + +- (NSDictionary *)currentSuperProperties { + return [self.superProperty currentSuperProperties]; +} + +- (TDPresetProperties *)getPresetProperties { + NSMutableDictionary *presetDic = [NSMutableDictionary dictionary]; + + NSDictionary *pluginProperties = [self.propertyPluginManager currentPropertiesForPluginClasses:@[TAPresetPropertyPlugin.class]]; + [presetDic addEntriesFromDictionary:pluginProperties]; + + double offset = [[NSDate date] ta_timeZoneOffset:self.config.defaultTimeZone]; + [presetDic setObject:@(offset) forKey:@"#zone_offset"]; + + if (![TDPresetProperties disableNetworkType]) { + NSString *networkType = [self.class getNetWorkStates]; + [presetDic setObject:networkType?:@"" forKey:@"#network_type"]; + } + + // 将安装时间转为字符串 + if (![TDPresetProperties disableInstallTime]) { + if (presetDic[@"#install_time"] && [presetDic[@"#install_time"] isKindOfClass:[NSDate class]]) { + NSString *install_timeString = [(NSDate *)presetDic[@"#install_time"] ta_formatWithTimeZone:self.config.defaultTimeZone formatString:kDefaultTimeFormat]; + if (install_timeString && install_timeString.length) { + [presetDic setObject:install_timeString forKey:@"#install_time"]; + } + } + } + + static TDPresetProperties *presetProperties = nil; + if (presetProperties == nil) { + presetProperties = [[TDPresetProperties alloc] initWithDictionary:presetDic]; + } else { + @synchronized (instances) { + [presetProperties updateValuesWithDictionary:presetDic]; + } + } + + return presetProperties; +} + +- (void)identify:(NSString *)distinctId { + if (![distinctId isKindOfClass:[NSString class]] || distinctId.length == 0) { + TDLogError(@"identify cannot null"); + return; + } + if ([self hasDisabled]) { + return; + } + self.identifyId = distinctId; + @synchronized (self.file) { + [self.file archiveIdentifyId:distinctId]; + } +} + +- (void)login:(NSString *)accountId { + if (![accountId isKindOfClass:[NSString class]] || accountId.length == 0) { + TDLogError(@"accountId invald", accountId); + return; + } + + if ([self hasDisabled]) { + return; + } + self.accountId = accountId; + @synchronized (self.file) { + [self.file archiveAccountID:accountId]; + } +} + +- (void)logout { + if ([self hasDisabled]) { + return; + } + self.accountId = nil; + @synchronized (self.file) { + [self.file archiveAccountID:nil]; + } +} + +- (void)timeEvent:(NSString *)event { + if ([self hasDisabled]) { + return; + } + NSError *error = nil; + [TAPropertyValidator validateEventOrPropertyName:event withError:&error]; + if (error) { + return; + } + [self.trackTimer trackEvent:event withSystemUptime:[TDDeviceInfo uptime]]; +} + ++ (nullable NSString *)getLocalRegion { + NSString *countryCode = [[NSLocale currentLocale] objectForKey: NSLocaleCountryCode]; + return countryCode; +} + +//MARK: - + +- (void)configBaseEvent:(TABaseEvent *)event isH5:(BOOL)isH5 { + + if (event.timeZone == nil) { + event.timeZone = self.config.defaultTimeZone; + } + + if (event.timeValueType == TAEventTimeValueTypeNone && calibratedTime && !calibratedTime.stopCalibrate) { + NSTimeInterval outTime = [TDDeviceInfo uptime] - calibratedTime.systemUptime; + NSDate *serverDate = [NSDate dateWithTimeIntervalSince1970:(calibratedTime.serverTime + outTime)]; + event.time = serverDate; + } +} + +- (void)trackUserEvent:(TAUserEvent *)event properties:(NSDictionary *)properties isH5:(BOOL)isH5 { + + if (!event.isEnabled || event.isOptOut) { + return; + } + + if ([TDAppState shareInstance].relaunchInBackground && !self.config.trackRelaunchedInBackgroundEvents) { + return; + } + + [self configBaseEvent:event isH5:isH5]; + + [event.properties addEntriesFromDictionary:[TAPropertyValidator validateProperties:properties validator:event]]; + + NSDictionary *jsonObj = [event formatDateWithDict:event.jsonObject]; + + [self.eventTracker track:jsonObj immediately:event.immediately saveOnly:event.isTrackPause]; +} + +- (void)trackEvent:(TATrackEvent *)event properties:(NSDictionary *)properties isH5:(BOOL)isH5 { + + if (!event.isEnabled || event.isOptOut) { + return; + } + + if ([TDAppState shareInstance].relaunchInBackground && !self.config.trackRelaunchedInBackgroundEvents && [event.eventName isEqualToString:TD_APP_START_BACKGROUND_EVENT]) { + return; + } + + [self configBaseEvent:event isH5:isH5]; + + NSError *error = nil; + [event validateWithError:&error]; + if (error) { + return; + } + + if ([self.config.disableEvents containsObject:event.eventName]) { + return; + } + + + if ([TDAppState shareInstance].relaunchInBackground) { + event.properties[@"#relaunched_in_background"] = @YES; + } + + NSMutableDictionary *pluginProperties = [self.propertyPluginManager propertiesWithEventType:event.eventType]; + + [TDPresetProperties handleFilterDisPresetProperties:pluginProperties]; + + NSDictionary *superProperties = [TAPropertyValidator validateProperties:self.superProperty.currentSuperProperties validator:event]; + + NSDictionary *dynamicSuperProperties = [TAPropertyValidator validateProperties:event.dynamicSuperProperties validator:event]; + + NSMutableDictionary *jsonObj = [NSMutableDictionary dictionary]; + + + if (isH5) { + event.properties = [superProperties mutableCopy]; + [event.properties addEntriesFromDictionary:dynamicSuperProperties]; + [event.properties addEntriesFromDictionary:properties]; + [event.properties addEntriesFromDictionary:pluginProperties]; + + jsonObj = event.jsonObject; + + + if (event.h5TimeString) { + jsonObj[@"#time"] = event.h5TimeString; + } + if (event.h5ZoneOffSet) { + jsonObj[@"#zone_offset"] = event.h5ZoneOffSet; + } + } else { + [event.properties addEntriesFromDictionary:pluginProperties]; + + jsonObj = event.jsonObject; + [event.properties addEntriesFromDictionary:superProperties]; + [event.properties addEntriesFromDictionary:dynamicSuperProperties]; +#if TARGET_OS_IOS + if ([event isKindOfClass:[TAAutoTrackEvent class]]) { + TAAutoTrackEvent *autoEvent = (TAAutoTrackEvent *)event; + + NSDictionary *autoSuperProperties = [self.autoTrackSuperProperty currentSuperPropertiesWithEventName:event.eventName]; + + autoSuperProperties = [TAPropertyValidator validateProperties:autoSuperProperties validator:autoEvent]; + + [event.properties addEntriesFromDictionary:autoSuperProperties]; + + + dispatch_semaphore_t semaphore = dispatch_semaphore_create(0); + dispatch_async(dispatch_get_main_queue(), ^{ + NSDictionary *autoDynamicSuperProperties = [self.autoTrackSuperProperty obtainDynamicSuperPropertiesWithType:autoEvent.autoTrackEventType currentProperties:event.properties]; + autoDynamicSuperProperties = [TAPropertyValidator validateProperties:autoDynamicSuperProperties validator:autoEvent]; + [event.properties addEntriesFromDictionary:autoDynamicSuperProperties]; + + dispatch_semaphore_signal(semaphore); + }); + + dispatch_semaphore_wait(semaphore, dispatch_time(DISPATCH_TIME_NOW, (int64_t)(0.5 * NSEC_PER_SEC))); + } +#endif + properties = [TAPropertyValidator validateProperties:properties validator:event]; + [event.properties addEntriesFromDictionary:properties]; + + } + + + jsonObj = [event formatDateWithDict:jsonObj]; + + [self.eventTracker track:jsonObj immediately:event.immediately saveOnly:event.isTrackPause]; +} + + +- (void)flush { + + if ([self hasDisabled]) { + return; + } + + if (self.isTrackPause) { + return; + } + [self.eventTracker flush]; +} + +#pragma mark - Flush control +- (void)startFlushTimer { + [self stopFlushTimer]; + dispatch_async(dispatch_get_main_queue(), ^{ + if (self.config.uploadInterval > 0) { + self.timer = [NSTimer scheduledTimerWithTimeInterval:[self.config.uploadInterval integerValue] + target:self + selector:@selector(flush) + userInfo:nil + repeats:YES]; + } + }); +} + +- (void)stopFlushTimer { + dispatch_async(dispatch_get_main_queue(), ^{ + if (self.timer) { + [self.timer invalidate]; + self.timer = nil; + } + }); +} + +#if TARGET_OS_IOS + +//MARK: - Thired Party + +- (void)enableThirdPartySharing:(TAThirdPartyShareType)type { + [self enableThirdPartySharing:type customMap:@{}]; +} + +- (void)enableThirdPartySharing:(TAThirdPartyShareType)type customMap:(NSDictionary *)customMap { + +#if TARGET_OS_IOS + Class TARouterCls = NSClassFromString(@"TARouter"); + // com.thinkingdata://call.service/TAThirdPartyManager.TAThirdPartyProtocol/...?params={}(value url encode) + NSURL *url = [NSURL URLWithString:@"com.thinkingdata://call.service.thinkingdata/TAThirdPartyManager.TAThirdPartyProtocol.enableThirdPartySharing:instance:property:/"]; + if (TARouterCls && [TARouterCls respondsToSelector:@selector(canOpenURL:)] && [TARouterCls respondsToSelector:@selector(openURL:withParams:)]) { + if ([TARouterCls performSelector:@selector(canOpenURL:) withObject:url]) { + [TARouterCls performSelector:@selector(openURL:withParams:) withObject:url withObject:@{@"TAThirdPartyManager":@{@1:[NSNumber numberWithInteger:type],@2:self,@3:customMap}}]; + } + } + +#endif +} + +//MARK: - Auto Track + +- (void)enableAutoTrack:(ThinkingAnalyticsAutoTrackEventType)eventType { + [self _enableAutoTrack:eventType properties:nil callback:nil]; +} + +- (void)enableAutoTrack:(ThinkingAnalyticsAutoTrackEventType)eventType properties:(NSDictionary *)properties { + [self _enableAutoTrack:eventType properties:properties callback:nil]; +} + +- (void)enableAutoTrack:(ThinkingAnalyticsAutoTrackEventType)eventType callback:(NSDictionary *(^)(ThinkingAnalyticsAutoTrackEventType eventType, NSDictionary *properties))callback { + [self _enableAutoTrack:eventType properties:nil callback:callback]; +} + +- (void)_enableAutoTrack:(ThinkingAnalyticsAutoTrackEventType)eventType properties:(NSDictionary *)properties callback:(NSDictionary *(^)(ThinkingAnalyticsAutoTrackEventType eventType, NSDictionary *properties))callback { + [self.autoTrackSuperProperty registerSuperProperties:properties withType:eventType]; + [self.autoTrackSuperProperty registerDynamicSuperProperties:callback]; + + [self _enableAutoTrack:eventType]; +} + +- (void)_enableAutoTrack:(ThinkingAnalyticsAutoTrackEventType)eventType { + self.config.autoTrackEventType = eventType; + + + [[TDAutoTrackManager sharedManager] trackWithAppid:[self td_getMapInstanceTag] withOption:eventType]; +} + +- (void)setAutoTrackProperties:(ThinkingAnalyticsAutoTrackEventType)eventType properties:(NSDictionary *)properties { + + if ([self hasDisabled]) { + return; + } + + if (properties == nil) { + return; + } + + @synchronized (self.autoTrackSuperProperty) { + [self.autoTrackSuperProperty registerSuperProperties:[properties copy] withType:eventType]; + } +} + +- (void)ignoreViewType:(Class)aClass { + if ([self hasDisabled]) { + return; + } + @synchronized (self.ignoredViewTypeList) { + [self.ignoredViewTypeList addObject:aClass]; + } +} + +- (BOOL)isViewTypeIgnored:(Class)aClass { + return [_ignoredViewTypeList containsObject:aClass]; +} + +- (BOOL)isAutoTrackEventTypeIgnored:(ThinkingAnalyticsAutoTrackEventType)eventType { + return !(_config.autoTrackEventType & eventType); +} + +- (void)ignoreAutoTrackViewControllers:(NSArray *)controllers { + if ([self hasDisabled]) { + return; + } + + if (controllers == nil || controllers.count == 0) { + return; + } + + @synchronized (self.ignoredViewControllers) { + [self.ignoredViewControllers addObjectsFromArray:controllers]; + } +} + +- (void)autoTrackWithEvent:(TAAutoTrackEvent *)event properties:(NSDictionary *)properties { + TDLogDebug(@"##### autoTrackWithEvent: %@", event.eventName); + [self configEventTimeValueWithEvent:event time:nil timeZone:nil]; + [self handleTimeEvent:event]; + [self asyncAutoTrackEventObject:event properties:properties]; +} + +/// Add event to event queue +- (void)asyncAutoTrackEventObject:(TAAutoTrackEvent *)event properties:(NSDictionary *)properties { + + event.isEnabled = self.isEnabled; + event.trackPause = self.isTrackPause; + event.isOptOut = self.isOptOut; + event.accountId = self.accountId; + event.distinctId = self.identifyId; + + NSDictionary *autoTrackDynamicProperties = [self.autoTrackSuperProperty obtainAutoTrackDynamicSuperProperties]; + NSDictionary *dynamicProperties = [self.superProperty obtainDynamicSuperProperties]; + NSMutableDictionary *unionProperties = [NSMutableDictionary dictionary]; + if (dynamicProperties) { + [unionProperties addEntriesFromDictionary:dynamicProperties]; + } + if (autoTrackDynamicProperties) { + [unionProperties addEntriesFromDictionary:autoTrackDynamicProperties]; + } + event.dynamicSuperProperties = unionProperties; + dispatch_async(td_trackQueue, ^{ + [self trackEvent:event properties:properties isH5:NO]; + }); +} + +- (BOOL)isViewControllerIgnored:(UIViewController *)viewController { + if (viewController == nil) { + return false; + } + NSString *screenName = NSStringFromClass([viewController class]); + if (_ignoredViewControllers != nil && _ignoredViewControllers.count > 0) { + if ([_ignoredViewControllers containsObject:screenName]) { + return true; + } + } + return false; +} + +#endif + +// MARK: - H5 tracking + +- (void)clickFromH5:(NSString *)data { + NSData *jsonData = [data dataUsingEncoding:NSUTF8StringEncoding]; + if (!jsonData) { + return; + } + NSError *err; + NSDictionary *eventDict = [NSJSONSerialization JSONObjectWithData:jsonData + options:NSJSONReadingMutableContainers + error:&err]; + NSString *appid = [eventDict[@"#app_id"] isKindOfClass:[NSString class]] ? eventDict[@"#app_id"] : self.appid; + id dataArr = eventDict[@"data"]; + if (!err && [dataArr isKindOfClass:[NSArray class]]) { + NSDictionary *dataInfo = [dataArr objectAtIndex:0]; + if (dataInfo != nil) { + NSString *type = [dataInfo objectForKey:@"#type"]; + NSString *event_name = [dataInfo objectForKey:@"#event_name"]; + NSString *time = [dataInfo objectForKey:@"#time"]; + NSDictionary *properties = [dataInfo objectForKey:@"properties"]; + + NSString *extraID; + + if ([type isEqualToString:TD_EVENT_TYPE_TRACK]) { + extraID = [dataInfo objectForKey:@"#first_check_id"]; + if (extraID) { + type = TD_EVENT_TYPE_TRACK_FIRST; + } + } else { + extraID = [dataInfo objectForKey:@"#event_id"]; + } + + NSMutableDictionary *dic = [properties mutableCopy]; + [dic removeObjectForKey:@"#account_id"]; + [dic removeObjectForKey:@"#distinct_id"]; + [dic removeObjectForKey:@"#device_id"]; + [dic removeObjectForKey:@"#lib"]; + [dic removeObjectForKey:@"#lib_version"]; + [dic removeObjectForKey:@"#screen_height"]; + [dic removeObjectForKey:@"#screen_width"]; + + ThinkingAnalyticsSDK *instance = [ThinkingAnalyticsSDK sharedInstanceWithAppid:appid]; + if (instance) { + dispatch_async(td_trackQueue, ^{ + [instance h5track:event_name + extraID:extraID + properties:dic + type:type + time:time]; + }); + } else { + dispatch_async(td_trackQueue, ^{ + [self h5track:event_name + extraID:extraID + properties:dic + type:type + time:time]; + }); + } + } + } +} + +- (void)h5track:(NSString *)eventName + extraID:(NSString *)extraID + properties:(NSDictionary *)propertieDict + type:(NSString *)type + time:(NSString *)time { + + if ([ThinkingAnalyticsSDK isTrackEvent:type]) { + TATrackEvent *event = nil; + if ([type isEqualToString:TD_EVENT_TYPE_TRACK]) { + TATrackEvent *trackEvent = [[TATrackEvent alloc] initWithName:eventName]; + event = trackEvent; + } else if ([type isEqualToString:TD_EVENT_TYPE_TRACK_FIRST]) { + TATrackFirstEvent *firstEvent = [[TATrackFirstEvent alloc] initWithName:eventName]; + firstEvent.firstCheckId = extraID; + event = firstEvent; + } else if ([type isEqualToString:TD_EVENT_TYPE_TRACK_UPDATE]) { + TATrackUpdateEvent *updateEvent = [[TATrackUpdateEvent alloc] initWithName:eventName]; + updateEvent.eventId = extraID; + event = updateEvent; + } else if ([type isEqualToString:TD_EVENT_TYPE_TRACK_OVERWRITE]) { + TATrackOverwriteEvent *overwriteEvent = [[TATrackOverwriteEvent alloc] initWithName:eventName]; + overwriteEvent.eventId = extraID; + event = overwriteEvent; + } + event.h5TimeString = time; + if ([propertieDict objectForKey:@"#zone_offset"]) { + event.h5ZoneOffSet = [propertieDict objectForKey:@"#zone_offset"]; + } + [self asyncTrackEventObject:event properties:propertieDict isH5:YES]; + } else { + TAUserEvent *event = [[TAUserEvent alloc] initWithType:[TABaseEvent typeWithTypeString:type]]; + [self asyncUserEventObject:event properties:propertieDict isH5:YES]; + } +} + +- (double)getTimezoneOffset:(NSDate *)date timeZone:(NSTimeZone *)timeZone { + return [date ta_timeZoneOffset:timeZone]; +} + +- (BOOL)showUpWebView:(id)webView WithRequest:(NSURLRequest *)request { + if (webView == nil || request == nil || ![request isKindOfClass:NSURLRequest.class]) { + TDLogInfo(@"showUpWebView request error"); + return NO; + } + + NSString *urlStr = request.URL.absoluteString; + if (!urlStr) { + return NO; + } + + if ([urlStr rangeOfString:TA_JS_TRACK_SCHEME].length == 0) { + return NO; + } + + NSString *query = [[request URL] query]; + NSArray *queryItem = [query componentsSeparatedByString:@"="]; + + if (queryItem.count != 2) + return YES; + + NSString *queryValue = [queryItem lastObject]; + if ([urlStr rangeOfString:TA_JS_TRACK_SCHEME].length > 0) { + if ([self hasDisabled]) + return YES; + + NSString *eventData = [queryValue stringByRemovingPercentEncoding]; + if (eventData.length > 0) + [self clickFromH5:eventData]; + } + return YES; +} + +- (void)wkWebViewGetUserAgent:(void (^)(NSString *))completion { + self.wkWebView = [[WKWebView alloc] initWithFrame:CGRectZero]; + [self.wkWebView evaluateJavaScript:@"navigator.userAgent" completionHandler:^(id __nullable userAgent, NSError * __nullable error) { + completion(userAgent); + }]; +} + +- (void)addWebViewUserAgent { + if ([self hasDisabled]) + return; + + void (^setUserAgent)(NSString *userAgent) = ^void (NSString *userAgent) { + if ([userAgent rangeOfString:@"td-sdk-ios"].location == NSNotFound) { + userAgent = [userAgent stringByAppendingString:@" /td-sdk-ios"]; + + NSDictionary *userAgentDic = [[NSDictionary alloc] initWithObjectsAndKeys:userAgent, @"UserAgent", nil]; + [[NSUserDefaults standardUserDefaults] registerDefaults:userAgentDic]; + [[NSUserDefaults standardUserDefaults] synchronize]; + } + }; + + dispatch_block_t getUABlock = ^() { + [self wkWebViewGetUserAgent:^(NSString *userAgent) { + setUserAgent(userAgent); + }]; + }; + + td_dispatch_main_sync_safe(getUABlock); +} + +#pragma mark - Logging ++ (void)setLogLevel:(TDLoggingLevel)level { + [TDLogging sharedInstance].loggingLevel = level; +} + +#pragma mark - Calibrate time + ++ (void)calibrateTime:(NSTimeInterval)timestamp { + calibratedTime = [TDCalibratedTime sharedInstance]; + [[TDCalibratedTime sharedInstance] recalibrationWithTimeInterval:timestamp/1000.]; + //NSLog(@"After version 2.8.4, the external time calibration API is discarded, and the SDK will automatically calibrate"); +} + ++ (void)calibrateTimeWithNtp:(NSString *)ntpServer { + if ([ntpServer isKindOfClass:[NSString class]] && ntpServer.length > 0) { + calibratedTime = [TDCalibratedTimeWithNTP sharedInstance]; + [[TDCalibratedTimeWithNTP sharedInstance] recalibrationWithNtps:@[ntpServer]]; + } + //NSLog(@"After version 2.8.4, the external time calibration API is discarded, and the SDK will automatically calibrate"); +} + +// for UNITY +- (NSString *)getTimeString:(NSDate *)date { + return [date ta_formatWithTimeZone:self.config.defaultTimeZone formatString:kDefaultTimeFormat]; +} + +//MARK: - Private + +- (void)handleTimeEvent:(TATrackEvent *)trackEvent { + + BOOL isTrackDuration = [self.trackTimer isExistEvent:trackEvent.eventName]; + BOOL isEndEvent = [trackEvent.eventName isEqualToString:TD_APP_END_EVENT]; + BOOL isStartEvent = [trackEvent.eventName isEqualToString:TD_APP_START_EVENT]; + BOOL isStateInit = [TAAppLifeCycle shareInstance].state == TAAppLifeCycleStateInit; + + if (isStateInit) { + trackEvent.foregroundDuration = [self.trackTimer foregroundDurationOfEvent:trackEvent.eventName isActive:YES systemUptime:trackEvent.systemUpTime]; + [self.trackTimer removeEvent:trackEvent.eventName]; + + } else if (isStartEvent) { + + trackEvent.backgroundDuration = [self.trackTimer backgroundDurationOfEvent:trackEvent.eventName isActive:NO systemUptime:trackEvent.systemUpTime]; + [self.trackTimer removeEvent:trackEvent.eventName]; + + } else if (isEndEvent) { + + trackEvent.foregroundDuration = [self.trackTimer foregroundDurationOfEvent:trackEvent.eventName isActive:YES systemUptime:trackEvent.systemUpTime]; + [self.trackTimer removeEvent:trackEvent.eventName]; + + } else if (isTrackDuration) { + + + BOOL isActive = [TDAppState shareInstance].isActive; + + trackEvent.foregroundDuration = [self.trackTimer foregroundDurationOfEvent:trackEvent.eventName isActive:isActive systemUptime:trackEvent.systemUpTime]; + + trackEvent.backgroundDuration = [self.trackTimer backgroundDurationOfEvent:trackEvent.eventName isActive:isActive systemUptime:trackEvent.systemUpTime]; + + TDLogDebug(@"#####eventName: %@, foregroundDuration: %d", trackEvent.eventName, trackEvent.foregroundDuration); + TDLogDebug(@"#####eventName: %@, backgroundDuration: %d", trackEvent.eventName, trackEvent.backgroundDuration); + + [self.trackTimer removeEvent:trackEvent.eventName]; + } else { + + if (trackEvent.eventName == TD_APP_END_EVENT) { + return; + } + } +} + ++ (NSMutableDictionary *)_getAllInstances { + return instances; +} + ++ (void)_clearCalibratedTime { + calibratedTime = nil; +} + +- (BOOL)isValidName:(NSString *)name isAutoTrack:(BOOL)isAutoTrack { + return YES; +} + +- (BOOL)checkEventProperties:(NSDictionary *)properties withEventType:(NSString *_Nullable)eventType haveAutoTrackEvents:(BOOL)haveAutoTrackEvents { + return YES; +} + +- (void)flushImmediately:(NSDictionary *)dataDic { + +} + ++ (dispatch_queue_t)td_networkQueue { + return [TAEventTracker td_networkQueue]; +} + +- (NSInteger)saveEventsData:(NSDictionary *)data { + return [self.eventTracker saveEventsData:data]; +} + +// MARK: - getter & setter + +- (TAAutoTrackSuperProperty *)autoTrackSuperProperty { + if (!_autoTrackSuperProperty) { + _autoTrackSuperProperty = [[TAAutoTrackSuperProperty alloc] init]; + } + return _autoTrackSuperProperty; +} + +@end diff --git a/Assets/HCMiniSdk/Third/ta/Plugins/iOS/ThinkingSDK/Source/main/ThinkingAnalyticsSDK.m.meta b/Assets/HCMiniSdk/Third/ta/Plugins/iOS/ThinkingSDK/Source/main/ThinkingAnalyticsSDK.m.meta new file mode 100644 index 00000000..bae42009 --- /dev/null +++ b/Assets/HCMiniSdk/Third/ta/Plugins/iOS/ThinkingSDK/Source/main/ThinkingAnalyticsSDK.m.meta @@ -0,0 +1,33 @@ +fileFormatVersion: 2 +guid: b5b9d9a9bb04b48a7958705ab2237622 +PluginImporter: + externalObjects: {} + serializedVersion: 2 + iconMap: {} + executionOrder: {} + defineConstraints: [] + isPreloaded: 0 + isOverridable: 0 + isExplicitlyReferenced: 0 + validateReferences: 1 + platformData: + - first: + Any: + second: + enabled: 0 + settings: {} + - first: + Editor: Editor + second: + enabled: 0 + settings: + DefaultValueInitialized: true + - first: + iPhone: iOS + second: + enabled: 1 + settings: + AddToEmbeddedBinaries: false + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/HCMiniSdk/Third/ta/Plugins/iOS/ThinkingSDK/Source/main/ThinkingAnalyticsSDKPrivate.h b/Assets/HCMiniSdk/Third/ta/Plugins/iOS/ThinkingSDK/Source/main/ThinkingAnalyticsSDKPrivate.h new file mode 100755 index 00000000..546ba041 --- /dev/null +++ b/Assets/HCMiniSdk/Third/ta/Plugins/iOS/ThinkingSDK/Source/main/ThinkingAnalyticsSDKPrivate.h @@ -0,0 +1,168 @@ +#if __has_include() +#import +#else +#import "ThinkingAnalyticsSDK.h" +#endif + +#import +#import +#import +#import +#import + +#if TARGET_OS_IOS +#import "ThinkingExceptionHandler.h" +#import "TAAutoTrackEvent.h" +#import "TAAutoTrackSuperProperty.h" +#import "TDEncrypt.h" +#endif + +#import "TDLogging.h" +#import "TDDeviceInfo.h" +#import "TDConfig.h" +#import "TDSqliteDataQueue.h" +#import "TDEventModel.h" + +#import "TATrackTimer.h" +#import "TASuperProperty.h" +#import "TATrackEvent.h" +#import "TATrackFirstEvent.h" +#import "TATrackOverwriteEvent.h" +#import "TATrackUpdateEvent.h" +#import "TAUserPropertyHeader.h" +#import "TAPropertyPluginManager.h" +//#import "TASessionIdPropertyPlugin.h" +#import "TAPresetPropertyPlugin.h" +#import "TABaseEvent+H5.h" +#import "NSDate+TAFormat.h" +#import "TAEventTracker.h" +#import "TAAppLifeCycle.h" + +NS_ASSUME_NONNULL_BEGIN + +static NSString * const TD_APP_START_EVENT = @"ta_app_start"; +static NSString * const TD_APP_START_BACKGROUND_EVENT = @"ta_app_bg_start"; +static NSString * const TD_APP_END_EVENT = @"ta_app_end"; +static NSString * const TD_APP_VIEW_EVENT = @"ta_app_view"; +static NSString * const TD_APP_CLICK_EVENT = @"ta_app_click"; +static NSString * const TD_APP_CRASH_EVENT = @"ta_app_crash"; +static NSString * const TD_APP_INSTALL_EVENT = @"ta_app_install"; + +static NSString * const TD_CRASH_REASON = @"#app_crashed_reason"; +static NSString * const TD_RESUME_FROM_BACKGROUND = @"#resume_from_background"; +static NSString * const TD_START_REASON = @"#start_reason"; +static NSString * const TD_BACKGROUND_DURATION = @"#background_duration"; + +static kEDEventTypeName const TD_EVENT_TYPE_TRACK = @"track"; + +static kEDEventTypeName const TD_EVENT_TYPE_USER_DEL = @"user_del"; +static kEDEventTypeName const TD_EVENT_TYPE_USER_ADD = @"user_add"; +static kEDEventTypeName const TD_EVENT_TYPE_USER_SET = @"user_set"; +static kEDEventTypeName const TD_EVENT_TYPE_USER_SETONCE = @"user_setOnce"; +static kEDEventTypeName const TD_EVENT_TYPE_USER_UNSET = @"user_unset"; +static kEDEventTypeName const TD_EVENT_TYPE_USER_APPEND = @"user_append"; +static kEDEventTypeName const TD_EVENT_TYPE_USER_UNIQ_APPEND= @"user_uniq_append"; + +#ifndef td_dispatch_main_sync_safe +#define td_dispatch_main_sync_safe(block)\ +if (dispatch_queue_get_label(DISPATCH_CURRENT_QUEUE_LABEL) == dispatch_queue_get_label(dispatch_get_main_queue())) {\ +block();\ +} else {\ +dispatch_sync(dispatch_get_main_queue(), block);\ +} +#endif + +#define kDefaultTimeFormat @"yyyy-MM-dd HH:mm:ss.SSS" + +static NSUInteger const kBatchSize = 50; +static NSUInteger const TA_PROPERTY_CRASH_LENGTH_LIMIT = 8191*2; +static NSString * const TA_JS_TRACK_SCHEME = @"thinkinganalytics://trackEvent"; + +#define kModeEnumArray @"NORMAL", @"DebugOnly", @"Debug", nil + +@interface ThinkingAnalyticsSDK () + +#if TARGET_OS_IOS +@property (nonatomic, strong) TAAutoTrackSuperProperty *autoTrackSuperProperty; +@property (nonatomic, strong) TDEncryptManager *encryptManager; +@property (strong,nonatomic) id thirdPartyManager; +#endif + +@property (atomic, copy) NSString *appid; +@property (atomic, copy) NSString *serverURL; +@property (atomic, copy, nullable) NSString *accountId; +@property (atomic, copy) NSString *identifyId; +@property (nonatomic, strong) TASuperProperty *superProperty; +@property (nonatomic, strong) TAPropertyPluginManager *propertyPluginManager; +//@property (nonatomic, strong) TASessionIdPropertyPlugin *sessionidPlugin; +@property (nonatomic, strong) TAAppLifeCycle *appLifeCycle; +/// TD error callback +@property (atomic, copy) void(^errorCallback)(NSInteger code, NSString * _Nullable errorMsg, NSString * _Nullable ext); + +@property (atomic, strong) NSMutableSet *ignoredViewTypeList; +@property (atomic, strong) NSMutableSet *ignoredViewControllers; + + +@property (atomic, assign, getter=isTrackPause) BOOL trackPause; +@property (atomic, assign) BOOL isEnabled; +@property (atomic, assign) BOOL isOptOut; + + +@property (nonatomic, strong, nullable) NSTimer *timer; + +@property (nonatomic, strong) TATrackTimer *trackTimer; + +@property (atomic, strong) TDSqliteDataQueue *dataQueue; +@property (nonatomic, copy) TDConfig *config; +@property (nonatomic, strong) WKWebView *wkWebView; + +#if TARGET_OS_IOS +- (void)autoTrackWithEvent:(TAAutoTrackEvent *)event properties:(nullable NSDictionary *)properties; +- (BOOL)isViewControllerIgnored:(UIViewController *)viewController; +- (BOOL)isAutoTrackEventTypeIgnored:(ThinkingAnalyticsAutoTrackEventType)eventType; +- (BOOL)isViewTypeIgnored:(Class)aClass; +#endif + +- (instancetype)initLight:(NSString *)appid withServerURL:(NSString *)serverURL withConfig:(TDConfig *)config; + +- (void)retrievePersistedData; ++ (dispatch_queue_t)td_trackQueue; ++ (dispatch_queue_t)td_networkQueue; ++ (id)sharedUIApplication; +- (NSInteger)saveEventsData:(NSDictionary *)data; +- (void)flushImmediately:(NSDictionary *)dataDic; +- (BOOL)hasDisabled; +- (BOOL)isValidName:(NSString *)name isAutoTrack:(BOOL)isAutoTrack; ++ (BOOL)isTrackEvent:(NSString *)eventType; +- (BOOL)checkEventProperties:(NSDictionary *)properties withEventType:(NSString *_Nullable)eventType haveAutoTrackEvents:(BOOL)haveAutoTrackEvents; +- (void)startFlushTimer; +- (double)getTimezoneOffset:(NSDate *)date timeZone:(NSTimeZone *)timeZone; ++ (NSMutableDictionary *)_getAllInstances; + ++ (NSMutableDictionary *)_getAllInstances; + +@end + +@interface TDEventModel () + +@property (nonatomic, copy) NSString *timeString; +@property (nonatomic, assign) double zoneOffset; +@property (nonatomic, assign) TimeValueType timeValueType; +@property (nonatomic, copy) NSString *extraID; +@property (nonatomic, assign) BOOL persist; +@property (nonatomic, strong) NSDate *time; +@property (nonatomic, strong) NSTimeZone *timeZone; + +- (instancetype)initWithEventName:(NSString * _Nullable)eventName; + +- (instancetype _Nonnull )initWithEventName:(NSString * _Nullable)eventName eventType:(kEDEventTypeName _Nonnull )eventType; + +@end + +@interface LightThinkingAnalyticsSDK : ThinkingAnalyticsSDK + +- (instancetype)initWithAPPID:(NSString *)appID withServerURL:(NSString *)serverURL withConfig:(TDConfig *)config; + +@end + +NS_ASSUME_NONNULL_END diff --git a/Assets/HCMiniSdk/Third/ta/Plugins/iOS/ThinkingSDK/Source/main/ThinkingAnalyticsSDKPrivate.h.meta b/Assets/HCMiniSdk/Third/ta/Plugins/iOS/ThinkingSDK/Source/main/ThinkingAnalyticsSDKPrivate.h.meta new file mode 100644 index 00000000..41a7507e --- /dev/null +++ b/Assets/HCMiniSdk/Third/ta/Plugins/iOS/ThinkingSDK/Source/main/ThinkingAnalyticsSDKPrivate.h.meta @@ -0,0 +1,33 @@ +fileFormatVersion: 2 +guid: 1b247f06bcd1a43b5b044a21027ec051 +PluginImporter: + externalObjects: {} + serializedVersion: 2 + iconMap: {} + executionOrder: {} + defineConstraints: [] + isPreloaded: 0 + isOverridable: 0 + isExplicitlyReferenced: 0 + validateReferences: 1 + platformData: + - first: + Any: + second: + enabled: 0 + settings: {} + - first: + Editor: Editor + second: + enabled: 0 + settings: + DefaultValueInitialized: true + - first: + iPhone: iOS + second: + enabled: 1 + settings: + AddToEmbeddedBinaries: false + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/HCMiniSdk/Third/ta/Plugins/iOS/ThinkingSDK/Source/main/ThinkingSDK.h b/Assets/HCMiniSdk/Third/ta/Plugins/iOS/ThinkingSDK/Source/main/ThinkingSDK.h new file mode 100755 index 00000000..b7cd8334 --- /dev/null +++ b/Assets/HCMiniSdk/Third/ta/Plugins/iOS/ThinkingSDK/Source/main/ThinkingSDK.h @@ -0,0 +1,38 @@ + +#import + +#if __has_include() +#import +#else +#import "ThinkingAnalyticsSDK.h" +#endif + +#if __has_include() +#import +#else +#import "TDFirstEventModel.h" +#endif + +#if __has_include() +#import +#else +#import "TDEditableEventModel.h" +#endif + +#if __has_include() +#import +#else +#import "TDConfig.h" +#endif + +#if __has_include() +#import +#else +#import "TDPresetProperties.h" +#endif + +#if __has_include() +#import +#else +#import "TDDeviceInfo.h" +#endif diff --git a/Assets/HCMiniSdk/Third/ta/Plugins/iOS/ThinkingSDK/Source/main/ThinkingSDK.h.meta b/Assets/HCMiniSdk/Third/ta/Plugins/iOS/ThinkingSDK/Source/main/ThinkingSDK.h.meta new file mode 100644 index 00000000..44a1c4be --- /dev/null +++ b/Assets/HCMiniSdk/Third/ta/Plugins/iOS/ThinkingSDK/Source/main/ThinkingSDK.h.meta @@ -0,0 +1,33 @@ +fileFormatVersion: 2 +guid: 8e46d5322f9ed4eb6902a67f0c199583 +PluginImporter: + externalObjects: {} + serializedVersion: 2 + iconMap: {} + executionOrder: {} + defineConstraints: [] + isPreloaded: 0 + isOverridable: 0 + isExplicitlyReferenced: 0 + validateReferences: 1 + platformData: + - first: + Any: + second: + enabled: 0 + settings: {} + - first: + Editor: Editor + second: + enabled: 0 + settings: + DefaultValueInitialized: true + - first: + iPhone: iOS + second: + enabled: 1 + settings: + AddToEmbeddedBinaries: false + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/HCMiniSdk/Third/ta/Sample.meta b/Assets/HCMiniSdk/Third/ta/Sample.meta new file mode 100644 index 00000000..f4b41285 --- /dev/null +++ b/Assets/HCMiniSdk/Third/ta/Sample.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: 3d6e178afec714cd393bf6735910293d +folderAsset: yes +DefaultImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/HCMiniSdk/Third/ta/Sample/Assets.meta b/Assets/HCMiniSdk/Third/ta/Sample/Assets.meta new file mode 100644 index 00000000..554efb8f --- /dev/null +++ b/Assets/HCMiniSdk/Third/ta/Sample/Assets.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: b29c81236c1a545488a2ac4eb6d5f598 +folderAsset: yes +DefaultImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/HCMiniSdk/Third/ta/Sample/Assets/button.png b/Assets/HCMiniSdk/Third/ta/Sample/Assets/button.png new file mode 100644 index 00000000..0cdf5163 Binary files /dev/null and b/Assets/HCMiniSdk/Third/ta/Sample/Assets/button.png differ diff --git a/Assets/HCMiniSdk/Third/ta/Sample/Assets/button.png.meta b/Assets/HCMiniSdk/Third/ta/Sample/Assets/button.png.meta new file mode 100644 index 00000000..eafaa7cd --- /dev/null +++ b/Assets/HCMiniSdk/Third/ta/Sample/Assets/button.png.meta @@ -0,0 +1,123 @@ +fileFormatVersion: 2 +guid: a57a02d0faa91492bb9147668fed8c00 +TextureImporter: + internalIDToNameTable: [] + externalObjects: {} + serializedVersion: 10 + mipmaps: + mipMapMode: 0 + enableMipMap: 0 + sRGBTexture: 1 + linearTexture: 1 + fadeOut: 0 + borderMipMap: 0 + mipMapsPreserveCoverage: 0 + alphaTestReferenceValue: 0.5 + mipMapFadeDistanceStart: 1 + mipMapFadeDistanceEnd: 3 + bumpmap: + convertToNormalMap: 0 + externalNormalMap: 0 + heightScale: 0.25 + normalMapFilter: 0 + isReadable: 0 + streamingMipmaps: 0 + streamingMipmapsPriority: 0 + grayScaleToAlpha: 0 + generateCubemap: 6 + cubemapConvolution: 0 + seamlessCubemap: 0 + textureFormat: -3 + maxTextureSize: 1024 + textureSettings: + serializedVersion: 2 + filterMode: -1 + aniso: 1 + mipBias: -100 + wrapU: 1 + wrapV: 1 + wrapW: 1 + nPOTScale: 0 + lightmap: 0 + compressionQuality: 50 + spriteMode: 0 + spriteExtrude: 1 + spriteMeshType: 1 + alignment: 0 + spritePivot: {x: 0.5, y: 0.5} + spritePixelsToUnits: 100 + spriteBorder: {x: 3, y: 5, z: 6, w: 6} + spriteGenerateFallbackPhysicsShape: 1 + alphaUsage: 1 + alphaIsTransparency: 1 + spriteTessellationDetail: -1 + textureType: 2 + textureShape: 1 + singleChannelComponent: 0 + maxTextureSizeSet: 0 + compressionQualitySet: 0 + textureFormatSet: 0 + platformSettings: + - serializedVersion: 2 + buildTarget: DefaultTexturePlatform + maxTextureSize: 1024 + resizeAlgorithm: 0 + textureFormat: -1 + textureCompression: 0 + compressionQuality: 50 + crunchedCompression: 0 + allowsAlphaSplitting: 0 + overridden: 0 + androidETC2FallbackOverride: 0 + - serializedVersion: 2 + buildTarget: Standalone + maxTextureSize: 1024 + resizeAlgorithm: 0 + textureFormat: -1 + textureCompression: 0 + compressionQuality: 50 + crunchedCompression: 0 + allowsAlphaSplitting: 0 + overridden: 0 + androidETC2FallbackOverride: 0 + - serializedVersion: 2 + buildTarget: iPhone + maxTextureSize: 1024 + resizeAlgorithm: 0 + textureFormat: 4 + textureCompression: 0 + compressionQuality: 50 + crunchedCompression: 0 + allowsAlphaSplitting: 0 + overridden: 1 + androidETC2FallbackOverride: 0 + - serializedVersion: 2 + buildTarget: Android + maxTextureSize: 1024 + resizeAlgorithm: 0 + textureFormat: -1 + textureCompression: 0 + compressionQuality: 50 + crunchedCompression: 0 + allowsAlphaSplitting: 0 + overridden: 0 + androidETC2FallbackOverride: 0 + spriteSheet: + serializedVersion: 2 + sprites: [] + outline: [] + physicsShape: [] + bones: [] + spriteID: + internalID: 0 + vertices: [] + indices: + edges: [] + weights: [] + secondaryTextures: [] + spritePackingTag: + pSDRemoveMatte: 0 + pSDShowRemoveMatteOption: 0 + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/HCMiniSdk/Third/ta/Sample/Assets/button_down.png b/Assets/HCMiniSdk/Third/ta/Sample/Assets/button_down.png new file mode 100644 index 00000000..f5cd005a Binary files /dev/null and b/Assets/HCMiniSdk/Third/ta/Sample/Assets/button_down.png differ diff --git a/Assets/HCMiniSdk/Third/ta/Sample/Assets/button_down.png.meta b/Assets/HCMiniSdk/Third/ta/Sample/Assets/button_down.png.meta new file mode 100644 index 00000000..5712fdbc --- /dev/null +++ b/Assets/HCMiniSdk/Third/ta/Sample/Assets/button_down.png.meta @@ -0,0 +1,123 @@ +fileFormatVersion: 2 +guid: 937c96556f7574eaaa1751e2092f0b63 +TextureImporter: + internalIDToNameTable: [] + externalObjects: {} + serializedVersion: 10 + mipmaps: + mipMapMode: 0 + enableMipMap: 0 + sRGBTexture: 1 + linearTexture: 1 + fadeOut: 0 + borderMipMap: 0 + mipMapsPreserveCoverage: 0 + alphaTestReferenceValue: 0.5 + mipMapFadeDistanceStart: 1 + mipMapFadeDistanceEnd: 3 + bumpmap: + convertToNormalMap: 0 + externalNormalMap: 0 + heightScale: 0.25 + normalMapFilter: 0 + isReadable: 0 + streamingMipmaps: 0 + streamingMipmapsPriority: 0 + grayScaleToAlpha: 0 + generateCubemap: 6 + cubemapConvolution: 0 + seamlessCubemap: 0 + textureFormat: -3 + maxTextureSize: 1024 + textureSettings: + serializedVersion: 2 + filterMode: -1 + aniso: 1 + mipBias: -100 + wrapU: 1 + wrapV: 1 + wrapW: 1 + nPOTScale: 0 + lightmap: 0 + compressionQuality: 50 + spriteMode: 0 + spriteExtrude: 1 + spriteMeshType: 1 + alignment: 0 + spritePivot: {x: 0.5, y: 0.5} + spritePixelsToUnits: 100 + spriteBorder: {x: 0, y: 0, z: 0, w: 0} + spriteGenerateFallbackPhysicsShape: 1 + alphaUsage: 1 + alphaIsTransparency: 1 + spriteTessellationDetail: -1 + textureType: 2 + textureShape: 1 + singleChannelComponent: 0 + maxTextureSizeSet: 0 + compressionQualitySet: 0 + textureFormatSet: 0 + platformSettings: + - serializedVersion: 2 + buildTarget: DefaultTexturePlatform + maxTextureSize: 1024 + resizeAlgorithm: 0 + textureFormat: -1 + textureCompression: 0 + compressionQuality: 50 + crunchedCompression: 0 + allowsAlphaSplitting: 0 + overridden: 0 + androidETC2FallbackOverride: 0 + - serializedVersion: 2 + buildTarget: Standalone + maxTextureSize: 1024 + resizeAlgorithm: 0 + textureFormat: -1 + textureCompression: 0 + compressionQuality: 50 + crunchedCompression: 0 + allowsAlphaSplitting: 0 + overridden: 0 + androidETC2FallbackOverride: 0 + - serializedVersion: 2 + buildTarget: iPhone + maxTextureSize: 1024 + resizeAlgorithm: 0 + textureFormat: 4 + textureCompression: 0 + compressionQuality: 50 + crunchedCompression: 0 + allowsAlphaSplitting: 0 + overridden: 1 + androidETC2FallbackOverride: 0 + - serializedVersion: 2 + buildTarget: Android + maxTextureSize: 1024 + resizeAlgorithm: 0 + textureFormat: -1 + textureCompression: 0 + compressionQuality: 50 + crunchedCompression: 0 + allowsAlphaSplitting: 0 + overridden: 0 + androidETC2FallbackOverride: 0 + spriteSheet: + serializedVersion: 2 + sprites: [] + outline: [] + physicsShape: [] + bones: [] + spriteID: + internalID: 0 + vertices: [] + indices: + edges: [] + weights: [] + secondaryTextures: [] + spritePackingTag: + pSDRemoveMatte: 0 + pSDShowRemoveMatteOption: 0 + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/HCMiniSdk/Third/ta/Sample/Assets/button_hover.png b/Assets/HCMiniSdk/Third/ta/Sample/Assets/button_hover.png new file mode 100644 index 00000000..751844fd Binary files /dev/null and b/Assets/HCMiniSdk/Third/ta/Sample/Assets/button_hover.png differ diff --git a/Assets/HCMiniSdk/Third/ta/Sample/Assets/button_hover.png.meta b/Assets/HCMiniSdk/Third/ta/Sample/Assets/button_hover.png.meta new file mode 100644 index 00000000..08f2dbd4 --- /dev/null +++ b/Assets/HCMiniSdk/Third/ta/Sample/Assets/button_hover.png.meta @@ -0,0 +1,123 @@ +fileFormatVersion: 2 +guid: aac4f7023d2ef4295ac6071b8e1d8853 +TextureImporter: + internalIDToNameTable: [] + externalObjects: {} + serializedVersion: 10 + mipmaps: + mipMapMode: 0 + enableMipMap: 0 + sRGBTexture: 1 + linearTexture: 1 + fadeOut: 0 + borderMipMap: 0 + mipMapsPreserveCoverage: 0 + alphaTestReferenceValue: 0.5 + mipMapFadeDistanceStart: 1 + mipMapFadeDistanceEnd: 3 + bumpmap: + convertToNormalMap: 0 + externalNormalMap: 0 + heightScale: 0.25 + normalMapFilter: 0 + isReadable: 0 + streamingMipmaps: 0 + streamingMipmapsPriority: 0 + grayScaleToAlpha: 0 + generateCubemap: 6 + cubemapConvolution: 0 + seamlessCubemap: 0 + textureFormat: -3 + maxTextureSize: 1024 + textureSettings: + serializedVersion: 2 + filterMode: -1 + aniso: 1 + mipBias: -100 + wrapU: 1 + wrapV: 1 + wrapW: 1 + nPOTScale: 0 + lightmap: 0 + compressionQuality: 50 + spriteMode: 0 + spriteExtrude: 1 + spriteMeshType: 1 + alignment: 0 + spritePivot: {x: 0.5, y: 0.5} + spritePixelsToUnits: 100 + spriteBorder: {x: 0, y: 0, z: 0, w: 0} + spriteGenerateFallbackPhysicsShape: 1 + alphaUsage: 1 + alphaIsTransparency: 1 + spriteTessellationDetail: -1 + textureType: 2 + textureShape: 1 + singleChannelComponent: 0 + maxTextureSizeSet: 0 + compressionQualitySet: 0 + textureFormatSet: 0 + platformSettings: + - serializedVersion: 2 + buildTarget: DefaultTexturePlatform + maxTextureSize: 1024 + resizeAlgorithm: 0 + textureFormat: -1 + textureCompression: 0 + compressionQuality: 50 + crunchedCompression: 0 + allowsAlphaSplitting: 0 + overridden: 0 + androidETC2FallbackOverride: 0 + - serializedVersion: 2 + buildTarget: Standalone + maxTextureSize: 1024 + resizeAlgorithm: 0 + textureFormat: -1 + textureCompression: 0 + compressionQuality: 50 + crunchedCompression: 0 + allowsAlphaSplitting: 0 + overridden: 0 + androidETC2FallbackOverride: 0 + - serializedVersion: 2 + buildTarget: iPhone + maxTextureSize: 1024 + resizeAlgorithm: 0 + textureFormat: 4 + textureCompression: 0 + compressionQuality: 50 + crunchedCompression: 0 + allowsAlphaSplitting: 0 + overridden: 1 + androidETC2FallbackOverride: 0 + - serializedVersion: 2 + buildTarget: Android + maxTextureSize: 1024 + resizeAlgorithm: 0 + textureFormat: -1 + textureCompression: 0 + compressionQuality: 50 + crunchedCompression: 0 + allowsAlphaSplitting: 0 + overridden: 0 + androidETC2FallbackOverride: 0 + spriteSheet: + serializedVersion: 2 + sprites: [] + outline: [] + physicsShape: [] + bones: [] + spriteID: + internalID: 0 + vertices: [] + indices: + edges: [] + weights: [] + secondaryTextures: [] + spritePackingTag: + pSDRemoveMatte: 0 + pSDShowRemoveMatteOption: 0 + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/HCMiniSdk/Third/ta/Sample/Assets/td_logo.png b/Assets/HCMiniSdk/Third/ta/Sample/Assets/td_logo.png new file mode 100644 index 00000000..03b5dc2d Binary files /dev/null and b/Assets/HCMiniSdk/Third/ta/Sample/Assets/td_logo.png differ diff --git a/Assets/HCMiniSdk/Third/ta/Sample/Assets/td_logo.png.meta b/Assets/HCMiniSdk/Third/ta/Sample/Assets/td_logo.png.meta new file mode 100644 index 00000000..7e27c845 --- /dev/null +++ b/Assets/HCMiniSdk/Third/ta/Sample/Assets/td_logo.png.meta @@ -0,0 +1,123 @@ +fileFormatVersion: 2 +guid: 1c8be89e83f14479081250d0c4806b85 +TextureImporter: + internalIDToNameTable: [] + externalObjects: {} + serializedVersion: 10 + mipmaps: + mipMapMode: 0 + enableMipMap: 0 + sRGBTexture: 1 + linearTexture: 0 + fadeOut: 0 + borderMipMap: 0 + mipMapsPreserveCoverage: 0 + alphaTestReferenceValue: 0.5 + mipMapFadeDistanceStart: 1 + mipMapFadeDistanceEnd: 3 + bumpmap: + convertToNormalMap: 0 + externalNormalMap: 0 + heightScale: 0.25 + normalMapFilter: 0 + isReadable: 0 + streamingMipmaps: 0 + streamingMipmapsPriority: 0 + grayScaleToAlpha: 0 + generateCubemap: 6 + cubemapConvolution: 0 + seamlessCubemap: 0 + textureFormat: -3 + maxTextureSize: 1024 + textureSettings: + serializedVersion: 2 + filterMode: -1 + aniso: 1 + mipBias: -100 + wrapU: 1 + wrapV: 1 + wrapW: 1 + nPOTScale: 0 + lightmap: 0 + compressionQuality: 50 + spriteMode: 1 + spriteExtrude: 1 + spriteMeshType: 1 + alignment: 0 + spritePivot: {x: 0.5, y: 0.5} + spritePixelsToUnits: 100 + spriteBorder: {x: 0, y: 0, z: 0, w: 0} + spriteGenerateFallbackPhysicsShape: 1 + alphaUsage: 1 + alphaIsTransparency: 1 + spriteTessellationDetail: -1 + textureType: 8 + textureShape: 1 + singleChannelComponent: 0 + maxTextureSizeSet: 0 + compressionQualitySet: 0 + textureFormatSet: 0 + platformSettings: + - serializedVersion: 2 + buildTarget: DefaultTexturePlatform + maxTextureSize: 1024 + resizeAlgorithm: 0 + textureFormat: -1 + textureCompression: 0 + compressionQuality: 50 + crunchedCompression: 0 + allowsAlphaSplitting: 0 + overridden: 0 + androidETC2FallbackOverride: 0 + - serializedVersion: 2 + buildTarget: Standalone + maxTextureSize: 1024 + resizeAlgorithm: 0 + textureFormat: -1 + textureCompression: 0 + compressionQuality: 50 + crunchedCompression: 0 + allowsAlphaSplitting: 0 + overridden: 0 + androidETC2FallbackOverride: 0 + - serializedVersion: 2 + buildTarget: iPhone + maxTextureSize: 1024 + resizeAlgorithm: 0 + textureFormat: 4 + textureCompression: 0 + compressionQuality: 50 + crunchedCompression: 0 + allowsAlphaSplitting: 0 + overridden: 1 + androidETC2FallbackOverride: 0 + - serializedVersion: 2 + buildTarget: Android + maxTextureSize: 1024 + resizeAlgorithm: 0 + textureFormat: -1 + textureCompression: 0 + compressionQuality: 50 + crunchedCompression: 0 + allowsAlphaSplitting: 0 + overridden: 0 + androidETC2FallbackOverride: 0 + spriteSheet: + serializedVersion: 2 + sprites: [] + outline: [] + physicsShape: [] + bones: [] + spriteID: ae3eea2b77eaa4081a2c018523da8fc8 + internalID: 0 + vertices: [] + indices: + edges: [] + weights: [] + secondaryTextures: [] + spritePackingTag: + pSDRemoveMatte: 0 + pSDShowRemoveMatteOption: 0 + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/HCMiniSdk/Third/ta/Sample/Assets/td_skin.guiskin b/Assets/HCMiniSdk/Third/ta/Sample/Assets/td_skin.guiskin new file mode 100644 index 00000000..2b9def73 --- /dev/null +++ b/Assets/HCMiniSdk/Third/ta/Sample/Assets/td_skin.guiskin @@ -0,0 +1,1428 @@ +%YAML 1.1 +%TAG !u! tag:unity3d.com,2011: +--- !u!114 &11400000 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 0} + m_Enabled: 1 + m_EditorHideFlags: 1 + m_Script: {fileID: 12001, guid: 0000000000000000e000000000000000, type: 0} + m_Name: td_skin + m_EditorClassIdentifier: + m_Font: {fileID: 10102, guid: 0000000000000000e000000000000000, type: 0} + m_box: + m_Name: box + m_Normal: + m_Background: {fileID: 11001, guid: 0000000000000000e000000000000000, type: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0.79999995, g: 0.79999995, b: 0.79999995, a: 1} + m_Hover: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_Active: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_Focused: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_OnNormal: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_OnHover: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_OnActive: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_OnFocused: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_Border: + m_Left: 6 + m_Right: 6 + m_Top: 6 + m_Bottom: 6 + m_Margin: + m_Left: 4 + m_Right: 4 + m_Top: 4 + m_Bottom: 4 + m_Padding: + m_Left: 4 + m_Right: 4 + m_Top: 4 + m_Bottom: 4 + m_Overflow: + m_Left: 0 + m_Right: 0 + m_Top: 0 + m_Bottom: 0 + m_Font: {fileID: 0} + m_FontSize: 0 + m_FontStyle: 0 + m_Alignment: 1 + m_WordWrap: 0 + m_RichText: 1 + m_TextClipping: 1 + m_ImagePosition: 0 + m_ContentOffset: {x: 0, y: 0} + m_FixedWidth: 0 + m_FixedHeight: 0 + m_StretchWidth: 1 + m_StretchHeight: 0 + m_button: + m_Name: button + m_Normal: + m_Background: {fileID: 2800000, guid: a57a02d0faa91492bb9147668fed8c00, type: 3} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0.9, g: 0.9, b: 0.9, a: 1} + m_Hover: + m_Background: {fileID: 2800000, guid: aac4f7023d2ef4295ac6071b8e1d8853, type: 3} + m_ScaledBackgrounds: [] + m_TextColor: {r: 1, g: 1, b: 1, a: 1} + m_Active: + m_Background: {fileID: 2800000, guid: 937c96556f7574eaaa1751e2092f0b63, type: 3} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0.9, g: 0.9, b: 0.9, a: 1} + m_Focused: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 1, g: 1, b: 1, a: 1} + m_OnNormal: + m_Background: {fileID: 11005, guid: 0000000000000000e000000000000000, type: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0.9019608, g: 0.9019608, b: 0.9019608, a: 1} + m_OnHover: + m_Background: {fileID: 11004, guid: 0000000000000000e000000000000000, type: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 1, g: 1, b: 1, a: 1} + m_OnActive: + m_Background: {fileID: 11002, guid: 0000000000000000e000000000000000, type: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0.9, g: 0.9, b: 0.9, a: 1} + m_OnFocused: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_Border: + m_Left: 4 + m_Right: 4 + m_Top: 4 + m_Bottom: 4 + m_Margin: + m_Left: 0 + m_Right: 0 + m_Top: 0 + m_Bottom: 24 + m_Padding: + m_Left: 0 + m_Right: 0 + m_Top: 0 + m_Bottom: 0 + m_Overflow: + m_Left: 0 + m_Right: 0 + m_Top: 0 + m_Bottom: 0 + m_Font: {fileID: 0} + m_FontSize: 28 + m_FontStyle: 0 + m_Alignment: 4 + m_WordWrap: 0 + m_RichText: 1 + m_TextClipping: 1 + m_ImagePosition: 0 + m_ContentOffset: {x: 0, y: 0} + m_FixedWidth: 0 + m_FixedHeight: 80 + m_StretchWidth: 1 + m_StretchHeight: 0 + m_toggle: + m_Name: toggle + m_Normal: + m_Background: {fileID: 11018, guid: 0000000000000000e000000000000000, type: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0.89112896, g: 0.89112896, b: 0.89112896, a: 1} + m_Hover: + m_Background: {fileID: 11014, guid: 0000000000000000e000000000000000, type: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 1, g: 1, b: 1, a: 1} + m_Active: + m_Background: {fileID: 11013, guid: 0000000000000000e000000000000000, type: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 1, g: 1, b: 1, a: 1} + m_Focused: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_OnNormal: + m_Background: {fileID: 11016, guid: 0000000000000000e000000000000000, type: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0.8901961, g: 0.8901961, b: 0.8901961, a: 1} + m_OnHover: + m_Background: {fileID: 11015, guid: 0000000000000000e000000000000000, type: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 1, g: 1, b: 1, a: 1} + m_OnActive: + m_Background: {fileID: 11017, guid: 0000000000000000e000000000000000, type: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 1, g: 1, b: 1, a: 1} + m_OnFocused: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_Border: + m_Left: 14 + m_Right: 0 + m_Top: 14 + m_Bottom: 0 + m_Margin: + m_Left: 4 + m_Right: 4 + m_Top: 4 + m_Bottom: 4 + m_Padding: + m_Left: 15 + m_Right: 0 + m_Top: 3 + m_Bottom: 0 + m_Overflow: + m_Left: -1 + m_Right: 0 + m_Top: -4 + m_Bottom: 0 + m_Font: {fileID: 0} + m_FontSize: 0 + m_FontStyle: 0 + m_Alignment: 0 + m_WordWrap: 0 + m_RichText: 1 + m_TextClipping: 1 + m_ImagePosition: 0 + m_ContentOffset: {x: 0, y: 0} + m_FixedWidth: 0 + m_FixedHeight: 0 + m_StretchWidth: 1 + m_StretchHeight: 0 + m_label: + m_Name: label + m_Normal: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0.9, g: 0.9, b: 0.9, a: 1} + m_Hover: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_Active: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_Focused: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_OnNormal: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_OnHover: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_OnActive: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_OnFocused: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_Border: + m_Left: 0 + m_Right: 0 + m_Top: 0 + m_Bottom: 0 + m_Margin: + m_Left: 4 + m_Right: 4 + m_Top: 4 + m_Bottom: 4 + m_Padding: + m_Left: 0 + m_Right: 0 + m_Top: 3 + m_Bottom: 3 + m_Overflow: + m_Left: 0 + m_Right: 0 + m_Top: 0 + m_Bottom: 0 + m_Font: {fileID: 0} + m_FontSize: 0 + m_FontStyle: 0 + m_Alignment: 0 + m_WordWrap: 1 + m_RichText: 1 + m_TextClipping: 1 + m_ImagePosition: 0 + m_ContentOffset: {x: 0, y: 0} + m_FixedWidth: 0 + m_FixedHeight: 0 + m_StretchWidth: 1 + m_StretchHeight: 0 + m_textField: + m_Name: textfield + m_Normal: + m_Background: {fileID: 11024, guid: 0000000000000000e000000000000000, type: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0.79999995, g: 0.79999995, b: 0.79999995, a: 1} + m_Hover: + m_Background: {fileID: 11026, guid: 0000000000000000e000000000000000, type: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0.9, g: 0.9, b: 0.9, a: 1} + m_Active: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_Focused: + m_Background: {fileID: 11026, guid: 0000000000000000e000000000000000, type: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 1, g: 1, b: 1, a: 1} + m_OnNormal: + m_Background: {fileID: 11025, guid: 0000000000000000e000000000000000, type: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 1, g: 1, b: 1, a: 1} + m_OnHover: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_OnActive: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_OnFocused: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_Border: + m_Left: 4 + m_Right: 4 + m_Top: 4 + m_Bottom: 4 + m_Margin: + m_Left: 4 + m_Right: 4 + m_Top: 4 + m_Bottom: 4 + m_Padding: + m_Left: 3 + m_Right: 3 + m_Top: 3 + m_Bottom: 3 + m_Overflow: + m_Left: 0 + m_Right: 0 + m_Top: 0 + m_Bottom: 0 + m_Font: {fileID: 0} + m_FontSize: 0 + m_FontStyle: 0 + m_Alignment: 0 + m_WordWrap: 0 + m_RichText: 0 + m_TextClipping: 1 + m_ImagePosition: 3 + m_ContentOffset: {x: 0, y: 0} + m_FixedWidth: 0 + m_FixedHeight: 0 + m_StretchWidth: 1 + m_StretchHeight: 0 + m_textArea: + m_Name: textarea + m_Normal: + m_Background: {fileID: 11024, guid: 0000000000000000e000000000000000, type: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0.9019608, g: 0.9019608, b: 0.9019608, a: 1} + m_Hover: + m_Background: {fileID: 11026, guid: 0000000000000000e000000000000000, type: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0.79999995, g: 0.79999995, b: 0.79999995, a: 1} + m_Active: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_Focused: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_OnNormal: + m_Background: {fileID: 11025, guid: 0000000000000000e000000000000000, type: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 1, g: 1, b: 1, a: 1} + m_OnHover: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_OnActive: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_OnFocused: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_Border: + m_Left: 4 + m_Right: 4 + m_Top: 4 + m_Bottom: 4 + m_Margin: + m_Left: 4 + m_Right: 4 + m_Top: 4 + m_Bottom: 4 + m_Padding: + m_Left: 3 + m_Right: 3 + m_Top: 3 + m_Bottom: 3 + m_Overflow: + m_Left: 0 + m_Right: 0 + m_Top: 0 + m_Bottom: 0 + m_Font: {fileID: 0} + m_FontSize: 0 + m_FontStyle: 0 + m_Alignment: 0 + m_WordWrap: 1 + m_RichText: 0 + m_TextClipping: 1 + m_ImagePosition: 0 + m_ContentOffset: {x: 0, y: 0} + m_FixedWidth: 0 + m_FixedHeight: 0 + m_StretchWidth: 1 + m_StretchHeight: 0 + m_window: + m_Name: window + m_Normal: + m_Background: {fileID: 11023, guid: 0000000000000000e000000000000000, type: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 1, g: 1, b: 1, a: 1} + m_Hover: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_Active: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_Focused: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_OnNormal: + m_Background: {fileID: 11022, guid: 0000000000000000e000000000000000, type: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 1, g: 1, b: 1, a: 1} + m_OnHover: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_OnActive: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_OnFocused: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_Border: + m_Left: 8 + m_Right: 8 + m_Top: 18 + m_Bottom: 8 + m_Margin: + m_Left: 0 + m_Right: 0 + m_Top: 0 + m_Bottom: 0 + m_Padding: + m_Left: 10 + m_Right: 10 + m_Top: 20 + m_Bottom: 10 + m_Overflow: + m_Left: 0 + m_Right: 0 + m_Top: 0 + m_Bottom: 0 + m_Font: {fileID: 0} + m_FontSize: 0 + m_FontStyle: 0 + m_Alignment: 1 + m_WordWrap: 0 + m_RichText: 1 + m_TextClipping: 1 + m_ImagePosition: 0 + m_ContentOffset: {x: 0, y: -18} + m_FixedWidth: 0 + m_FixedHeight: 0 + m_StretchWidth: 1 + m_StretchHeight: 0 + m_horizontalSlider: + m_Name: horizontalslider + m_Normal: + m_Background: {fileID: 11009, guid: 0000000000000000e000000000000000, type: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_Hover: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_Active: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_Focused: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_OnNormal: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_OnHover: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_OnActive: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_OnFocused: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_Border: + m_Left: 3 + m_Right: 3 + m_Top: 0 + m_Bottom: 0 + m_Margin: + m_Left: 4 + m_Right: 4 + m_Top: 4 + m_Bottom: 4 + m_Padding: + m_Left: -1 + m_Right: -1 + m_Top: 0 + m_Bottom: 0 + m_Overflow: + m_Left: 0 + m_Right: 0 + m_Top: -2 + m_Bottom: -3 + m_Font: {fileID: 0} + m_FontSize: 0 + m_FontStyle: 0 + m_Alignment: 0 + m_WordWrap: 0 + m_RichText: 1 + m_TextClipping: 1 + m_ImagePosition: 2 + m_ContentOffset: {x: 0, y: 0} + m_FixedWidth: 0 + m_FixedHeight: 12 + m_StretchWidth: 1 + m_StretchHeight: 0 + m_horizontalSliderThumb: + m_Name: horizontalsliderthumb + m_Normal: + m_Background: {fileID: 11011, guid: 0000000000000000e000000000000000, type: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_Hover: + m_Background: {fileID: 11012, guid: 0000000000000000e000000000000000, type: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_Active: + m_Background: {fileID: 11010, guid: 0000000000000000e000000000000000, type: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_Focused: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_OnNormal: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_OnHover: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_OnActive: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_OnFocused: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_Border: + m_Left: 4 + m_Right: 4 + m_Top: 0 + m_Bottom: 0 + m_Margin: + m_Left: 0 + m_Right: 0 + m_Top: 0 + m_Bottom: 0 + m_Padding: + m_Left: 7 + m_Right: 7 + m_Top: 0 + m_Bottom: 0 + m_Overflow: + m_Left: -1 + m_Right: -1 + m_Top: 0 + m_Bottom: 0 + m_Font: {fileID: 0} + m_FontSize: 0 + m_FontStyle: 0 + m_Alignment: 0 + m_WordWrap: 0 + m_RichText: 1 + m_TextClipping: 1 + m_ImagePosition: 2 + m_ContentOffset: {x: 0, y: 0} + m_FixedWidth: 0 + m_FixedHeight: 12 + m_StretchWidth: 1 + m_StretchHeight: 0 + m_verticalSlider: + m_Name: verticalslider + m_Normal: + m_Background: {fileID: 11021, guid: 0000000000000000e000000000000000, type: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_Hover: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_Active: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_Focused: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_OnNormal: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_OnHover: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_OnActive: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_OnFocused: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_Border: + m_Left: 0 + m_Right: 0 + m_Top: 3 + m_Bottom: 3 + m_Margin: + m_Left: 4 + m_Right: 4 + m_Top: 4 + m_Bottom: 4 + m_Padding: + m_Left: 0 + m_Right: 0 + m_Top: -1 + m_Bottom: -1 + m_Overflow: + m_Left: -2 + m_Right: -3 + m_Top: 0 + m_Bottom: 0 + m_Font: {fileID: 0} + m_FontSize: 0 + m_FontStyle: 0 + m_Alignment: 0 + m_WordWrap: 0 + m_RichText: 1 + m_TextClipping: 0 + m_ImagePosition: 0 + m_ContentOffset: {x: 0, y: 0} + m_FixedWidth: 12 + m_FixedHeight: 0 + m_StretchWidth: 0 + m_StretchHeight: 1 + m_verticalSliderThumb: + m_Name: verticalsliderthumb + m_Normal: + m_Background: {fileID: 11011, guid: 0000000000000000e000000000000000, type: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_Hover: + m_Background: {fileID: 11012, guid: 0000000000000000e000000000000000, type: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_Active: + m_Background: {fileID: 11010, guid: 0000000000000000e000000000000000, type: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_Focused: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_OnNormal: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_OnHover: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_OnActive: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_OnFocused: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_Border: + m_Left: 0 + m_Right: 0 + m_Top: 0 + m_Bottom: 0 + m_Margin: + m_Left: 0 + m_Right: 0 + m_Top: 0 + m_Bottom: 0 + m_Padding: + m_Left: 0 + m_Right: 0 + m_Top: 7 + m_Bottom: 7 + m_Overflow: + m_Left: 0 + m_Right: 0 + m_Top: -1 + m_Bottom: -1 + m_Font: {fileID: 0} + m_FontSize: 0 + m_FontStyle: 0 + m_Alignment: 0 + m_WordWrap: 0 + m_RichText: 1 + m_TextClipping: 1 + m_ImagePosition: 0 + m_ContentOffset: {x: 0, y: 0} + m_FixedWidth: 12 + m_FixedHeight: 0 + m_StretchWidth: 0 + m_StretchHeight: 1 + m_horizontalScrollbar: + m_Name: horizontalscrollbar + m_Normal: + m_Background: {fileID: 11008, guid: 0000000000000000e000000000000000, type: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_Hover: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_Active: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_Focused: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_OnNormal: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_OnHover: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_OnActive: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_OnFocused: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_Border: + m_Left: 9 + m_Right: 9 + m_Top: 0 + m_Bottom: 0 + m_Margin: + m_Left: 4 + m_Right: 4 + m_Top: 1 + m_Bottom: 4 + m_Padding: + m_Left: 0 + m_Right: 0 + m_Top: 0 + m_Bottom: 0 + m_Overflow: + m_Left: 0 + m_Right: 0 + m_Top: 0 + m_Bottom: 0 + m_Font: {fileID: 0} + m_FontSize: 0 + m_FontStyle: 0 + m_Alignment: 0 + m_WordWrap: 0 + m_RichText: 1 + m_TextClipping: 1 + m_ImagePosition: 2 + m_ContentOffset: {x: 0, y: 0} + m_FixedWidth: 0 + m_FixedHeight: 15 + m_StretchWidth: 1 + m_StretchHeight: 0 + m_horizontalScrollbarThumb: + m_Name: horizontalscrollbarthumb + m_Normal: + m_Background: {fileID: 11007, guid: 0000000000000000e000000000000000, type: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_Hover: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_Active: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_Focused: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_OnNormal: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_OnHover: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_OnActive: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_OnFocused: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_Border: + m_Left: 6 + m_Right: 6 + m_Top: 6 + m_Bottom: 6 + m_Margin: + m_Left: 0 + m_Right: 0 + m_Top: 0 + m_Bottom: 0 + m_Padding: + m_Left: 6 + m_Right: 6 + m_Top: 0 + m_Bottom: 0 + m_Overflow: + m_Left: 0 + m_Right: 0 + m_Top: -1 + m_Bottom: 1 + m_Font: {fileID: 0} + m_FontSize: 0 + m_FontStyle: 0 + m_Alignment: 0 + m_WordWrap: 0 + m_RichText: 1 + m_TextClipping: 1 + m_ImagePosition: 0 + m_ContentOffset: {x: 0, y: 0} + m_FixedWidth: 0 + m_FixedHeight: 13 + m_StretchWidth: 1 + m_StretchHeight: 0 + m_horizontalScrollbarLeftButton: + m_Name: horizontalscrollbarleftbutton + m_Normal: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_Hover: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_Active: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_Focused: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_OnNormal: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_OnHover: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_OnActive: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_OnFocused: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_Border: + m_Left: 0 + m_Right: 0 + m_Top: 0 + m_Bottom: 0 + m_Margin: + m_Left: 0 + m_Right: 0 + m_Top: 0 + m_Bottom: 0 + m_Padding: + m_Left: 0 + m_Right: 0 + m_Top: 0 + m_Bottom: 0 + m_Overflow: + m_Left: 0 + m_Right: 0 + m_Top: 0 + m_Bottom: 0 + m_Font: {fileID: 0} + m_FontSize: 0 + m_FontStyle: 0 + m_Alignment: 0 + m_WordWrap: 0 + m_RichText: 1 + m_TextClipping: 1 + m_ImagePosition: 0 + m_ContentOffset: {x: 0, y: 0} + m_FixedWidth: 0 + m_FixedHeight: 0 + m_StretchWidth: 1 + m_StretchHeight: 0 + m_horizontalScrollbarRightButton: + m_Name: horizontalscrollbarrightbutton + m_Normal: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_Hover: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_Active: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_Focused: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_OnNormal: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_OnHover: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_OnActive: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_OnFocused: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_Border: + m_Left: 0 + m_Right: 0 + m_Top: 0 + m_Bottom: 0 + m_Margin: + m_Left: 0 + m_Right: 0 + m_Top: 0 + m_Bottom: 0 + m_Padding: + m_Left: 0 + m_Right: 0 + m_Top: 0 + m_Bottom: 0 + m_Overflow: + m_Left: 0 + m_Right: 0 + m_Top: 0 + m_Bottom: 0 + m_Font: {fileID: 0} + m_FontSize: 0 + m_FontStyle: 0 + m_Alignment: 0 + m_WordWrap: 0 + m_RichText: 1 + m_TextClipping: 1 + m_ImagePosition: 0 + m_ContentOffset: {x: 0, y: 0} + m_FixedWidth: 0 + m_FixedHeight: 0 + m_StretchWidth: 1 + m_StretchHeight: 0 + m_verticalScrollbar: + m_Name: verticalscrollbar + m_Normal: + m_Background: {fileID: 11020, guid: 0000000000000000e000000000000000, type: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_Hover: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_Active: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_Focused: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_OnNormal: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_OnHover: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_OnActive: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_OnFocused: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_Border: + m_Left: 0 + m_Right: 0 + m_Top: 9 + m_Bottom: 9 + m_Margin: + m_Left: 1 + m_Right: 4 + m_Top: 4 + m_Bottom: 4 + m_Padding: + m_Left: 0 + m_Right: 0 + m_Top: 1 + m_Bottom: 1 + m_Overflow: + m_Left: 0 + m_Right: 0 + m_Top: 0 + m_Bottom: 0 + m_Font: {fileID: 0} + m_FontSize: 0 + m_FontStyle: 0 + m_Alignment: 0 + m_WordWrap: 0 + m_RichText: 1 + m_TextClipping: 1 + m_ImagePosition: 0 + m_ContentOffset: {x: 0, y: 0} + m_FixedWidth: 15 + m_FixedHeight: 0 + m_StretchWidth: 1 + m_StretchHeight: 0 + m_verticalScrollbarThumb: + m_Name: verticalscrollbarthumb + m_Normal: + m_Background: {fileID: 11019, guid: 0000000000000000e000000000000000, type: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_Hover: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_Active: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_Focused: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_OnNormal: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_OnHover: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_OnActive: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_OnFocused: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_Border: + m_Left: 6 + m_Right: 6 + m_Top: 6 + m_Bottom: 6 + m_Margin: + m_Left: 0 + m_Right: 0 + m_Top: 0 + m_Bottom: 0 + m_Padding: + m_Left: 0 + m_Right: 0 + m_Top: 6 + m_Bottom: 6 + m_Overflow: + m_Left: -1 + m_Right: -1 + m_Top: 0 + m_Bottom: 0 + m_Font: {fileID: 0} + m_FontSize: 0 + m_FontStyle: 0 + m_Alignment: 0 + m_WordWrap: 0 + m_RichText: 1 + m_TextClipping: 1 + m_ImagePosition: 2 + m_ContentOffset: {x: 0, y: 0} + m_FixedWidth: 15 + m_FixedHeight: 0 + m_StretchWidth: 0 + m_StretchHeight: 1 + m_verticalScrollbarUpButton: + m_Name: verticalscrollbarupbutton + m_Normal: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_Hover: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_Active: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_Focused: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_OnNormal: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_OnHover: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_OnActive: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_OnFocused: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_Border: + m_Left: 0 + m_Right: 0 + m_Top: 0 + m_Bottom: 0 + m_Margin: + m_Left: 0 + m_Right: 0 + m_Top: 0 + m_Bottom: 0 + m_Padding: + m_Left: 0 + m_Right: 0 + m_Top: 0 + m_Bottom: 0 + m_Overflow: + m_Left: 0 + m_Right: 0 + m_Top: 0 + m_Bottom: 0 + m_Font: {fileID: 0} + m_FontSize: 0 + m_FontStyle: 0 + m_Alignment: 0 + m_WordWrap: 0 + m_RichText: 1 + m_TextClipping: 1 + m_ImagePosition: 0 + m_ContentOffset: {x: 0, y: 0} + m_FixedWidth: 0 + m_FixedHeight: 0 + m_StretchWidth: 1 + m_StretchHeight: 0 + m_verticalScrollbarDownButton: + m_Name: verticalscrollbardownbutton + m_Normal: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_Hover: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_Active: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_Focused: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_OnNormal: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_OnHover: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_OnActive: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_OnFocused: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_Border: + m_Left: 0 + m_Right: 0 + m_Top: 0 + m_Bottom: 0 + m_Margin: + m_Left: 0 + m_Right: 0 + m_Top: 0 + m_Bottom: 0 + m_Padding: + m_Left: 0 + m_Right: 0 + m_Top: 0 + m_Bottom: 0 + m_Overflow: + m_Left: 0 + m_Right: 0 + m_Top: 0 + m_Bottom: 0 + m_Font: {fileID: 0} + m_FontSize: 0 + m_FontStyle: 0 + m_Alignment: 0 + m_WordWrap: 0 + m_RichText: 1 + m_TextClipping: 1 + m_ImagePosition: 0 + m_ContentOffset: {x: 0, y: 0} + m_FixedWidth: 0 + m_FixedHeight: 0 + m_StretchWidth: 1 + m_StretchHeight: 0 + m_ScrollView: + m_Name: scrollview + m_Normal: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_Hover: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_Active: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_Focused: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_OnNormal: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_OnHover: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_OnActive: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_OnFocused: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_Border: + m_Left: 0 + m_Right: 0 + m_Top: 0 + m_Bottom: 0 + m_Margin: + m_Left: 0 + m_Right: 0 + m_Top: 0 + m_Bottom: 0 + m_Padding: + m_Left: 0 + m_Right: 0 + m_Top: 0 + m_Bottom: 0 + m_Overflow: + m_Left: 0 + m_Right: 0 + m_Top: 0 + m_Bottom: 0 + m_Font: {fileID: 0} + m_FontSize: 0 + m_FontStyle: 0 + m_Alignment: 0 + m_WordWrap: 0 + m_RichText: 1 + m_TextClipping: 1 + m_ImagePosition: 0 + m_ContentOffset: {x: 0, y: 0} + m_FixedWidth: 0 + m_FixedHeight: 0 + m_StretchWidth: 1 + m_StretchHeight: 0 + m_CustomStyles: + - m_Name: + m_Normal: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_Hover: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_Active: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_Focused: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_OnNormal: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_OnHover: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_OnActive: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_OnFocused: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_Border: + m_Left: 0 + m_Right: 0 + m_Top: 0 + m_Bottom: 0 + m_Margin: + m_Left: 0 + m_Right: 0 + m_Top: 0 + m_Bottom: 0 + m_Padding: + m_Left: 0 + m_Right: 0 + m_Top: 0 + m_Bottom: 0 + m_Overflow: + m_Left: 0 + m_Right: 0 + m_Top: 0 + m_Bottom: 0 + m_Font: {fileID: 0} + m_FontSize: 0 + m_FontStyle: 0 + m_Alignment: 0 + m_WordWrap: 0 + m_RichText: 1 + m_TextClipping: 0 + m_ImagePosition: 0 + m_ContentOffset: {x: 0, y: 0} + m_FixedWidth: 0 + m_FixedHeight: 0 + m_StretchWidth: 1 + m_StretchHeight: 0 + m_Settings: + m_DoubleClickSelectsWord: 1 + m_TripleClickSelectsLine: 1 + m_CursorColor: {r: 1, g: 1, b: 1, a: 1} + m_CursorFlashSpeed: -1 + m_SelectionColor: {r: 1, g: 0.38403907, b: 0, a: 0.7} diff --git a/Assets/HCMiniSdk/Third/ta/Sample/Assets/td_skin.guiskin.meta b/Assets/HCMiniSdk/Third/ta/Sample/Assets/td_skin.guiskin.meta new file mode 100644 index 00000000..c4fb4207 --- /dev/null +++ b/Assets/HCMiniSdk/Third/ta/Sample/Assets/td_skin.guiskin.meta @@ -0,0 +1,4 @@ +fileFormatVersion: 2 +guid: 48b9be70902884a76ba1b53926fd3e37 +NativeFormatImporter: + userData: diff --git a/Assets/HCMiniSdk/Third/ta/Sample/OtherScene.cs b/Assets/HCMiniSdk/Third/ta/Sample/OtherScene.cs new file mode 100644 index 00000000..8710fb78 --- /dev/null +++ b/Assets/HCMiniSdk/Third/ta/Sample/OtherScene.cs @@ -0,0 +1,32 @@ +using System.Collections; +using System.Collections.Generic; +using UnityEngine; +using UnityEngine.SceneManagement; +using ThinkingData.Analytics; + +public class OtherScene : MonoBehaviour +{ + // Start is called before the first frame update + void Start() + { + + } + + // Update is called once per frame + void Update() + { + + } + + void OnGUI() + { + if (GUI.Button(new Rect(20, 40, 300, 50), "Back To TDAnalyticsDemo")) + { + SceneManager.LoadScene("TDAnalyticsDemo", LoadSceneMode.Single); + } + if (GUI.Button(new Rect(20*2+300, 40, 300, 50), "TrackEvent")) + { + TDAnalytics.Track("TA", new Dictionary() { { "other_scene", "OtherScene" } }); + } + } +} diff --git a/Assets/HCMiniSdk/Third/ta/Sample/OtherScene.cs.meta b/Assets/HCMiniSdk/Third/ta/Sample/OtherScene.cs.meta new file mode 100644 index 00000000..12f3f263 --- /dev/null +++ b/Assets/HCMiniSdk/Third/ta/Sample/OtherScene.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: 157108d09ae574dedb267eedc3438757 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/HCMiniSdk/Third/ta/Sample/OtherScene.unity b/Assets/HCMiniSdk/Third/ta/Sample/OtherScene.unity new file mode 100644 index 00000000..c8a76836 --- /dev/null +++ b/Assets/HCMiniSdk/Third/ta/Sample/OtherScene.unity @@ -0,0 +1,316 @@ +%YAML 1.1 +%TAG !u! tag:unity3d.com,2011: +--- !u!29 &1 +OcclusionCullingSettings: + m_ObjectHideFlags: 0 + serializedVersion: 2 + m_OcclusionBakeSettings: + smallestOccluder: 5 + smallestHole: 0.25 + backfaceThreshold: 100 + m_SceneGUID: 00000000000000000000000000000000 + m_OcclusionCullingData: {fileID: 0} +--- !u!104 &2 +RenderSettings: + m_ObjectHideFlags: 0 + serializedVersion: 9 + m_Fog: 0 + m_FogColor: {r: 0.5, g: 0.5, b: 0.5, a: 1} + m_FogMode: 3 + m_FogDensity: 0.01 + m_LinearFogStart: 0 + m_LinearFogEnd: 300 + m_AmbientSkyColor: {r: 0.212, g: 0.227, b: 0.259, a: 1} + m_AmbientEquatorColor: {r: 0.114, g: 0.125, b: 0.133, a: 1} + m_AmbientGroundColor: {r: 0.047, g: 0.043, b: 0.035, a: 1} + m_AmbientIntensity: 1 + m_AmbientMode: 0 + m_SubtractiveShadowColor: {r: 0.42, g: 0.478, b: 0.627, a: 1} + m_SkyboxMaterial: {fileID: 10304, guid: 0000000000000000f000000000000000, type: 0} + m_HaloStrength: 0.5 + m_FlareStrength: 1 + m_FlareFadeSpeed: 3 + m_HaloTexture: {fileID: 0} + m_SpotCookie: {fileID: 10001, guid: 0000000000000000e000000000000000, type: 0} + m_DefaultReflectionMode: 0 + m_DefaultReflectionResolution: 128 + m_ReflectionBounces: 1 + m_ReflectionIntensity: 1 + m_CustomReflection: {fileID: 0} + m_Sun: {fileID: 0} + m_IndirectSpecularColor: {r: 0.18018606, g: 0.22559257, b: 0.30678663, a: 1} + m_UseRadianceAmbientProbe: 0 +--- !u!157 &3 +LightmapSettings: + m_ObjectHideFlags: 0 + serializedVersion: 12 + m_GIWorkflowMode: 1 + m_GISettings: + serializedVersion: 2 + m_BounceScale: 1 + m_IndirectOutputScale: 1 + m_AlbedoBoost: 1 + m_EnvironmentLightingMode: 0 + m_EnableBakedLightmaps: 1 + m_EnableRealtimeLightmaps: 0 + m_LightmapEditorSettings: + serializedVersion: 12 + m_Resolution: 2 + m_BakeResolution: 40 + m_AtlasSize: 1024 + m_AO: 0 + m_AOMaxDistance: 1 + m_CompAOExponent: 1 + m_CompAOExponentDirect: 0 + m_ExtractAmbientOcclusion: 0 + m_Padding: 2 + m_LightmapParameters: {fileID: 0} + m_LightmapsBakeMode: 1 + m_TextureCompression: 1 + m_FinalGather: 0 + m_FinalGatherFiltering: 1 + m_FinalGatherRayCount: 256 + m_ReflectionCompression: 2 + m_MixedBakeMode: 2 + m_BakeBackend: 1 + m_PVRSampling: 1 + m_PVRDirectSampleCount: 32 + m_PVRSampleCount: 512 + m_PVRBounces: 2 + m_PVREnvironmentSampleCount: 256 + m_PVREnvironmentReferencePointCount: 2048 + m_PVRFilteringMode: 1 + m_PVRDenoiserTypeDirect: 1 + m_PVRDenoiserTypeIndirect: 1 + m_PVRDenoiserTypeAO: 1 + m_PVRFilterTypeDirect: 0 + m_PVRFilterTypeIndirect: 0 + m_PVRFilterTypeAO: 0 + m_PVREnvironmentMIS: 1 + m_PVRCulling: 1 + m_PVRFilteringGaussRadiusDirect: 1 + m_PVRFilteringGaussRadiusIndirect: 5 + m_PVRFilteringGaussRadiusAO: 2 + m_PVRFilteringAtrousPositionSigmaDirect: 0.5 + m_PVRFilteringAtrousPositionSigmaIndirect: 2 + m_PVRFilteringAtrousPositionSigmaAO: 1 + m_ExportTrainingData: 0 + m_TrainingDataDestination: TrainingData + m_LightProbeSampleCountMultiplier: 4 + m_LightingDataAsset: {fileID: 0} + m_LightingSettings: {fileID: 0} +--- !u!196 &4 +NavMeshSettings: + serializedVersion: 2 + m_ObjectHideFlags: 0 + m_BuildSettings: + serializedVersion: 2 + agentTypeID: 0 + agentRadius: 0.5 + agentHeight: 2 + agentSlope: 45 + agentClimb: 0.4 + ledgeDropHeight: 0 + maxJumpAcrossDistance: 0 + minRegionArea: 2 + manualCellSize: 0 + cellSize: 0.16666667 + manualTileSize: 0 + tileSize: 256 + accuratePlacement: 0 + maxJobWorkers: 0 + preserveTilesOutsideBounds: 0 + debug: + m_Flags: 0 + m_NavMeshData: {fileID: 0} +--- !u!1 &1123045975 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 1123045978} + - component: {fileID: 1123045977} + - component: {fileID: 1123045976} + m_Layer: 0 + m_Name: Main Camera + m_TagString: MainCamera + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!81 &1123045976 +AudioListener: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1123045975} + m_Enabled: 0 +--- !u!20 &1123045977 +Camera: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1123045975} + m_Enabled: 1 + serializedVersion: 2 + m_ClearFlags: 1 + m_BackGroundColor: {r: 0.0039215684, g: 0.3612774, b: 1, a: 0} + m_projectionMatrixMode: 1 + m_GateFitMode: 2 + m_FOVAxisMode: 0 + m_SensorSize: {x: 36, y: 24} + m_LensShift: {x: 0, y: 0} + m_FocalLength: 50 + m_NormalizedViewPortRect: + serializedVersion: 2 + x: 0 + y: 0 + width: 1 + height: 1 + near clip plane: 0.3 + far clip plane: 1000 + field of view: 60 + orthographic: 0 + orthographic size: 5 + m_Depth: -1 + m_CullingMask: + serializedVersion: 2 + m_Bits: 4294967295 + m_RenderingPath: -1 + m_TargetTexture: {fileID: 0} + m_TargetDisplay: 0 + m_TargetEye: 3 + m_HDR: 1 + m_AllowMSAA: 1 + m_AllowDynamicResolution: 0 + m_ForceIntoRT: 0 + m_OcclusionCulling: 1 + m_StereoConvergence: 10 + m_StereoSeparation: 0.022 +--- !u!4 &1123045978 +Transform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1123045975} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: 0, y: 1, z: -10} + m_LocalScale: {x: 1, y: 1, z: 1} + m_ConstrainProportionsScale: 0 + m_Children: [] + m_Father: {fileID: 0} + m_RootOrder: 0 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} +--- !u!1 &1248963544 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 1248963546} + - component: {fileID: 1248963545} + - component: {fileID: 1248963547} + m_Layer: 0 + m_Name: Directional Light + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!108 &1248963545 +Light: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1248963544} + m_Enabled: 1 + serializedVersion: 10 + m_Type: 1 + m_Shape: 0 + m_Color: {r: 0.003921569, g: 0.28235295, b: 1, a: 1} + m_Intensity: 1 + m_Range: 10 + m_SpotAngle: 30 + m_InnerSpotAngle: 21.80208 + m_CookieSize: 10 + m_Shadows: + m_Type: 2 + m_Resolution: -1 + m_CustomResolution: -1 + m_Strength: 1 + m_Bias: 0.05 + m_NormalBias: 0.4 + m_NearPlane: 0.2 + m_CullingMatrixOverride: + e00: 1 + e01: 0 + e02: 0 + e03: 0 + e10: 0 + e11: 1 + e12: 0 + e13: 0 + e20: 0 + e21: 0 + e22: 1 + e23: 0 + e30: 0 + e31: 0 + e32: 0 + e33: 1 + m_UseCullingMatrixOverride: 0 + m_Cookie: {fileID: 0} + m_DrawHalo: 0 + m_Flare: {fileID: 0} + m_RenderMode: 0 + m_CullingMask: + serializedVersion: 2 + m_Bits: 4294967295 + m_RenderingLayerMask: 1 + m_Lightmapping: 4 + m_LightShadowCasterMode: 0 + m_AreaSize: {x: 1, y: 1} + m_BounceIntensity: 1 + m_ColorTemperature: 6570 + m_UseColorTemperature: 0 + m_BoundingSphereOverride: {x: 0, y: 0, z: 0, w: 0} + m_UseBoundingSphereOverride: 0 + m_UseViewFrustumForShadowCasterCull: 1 + m_ShadowRadius: 0 + m_ShadowAngle: 0 +--- !u!4 &1248963546 +Transform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1248963544} + m_LocalRotation: {x: 0.40821788, y: -0.23456968, z: 0.10938163, w: 0.8754261} + m_LocalPosition: {x: 0, y: 3, z: 0} + m_LocalScale: {x: 1, y: 1, z: 1} + m_ConstrainProportionsScale: 0 + m_Children: [] + m_Father: {fileID: 0} + m_RootOrder: 1 + m_LocalEulerAnglesHint: {x: 50, y: -30, z: 0} +--- !u!114 &1248963547 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1248963544} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 157108d09ae574dedb267eedc3438757, type: 3} + m_Name: + m_EditorClassIdentifier: diff --git a/Assets/HCMiniSdk/Third/ta/Sample/OtherScene.unity.meta b/Assets/HCMiniSdk/Third/ta/Sample/OtherScene.unity.meta new file mode 100644 index 00000000..a39b6ff4 --- /dev/null +++ b/Assets/HCMiniSdk/Third/ta/Sample/OtherScene.unity.meta @@ -0,0 +1,7 @@ +fileFormatVersion: 2 +guid: 667cb3338b0414099b222ac71a908e8e +DefaultImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/HCMiniSdk/Third/ta/Sample/TAExample.cs b/Assets/HCMiniSdk/Third/ta/Sample/TAExample.cs new file mode 100644 index 00000000..cd2827a0 --- /dev/null +++ b/Assets/HCMiniSdk/Third/ta/Sample/TAExample.cs @@ -0,0 +1,384 @@ +using UnityEngine; +using UnityEngine.SceneManagement; +using ThinkingAnalytics; +using System.Collections.Generic; +using System; + +public class TAExample : MonoBehaviour, IDynamicSuperProperties, IAutoTrackEventCallback +{ + + + public GUISkin skin; + private Vector2 scrollPosition = Vector2.zero; + //private static Color MainColor = new Color(0, 0,0); + private static Color MainColor = new Color(84f / 255, 116f / 255, 241f / 255); + private static Color TextColor = new Color(153f / 255, 153f / 255, 153f / 255); + static int Margin = 20; + static int Height = 60; + static float ContainerWidth = Screen.width - 2 * Margin; + // dynamic super properties interface implementation + public Dictionary GetDynamicSuperProperties() + { + return new Dictionary() + { + {"dynamic_property", DateTime.Now} + }; + } + // auto-tracking events interface implementation + public Dictionary AutoTrackEventCallback(int type, Dictionaryproperties) + { + return new Dictionary() + { + {"auto_track_dynamic", DateTime.Today} + }; + } + + private void Awake() + { + } + private void Start() + { + // When automatically initializing ThinkingAnalytics, you can call EnableAutoTrack() in Start() to enable auto-tracking events + // enable auto-tracking events + // ThinkingAnalyticsAPI.EnableAutoTrack(AUTO_TRACK_EVENTS.ALL); + } + + void OnGUI() + { + GUILayout.BeginArea(new Rect(Margin, Screen.height * 0.15f, Screen.width-2*Margin, Screen.height)); + scrollPosition = GUILayout.BeginScrollView(new Vector2(0, 0), GUILayout.Width(Screen.width - 2 * Margin), GUILayout.Height(Screen.height - 100)); + GUIStyle style = GUI.skin.label; + style.fontSize = 25; + GUILayout.Label("Initialization / UserIDSetting",style); + + GUIStyle buttonStyle = GUI.skin.button; + buttonStyle.fontSize = 20; + GUILayout.BeginHorizontal(GUI.skin.box,GUILayout.Height(Height)); + if (GUILayout.Button("ManualInitialization", GUILayout.Height(Height))) + { + // 1. Manual initialization (ThinkingAnalytics prefab loaded) + // ThinkingAnalyticsAPI.StartThinkingAnalytics(); + + + // 2. Manual initialization (dynamically loading ThinkingAnalyticsAPI script) + new GameObject("ThinkingAnalytics", typeof(ThinkingAnalyticsAPI)); + + // 2.1 Set instance parameters + string appId = "22e445595b0f42bd8c5fe35bc44b88d6"; + string serverUrl = "https://receiver-ta-dev.thinkingdata.cn"; + ThinkingAnalyticsAPI.StartThinkingAnalytics(appId, serverUrl); + + // 2.1 Set personalized instance parameters + // string appId = "22e445595b0f42bd8c5fe35bc44b88d6"; + // string serverUrl = "https://receiver-ta-dev.thinkingdata.cn"; + // ThinkingAnalyticsAPI.TAMode mode = ThinkingAnalyticsAPI.TAMode.NORMAL; + // ThinkingAnalyticsAPI.TATimeZone timeZone = ThinkingAnalyticsAPI.TATimeZone.Local; + // ThinkingAnalyticsAPI.Token token = new ThinkingAnalyticsAPI.Token(appId, serverUrl, mode, timeZone); + // Enable encrypted transmission (only iOS/Android) + // token.enableEncrypt = true; + // token.encryptVersion = 0; + // token.encryptPublicKey = "MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQCIPi6aHymT1jdETRci6f1ck535n13IX3p9XNLFu5xncfzNFl6kFVMiMSXMIwWSW2lF6ELtIlDJ0B00qE9C02n6YbIAV+VvVkchydbWrm8VdnEJk/6tIydoUxGyM9pDT6U/PaoEiItl/BawDj3/+KW6U7AejYPij9uTQ4H3bQqj1wIDAQAB"; + // ThinkingAnalyticsAPI.StartThinkingAnalytics(token); + + // 2.2 Multi-project support + // string appId_2 = "1b1c1fef65e3482bad5c9d0e6a823356"; + // string serverUrl_2 = "https://receiver-ta-dev.thinkingdata.cn"; + // ThinkingAnalyticsAPI.TAMode mode_2 = ThinkingAnalyticsAPI.TAMode.NORMAL; + // ThinkingAnalyticsAPI.TATimeZone timeZone_2 = ThinkingAnalyticsAPI.TATimeZone.Local; + // ThinkingAnalyticsAPI.Token token_2 = new ThinkingAnalyticsAPI.Token(appId_2, serverUrl_2, mode_2, timeZone_2); + + // ThinkingAnalyticsAPI.Token[] tokens = new ThinkingAnalyticsAPI.Token[2]; + // tokens[0] = token; + // tokens[1] = token_2; + // ThinkingAnalyticsAPI.StartThinkingAnalytics(tokens); + + // Multi-item track events + // ThinkingAnalyticsAPI.Track("test_event"); + // ThinkingAnalyticsAPI.Track("test_event_2", appId:appId_2); + + + // Enable auto-tracking events + // ThinkingAnalyticsAPI.EnableAutoTrack(AUTO_TRACK_EVENTS.ALL); + // Enable auto-tracking events, and set properties + // ThinkingAnalyticsAPI.SetAutoTrackProperties(AUTO_TRACK_EVENTS.ALL, new Dictionary() + // { + // {"auto_track_static_1", "value_1"} + // }); + // ThinkingAnalyticsAPI.EnableAutoTrack(AUTO_TRACK_EVENTS.ALL, new Dictionary() + // { + // {"auto_track_static_2", "value_2"} + // }); + // Enable auto-tracking events, and set callback + // ThinkingAnalyticsAPI.EnableAutoTrack(AUTO_TRACK_EVENTS.ALL, this); + } + GUILayout.Space(20); + if (GUILayout.Button("SetAccountID", GUILayout.Height(Height))) + { + ThinkingAnalyticsAPI.Login("TA"); + } + GUILayout.Space(20); + if (GUILayout.Button("SetDistinctID", GUILayout.Height(Height))) + { + ThinkingAnalyticsAPI.Identify("TA_DistinctID"); + Debug.Log("DistinctID: " + ThinkingAnalyticsAPI.GetDistinctId()); + } + GUILayout.Space(20); + if (GUILayout.Button("ClearAccountID", GUILayout.Height(Height))) + { + ThinkingAnalyticsAPI.Logout(); + } + GUILayout.EndHorizontal(); + + GUILayout.Space(20); + GUILayout.Label("EventTracking", GUI.skin.label); + GUILayout.BeginHorizontal(GUI.skin.textArea, GUILayout.Height(Height)); + if (GUILayout.Button("TrackEvent", GUILayout.Height(Height))) + { + Dictionary properties = new Dictionary(); + properties["channel"] = "ta";//string + properties["age"] = 1;//number - int + properties["weight"] = 5.46;//number - float + properties["balance"] = -0.4;//number - negative + properties["isVip"] = true;//bool + properties["birthday"] = new DateTime(2022,01,01);//date + properties["object"] = new Dictionary() { { "key", "value" } };//object + properties["object_arr"] = new List() { new Dictionary() { { "key", "value" } } };//object array + properties["arr"] = new List() { "value" };//array + + ThinkingAnalyticsAPI.Track("TA", properties); + } + GUILayout.Space(20); + if (GUILayout.Button("TrackFirstEvent", GUILayout.Height(Height))) + { + Dictionary properties = new Dictionary(); + properties["status"] = 1; + TDFirstEvent firstEvent = new TDFirstEvent("DEVICE_FIRST", properties); + ThinkingAnalyticsAPI.Track(firstEvent); + } + GUILayout.Space(20); + if (GUILayout.Button("TrackUpdateEvent", GUILayout.Height(Height))) + { + Dictionary properties = new Dictionary(); + properties["status"] = 2; + TDUpdatableEvent updatableEvent = new TDUpdatableEvent("UPDATABLE_EVENT", properties, "test_event_id"); + updatableEvent.EventTime = DateTime.Now; + updatableEvent.EventTimeZone = TimeZoneInfo.Local; + ThinkingAnalyticsAPI.Track(updatableEvent); + } + + GUILayout.Space(20); + if (GUILayout.Button("TrackOverwriteEvent", GUILayout.Height(Height))) + { + Dictionary properties = new Dictionary(); + properties["status"] = 3; + TDOverWritableEvent overWritableEvent = new TDOverWritableEvent("OVERWRITABLE_EVENT", properties, "test_event_id"); + overWritableEvent.EventTime = DateTime.Now; + overWritableEvent.EventTimeZone = TimeZoneInfo.Utc; + ThinkingAnalyticsAPI.Track(overWritableEvent); + } + + GUILayout.EndHorizontal(); + GUILayout.BeginHorizontal(GUI.skin.textArea, GUILayout.Height(Height)); + if (GUILayout.Button("TimeEvent", GUILayout.Height(Height))) + { + ThinkingAnalyticsAPI.TimeEvent("TATimeEvent"); + } + + GUILayout.Space(20); + if (GUILayout.Button("Track-TimeEvent", GUILayout.Height(Height))) + { + ThinkingAnalyticsAPI.Track("TATimeEvent"); + } + + GUILayout.Space(20); + if (GUILayout.Button("TrackEventWithDate", GUILayout.Height(Height))) + { + Dictionary properties = new Dictionary(); + ThinkingAnalyticsAPI.Track("TA_Utc", properties, DateTime.Now.AddDays(1), TimeZoneInfo.Utc); + ThinkingAnalyticsAPI.Track("TA_Local", properties, DateTime.Now.AddDays(1), TimeZoneInfo.Local); + } + + GUILayout.Space(20); + if (GUILayout.Button("TrackEventWithLightInstance", GUILayout.Height(Height))) + { + string lightToken = ThinkingAnalyticsAPI.CreateLightInstance(); + ThinkingAnalyticsAPI.Login("light_account", lightToken); + ThinkingAnalyticsAPI.Track("light_event", lightToken); + } + GUILayout.EndHorizontal(); + + + + + GUILayout.Space(20); + GUILayout.Label("UserProperty", GUI.skin.label); + GUILayout.BeginHorizontal(GUI.skin.textArea, GUILayout.Height(Height)); + if (GUILayout.Button("UserSet", GUILayout.Height(Height))) + { + Dictionary userProperties = new Dictionary(); + userProperties["age"] = 1; + ThinkingAnalyticsAPI.UserSet(userProperties); + } + + GUILayout.Space(20); + if (GUILayout.Button("UserSetOnce", GUILayout.Height(Height))) + { + Dictionary userProperties = new Dictionary(); + userProperties["gender"] = 1; + ThinkingAnalyticsAPI.UserSetOnce(userProperties); + + } + GUILayout.Space(20); + if (GUILayout.Button("UserAdd", GUILayout.Height(Height))) + { + ThinkingAnalyticsAPI.UserAdd("usercoin", 1); + } + GUILayout.Space(20); + if (GUILayout.Button("UserUnset", GUILayout.Height(Height))) + { + ThinkingAnalyticsAPI.UserUnset("usercoin"); + } + GUILayout.Space(20); + if (GUILayout.Button("UserDelete", GUILayout.Height(Height))) + { + ThinkingAnalyticsAPI.UserDelete(); + } + GUILayout.Space(20); + if (GUILayout.Button("UserAppend", GUILayout.Height(Height))) + { + List propList = new List(); + propList.Add("ball"); + Dictionary userProperties = new Dictionary(); + userProperties["prop"] = propList; + ThinkingAnalyticsAPI.UserAppend(userProperties); + } + GUILayout.Space(20); + if (GUILayout.Button("UserUniqAppend", GUILayout.Height(Height))) + { + List propList = new List(); + propList.Add("apple"); + Dictionary userProperties = new Dictionary(); + userProperties["prop"] = propList; + ThinkingAnalyticsAPI.UserUniqAppend(userProperties); + } + GUILayout.EndHorizontal(); + + + + GUILayout.Space(20); + GUILayout.Label("OtherSetting", GUI.skin.label); + GUILayout.BeginHorizontal(GUI.skin.textArea, GUILayout.Height(Height)); + if (GUILayout.Button("Flush", GUILayout.Height(Height))) + { + ThinkingAnalyticsAPI.Flush(); + } + GUILayout.Space(20); + if (GUILayout.Button("GetDeviceID", GUILayout.Height(Height))) + { + Debug.Log("DeviceID: " + ThinkingAnalyticsAPI.GetDeviceId()); + } + GUILayout.Space(20); + if (GUILayout.Button("Pause", GUILayout.Height(Height))) + { + ThinkingAnalyticsAPI.SetTrackStatus(TA_TRACK_STATUS.PAUSE); + } + GUILayout.Space(20); + if (GUILayout.Button("Stop", GUILayout.Height(Height))) + { + ThinkingAnalyticsAPI.SetTrackStatus(TA_TRACK_STATUS.STOP); + } + GUILayout.Space(20); + if (GUILayout.Button("SaveOnly", GUILayout.Height(Height))) + { + ThinkingAnalyticsAPI.SetTrackStatus(TA_TRACK_STATUS.SAVE_ONLY); + } + GUILayout.Space(20); + if (GUILayout.Button("Normal", GUILayout.Height(Height))) + { + ThinkingAnalyticsAPI.SetTrackStatus(TA_TRACK_STATUS.NORMAL); + } + GUILayout.Space(20); + if (GUILayout.Button("CalibrateTime", GUILayout.Height(Height))) + { + //currnt Unix timestamp, units Ms, e.g: 1608782412000 -> 2020-12-24 12:00:12 + ThinkingAnalyticsAPI.CalibrateTime(1608782412000); + + //NTP server, e.g: time.apple.com + ThinkingAnalyticsAPI.CalibrateTimeWithNtp("time.apple.com"); + //ThinkingAnalyticsAPI.CalibrateTimeWithNtp("time1.google.com"); + } + GUILayout.EndHorizontal(); + + GUILayout.Space(20); + GUILayout.Label("PropertiesSetting", GUI.skin.label); + GUILayout.BeginHorizontal(GUI.skin.textArea, GUILayout.Height(Height)); + if (GUILayout.Button("SetSuperProperties", GUILayout.Height(Height))) + { + Dictionary superProperties = new Dictionary(); + superProperties["VipLevel"] = 1; + superProperties["VipTitle"] = "Supreme King"; + ThinkingAnalyticsAPI.SetSuperProperties(superProperties); + } + GUILayout.Space(20); + if (GUILayout.Button("UpdateSuperProperties", GUILayout.Height(Height))) + { + Dictionary superProperties = new Dictionary(); + superProperties["VipLevel"] = 2; + ThinkingAnalyticsAPI.SetSuperProperties(superProperties); + } + + GUILayout.Space(20); + if (GUILayout.Button("ClearSuperProperties", GUILayout.Height(Height))) + { + ThinkingAnalyticsAPI.UnsetSuperProperty("VipLevel"); + } + + GUILayout.Space(20); + if (GUILayout.Button("ClearAllSuperProperties", GUILayout.Height(Height))) + { + ThinkingAnalyticsAPI.ClearSuperProperties(); + } + + GUILayout.EndHorizontal(); + GUILayout.BeginHorizontal(GUI.skin.textArea, GUILayout.Height(Height)); + if (GUILayout.Button("SetDynamicSuperProperties", GUILayout.Height(Height))) + { + ThinkingAnalyticsAPI.SetDynamicSuperProperties(this); + } + + GUILayout.Space(20); + if (GUILayout.Button("GetSuperProperties", GUILayout.Height(Height))) + { + Dictionary eventSuperProperties = ThinkingAnalyticsAPI.GetSuperProperties(); + string propertiesStr = " "; + foreach (KeyValuePair kv in eventSuperProperties) + { + propertiesStr = propertiesStr + kv.Key + " = " + kv.Value + "\n "; + } + Debug.Log("SuperProperties: \n" + propertiesStr); + } + GUILayout.Space(20); + if (GUILayout.Button("GetPresetProperties", GUILayout.Height(Height))) + { + TDPresetProperties presetProperties = ThinkingAnalyticsAPI.GetPresetProperties(); + string deviceModel = presetProperties.DeviceModel; + Debug.Log("TDPresetProperties DeviceModel is " + deviceModel); + Dictionary eventPresetProperties = presetProperties.ToEventPresetProperties(); + string propertiesStr = " "; + foreach (KeyValuePair kv in eventPresetProperties) + { + propertiesStr = propertiesStr + kv.Key + " = " + kv.Value + "\n "; + } + Debug.Log("PresetProperties: \n" + propertiesStr); + } + + GUILayout.Space(20); + if (GUILayout.Button("LoadScene", GUILayout.Height(Height))) + { + SceneManager.LoadScene("OtherScene", LoadSceneMode.Single); + } + GUILayout.EndHorizontal(); + GUILayout.EndScrollView(); + GUILayout.EndArea(); + } +} diff --git a/Assets/HCMiniSdk/Third/ta/Sample/TAExample.cs.meta b/Assets/HCMiniSdk/Third/ta/Sample/TAExample.cs.meta new file mode 100644 index 00000000..87cf2263 --- /dev/null +++ b/Assets/HCMiniSdk/Third/ta/Sample/TAExample.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: 87d98871b303b4786b3dac3fd1b6e6eb +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/HCMiniSdk/Third/ta/Sample/TDAnalyticsDemo.cs b/Assets/HCMiniSdk/Third/ta/Sample/TDAnalyticsDemo.cs new file mode 100644 index 00000000..7efbcd30 --- /dev/null +++ b/Assets/HCMiniSdk/Third/ta/Sample/TDAnalyticsDemo.cs @@ -0,0 +1,505 @@ +using UnityEngine; +using UnityEngine.SceneManagement; +using ThinkingData.Analytics; +using System.Collections.Generic; +using System; +using System.Threading; +using System.Collections; + +public class TDAnalyticsDemo : MonoBehaviour, TDDynamicSuperPropertiesHandler, TDAutoTrackEventHandler +{ + + + public GUISkin skin; + private Vector2 scrollPosition = Vector2.zero; + //private static Color MainColor = new Color(0, 0,0); + private static Color MainColor = new Color(84f / 255, 116f / 255, 241f / 255); + private static Color TextColor = new Color(153f / 255, 153f / 255, 153f / 255); + static int Margin = 20; + static int Height = 60; + static float ContainerWidth = Screen.width - 2 * Margin; + // dynamic super properties interface implementation + public Dictionary GetDynamicSuperProperties() + { + Thread currentThread = Thread.CurrentThread; + // 输出当前线程的信息 + Debug.Log("当前线程ID: " + currentThread.ManagedThreadId); + return new Dictionary() + { + {"dynamic_property", DateTime.Now}, + {"dynamic_property1", DateTime.Now}, + {"dynamic_property2", DateTime.Now}, + {"dynamic_property3", DateTime.Now}, + {"dynamicTime4", DateTime.Now} + }; + } + // auto-tracking events interface implementation + public Dictionary GetAutoTrackEventProperties(int type, Dictionaryproperties) + { + return new Dictionary() + { + {"auto_track_dynamic", DateTime.Today} + }; + } + + private void Awake() + { + } + private void Start() + { + // When automatically initializing ThinkingAnalytics, you can call EnableAutoTrack() in Start() to enable auto-tracking events + // enable auto-tracking events + // TDAnalytics.EnableAutoTrack(TDAutoTrackEventType.ALL); + } + private void Update() + { + + } + + private void SampleDemo() + { + //Init SDK + string appId = "your-app-id"; + string serverUrl = "https://your.server.url"; + TDAnalytics.Init(appId, serverUrl); + + //Login SDK + TDAnalytics.Login("Tiki"); + + //Set Super Properties + //Dictionary superProperties = new Dictionary() { + // { "channel", "Apple Store" }, + // { "vip_level", 10 }, + // { "is_svip", true } + //}; + //TDAnalytics.SetSuperProperties(superProperties); + + + //Track Event + Dictionary eventProperties = new Dictionary() + { + { "product_name", "Majin Taito" }, + { "product_price", 6 }, + { "is_on_sale", true }, + { "begin_time", DateTime.Now }, + { "skins_name", new List() { + "Master Alchemist", + "Knights of the Round Table", + "Taotie", + "Glam Rock" + } } + }; + TDAnalytics.Track("product_buy", eventProperties); + + + //Track User Properties + Dictionary userProperties = new Dictionary() + { + { "email", "tiki@thinkingdata.cn" }, + { "diamond", 888 }, + { "is_svip", true }, + { "last_payment_time", DateTime.Now }, + { "owned_skins", new List() { + "Gun of Travel", + "Bow of Demigods", + "Golden Sagittarius" + } } + }; + TDAnalytics.UserSet(userProperties); + + } + + void OnGUI() + { + GUILayout.BeginArea(new Rect(Margin, Screen.height * 0.15f, Screen.width-2*Margin, Screen.height)); + scrollPosition = GUILayout.BeginScrollView(new Vector2(0, 0), GUILayout.Width(Screen.width - 2 * Margin), GUILayout.Height(Screen.height - 100)); + GUIStyle style = GUI.skin.label; + style.fontSize = 25; + GUILayout.Label("Initialization / UserIDSetting",style); + + GUIStyle buttonStyle = GUI.skin.button; + buttonStyle.fontSize = 20; + GUILayout.BeginHorizontal(GUI.skin.box,GUILayout.Height(Height)); + if (GUILayout.Button("ManualInitialization", GUILayout.Height(Height))) + { + // 1. Manual initialization (ThinkingAnalytics prefab loaded) + //TDAnalytics.Init(); + + + // 2. Manual initialization (dynamically loading TDAnalytics script) + //this.gameObject.AddComponent(); + + // 2.1 Set instance parameters + //string appId = "22e445595b0f42bd8c5fe35bc44b88d6"; + //string serverUrl = "https://receiver-ta-dev.thinkingdata.cn"; + //TDAnalytics.Init(appId, serverUrl); + + + // 2.1 Set personalized instance parameters + string appId = "1b1c1fef65e3482bad5c9d0e6a823356"; + string serverUrl = "https://receiver.ta.thinkingdata.cn"; + TDConfig tDConfig = new TDConfig(appId, serverUrl); + tDConfig.mode = TDMode.Normal; + tDConfig.timeZone = TDTimeZone.UTC; + //Enable encrypted transmission(only iOS / Android) + // int encryptVersion = 0; + //string encryptPublicKey = "MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQCIPi6aHymT1jdETRci6f1ck535n13IX3p9XNLFu5xncfzNFl6kFVMiMSXMIwWSW2lF6ELtIlDJ0B00qE9C02n6YbIAV+VvVkchydbWrm8VdnEJk/6tIydoUxGyM9pDT6U/PaoEiItl/BawDj3/+KW6U7AejYPij9uTQ4H3bQqj1wIDAQAB"; + //tDConfig.EnableEncrypt(encryptPublicKey, encryptVersion); + TDAnalytics.Init(tDConfig); + + TDAnalytics.SetDynamicSuperProperties(this); + + // 2.2 Multi-project support + // string appId_2 = "cf918051b394495ca85d1b7787ad7243"; + // string serverUrl_2 = "https://receiver-ta-dev.thinkingdata.cn"; + // TDConfig tDConfig_2 = new TDConfig(appId_2, serverUrl_2); + + // TDAnalytics.Init(tDConfig_2); + + // Multi-item track events + // TDAnalytics.Track("test_event"); + // TDAnalytics.Track("test_event_2", appId:appId_2); + + + // Enable auto-tracking events + TDAnalytics.EnableAutoTrack(TDAutoTrackEventType.All); + // Enable auto-tracking events, and set properties + // TDAnalytics.SetAutoTrackProperties(TDAutoTrackEventType.All, new Dictionary() + // { + // {"auto_track_static_1", "value_1"} + // }); + // TDAnalytics.EnableAutoTrack(TDAutoTrackEventType.All, new Dictionary() + // { + // {"auto_track_static_2", "value_2"} + // }); + // Enable auto-tracking events, and set callback + // TDAnalytics.EnableAutoTrack(TDAutoTrackEventType.All, this); + } + GUILayout.Space(20); + if (GUILayout.Button("SetAccountID", GUILayout.Height(Height))) + { + TDAnalytics.Login("TA"); + } + GUILayout.Space(20); + if (GUILayout.Button("SetDistinctID", GUILayout.Height(Height))) + { + TDAnalytics.SetDistinctId("TD_DistinctID"); + string distinctId = TDAnalytics.GetDistinctId(); + Debug.Log("Current Distinct ID is : " + distinctId); + } + GUILayout.Space(20); + if (GUILayout.Button("ClearAccountID", GUILayout.Height(Height))) + { + TDAnalytics.Logout(); + } + GUILayout.EndHorizontal(); + + GUILayout.Space(20); + GUILayout.Label("EventTracking", GUI.skin.label); + GUILayout.BeginHorizontal(GUI.skin.textArea, GUILayout.Height(Height)); + if (GUILayout.Button("TrackEvent", GUILayout.Height(Height))) + { + Debug.Log("======1" + DateTimeOffset.UtcNow.ToUnixTimeMilliseconds()); + //Dictionary properties = new Dictionary(); + //properties["channel"] = "ta";//string + //properties["age"] = 1;//number - int + //properties["weight"] = 5.46;//number - float + //properties["balance"] = -0.4;//number - negative + //properties["isVip"] = true;//bool + //properties["birthday"] = new DateTime(2022,01,01);//date + //properties["birthday1"] = new DateTime();//date + //properties["birthday2"] = new DateTime(2023, 05, 01);//date + //properties["birthday3"] = new DateTime(2023, 05, 03);//date + //properties["object"] = new Dictionary() { { "key", "value" },{ "key1", DateTime.Now }, { "key2", DateTime.Now } };//object + //properties["object_arr"] = new List() { new Dictionary() { { "key", "value" }, { "key3", DateTime.Now }, { "key4", DateTime.Now } } };//object array + //properties["arr"] = new List() { "value" };//array + //TDAnalytics.Track("TA", properties); + Dictionary properties = new Dictionary(); + properties["channel"] = "ta";//string + properties["age"] = 1;//number - int + properties["weight"] = 5.46;//number - float + properties["balance"] = -0.4;//number - negative + properties["isVip"] = true;//bool + properties["date1"] = new DateTime(); + properties["date2"] = new DateTime(); + properties["date3"] = new DateTime(); + properties["date4"] = new DateTime(); + properties["date5"] = new DateTime(); + properties["birthday"] = new DateTime(2022, 01, 01);//date + properties["object"] = new Dictionary() { { "key", "value" }, { "data1", new DateTime() }, { "data2", new DateTime() }, { "data3", new DateTime() }, { "data4", new DateTime() }, { "data5", new DateTime() } };//object + properties["object_arr"] = new List() { new Dictionary() { { "key", "value" }, { "data1", new DateTime() }, { "data2", new DateTime() }, { "data3", new DateTime() }, { "data4", new DateTime() }, { "data5", new DateTime() } } };//object array + properties["arr"] = new List() { "value", new DateTime(), new DateTime(), new DateTime(), new DateTime(), new DateTime() };//array + TDAnalytics.Track("TA", properties); + Debug.Log("======2" + DateTimeOffset.UtcNow.ToUnixTimeMilliseconds()); + } + GUILayout.Space(20); + if (GUILayout.Button("TrackFirstEvent", GUILayout.Height(Height))) + { + Dictionary properties = new Dictionary() { { "status",1 } }; + TDFirstEventModel firstEvent = new TDFirstEventModel("first_event"); + firstEvent.Properties = properties; + TDAnalytics.Track(firstEvent); + Dictionary properties_2 = new Dictionary() { { "status", 11 } }; + TDFirstEventModel firstEvent_2 = new TDFirstEventModel("first_event", "first_check_id"); + firstEvent_2.Properties = properties_2; + TDAnalytics.Track(firstEvent_2); + } + GUILayout.Space(20); + if (GUILayout.Button("TrackUpdateEvent", GUILayout.Height(Height))) + { + Dictionary properties = new Dictionary() { { "status", 2 } }; + TDUpdatableEventModel updatableEvent = new TDUpdatableEventModel("updatable_event", "test_event_id"); + updatableEvent.Properties = properties; + updatableEvent.SetTime(DateTime.Now, TimeZoneInfo.Local); + TDAnalytics.Track(updatableEvent); + } + + GUILayout.Space(20); + if (GUILayout.Button("TrackOverwriteEvent", GUILayout.Height(Height))) + { + Dictionary properties = new Dictionary() { { "status", 3 } }; + TDOverwritableEventModel overWritableEvent = new TDOverwritableEventModel("overwritable_event", "test_event_id"); + overWritableEvent.Properties = properties; + overWritableEvent.SetTime(DateTime.Now, TimeZoneInfo.Utc); + TDAnalytics.Track(overWritableEvent); + } + + GUILayout.EndHorizontal(); + GUILayout.BeginHorizontal(GUI.skin.textArea, GUILayout.Height(Height)); + if (GUILayout.Button("TimeEvent", GUILayout.Height(Height))) + { + TDAnalytics.TimeEvent("TATimeEvent"); + } + + GUILayout.Space(20); + if (GUILayout.Button("Track-TimeEvent", GUILayout.Height(Height))) + { + TDAnalytics.Track("TATimeEvent"); + } + + GUILayout.Space(20); + if (GUILayout.Button("TrackEventWithDate", GUILayout.Height(Height))) + { + Dictionary properties = new Dictionary(); + TDAnalytics.Track("TA_Utc", properties, DateTime.Now.AddDays(1), TimeZoneInfo.Utc); + TDAnalytics.Track("TA_Local", properties, DateTime.Now.AddDays(1), TimeZoneInfo.Local); + } + + GUILayout.Space(20); + if (GUILayout.Button("TrackEvent-LightInstance", GUILayout.Height(Height))) + { + string lightToken = TDAnalytics.LightInstance(); + TDAnalytics.Login("light_account", lightToken); + TDAnalytics.Track("light_event", lightToken); + TDAnalytics.Flush(); + } + GUILayout.Space(20); + if (GUILayout.Button("TrackEvent-MultiInstance", GUILayout.Height(Height))) + { + string appId_2 = "cf918051b394495ca85d1b7787ad7243"; + string serverUrl_2 = "https://receiver-ta-dev.thinkingdata.cn"; + TDConfig token_2 = new TDConfig(appId_2, serverUrl_2); + token_2.mode = TDMode.Normal; + token_2.timeZone = TDTimeZone.UTC; + // initial multi-instance + TDAnalytics.Init(token_2); + // login account + TDAnalytics.Login("Tiki", appId_2); + // track normal event + TDAnalytics.Track("TA", appId_2); + // track user properties + TDAnalytics.UserSet(new Dictionary() { { "age", 18 } }, appId_2); + // flush data + TDAnalytics.Flush(appId_2); + + string instanceName = "ThinkingData"; + TDConfig token_3 = new TDConfig(appId_2, serverUrl_2); + token_3.name = instanceName; + // initial multi-instance + TDAnalytics.Init(token_3); + // login account + TDAnalytics.Login("Thinker", instanceName); + // track normal event + TDAnalytics.Track("TA", instanceName); + // track user properties + TDAnalytics.UserSet(new Dictionary() { { "age", 18 } }, instanceName); + // flush data + TDAnalytics.Flush(instanceName); + } + GUILayout.EndHorizontal(); + + + + + GUILayout.Space(20); + GUILayout.Label("UserProperty", GUI.skin.label); + GUILayout.BeginHorizontal(GUI.skin.textArea, GUILayout.Height(Height)); + if (GUILayout.Button("UserSet", GUILayout.Height(Height))) + { + Dictionary userProperties = new Dictionary() { { "age", 18 } }; + TDAnalytics.UserSet(userProperties); + } + + GUILayout.Space(20); + if (GUILayout.Button("UserSetOnce", GUILayout.Height(Height))) + { + Dictionary userProperties = new Dictionary() { { "gender", 1 } }; + TDAnalytics.UserSetOnce(userProperties); + + } + GUILayout.Space(20); + if (GUILayout.Button("UserAdd", GUILayout.Height(Height))) + { + TDAnalytics.UserAdd("user_coin", 1); + } + GUILayout.Space(20); + if (GUILayout.Button("UserUnset", GUILayout.Height(Height))) + { + TDAnalytics.UserUnset("user_coin"); + TDAnalytics.UserUnset(new List() { "user_coin", "user_vip" }); + } + GUILayout.Space(20); + if (GUILayout.Button("UserDelete", GUILayout.Height(Height))) + { + TDAnalytics.UserDelete(); + } + GUILayout.Space(20); + if (GUILayout.Button("UserAppend", GUILayout.Height(Height))) + { + List propList = new List() { "apple", "ball" }; + Dictionary userProperties = new Dictionary() { { "prop", propList } }; + TDAnalytics.UserAppend(userProperties); + } + GUILayout.Space(20); + if (GUILayout.Button("UserUniqAppend", GUILayout.Height(Height))) + { + List propList = new List() { "apple", "banana" }; + Dictionary userProperties = new Dictionary() { { "prop", propList } }; + TDAnalytics.UserUniqAppend(userProperties); + } + GUILayout.EndHorizontal(); + + + + GUILayout.Space(20); + GUILayout.Label("OtherSetting", GUI.skin.label); + GUILayout.BeginHorizontal(GUI.skin.textArea, GUILayout.Height(Height)); + if (GUILayout.Button("Flush", GUILayout.Height(Height))) + { + TDAnalytics.Flush(); + } + GUILayout.Space(20); + if (GUILayout.Button("GetDeviceID", GUILayout.Height(Height))) + { + string deviceId = TDAnalytics.GetDeviceId(); + Debug.Log("Current Device ID is : " + deviceId); + } + GUILayout.Space(20); + if (GUILayout.Button("Pause", GUILayout.Height(Height))) + { + TDAnalytics.SetTrackStatus(TDTrackStatus.Pause); + } + GUILayout.Space(20); + if (GUILayout.Button("Stop", GUILayout.Height(Height))) + { + TDAnalytics.SetTrackStatus(TDTrackStatus.Stop); + } + GUILayout.Space(20); + if (GUILayout.Button("SaveOnly", GUILayout.Height(Height))) + { + TDAnalytics.SetTrackStatus(TDTrackStatus.SaveOnly); + } + GUILayout.Space(20); + if (GUILayout.Button("Normal", GUILayout.Height(Height))) + { + TDAnalytics.SetTrackStatus(TDTrackStatus.Normal); + } + GUILayout.Space(20); + if (GUILayout.Button("CalibrateTime", GUILayout.Height(Height))) + { + //currnt Unix timestamp, units Ms, e.g: 1672531200000 -> 2023-01-01 08:00:00 + TDAnalytics.CalibrateTime(1672531200000); + } + GUILayout.Space(20); + if (GUILayout.Button("CalibrateTime-NTP", GUILayout.Height(Height))) + { + //NTP server, e.g: time.apple.com + TDAnalytics.CalibrateTimeWithNtp("time.apple.com"); + } + GUILayout.EndHorizontal(); + + GUILayout.Space(20); + GUILayout.Label("PropertiesSetting", GUI.skin.label); + GUILayout.BeginHorizontal(GUI.skin.textArea, GUILayout.Height(Height)); + if (GUILayout.Button("SetSuperProperties", GUILayout.Height(Height))) + { + Dictionary superProperties = new Dictionary() { + { "vip_level", 1 }, + { "vip_title", "Supreme King" } + }; + TDAnalytics.SetSuperProperties(superProperties); + } + GUILayout.Space(20); + if (GUILayout.Button("UpdateSuperProperties", GUILayout.Height(Height))) + { + Dictionary superProperties = new Dictionary() { + { "vip_level", 2 } + }; + TDAnalytics.SetSuperProperties(superProperties); + } + + GUILayout.Space(20); + if (GUILayout.Button("ClearSuperProperties", GUILayout.Height(Height))) + { + TDAnalytics.UnsetSuperProperty("vip_level"); + } + + GUILayout.Space(20); + if (GUILayout.Button("ClearAllSuperProperties", GUILayout.Height(Height))) + { + TDAnalytics.ClearSuperProperties(); + } + + GUILayout.EndHorizontal(); + GUILayout.BeginHorizontal(GUI.skin.textArea, GUILayout.Height(Height)); + if (GUILayout.Button("SetDynamicSuperProperties", GUILayout.Height(Height))) + { + TDAnalytics.SetDynamicSuperProperties(this); + } + + GUILayout.Space(20); + if (GUILayout.Button("GetSuperProperties", GUILayout.Height(Height))) + { + Dictionary eventSuperProperties = TDAnalytics.GetSuperProperties(); + string propertiesStr = " "; + foreach (KeyValuePair kv in eventSuperProperties) + { + propertiesStr = propertiesStr + kv.Key + " = " + kv.Value + "\n "; + } + Debug.Log("SuperProperties: \n" + propertiesStr); + } + GUILayout.Space(20); + if (GUILayout.Button("GetPresetProperties", GUILayout.Height(Height))) + { + TDPresetProperties presetProperties = TDAnalytics.GetPresetProperties(); + string deviceModel = presetProperties.DeviceModel; + Debug.Log("TDPresetProperties: DeviceModel is " + deviceModel); + Dictionary eventPresetProperties = presetProperties.ToDictionary(); + string propertiesStr = " "; + foreach (KeyValuePair kv in eventPresetProperties) + { + propertiesStr = propertiesStr + kv.Key + " = " + kv.Value + "\n "; + } + Debug.Log("PresetProperties: \n" + propertiesStr); + } + + GUILayout.Space(20); + if (GUILayout.Button("LoadScene", GUILayout.Height(Height))) + { + SceneManager.LoadScene("OtherScene", LoadSceneMode.Single); + } + GUILayout.EndHorizontal(); + GUILayout.EndScrollView(); + GUILayout.EndArea(); + } +} diff --git a/Assets/HCMiniSdk/Third/ta/Sample/TDAnalyticsDemo.cs.meta b/Assets/HCMiniSdk/Third/ta/Sample/TDAnalyticsDemo.cs.meta new file mode 100644 index 00000000..bd3b0fa1 --- /dev/null +++ b/Assets/HCMiniSdk/Third/ta/Sample/TDAnalyticsDemo.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: fc3b54d5c2d4a455fbc56ab57ca985c6 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/HCMiniSdk/Third/ta/Sample/TDAnalyticsDemo.unity b/Assets/HCMiniSdk/Third/ta/Sample/TDAnalyticsDemo.unity new file mode 100644 index 00000000..8f761a38 --- /dev/null +++ b/Assets/HCMiniSdk/Third/ta/Sample/TDAnalyticsDemo.unity @@ -0,0 +1,509 @@ +%YAML 1.1 +%TAG !u! tag:unity3d.com,2011: +--- !u!29 &1 +OcclusionCullingSettings: + m_ObjectHideFlags: 0 + serializedVersion: 2 + m_OcclusionBakeSettings: + smallestOccluder: 5 + smallestHole: 0.25 + backfaceThreshold: 100 + m_SceneGUID: 00000000000000000000000000000000 + m_OcclusionCullingData: {fileID: 0} +--- !u!104 &2 +RenderSettings: + m_ObjectHideFlags: 0 + serializedVersion: 9 + m_Fog: 0 + m_FogColor: {r: 0.5, g: 0.5, b: 0.5, a: 1} + m_FogMode: 3 + m_FogDensity: 0.01 + m_LinearFogStart: 0 + m_LinearFogEnd: 300 + m_AmbientSkyColor: {r: 0.2, g: 0.2, b: 0.2, a: 1} + m_AmbientEquatorColor: {r: 0.2, g: 0.2, b: 0.2, a: 1} + m_AmbientGroundColor: {r: 0.2, g: 0.2, b: 0.2, a: 1} + m_AmbientIntensity: 1 + m_AmbientMode: 3 + m_SubtractiveShadowColor: {r: 0.42, g: 0.478, b: 0.627, a: 1} + m_SkyboxMaterial: {fileID: 0} + m_HaloStrength: 0.5 + m_FlareStrength: 1 + m_FlareFadeSpeed: 3 + m_HaloTexture: {fileID: 0} + m_SpotCookie: {fileID: 10001, guid: 0000000000000000e000000000000000, type: 0} + m_DefaultReflectionMode: 0 + m_DefaultReflectionResolution: 128 + m_ReflectionBounces: 1 + m_ReflectionIntensity: 1 + m_CustomReflection: {fileID: 0} + m_Sun: {fileID: 0} + m_IndirectSpecularColor: {r: 0, g: 0, b: 0, a: 1} + m_UseRadianceAmbientProbe: 0 +--- !u!157 &4 +LightmapSettings: + m_ObjectHideFlags: 0 + serializedVersion: 12 + m_GIWorkflowMode: 1 + m_GISettings: + serializedVersion: 2 + m_BounceScale: 1 + m_IndirectOutputScale: 1 + m_AlbedoBoost: 1 + m_EnvironmentLightingMode: 0 + m_EnableBakedLightmaps: 1 + m_EnableRealtimeLightmaps: 0 + m_LightmapEditorSettings: + serializedVersion: 12 + m_Resolution: 1 + m_BakeResolution: 50 + m_AtlasSize: 1024 + m_AO: 1 + m_AOMaxDistance: 1 + m_CompAOExponent: 1 + m_CompAOExponentDirect: 0 + m_ExtractAmbientOcclusion: 0 + m_Padding: 2 + m_LightmapParameters: {fileID: 0} + m_LightmapsBakeMode: 1 + m_TextureCompression: 0 + m_FinalGather: 0 + m_FinalGatherFiltering: 1 + m_FinalGatherRayCount: 256 + m_ReflectionCompression: 2 + m_MixedBakeMode: 1 + m_BakeBackend: 0 + m_PVRSampling: 1 + m_PVRDirectSampleCount: 32 + m_PVRSampleCount: 512 + m_PVRBounces: 2 + m_PVREnvironmentSampleCount: 512 + m_PVREnvironmentReferencePointCount: 2048 + m_PVRFilteringMode: 0 + m_PVRDenoiserTypeDirect: 0 + m_PVRDenoiserTypeIndirect: 0 + m_PVRDenoiserTypeAO: 0 + m_PVRFilterTypeDirect: 0 + m_PVRFilterTypeIndirect: 0 + m_PVRFilterTypeAO: 0 + m_PVREnvironmentMIS: 0 + m_PVRCulling: 1 + m_PVRFilteringGaussRadiusDirect: 1 + m_PVRFilteringGaussRadiusIndirect: 5 + m_PVRFilteringGaussRadiusAO: 2 + m_PVRFilteringAtrousPositionSigmaDirect: 0.5 + m_PVRFilteringAtrousPositionSigmaIndirect: 2 + m_PVRFilteringAtrousPositionSigmaAO: 1 + m_ExportTrainingData: 0 + m_TrainingDataDestination: TrainingData + m_LightProbeSampleCountMultiplier: 4 + m_LightingDataAsset: {fileID: 0} + m_LightingSettings: {fileID: 679135154} +--- !u!196 &5 +NavMeshSettings: + serializedVersion: 2 + m_ObjectHideFlags: 0 + m_BuildSettings: + serializedVersion: 2 + agentTypeID: 0 + agentRadius: 0.5 + agentHeight: 2 + agentSlope: 45 + agentClimb: 0.4 + ledgeDropHeight: 0 + maxJumpAcrossDistance: 0 + minRegionArea: 2 + manualCellSize: 0 + cellSize: 0.16666666 + manualTileSize: 0 + tileSize: 256 + accuratePlacement: 0 + maxJobWorkers: 0 + preserveTilesOutsideBounds: 0 + debug: + m_Flags: 0 + m_NavMeshData: {fileID: 0} +--- !u!1 &269916751 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 269916752} + - component: {fileID: 269916753} + m_Layer: 0 + m_Name: td_logo + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!4 &269916752 +Transform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 269916751} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: 0, y: 4, z: 0} + m_LocalScale: {x: 1.3, y: 1.3, z: 1.3} + m_ConstrainProportionsScale: 0 + m_Children: [] + m_Father: {fileID: 1608319071} + m_RootOrder: 0 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} +--- !u!212 &269916753 +SpriteRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 269916751} + m_Enabled: 1 + m_CastShadows: 0 + m_ReceiveShadows: 0 + m_DynamicOccludee: 1 + m_StaticShadowCaster: 0 + m_MotionVectors: 1 + m_LightProbeUsage: 0 + m_ReflectionProbeUsage: 1 + m_RayTracingMode: 0 + m_RayTraceProcedural: 0 + m_RenderingLayerMask: 1 + m_RendererPriority: 0 + m_Materials: + - {fileID: 10754, guid: 0000000000000000f000000000000000, type: 0} + m_StaticBatchInfo: + firstSubMesh: 0 + subMeshCount: 0 + m_StaticBatchRoot: {fileID: 0} + m_ProbeAnchor: {fileID: 0} + m_LightProbeVolumeOverride: {fileID: 0} + m_ScaleInLightmap: 1 + m_ReceiveGI: 1 + m_PreserveUVs: 0 + m_IgnoreNormalsForChartDetection: 0 + m_ImportantGI: 0 + m_StitchLightmapSeams: 1 + m_SelectedEditorRenderState: 0 + m_MinimumChartSize: 4 + m_AutoUVMaxDistance: 0.5 + m_AutoUVMaxAngle: 89 + m_LightmapParameters: {fileID: 0} + m_SortingLayerID: 0 + m_SortingLayer: 0 + m_SortingOrder: 0 + m_Sprite: {fileID: 21300000, guid: 1c8be89e83f14479081250d0c4806b85, type: 3} + m_Color: {r: 1, g: 1, b: 1, a: 1} + m_FlipX: 0 + m_FlipY: 0 + m_DrawMode: 0 + m_Size: {x: 5, y: 1.89} + m_AdaptiveModeThreshold: 0.5 + m_SpriteTileMode: 0 + m_WasSpriteAssigned: 1 + m_MaskInteraction: 0 + m_SpriteSortPoint: 0 +--- !u!1001 &278149140 +PrefabInstance: + m_ObjectHideFlags: 0 + serializedVersion: 2 + m_Modification: + m_TransformParent: {fileID: 0} + m_Modifications: + - target: {fileID: 57277738888238098, guid: 986ad473b78d14e08b1f05d368cb1591, type: 3} + propertyPath: m_RootOrder + value: 2 + objectReference: {fileID: 0} + - target: {fileID: 57277738888238098, guid: 986ad473b78d14e08b1f05d368cb1591, type: 3} + propertyPath: m_LocalPosition.x + value: 0 + objectReference: {fileID: 0} + - target: {fileID: 57277738888238098, guid: 986ad473b78d14e08b1f05d368cb1591, type: 3} + propertyPath: m_LocalPosition.y + value: 0 + objectReference: {fileID: 0} + - target: {fileID: 57277738888238098, guid: 986ad473b78d14e08b1f05d368cb1591, type: 3} + propertyPath: m_LocalPosition.z + value: 0 + objectReference: {fileID: 0} + - target: {fileID: 57277738888238098, guid: 986ad473b78d14e08b1f05d368cb1591, type: 3} + propertyPath: m_LocalRotation.w + value: 1 + objectReference: {fileID: 0} + - target: {fileID: 57277738888238098, guid: 986ad473b78d14e08b1f05d368cb1591, type: 3} + propertyPath: m_LocalRotation.x + value: 0 + objectReference: {fileID: 0} + - target: {fileID: 57277738888238098, guid: 986ad473b78d14e08b1f05d368cb1591, type: 3} + propertyPath: m_LocalRotation.y + value: 0 + objectReference: {fileID: 0} + - target: {fileID: 57277738888238098, guid: 986ad473b78d14e08b1f05d368cb1591, type: 3} + propertyPath: m_LocalRotation.z + value: 0 + objectReference: {fileID: 0} + - target: {fileID: 57277738888238098, guid: 986ad473b78d14e08b1f05d368cb1591, type: 3} + propertyPath: m_LocalEulerAnglesHint.x + value: 0 + objectReference: {fileID: 0} + - target: {fileID: 57277738888238098, guid: 986ad473b78d14e08b1f05d368cb1591, type: 3} + propertyPath: m_LocalEulerAnglesHint.y + value: 0 + objectReference: {fileID: 0} + - target: {fileID: 57277738888238098, guid: 986ad473b78d14e08b1f05d368cb1591, type: 3} + propertyPath: m_LocalEulerAnglesHint.z + value: 0 + objectReference: {fileID: 0} + - target: {fileID: 1362306111410183020, guid: 986ad473b78d14e08b1f05d368cb1591, type: 3} + propertyPath: enableLog + value: 1 + objectReference: {fileID: 0} + - target: {fileID: 1362306111410183020, guid: 986ad473b78d14e08b1f05d368cb1591, type: 3} + propertyPath: startManually + value: 1 + objectReference: {fileID: 0} + - target: {fileID: 1362306111410183020, guid: 986ad473b78d14e08b1f05d368cb1591, type: 3} + propertyPath: tokens.Array.data[0].mode + value: 0 + objectReference: {fileID: 0} + - target: {fileID: 1362306111410183020, guid: 986ad473b78d14e08b1f05d368cb1591, type: 3} + propertyPath: tokens.Array.data[0].appid + value: cf918051b394495ca85d1b7787ad7243 + objectReference: {fileID: 0} + - target: {fileID: 1362306111410183020, guid: 986ad473b78d14e08b1f05d368cb1591, type: 3} + propertyPath: tokens.Array.data[0].timeZone + value: 1 + objectReference: {fileID: 0} + - target: {fileID: 1362306111410183020, guid: 986ad473b78d14e08b1f05d368cb1591, type: 3} + propertyPath: tokens.Array.data[0].serverUrl + value: https://receiver-ta-dev.thinkingdata.cn + objectReference: {fileID: 0} + - target: {fileID: 3471622134282543401, guid: 986ad473b78d14e08b1f05d368cb1591, type: 3} + propertyPath: m_Name + value: TDAnalytics + objectReference: {fileID: 0} + - target: {fileID: 3471622134282543401, guid: 986ad473b78d14e08b1f05d368cb1591, type: 3} + propertyPath: m_IsActive + value: 0 + objectReference: {fileID: 0} + m_RemovedComponents: [] + m_SourcePrefab: {fileID: 100100000, guid: 986ad473b78d14e08b1f05d368cb1591, type: 3} +--- !u!1 &541060113 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 541060118} + - component: {fileID: 541060117} + - component: {fileID: 541060115} + - component: {fileID: 541060114} + m_Layer: 0 + m_Name: Main Camera + m_TagString: MainCamera + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!81 &541060114 +AudioListener: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 541060113} + m_Enabled: 1 +--- !u!124 &541060115 +Behaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 541060113} + m_Enabled: 1 +--- !u!20 &541060117 +Camera: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 541060113} + m_Enabled: 1 + serializedVersion: 2 + m_ClearFlags: 2 + m_BackGroundColor: {r: 0.32941177, g: 0.45490196, b: 0.94509804, a: 0.019607844} + m_projectionMatrixMode: 1 + m_GateFitMode: 2 + m_FOVAxisMode: 0 + m_SensorSize: {x: 36, y: 24} + m_LensShift: {x: 0, y: 0} + m_FocalLength: 50 + m_NormalizedViewPortRect: + serializedVersion: 2 + x: 0 + y: 0 + width: 1 + height: 1 + near clip plane: 0.3 + far clip plane: 1000 + field of view: 60 + orthographic: 1 + orthographic size: 5 + m_Depth: -1 + m_CullingMask: + serializedVersion: 2 + m_Bits: 4294967295 + m_RenderingPath: -1 + m_TargetTexture: {fileID: 0} + m_TargetDisplay: 0 + m_TargetEye: 3 + m_HDR: 0 + m_AllowMSAA: 1 + m_AllowDynamicResolution: 0 + m_ForceIntoRT: 0 + m_OcclusionCulling: 1 + m_StereoConvergence: 10 + m_StereoSeparation: 0.022 +--- !u!4 &541060118 +Transform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 541060113} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: 0, y: 0, z: -10} + m_LocalScale: {x: 1, y: 1, z: 1} + m_ConstrainProportionsScale: 0 + m_Children: [] + m_Father: {fileID: 0} + m_RootOrder: 0 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} +--- !u!850595691 &679135154 +LightingSettings: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_Name: Settings.lighting + serializedVersion: 4 + m_GIWorkflowMode: 1 + m_EnableBakedLightmaps: 1 + m_EnableRealtimeLightmaps: 0 + m_RealtimeEnvironmentLighting: 1 + m_BounceScale: 1 + m_AlbedoBoost: 1 + m_IndirectOutputScale: 1 + m_UsingShadowmask: 0 + m_BakeBackend: 0 + m_LightmapMaxSize: 1024 + m_BakeResolution: 50 + m_Padding: 2 + m_LightmapCompression: 0 + m_AO: 1 + m_AOMaxDistance: 1 + m_CompAOExponent: 1 + m_CompAOExponentDirect: 0 + m_ExtractAO: 0 + m_MixedBakeMode: 1 + m_LightmapsBakeMode: 1 + m_FilterMode: 1 + m_LightmapParameters: {fileID: 15204, guid: 0000000000000000f000000000000000, type: 0} + m_ExportTrainingData: 0 + m_TrainingDataDestination: TrainingData + m_RealtimeResolution: 1 + m_ForceWhiteAlbedo: 0 + m_ForceUpdates: 0 + m_FinalGather: 0 + m_FinalGatherRayCount: 256 + m_FinalGatherFiltering: 1 + m_PVRCulling: 1 + m_PVRSampling: 1 + m_PVRDirectSampleCount: 32 + m_PVRSampleCount: 512 + m_PVREnvironmentSampleCount: 512 + m_PVREnvironmentReferencePointCount: 2048 + m_LightProbeSampleCountMultiplier: 4 + m_PVRBounces: 2 + m_PVRMinBounces: 1 + m_PVREnvironmentMIS: 0 + m_PVRFilteringMode: 0 + m_PVRDenoiserTypeDirect: 0 + m_PVRDenoiserTypeIndirect: 0 + m_PVRDenoiserTypeAO: 0 + m_PVRFilterTypeDirect: 0 + m_PVRFilterTypeIndirect: 0 + m_PVRFilterTypeAO: 0 + m_PVRFilteringGaussRadiusDirect: 1 + m_PVRFilteringGaussRadiusIndirect: 5 + m_PVRFilteringGaussRadiusAO: 2 + m_PVRFilteringAtrousPositionSigmaDirect: 0.5 + m_PVRFilteringAtrousPositionSigmaIndirect: 2 + m_PVRFilteringAtrousPositionSigmaAO: 1 + m_PVRTiledBaking: 0 +--- !u!1 &1608319069 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 1608319071} + - component: {fileID: 1608319070} + - component: {fileID: 1608319072} + m_Layer: 0 + m_Name: ThingkingAnalyticsExample + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!114 &1608319070 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1608319069} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: fc3b54d5c2d4a455fbc56ab57ca985c6, type: 3} + m_Name: + m_EditorClassIdentifier: + skin: {fileID: 11400000, guid: 48b9be70902884a76ba1b53926fd3e37, type: 2} +--- !u!4 &1608319071 +Transform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1608319069} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: 0, y: 0, z: 0} + m_LocalScale: {x: 1, y: 1, z: 1} + m_ConstrainProportionsScale: 0 + m_Children: + - {fileID: 269916752} + m_Father: {fileID: 0} + m_RootOrder: 1 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} +--- !u!114 &1608319072 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1608319069} + m_Enabled: 0 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 87d98871b303b4786b3dac3fd1b6e6eb, type: 3} + m_Name: + m_EditorClassIdentifier: + skin: {fileID: 0} diff --git a/Assets/HCMiniSdk/Third/ta/Sample/TDAnalyticsDemo.unity.meta b/Assets/HCMiniSdk/Third/ta/Sample/TDAnalyticsDemo.unity.meta new file mode 100644 index 00000000..2bcad439 --- /dev/null +++ b/Assets/HCMiniSdk/Third/ta/Sample/TDAnalyticsDemo.unity.meta @@ -0,0 +1,7 @@ +fileFormatVersion: 2 +guid: 741c7d08d0bfd46ae96dff68cdd17f99 +DefaultImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/HCMiniSdk/Third/ta/ThinkingAnalytics.meta b/Assets/HCMiniSdk/Third/ta/ThinkingAnalytics.meta new file mode 100644 index 00000000..da98201d --- /dev/null +++ b/Assets/HCMiniSdk/Third/ta/ThinkingAnalytics.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: 60b198fb61dd042d5b21af809183759f +folderAsset: yes +DefaultImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/HCMiniSdk/Third/ta/ThinkingAnalytics/Exception.meta b/Assets/HCMiniSdk/Third/ta/ThinkingAnalytics/Exception.meta new file mode 100644 index 00000000..6e3b94b8 --- /dev/null +++ b/Assets/HCMiniSdk/Third/ta/ThinkingAnalytics/Exception.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: f347e0b07c5d64926ac64031c3bba013 +folderAsset: yes +DefaultImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/HCMiniSdk/Third/ta/ThinkingAnalytics/Exception/TDException.cs b/Assets/HCMiniSdk/Third/ta/ThinkingAnalytics/Exception/TDException.cs new file mode 100644 index 00000000..8c0a8f2f --- /dev/null +++ b/Assets/HCMiniSdk/Third/ta/ThinkingAnalytics/Exception/TDException.cs @@ -0,0 +1,168 @@ +using System; +using System.Collections.Generic; +using UnityEngine; + +namespace ThinkingData.Analytics.TDException +{ + public class TDExceptionHandler + { + + //Whether to exit the program when an exception occurs + public static bool IsQuitWhenException = false; + + //Whether the exception catch has been registered + public static bool IsRegistered = false; + private static TDAutoTrackEventHandler mEventCallback; + private static Dictionary mProperties; + + + public static void SetAutoTrackProperties(Dictionary properties) + { + if (!(mProperties is Dictionary)) + { + mProperties = new Dictionary(); + } + + foreach (var item in properties) + { + if (!mProperties.ContainsKey(item.Key)) + { + mProperties.Add(item.Key, item.Value); + } + } + } + + public static void RegisterTAExceptionHandler(TDAutoTrackEventHandler eventCallback) + { + mEventCallback = eventCallback; + //Register exception handling delegate + try + { + if (!IsRegistered) + { + Application.logMessageReceived += _LogHandler; + AppDomain.CurrentDomain.UnhandledException += _UncaughtExceptionHandler; + IsRegistered = true; + } + } + catch + { + } + } + + public static void RegisterTAExceptionHandler(Dictionary properties) + { + SetAutoTrackProperties(properties); + //Register exception handling delegate + try + { + if (!IsRegistered) + { + Application.logMessageReceived += _LogHandler; + AppDomain.CurrentDomain.UnhandledException += _UncaughtExceptionHandler; + IsRegistered = true; + } + } + catch + { + } + } + + public static void UnregisterTAExceptionHandler () + { + //Clear exception handling delegate + try + { + Application.logMessageReceived -= _LogHandler; + System.AppDomain.CurrentDomain.UnhandledException -= _UncaughtExceptionHandler; + } + catch + { + } + } + + + private static void _LogHandler( string logString, string stackTrace, LogType type ) + { + if( type == LogType.Error || type == LogType.Exception || type == LogType.Assert ) + { + //Report exception event + string reasonStr = "exception_type: " + type.ToString() + "
" + "exception_message: " + logString + "
" + "stack_trace: " + stackTrace + "
" ; + Dictionary properties = new Dictionary(){ + {"#app_crashed_reason", reasonStr} + }; + properties = MergeProperties(properties); + TDAnalytics.Track("ta_app_crash", properties); + + if ( IsQuitWhenException ) + { + Application.Quit(); + } + } + } + + private static void _UncaughtExceptionHandler (object sender, System.UnhandledExceptionEventArgs args) + { + if (args == null || args.ExceptionObject == null) + { + return; + } + + try + { + if (args.ExceptionObject.GetType () != typeof(System.Exception)) + { + return; + } + } + catch + { + return; + } + + System.Exception e = (System.Exception)args.ExceptionObject; + + //Report exception event + string reasonStr = "exception_type: " + e.GetType().Name + "
" + "exception_message: " + e.Message + "
" + "stack_trace: " + e.StackTrace + "
" ; + Dictionary properties = new Dictionary(){ + {"#app_crashed_reason", reasonStr} + }; + properties = MergeProperties(properties); + TDAnalytics.Track("ta_app_crash", properties); + + if ( IsQuitWhenException ) + { + Application.Quit(); + } + } + + private static Dictionary MergeProperties(Dictionary properties) + { + + if (mEventCallback is TDAutoTrackEventHandler) + { + Dictionary callbackProperties = mEventCallback.GetAutoTrackEventProperties((int)TDAutoTrackEventType.AppCrash, properties); + foreach (var item in callbackProperties) + { + if (!properties.ContainsKey(item.Key)) + { + properties.Add(item.Key, item.Value); + } + } + } + + if (mProperties is Dictionary) + { + foreach (var item in mProperties) + { + if (!properties.ContainsKey(item.Key)) + { + properties.Add(item.Key, item.Value); + } + } + } + + return properties; + } + } +} diff --git a/Assets/HCMiniSdk/Third/ta/ThinkingAnalytics/Exception/TDException.cs.meta b/Assets/HCMiniSdk/Third/ta/ThinkingAnalytics/Exception/TDException.cs.meta new file mode 100644 index 00000000..766222bd --- /dev/null +++ b/Assets/HCMiniSdk/Third/ta/ThinkingAnalytics/Exception/TDException.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: 76f285e49c9584fce99e9fe1536fea17 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/HCMiniSdk/Third/ta/ThinkingAnalytics/Resources.meta b/Assets/HCMiniSdk/Third/ta/ThinkingAnalytics/Resources.meta new file mode 100644 index 00000000..7f3bdf28 --- /dev/null +++ b/Assets/HCMiniSdk/Third/ta/ThinkingAnalytics/Resources.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: 4e5d07cff2f9b45d6afa9ab9a879fbff +folderAsset: yes +DefaultImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/HCMiniSdk/Third/ta/ThinkingAnalytics/Resources/ta_public_config.xml b/Assets/HCMiniSdk/Third/ta/ThinkingAnalytics/Resources/ta_public_config.xml new file mode 100644 index 00000000..3f98eff6 --- /dev/null +++ b/Assets/HCMiniSdk/Third/ta/ThinkingAnalytics/Resources/ta_public_config.xml @@ -0,0 +1,43 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/Assets/Plugins/ByteGame/com.bytedance.starksdk.unitytools/Editor/unitytoolsEditor.xml.meta b/Assets/HCMiniSdk/Third/ta/ThinkingAnalytics/Resources/ta_public_config.xml.meta similarity index 75% rename from Assets/Plugins/ByteGame/com.bytedance.starksdk.unitytools/Editor/unitytoolsEditor.xml.meta rename to Assets/HCMiniSdk/Third/ta/ThinkingAnalytics/Resources/ta_public_config.xml.meta index 0c3507d0..d130ea47 100644 --- a/Assets/Plugins/ByteGame/com.bytedance.starksdk.unitytools/Editor/unitytoolsEditor.xml.meta +++ b/Assets/HCMiniSdk/Third/ta/ThinkingAnalytics/Resources/ta_public_config.xml.meta @@ -1,5 +1,5 @@ fileFormatVersion: 2 -guid: e9c5b73b386ad411795b97de5a061bac +guid: b67db39cd532b4f08b95b2cf5938553f TextScriptImporter: externalObjects: {} userData: diff --git a/Assets/HCMiniSdk/Third/ta/ThinkingAnalytics/TDAnalytics.asmdef b/Assets/HCMiniSdk/Third/ta/ThinkingAnalytics/TDAnalytics.asmdef new file mode 100644 index 00000000..5ca02cdd --- /dev/null +++ b/Assets/HCMiniSdk/Third/ta/ThinkingAnalytics/TDAnalytics.asmdef @@ -0,0 +1,16 @@ +{ + "name": "ThinkingAnalytics", + "rootNamespace": "", + "references": [ + "GUID:0a958a7eb80a248e1b8bc4553787c209" + ], + "includePlatforms": [], + "excludePlatforms": [], + "allowUnsafeCode": false, + "overrideReferences": false, + "precompiledReferences": [], + "autoReferenced": true, + "defineConstraints": [], + "versionDefines": [], + "noEngineReferences": false +} \ No newline at end of file diff --git a/Assets/HCMiniSdk/Third/ta/ThinkingAnalytics/TDAnalytics.asmdef.meta b/Assets/HCMiniSdk/Third/ta/ThinkingAnalytics/TDAnalytics.asmdef.meta new file mode 100644 index 00000000..54152310 --- /dev/null +++ b/Assets/HCMiniSdk/Third/ta/ThinkingAnalytics/TDAnalytics.asmdef.meta @@ -0,0 +1,7 @@ +fileFormatVersion: 2 +guid: ff4bf6c59d1ac413a8f34ced5be76ecd +AssemblyDefinitionImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/HCMiniSdk/Third/ta/ThinkingAnalytics/TDAnalytics.cs b/Assets/HCMiniSdk/Third/ta/ThinkingAnalytics/TDAnalytics.cs new file mode 100644 index 00000000..ae9f4bb5 --- /dev/null +++ b/Assets/HCMiniSdk/Third/ta/ThinkingAnalytics/TDAnalytics.cs @@ -0,0 +1,1493 @@ +/* + * + Copyright 2019, ThinkingData, Inc + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. + SDK VERSION:3.0.3 + */ + +/** +\mainpage + +\section main_introduction Introduction + +ThinkingData Analytics SDK for Unity. + +This is the [ThinkingData](https://www.thinkingdata.cn)™ Analytics SDK for Unity. Documentation is available on our help center in the following languages: + +- [English](https://docs.thinkingdata.cn/ta-manual/latest/en/installation/installation_menu/client_sdk/game_engine_sdk_installation/unity_sdk_installation/unity_sdk_installation.html) +- [中文](https://docs.thinkingdata.cn/ta-manual/latest/installation/installation_menu/client_sdk/game_engine_sdk_installation/unity_sdk_installation/unity_sdk_installation.html) + + */ + +#if !(UNITY_5_4_OR_NEWER) +#define DISABLE_TA +#warning "Your Unity version is not supported by us - ThinkingAnalyticsSDK disabled" +#endif + +using System; +using System.Collections.Generic; +using ThinkingData.Analytics.Utils; +using ThinkingData.Analytics.Wrapper; +using UnityEngine; +using ThinkingData.Analytics.TDException; +using UnityEngine.SceneManagement; + +namespace ThinkingData.Analytics +{ + /// + /// ThinkingData Analytics SDK for Unity. + /// + [DisallowMultipleComponent] + public class TDAnalytics : MonoBehaviour + { + #region settings + //[System.Serializable] + //public class TDConfig + //{ + // public string appId; + // public string serverUrl; + // public TDMode mode; + // public TDTimeZone timeZone; + // public string timeZoneId; + // public bool enableEncrypt; // enable data encryption, default is false (iOS/Android only) + // public int encryptVersion; // secret key version (iOS/Android only) + // public string encryptPublicKey; // public secret key (iOS/Android only) + // public TDSSLPinningMode pinningMode; // SSL Pinning mode, default is NONE (iOS/Android only) + // public bool allowInvalidCertificates; // allow invalid certificates, default is false (iOS/Android only) + // public bool validatesDomainName; // enable to verify domain name, default is true (iOS/Android only) + // private string sName; + // public string name { set { if (!string.IsNullOrEmpty(value)) sName = value.Replace(" ", ""); } get { return sName; } } // instances name + + // //public TDConfig(string appId, string serverUrl, TDMode mode = TDMode.Normal, TDTimeZone timeZone = TDTimeZone.Local, string timeZoneId = null, string instanceName = null) + // public TDConfig(string appId, string serverUrl) + // { + // this.appId = appId.Replace(" ", ""); + // this.serverUrl = serverUrl; + // this.mode = TDMode.Normal; + // this.timeZone = TDTimeZone.Local; + // this.timeZoneId = null; + // this.enableEncrypt = false; + // this.encryptVersion = 0; + // this.encryptPublicKey = null; + // this.pinningMode = TDSSLPinningMode.NONE; + // this.allowInvalidCertificates = false; + // this.validatesDomainName = true; + // //if (!string.IsNullOrEmpty(instanceName)) + // //{ + // // instanceName = instanceName.Replace(" ", ""); + // //} + // } + + // //public string GetInstanceName() + // //{ + // // return this.instanceName; + // //} + + // public string getTimeZoneId() + // { + // switch (timeZone) + // { + // case TDTimeZone.UTC: + // return "UTC"; + // case TDTimeZone.Asia_Shanghai: + // return "Asia/Shanghai"; + // case TDTimeZone.Asia_Tokyo: + // return "Asia/Tokyo"; + // case TDTimeZone.America_Los_Angeles: + // return "America/Los_Angeles"; + // case TDTimeZone.America_New_York: + // return "America/New_York"; + // case TDTimeZone.Other: + // return timeZoneId; + // default: + // break; + // } + // return null; + // } + //} + + //public enum TDTimeZone + //{ + // Local, + // UTC, + // Asia_Shanghai, + // Asia_Tokyo, + // America_Los_Angeles, + // America_New_York, + // Other = 100 + //} + + //public enum TDMode + //{ + // Debug = 1, + // DebugOnly = 2, + // Normal = 0 + //} + + //public enum TDNetworkType + //{ + // Wifi = 1, + // All = 0 + //} + + [Header("Configuration")] + [Tooltip("Enable Start SDK Manually")] + public bool startManually = true; + + [Tooltip("Enable Log")] + public bool enableLog = true; + [Tooltip("Sets the Network Type")] + public TDNetworkType networkType = TDNetworkType.All; + + [Header("Project")] + [Tooltip("Project Setting, APP ID is given when the project is created")] + [HideInInspector] + public TDConfig[] configs = new TDConfig[1]; + + #endregion + + /// + /// Whether to enable logs + /// + /// enable logs + public static void EnableLog(bool enable) + { + if (sThinkingData != null) + { + sThinkingData.enableLog = enable; + TDLog.EnableLog(enable); + TDWrapper.EnableLog(enable); + } + } + /// + /// Set custom distinct ID, to replace the distinct ID generated by the system + /// + /// distinct ID + /// project ID (optional) + public static void SetDistinctId(string distinctId, string appId = "") + { + if (tracking_enabled) + { + TDWrapper.SetDistinctId(distinctId, appId); + } + else + { + System.Reflection.MethodBase method = System.Reflection.MethodBase.GetCurrentMethod(); + object[] parameters = new object[] { distinctId, appId }; + eventCaches.Add(new Dictionary() { + { "method", method}, + { "parameters", parameters} + }); + } + } + + /// + /// Returns the current distinct ID + /// + /// distinct ID + /// project ID (optional) + public static string GetDistinctId(string appId = "") + { + if (tracking_enabled) + { + return TDWrapper.GetDistinctId(appId); + } + return null; + } + + /// + /// Set account ID. This method does not upload Login events + /// + /// account ID + /// project ID (optional) + public static void Login(string account, string appId = "") + { + if (tracking_enabled) + { + TDWrapper.Login(account, appId); + } + else + { + System.Reflection.MethodBase method = System.Reflection.MethodBase.GetCurrentMethod(); + object[] parameters = new object[] { account, appId }; + eventCaches.Add(new Dictionary() { + { "method", method}, + { "parameters", parameters} + }); + } + } + + /// + /// Clear account ID. This method does not upload Logout events + /// + /// project ID (optional) + public static void Logout(string appId = "") + { + if (tracking_enabled) + { + TDWrapper.Logout(appId); + } + else + { + System.Reflection.MethodBase method = System.Reflection.MethodBase.GetCurrentMethod(); + object[] parameters = new object[] { appId }; + eventCaches.Add(new Dictionary() { + { "method", method}, + { "parameters", parameters} + }); + } + } + + /// + /// Enable auto-tracking + /// + /// auto-tracking eventType + /// properties for auto-tracking events (optional) + /// project ID (optional) + public static void EnableAutoTrack(TDAutoTrackEventType eventType, Dictionary properties = null, string appId = "") + { + if (tracking_enabled) + { + if (properties == null) + { + properties = new Dictionary(); + } + TDWrapper.EnableAutoTrack(eventType, properties, appId); + if ((eventType & TDAutoTrackEventType.AppCrash) != 0 && !TDPublicConfig.DisableCSharpException) + { + TDExceptionHandler.RegisterTAExceptionHandler(properties); + } + if ((eventType & TDAutoTrackEventType.AppSceneLoad) != 0) + { + SceneManager.sceneLoaded -= TDAnalytics.OnSceneLoaded; + SceneManager.sceneLoaded += TDAnalytics.OnSceneLoaded; + } + if ((eventType & TDAutoTrackEventType.AppSceneUnload) != 0) + { + SceneManager.sceneUnloaded -= TDAnalytics.OnSceneUnloaded; + SceneManager.sceneUnloaded += TDAnalytics.OnSceneUnloaded; + } + } + else + { + System.Reflection.MethodBase method = System.Reflection.MethodBase.GetCurrentMethod(); + object[] parameters = new object[] { eventType, properties, appId }; + eventCaches.Add(new Dictionary() { + { "method", method}, + { "parameters", parameters} + }); + } + } + + /// + /// Enable auto-tracking + /// + /// auto-tracking eventType + /// callback for auto-tracking events + /// project ID (optional) + public static void EnableAutoTrack(TDAutoTrackEventType eventType, TDAutoTrackEventHandler eventHandler, string appId = "") + { + if (tracking_enabled) + { + TDWrapper.EnableAutoTrack(eventType, eventHandler, appId); + if ((eventType & TDAutoTrackEventType.AppCrash) != 0 && !TDPublicConfig.DisableCSharpException) + { + TDExceptionHandler.RegisterTAExceptionHandler(eventHandler); + } + if ((eventType & TDAutoTrackEventType.AppSceneLoad) != 0) + { + SceneManager.sceneLoaded -= TDAnalytics.OnSceneLoaded; + SceneManager.sceneLoaded += TDAnalytics.OnSceneLoaded; + } + if ((eventType & TDAutoTrackEventType.AppSceneUnload) != 0) + { + SceneManager.sceneUnloaded -= TDAnalytics.OnSceneUnloaded; + SceneManager.sceneUnloaded += TDAnalytics.OnSceneUnloaded; + } + } + else + { + System.Reflection.MethodBase method = System.Reflection.MethodBase.GetCurrentMethod(); + object[] parameters = new object[] { eventType, eventHandler, appId }; + eventCaches.Add(new Dictionary() { + { "method", method}, + { "parameters", parameters} + }); + } + + } + + /// + /// Set properties for auto-tracking events + /// + /// auto-tracking eventType + /// properties for auto-tracking events + /// project ID (optional) + public static void SetAutoTrackProperties(TDAutoTrackEventType eventType, Dictionary properties, string appId = "") + { + if (tracking_enabled) + { + TDWrapper.SetAutoTrackProperties(eventType, properties, appId); + if ((eventType & TDAutoTrackEventType.AppCrash) != 0 && !TDPublicConfig.DisableCSharpException) + { + TDExceptionHandler.SetAutoTrackProperties(properties); + } + } + else + { + System.Reflection.MethodBase method = System.Reflection.MethodBase.GetCurrentMethod(); + object[] parameters = new object[] { eventType, properties, appId }; + eventCaches.Add(new Dictionary() { + { "method", method}, + { "parameters", parameters} + }); + } + } + + /// + /// Track a Event + /// + /// event name + /// project ID (optional) + public static void Track(string eventName, string appId = "") + { + Track(eventName, null, appId); + } + + /// + /// Track a Event + /// + /// the event name + /// properties for the event + /// project ID (optional) + public static void Track(string eventName, Dictionary properties, string appId = "") + { + if (tracking_enabled) + { + TDWrapper.Track(eventName, properties, appId); + } + else + { + System.Reflection.MethodBase method = System.Reflection.MethodBase.GetCurrentMethod(); + object[] parameters = new object[] { eventName, properties, appId }; + eventCaches.Add(new Dictionary() { + { "method", method}, + { "parameters", parameters} + }); + } + } + + /// + /// Track a Event + /// + /// the event name + /// properties for the event + /// date for the event + /// project ID (optional) + //[Obsolete("Method is deprecated, please use Track(string eventName, Dictionary properties, DateTime date, TimeZoneInfo timeZone, string appId = \"\") instead.")] + //public static void Track(string eventName, Dictionary properties, DateTime date, string appId = "") + //{ + // if (tracking_enabled) + // { + // TDWrapper.Track(eventName, properties, date, appId); + // } + // else + // { + // System.Reflection.MethodBase method = System.Reflection.MethodBase.GetCurrentMethod(); + // object[] parameters = new object[] { eventName, properties, date, appId }; + // eventCaches.Add(new Dictionary() { + // { "method", method}, + // { "parameters", parameters} + // }); + // } + //} + + /// + /// Track a Event + /// + /// the event name + /// properties for the event + /// date for the event + /// time zone for the event + /// project ID (optional) + public static void Track(string eventName, Dictionary properties, DateTime time, TimeZoneInfo timeZone, string appId = "") + { + if (tracking_enabled) + { + TDWrapper.Track(eventName, properties, time, timeZone, appId); + } + else + { + System.Reflection.MethodBase method = System.Reflection.MethodBase.GetCurrentMethod(); + object[] parameters = new object[] { eventName, properties, time, timeZone, appId }; + eventCaches.Add(new Dictionary() { + { "method", method}, + { "parameters", parameters} + }); + } + } + + /// + /// Track a Special Event (First Event/Updatable Event/Overwritable Event) + /// + /// the special event + /// project ID (optional) + public static void Track(TDEventModel eventModel, string appId = "") + { + if (tracking_enabled) + { + TDWrapper.Track(eventModel, appId); + } + else + { + System.Reflection.MethodBase method = System.Reflection.MethodBase.GetCurrentMethod(); + object[] parameters = new object[] { eventModel, appId }; + eventCaches.Add(new Dictionary() { + { "method", method}, + { "parameters", parameters} + }); + } + } + + /// + /// Quickly track a Special Event + /// + /// the event name, 'SceneView' for scene view event, 'AppClick' for click event + /// event properties + /// + public static void QuickTrack(string eventName, Dictionary properties = null, string appId = "") + { + if (tracking_enabled) + { + TDWrapper.QuickTrack(eventName, properties, appId); + } + else + { + System.Reflection.MethodBase method = System.Reflection.MethodBase.GetCurrentMethod(); + object[] parameters = new object[] { eventName, properties, appId }; + eventCaches.Add(new Dictionary() { + { "method", method}, + { "parameters", parameters} + }); + } + } + + /// + /// Report events data to TE server immediately + /// + /// project ID (optional) + public static void Flush(string appId = "") + { + if (tracking_enabled) + { + TDWrapper.Flush(appId); + } + else + { + System.Reflection.MethodBase method = System.Reflection.MethodBase.GetCurrentMethod(); + object[] parameters = new object[] { appId }; + eventCaches.Add(new Dictionary() { + { "method", method}, + { "parameters", parameters} + }); + } + } + + /// + /// Scenes load Delegate + /// + /// the load scene + /// the scene loading mode + public static void OnSceneLoaded(Scene scene, LoadSceneMode mode) + { + if (tracking_enabled) + { + TDWrapper.TrackSceneLoad(scene); + } + else + { + System.Reflection.MethodBase method = System.Reflection.MethodBase.GetCurrentMethod(); + object[] parameters = new object[] { scene, mode }; + eventCaches.Add(new Dictionary() { + { "method", method}, + { "parameters", parameters} + }); + } + } + + /// + /// Scenes unload Delegate + /// + /// the unload scene + public static void OnSceneUnloaded(Scene scene) + { + if (tracking_enabled) + { + TDWrapper.TrackSceneUnload(scene); + } + else + { + System.Reflection.MethodBase method = System.Reflection.MethodBase.GetCurrentMethod(); + object[] parameters = new object[] { scene }; + eventCaches.Add(new Dictionary() { + { "method", method}, + { "parameters", parameters} + }); + } + } + + /// + /// Super Properties, refer to properties that would be uploaded by each event + /// + /// super properties for events + /// project ID (optional) + public static void SetSuperProperties(Dictionary properties, string appId = "") + { + if (tracking_enabled) + { + TDWrapper.SetSuperProperties(properties, appId); + } + else + { + System.Reflection.MethodBase method = System.Reflection.MethodBase.GetCurrentMethod(); + object[] parameters = new object[] { properties, appId }; + eventCaches.Add(new Dictionary() { + { "method", method}, + { "parameters", parameters} + }); + } + } + + /// + /// Delete Property form current Super Properties + /// + /// property name + /// project ID (optional) + public static void UnsetSuperProperty(string property, string appId = "") + { + if (tracking_enabled) + { + TDWrapper.UnsetSuperProperty(property, appId); + } + else + { + System.Reflection.MethodBase method = System.Reflection.MethodBase.GetCurrentMethod(); + object[] parameters = new object[] { property, appId }; + eventCaches.Add(new Dictionary() { + { "method", method}, + { "parameters", parameters} + }); + } + } + + /// + /// Returns current Super Properties + /// + /// current super properties + /// project ID (optional) + public static Dictionary GetSuperProperties(string appId = "") + { + if (tracking_enabled) + { + return TDWrapper.GetSuperProperties(appId); + } + return null; + } + + /// + /// Clear current Super Properties + /// + /// project ID (optional) + public static void ClearSuperProperties(string appId = "") + { + if (tracking_enabled) + { + TDWrapper.ClearSuperProperty(appId); + } + else + { + System.Reflection.MethodBase method = System.Reflection.MethodBase.GetCurrentMethod(); + object[] parameters = new object[] { appId }; + eventCaches.Add(new Dictionary() { + { "method", method}, + { "parameters", parameters} + }); + } + } + + /// + /// Returns current Preset Properties + /// + /// current preset properties + /// project ID (optional) + public static TDPresetProperties GetPresetProperties(string appId = "") + { + if (tracking_enabled) + { + Dictionary properties = TDWrapper.GetPresetProperties(appId); + TDPresetProperties presetProperties = new TDPresetProperties(properties); + return presetProperties; + } + return null; + } + + /// + /// Sets the Dynamic Super Properties. + /// + /// dynamic super properties interface + /// project ID (optional) + public static void SetDynamicSuperProperties(TDDynamicSuperPropertiesHandler propertiesHandler, string appId = "") + { + if (tracking_enabled) + { + TDWrapper.SetDynamicSuperProperties(propertiesHandler, appId); + } + else + { + System.Reflection.MethodBase method = System.Reflection.MethodBase.GetCurrentMethod(); + object[] parameters = new object[] { propertiesHandler, appId }; + eventCaches.Add(new Dictionary() { + { "method", method}, + { "parameters", parameters} + }); + } + } + + /// + /// Records Event Duration, call TimeEvent to start timing for the Event, call Track to end timing + /// + /// the event name + /// project ID (optional) + public static void TimeEvent(string eventName, string appId = "") + { + if (tracking_enabled) + { + TDWrapper.TimeEvent(eventName, appId); + } + else + { + System.Reflection.MethodBase method = System.Reflection.MethodBase.GetCurrentMethod(); + object[] parameters = new object[] { eventName, appId }; + eventCaches.Add(new Dictionary() { + { "method", method}, + { "parameters", parameters} + }); + } + } + + /// + /// Sets User Properties, this will overwrite the original properties value + /// + /// user properties + /// project ID (optional) + public static void UserSet(Dictionary properties, string appId = "") + { + if (tracking_enabled) + { + TDWrapper.UserSet(properties, appId); + } + else + { + System.Reflection.MethodBase method = System.Reflection.MethodBase.GetCurrentMethod(); + object[] parameters = new object[] { properties, appId }; + eventCaches.Add(new Dictionary() { + { "method", method}, + { "parameters", parameters} + }); + } + } + + /// + /// Sets User Properties, this will overwrite the original properties value + /// + /// user properties + /// date time + /// project ID (optional) + public static void UserSet(Dictionary properties, DateTime dateTime, string appId = "") + { + if (tracking_enabled) + { + TDWrapper.UserSet(properties, dateTime, appId); + } + else + { + System.Reflection.MethodBase method = System.Reflection.MethodBase.GetCurrentMethod(); + object[] parameters = new object[] { properties , dateTime, appId}; + eventCaches.Add(new Dictionary() { + { "method", method}, + { "parameters", parameters} + }); + } + } + + /// + /// Unsets one of User Porperties, this would not create properties that have not been created in TE + /// + /// the user property name + /// project ID (optional) + public static void UserUnset(string property, string appId = "") + { + List properties = new List(); + properties.Add(property); + UserUnset(properties, appId); + } + + + /// + /// Unsets some of User Porperties, this would not create properties that have not been created in TE + /// + /// the user properties name + /// project ID (optional) + public static void UserUnset(List properties, string appId = "") + { + if (tracking_enabled) + { + TDWrapper.UserUnset(properties, appId); + } + else + { + System.Reflection.MethodBase method = System.Reflection.MethodBase.GetCurrentMethod(); + object[] parameters = new object[] { properties, appId }; + eventCaches.Add(new Dictionary() { + { "method", method}, + { "parameters", parameters} + }); + } + + } + + /// + /// Unsets some of User Porperties, this would not create properties that have not been created in TE + /// + /// the user properties name + /// date time + /// project ID (optional) + public static void UserUnset(List properties, DateTime dateTime, string appId = "") + { + if (tracking_enabled) + { + TDWrapper.UserUnset(properties, dateTime, appId); + } + else + { + System.Reflection.MethodBase method = System.Reflection.MethodBase.GetCurrentMethod(); + object[] parameters = new object[] { properties, dateTime, appId }; + eventCaches.Add(new Dictionary() { + { "method", method}, + { "parameters", parameters} + }); + } + } + + /// + /// Sets User Properties for Once. This message would be neglected, if such property had been set before + /// + /// user properties + /// project ID (optional) + public static void UserSetOnce(Dictionary properties, string appId = "") + { + if (tracking_enabled) + { + TDWrapper.UserSetOnce(properties, appId); + } + else + { + System.Reflection.MethodBase method = System.Reflection.MethodBase.GetCurrentMethod(); + object[] parameters = new object[] { properties, appId }; + eventCaches.Add(new Dictionary() { + { "method", method}, + { "parameters", parameters} + }); + } + + } + + /// + /// Sets User Properties for Once. The property would be neglected, if such property had been set before + /// + /// user properties + /// date time + /// project ID (optional) + public static void UserSetOnce(Dictionary properties, DateTime dateTime, string appId = "") + { + if (tracking_enabled) + { + TDWrapper.UserSetOnce(properties, dateTime, appId); + } + else + { + System.Reflection.MethodBase method = System.Reflection.MethodBase.GetCurrentMethod(); + object[] parameters = new object[] { properties, dateTime,appId }; + eventCaches.Add(new Dictionary() { + { "method", method}, + { "parameters", parameters} + }); + } + + } + + /// + /// Accumulates the property. If the property has not been set, it would be given a value of 0 before computing. + /// + /// the property name + /// value of the property + /// project ID (optional) + public static void UserAdd(string property, object value, string appId = "") + { + Dictionary properties = new Dictionary() + { + { property, value } + }; + UserAdd(properties, appId); + } + + /// + /// Accumulates the property. If the property has not been set, it would be given a value of 0 before computing. + /// + /// user properties + /// project ID (optional) + public static void UserAdd(Dictionary properties, string appId = "") + { + if (tracking_enabled) + { + TDWrapper.UserAdd(properties, appId); + } + else + { + System.Reflection.MethodBase method = System.Reflection.MethodBase.GetCurrentMethod(); + object[] parameters = new object[] { properties, appId }; + eventCaches.Add(new Dictionary() { + { "method", method}, + { "parameters", parameters} + }); + } + } + + /// + /// Accumulates the property, type of Number. If the property has not been set, it would be given a value of 0 before computing. + /// + /// user properties + /// date time + /// project ID (optional) + public static void UserAdd(Dictionary properties, DateTime dateTime, string appId = "") + { + if (tracking_enabled) + { + TDWrapper.UserAdd(properties, dateTime, appId); + } + else + { + System.Reflection.MethodBase method = System.Reflection.MethodBase.GetCurrentMethod(); + object[] parameters = new object[] { properties, dateTime, appId }; + eventCaches.Add(new Dictionary() { + { "method", method}, + { "parameters", parameters} + }); + } + } + + /// + /// Appends the property, type of List. + /// + /// user properties + /// project ID (optional) + public static void UserAppend(Dictionary properties, string appId = "") + { + if (tracking_enabled) + { + TDWrapper.UserAppend(properties, appId); + } + else + { + System.Reflection.MethodBase method = System.Reflection.MethodBase.GetCurrentMethod(); + object[] parameters = new object[] { properties, appId }; + eventCaches.Add(new Dictionary() { + { "method", method}, + { "parameters", parameters} + }); + } + } + + /// + /// Appends the property, type of List. + /// + /// user properties + /// date time + /// project ID (optional) + public static void UserAppend(Dictionary properties, DateTime dateTime, string appId = "") + { + if (tracking_enabled) + { + TDWrapper.UserAppend(properties, dateTime, appId); + } + else + { + System.Reflection.MethodBase method = System.Reflection.MethodBase.GetCurrentMethod(); + object[] parameters = new object[] { properties, dateTime, appId }; + eventCaches.Add(new Dictionary() { + { "method", method}, + { "parameters", parameters} + }); + } + } + + /// + /// Appends the property Uniquely, type of List. If the property has been set, it would be neglected + /// + /// user properties + /// project ID (optional) + public static void UserUniqAppend(Dictionary properties, string appId = "") + { + if (tracking_enabled) + { + TDWrapper.UserUniqAppend(properties, appId); + } + else + { + System.Reflection.MethodBase method = System.Reflection.MethodBase.GetCurrentMethod(); + object[] parameters = new object[] { properties, appId }; + eventCaches.Add(new Dictionary() { + { "method", method}, + { "parameters", parameters} + }); + } + } + + /// + /// Appends the property Uniquely, type of List. If the property has been set, it would be neglected + /// + /// user prpoerties + /// date time + /// project ID (optional) + public static void UserUniqAppend(Dictionary properties, DateTime dateTime, string appId = "") + { + if (tracking_enabled) + { + TDWrapper.UserUniqAppend(properties, dateTime, appId); + } + else + { + System.Reflection.MethodBase method = System.Reflection.MethodBase.GetCurrentMethod(); + object[] parameters = new object[] { properties, dateTime, appId }; + eventCaches.Add(new Dictionary() { + { "method", method}, + { "parameters", parameters} + }); + } + } + + /// + /// Deletes All Properties for a user, the events triggered by the user are still exist + /// + /// project ID (optional) + public static void UserDelete(string appId = "") + { + if (tracking_enabled) + { + TDWrapper.UserDelete(appId); + } + else + { + System.Reflection.MethodBase method = System.Reflection.MethodBase.GetCurrentMethod(); + object[] parameters = new object[] { appId }; + eventCaches.Add(new Dictionary() { + { "method", method}, + { "parameters", parameters} + }); + } + } + + /// + /// Deletes All Properties for a user, the events triggered by the user are still exist + /// + /// date time + /// project ID (optional) + //public static void UserDelete(DateTime dateTime, string appId = "") + //{ + // if (tracking_enabled) + // { + // TDWrapper.UserDelete(dateTime, appId); + // } + // else + // { + // System.Reflection.MethodBase method = System.Reflection.MethodBase.GetCurrentMethod(); + // object[] parameters = new object[] { dateTime, appId }; + // eventCaches.Add(new Dictionary() { + // { "method", method}, + // { "parameters", parameters} + // }); + // } + //} + + /// + /// Sets Network Type for report date to TE + /// + /// network type, see TDNetworkType + /// project ID (optional) + public static void SetNetworkType(TDNetworkType networkType, string appId = "") + { + if (tracking_enabled) + { + TDWrapper.SetNetworkType(networkType); + } + else + { + System.Reflection.MethodBase method = System.Reflection.MethodBase.GetCurrentMethod(); + object[] parameters = new object[] { networkType, appId }; + eventCaches.Add(new Dictionary() { + { "method", method}, + { "parameters", parameters} + }); + } + } + + /// + /// Gets TDAnalytics SDK version + /// + /// SDK version + public static string GetSDKVersion() + { + return TDPublicConfig.LIB_VERSION; + } + + /// + /// Gets the device identifier. + /// + /// The device identifier. + public static string GetDeviceId() + { + if (tracking_enabled) + { + return TDWrapper.GetDeviceId(); + } + return null; + } + + /// + /// Sets Data Report Status + /// + /// data report status, see TDTrackStatus + /// project ID (optional) + public static void SetTrackStatus(TDTrackStatus status, string appId = "") + { + if (tracking_enabled) + { + TDWrapper.SetTrackStatus(status, appId); + } + else + { + System.Reflection.MethodBase method = System.Reflection.MethodBase.GetCurrentMethod(); + object[] parameters = new object[] { status, appId }; + eventCaches.Add(new Dictionary() { + { "method", method}, + { "parameters", parameters} + }); + } + } + + /// + /// Stops Report Event Data, and Clear Cache Data (include unreported event data, custom distinct ID, account ID, Super Properties) + /// + /// project ID (optional) + [Obsolete("Method is deprecated, please use SetTrackStatus() instead.")] + public static void OptOutTracking(string appId = "") + { + if (tracking_enabled) + { + TDWrapper.OptOutTracking(appId); + } + else + { + System.Reflection.MethodBase method = System.Reflection.MethodBase.GetCurrentMethod(); + object[] parameters = new object[] { appId }; + eventCaches.Add(new Dictionary() { + { "method", method}, + { "parameters", parameters} + }); + } + } + + /// + /// Stops Report Event Data, and Clear Cache Data (include unreported event data, custom distinct ID, account ID, super properties), and Delete User + /// + /// project ID (optional) + [Obsolete("Method is deprecated, please use SetTrackStatus() instead.")] + public static void OptOutTrackingAndDeleteUser(string appId = "") + { + if (tracking_enabled) + { + TDWrapper.OptOutTrackingAndDeleteUser(appId); + } + else + { + System.Reflection.MethodBase method = System.Reflection.MethodBase.GetCurrentMethod(); + object[] parameters = new object[] { appId }; + eventCaches.Add(new Dictionary() { + { "method", method}, + { "parameters", parameters} + }); + } + } + + /// + /// Resumes Report Event Data + /// + /// project ID (optional) + [Obsolete("Method is deprecated, please use SetTrackStatus() instead.")] + public static void OptInTracking(string appId = "") + { + if (tracking_enabled) + { + TDWrapper.OptInTracking(appId); + } + else + { + System.Reflection.MethodBase method = System.Reflection.MethodBase.GetCurrentMethod(); + object[] parameters = new object[] { appId }; + eventCaches.Add(new Dictionary() { + { "method", method}, + { "parameters", parameters} + }); + } + } + + /// + /// Enable Report Event Data + /// + /// Whether to enable reported data + /// project ID (optional) + [Obsolete("Method is deprecated, please use SetTrackStatus() instead.")] + public static void EnableTracking(bool enabled, string appId = "") + { + if (tracking_enabled) + { + TDWrapper.EnableTracking(enabled, appId); + } + else + { + System.Reflection.MethodBase method = System.Reflection.MethodBase.GetCurrentMethod(); + object[] parameters = new object[] { enabled, appId }; + eventCaches.Add(new Dictionary() { + { "method", method}, + { "parameters", parameters} + }); + } + } + + /// + /// Creats Light Instance, it has same project ID to main instance, diffent distinct ID, account ID, super properties + /// + /// project ID (optional) + /// light instance token + public static string LightInstance(string appId = "") { + if (tracking_enabled) + { + return TDWrapper.CreateLightInstance(); + } + return null; + } + + /// + /// Calibrate Event Time, calibrated times are used for events after that + /// If both CalibrateTime and CalibrateTimeWithNtp are called, the event time is based on the CalibrateTimeWithNtp result. + /// + /// currnt Unix timestamp, units Ms + public static void CalibrateTime(long timestamp) + { + TDWrapper.CalibrateTime(timestamp); + } + + /// + /// Calibrate Event Time, calibrated times are used for events after that + /// If NTP server is not returns in 3s, the time will not be re-calibrated + /// If both CalibrateTime and CalibrateTimeWithNtp are called, the event time is based on the CalibrateTimeWithNtp result. + /// + /// NTP server, e.g 'time.asia.apple.com' + public static void CalibrateTimeWithNtp(string ntpServer) + { + TDWrapper.CalibrateTimeWithNtp(ntpServer); + } + + /// + /// Cross Platform + /// Share TE account system info to other platforms + /// + /// type of platforms, see TDThirdPartyType + /// properties of platforms + /// project ID (optional) + public static void EnableThirdPartySharing(TDThirdPartyType shareType, Dictionary properties = null, string appId = "") + { + if (tracking_enabled) + { + TDWrapper.EnableThirdPartySharing(shareType, properties, appId); + } + else + { + System.Reflection.MethodBase method = System.Reflection.MethodBase.GetCurrentMethod(); + object[] parameters = new object[] { shareType }; + eventCaches.Add(new Dictionary() { + { "method", method}, + { "parameters", parameters} + }); + } + } + + /// + /// Gets the Local Country/Region Code + /// the two-letter code defined in ISO 3166 for the country/region + /// + /// country/region code + public static string GetLocalRegion() + { + return System.Globalization.RegionInfo.CurrentRegion.TwoLetterISORegionName; + } + + /// + /// Start Thinking Analytics SDK + /// + /// project ID + /// project URL + public static void Init(string appId, string serverUrl) + { + TDConfig tDConfig = new TDConfig(appId, serverUrl); + Init(tDConfig); + } + + /// + /// Start Thinking Analytics SDK + /// + /// project setting, see TDConfig + public static void Init(TDConfig config) + { + new GameObject("ThinkingData", typeof(TDAnalytics)); + TDConfig[] configs = new TDConfig[1]; + configs[0] = config; + TDAnalytics.Init(configs); + } + + /// + /// Start Thinking Analytics SDK + /// + /// projects setting, see TDConfig + public static void Init(TDConfig[] configs = null) + { + #if DISABLE_TA + tracking_enabled = false; + #else + tracking_enabled = true; + #endif + + if (tracking_enabled) + { + TDPublicConfig.GetPublicConfig(); + TDLog.EnableLog(sThinkingData.enableLog); + TDWrapper.EnableLog(sThinkingData.enableLog); + TDWrapper.SetVersionInfo(TDPublicConfig.LIB_VERSION); + if (configs == null) + { + configs = sThinkingData.configs; + } + try + { + for (int i = 0; i < configs.Length; i++) + { + TDConfig config = configs[i]; + if (!string.IsNullOrEmpty(config.appId)) + { + config.appId = config.appId.Replace(" ", ""); + TDWrapper.ShareInstance(config, sThinkingData); + TDWrapper.SetNetworkType(sThinkingData.networkType); + if (TDLog.GetEnable()) TDLog.i(string.Format("TDAnalytics SDK initialize success, AppId = {0}, ServerUrl = {1}, Mode = {2}, TimeZone = {3}, DeviceId = {4}, Lib = Unity, LibVersion = {5}{6}", config.appId, config.serverUrl, config.mode, config.timeZone, GetDeviceId(), GetSDKVersion(), (config.name != null ? (", Name = " + config.name) : ""))); + } + } + } + catch (Exception ex) + { + if(TDLog.GetEnable()) TDLog.i("ThinkingAnalytics start Error: " + ex.Message); + } + } + + FlushEventCaches(); + } + + #region internal + private static void FlushEventCaches() + { + List> tmpEventCaches = new List>(eventCaches); + eventCaches.Clear(); + foreach (Dictionary eventCache in tmpEventCaches) + { + if (eventCache.ContainsKey("method") && eventCache.ContainsKey("parameters")) + { + System.Reflection.MethodBase method = (System.Reflection.MethodBase)eventCache["method"]; + object[] parameters = (object[])eventCache["parameters"]; + method.Invoke(null, parameters); + } + } + } + + private void Awake() + { + if (sThinkingData == null) + { + sThinkingData = this; + DontDestroyOnLoad(gameObject); + } + else + { + Destroy(gameObject); + return; + } + + if (this.startManually == false) + { + TDAnalytics.Init(); + } + } + + private void Start() + { + } + + private void OnApplicationQuit() + { + //Scene scene = SceneManager.GetActiveScene(); + //if (scene != null) + //{ + // OnSceneUnloaded(scene); + //} + } + + private static TDAnalytics sThinkingData; + private static bool tracking_enabled = false; + private static List> eventCaches = new List>(); + #endregion + } + + /// + /// SDK Configuration information class + /// + [System.Serializable] + public class TDConfig + { + /// + /// Project ID + /// + public string appId; + /// + /// Project URL + /// + public string serverUrl; + /// + /// SDK Mode + /// + public TDMode mode; + /// + /// TIme Zone Type + /// + public TDTimeZone timeZone; + /// + /// Time Zone ID + /// + public string timeZoneId; + /// + /// enable data encryption, default is false (iOS/Android only) + /// + internal bool enableEncrypt; + /// + /// secret key version (iOS/Android only) + /// + internal int encryptVersion; + /// + /// public secret key (iOS/Android only) + /// + internal string encryptPublicKey; + internal string symType; + internal string asymType; + /// + /// SSL Pinning mode, default is NONE (iOS/Android only) + /// + public TDSSLPinningMode pinningMode; + /// + /// allow invalid certificates, default is false (iOS/Android only) + /// + public bool allowInvalidCertificates; + /// + /// enable to verify domain name, default is true (iOS/Android only) + /// + public bool validatesDomainName; + /// + /// SDK instance name, to call SDK quickly + /// + public string name { set { if (!string.IsNullOrEmpty(value)) sName = value.Replace(" ", ""); } get { return sName; } } // instances name + private string sName; + + /// + /// Construct TDConfig instance + /// + /// project ID + /// project URL + public TDConfig(string appId, string serverUrl) + { + this.appId = appId.Replace(" ", ""); + this.serverUrl = serverUrl; + this.mode = TDMode.Normal; + this.timeZone = TDTimeZone.Local; + this.timeZoneId = null; + this.enableEncrypt = false; + this.encryptPublicKey = null; + this.encryptVersion = 0; + this.symType = null; + this.asymType = null; + this.pinningMode = TDSSLPinningMode.NONE; + this.allowInvalidCertificates = false; + this.validatesDomainName = true; + } + + public void EnableEncrypt(string publicKey, int version = 0, string symType = "", string asymType = "") + { + this.enableEncrypt = true; + this.encryptVersion = version; + this.encryptPublicKey = publicKey; + this.symType = symType; + this.asymType = asymType; + } + + /// + /// Get Time Zone Identify Code in SDK + /// + /// Time Zone ID + public string getTimeZoneId() + { + switch (timeZone) + { + case TDTimeZone.UTC: + return "UTC"; + case TDTimeZone.Asia_Shanghai: + return "Asia/Shanghai"; + case TDTimeZone.Asia_Tokyo: + return "Asia/Tokyo"; + case TDTimeZone.America_Los_Angeles: + return "America/Los_Angeles"; + case TDTimeZone.America_New_York: + return "America/New_York"; + case TDTimeZone.Other: + return timeZoneId; + default: + break; + } + return null; + } + } + +} diff --git a/Assets/HCMiniSdk/Third/ta/ThinkingAnalytics/TDAnalytics.cs.meta b/Assets/HCMiniSdk/Third/ta/ThinkingAnalytics/TDAnalytics.cs.meta new file mode 100644 index 00000000..97dbead5 --- /dev/null +++ b/Assets/HCMiniSdk/Third/ta/ThinkingAnalytics/TDAnalytics.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: d7df5c5e5307f460e917e72bf75ec567 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/HCMiniSdk/Third/ta/ThinkingAnalytics/TDAnalytics.prefab b/Assets/HCMiniSdk/Third/ta/ThinkingAnalytics/TDAnalytics.prefab new file mode 100644 index 00000000..8c10befc --- /dev/null +++ b/Assets/HCMiniSdk/Third/ta/ThinkingAnalytics/TDAnalytics.prefab @@ -0,0 +1,61 @@ +%YAML 1.1 +%TAG !u! tag:unity3d.com,2011: +--- !u!1 &3471622134282543401 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 57277738888238098} + - component: {fileID: 1362306111410183020} + m_Layer: 0 + m_Name: TDAnalytics + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!4 &57277738888238098 +Transform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 3471622134282543401} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: 0, y: 0, z: 0} + m_LocalScale: {x: 1, y: 1, z: 1} + m_ConstrainProportionsScale: 0 + m_Children: [] + m_Father: {fileID: 0} + m_RootOrder: 0 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} +--- !u!114 &1362306111410183020 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 3471622134282543401} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: d7df5c5e5307f460e917e72bf75ec567, type: 3} + m_Name: + m_EditorClassIdentifier: + startManually: 1 + enableLog: 1 + networkType: 0 + configs: + - appId: 1b1c1fef65e3482bad5c9d0e6a823356 + serverUrl: https://receiver.ta.thinkingdata.cn + mode: 0 + timeZone: 0 + timeZoneId: + enableEncrypt: 0 + encryptVersion: 0 + encryptPublicKey: + pinningMode: 0 + allowInvalidCertificates: 0 + validatesDomainName: 0 diff --git a/Assets/HCMiniSdk/Third/ta/ThinkingAnalytics/TDAnalytics.prefab.meta b/Assets/HCMiniSdk/Third/ta/ThinkingAnalytics/TDAnalytics.prefab.meta new file mode 100644 index 00000000..4413269f --- /dev/null +++ b/Assets/HCMiniSdk/Third/ta/ThinkingAnalytics/TDAnalytics.prefab.meta @@ -0,0 +1,7 @@ +fileFormatVersion: 2 +guid: 986ad473b78d14e08b1f05d368cb1591 +PrefabImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/HCMiniSdk/Third/ta/ThinkingAnalytics/TDEnum.cs b/Assets/HCMiniSdk/Third/ta/ThinkingAnalytics/TDEnum.cs new file mode 100644 index 00000000..1494ef41 --- /dev/null +++ b/Assets/HCMiniSdk/Third/ta/ThinkingAnalytics/TDEnum.cs @@ -0,0 +1,64 @@ +using System; + +namespace ThinkingData.Analytics +{ + /// + /// Time Zone in SDK options + /// + public enum TDTimeZone + { + Local, + UTC, + Asia_Shanghai, + Asia_Tokyo, + America_Los_Angeles, + America_New_York, + Other = 100 + } + + /// + /// SDK running mode options + /// + public enum TDMode + { + Debug = 1, + DebugOnly = 2, + Normal = 0 + } + + /// + /// Data post options + /// + public enum TDNetworkType + { + Wifi = 1, + All = 0 + } + + /// + /// Auto-tracking Events Type options + /// + [Flags] + public enum TDAutoTrackEventType + { + None = 0, + AppStart = 1 << 0, // reporting when the app enters the foreground (ta_app_start) + AppEnd = 1 << 1, // reporting when the app enters the background (ta_app_end) + AppCrash = 1 << 4, // reporting when an uncaught exception occurs (ta_app_crash) + AppInstall = 1 << 5, // reporting when the app is opened for the first time after installation (ta_app_install) + AppSceneLoad = 1 << 6, // reporting when the scene is loaded in the app (ta_scene_loaded) + AppSceneUnload = 1 << 7, // reporting when the scene is unloaded in the app (ta_scene_loaded) + All = AppStart | AppEnd | AppInstall | AppCrash | AppSceneLoad | AppSceneUnload + } + + /// + /// Data Reporting Status + /// + public enum TDTrackStatus + { + Pause = 1, // pause data reporting + Stop = 2, // stop data reporting, and clear caches + SaveOnly = 3, // data stores in the cache, but not be reported + Normal = 4 // resume data reporting + } +} \ No newline at end of file diff --git a/Assets/HCMiniSdk/Third/ta/ThinkingAnalytics/TDEnum.cs.meta b/Assets/HCMiniSdk/Third/ta/ThinkingAnalytics/TDEnum.cs.meta new file mode 100644 index 00000000..5fcf5d13 --- /dev/null +++ b/Assets/HCMiniSdk/Third/ta/ThinkingAnalytics/TDEnum.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: d704b4acc93944242809914ff26be411 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/HCMiniSdk/Third/ta/ThinkingAnalytics/TDEvent.cs b/Assets/HCMiniSdk/Third/ta/ThinkingAnalytics/TDEvent.cs new file mode 100644 index 00000000..b472f345 --- /dev/null +++ b/Assets/HCMiniSdk/Third/ta/ThinkingAnalytics/TDEvent.cs @@ -0,0 +1,130 @@ +using System; +using System.Collections.Generic; + +namespace ThinkingData.Analytics +{ + /// + /// Special event class for internal use, do not use this class directly. + /// + public abstract class TDEventModel + { + public enum TDEventType + { + First, + Updatable, + Overwritable + } + + public TDEventModel(string eventName) + { + EventName = eventName; + } + + public TDEventType? EventType { get; set; } + public string EventName { get; } + public Dictionary Properties { get; set; } + + private DateTime EventTime { get; set; } + private TimeZoneInfo EventTimeZone { get; set; } + protected string ExtraId { get; set; } + + /// + /// Set date time and timezone for the event + /// + /// date time + /// timezone + public void SetTime(DateTime time, TimeZoneInfo timeZone) + { + EventTime = time; + EventTimeZone = timeZone; + } + + /// + /// Get date time for the event + /// + /// + public DateTime GetEventTime() + { + return EventTime; + } + + /// + /// Get timezone for the event + /// + /// + public TimeZoneInfo GetEventTimeZone() + { + return EventTimeZone; + } + + /// + /// Get identify code for the event + /// + /// + public string GetEventId() + { + return ExtraId; + } + } + + /// + /// First Event Model + /// + public class TDFirstEventModel : TDEventModel + { + /// + /// Construct TDFirstEventModel instance + /// + /// name for the event + public TDFirstEventModel(string eventName) : base(eventName) + { + EventType = TDEventType.First; + } + + /// + /// Construct TDFirstEventModel instance + /// + /// name for the event + /// check ID for the first event + public TDFirstEventModel(string eventName, string firstCheckId) : base(eventName) + { + EventType = TDEventType.First; + ExtraId = firstCheckId; + } + } + + /// + /// Updatable Event Model + /// + public class TDUpdatableEventModel : TDEventModel + { + /// + /// Construct TDUpdatableEventModel instance + /// + /// name for the event + /// ID for the event + public TDUpdatableEventModel(string eventName, string eventId) : base(eventName) + { + EventType = TDEventType.Updatable; + ExtraId = eventId; + } + } + + /// + /// Overwritable Event Model + /// + public class TDOverwritableEventModel : TDEventModel + { + /// + /// Construct TDOverwritableEventModel instance + /// + /// name for the event + /// ID for the event + public TDOverwritableEventModel(string eventName, string eventId) : base(eventName) + { + EventType = TDEventType.Overwritable; + ExtraId = eventId; + } + } + +} \ No newline at end of file diff --git a/Assets/HCMiniSdk/Third/ta/ThinkingAnalytics/TDEvent.cs.meta b/Assets/HCMiniSdk/Third/ta/ThinkingAnalytics/TDEvent.cs.meta new file mode 100644 index 00000000..77f698f9 --- /dev/null +++ b/Assets/HCMiniSdk/Third/ta/ThinkingAnalytics/TDEvent.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: 5e80e3a99b3f0414187c8b3e448b4d66 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/HCMiniSdk/Third/ta/ThinkingAnalytics/TDInterface.cs b/Assets/HCMiniSdk/Third/ta/ThinkingAnalytics/TDInterface.cs new file mode 100644 index 00000000..88f33f1a --- /dev/null +++ b/Assets/HCMiniSdk/Third/ta/ThinkingAnalytics/TDInterface.cs @@ -0,0 +1,30 @@ +using System.Collections.Generic; + +namespace ThinkingData.Analytics +{ + /// + /// Dynamic super properties interfaces. + /// + public interface TDDynamicSuperPropertiesHandler + { + /// + /// Dynamically gets event properties + /// + /// event properties + Dictionary GetDynamicSuperProperties(); + } + + /// + /// Auto track event callback interfaces. + /// + public interface TDAutoTrackEventHandler + { + /// + /// Get Auto track event properties + /// + /// auto track event type + /// event properties + /// event properties + Dictionary GetAutoTrackEventProperties(int type, Dictionary properties); + } +} \ No newline at end of file diff --git a/Assets/HCMiniSdk/Third/ta/ThinkingAnalytics/TDInterface.cs.meta b/Assets/HCMiniSdk/Third/ta/ThinkingAnalytics/TDInterface.cs.meta new file mode 100644 index 00000000..96f6ca10 --- /dev/null +++ b/Assets/HCMiniSdk/Third/ta/ThinkingAnalytics/TDInterface.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: bba307e0084684dc08b109bd32fb415f +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/HCMiniSdk/Third/ta/ThinkingAnalytics/TDPresetProperties.cs b/Assets/HCMiniSdk/Third/ta/ThinkingAnalytics/TDPresetProperties.cs new file mode 100644 index 00000000..c60dd58e --- /dev/null +++ b/Assets/HCMiniSdk/Third/ta/ThinkingAnalytics/TDPresetProperties.cs @@ -0,0 +1,175 @@ +using System; +using System.Collections.Generic; + +namespace ThinkingData.Analytics +{ + /// + /// Preset Properties + /// + public class TDPresetProperties + { + /// + /// Construct TDPresetProperties instance + /// + /// preset properties + public TDPresetProperties(Dictionary properties) + { + properties = TDEncodeDate(properties); + mPresetProperties = properties; + } + /// + /// Returns Preset Properties + /// The key starts with "#", it is not recommended to use it directly as a user properties + /// + /// preset properties + public Dictionary ToDictionary() + { + return mPresetProperties; + } + /// + /// Application Version Number + /// + public string AppVersion + { + get { return (string)(mPresetProperties.ContainsKey("#app_version") ? mPresetProperties["#app_version"] : ""); } + } + /// + /// Application Bundle Identify + /// + public string BundleId + { + get { return (string)(mPresetProperties.ContainsKey("#bundle_id") ? mPresetProperties["#bundle_id"] : ""); } + } + /// + /// Device Network Carrier + /// + public string Carrier + { + get { return (string)(mPresetProperties.ContainsKey("#carrier") ? mPresetProperties["#carrier"] : ""); } + } + /// + /// Device Identify + /// + public string DeviceId + { + get { return (string)(mPresetProperties.ContainsKey("#device_id") ? mPresetProperties["#device_id"] : ""); } + } + /// + /// Device Model Name + /// + public string DeviceModel + { + get { return (string)(mPresetProperties.ContainsKey("#device_model") ? mPresetProperties["#device_model"] : ""); } + } + /// + /// Device Hardware Manufacturer + /// + public string Manufacturer + { + get { return (string)(mPresetProperties.ContainsKey("#manufacturer") ? mPresetProperties["#manufacturer"] : ""); } + } + /// + /// Device Network Type + /// + public string NetworkType + { + get { return (string)(mPresetProperties.ContainsKey("#network_type") ? mPresetProperties["#network_type"] : ""); } + } + /// + /// Device System OS Name + /// + public string OS + { + get { return (string)(mPresetProperties.ContainsKey("#os") ? mPresetProperties["#os"] : ""); } + } + /// + /// Device System OS Version Number + /// + public string OSVersion + { + get { return (string)(mPresetProperties.ContainsKey("#os_version") ? mPresetProperties["#os_version"] : ""); } + } + /// + /// Screen Height + /// + public double ScreenHeight + { + get { return Convert.ToDouble(mPresetProperties.ContainsKey("#screen_height") ? mPresetProperties["#screen_height"] : 0); } + } + /// + /// Screen Width + /// + public double ScreenWidth + { + get { return Convert.ToDouble(mPresetProperties.ContainsKey("#screen_width") ? mPresetProperties["#screen_width"] : 0); } + } + /// + /// Device System Language Code + /// + public string SystemLanguage + { + get { return (string)(mPresetProperties.ContainsKey("#system_language") ? mPresetProperties["#system_language"] : ""); } + } + /// + /// Time Zone Offset With UTC + /// + public double ZoneOffset + { + get { return Convert.ToDouble(mPresetProperties.ContainsKey("#zone_offset") ? mPresetProperties["#zone_offset"] : 0); } + } + /// + /// Application Install Time + /// + public string InstallTime + { + get { return (string)(mPresetProperties.ContainsKey("#install_time") ? mPresetProperties["#install_time"] : ""); } + } + /// + /// Device Disk Size + /// + public string Disk + { + get { return (string)(mPresetProperties.ContainsKey("#disk") ? mPresetProperties["#disk"] : ""); } + } + /// + /// Device Ram Size + /// + public string Ram + { + get { return (string)(mPresetProperties.ContainsKey("#ram") ? mPresetProperties["#ram"] : ""); } + } + /// + /// Device FPS + /// + public double Fps + { + get { return Convert.ToDouble(mPresetProperties.ContainsKey("#fps") ? mPresetProperties["#fps"] : 0); } + } + /// + /// Device is an Simulator + /// + public bool Simulator + { + get { return (bool)(mPresetProperties.ContainsKey("#simulator") ? mPresetProperties["#simulator"] : false); } + } + + private Dictionary mPresetProperties { get; set; } + private Dictionary TDEncodeDate(Dictionary properties) + { + Dictionary mProperties = new Dictionary(); + foreach (KeyValuePair kv in properties) + { + if (kv.Value is DateTime) + { + DateTime dateTime = (DateTime)kv.Value; + mProperties.Add(kv.Key, dateTime.ToString("yyyy-MM-dd HH:mm:ss.fff", System.Globalization.CultureInfo.InvariantCulture)); + } + else + { + mProperties.Add(kv.Key, kv.Value); + } + } + return mProperties; + } + } +} \ No newline at end of file diff --git a/Assets/HCMiniSdk/Third/ta/ThinkingAnalytics/TDPresetProperties.cs.meta b/Assets/HCMiniSdk/Third/ta/ThinkingAnalytics/TDPresetProperties.cs.meta new file mode 100644 index 00000000..bdf2e3b6 --- /dev/null +++ b/Assets/HCMiniSdk/Third/ta/ThinkingAnalytics/TDPresetProperties.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: 23d7545160a0c4e67be49833c78690e3 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/HCMiniSdk/Third/ta/ThinkingAnalytics/ThinkingAnalyticsAPI.cs b/Assets/HCMiniSdk/Third/ta/ThinkingAnalytics/ThinkingAnalyticsAPI.cs new file mode 100644 index 00000000..258ad8c4 --- /dev/null +++ b/Assets/HCMiniSdk/Third/ta/ThinkingAnalytics/ThinkingAnalyticsAPI.cs @@ -0,0 +1,1753 @@ +/* + * + Copyright 2019, ThinkingData, Inc + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. + SDK VERSION:3.0.3 + */ +#if !(UNITY_5_4_OR_NEWER) +#define DISABLE_TA +#warning "Your Unity version is not supported by us - ThinkingAnalyticsSDK disabled" +#endif + +using System; +using System.Collections.Generic; +using ThinkingData.Analytics; +using ThinkingData.Analytics.Utils; +using ThinkingData.Analytics.Wrapper; +using UnityEngine; +using ThinkingData.Analytics.TDException; +using UnityEngine.SceneManagement; + +namespace ThinkingAnalytics +{ + [DisallowMultipleComponent] + [Obsolete("ThinkingAnalyticsAPI is deprecated, please use ThinkingData.Analytics instead.")] + public class ThinkingAnalyticsAPI : MonoBehaviour, TDDynamicSuperPropertiesHandler, TDAutoTrackEventHandler + { + #region settings + [System.Serializable] + public struct Token + { + public string appid; + public string serverUrl; + public TAMode mode; + public TATimeZone timeZone; + public string timeZoneId; + public bool enableEncrypt; // enable data encryption, default is false (iOS/Android only) + public int encryptVersion; // secret key version (iOS/Android only) + public string encryptPublicKey; // public secret key (iOS/Android only) + public TDSSLPinningMode pinningMode; // SSL Pinning mode, default is NONE (iOS/Android only) + public bool allowInvalidCertificates; // allow invalid certificates, default is false (iOS/Android only) + public bool validatesDomainName; // enable to verify domain name, default is true (iOS/Android only) + private string instanceName; // instances name + + public Token(string appId, string serverUrl, TAMode mode = TAMode.NORMAL, TATimeZone timeZone = TATimeZone.Local, string timeZoneId = null, string instanceName = null) + { + this.appid = appId.Replace(" ", ""); + this.serverUrl = serverUrl; + this.mode = mode; + this.timeZone = timeZone; + this.timeZoneId = timeZoneId; + this.enableEncrypt = false; + this.encryptVersion = 0; + this.encryptPublicKey = null; + this.pinningMode = TDSSLPinningMode.NONE; + this.allowInvalidCertificates = false; + this.validatesDomainName = true; + if (!string.IsNullOrEmpty(instanceName)) + { + instanceName = instanceName.Replace(" ", ""); + } + this.instanceName = instanceName; + } + + public string GetInstanceName() + { + return this.instanceName; + } + + public string getTimeZoneId() + { +#if UNITY_STANDALONE_WIN + switch (timeZone) + { + case TATimeZone.UTC: + return "UTC"; + case TATimeZone.Asia_Shanghai: + return "China Standard Time"; + case TATimeZone.Asia_Tokyo: + return "Tokyo Standard Time"; + case TATimeZone.America_Los_Angeles: + return "Pacific Standard Time"; + case TATimeZone.America_New_York: + return "Eastern Standard Time"; + case TATimeZone.Other: + return timeZoneId; + default: + break; + } +#else + switch (timeZone) + { + case TATimeZone.UTC: + return "UTC"; + case TATimeZone.Asia_Shanghai: + return "Asia/Shanghai"; + case TATimeZone.Asia_Tokyo: + return "Asia/Tokyo"; + case TATimeZone.America_Los_Angeles: + return "America/Los_Angeles"; + case TATimeZone.America_New_York: + return "America/New_York"; + case TATimeZone.Other: + return timeZoneId; + default: + break; + } +#endif + return null; + } + + internal TDConfig ToTDConfig() + { + TDConfig config = new TDConfig(this.appid, this.serverUrl); + config.mode = (TDMode)this.mode; + config.timeZone = (TDTimeZone)this.timeZone; + config.timeZoneId = this.timeZoneId; + config.pinningMode = this.pinningMode; + config.allowInvalidCertificates = this.allowInvalidCertificates; + config.validatesDomainName = this.validatesDomainName; + config.name = this.instanceName; + if(this.enableEncrypt){ + config.EnableEncrypt(this.encryptPublicKey, this.encryptVersion); + } + return config; + } + } + + public enum TATimeZone + { + Local, + UTC, + Asia_Shanghai, + Asia_Tokyo, + America_Los_Angeles, + America_New_York, + Other = 100 + } + + public enum TAMode + { + NORMAL = 0, + DEBUG = 1, + DEBUG_ONLY = 2 + } + + public enum NetworkType + { + DEFAULT = 1, + WIFI = 2, + ALL = 3 + } + + [Header("Configuration")] + [Tooltip("Enable Start SDK Manually")] + public bool startManually = true; + + [Tooltip("Enable Log")] + public bool enableLog = true; + [Tooltip("Sets the Network Type")] + public NetworkType networkType = NetworkType.DEFAULT; + + [Header("Project")] + [Tooltip("Project Setting, APP ID is given when the project is created")] + [HideInInspector] + public Token[] tokens = new Token[1]; + +#endregion + + /// + /// Whether to enable logs + /// + /// enable logs + public static void EnableLog(bool enable, string appId = "") + { + if (sThinkingAnalyticsAPI != null) + { + sThinkingAnalyticsAPI.enableLog = enable; + TDLog.EnableLog(enable); + TDWrapper.EnableLog(enable); + } + } + /// + /// Set custom distinct ID, to replace the distinct ID generated by the system + /// + /// distinct ID + /// project ID (optional) + public static void Identify(string distinctId, string appId = "") + { + if (tracking_enabled) + { + TDWrapper.SetDistinctId(distinctId, appId); + } + else + { + System.Reflection.MethodBase method = System.Reflection.MethodBase.GetCurrentMethod(); + object[] parameters = new object[] { distinctId, appId }; + eventCaches.Add(new Dictionary() { + { "method", method}, + { "parameters", parameters} + }); + } + } + + /// + /// Returns the current distinct ID + /// + /// distinct ID + /// project ID (optional) + public static string GetDistinctId(string appId = "") + { + if (tracking_enabled) + { + return TDWrapper.GetDistinctId(appId); + } + return null; + } + + /// + /// Set account ID. This method does not upload Login events + /// + /// account ID + /// project ID (optional) + public static void Login(string account, string appId = "") + { + if (tracking_enabled) + { + TDWrapper.Login(account, appId); + } + else + { + System.Reflection.MethodBase method = System.Reflection.MethodBase.GetCurrentMethod(); + object[] parameters = new object[] { account, appId }; + eventCaches.Add(new Dictionary() { + { "method", method}, + { "parameters", parameters} + }); + } + } + + /// + /// Clear account ID. This method does not upload Logout events + /// + /// project ID (optional) + public static void Logout(string appId = "") + { + if (tracking_enabled) + { + TDWrapper.Logout(appId); + } + else + { + System.Reflection.MethodBase method = System.Reflection.MethodBase.GetCurrentMethod(); + object[] parameters = new object[] { appId }; + eventCaches.Add(new Dictionary() { + { "method", method}, + { "parameters", parameters} + }); + } + } + + /// + /// Enable auto-tracking + /// + /// auto-tracking events + /// properties for auto-tracking events (optional) + /// project ID (optional) + public static void EnableAutoTrack(AUTO_TRACK_EVENTS events, Dictionary properties = null, string appId = "") + { + if (tracking_enabled) + { + if (properties == null) + { + properties = new Dictionary(); + } + TDWrapper.EnableAutoTrack((TDAutoTrackEventType)events, properties, appId); + if ((events & AUTO_TRACK_EVENTS.AppCrash) != 0 && !TDPublicConfig.DisableCSharpException) + { + TDExceptionHandler.RegisterTAExceptionHandler(properties); + } + if ((events & AUTO_TRACK_EVENTS.AppSceneLoad) != 0) + { + SceneManager.sceneLoaded -= ThinkingAnalyticsAPI.OnSceneLoaded; + SceneManager.sceneLoaded += ThinkingAnalyticsAPI.OnSceneLoaded; + } + if ((events & AUTO_TRACK_EVENTS.AppSceneUnload) != 0) + { + SceneManager.sceneUnloaded -= ThinkingAnalyticsAPI.OnSceneUnloaded; + SceneManager.sceneUnloaded += ThinkingAnalyticsAPI.OnSceneUnloaded; + } + } + else + { + System.Reflection.MethodBase method = System.Reflection.MethodBase.GetCurrentMethod(); + object[] parameters = new object[] { events, properties, appId }; + eventCaches.Add(new Dictionary() { + { "method", method}, + { "parameters", parameters} + }); + } + } + + /// + /// Enable auto-tracking + /// + /// auto-tracking events + /// callback for auto-tracking events (optional) + /// project ID (optional) + public static void EnableAutoTrack(AUTO_TRACK_EVENTS events, IAutoTrackEventCallback eventCallback, string appId = "") + { + if (tracking_enabled) + { + sThinkingAnalyticsAPI._eventCallback = eventCallback; + TDWrapper.EnableAutoTrack((TDAutoTrackEventType)events, sThinkingAnalyticsAPI, appId); + if ((events & AUTO_TRACK_EVENTS.AppCrash) != 0 && !TDPublicConfig.DisableCSharpException) + { + TDExceptionHandler.RegisterTAExceptionHandler(sThinkingAnalyticsAPI); + } + if ((events & AUTO_TRACK_EVENTS.AppSceneLoad) != 0) + { + SceneManager.sceneLoaded -= ThinkingAnalyticsAPI.OnSceneLoaded; + SceneManager.sceneLoaded += ThinkingAnalyticsAPI.OnSceneLoaded; + } + if ((events & AUTO_TRACK_EVENTS.AppSceneUnload) != 0) + { + SceneManager.sceneUnloaded -= ThinkingAnalyticsAPI.OnSceneUnloaded; + SceneManager.sceneUnloaded += ThinkingAnalyticsAPI.OnSceneUnloaded; + } + } + else + { + System.Reflection.MethodBase method = System.Reflection.MethodBase.GetCurrentMethod(); + object[] parameters = new object[] { events, eventCallback, appId }; + eventCaches.Add(new Dictionary() { + { "method", method}, + { "parameters", parameters} + }); + } + + } + + /// + /// Set properties for auto-tracking events + /// + /// auto-tracking events + /// properties for auto-tracking events + /// project ID (optional) + public static void SetAutoTrackProperties(AUTO_TRACK_EVENTS events, Dictionary properties, string appId = "") + { + if (tracking_enabled) + { + TDWrapper.SetAutoTrackProperties((TDAutoTrackEventType)events, properties, appId); + if ((events & AUTO_TRACK_EVENTS.AppCrash) != 0 && !TDPublicConfig.DisableCSharpException) + { + TDWrapper.SetAutoTrackProperties((TDAutoTrackEventType)events ,properties, appId); + } + } + else + { + System.Reflection.MethodBase method = System.Reflection.MethodBase.GetCurrentMethod(); + object[] parameters = new object[] { events, properties, appId }; + eventCaches.Add(new Dictionary() { + { "method", method}, + { "parameters", parameters} + }); + } + } + + /// + /// Track a Event + /// + /// event name + /// project ID (optional) + public static void Track(string eventName, string appId = "") + { + Track(eventName, null, appId); + } + + /// + /// Track a Event + /// + /// the event name + /// properties for the event + /// project ID (optional) + public static void Track(string eventName, Dictionary properties, string appId = "") + { + if (tracking_enabled) + { + TDWrapper.Track(eventName, properties, appId); + } + else + { + System.Reflection.MethodBase method = System.Reflection.MethodBase.GetCurrentMethod(); + object[] parameters = new object[] { eventName, properties, appId }; + eventCaches.Add(new Dictionary() { + { "method", method}, + { "parameters", parameters} + }); + } + } + + /// + /// Track a Event + /// + /// the event name + /// properties for the event + /// date for the event + /// project ID (optional) + [Obsolete("Method is deprecated, please use Track(string eventName, Dictionary properties, DateTime date, TimeZoneInfo timeZone, string appId = \"\") instead.")] + public static void Track(string eventName, Dictionary properties, DateTime date, string appId = "") + { + if (tracking_enabled) + { + TDWrapper.Track(eventName, properties, date, appId); + } + else + { + System.Reflection.MethodBase method = System.Reflection.MethodBase.GetCurrentMethod(); + object[] parameters = new object[] { eventName, properties, date, appId }; + eventCaches.Add(new Dictionary() { + { "method", method}, + { "parameters", parameters} + }); + } + } + + /// + /// Track a Event + /// + /// the event name + /// properties for the event + /// date for the event + /// time zone for the event + /// project ID (optional) + public static void Track(string eventName, Dictionary properties, DateTime date, TimeZoneInfo timeZone, string appId = "") + { + if (tracking_enabled) + { + TDWrapper.Track(eventName, properties, date, timeZone, appId); + } + else + { + System.Reflection.MethodBase method = System.Reflection.MethodBase.GetCurrentMethod(); + object[] parameters = new object[] { eventName, properties, date, timeZone, appId }; + eventCaches.Add(new Dictionary() { + { "method", method}, + { "parameters", parameters} + }); + } + } + + /// + /// Track a Special Event (First Event/Updatable Event/Overwritable Event) + /// + /// the special event + /// project ID (optional) + public static void Track(ThinkingAnalyticsEvent analyticsEvent, string appId = "") + { + if (tracking_enabled) + { + TDEventModel eventModel; + if (analyticsEvent.EventType == ThinkingAnalyticsEvent.Type.UPDATABLE) + { + eventModel = new TDUpdatableEventModel(analyticsEvent.EventName, analyticsEvent.ExtraId); + } + else if (analyticsEvent.EventType == ThinkingAnalyticsEvent.Type.OVERWRITABLE) + { + eventModel = new TDUpdatableEventModel(analyticsEvent.EventName, analyticsEvent.ExtraId); + } + else + { + if (string.IsNullOrEmpty(analyticsEvent.ExtraId)) + { + eventModel = new TDFirstEventModel(analyticsEvent.EventName); + } + else + { + eventModel = new TDFirstEventModel(analyticsEvent.EventName, analyticsEvent.ExtraId); + } + } + eventModel.Properties = analyticsEvent.Properties; + eventModel.SetTime(analyticsEvent.EventTime, analyticsEvent.EventTimeZone); + TDWrapper.Track(eventModel, appId); + } + else + { + System.Reflection.MethodBase method = System.Reflection.MethodBase.GetCurrentMethod(); + object[] parameters = new object[] { analyticsEvent, appId }; + eventCaches.Add(new Dictionary() { + { "method", method}, + { "parameters", parameters} + }); + } + } + + /// + /// Quickly track a Special Event + /// + /// the event name, 'SceneView' for scene view event, 'AppClick' for click event + /// event properties + /// + public static void QuickTrack(string eventName, Dictionary properties = null, string appId = "") + { + if (tracking_enabled) + { + TDWrapper.QuickTrack(eventName, properties, appId); + } + else + { + System.Reflection.MethodBase method = System.Reflection.MethodBase.GetCurrentMethod(); + object[] parameters = new object[] { eventName, properties, appId }; + eventCaches.Add(new Dictionary() { + { "method", method}, + { "parameters", parameters} + }); + } + } + + /// + /// Report events data to TE server immediately + /// + /// project ID (optional) + public static void Flush(string appId = "") + { + if (tracking_enabled) + { + TDWrapper.Flush(appId); + } + else + { + System.Reflection.MethodBase method = System.Reflection.MethodBase.GetCurrentMethod(); + object[] parameters = new object[] { appId }; + eventCaches.Add(new Dictionary() { + { "method", method}, + { "parameters", parameters} + }); + } + } + + /// + /// Scenes load Delegate + /// + /// the load scene + /// the scene loading mode + public static void OnSceneLoaded(Scene scene, LoadSceneMode mode) + { + if (tracking_enabled) + { + TDWrapper.TrackSceneLoad(scene); + } + else + { + System.Reflection.MethodBase method = System.Reflection.MethodBase.GetCurrentMethod(); + object[] parameters = new object[] { scene, mode }; + eventCaches.Add(new Dictionary() { + { "method", method}, + { "parameters", parameters} + }); + } + } + + /// + /// Scenes unload Delegate + /// + /// the unload scene + public static void OnSceneUnloaded(Scene scene) + { + if (tracking_enabled) + { + TDWrapper.TrackSceneUnload(scene); + } + else + { + System.Reflection.MethodBase method = System.Reflection.MethodBase.GetCurrentMethod(); + object[] parameters = new object[] { scene }; + eventCaches.Add(new Dictionary() { + { "method", method}, + { "parameters", parameters} + }); + } + } + + /// + /// Super Properties, refer to properties that would be uploaded by each event + /// + /// super properties for events + /// project ID (optional) + public static void SetSuperProperties(Dictionary superProperties, string appId = "") + { + if (tracking_enabled) + { + TDWrapper.SetSuperProperties(superProperties, appId); + } + else + { + System.Reflection.MethodBase method = System.Reflection.MethodBase.GetCurrentMethod(); + object[] parameters = new object[] { superProperties, appId }; + eventCaches.Add(new Dictionary() { + { "method", method}, + { "parameters", parameters} + }); + } + } + + /// + /// Delete Property form current Super Properties + /// + /// property name + /// project ID (optional) + public static void UnsetSuperProperty(string property, string appId = "") + { + if (tracking_enabled) + { + TDWrapper.UnsetSuperProperty(property, appId); + } + else + { + System.Reflection.MethodBase method = System.Reflection.MethodBase.GetCurrentMethod(); + object[] parameters = new object[] { property, appId }; + eventCaches.Add(new Dictionary() { + { "method", method}, + { "parameters", parameters} + }); + } + } + + /// + /// Returns current Super Properties + /// + /// current super properties + /// project ID (optional) + public static Dictionary GetSuperProperties(string appId = "") + { + if (tracking_enabled) + { + return TDWrapper.GetSuperProperties(appId); + } + return null; + } + + /// + /// Clear current Super Properties + /// + /// project ID (optional) + public static void ClearSuperProperties(string appId = "") + { + if (tracking_enabled) + { + TDWrapper.ClearSuperProperty(appId); + } + else + { + System.Reflection.MethodBase method = System.Reflection.MethodBase.GetCurrentMethod(); + object[] parameters = new object[] { appId }; + eventCaches.Add(new Dictionary() { + { "method", method}, + { "parameters", parameters} + }); + } + } + + /// + /// Returns current Preset Properties + /// + /// current preset properties + /// project ID (optional) + public static TDPresetProperties GetPresetProperties(string appId = "") + { + if (tracking_enabled) + { + Dictionary properties = TDWrapper.GetPresetProperties(appId); + TDPresetProperties presetProperties = new TDPresetProperties(properties); + return presetProperties; + } + return null; + } + + /// + /// Sets the Dynamic Super Properties. + /// + /// dynamic super properties interface + /// project ID (optional) + public static void SetDynamicSuperProperties(IDynamicSuperProperties dynamicSuperProperties, string appId = "") + { + if (tracking_enabled) + { + sThinkingAnalyticsAPI._dynamicSuperProperties = dynamicSuperProperties; + TDWrapper.SetDynamicSuperProperties(sThinkingAnalyticsAPI, appId); + } + else + { + System.Reflection.MethodBase method = System.Reflection.MethodBase.GetCurrentMethod(); + object[] parameters = new object[] { dynamicSuperProperties, appId }; + eventCaches.Add(new Dictionary() { + { "method", method}, + { "parameters", parameters} + }); + } + } + + /// + /// Records Event Duration, call TimeEvent to start timing for the Event, call Track to end timing + /// + /// the event name + /// project ID (optional) + public static void TimeEvent(string eventName, string appId = "") + { + if (tracking_enabled) + { + TDWrapper.TimeEvent(eventName, appId); + } + else + { + System.Reflection.MethodBase method = System.Reflection.MethodBase.GetCurrentMethod(); + object[] parameters = new object[] { eventName, appId }; + eventCaches.Add(new Dictionary() { + { "method", method}, + { "parameters", parameters} + }); + } + } + + /// + /// Sets User Properties, this will overwrite the original properties value + /// + /// user properties + /// project ID (optional) + public static void UserSet(Dictionary properties, string appId = "") + { + if (tracking_enabled) + { + TDWrapper.UserSet(properties, appId); + } + else + { + System.Reflection.MethodBase method = System.Reflection.MethodBase.GetCurrentMethod(); + object[] parameters = new object[] { properties, appId }; + eventCaches.Add(new Dictionary() { + { "method", method}, + { "parameters", parameters} + }); + } + } + + /// + /// Sets User Properties, this will overwrite the original properties value + /// + /// user properties + /// date time + /// project ID (optional) + public static void UserSet(Dictionary properties, DateTime dateTime, string appId = "") + { + if (tracking_enabled) + { + TDWrapper.UserSet(properties, dateTime, appId); + } + else + { + System.Reflection.MethodBase method = System.Reflection.MethodBase.GetCurrentMethod(); + object[] parameters = new object[] { properties , dateTime, appId}; + eventCaches.Add(new Dictionary() { + { "method", method}, + { "parameters", parameters} + }); + } + } + + /// + /// Unsets one of User Porperties, this would not create properties that have not been created in TE + /// + /// the user property name + /// project ID (optional) + public static void UserUnset(string property, string appId = "") + { + List properties = new List(); + properties.Add(property); + UserUnset(properties, appId); + } + + + /// + /// Unsets some of User Porperties, this would not create properties that have not been created in TE + /// + /// the user properties name + /// project ID (optional) + public static void UserUnset(List properties, string appId = "") + { + if (tracking_enabled) + { + TDWrapper.UserUnset(properties, appId); + } + else + { + System.Reflection.MethodBase method = System.Reflection.MethodBase.GetCurrentMethod(); + object[] parameters = new object[] { properties, appId }; + eventCaches.Add(new Dictionary() { + { "method", method}, + { "parameters", parameters} + }); + } + + } + + /// + /// Unsets some of User Porperties, this would not create properties that have not been created in TE + /// + /// the user properties name + /// date time + /// project ID (optional) + public static void UserUnset(List properties, DateTime dateTime, string appId = "") + { + if (tracking_enabled) + { + TDWrapper.UserUnset(properties, dateTime, appId); + } + else + { + System.Reflection.MethodBase method = System.Reflection.MethodBase.GetCurrentMethod(); + object[] parameters = new object[] { properties, dateTime, appId }; + eventCaches.Add(new Dictionary() { + { "method", method}, + { "parameters", parameters} + }); + } + } + + /// + /// Sets User Properties for Once. This message would be neglected, if such property had been set before + /// + /// user properties + /// project ID (optional) + public static void UserSetOnce(Dictionary properties, string appId = "") + { + if (tracking_enabled) + { + TDWrapper.UserSetOnce(properties, appId); + } + else + { + System.Reflection.MethodBase method = System.Reflection.MethodBase.GetCurrentMethod(); + object[] parameters = new object[] { properties, appId }; + eventCaches.Add(new Dictionary() { + { "method", method}, + { "parameters", parameters} + }); + } + + } + + /// + /// Sets User Properties for Once. The property would be neglected, if such property had been set before + /// + /// user properties + /// date time + /// project ID (optional) + public static void UserSetOnce(Dictionary properties, DateTime dateTime, string appId = "") + { + if (tracking_enabled) + { + TDWrapper.UserSetOnce(properties, dateTime, appId); + } + else + { + System.Reflection.MethodBase method = System.Reflection.MethodBase.GetCurrentMethod(); + object[] parameters = new object[] { properties, dateTime,appId }; + eventCaches.Add(new Dictionary() { + { "method", method}, + { "parameters", parameters} + }); + } + + } + + /// + /// Accumulates the property. If the property has not been set, it would be given a value of 0 before computing. + /// + /// the property name + /// value of the property + /// project ID (optional) + public static void UserAdd(string property, object value, string appId = "") + { + Dictionary properties = new Dictionary() + { + { property, value } + }; + UserAdd(properties, appId); + } + + /// + /// Accumulates the property. If the property has not been set, it would be given a value of 0 before computing. + /// + /// user properties + /// project ID (optional) + public static void UserAdd(Dictionary properties, string appId = "") + { + if (tracking_enabled) + { + TDWrapper.UserAdd(properties, appId); + } + else + { + System.Reflection.MethodBase method = System.Reflection.MethodBase.GetCurrentMethod(); + object[] parameters = new object[] { properties, appId }; + eventCaches.Add(new Dictionary() { + { "method", method}, + { "parameters", parameters} + }); + } + } + + /// + /// Accumulates the property, type of Number. If the property has not been set, it would be given a value of 0 before computing. + /// + /// user properties + /// date time + /// project ID (optional) + public static void UserAdd(Dictionary properties, DateTime dateTime, string appId = "") + { + if (tracking_enabled) + { + TDWrapper.UserAdd(properties, dateTime, appId); + } + else + { + System.Reflection.MethodBase method = System.Reflection.MethodBase.GetCurrentMethod(); + object[] parameters = new object[] { properties, dateTime, appId }; + eventCaches.Add(new Dictionary() { + { "method", method}, + { "parameters", parameters} + }); + } + } + + /// + /// Appends the property, type of List. + /// + /// user properties + /// project ID (optional) + public static void UserAppend(Dictionary properties, string appId = "") + { + if (tracking_enabled) + { + TDWrapper.UserAppend(properties, appId); + } + else + { + System.Reflection.MethodBase method = System.Reflection.MethodBase.GetCurrentMethod(); + object[] parameters = new object[] { properties, appId }; + eventCaches.Add(new Dictionary() { + { "method", method}, + { "parameters", parameters} + }); + } + } + + /// + /// Appends the property, type of List. + /// + /// user properties + /// date time + /// project ID (optional) + public static void UserAppend(Dictionary properties, DateTime dateTime, string appId = "") + { + if (tracking_enabled) + { + TDWrapper.UserAppend(properties, dateTime, appId); + } + else + { + System.Reflection.MethodBase method = System.Reflection.MethodBase.GetCurrentMethod(); + object[] parameters = new object[] { properties, dateTime, appId }; + eventCaches.Add(new Dictionary() { + { "method", method}, + { "parameters", parameters} + }); + } + } + + /// + /// Appends the property Uniquely, type of List. If the property has been set, it would be neglected + /// + /// user properties + /// project ID (optional) + public static void UserUniqAppend(Dictionary properties, string appId = "") + { + if (tracking_enabled) + { + TDWrapper.UserUniqAppend(properties, appId); + } + else + { + System.Reflection.MethodBase method = System.Reflection.MethodBase.GetCurrentMethod(); + object[] parameters = new object[] { properties, appId }; + eventCaches.Add(new Dictionary() { + { "method", method}, + { "parameters", parameters} + }); + } + } + + /// + /// Appends the property Uniquely, type of List. If the property has been set, it would be neglected + /// + /// user prpoerties + /// date time + /// project ID (optional) + public static void UserUniqAppend(Dictionary properties, DateTime dateTime, string appId = "") + { + if (tracking_enabled) + { + TDWrapper.UserUniqAppend(properties, dateTime, appId); + } + else + { + System.Reflection.MethodBase method = System.Reflection.MethodBase.GetCurrentMethod(); + object[] parameters = new object[] { properties, dateTime, appId }; + eventCaches.Add(new Dictionary() { + { "method", method}, + { "parameters", parameters} + }); + } + } + + /// + /// Deletes All Properties for a user, the events triggered by the user are still exist + /// + /// project ID (optional) + public static void UserDelete(string appId = "") + { + if (tracking_enabled) + { + TDWrapper.UserDelete(appId); + } + else + { + System.Reflection.MethodBase method = System.Reflection.MethodBase.GetCurrentMethod(); + object[] parameters = new object[] { appId }; + eventCaches.Add(new Dictionary() { + { "method", method}, + { "parameters", parameters} + }); + } + } + + /// + /// Deletes All Properties for a user, the events triggered by the user are still exist + /// + /// date time + /// project ID (optional) + public static void UserDelete(DateTime dateTime, string appId = "") + { + if (tracking_enabled) + { + TDWrapper.UserDelete(dateTime, appId); + } + else + { + System.Reflection.MethodBase method = System.Reflection.MethodBase.GetCurrentMethod(); + object[] parameters = new object[] { dateTime, appId }; + eventCaches.Add(new Dictionary() { + { "method", method}, + { "parameters", parameters} + }); + } + } + + /// + /// Sets Network Type for report date to TE + /// + /// network type, see NetworkType + /// project ID (optional) + public static void SetNetworkType(NetworkType networkType, string appId = "") + { + if (tracking_enabled) + { + TDWrapper.SetNetworkType((TDNetworkType)networkType); + } + else + { + System.Reflection.MethodBase method = System.Reflection.MethodBase.GetCurrentMethod(); + object[] parameters = new object[] { networkType, appId }; + eventCaches.Add(new Dictionary() { + { "method", method}, + { "parameters", parameters} + }); + } + } + + /// + /// Gets the device identifier. + /// + /// The device identifier. + public static string GetDeviceId() + { + if (tracking_enabled) + { + return TDWrapper.GetDeviceId(); + } + return null; + } + + /// + /// Sets Data Report Status + /// + /// data report status, see TA_TRACK_STATUS + /// project ID (optional) + public static void SetTrackStatus(TA_TRACK_STATUS status, string appId = "") + { + if (tracking_enabled) + { + TDWrapper.SetTrackStatus((TDTrackStatus)status, appId); + } + else + { + System.Reflection.MethodBase method = System.Reflection.MethodBase.GetCurrentMethod(); + object[] parameters = new object[] { status, appId }; + eventCaches.Add(new Dictionary() { + { "method", method}, + { "parameters", parameters} + }); + } + } + + /// + /// Stops Report Event Data, and Clear Cache Data (include unreported event data, custom distinct ID, account ID, Super Properties) + /// + /// project ID (optional) + [Obsolete("Method is deprecated, please use SetTrackStatus() instead.")] + public static void OptOutTracking(string appId = "") + { + if (tracking_enabled) + { + TDWrapper.OptOutTracking(appId); + } + else + { + System.Reflection.MethodBase method = System.Reflection.MethodBase.GetCurrentMethod(); + object[] parameters = new object[] { appId }; + eventCaches.Add(new Dictionary() { + { "method", method}, + { "parameters", parameters} + }); + } + } + + /// + /// Stops Report Event Data, and Clear Cache Data (include unreported event data, custom distinct ID, account ID, super properties), and Delete User + /// + /// project ID (optional) + [Obsolete("Method is deprecated, please use SetTrackStatus() instead.")] + public static void OptOutTrackingAndDeleteUser(string appId = "") + { + if (tracking_enabled) + { + TDWrapper.OptOutTrackingAndDeleteUser(appId); + } + else + { + System.Reflection.MethodBase method = System.Reflection.MethodBase.GetCurrentMethod(); + object[] parameters = new object[] { appId }; + eventCaches.Add(new Dictionary() { + { "method", method}, + { "parameters", parameters} + }); + } + } + + /// + /// Resumes Report Event Data + /// + /// project ID (optional) + [Obsolete("Method is deprecated, please use SetTrackStatus() instead.")] + public static void OptInTracking(string appId = "") + { + if (tracking_enabled) + { + TDWrapper.OptInTracking(appId); + } + else + { + System.Reflection.MethodBase method = System.Reflection.MethodBase.GetCurrentMethod(); + object[] parameters = new object[] { appId }; + eventCaches.Add(new Dictionary() { + { "method", method}, + { "parameters", parameters} + }); + } + } + + /// + /// Enable Report Event Data + /// + /// Whether to enable reported data + /// project ID (optional) + [Obsolete("Method is deprecated, please use SetTrackStatus() instead.")] + public static void EnableTracking(bool enabled, string appId = "") + { + if (tracking_enabled) + { + TDWrapper.EnableTracking(enabled, appId); + } + else + { + System.Reflection.MethodBase method = System.Reflection.MethodBase.GetCurrentMethod(); + object[] parameters = new object[] { enabled, appId }; + eventCaches.Add(new Dictionary() { + { "method", method}, + { "parameters", parameters} + }); + } + } + + /// + /// Creats Light Instance, it has same project ID to main instance, diffent distinct ID, account ID, super properties + /// + /// project ID (optional) + /// light instance token + public static string CreateLightInstance(string appId = "") { + if (tracking_enabled) + { + return TDWrapper.CreateLightInstance(); + } + return null; + } + + /// + /// Calibrate Event Time, calibrated times are used for events after that + /// + /// currnt Unix timestamp, units Ms + public static void CalibrateTime(long timestamp) + { + TDWrapper.CalibrateTime(timestamp); + } + + /// + /// Calibrate Event Time, calibrated times are used for events after that + /// If NTP server is not returns in 3s, the time will not be re-calibrated + /// + /// NTP server, e.g 'time.asia.apple.com' + public static void CalibrateTimeWithNtp(string ntpServer) + { + TDWrapper.CalibrateTimeWithNtp(ntpServer); + } + + /// + /// Cross Platform + /// Share TE account system info to other platforms + /// + /// type of platforms, see TAThirdPartyShareType + /// properties of platforms + /// project ID (optional) + public static void EnableThirdPartySharing(TAThirdPartyShareType shareType, Dictionary properties = null, string appId = "") + { + if (tracking_enabled) + { + TDWrapper.EnableThirdPartySharing((TDThirdPartyType)shareType, properties, appId); + } + else + { + System.Reflection.MethodBase method = System.Reflection.MethodBase.GetCurrentMethod(); + object[] parameters = new object[] { shareType }; + eventCaches.Add(new Dictionary() { + { "method", method}, + { "parameters", parameters} + }); + } + } + + /// + /// Gets the Local Country/Region Code + /// the two-letter code defined in ISO 3166 for the country/region + /// + /// country/region code + public static string GetLocalRegion() + { + return System.Globalization.RegionInfo.CurrentRegion.TwoLetterISORegionName; + } + + /// + /// Start Thinking Analytics SDK + /// + /// project ID + /// project URL + public static void StartThinkingAnalytics(string appId, string serverUrl) + { + ThinkingAnalyticsAPI.TAMode mode = ThinkingAnalyticsAPI.TAMode.NORMAL; + ThinkingAnalyticsAPI.TATimeZone timeZone = ThinkingAnalyticsAPI.TATimeZone.Local; + ThinkingAnalyticsAPI.Token token = new ThinkingAnalyticsAPI.Token(appId, serverUrl, mode, timeZone); + ThinkingAnalyticsAPI.StartThinkingAnalytics(token); + } + + /// + /// Start Thinking Analytics SDK + /// + /// project setting, see ThinkingAnalyticsAPI.Token + public static void StartThinkingAnalytics(ThinkingAnalyticsAPI.Token token) + { + ThinkingAnalyticsAPI.Token[] tokens = new ThinkingAnalyticsAPI.Token[1]; + tokens[0] = token; + ThinkingAnalyticsAPI.StartThinkingAnalytics(tokens); + } + + /// + /// Start Thinking Analytics SDK + /// + /// projects setting, see ThinkingAnalyticsAPI.Token + public static void StartThinkingAnalytics(Token[] tokens = null) + { +#if DISABLE_TA + tracking_enabled = false; +#else + tracking_enabled = true; +#endif + + if (tracking_enabled) + { + TDPublicConfig.GetPublicConfig(); + TDLog.EnableLog(sThinkingAnalyticsAPI.enableLog); + TDWrapper.EnableLog(sThinkingAnalyticsAPI.enableLog); + TDWrapper.SetVersionInfo(TDPublicConfig.LIB_VERSION); + if (tokens == null) + { + tokens = sThinkingAnalyticsAPI.tokens; + } + try + { + for (int i = 0; i < tokens.Length; i++) + { + Token token = tokens[i]; + if (!string.IsNullOrEmpty(token.appid)) + { + token.appid = token.appid.Replace(" ", ""); + if(TDLog.GetEnable()) TDLog.d("ThinkingAnalytics start with APPID: " + token.appid + ", SERVERURL: " + token.serverUrl + ", MODE: " + token.mode); + TDWrapper.ShareInstance(token.ToTDConfig(), sThinkingAnalyticsAPI); + TDWrapper.SetNetworkType((TDNetworkType)sThinkingAnalyticsAPI.networkType); + } + } + } + catch (Exception ex) + { + if(TDLog.GetEnable()) TDLog.d("ThinkingAnalytics start Error: " + ex.Message); + } + } + + FlushEventCaches(); + } + + #region internal + private static void FlushEventCaches() + { + List> tmpEventCaches = new List>(eventCaches); + eventCaches.Clear(); + foreach (Dictionary eventCache in tmpEventCaches) + { + if (eventCache.ContainsKey("method") && eventCache.ContainsKey("parameters")) + { + System.Reflection.MethodBase method = (System.Reflection.MethodBase)eventCache["method"]; + object[] parameters = (object[])eventCache["parameters"]; + method.Invoke(null, parameters); + } + } + } + + private void Awake() + { + if (sThinkingAnalyticsAPI == null) + { + sThinkingAnalyticsAPI = this; + DontDestroyOnLoad(gameObject); + } + else + { + Destroy(gameObject); + return; + } + + if (this.startManually == false) + { + ThinkingAnalyticsAPI.StartThinkingAnalytics(); + } + } + + private void Start() + { + } + + private void OnApplicationQuit() + { + //Scene scene = SceneManager.GetActiveScene(); + //if (scene != null) + //{ + // OnSceneUnloaded(scene); + //} + } + + private static ThinkingAnalyticsAPI sThinkingAnalyticsAPI; + private static bool tracking_enabled = false; + private static List> eventCaches = new List>(); + private IDynamicSuperProperties _dynamicSuperProperties; + private IAutoTrackEventCallback _eventCallback; + #endregion + + /// + /// Dynamically gets event properties + /// + /// event properties + public Dictionary GetDynamicSuperProperties() + { + if (this._dynamicSuperProperties != null) + { + return this._dynamicSuperProperties.GetDynamicSuperProperties(); + } + else + { + return null; + } + } + /// + /// Get Auto track event properties + /// + /// auto track event type + /// event properties + /// event properties + public Dictionary GetAutoTrackEventProperties(int type, Dictionary properties) + { + if (this._eventCallback != null) + { + return this._eventCallback.AutoTrackEventCallback(type, properties); + } + else + { + return null; + } + } + } + + // Auto-tracking Events Type + [Obsolete("AUTO_TRACK_EVENTS is deprecated, please use ThinkingData.Analytics.TDAutoTrackEventType instead.")] + public enum AUTO_TRACK_EVENTS + { + NONE = 0, + AppStart = 1 << 0, // reporting when the app enters the foreground (ta_app_start) + AppEnd = 1 << 1, // reporting when the app enters the background (ta_app_end) + AppCrash = 1 << 4, // reporting when an uncaught exception occurs (ta_app_crash) + AppInstall = 1 << 5, // reporting when the app is opened for the first time after installation (ta_app_install) + AppSceneLoad = 1 << 6, // reporting when the scene is loaded in the app (ta_scene_loaded) + AppSceneUnload = 1 << 7, // reporting when the scene is unloaded in the app (ta_scene_loaded) + ALL = AppStart | AppEnd | AppInstall | AppCrash | AppSceneLoad | AppSceneUnload + } + + // Data Reporting Status + [Obsolete("TA_TRACK_STATUS is deprecated, please use ThinkingData.Analytics.TDTrackStatus instead.")] + public enum TA_TRACK_STATUS + { + PAUSE = 1, // pause data reporting + STOP = 2, // stop data reporting, and clear caches + SAVE_ONLY = 3, // data stores in the cache, but not be reported + NORMAL = 4 // resume data reporting + } + + [Obsolete("TAThirdPartyShareType is deprecated, please use ThinkingData.Analytics.Utils.TDThirdPartyType instead.")] + public enum TAThirdPartyShareType + { + NONE = 0, + APPSFLYER = 1 << 0, // AppsFlyer + IRONSOURCE = 1 << 1, // IronSource + ADJUST = 1 << 2, // Adjust + BRANCH = 1 << 3, // Branch + TOPON = 1 << 4, // TopOn + TRACKING = 1 << 5, // ReYun + TRADPLUS = 1 << 6, // TradPlus + }; + + /// + /// Dynamic super properties interfaces. + /// + [Obsolete("IDynamicSuperProperties is deprecated, please use ThinkingData.Analytics.TDDynamicSuperPropertiesHandler instead.")] + public interface IDynamicSuperProperties + { + /// + /// Dynamically gets event properties + /// + /// event properties + Dictionary GetDynamicSuperProperties(); + } + + /// + /// Auto track event callback interfaces. + /// + [Obsolete("IAutoTrackEventCallback is deprecated, please use ThinkingData.Analytics.TDAutoTrackEventHandler instead.")] + public interface IAutoTrackEventCallback + { + /// + /// Get Auto track event properties + /// + /// auto track event type + /// event properties + /// event properties + Dictionary AutoTrackEventCallback(int type, Dictionary properties); + } + + /// + /// Special event class for internal use, do not use this class directly. + /// + [Obsolete("ThinkingAnalyticsEvent is deprecated, please use ThinkingData.Analytics.TDEventModel instead.")] + public class ThinkingAnalyticsEvent + { + public enum Type + { + FIRST, + UPDATABLE, + OVERWRITABLE + } + + public ThinkingAnalyticsEvent(string eventName, Dictionary properties) + { + EventName = eventName; + Properties = properties; + } + + public Type? EventType { get; set; } + public string EventName { get; } + public Dictionary Properties { get; } + + public DateTime EventTime { get; set; } + public TimeZoneInfo EventTimeZone { get; set; } + public string ExtraId { get; set; } + } + + /// + /// First Events + /// + [Obsolete("TDFirstEvent is deprecated, please use ThinkingData.Analytics.TDFirstEventModel instead.")] + public class TDFirstEvent : ThinkingAnalyticsEvent + { + public TDFirstEvent(string eventName, Dictionary properties) : base(eventName, properties) + { + EventType = Type.FIRST; + } + + // First Event Check ID. By default, first events ID are device ID. + public void SetFirstCheckId(string firstCheckId) + { + ExtraId = firstCheckId; + } + } + + /// + /// Updatable Events + /// + [Obsolete("TDUpdatableEvent is deprecated, please use ThinkingData.Analytics.TDUpdatableEventModel instead.")] + public class TDUpdatableEvent : ThinkingAnalyticsEvent + { + public TDUpdatableEvent(string eventName, Dictionary properties, string eventId) : base(eventName, properties) + { + EventType = Type.UPDATABLE; + ExtraId = eventId; + } + } + + /// + /// Overwritable Events + /// + [Obsolete("TDOverWritableEvent is deprecated, please use ThinkingData.Analytics.TDOverwritableEventModel instead.")] + public class TDOverWritableEvent : ThinkingAnalyticsEvent + { + public TDOverWritableEvent(string eventName, Dictionary properties, string eventId) : base(eventName, properties) + { + EventType = Type.OVERWRITABLE; + ExtraId = eventId; + } + } + + /// + /// Preset Properties + /// + [Obsolete("TDPresetProperties is deprecated, please use ThinkingData.Analytics.TDPresetProperties instead.")] + public class TDPresetProperties + { + /// + /// Construct TDPresetProperties instance + /// + /// preset properties + public TDPresetProperties(Dictionary properties) + { + properties = TDEncodeDate(properties); + mPresetProperties = properties; + } + /// + /// Returns Preset Properties + /// The key starts with "#", it is not recommended to use it directly as a user properties + /// + /// preset properties + public Dictionary ToEventPresetProperties() + { + return mPresetProperties; + } + /// + /// Application Version Number + /// + public string AppVersion + { + get { return (string)(mPresetProperties.ContainsKey("#app_version") ? mPresetProperties["#app_version"] : ""); } + } + /// + /// Application Bundle Identify + /// + public string BundleId + { + get { return (string)(mPresetProperties.ContainsKey("#bundle_id") ? mPresetProperties["#bundle_id"] : ""); } + } + /// + /// Device Network Carrier + /// + public string Carrier + { + get { return (string)(mPresetProperties.ContainsKey("#carrier") ? mPresetProperties["#carrier"] : ""); } + } + /// + /// Device Identify + /// + public string DeviceId + { + get { return (string)(mPresetProperties.ContainsKey("#device_id") ? mPresetProperties["#device_id"] : ""); } + } + /// + /// Device Model Name + /// + public string DeviceModel + { + get { return (string)(mPresetProperties.ContainsKey("#device_model") ? mPresetProperties["#device_model"] : ""); } + } + /// + /// Device Hardware Manufacturer + /// + public string Manufacturer + { + get { return (string)(mPresetProperties.ContainsKey("#manufacturer") ? mPresetProperties["#manufacturer"] : ""); } + } + /// + /// Device Network Type + /// + public string NetworkType + { + get { return (string)(mPresetProperties.ContainsKey("#network_type") ? mPresetProperties["#network_type"] : ""); } + } + /// + /// Device System OS Name + /// + public string OS + { + get { return (string)(mPresetProperties.ContainsKey("#os") ? mPresetProperties["#os"] : ""); } + } + /// + /// Device System OS Version Number + /// + public string OSVersion + { + get { return (string)(mPresetProperties.ContainsKey("#os_version") ? mPresetProperties["#os_version"] : ""); } + } + /// + /// Screen Height + /// + public double ScreenHeight + { + get { return Convert.ToDouble(mPresetProperties.ContainsKey("#screen_height") ? mPresetProperties["#screen_height"] : 0); } + } + /// + /// Screen Width + /// + public double ScreenWidth + { + get { return Convert.ToDouble(mPresetProperties.ContainsKey("#screen_width") ? mPresetProperties["#screen_width"] : 0); } + } + /// + /// Device System Language Code + /// + public string SystemLanguage + { + get { return (string)(mPresetProperties.ContainsKey("#system_language") ? mPresetProperties["#system_language"] : ""); } + } + /// + /// Time Zone Offset With UTC + /// + public double ZoneOffset + { + get { return Convert.ToDouble(mPresetProperties.ContainsKey("#zone_offset") ? mPresetProperties["#zone_offset"] : 0); } + } + /// + /// Application Install Time + /// + public string InstallTime + { + get { return (string)(mPresetProperties.ContainsKey("#install_time") ? mPresetProperties["#install_time"] : ""); } + } + /// + /// Device Disk Size + /// + public string Disk + { + get { return (string)(mPresetProperties.ContainsKey("#disk") ? mPresetProperties["#disk"] : ""); } + } + /// + /// Device Ram Size + /// + public string Ram + { + get { return (string)(mPresetProperties.ContainsKey("#ram") ? mPresetProperties["#ram"] : ""); } + } + /// + /// Device FPS + /// + public double Fps + { + get { return Convert.ToDouble(mPresetProperties.ContainsKey("#fps") ? mPresetProperties["#fps"] : 0); } + } + /// + /// Device is an Simulator + /// + public bool Simulator + { + get { return (bool)(mPresetProperties.ContainsKey("#simulator") ? mPresetProperties["#simulator"] : false); } + } + + private Dictionary mPresetProperties { get; set; } + private Dictionary TDEncodeDate(Dictionary properties) + { + Dictionary mProperties = new Dictionary(); + foreach (KeyValuePair kv in properties) + { + if (kv.Value is DateTime) + { + DateTime dateTime = (DateTime)kv.Value; + mProperties.Add(kv.Key, dateTime.ToString("yyyy-MM-dd HH:mm:ss.fff", System.Globalization.CultureInfo.InvariantCulture)); + } + else + { + mProperties.Add(kv.Key, kv.Value); + } + } + return mProperties; + } + } +} diff --git a/Assets/HCMiniSdk/Third/ta/ThinkingAnalytics/ThinkingAnalyticsAPI.cs.meta b/Assets/HCMiniSdk/Third/ta/ThinkingAnalytics/ThinkingAnalyticsAPI.cs.meta new file mode 100644 index 00000000..b1c95d03 --- /dev/null +++ b/Assets/HCMiniSdk/Third/ta/ThinkingAnalytics/ThinkingAnalyticsAPI.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: 3281a13f4ff754b019604465fadd63ec +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/HCMiniSdk/Third/ta/ThinkingAnalytics/Utils.meta b/Assets/HCMiniSdk/Third/ta/ThinkingAnalytics/Utils.meta new file mode 100644 index 00000000..31f6fa66 --- /dev/null +++ b/Assets/HCMiniSdk/Third/ta/ThinkingAnalytics/Utils.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: efe5e95f8073844fcbaedf8453895210 +folderAsset: yes +DefaultImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/HCMiniSdk/Third/ta/ThinkingAnalytics/Utils/TDCommonUtils.cs b/Assets/HCMiniSdk/Third/ta/ThinkingAnalytics/Utils/TDCommonUtils.cs new file mode 100644 index 00000000..c5485847 --- /dev/null +++ b/Assets/HCMiniSdk/Third/ta/ThinkingAnalytics/Utils/TDCommonUtils.cs @@ -0,0 +1,42 @@ +using System; +namespace ThinkingData.Analytics.Utils +{ + public class TDCommonUtils + { + public static string FormatDate(DateTime dateTime, TimeZoneInfo timeZone) + { + bool success = true; + DateTime univDateTime = dateTime.ToUniversalTime(); + TimeSpan timeSpan = new TimeSpan(); + try + { + timeSpan = timeZone.BaseUtcOffset; + } + catch (Exception) + { + success = false; + //if (ThinkingSDKPublicConfig.IsPrintLog()) ThinkingSDKLogger.Print("FormatDate - TimeSpan get failed : " + e.Message); + } + try + { + if (timeZone.IsDaylightSavingTime(dateTime)) + { + TimeSpan timeSpan1 = TimeSpan.FromHours(1); + timeSpan = timeSpan.Add(timeSpan1); + } + } + catch (Exception) + { + success = false; + //if (ThinkingSDKPublicConfig.IsPrintLog()) ThinkingSDKLogger.Print("FormatDate: IsDaylightSavingTime get failed : " + e.Message); + } + if (success == false) + { + timeSpan = TimeZone.CurrentTimeZone.GetUtcOffset(dateTime); + } + DateTime dateNew = univDateTime + timeSpan; + return dateNew.ToString("yyyy-MM-dd HH:mm:ss.fff", System.Globalization.CultureInfo.InvariantCulture); + } + } +} + diff --git a/Assets/HCMiniSdk/Third/ta/ThinkingAnalytics/Utils/TDCommonUtils.cs.meta b/Assets/HCMiniSdk/Third/ta/ThinkingAnalytics/Utils/TDCommonUtils.cs.meta new file mode 100644 index 00000000..d0a11be3 --- /dev/null +++ b/Assets/HCMiniSdk/Third/ta/ThinkingAnalytics/Utils/TDCommonUtils.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: 56ef1531e6e06454aa9a6700b418632d +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/HCMiniSdk/Third/ta/ThinkingAnalytics/Utils/TDLog.cs b/Assets/HCMiniSdk/Third/ta/ThinkingAnalytics/Utils/TDLog.cs new file mode 100644 index 00000000..ae46aa79 --- /dev/null +++ b/Assets/HCMiniSdk/Third/ta/ThinkingAnalytics/Utils/TDLog.cs @@ -0,0 +1,51 @@ +using UnityEngine; + +namespace ThinkingData.Analytics.Utils +{ + public class TDLog + { + private static bool enableLog; + public static void EnableLog(bool enabled) + { + enableLog = enabled; + } + + public static bool GetEnable() + { + return enableLog; + } + + + public static void i(string message) + { + if (enableLog) + { + Debug.Log("[ThinkingData] Info: " + message); + } + } + + public static void d(string message) + { + if (enableLog) + { + Debug.Log("[ThinkingData] Debug: " + message); + } + } + + public static void e(string message) + { + if (enableLog) + { + Debug.LogError("[ThinkingData] Error: " + message); + } + } + + public static void w(string message) + { + if (enableLog) + { + Debug.LogWarning("[ThinkingData] Warning: " + message); + } + } + } +} \ No newline at end of file diff --git a/Assets/HCMiniSdk/Third/ta/ThinkingAnalytics/Utils/TDLog.cs.meta b/Assets/HCMiniSdk/Third/ta/ThinkingAnalytics/Utils/TDLog.cs.meta new file mode 100644 index 00000000..68e2f999 --- /dev/null +++ b/Assets/HCMiniSdk/Third/ta/ThinkingAnalytics/Utils/TDLog.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: 9b49f9a69526c4417963783322d7e904 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/HCMiniSdk/Third/ta/ThinkingAnalytics/Utils/TDMiniJson.cs b/Assets/HCMiniSdk/Third/ta/ThinkingAnalytics/Utils/TDMiniJson.cs new file mode 100644 index 00000000..0bb90f94 --- /dev/null +++ b/Assets/HCMiniSdk/Third/ta/ThinkingAnalytics/Utils/TDMiniJson.cs @@ -0,0 +1,610 @@ +/* + * MIT License. Forked from GA_MiniJSON. + * I modified it so that it could be used for TD limitations. + */ +// using UnityEngine; +using System; +using System.Collections; +using System.Collections.Generic; +using System.IO; +using System.Text; +using System.Globalization; + +namespace ThinkingData.Analytics.Utils +{ + /* Based on the JSON parser from + * http://techblog.procurios.nl/k/618/news/view/14605/14863/How-do-I-write-my-own-parser-for-JSON.html + * + * I simplified it so that it doesn't throw exceptions + * and can be used in Unity iPhone with maximum code stripping. + */ + /// + /// This class encodes and decodes JSON strings. + /// Spec. details, see http://www.json.org/ + /// + /// JSON uses Arrays and Objects. These correspond here to the datatypes ArrayList and Hashtable. + /// All numbers are parsed to floats. + /// + public class TDMiniJson + { + /// + /// Parses the string json into a value + /// + /// A JSON string. + /// An List, a Dictionary, a double, an integer, a string, null, true, or false + public static Dictionary Deserialize(string json) + { + // save the string for debug information + if (json == null) + { + return null; + } + + return Parser.Parse(json); + } + + sealed class Parser : IDisposable + { + const string WORD_BREAK = "{}[],:\""; + + public static bool IsWordBreak(char c) + { + return Char.IsWhiteSpace(c) || WORD_BREAK.IndexOf(c) != -1; + } + + enum TOKEN + { + NONE, + CURLY_OPEN, + CURLY_CLOSE, + SQUARED_OPEN, + SQUARED_CLOSE, + COLON, + COMMA, + STRING, + NUMBER, + TRUE, + FALSE, + NULL + }; + + StringReader json; + + Parser(string jsonString) + { + json = new StringReader(jsonString); + } + + public static Dictionary Parse(string jsonString) + { + using (var instance = new Parser(jsonString)) + { + return instance.ParseObject(); + } + } + + public void Dispose() + { + json.Dispose(); + json = null; + } + + Dictionary ParseObject() + { + Dictionary table = new Dictionary(); + + // ditch opening brace + json.Read(); + + // { + while (true) + { + switch (NextToken) + { + case TOKEN.NONE: + return null; + case TOKEN.COMMA: + continue; + case TOKEN.CURLY_CLOSE: + return table; + default: + // name + string name = ParseString(); + if (name == null) + { + return null; + } + + // : + if (NextToken != TOKEN.COLON) + { + return null; + } + // ditch the colon + json.Read(); + + // value + table[name] = ParseValue(); + break; + } + } + } + + List ParseArray() + { + List array = new List(); + + // ditch opening bracket + json.Read(); + + // [ + var parsing = true; + while (parsing) + { + TOKEN nextToken = NextToken; + + switch (nextToken) + { + case TOKEN.NONE: + return null; + case TOKEN.COMMA: + continue; + case TOKEN.SQUARED_CLOSE: + parsing = false; + break; + default: + object value = ParseByToken(nextToken); + + array.Add(value); + break; + } + } + + return array; + } + + object ParseValue() + { + TOKEN nextToken = NextToken; + return ParseByToken(nextToken); + } + + object ParseByToken(TOKEN token) + { + switch (token) + { + case TOKEN.STRING: + string str = ParseString(); + DateTime dateTime; + if (DateTime.TryParseExact(str, "yyyy-MM-dd HH:mm:ss.fff", CultureInfo.InvariantCulture, DateTimeStyles.None, out dateTime)) + { + return dateTime; + } + return str; + case TOKEN.NUMBER: + return ParseNumber(); + case TOKEN.CURLY_OPEN: + return ParseObject(); + case TOKEN.SQUARED_OPEN: + return ParseArray(); + case TOKEN.TRUE: + return true; + case TOKEN.FALSE: + return false; + case TOKEN.NULL: + return null; + default: + return null; + } + } + + string ParseString() + { + StringBuilder s = new StringBuilder(); + char c; + + // ditch opening quote + json.Read(); + + bool parsing = true; + while (parsing) + { + + if (json.Peek() == -1) + { + parsing = false; + break; + } + + c = NextChar; + switch (c) + { + case '"': + parsing = false; + break; + case '\\': + if (json.Peek() == -1) + { + parsing = false; + break; + } + + c = NextChar; + switch (c) + { + case '"': + case '\\': + case '/': + s.Append(c); + break; + case 'b': + s.Append('\b'); + break; + case 'f': + s.Append('\f'); + break; + case 'n': + s.Append('\n'); + break; + case 'r': + s.Append('\r'); + break; + case 't': + s.Append('\t'); + break; + case 'u': + var hex = new char[4]; + + for (int i = 0; i < 4; i++) + { + hex[i] = NextChar; + } + + s.Append((char)Convert.ToInt32(new string(hex), 16)); + break; + } + break; + default: + s.Append(c); + break; + } + } + + return s.ToString(); + } + + object ParseNumber() + { + string number = NextWord; + + if (number.IndexOf('.') == -1 && number.IndexOf('E') == -1 && number.IndexOf('e') == -1) + { + long parsedInt; + Int64.TryParse(number, System.Globalization.NumberStyles.Any, System.Globalization.CultureInfo.InvariantCulture, out parsedInt); + return parsedInt; + } + + double parsedDouble; + if (!Double.TryParse(number, System.Globalization.NumberStyles.Any, System.Globalization.CultureInfo.InvariantCulture, out parsedDouble)) + { + Double.TryParse(number, System.Globalization.NumberStyles.Any, System.Globalization.CultureInfo.CreateSpecificCulture("es-ES"), out parsedDouble); + } + return parsedDouble; + } + + void EatWhitespace() + { + while (Char.IsWhiteSpace(PeekChar)) + { + json.Read(); + + if (json.Peek() == -1) + { + break; + } + } + } + + char PeekChar + { + get + { + return Convert.ToChar(json.Peek()); + } + } + + char NextChar + { + get + { + return Convert.ToChar(json.Read()); + } + } + + string NextWord + { + get + { + StringBuilder word = new StringBuilder(); + + while (!IsWordBreak(PeekChar)) + { + word.Append(NextChar); + + if (json.Peek() == -1) + { + break; + } + } + + return word.ToString(); + } + } + + TOKEN NextToken + { + get + { + EatWhitespace(); + + if (json.Peek() == -1) + { + return TOKEN.NONE; + } + + switch (PeekChar) + { + case '{': + return TOKEN.CURLY_OPEN; + case '}': + json.Read(); + return TOKEN.CURLY_CLOSE; + case '[': + return TOKEN.SQUARED_OPEN; + case ']': + json.Read(); + return TOKEN.SQUARED_CLOSE; + case ',': + json.Read(); + return TOKEN.COMMA; + case '"': + return TOKEN.STRING; + case ':': + return TOKEN.COLON; + case '0': + case '1': + case '2': + case '3': + case '4': + case '5': + case '6': + case '7': + case '8': + case '9': + case '-': + return TOKEN.NUMBER; + } + + switch (NextWord) + { + case "false": + return TOKEN.FALSE; + case "true": + return TOKEN.TRUE; + case "null": + return TOKEN.NULL; + } + + return TOKEN.NONE; + } + } + } + + /// + /// Converts a IDictionary / IList object or a simple type (string, int, etc.) into a JSON string + /// + /// A Dictionary / List + /// A JSON encoded string, or null if object 'json' is not serializable + public static string Serialize(object obj, Func func = null) + { + return Serializer.Serialize(obj, func); + } + + sealed class Serializer + { + StringBuilder builder; + Func func; + + Serializer() + { + builder = new StringBuilder(); + } + + public static string Serialize(object obj, Func func) + { + var instance = new Serializer(); + instance.func = func; + + instance.SerializeValue(obj); + + return instance.builder.ToString(); + } + + void SerializeValue(object value) + { + IList asList; + IDictionary asDict; + string asStr; + + if (value == null) + { + builder.Append("null"); + } + else if ((asStr = value as string) != null) + { + SerializeString(asStr); + } + else if (value is bool) + { + builder.Append((bool)value ? "true" : "false"); + } + else if ((asList = value as IList) != null) + { + SerializeArray(asList); + } + else if ((asDict = value as IDictionary) != null) + { + SerializeObject(asDict); + } + else if (value is char) + { + SerializeString(new string((char)value, 1)); + } + else + { + SerializeOther(value); + } + } + + void SerializeObject(IDictionary obj) + { + bool first = true; + + builder.Append('{'); + + foreach (object e in obj.Keys) + { + if (!first) + { + builder.Append(','); + } + + SerializeString(e.ToString()); + builder.Append(':'); + + SerializeValue(obj[e]); + + first = false; + } + + builder.Append('}'); + } + + void SerializeArray(IList anArray) + { + builder.Append('['); + + bool first = true; + + foreach (object obj in anArray) + { + if (!first) + { + builder.Append(','); + } + + SerializeValue(obj); + + first = false; + } + + builder.Append(']'); + } + + void SerializeString(string str) + { + builder.Append('\"'); + + char[] charArray = str.ToCharArray(); + foreach (var c in charArray) + { + switch (c) + { + case '"': + builder.Append("\\\""); + break; + case '\\': + builder.Append("\\\\"); + break; + case '\b': + builder.Append("\\b"); + break; + case '\f': + builder.Append("\\f"); + break; + case '\n': + builder.Append("\\n"); + break; + case '\r': + builder.Append("\\r"); + break; + case '\t': + builder.Append("\\t"); + break; + default: + int codepoint = Convert.ToInt32(c); + if ((codepoint >= 32) && (codepoint <= 126)) + { + builder.Append(c); + } + else + { + builder.Append("\\u"); + builder.Append(codepoint.ToString("x4")); + } + break; + } + } + + builder.Append('\"'); + } + + void SerializeOther(object value) + { + // NOTE: decimals lose precision during serialization. + // They always have, I'm just letting you know. + // Previously floats and doubles lost precision too. + if (value is float) + { + builder.Append(((float)value).ToString("R", System.Globalization.CultureInfo.InvariantCulture)); + } + else if (value is int + || value is uint + || value is long + || value is sbyte + || value is byte + || value is short + || value is ushort + || value is ulong) + { + builder.Append(value); + } + else if (value is double) + { + builder.Append(Convert.ToDouble(value).ToString("R", System.Globalization.CultureInfo.InvariantCulture)); + } + else if (value is decimal) { + builder.Append(Convert.ToDecimal(value).ToString("R", System.Globalization.CultureInfo.InvariantCulture)); + } + else if (value is DateTime) + { + builder.Append('\"'); + DateTime dateTime = (DateTime)value; + if (null != func) + { + builder.Append(func((DateTime)value)); + } + else + { + builder.Append(dateTime.ToString("yyyy-MM-dd HH:mm:ss.fff", System.Globalization.CultureInfo.InvariantCulture)); + } + builder.Append('\"'); + } + else + { + SerializeString(value.ToString()); + } + } + } + } +} diff --git a/Assets/HCMiniSdk/Third/ta/ThinkingAnalytics/Utils/TDMiniJson.cs.meta b/Assets/HCMiniSdk/Third/ta/ThinkingAnalytics/Utils/TDMiniJson.cs.meta new file mode 100644 index 00000000..90e907a6 --- /dev/null +++ b/Assets/HCMiniSdk/Third/ta/ThinkingAnalytics/Utils/TDMiniJson.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: 03cd5f56606ff4dd694406f5594f0cf2 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/HCMiniSdk/Third/ta/ThinkingAnalytics/Utils/TDPropertiesChecker.cs b/Assets/HCMiniSdk/Third/ta/ThinkingAnalytics/Utils/TDPropertiesChecker.cs new file mode 100644 index 00000000..44e7fb00 --- /dev/null +++ b/Assets/HCMiniSdk/Third/ta/ThinkingAnalytics/Utils/TDPropertiesChecker.cs @@ -0,0 +1,186 @@ +using System; +using System.Collections.Generic; +using System.Text.RegularExpressions; + +namespace ThinkingData.Analytics.Utils +{ + public class TDPropertiesChecker + { + private static readonly Regex keyPattern = new Regex(@"^[a-zA-Z][a-zA-Z\d_#]{0,49}$"); + private static readonly List propertyNameWhitelist = new List() { "#scene_name", "#scene_path", "#app_crashed_reason" }; + + public static bool IsNumeric(object obj) + { + return obj is sbyte + || obj is byte + || obj is short + || obj is ushort + || obj is int + || obj is uint + || obj is long + || obj is ulong + || obj is double + || obj is decimal + || obj is float; + } + public static bool IsString(object obj) + { + if (obj == null) + return false; + return obj is string; + } + public static bool IsDictionary(object obj) + { + if (obj == null) + return false; + return (obj.GetType().IsGenericType && obj.GetType().GetGenericTypeDefinition() == typeof(Dictionary<,>)); + } + public static bool IsList(object obj) + { + if (obj == null) + return false; + return (obj.GetType().IsGenericType && obj.GetType().GetGenericTypeDefinition() == typeof(List<>)) || obj is Array; + } + public static bool CheckProperties(Dictionary properties) + { + if (properties == null) + { + return true; + } + bool ret = true; + foreach(KeyValuePair kv in properties) + { + if (!CheckString(kv.Key)) + { + ret = false; + } + if (!(kv.Value is string || kv.Value is DateTime || kv.Value is bool || IsNumeric(kv.Value) || IsList(kv.Value) || IsDictionary(kv.Value))) + { + if(TDLog.GetEnable()) TDLog.w("Incorrect property - property values must be one of: String, Numberic, Boolean, DateTime, Array, Row"); + ret = false; + } + if (IsString(kv.Value) && !CheckProperties(kv.Value as string)) + { + ret = false; + } + if (IsNumeric(kv.Value)) { + double number = Convert.ToDouble(kv.Value); + if (!CheckProperties(number)) + { + ret = false; + } + } + if (IsList(kv.Value) && !CheckProperties(kv.Value as List)) { + ret = false; + } + if (IsDictionary(kv.Value) && !CheckProperties(kv.Value as Dictionary)) + { + ret = false; + } + } + return ret; + } + public static bool CheckProperties(List properties) + { + if (properties == null) + { + return true; + } + bool ret = true; + foreach (object value in properties) + { + if (!(value is string || value is DateTime || value is bool || IsNumeric(value) || IsDictionary(value))) + { + if(TDLog.GetEnable()) TDLog.w("Incorrect property - property values in list must be one of: String, Numberic, Boolean, DateTime, Row"); + ret = false; + } + if (IsString(value) && !CheckProperties(value as string)) + { + ret = false; + } + if (IsNumeric(value)) { + double number = Convert.ToDouble(value); + if (!CheckProperties(number)) + { + ret = false; + } + } + if (IsDictionary(value) && !CheckProperties(value as Dictionary)) + { + ret = false; + } + } + return ret; + } + public static bool CheckProperties(List properties) + { + if (properties == null) + { + return true; + } + + bool ret = true; + foreach(string value in properties) + { + if (!CheckProperties(value)) + { + ret = false; + } + } + return ret; + } + public static bool CheckProperties(string properties) + { + if (properties is string && System.Text.Encoding.UTF8.GetBytes(Convert.ToString(properties)).Length > 2048) { + if(TDLog.GetEnable()) TDLog.w("Incorrect properties - the string is too long: " + (string)(object)properties); + return false; + } + return true; + } + public static bool CheckProperties(double properties) + { + if (properties > 9999999999999.999 || properties < -9999999999999.999) + { + if(TDLog.GetEnable()) TDLog.w("Incorrect properties - number value is invalid: " + properties + ", the data range is -9E15 to 9E15, with a maximum of 3 decimal places"); + return false; + } + return true; + } + public static bool CheckString(string eventName) + { + if (string.IsNullOrEmpty(eventName)) + { + if(TDLog.GetEnable()) TDLog.w("Incorrect event name - the string is null"); + return false; + } + if (keyPattern.IsMatch(eventName)) + { + return true; + } + else + { + if (propertyNameWhitelist.Contains(eventName)) + { + return true; + } + if(TDLog.GetEnable()) TDLog.w("Incorrect event name - the string is invalid for TDAnalytics: " + eventName + ", event name and properties name rules: must be character string type, starting with a character and containing figures, characters, and an underline \"_\", with a maximum length of 50 characters"); + return false; + } + } + public static void MergeProperties(Dictionary source, Dictionary dest) + { + if (null == source) return; + foreach (KeyValuePair kv in source) + { + if (dest.ContainsKey(kv.Key)) + { + dest[kv.Key] = kv.Value; + } else + { + dest.Add(kv.Key, kv.Value); + } + } + } + } +} + diff --git a/Assets/HCMiniSdk/Third/ta/ThinkingAnalytics/Utils/TDPropertiesChecker.cs.meta b/Assets/HCMiniSdk/Third/ta/ThinkingAnalytics/Utils/TDPropertiesChecker.cs.meta new file mode 100644 index 00000000..0d18ac9d --- /dev/null +++ b/Assets/HCMiniSdk/Third/ta/ThinkingAnalytics/Utils/TDPropertiesChecker.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: d887a818e74eb4316a839030f930036b +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/HCMiniSdk/Third/ta/ThinkingAnalytics/Utils/TDPublicConfig.cs b/Assets/HCMiniSdk/Third/ta/ThinkingAnalytics/Utils/TDPublicConfig.cs new file mode 100644 index 00000000..b37f5f54 --- /dev/null +++ b/Assets/HCMiniSdk/Third/ta/ThinkingAnalytics/Utils/TDPublicConfig.cs @@ -0,0 +1,74 @@ +using UnityEngine; +using System; +using System.Xml; +using System.Collections.Generic; + +namespace ThinkingData.Analytics.Utils +{ + // Crosss Platform + public enum TDThirdPartyType + { + NONE = 0, + APPSFLYER = 1 << 0, // AppsFlyer + IRONSOURCE = 1 << 1, // IronSource + ADJUST = 1 << 2, // Adjust + BRANCH = 1 << 3, // Branch + TOPON = 1 << 4, // TopOn + TRACKING = 1 << 5, // ReYun + TRADPLUS = 1 << 6, // TradPlus + }; + + // SSL + public enum TDSSLPinningMode + { + NONE = 0, // Only allow certificates trusted by the system + PUBLIC_KEY = 1 << 0, // Verify public key + CERTIFICATE = 1 << 1 // Verify all contents + } + + public class TDPublicConfig + { + public static bool DisableCSharpException = false; + public static List DisPresetProperties = new List(); + + public static readonly string LIB_VERSION = "3.0.3"; + + public static void GetPublicConfig() + { + TextAsset textAsset = Resources.Load("ta_public_config"); + if (textAsset != null && !string.IsNullOrEmpty(textAsset.text)) + { + XmlDocument xmlDoc = new XmlDocument(); + xmlDoc.LoadXml(textAsset.text); + XmlNode root = xmlDoc.SelectSingleNode("resources"); + for (int i=0; i light_instances = null; + private static TimeZoneInfo defaultTimeZone = null; + + /// + /// Convert Dictionary object to JSONObject in Java. + /// + /// The JSONObject instance. + /// The Dictionary containing some data + private static AndroidJavaObject getJSONObject(Dictionary data) + { + if (data == null) + { + return null; + } + + string dataString = serilize(data); + + try + { + return new AndroidJavaObject(JSON_CLASS, dataString); + } + catch (Exception e) + { + if(TDLog.GetEnable()) TDLog.w("ThinkingAnalytics: unexpected exception: " + e); + } + return null; + } + + private static string getTimeString(DateTime dateTime) { + //long dateTimeTicksUTC = TimeZoneInfo.ConvertTimeToUtc(dateTime).Ticks; + + //DateTime dtFrom = new DateTime(1970, 1, 1, 0, 0, 0, 0, DateTimeKind.Utc); + //long currentMillis = (dateTimeTicksUTC - dtFrom.Ticks) / 10000; + + //AndroidJavaObject date = new AndroidJavaObject("java.util.Date", currentMillis); + + //return getInstance(default_appId).Call("getTimeString", date); + return TDCommonUtils.FormatDate(dateTime, defaultTimeZone); + } + + private static AndroidJavaObject getInstance(string appId) { + AndroidJavaObject context = new AndroidJavaClass("com.unity3d.player.UnityPlayer").GetStatic("currentActivity"); + AndroidJavaObject currentInstance; + + if (string.IsNullOrEmpty(appId)) + { + appId = default_appId; + } + + if (light_instances != null && light_instances.ContainsKey(appId)) + { + currentInstance = light_instances[appId]; + } + else + { + currentInstance = sdkClass.CallStatic("sharedInstance", context, appId); + } + + if (currentInstance == null) + { + currentInstance = sdkClass.CallStatic("sharedInstance", context, default_appId); + } + + return currentInstance; + } + + + private static void enableLog(bool enable) { + sdkClass.CallStatic("enableTrackLog", enable); + } + private static void setVersionInfo(string libName, string version) { + sdkClass.CallStatic("setCustomerLibInfo", libName, version); + } + + private static void init(TDConfig token) + { + AndroidJavaObject context = new AndroidJavaClass("com.unity3d.player.UnityPlayer").GetStatic("currentActivity"); + // AndroidJavaObject config = null; + // if (!string.IsNullOrEmpty(token.GetInstanceName())) + // { + // config = configClass.CallStatic("getInstance", context, token.appid, token.serverUrl, token.GetInstanceName()); + // if (string.IsNullOrEmpty(default_appId)) default_appId = token.GetInstanceName(); + // } + // else + // { + // config = configClass.CallStatic("getInstance", context, token.appid, token.serverUrl); + // if (string.IsNullOrEmpty(default_appId)) default_appId = token.appid; + // } + // config.Call("setModeInt", (int) token.mode); + + // string timeZoneId = token.getTimeZoneId(); + // if (null != timeZoneId && timeZoneId.Length > 0) + // { + // AndroidJavaObject timeZone = new AndroidJavaClass("java.util.TimeZone").CallStatic("getTimeZone", timeZoneId); + // if (null != timeZone) + // { + // config.Call("setDefaultTimeZone", timeZone); + // } + // } + + // if (token.enableEncrypt == true) + // { + // config.Call("enableEncrypt", true); + // AndroidJavaObject secreteKey = new AndroidJavaObject("cn.thinkingdata.android.encrypt.TDSecreteKey", token.encryptPublicKey, token.encryptVersion, "AES", "RSA"); + // config.Call("setSecretKey", secreteKey); + // } + + // sdkClass.CallStatic("sharedInstance", config); + + if (string.IsNullOrEmpty(default_appId)) default_appId = token.appId; + Dictionary configDic = new Dictionary(); + configDic["appId"] = token.appId; + configDic["serverUrl"] = token.serverUrl; + configDic["mode"] = (int) token.mode; + if (!string.IsNullOrEmpty(token.name)) + { + // if (string.IsNullOrEmpty(default_appId)) default_appId = token.GetInstanceName(); + configDic["instanceName"] = token.name; + } + else + { + // if (string.IsNullOrEmpty(default_appId)) default_appId = token.appid; + } + string timeZoneId = token.getTimeZoneId(); + if (null != timeZoneId && timeZoneId.Length > 0) + { + configDic["timeZone"] = timeZoneId; + if (defaultTimeZone == null) + { + defaultTimeZone = TimeZoneInfo.FindSystemTimeZoneById(timeZoneId); + } + } + else { + if (defaultTimeZone == null) { + defaultTimeZone = TimeZoneInfo.Local; + } + } + if (token.enableEncrypt == true) + { + configDic["enableEncrypt"] = true; + configDic["secretKey"] = new Dictionary() { + {"publicKey", token.encryptPublicKey}, + {"version", token.encryptVersion}, + {"symmetricEncryption", "AES"}, + {"asymmetricEncryption", "RSA"}, + }; + } + unityAPIInstance.Call("sharedInstance", context, TDMiniJson.Serialize(configDic)); + } + + private static void flush(string appId) + { + getInstance(appId).Call("flush"); + } + + private static AndroidJavaObject getDate(DateTime dateTime) + { + long dateTimeTicksUTC = TimeZoneInfo.ConvertTimeToUtc(dateTime).Ticks; + + DateTime dtFrom = new DateTime(1970, 1, 1, 0, 0, 0, 0, DateTimeKind.Utc); + long currentMillis = (dateTimeTicksUTC - dtFrom.Ticks) / 10000; + return new AndroidJavaObject("java.util.Date", currentMillis); + } + + private static void track(string eventName, Dictionary properties, DateTime dateTime, string appId) + { + AndroidJavaObject date = getDate(dateTime); + AndroidJavaClass tzClass = new AndroidJavaClass("java.util.TimeZone"); + AndroidJavaObject tz = null; + getInstance(appId).Call("track", eventName, getJSONObject(properties), date, tz); + } + + private static void track(string eventName, Dictionary properties, DateTime dateTime, TimeZoneInfo timeZone, string appId) + { + AndroidJavaObject date = getDate(dateTime); + AndroidJavaObject tz = null; + if (null != timeZone && null != timeZone.Id && timeZone.Id.Length > 0) + { + if ("Local" == timeZone.Id) { + tz = new AndroidJavaClass("java.util.TimeZone").CallStatic("getDefault"); + } + else { + tz = new AndroidJavaClass("java.util.TimeZone").CallStatic("getTimeZone", timeZone.Id); + } + } + getInstance(appId).Call("track", eventName, getJSONObject(properties), date, tz); + } + + private static void trackForAll(string eventName, Dictionary properties) + { + string appId = ""; + track(eventName, properties, appId); + } + + private static void track(TDEventModel taEvent, string appId) + { + AndroidJavaObject javaEvent = null; + switch(taEvent.EventType) + { + case TDEventModel.TDEventType.First: + javaEvent = new AndroidJavaObject("cn.thinkingdata.analytics.TDFirstEvent", + taEvent.EventName, getJSONObject(getFinalEventProperties(taEvent.Properties))); + + string extraId = taEvent.GetEventId(); + if (!string.IsNullOrEmpty(extraId)) + { + javaEvent.Call("setFirstCheckId", extraId); + } + + break; + case TDEventModel.TDEventType.Updatable: + javaEvent = new AndroidJavaObject("cn.thinkingdata.analytics.TDUpdatableEvent", + taEvent.EventName, getJSONObject(getFinalEventProperties(taEvent.Properties)), taEvent.GetEventId()); + break; + case TDEventModel.TDEventType.Overwritable: + javaEvent = new AndroidJavaObject("cn.thinkingdata.analytics.TDOverWritableEvent", + taEvent.EventName, getJSONObject(getFinalEventProperties(taEvent.Properties)), taEvent.GetEventId()); + break; + } + if (null == javaEvent) { + if(TDLog.GetEnable()) TDLog.w("Unexpected java event object. Returning..."); + return; + } + + if (taEvent.GetEventTime() != null && taEvent.GetEventTime() != DateTime.MinValue) { + AndroidJavaObject date = getDate(taEvent.GetEventTime()); + AndroidJavaClass tzClass = new AndroidJavaClass("java.util.TimeZone"); + AndroidJavaObject tz = null; + if (taEvent.GetEventTimeZone() != null) { + if ("Local" == taEvent.GetEventTimeZone().Id) { + tz = new AndroidJavaClass("java.util.TimeZone").CallStatic("getDefault"); + } + else { + tz = new AndroidJavaClass("java.util.TimeZone").CallStatic("getTimeZone", taEvent.GetEventTimeZone().Id); + } + javaEvent.Call("setEventTime", date, tz); + } + else + { + javaEvent.Call("setEventTime", date); + } + + } + + getInstance(appId).Call("track", javaEvent); + } + + private static void track(string eventName, Dictionary properties, string appId) + { + getInstance(appId).Call("track", eventName, getJSONObject(properties)); + } + + private static void setSuperProperties(Dictionary superProperties, string appId) + { + getInstance(appId).Call("setSuperProperties", getJSONObject(superProperties)); + } + + private static void unsetSuperProperty(string superPropertyName, string appId) + { + getInstance(appId).Call("unsetSuperProperty", superPropertyName); + } + + private static void clearSuperProperty(string appId) + { + getInstance(appId).Call("clearSuperProperties"); + } + + private static Dictionary getSuperProperties(string appId) + { + Dictionary result = null; + AndroidJavaObject superPropertyObject = getInstance(appId).Call("getSuperProperties"); + if (null != superPropertyObject) + { + string superPropertiesString = superPropertyObject.Call("toString"); + result = TDMiniJson.Deserialize(superPropertiesString); + } + return result; + } + + private static Dictionary getPresetProperties(string appId) + { + Dictionary result = null; + AndroidJavaObject presetPropertyObject = getInstance(appId).Call("getPresetProperties").Call("toEventPresetProperties"); + if (null != presetPropertyObject) + { + string presetPropertiesString = presetPropertyObject.Call("toString"); + result = TDMiniJson.Deserialize(presetPropertiesString); + } + return result; + } + + private static void timeEvent(string eventName, string appId) + { + getInstance(appId).Call("timeEvent", eventName); + } + + private static void timeEventForAll(string eventName) + { + getInstance("").Call("timeEvent", eventName); + } + + private static void identify(string uniqueId, string appId) + { + getInstance(appId).Call("identify", uniqueId); + } + + private static string getDistinctId(string appId) + { + return getInstance(appId).Call("getDistinctId"); + } + + private static void login(string uniqueId, string appId) + { + getInstance(appId).Call("login", uniqueId); + } + + private static void userSetOnce(Dictionary properties, string appId) + { + getInstance(appId).Call("user_setOnce", getJSONObject(properties)); + } + + private static void userSetOnce(Dictionary properties, DateTime dateTime, string appId) + { + getInstance(appId).Call("user_setOnce", getJSONObject(properties), getDate(dateTime)); + } + + private static void userSet(Dictionary properties, string appId) + { + getInstance(appId).Call("user_set", getJSONObject(properties)); + } + + private static void userSet(Dictionary properties, DateTime dateTime, string appId) + { + getInstance(appId).Call("user_set", getJSONObject(properties), getDate(dateTime)); + } + + private static void userUnset(List properties, string appId) + { + userUnset(properties, DateTime.Now, appId); + } + + private static void userUnset(List properties, DateTime dateTime, string appId) + { + Dictionary finalProperties = new Dictionary(); + foreach(string s in properties) + { + finalProperties.Add(s, 0); + } + + getInstance(appId).Call("user_unset", getJSONObject(finalProperties), getDate(dateTime)); + } + + private static void userAdd(Dictionary properties, string appId) + { + getInstance(appId).Call("user_add", getJSONObject(properties)); + } + + private static void userAdd(Dictionary properties, DateTime dateTime, string appId) + { + getInstance(appId).Call("user_add", getJSONObject(properties), getDate(dateTime)); + } + + private static void userAppend(Dictionary properties, string appId) + { + getInstance(appId).Call("user_append", getJSONObject(properties)); + } + + private static void userAppend(Dictionary properties, DateTime dateTime, string appId) + { + getInstance(appId).Call("user_append", getJSONObject(properties), getDate(dateTime)); + } + + private static void userUniqAppend(Dictionary properties, string appId) + { + getInstance(appId).Call("user_uniqAppend", getJSONObject(properties)); + } + + private static void userUniqAppend(Dictionary properties, DateTime dateTime, string appId) + { + getInstance(appId).Call("user_uniqAppend", getJSONObject(properties), getDate(dateTime)); + } + + private static void userDelete(string appId) + { + getInstance(appId).Call("user_delete"); + } + + private static void userDelete(DateTime dateTime, string appId) + { + getInstance(appId).Call("user_delete", getDate(dateTime)); + } + + private static void logout(string appId) + { + getInstance(appId).Call("logout"); + } + + private static string getDeviceId() + { + return getInstance(default_appId).Call("getDeviceId"); + } + + private static void setDynamicSuperProperties(TDDynamicSuperPropertiesHandler dynamicSuperProperties, string appId) + { + DynamicListenerAdapter listenerAdapter = new DynamicListenerAdapter(); + if (string.IsNullOrEmpty(appId)) + { + appId = default_appId; + } + unityAPIInstance.Call("setDynamicSuperPropertiesTrackerListener", appId, listenerAdapter); + } + + private static void setNetworkType(TDNetworkType networkType) { + Dictionary properties = new Dictionary() { }; + switch (networkType) + { + case TDNetworkType.Wifi: + properties["network_type"] = 1; + break; + case TDNetworkType.All: + properties["network_type"] = 2; + break; + default: + properties["network_type"] = 2; + break; + + } + unityAPIInstance.Call("setNetworkType", TDMiniJson.Serialize(properties)); + } + + private static void enableAutoTrack(TDAutoTrackEventType events, Dictionary properties, string appId) + { + if (string.IsNullOrEmpty(appId)) + { + appId = default_appId; + } + Dictionary propertiesNew = new Dictionary() { + { "appId", appId}, + { "autoTrackType", (int)events} + }; + unityAPIInstance.Call("enableAutoTrack", TDMiniJson.Serialize(propertiesNew)); + propertiesNew["properties"] = properties; + unityAPIInstance.Call("setAutoTrackProperties", TDMiniJson.Serialize(propertiesNew)); + } + + private static void enableAutoTrack(TDAutoTrackEventType events, TDAutoTrackEventHandler eventCallback, string appId) + { + AutoTrackListenerAdapter listenerAdapter = new AutoTrackListenerAdapter(); + if (string.IsNullOrEmpty(appId)) + { + appId = default_appId; + } + Dictionary properties = new Dictionary() { + { "appId", appId}, + { "autoTrackType", (int)events} + }; + unityAPIInstance.Call("enableAutoTrack", TDMiniJson.Serialize(properties), listenerAdapter); + } + + private static void setAutoTrackProperties(TDAutoTrackEventType events, Dictionary properties, string appId) + { + if (string.IsNullOrEmpty(appId)) + { + appId = default_appId; + } + Dictionary propertiesNew = new Dictionary() { + { "appId", appId}, + { "autoTrackType", (int)events} + }; + propertiesNew["properties"] = properties; + unityAPIInstance.Call("setAutoTrackProperties", TDMiniJson.Serialize(propertiesNew)); + } + + private static void setTrackStatus(TDTrackStatus status, string appId) + { + AndroidJavaClass javaClass = new AndroidJavaClass("cn.thinkingdata.analytics.ThinkingAnalyticsSDK$TATrackStatus"); + AndroidJavaObject trackStatus; + switch (status) + { + case TDTrackStatus.Pause: + trackStatus = javaClass.GetStatic("PAUSE"); + break; + case TDTrackStatus.Stop: + trackStatus = javaClass.GetStatic("STOP"); + break; + case TDTrackStatus.SaveOnly: + trackStatus = javaClass.GetStatic("SAVE_ONLY"); + break; + case TDTrackStatus.Normal: + default: + trackStatus = javaClass.GetStatic("NORMAL"); + break; + } + getInstance(appId).Call("setTrackStatus", trackStatus); + } + + private static void optOutTracking(string appId) + { + getInstance(appId).Call("optOutTracking"); + } + + private static void optOutTrackingAndDeleteUser(string appId) + { + getInstance(appId).Call("optOutTrackingAndDeleteUser"); + } + + private static void optInTracking(string appId) + { + getInstance(appId).Call("optInTracking"); + } + + private static void enableTracking(bool enabled, string appId) + { + getInstance(appId).Call("enableTracking", enabled); + } + + private static string createLightInstance() + { + string randomID = System.Guid.NewGuid().ToString("N"); + AndroidJavaObject lightInstance = getInstance(default_appId).Call("createLightInstance"); + if (light_instances == null) { + light_instances = new Dictionary(); + } + light_instances.Add(randomID, lightInstance); + return randomID; + } + + private static void calibrateTime(long timestamp) + { + sdkClass.CallStatic("calibrateTime", timestamp); + } + + private static void calibrateTimeWithNtp(string ntpServer) + { + unityAPIInstance.Call("calibrateTimeWithNtp", ntpServer); + } + + private static void enableThirdPartySharing(TDThirdPartyType shareType, Dictionary properties, string appId) + { + Dictionary obj = new Dictionary() { + { "appId", appId }, + { "type", (int)shareType } + }; + obj["properties"] = properties; + unityAPIInstance.Call("enableThirdPartySharing", TDMiniJson.Serialize(obj)); + } + + //dynamic super properties + public interface IDynamicSuperPropertiesTrackerListener + { + string getDynamicSuperPropertiesString(); + } + + private class DynamicListenerAdapter : AndroidJavaProxy { + public DynamicListenerAdapter() : base("cn.thinkingdata.engine.ThinkingAnalyticsUnityAPI$DynamicSuperPropertiesTrackerListener") {} + public string getDynamicSuperPropertiesString() + { + Dictionary ret; + if (TDWrapper.mDynamicSuperProperties != null) { + ret = TDWrapper.mDynamicSuperProperties.GetDynamicSuperProperties(); + } + else { + ret = new Dictionary(); + } + //return TDMiniJson.Serialize(ret); + return serilize(ret); + } + } + + //auto-tracking + public interface IAutoTrackEventTrackerListener + { + string eventCallback(int type, string appId, string properties); + } + + private class AutoTrackListenerAdapter : AndroidJavaProxy { + public AutoTrackListenerAdapter() : base("cn.thinkingdata.engine.ThinkingAnalyticsUnityAPI$AutoTrackEventTrackerListener") {} + string eventCallback(int type, string appId, string properties) + { + Dictionary ret; + if (string.IsNullOrEmpty(appId)) appId = default_appId; + if (TDWrapper.mAutoTrackEventCallbacks.ContainsKey(appId)) + { + Dictionary propertiesDic = TDMiniJson.Deserialize(properties); + ret = TDWrapper.mAutoTrackEventCallbacks[appId].GetAutoTrackEventProperties(type, propertiesDic); + } + else { + ret = new Dictionary(); + } + return serilize(ret); + } + } + } +} +#endif \ No newline at end of file diff --git a/Assets/HCMiniSdk/Third/ta/ThinkingAnalytics/Wrapper/TDAndroidWrapper.cs.meta b/Assets/HCMiniSdk/Third/ta/ThinkingAnalytics/Wrapper/TDAndroidWrapper.cs.meta new file mode 100644 index 00000000..2c9773a5 --- /dev/null +++ b/Assets/HCMiniSdk/Third/ta/ThinkingAnalytics/Wrapper/TDAndroidWrapper.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: 03113e111863a4fd68539598dc2dbb97 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/HCMiniSdk/Third/ta/ThinkingAnalytics/Wrapper/TDPCWrapper.cs b/Assets/HCMiniSdk/Third/ta/ThinkingAnalytics/Wrapper/TDPCWrapper.cs new file mode 100644 index 00000000..3c2e10d0 --- /dev/null +++ b/Assets/HCMiniSdk/Third/ta/ThinkingAnalytics/Wrapper/TDPCWrapper.cs @@ -0,0 +1,415 @@ +#if ((!(UNITY_IOS) || UNITY_EDITOR) && (!(UNITY_ANDROID) || UNITY_EDITOR)) || TE_DISABLE_ANDROID_JAVA || TE_DISABLE_IOS_OC +using System; +using System.Collections.Generic; +using ThinkingData.Analytics.Utils; +using ThinkingSDK.PC.Main; +using ThinkingSDK.PC.Utils; +using ThinkingSDK.PC.DataModel; +using ThinkingSDK.PC.Config; + +namespace ThinkingData.Analytics.Wrapper +{ + public partial class TDWrapper : TDDynamicSuperPropertiesHandler_PC, TDAutoTrackEventHandler_PC + { + static TDAutoTrackEventHandler mEventCallback; + public Dictionary GetDynamicSuperProperties_PC() + { + if (mDynamicSuperProperties != null) + { + return mDynamicSuperProperties.GetDynamicSuperProperties(); + } + else + { + return new Dictionary(); + } + } + + public Dictionary AutoTrackEventCallback_PC(int type, Dictionary properties) + { + if (mEventCallback != null) + { + return mEventCallback.GetAutoTrackEventProperties(type, properties); + } + else + { + return new Dictionary(); + } + } + + private static void init(TDConfig token) + { + ThinkingSDKConfig config = ThinkingSDKConfig.GetInstance(token.appId, token.serverUrl, token.name); + if (!string.IsNullOrEmpty(token.getTimeZoneId())) + { + try + { + config.SetTimeZone(TimeZoneInfo.FindSystemTimeZoneById(token.getTimeZoneId())); + } + catch (Exception) + { + //if (ThinkingSDKPublicConfig.IsPrintLog()) ThinkingSDKLogger.Print("TimeZoneInfo set failed : " + e.Message); + } + } + if (token.mode == TDMode.Debug) + { + config.SetMode(Mode.DEBUG); + } + else if (token.mode == TDMode.DebugOnly) + { + config.SetMode(Mode.DEBUG_ONLY); + } + ThinkingPCSDK.Init(token.appId, token.serverUrl, token.name, config, sMono); + } + + private static void identify(string uniqueId, string appId) + { + ThinkingPCSDK.Identifiy(uniqueId, appId); + } + + private static string getDistinctId(string appId) + { + return ThinkingPCSDK.DistinctId(appId); + } + + private static void login(string accountId, string appId) + { + ThinkingPCSDK.Login(accountId, appId); + } + + private static void logout(string appId) + { + ThinkingPCSDK.Logout(appId); + } + + private static void flush(string appId) + { + ThinkingPCSDK.Flush(appId); + } + + private static void setVersionInfo(string lib_name, string lib_version) + { + ThinkingPCSDK.SetLibName(lib_name); + ThinkingPCSDK.SetLibVersion(lib_version); + } + + private static void track(TDEventModel taEvent, string appId) + { + ThinkingSDKEventData eventData = null; + switch (taEvent.EventType) + { + case TDEventModel.TDEventType.First: + { + eventData = new ThinkingSDKFirstEvent(taEvent.EventName); + if (!string.IsNullOrEmpty(taEvent.GetEventId())) + { + ((ThinkingSDKFirstEvent)eventData).SetFirstCheckId(taEvent.GetEventId()); + } + } + break; + case TDEventModel.TDEventType.Updatable: + eventData = new ThinkingSDKUpdateEvent(taEvent.EventName, taEvent.GetEventId()); + break; + case TDEventModel.TDEventType.Overwritable: + eventData = new ThinkingSDKOverWritableEvent(taEvent.EventName, taEvent.GetEventId()); + break; + } + if (mDynamicSuperProperties != null) + { + eventData.SetProperties(mDynamicSuperProperties.GetDynamicSuperProperties()); + } + if (taEvent.Properties != null) + { + eventData.SetProperties(taEvent.Properties); + } + if (taEvent.GetEventTime() != null && taEvent.GetEventTimeZone() != null) + { + eventData.SetEventTime(taEvent.GetEventTime()); + eventData.SetTimeZone(taEvent.GetEventTimeZone()); + } + ThinkingPCSDK.Track(eventData, appId); + } + + private static void track(string eventName, Dictionary properties, string appId) + { + ThinkingPCSDK.Track(eventName, properties, appId); + } + + private static void track(string eventName, Dictionary properties, DateTime dateTime, string appId) + { + ThinkingPCSDK.Track(eventName, properties, dateTime, appId); + } + + private static void track(string eventName, Dictionary properties, DateTime dateTime, TimeZoneInfo timeZone, string appId) + { + ThinkingPCSDK.Track(eventName, properties, dateTime, timeZone, appId); + } + + private static void trackForAll(string eventName, Dictionary properties) + { + ThinkingPCSDK.TrackForAll(eventName, properties); + } + + private static void setSuperProperties(Dictionary superProperties, string appId) + { + ThinkingPCSDK.SetSuperProperties(superProperties, appId); + } + + private static void unsetSuperProperty(string superPropertyName, string appId) + { + ThinkingPCSDK.UnsetSuperProperty(superPropertyName, appId); + } + + private static void clearSuperProperty(string appId) + { + ThinkingPCSDK.ClearSuperProperties(appId); + } + + private static Dictionary getSuperProperties(string appId) + { + return ThinkingPCSDK.SuperProperties(appId); + } + + private static Dictionary getPresetProperties(string appId) + { + return ThinkingPCSDK.PresetProperties(appId); + } + private static void timeEvent(string eventName, string appId) + { + ThinkingPCSDK.TimeEvent(eventName, appId); + } + private static void timeEventForAll(string eventName) + { + ThinkingPCSDK.TimeEventForAll(eventName); + } + + private static void userSet(Dictionary properties, string appId) + { + ThinkingPCSDK.UserSet(properties, appId); + } + + private static void userSet(Dictionary properties, DateTime dateTime, string appId) + { + ThinkingPCSDK.UserSet(properties, dateTime, appId); + } + + private static void userUnset(List properties, string appId) + { + ThinkingPCSDK.UserUnset(properties, appId); + } + + private static void userUnset(List properties, DateTime dateTime, string appId) + { + ThinkingPCSDK.UserUnset(properties, dateTime, appId); + } + + private static void userSetOnce(Dictionary properties, string appId) + { + ThinkingPCSDK.UserSetOnce(properties, appId); + } + + private static void userSetOnce(Dictionary properties, DateTime dateTime, string appId) + { + ThinkingPCSDK.UserSetOnce(properties, dateTime, appId); + } + + private static void userAdd(Dictionary properties, string appId) + { + ThinkingPCSDK.UserAdd(properties, appId); + } + + private static void userAdd(Dictionary properties, DateTime dateTime, string appId) + { + ThinkingPCSDK.UserAdd(properties, dateTime, appId); + } + + private static void userDelete(string appId) + { + ThinkingPCSDK.UserDelete(appId); + } + + private static void userDelete(DateTime dateTime, string appId) + { + ThinkingPCSDK.UserDelete(dateTime, appId); + } + + private static void userAppend(Dictionary properties, string appId) + { + ThinkingPCSDK.UserAppend(properties, appId); + } + + private static void userAppend(Dictionary properties, DateTime dateTime, string appId) + { + ThinkingPCSDK.UserAppend(properties, dateTime, appId); + } + + private static void userUniqAppend(Dictionary properties, string appId) + { + ThinkingPCSDK.UserUniqAppend(properties, appId); + } + + private static void userUniqAppend(Dictionary properties, DateTime dateTime, string appId) + { + ThinkingPCSDK.UserUniqAppend(properties, dateTime, appId); + } + + private static void setNetworkType(TDNetworkType networkType) + { + + } + + private static string getDeviceId() + { + return ThinkingPCSDK.GetDeviceId(); + } + + private static void setDynamicSuperProperties(TDDynamicSuperPropertiesHandler dynamicSuperProperties, string appId) + { + ThinkingPCSDK.SetDynamicSuperProperties(new TDWrapper()); + } + + private static void setTrackStatus(TDTrackStatus status, string appId) + { + ThinkingPCSDK.SetTrackStatus((ThinkingSDK.PC.Main.TDTrackStatus)status, appId); + } + + private static void optOutTracking(string appId) + { + ThinkingPCSDK.OptTracking(false, appId); + } + + private static void optOutTrackingAndDeleteUser(string appId) + { + ThinkingPCSDK.OptTrackingAndDeleteUser(appId); + } + + private static void optInTracking(string appId) + { + ThinkingPCSDK.OptTracking(true, appId); + } + + private static void enableTracking(bool enabled, string appId) + { + ThinkingPCSDK.EnableTracking(enabled); + } + + private static string createLightInstance() + { + return ThinkingPCSDK.CreateLightInstance(); + } + + private static string getTimeString(DateTime dateTime) + { + + return ThinkingPCSDK.TimeString(dateTime); + } + + private static void enableAutoTrack(TDAutoTrackEventType autoTrackEvents, Dictionary properties, string appId) + { + ThinkingSDK.PC.Main.TDAutoTrackEventType pcAutoTrackEvents = ThinkingSDK.PC.Main.TDAutoTrackEventType.None; + if ((autoTrackEvents & TDAutoTrackEventType.AppInstall) != 0) + { + pcAutoTrackEvents = pcAutoTrackEvents | ThinkingSDK.PC.Main.TDAutoTrackEventType.AppInstall; + } + if ((autoTrackEvents & TDAutoTrackEventType.AppStart) != 0) + { + pcAutoTrackEvents = pcAutoTrackEvents | ThinkingSDK.PC.Main.TDAutoTrackEventType.AppStart; + } + if ((autoTrackEvents & TDAutoTrackEventType.AppEnd) != 0) + { + pcAutoTrackEvents = pcAutoTrackEvents | ThinkingSDK.PC.Main.TDAutoTrackEventType.AppEnd; + } + if ((autoTrackEvents & TDAutoTrackEventType.AppCrash) != 0) + { + pcAutoTrackEvents = pcAutoTrackEvents | ThinkingSDK.PC.Main.TDAutoTrackEventType.AppCrash; + } + if ((autoTrackEvents & TDAutoTrackEventType.AppSceneLoad) != 0) + { + pcAutoTrackEvents = pcAutoTrackEvents | ThinkingSDK.PC.Main.TDAutoTrackEventType.AppSceneLoad; + } + if ((autoTrackEvents & TDAutoTrackEventType.AppSceneUnload) != 0) + { + pcAutoTrackEvents = pcAutoTrackEvents | ThinkingSDK.PC.Main.TDAutoTrackEventType.AppSceneUnload; + } + ThinkingPCSDK.EnableAutoTrack(pcAutoTrackEvents, properties, appId); + } + + private static void enableAutoTrack(TDAutoTrackEventType autoTrackEvents, TDAutoTrackEventHandler eventCallback, string appId) + { + ThinkingSDK.PC.Main.TDAutoTrackEventType pcAutoTrackEvents = ThinkingSDK.PC.Main.TDAutoTrackEventType.None; + if ((autoTrackEvents & TDAutoTrackEventType.AppInstall) != 0) + { + pcAutoTrackEvents = pcAutoTrackEvents | ThinkingSDK.PC.Main.TDAutoTrackEventType.AppInstall; + } + if ((autoTrackEvents & TDAutoTrackEventType.AppStart) != 0) + { + pcAutoTrackEvents = pcAutoTrackEvents | ThinkingSDK.PC.Main.TDAutoTrackEventType.AppStart; + } + if ((autoTrackEvents & TDAutoTrackEventType.AppEnd) != 0) + { + pcAutoTrackEvents = pcAutoTrackEvents | ThinkingSDK.PC.Main.TDAutoTrackEventType.AppEnd; + } + if ((autoTrackEvents & TDAutoTrackEventType.AppCrash) != 0) + { + pcAutoTrackEvents = pcAutoTrackEvents | ThinkingSDK.PC.Main.TDAutoTrackEventType.AppCrash; + } + if ((autoTrackEvents & TDAutoTrackEventType.AppSceneLoad) != 0) + { + pcAutoTrackEvents = pcAutoTrackEvents | ThinkingSDK.PC.Main.TDAutoTrackEventType.AppSceneLoad; + } + if ((autoTrackEvents & TDAutoTrackEventType.AppSceneUnload) != 0) + { + pcAutoTrackEvents = pcAutoTrackEvents | ThinkingSDK.PC.Main.TDAutoTrackEventType.AppSceneUnload; + } + mEventCallback = eventCallback; + ThinkingPCSDK.EnableAutoTrack(pcAutoTrackEvents, new TDWrapper(), appId); + } + + private static void setAutoTrackProperties(TDAutoTrackEventType autoTrackEvents, Dictionary properties, string appId) + { + if ((autoTrackEvents & TDAutoTrackEventType.AppInstall) != 0) + { + ThinkingPCSDK.SetAutoTrackProperties(ThinkingSDK.PC.Main.TDAutoTrackEventType.AppInstall, properties, appId); + } + if ((autoTrackEvents & TDAutoTrackEventType.AppStart) != 0) + { + ThinkingPCSDK.SetAutoTrackProperties(ThinkingSDK.PC.Main.TDAutoTrackEventType.AppStart, properties, appId); + } + if ((autoTrackEvents & TDAutoTrackEventType.AppEnd) != 0) + { + ThinkingPCSDK.SetAutoTrackProperties(ThinkingSDK.PC.Main.TDAutoTrackEventType.AppEnd, properties, appId); + } + if ((autoTrackEvents & TDAutoTrackEventType.AppCrash) != 0) + { + ThinkingPCSDK.SetAutoTrackProperties(ThinkingSDK.PC.Main.TDAutoTrackEventType.AppCrash, properties, appId); + } + if ((autoTrackEvents & TDAutoTrackEventType.AppSceneLoad) != 0) + { + ThinkingPCSDK.SetAutoTrackProperties(ThinkingSDK.PC.Main.TDAutoTrackEventType.AppSceneLoad, properties, appId); + } + if ((autoTrackEvents & TDAutoTrackEventType.AppSceneUnload) != 0) + { + ThinkingPCSDK.SetAutoTrackProperties(ThinkingSDK.PC.Main.TDAutoTrackEventType.AppSceneUnload, properties, appId); + } + } + + private static void enableLog(bool enable) + { + ThinkingPCSDK.EnableLog(enable); + } + private static void calibrateTime(long timestamp) + { + ThinkingPCSDK.CalibrateTime(timestamp); + } + + private static void calibrateTimeWithNtp(string ntpServer) + { + ThinkingPCSDK.CalibrateTimeWithNtp(ntpServer); + } + + private static void enableThirdPartySharing(TDThirdPartyType shareType, Dictionary properties, string appId) + { + if (ThinkingSDKPublicConfig.IsPrintLog()) ThinkingSDKLogger.Print("Sharing data is not support on PC: " + shareType + ", " + properties + ", " + appId); + } + } +} +#endif \ No newline at end of file diff --git a/Assets/HCMiniSdk/Third/ta/ThinkingAnalytics/Wrapper/TDPCWrapper.cs.meta b/Assets/HCMiniSdk/Third/ta/ThinkingAnalytics/Wrapper/TDPCWrapper.cs.meta new file mode 100644 index 00000000..9cad8e37 --- /dev/null +++ b/Assets/HCMiniSdk/Third/ta/ThinkingAnalytics/Wrapper/TDPCWrapper.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: 8f9ded317afe443d894852ab82fad3ad +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/HCMiniSdk/Third/ta/ThinkingAnalytics/Wrapper/TDWrapper.cs b/Assets/HCMiniSdk/Third/ta/ThinkingAnalytics/Wrapper/TDWrapper.cs new file mode 100644 index 00000000..6861d0f7 --- /dev/null +++ b/Assets/HCMiniSdk/Third/ta/ThinkingAnalytics/Wrapper/TDWrapper.cs @@ -0,0 +1,472 @@ +using System; +using System.Collections.Generic; +using ThinkingData.Analytics.Utils; +using UnityEngine; +using UnityEngine.SceneManagement; + +namespace ThinkingData.Analytics.Wrapper +{ + public partial class TDWrapper + { + public static MonoBehaviour sMono; + private static TDDynamicSuperPropertiesHandler mDynamicSuperProperties; + private static Dictionary mAutoTrackEventCallbacks = new Dictionary(); + private static Dictionary> mAutoTrackProperties = new Dictionary>(); + private static Dictionary mAutoTrackEventInfos = new Dictionary(); + private static System.Random rnd = new System.Random(); + + private static string default_appId = null; + + // add Dictionary to Dictionary + public static void AddDictionary(Dictionary originalDic, Dictionary subDic) + { + if (originalDic != subDic) + { + foreach (KeyValuePair kv in subDic) + { + originalDic[kv.Key] = kv.Value; + } + } + } + + private static string serilize(Dictionary data) { + return TDMiniJson.Serialize(data, getTimeString); + } + + public static void ShareInstance(TDConfig token, MonoBehaviour mono, bool initRequired = true) + { + sMono = mono; + if (string.IsNullOrEmpty(default_appId)) default_appId = token.appId; + if (initRequired) init(token); + } + + public static void EnableLog(bool enable) + { + enableLog(enable); + } + + public static void SetVersionInfo(string version) + { + setVersionInfo("Unity", version); + } + + public static void SetDistinctId(string uniqueId, string appId) + { + identify(uniqueId, appId); + } + + public static string GetDistinctId(string appId) + { + return getDistinctId(appId); + } + + public static void Login(string accountId, string appId) + { + login(accountId, appId); + } + + public static void Logout(string appId) + { + logout(appId); + } + + public static void EnableAutoTrack(TDAutoTrackEventType events, Dictionary properties, string appId) + { + if (string.IsNullOrEmpty(appId)) appId = default_appId; + UpdateAutoTrackSceneInfos(events, appId); + SetAutoTrackProperties(events, properties, appId); + enableAutoTrack(events, properties, appId); + if ((events & TDAutoTrackEventType.AppSceneLoad) != 0) + { + TrackSceneLoad(SceneManager.GetActiveScene(), appId); + } + } + + public static void EnableAutoTrack(TDAutoTrackEventType events, TDAutoTrackEventHandler eventCallback, string appId) + { + if (string.IsNullOrEmpty(appId)) appId = default_appId; + UpdateAutoTrackSceneInfos(events, appId); + mAutoTrackEventCallbacks[appId] = eventCallback; + //mAutoTrackEventCallback = eventCallback; + enableAutoTrack(events, eventCallback, appId); + if ((events & TDAutoTrackEventType.AppSceneLoad) != 0) + { + TrackSceneLoad(SceneManager.GetActiveScene(), appId); + } + } + + private static string TDAutoTrackEventType_APP_SCENE_LOAD = "AppSceneLoad"; + private static string TDAutoTrackEventType_APP_SCENE_UNLOAD = "AppSceneUnload"; + public static void SetAutoTrackProperties(TDAutoTrackEventType events, Dictionary properties, string appId) + { + if ((events & TDAutoTrackEventType.AppSceneLoad) != 0) + { + if (mAutoTrackProperties.ContainsKey(TDAutoTrackEventType_APP_SCENE_LOAD)) + { + AddDictionary(mAutoTrackProperties[TDAutoTrackEventType_APP_SCENE_LOAD], properties); + } + else + mAutoTrackProperties[TDAutoTrackEventType_APP_SCENE_LOAD] = properties; + } + if ((events & TDAutoTrackEventType.AppSceneUnload) != 0) + { + if (mAutoTrackProperties.ContainsKey(TDAutoTrackEventType_APP_SCENE_UNLOAD)) + { + AddDictionary(mAutoTrackProperties[TDAutoTrackEventType_APP_SCENE_UNLOAD], properties); + } + else + mAutoTrackProperties[TDAutoTrackEventType_APP_SCENE_UNLOAD] = properties; + } + setAutoTrackProperties(events, properties, appId); + } + + public static void TrackSceneLoad(Scene scene, string appId = "") + { + Dictionary properties = new Dictionary() { + { "#scene_name", scene.name }, + { "#scene_path", scene.path } + }; + if (mAutoTrackProperties.ContainsKey(TDAutoTrackEventType_APP_SCENE_LOAD)) + { + AddDictionary(properties, mAutoTrackProperties[TDAutoTrackEventType_APP_SCENE_LOAD]); + } + if (string.IsNullOrEmpty(appId)) + { + foreach (var kv in mAutoTrackEventInfos) + { + Dictionary finalProperties = new Dictionary(properties); + if (mAutoTrackEventCallbacks.ContainsKey(kv.Key)) + { + AddDictionary(finalProperties, mAutoTrackEventCallbacks[kv.Key].GetAutoTrackEventProperties((int)TDAutoTrackEventType.AppSceneLoad, properties)); + } + if ((kv.Value & TDAutoTrackEventType.AppSceneLoad) != 0) + { + Track("ta_scene_loaded", finalProperties, kv.Key); + } + if ((kv.Value & TDAutoTrackEventType.AppSceneUnload) != 0) + { + TimeEvent("ta_scene_unloaded", kv.Key); + } + } + } + else + { + Dictionary finalProperties = new Dictionary(properties); + if (mAutoTrackEventCallbacks.ContainsKey(appId)) + { + AddDictionary(finalProperties, mAutoTrackEventCallbacks[appId].GetAutoTrackEventProperties((int)TDAutoTrackEventType.AppSceneLoad, properties)); + } + Track("ta_scene_loaded", finalProperties, appId); + TimeEvent("ta_scene_unloaded", appId); + } + } + + public static void TrackSceneUnload(Scene scene, string appId = "") + { + Dictionary properties = new Dictionary() { + { "#scene_name", scene.name }, + { "#scene_path", scene.path } + }; + if (mAutoTrackProperties.ContainsKey(TDAutoTrackEventType_APP_SCENE_UNLOAD)) + { + AddDictionary(properties, mAutoTrackProperties[TDAutoTrackEventType_APP_SCENE_UNLOAD]); + } + foreach (var kv in mAutoTrackEventInfos) + { + Dictionary finalProperties = new Dictionary(properties); + if (mAutoTrackEventCallbacks.ContainsKey(kv.Key)) + { + AddDictionary(finalProperties, mAutoTrackEventCallbacks[kv.Key].GetAutoTrackEventProperties((int)TDAutoTrackEventType.AppSceneUnload, properties)); + } + if ((kv.Value & TDAutoTrackEventType.AppSceneUnload) != 0) + { + Track("ta_scene_unloaded", finalProperties, kv.Key); + } + } + } + + private static void UpdateAutoTrackSceneInfos(TDAutoTrackEventType events, string appId = "") + { + if (string.IsNullOrEmpty(appId)) appId = default_appId; + mAutoTrackEventInfos[appId] = events; + } + + private static Dictionary getFinalEventProperties(Dictionary properties) + { + TDPropertiesChecker.CheckProperties(properties); + + if (null != mDynamicSuperProperties) + { + Dictionary finalProperties = new Dictionary(); + TDPropertiesChecker.MergeProperties(mDynamicSuperProperties.GetDynamicSuperProperties(), finalProperties); + TDPropertiesChecker.MergeProperties(properties, finalProperties); + return finalProperties; + } + else + { + return properties; + } + + } + public static void Track(string eventName, Dictionary properties, string appId) + { + TDPropertiesChecker.CheckString(eventName); + track(eventName, getFinalEventProperties(properties), appId); + } + + public static void Track(string eventName, Dictionary properties, DateTime datetime, string appId) + { + TDPropertiesChecker.CheckString(eventName); + track(eventName, getFinalEventProperties(properties), datetime, appId); + } + + public static void Track(string eventName, Dictionary properties, DateTime datetime, TimeZoneInfo timeZone, string appId) + { + TDPropertiesChecker.CheckString(eventName); + track(eventName, getFinalEventProperties(properties), datetime, timeZone, appId); + } + + public static void TrackForAll(string eventName, Dictionary properties) + { + TDPropertiesChecker.CheckString(eventName); + trackForAll(eventName, getFinalEventProperties(properties)); + } + + public static void Track(TDEventModel taEvent, string appId) + { + if (null == taEvent || null == taEvent.EventType) + { + if(TDLog.GetEnable()) TDLog.w("Ignoring invalid TA event"); + return; + } + + if (taEvent.GetEventTime() == null) + { + if(TDLog.GetEnable()) TDLog.w("ppp null..."); + } + TDPropertiesChecker.CheckString(taEvent.EventName); + TDPropertiesChecker.CheckProperties(taEvent.Properties); + track(taEvent, appId); + } + + public static void QuickTrack(string eventName, Dictionary properties, string appId) + { + if ("SceneView" == eventName) + { + if (properties == null) + { + properties = new Dictionary() { }; + } + Scene scene = SceneManager.GetActiveScene(); + if (scene != null) + { + properties.Add("#scene_name", scene.name); + properties.Add("#scene_path", scene.path); + } + Track("ta_scene_view", properties, appId); + } + else if ("AppClick" == eventName) + { + if (properties == null) + { + properties = new Dictionary() { }; + } + Track("ta_app_click", properties, appId); + } + } + + public static void SetSuperProperties(Dictionary superProperties, string appId) + { + TDPropertiesChecker.CheckProperties(superProperties); + setSuperProperties(superProperties, appId); + } + + public static void UnsetSuperProperty(string superPropertyName, string appId) + { + TDPropertiesChecker.CheckString(superPropertyName); + unsetSuperProperty(superPropertyName, appId); + } + + public static void ClearSuperProperty(string appId) + { + clearSuperProperty(appId); + } + + + public static void TimeEvent(string eventName, string appId) + { + TDPropertiesChecker.CheckString(eventName); + timeEvent(eventName, appId); + } + + public static void TimeEventForAll(string eventName) + { + TDPropertiesChecker.CheckString(eventName); + timeEventForAll(eventName); + } + + public static Dictionary GetSuperProperties(string appId) + { + return getSuperProperties(appId); + } + + public static Dictionary GetPresetProperties(string appId) + { + return getPresetProperties(appId); + } + + public static void UserSet(Dictionary properties, string appId) + { + TDPropertiesChecker.CheckProperties(properties); + userSet(properties, appId); + } + + public static void UserSet(Dictionary properties, DateTime dateTime, string appId) + { + TDPropertiesChecker.CheckProperties(properties); + userSet(properties, dateTime, appId); + } + + public static void UserSetOnce(Dictionary properties, string appId) + { + TDPropertiesChecker.CheckProperties(properties); + userSetOnce(properties, appId); + } + + public static void UserSetOnce(Dictionary properties, DateTime dateTime, string appId) + { + TDPropertiesChecker.CheckProperties(properties); + userSetOnce(properties, dateTime, appId); + } + + public static void UserUnset(List properties, string appId) + { + TDPropertiesChecker.CheckProperties(properties); + userUnset(properties, appId); + } + + public static void UserUnset(List properties, DateTime dateTime, string appId) + { + TDPropertiesChecker.CheckProperties(properties); + userUnset(properties, dateTime, appId); + } + + public static void UserAdd(Dictionary properties, string appId) + { + TDPropertiesChecker.CheckProperties(properties); + userAdd(properties, appId); + } + + public static void UserAdd(Dictionary properties, DateTime dateTime, string appId) + { + TDPropertiesChecker.CheckProperties(properties); + userAdd(properties, dateTime, appId); + } + + public static void UserAppend(Dictionary properties, string appId) + { + TDPropertiesChecker.CheckProperties(properties); + userAppend(properties, appId); + } + + public static void UserAppend(Dictionary properties, DateTime dateTime, string appId) + { + TDPropertiesChecker.CheckProperties(properties); + userAppend(properties, dateTime, appId); + } + + public static void UserUniqAppend(Dictionary properties, string appId) + { + TDPropertiesChecker.CheckProperties(properties); + userUniqAppend(properties, appId); + } + + public static void UserUniqAppend(Dictionary properties, DateTime dateTime, string appId) + { + TDPropertiesChecker.CheckProperties(properties); + userUniqAppend(properties, dateTime, appId); + } + + public static void UserDelete(string appId) + { + userDelete(appId); + } + + public static void UserDelete(DateTime dateTime, string appId) + { + userDelete(dateTime, appId); + } + + public static void Flush(string appId) + { + flush(appId); + } + + public static void SetNetworkType(TDNetworkType networkType) + { + setNetworkType(networkType); + } + + public static string GetDeviceId() + { + return getDeviceId(); + } + + public static void SetDynamicSuperProperties(TDDynamicSuperPropertiesHandler dynamicSuperProperties, string appId) + { + if (!TDPropertiesChecker.CheckProperties(dynamicSuperProperties.GetDynamicSuperProperties())) + { + if(TDLog.GetEnable()) TDLog.d("Cannot set dynamic super properties due to invalid properties."); + } + mDynamicSuperProperties = dynamicSuperProperties; + setDynamicSuperProperties(dynamicSuperProperties, appId); + } + + public static void SetTrackStatus(TDTrackStatus status, string appId) + { + setTrackStatus(status, appId); + } + + public static void OptOutTracking(string appId) + { + optOutTracking(appId); + } + + public static void OptOutTrackingAndDeleteUser(string appId) + { + optOutTrackingAndDeleteUser(appId); + } + + public static void OptInTracking(string appId) + { + optInTracking(appId); + } + + public static void EnableTracking(bool enabled, string appId) + { + enableTracking(enabled, appId); + } + + public static string CreateLightInstance() + { + return createLightInstance(); + } + + public static void CalibrateTime(long timestamp) + { + calibrateTime(timestamp); + } + + public static void CalibrateTimeWithNtp(string ntpServer) + { + calibrateTimeWithNtp(ntpServer); + } + + public static void EnableThirdPartySharing(TDThirdPartyType shareType, Dictionary properties = null, string appId = "") + { + if (null == properties) properties = new Dictionary(); + enableThirdPartySharing(shareType, properties, appId); + } + } +} + diff --git a/Assets/HCMiniSdk/Third/ta/ThinkingAnalytics/Wrapper/TDWrapper.cs.meta b/Assets/HCMiniSdk/Third/ta/ThinkingAnalytics/Wrapper/TDWrapper.cs.meta new file mode 100644 index 00000000..3fc816fa --- /dev/null +++ b/Assets/HCMiniSdk/Third/ta/ThinkingAnalytics/Wrapper/TDWrapper.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: 306f69768d6114f989d144fd22df1b13 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/HCMiniSdk/Third/ta/ThinkingAnalytics/Wrapper/TDiOSWrapper.cs b/Assets/HCMiniSdk/Third/ta/ThinkingAnalytics/Wrapper/TDiOSWrapper.cs new file mode 100644 index 00000000..63729201 --- /dev/null +++ b/Assets/HCMiniSdk/Third/ta/ThinkingAnalytics/Wrapper/TDiOSWrapper.cs @@ -0,0 +1,501 @@ +#if UNITY_IOS && !(UNITY_EDITOR) && !TE_DISABLE_IOS_OC +using System; +using System.Collections.Generic; +using System.Runtime.InteropServices; +using ThinkingData.Analytics.Utils; + +namespace ThinkingData.Analytics.Wrapper +{ + public partial class TDWrapper + { + [DllImport("__Internal")] + private static extern void ta_start(string app_id, string url, int mode, string timezone_id, bool enable_encrypt, int encrypt_version, string encrypt_public_key, int pinning_mode, bool allow_invalid_certificates, bool validates_domain_name, string instance_name); + [DllImport("__Internal")] + private static extern void ta_identify(string app_id, string unique_id); + [DllImport("__Internal")] + private static extern string ta_get_distinct_id(string app_id); + [DllImport("__Internal")] + private static extern void ta_login(string app_id, string account_id); + [DllImport("__Internal")] + private static extern void ta_logout(string app_id); + [DllImport("__Internal")] + private static extern void ta_track(string app_id, string event_name, string properties, long time_stamp_millis, string timezone); + [DllImport("__Internal")] + private static extern void ta_track_event(string app_id, string event_string); + [DllImport("__Internal")] + private static extern void ta_set_super_properties(string app_id, string properties); + [DllImport("__Internal")] + private static extern void ta_unset_super_property(string app_id, string property_name); + [DllImport("__Internal")] + private static extern void ta_clear_super_properties(string app_id); + [DllImport("__Internal")] + private static extern string ta_get_super_properties(string app_id); + [DllImport("__Internal")] + private static extern string ta_get_preset_properties(string app_id); + [DllImport("__Internal")] + private static extern void ta_time_event(string app_id, string event_name); + [DllImport("__Internal")] + private static extern void ta_user_set(string app_id, string properties); + [DllImport("__Internal")] + private static extern void ta_user_set_with_time(string app_id, string properties, long timestamp); + [DllImport("__Internal")] + private static extern void ta_user_unset(string app_id, string properties); + [DllImport("__Internal")] + private static extern void ta_user_unset_with_time(string app_id, string properties, long timestamp); + [DllImport("__Internal")] + private static extern void ta_user_set_once(string app_id, string properties); + [DllImport("__Internal")] + private static extern void ta_user_set_once_with_time(string app_id, string properties, long timestamp); + [DllImport("__Internal")] + private static extern void ta_user_add(string app_id, string properties); + [DllImport("__Internal")] + private static extern void ta_user_add_with_time(string app_id, string properties, long timestamp); + [DllImport("__Internal")] + private static extern void ta_user_delete(string app_id); + [DllImport("__Internal")] + private static extern void ta_user_delete_with_time(string app_id, long timestamp); + [DllImport("__Internal")] + private static extern void ta_user_append(string app_id, string properties); + [DllImport("__Internal")] + private static extern void ta_user_append_with_time(string app_id, string properties, long timestamp); + [DllImport("__Internal")] + private static extern void ta_user_uniq_append(string app_id, string properties); + [DllImport("__Internal")] + private static extern void ta_user_uniq_append_with_time(string app_id, string properties, long timestamp); + [DllImport("__Internal")] + private static extern void ta_flush(string app_id); + [DllImport("__Internal")] + private static extern void ta_set_network_type(int type); + [DllImport("__Internal")] + private static extern void ta_enable_log(bool is_enable); + [DllImport("__Internal")] + private static extern string ta_get_device_id(); + [DllImport("__Internal")] + private static extern void ta_set_dynamic_super_properties(string app_id); + [DllImport("__Internal")] + private static extern void ta_enable_tracking(string app_id, bool enabled); + [DllImport("__Internal")] + private static extern void ta_set_track_status(string app_id, int status); + [DllImport("__Internal")] + private static extern void ta_opt_out_tracking(string app_id); + [DllImport("__Internal")] + private static extern void ta_opt_out_tracking_and_delete_user(string app_id); + [DllImport("__Internal")] + private static extern void ta_opt_in_tracking(string app_id); + [DllImport("__Internal")] + private static extern void ta_create_light_instance(string delegate_token); + [DllImport("__Internal")] + private static extern void ta_enable_autoTrack(string app_id, int events, string properties); + [DllImport("__Internal")] + private static extern void ta_enable_autoTrack_with_callback(string app_id, int events); + [DllImport("__Internal")] + private static extern void ta_set_autoTrack_properties(string app_id, int events, string properties); + [DllImport("__Internal")] + private static extern string ta_get_time_string(long timestamp); + [DllImport("__Internal")] + private static extern void ta_calibrate_time(long timestamp); + [DllImport("__Internal")] + private static extern void ta_calibrate_time_with_ntp(string ntpServer); + [DllImport("__Internal")] + private static extern void ta_config_custom_lib_info(string lib_name, string lib_version); + [DllImport("__Internal")] + private static extern void ta_enable_third_party_sharing(string app_id, int share_type, string properties); + + private static TimeZoneInfo defaultTimeZone = null; + + private static void init(TDConfig token) + { + registerRecieveGameCallback(); + ta_start(token.appId, token.serverUrl, (int)token.mode, token.getTimeZoneId(), token.enableEncrypt, token.encryptVersion, token.encryptPublicKey, (int) token.pinningMode, token.allowInvalidCertificates, token.validatesDomainName, token.name); + string timeZoneId = token.getTimeZoneId(); + if (null != timeZoneId && timeZoneId.Length > 0) + { + if (defaultTimeZone == null) + { + defaultTimeZone = TimeZoneInfo.FindSystemTimeZoneById(timeZoneId); + } + } + else + { + if (defaultTimeZone == null) + { + defaultTimeZone = TimeZoneInfo.Local; + } + } + } + + private static void identify(string uniqueId, string appId) + { + ta_identify(appId, uniqueId); + } + + private static string getDistinctId(string appId) + { + return ta_get_distinct_id(appId); + } + + private static void login(string accountId, string appId) + { + ta_login(appId, accountId); + } + + private static void logout(string appId) + { + ta_logout(appId); + } + + private static void flush(string appId) + { + ta_flush(appId); + } + + private static void enableLog(bool enable) + { + ta_enable_log(enable); + } + + private static void setVersionInfo(string lib_name, string lib_version) { + ta_config_custom_lib_info(lib_name, lib_version); + } + + private static void track(TDEventModel taEvent, string appId) + { + Dictionary finalEvent = new Dictionary(); + string extraId = taEvent.GetEventId(); + switch (taEvent.EventType) + { + case TDEventModel.TDEventType.First: + finalEvent["event_type"] = "track_first"; + break; + case TDEventModel.TDEventType.Updatable: + finalEvent["event_type"] = "track_update"; + break; + case TDEventModel.TDEventType.Overwritable: + finalEvent["event_type"] = "track_overwrite"; + break; + } + + if (!string.IsNullOrEmpty(extraId)) + { + finalEvent["extra_id"] = extraId; + } + + finalEvent["event_name"] = taEvent.EventName; + finalEvent["event_properties"] = taEvent.Properties; + if (taEvent.GetEventTime() != null && taEvent.GetEventTime() != DateTime.MinValue) + { + long dateTimeTicksUTC = TimeZoneInfo.ConvertTimeToUtc(taEvent.GetEventTime()).Ticks; + DateTime dtFrom = new DateTime(1970, 1, 1, 0, 0, 0, 0, DateTimeKind.Utc); + long currentMillis = (dateTimeTicksUTC - dtFrom.Ticks) / 10000; + finalEvent["event_time"] = currentMillis; + } + if (taEvent.GetEventTimeZone() != null) + { + finalEvent["event_timezone"] = taEvent.GetEventTimeZone().Id; + } + + ta_track_event(appId, serilize(finalEvent)); + } + + private static void track(string eventName, Dictionary properties, string appId) + { + ta_track(appId, eventName, serilize(properties), 0, ""); + } + + private static void track(string eventName, Dictionary properties, DateTime dateTime, string appId) + { + long dateTimeTicksUTC = TimeZoneInfo.ConvertTimeToUtc(dateTime).Ticks; + + DateTime dtFrom = new DateTime(1970, 1, 1, 0, 0, 0, 0, DateTimeKind.Utc); + long currentMillis = (dateTimeTicksUTC - dtFrom.Ticks) / 10000; + string tz = ""; + ta_track(appId, eventName, serilize(properties), currentMillis, tz); + } + + private static void track(string eventName, Dictionary properties, DateTime dateTime, TimeZoneInfo timeZone, string appId) + { + long dateTimeTicksUTC = TimeZoneInfo.ConvertTimeToUtc(dateTime).Ticks; + + DateTime dtFrom = new DateTime(1970, 1, 1, 0, 0, 0, 0, DateTimeKind.Utc); + long currentMillis = (dateTimeTicksUTC - dtFrom.Ticks) / 10000; + string tz = ""; + if (timeZone != null) + { + tz = timeZone.Id; + } + ta_track(appId, eventName, serilize(properties), currentMillis, tz); + } + + private static void trackForAll(string eventName, Dictionary properties) + { + string appId = ""; + track(eventName, properties, appId); + } + + private static void setSuperProperties(Dictionary superProperties, string appId) + { + ta_set_super_properties(appId, serilize(superProperties)); + } + + private static void unsetSuperProperty(string superPropertyName, string appId) + { + ta_unset_super_property(appId, superPropertyName); + } + + private static void clearSuperProperty(string appId) + { + ta_clear_super_properties(appId); + } + + private static Dictionary getSuperProperties(string appId) + { + string superPropertiesString = ta_get_super_properties(appId); + return TDMiniJson.Deserialize(superPropertiesString); + } + + private static Dictionary getPresetProperties(string appId) + { + string presetPropertiesString = ta_get_preset_properties(appId); + return TDMiniJson.Deserialize(presetPropertiesString); + } + + private static void timeEvent(string eventName, string appId) + { + ta_time_event(appId, eventName); + } + + private static void timeEventForAll(string eventName) + { + ta_time_event("", eventName); + } + + private static void userSet(Dictionary properties, string appId) + { + ta_user_set(appId, serilize(properties)); + } + + private static void userSet(Dictionary properties, DateTime dateTime, string appId) + { + long dateTimeTicksUTC = TimeZoneInfo.ConvertTimeToUtc(dateTime).Ticks; + DateTime dtFrom = new DateTime(1970, 1, 1, 0, 0, 0, 0, DateTimeKind.Utc); + long currentMillis = (dateTimeTicksUTC - dtFrom.Ticks) / 10000; + ta_user_set_with_time(appId, serilize(properties), currentMillis); + } + + private static void userUnset(List properties, string appId) + { + foreach (string property in properties) + { + ta_user_unset(appId, property); + } + } + + private static void userUnset(List properties, DateTime dateTime, string appId) + { + long dateTimeTicksUTC = TimeZoneInfo.ConvertTimeToUtc(dateTime).Ticks; + DateTime dtFrom = new DateTime(1970, 1, 1, 0, 0, 0, 0, DateTimeKind.Utc); + long currentMillis = (dateTimeTicksUTC - dtFrom.Ticks) / 10000; + foreach (string property in properties) + { + ta_user_unset_with_time(appId, property, currentMillis); + } + } + + private static void userSetOnce(Dictionary properties, string appId) + { + ta_user_set_once(appId, serilize(properties)); + } + + private static void userSetOnce(Dictionary properties, DateTime dateTime, string appId) + { + long dateTimeTicksUTC = TimeZoneInfo.ConvertTimeToUtc(dateTime).Ticks; + DateTime dtFrom = new DateTime(1970, 1, 1, 0, 0, 0, 0, DateTimeKind.Utc); + long currentMillis = (dateTimeTicksUTC - dtFrom.Ticks) / 10000; + ta_user_set_once_with_time(appId, serilize(properties), currentMillis); + } + + private static void userAdd(Dictionary properties, string appId) + { + ta_user_add(appId, serilize(properties)); + } + + private static void userAdd(Dictionary properties, DateTime dateTime, string appId) + { + long dateTimeTicksUTC = TimeZoneInfo.ConvertTimeToUtc(dateTime).Ticks; + DateTime dtFrom = new DateTime(1970, 1, 1, 0, 0, 0, 0, DateTimeKind.Utc); + long currentMillis = (dateTimeTicksUTC - dtFrom.Ticks) / 10000; + ta_user_add_with_time(appId, serilize(properties), currentMillis); + } + + private static void userDelete(string appId) + { + ta_user_delete(appId); + } + + private static void userDelete(DateTime dateTime, string appId) + { + long dateTimeTicksUTC = TimeZoneInfo.ConvertTimeToUtc(dateTime).Ticks; + DateTime dtFrom = new DateTime(1970, 1, 1, 0, 0, 0, 0, DateTimeKind.Utc); + long currentMillis = (dateTimeTicksUTC - dtFrom.Ticks) / 10000; + ta_user_delete_with_time(appId, currentMillis); + } + + private static void userAppend(Dictionary properties, string appId) + { + ta_user_append(appId, serilize(properties)); + } + + private static void userAppend(Dictionary properties, DateTime dateTime, string appId) + { + long dateTimeTicksUTC = TimeZoneInfo.ConvertTimeToUtc(dateTime).Ticks; + DateTime dtFrom = new DateTime(1970, 1, 1, 0, 0, 0, 0, DateTimeKind.Utc); + long currentMillis = (dateTimeTicksUTC - dtFrom.Ticks) / 10000; + ta_user_append_with_time(appId, serilize(properties), currentMillis); + } + + private static void userUniqAppend(Dictionary properties, string appId) + { + ta_user_uniq_append(appId, serilize(properties)); + } + + private static void userUniqAppend(Dictionary properties, DateTime dateTime, string appId) + { + long dateTimeTicksUTC = TimeZoneInfo.ConvertTimeToUtc(dateTime).Ticks; + DateTime dtFrom = new DateTime(1970, 1, 1, 0, 0, 0, 0, DateTimeKind.Utc); + long currentMillis = (dateTimeTicksUTC - dtFrom.Ticks) / 10000; + ta_user_uniq_append_with_time(appId, serilize(properties), currentMillis); + } + + private static void setNetworkType(TDNetworkType networkType) + { + ta_set_network_type((int)networkType); + } + + private static string getDeviceId() + { + return ta_get_device_id(); + } + + private static void setDynamicSuperProperties(TDDynamicSuperPropertiesHandler dynamicSuperProperties, string appId) + { + ta_set_dynamic_super_properties(appId); + } + + private static void setTrackStatus(TDTrackStatus status, string appId) + { + ta_set_track_status(appId, (int)status); + } + + private static void optOutTracking(string appId) + { + ta_opt_out_tracking(appId); + } + + private static void optOutTrackingAndDeleteUser(string appId) + { + ta_opt_out_tracking_and_delete_user(appId); + } + + private static void optInTracking(string appId) + { + ta_opt_in_tracking(appId); + } + + private static void enableTracking(bool enabled, string appId) + { + ta_enable_tracking(appId, enabled); + } + + private static string createLightInstance() + { + string randomID = System.Guid.NewGuid().ToString("N"); + ta_create_light_instance(randomID); + return randomID; + } + + private static string getTimeString(DateTime dateTime) + { + //long dateTimeTicksUTC = TimeZoneInfo.ConvertTimeToUtc(dateTime).Ticks; + //DateTime dtFrom = new DateTime(1970, 1, 1, 0, 0, 0, 0, DateTimeKind.Utc); + //long currentMillis = (dateTimeTicksUTC - dtFrom.Ticks) / 10000; + //return ta_get_time_string(currentMillis); + return TDCommonUtils.FormatDate(dateTime, defaultTimeZone); + } + + private static void enableAutoTrack(TDAutoTrackEventType autoTrackEvents, Dictionary properties, string appId) + { + ta_enable_autoTrack(appId, (int)autoTrackEvents, serilize(properties)); + } + + private static void enableAutoTrack(TDAutoTrackEventType autoTrackEvents, TDAutoTrackEventHandler eventCallback, string appId) + { + ta_enable_autoTrack_with_callback(appId, (int)autoTrackEvents); + } + + private static void setAutoTrackProperties(TDAutoTrackEventType autoTrackEvents, Dictionary properties, string appId) + { + ta_set_autoTrack_properties(appId, (int)autoTrackEvents, serilize(properties)); + } + + private static void calibrateTime(long timestamp) + { + ta_calibrate_time(timestamp); + } + + private static void calibrateTimeWithNtp(string ntpServer) + { + ta_calibrate_time_with_ntp(ntpServer); + } + + private static void enableThirdPartySharing(TDThirdPartyType shareType, Dictionary properties, string appId) + { + ta_enable_third_party_sharing(appId, (int) shareType, serilize(properties)); + } + + private static void registerRecieveGameCallback() + { + ResultHandler handler = new ResultHandler(resultHandler); + IntPtr handlerPointer = Marshal.GetFunctionPointerForDelegate(handler); + RegisterRecieveGameCallback(handlerPointer); + } + + [DllImport("__Internal")] + public static extern void RegisterRecieveGameCallback + ( + IntPtr handlerPointer + ); + + [UnmanagedFunctionPointer(CallingConvention.Cdecl)] + public delegate string ResultHandler(string type, string jsonData); + + [AOT.MonoPInvokeCallback(typeof(ResultHandler))] + static string resultHandler(string type, string jsonData) + { + if (type == "AutoTrackProperties") + { + Dictionaryproperties = TDMiniJson.Deserialize(jsonData); + string appId = properties["AppID"].ToString(); + int eventType = Convert.ToInt32(properties["EventType"]); + if (!string.IsNullOrEmpty(appId) && mAutoTrackEventCallbacks.ContainsKey(appId)) + { + properties.Remove("EventType"); + properties.Remove("AppID"); + DictionaryautoTrackProperties = mAutoTrackEventCallbacks[appId].GetAutoTrackEventProperties(eventType, properties); + //return TDMiniJson.Serialize(autoTrackProperties); + return serilize(autoTrackProperties); + } + } + else if (type == "DynamicSuperProperties") + { + if (mDynamicSuperProperties != null) + { + DictionarydynamicSuperProperties = mDynamicSuperProperties.GetDynamicSuperProperties(); + //return TDMiniJson.Serialize(dynamicSuperProperties); + return serilize(dynamicSuperProperties); + } + } + return "{}"; + } + } +} +#endif \ No newline at end of file diff --git a/Assets/HCMiniSdk/Third/ta/ThinkingAnalytics/Wrapper/TDiOSWrapper.cs.meta b/Assets/HCMiniSdk/Third/ta/ThinkingAnalytics/Wrapper/TDiOSWrapper.cs.meta new file mode 100644 index 00000000..680368ff --- /dev/null +++ b/Assets/HCMiniSdk/Third/ta/ThinkingAnalytics/Wrapper/TDiOSWrapper.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: e2049ce2b30da48328f05872adacceed +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/Plugins/ByteGame.meta b/Assets/Plugins/ByteGame.meta index 59f8b56c..66206935 100644 --- a/Assets/Plugins/ByteGame.meta +++ b/Assets/Plugins/ByteGame.meta @@ -1,5 +1,5 @@ fileFormatVersion: 2 -guid: 66743e232ebff40fd9a1442b9b4b0ce8 +guid: bd6c3c66287144a37bc25f04d8c23b4d folderAsset: yes DefaultImporter: externalObjects: {} diff --git a/Assets/Plugins/ByteGame/bgdt.txt.meta b/Assets/Plugins/ByteGame/bgdt.txt.meta index ec3fd201..7cc0375f 100644 --- a/Assets/Plugins/ByteGame/bgdt.txt.meta +++ b/Assets/Plugins/ByteGame/bgdt.txt.meta @@ -1,5 +1,5 @@ fileFormatVersion: 2 -guid: 73956d4f804d6487ebf5b7f3dd3c436b +guid: f6a799a12f9e745c78ea2a758e3faf8e TextScriptImporter: externalObjects: {} userData: diff --git a/Assets/Plugins/ByteGame/com.bytedance.bgdt.meta b/Assets/Plugins/ByteGame/com.bytedance.bgdt.meta index 0088bb45..2a4a0e4d 100644 --- a/Assets/Plugins/ByteGame/com.bytedance.bgdt.meta +++ b/Assets/Plugins/ByteGame/com.bytedance.bgdt.meta @@ -1,5 +1,5 @@ fileFormatVersion: 2 -guid: 7fbf157e59c0948e8b48dfd664ca51b5 +guid: f2332b7f90d194a12b57bfce8af9fc45 folderAsset: yes DefaultImporter: externalObjects: {} diff --git a/Assets/Plugins/ByteGame/com.bytedance.bgdt/Editor.meta b/Assets/Plugins/ByteGame/com.bytedance.bgdt/Editor.meta index f2a331c3..b2eef842 100644 --- a/Assets/Plugins/ByteGame/com.bytedance.bgdt/Editor.meta +++ b/Assets/Plugins/ByteGame/com.bytedance.bgdt/Editor.meta @@ -1,5 +1,5 @@ fileFormatVersion: 2 -guid: 67d29f875e6d9430c9da02e60611fe84 +guid: 9afecf807a47a49758ad07c3699e8b73 folderAsset: yes DefaultImporter: externalObjects: {} diff --git a/Assets/Plugins/ByteGame/com.bytedance.bgdt/Editor/bgdt.data b/Assets/Plugins/ByteGame/com.bytedance.bgdt/Editor/bgdt.data old mode 100755 new mode 100644 index c261ed23..9d9eae0a Binary files a/Assets/Plugins/ByteGame/com.bytedance.bgdt/Editor/bgdt.data and b/Assets/Plugins/ByteGame/com.bytedance.bgdt/Editor/bgdt.data differ diff --git a/Assets/Plugins/ByteGame/com.bytedance.bgdt/Editor/bgdt.data.meta b/Assets/Plugins/ByteGame/com.bytedance.bgdt/Editor/bgdt.data.meta old mode 100755 new mode 100644 index d0f077c0..0074f0b8 --- a/Assets/Plugins/ByteGame/com.bytedance.bgdt/Editor/bgdt.data.meta +++ b/Assets/Plugins/ByteGame/com.bytedance.bgdt/Editor/bgdt.data.meta @@ -1,5 +1,5 @@ fileFormatVersion: 2 -guid: fdcf44b75a07b9147be6c7a1242fa688 +guid: 429ddc558ea984c0582ae4dd03431a7b DefaultImporter: externalObjects: {} userData: diff --git a/Assets/Plugins/ByteGame/com.bytedance.bgdt/Editor/bgdt.dll b/Assets/Plugins/ByteGame/com.bytedance.bgdt/Editor/bgdt.dll old mode 100755 new mode 100644 index 9b57f21b..5690b053 Binary files a/Assets/Plugins/ByteGame/com.bytedance.bgdt/Editor/bgdt.dll and b/Assets/Plugins/ByteGame/com.bytedance.bgdt/Editor/bgdt.dll differ diff --git a/Assets/Plugins/ByteGame/com.bytedance.bgdt/Editor/bgdt.dll.meta b/Assets/Plugins/ByteGame/com.bytedance.bgdt/Editor/bgdt.dll.meta old mode 100755 new mode 100644 index a876d14a..5d80d478 --- a/Assets/Plugins/ByteGame/com.bytedance.bgdt/Editor/bgdt.dll.meta +++ b/Assets/Plugins/ByteGame/com.bytedance.bgdt/Editor/bgdt.dll.meta @@ -1,12 +1,15 @@ fileFormatVersion: 2 -guid: 9442285fc3d2d464eae3c84aeae33b44 +guid: a372faf8e8d111d4a889e043bce259cb PluginImporter: externalObjects: {} serializedVersion: 2 iconMap: {} executionOrder: {} + defineConstraints: [] isPreloaded: 0 isOverridable: 0 + isExplicitlyReferenced: 0 + validateReferences: 1 platformData: - first: Any: diff --git a/Assets/Plugins/ByteGame/com.bytedance.bgdt/package.json b/Assets/Plugins/ByteGame/com.bytedance.bgdt/package.json old mode 100755 new mode 100644 index b603b8c8..11cfc5ac --- a/Assets/Plugins/ByteGame/com.bytedance.bgdt/package.json +++ b/Assets/Plugins/ByteGame/com.bytedance.bgdt/package.json @@ -1,7 +1,7 @@ { "displayName": "ByteGame Develop Tools", "name": "com.bytedance.bgdt", - "version": "3.0.224", + "version": "3.0.194", "description": "ByteGame Develop Tools", "keywords": [], "category": "Libraries", diff --git a/Assets/Plugins/ByteGame/com.bytedance.bgdt/package.json.meta b/Assets/Plugins/ByteGame/com.bytedance.bgdt/package.json.meta old mode 100755 new mode 100644 index 013a98e3..3cf43ef9 --- a/Assets/Plugins/ByteGame/com.bytedance.bgdt/package.json.meta +++ b/Assets/Plugins/ByteGame/com.bytedance.bgdt/package.json.meta @@ -1,7 +1,7 @@ -fileFormatVersion: 2 -guid: 61dbc043ba454039a642852ba0671211 -TextScriptImporter: - externalObjects: {} - userData: - assetBundleName: - assetBundleVariant: +fileFormatVersion: 2 +guid: 61dbc043ba454039a642852ba0671211 +TextScriptImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/Plugins/ByteGame/com.bytedance.starksdk.meta b/Assets/Plugins/ByteGame/com.bytedance.starksdk.meta index fd4ca0ed..9f818e17 100644 --- a/Assets/Plugins/ByteGame/com.bytedance.starksdk.meta +++ b/Assets/Plugins/ByteGame/com.bytedance.starksdk.meta @@ -1,5 +1,5 @@ fileFormatVersion: 2 -guid: 733c4da56be4a44928cbf5886f920c7d +guid: 2a4d4f2e5e2fa4d26ba52ab8971e4ac3 folderAsset: yes DefaultImporter: externalObjects: {} diff --git a/Assets/Plugins/ByteGame/com.bytedance.starksdk.unitytools.meta b/Assets/Plugins/ByteGame/com.bytedance.starksdk.unitytools.meta index 44e45932..3ef1b724 100644 --- a/Assets/Plugins/ByteGame/com.bytedance.starksdk.unitytools.meta +++ b/Assets/Plugins/ByteGame/com.bytedance.starksdk.unitytools.meta @@ -1,5 +1,5 @@ fileFormatVersion: 2 -guid: 86395837dc32d4f93b7f3ddc282b677b +guid: 3495e2a606dd34ebaa5dc0733a07710f folderAsset: yes DefaultImporter: externalObjects: {} diff --git a/Assets/Plugins/ByteGame/com.bytedance.starksdk.unitytools/Editor.meta b/Assets/Plugins/ByteGame/com.bytedance.starksdk.unitytools/Editor.meta index 00528c31..0ac17b39 100644 --- a/Assets/Plugins/ByteGame/com.bytedance.starksdk.unitytools/Editor.meta +++ b/Assets/Plugins/ByteGame/com.bytedance.starksdk.unitytools/Editor.meta @@ -1,8 +1,8 @@ -fileFormatVersion: 2 -guid: 4c023737fa6137e4ab2780baec8968d1 -folderAsset: yes -DefaultImporter: - externalObjects: {} - userData: - assetBundleName: - assetBundleVariant: +fileFormatVersion: 2 +guid: 4c023737fa6137e4ab2780baec8968d1 +folderAsset: yes +DefaultImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/Plugins/ByteGame/com.bytedance.starksdk.unitytools/Editor/StarkWebGLBuilder.meta b/Assets/Plugins/ByteGame/com.bytedance.starksdk.unitytools/Editor/StarkWebGLBuilder.meta deleted file mode 100644 index 1a0cf12d..00000000 --- a/Assets/Plugins/ByteGame/com.bytedance.starksdk.unitytools/Editor/StarkWebGLBuilder.meta +++ /dev/null @@ -1,8 +0,0 @@ -fileFormatVersion: 2 -guid: bcfec15533e174ff8bc62f7813b77db1 -folderAsset: yes -DefaultImporter: - externalObjects: {} - userData: - assetBundleName: - assetBundleVariant: diff --git a/Assets/Plugins/ByteGame/com.bytedance.starksdk.unitytools/Editor/starksdk_tools.dll b/Assets/Plugins/ByteGame/com.bytedance.starksdk.unitytools/Editor/starksdk_tools.dll new file mode 100644 index 00000000..eea8d5b4 Binary files /dev/null and b/Assets/Plugins/ByteGame/com.bytedance.starksdk.unitytools/Editor/starksdk_tools.dll differ diff --git a/Assets/Plugins/ByteGame/com.bytedance.starksdk.unitytools/Editor/unitytoolsEditor.dll.meta b/Assets/Plugins/ByteGame/com.bytedance.starksdk.unitytools/Editor/starksdk_tools.dll.meta similarity index 93% rename from Assets/Plugins/ByteGame/com.bytedance.starksdk.unitytools/Editor/unitytoolsEditor.dll.meta rename to Assets/Plugins/ByteGame/com.bytedance.starksdk.unitytools/Editor/starksdk_tools.dll.meta index 063d63ea..5741d0c2 100644 --- a/Assets/Plugins/ByteGame/com.bytedance.starksdk.unitytools/Editor/unitytoolsEditor.dll.meta +++ b/Assets/Plugins/ByteGame/com.bytedance.starksdk.unitytools/Editor/starksdk_tools.dll.meta @@ -1,5 +1,5 @@ fileFormatVersion: 2 -guid: 537494521630842e4908164366ce4901 +guid: c24e371c16cf76e45ae311c35c2d5fd1 PluginImporter: externalObjects: {} serializedVersion: 2 diff --git a/Assets/Plugins/ByteGame/com.bytedance.starksdk.unitytools/Editor/template.json b/Assets/Plugins/ByteGame/com.bytedance.starksdk.unitytools/Editor/template.json deleted file mode 100644 index 52203d27..00000000 --- a/Assets/Plugins/ByteGame/com.bytedance.starksdk.unitytools/Editor/template.json +++ /dev/null @@ -1,112 +0,0 @@ -{ - "min_sdk_version":"3.8.0", - "bundles":[ - { - "download_link":"", - "abi":"armeabi-v7a", - "keep_after_unzip":false, - "unzip_files":[ - { - "path":"lib/armeabi-v7a/libunity.so", - "parent_dir_type":"LIBRARY", - "sub_dir":"" - }, - { - "path":"lib/armeabi-v7a/libmain.so", - "parent_dir_type":"LIBRARY", - "sub_dir":"" - }, - { - "path":"lib/armeabi-v7a/libzstd.so", - "parent_dir_type":"LIBRARY", - "sub_dir":"" - }, - { - "path":"lib/armeabi-v7a/libbg_client_api.so", - "parent_dir_type":"LIBRARY", - "sub_dir":"" - }, - { - "path":"lib/armeabi-v7a/libsodium.so", - "parent_dir_type":"LIBRARY", - "sub_dir":"" - } - ], - "parent_dir_type":"LIBRARY", - "sub_dir":"", - "filename":"armeabi-v7a-libcommon" - },{ - "download_link":"", - "abi":"armeabi-v7a", - "keep_after_unzip":false, - "unzip_files":[ - { - "path":"lib/armeabi-v7a/*.so", - "parent_dir_type":"LIBRARY", - "sub_dir":"" - } - ], - "parent_dir_type":"LIBRARY", - "sub_dir":"", - "filename":"armeabi-v7a-libs" - }, - { - "download_link":"", - "abi":"arm64-v8a", - "keep_after_unzip":false, - "unzip_files":[ - { - "path":"lib/arm64-v8a/libunity.so", - "parent_dir_type":"LIBRARY", - "sub_dir":"" - }, - { - "path":"lib/arm64-v8a/libmain.so", - "parent_dir_type":"LIBRARY", - "sub_dir":"" - }, - { - "path":"lib/arm64-v8a/libzstd.so", - "parent_dir_type":"LIBRARY", - "sub_dir":"" - }, - { - "path":"lib/arm64-v8a/libbg_client_api.so", - "parent_dir_type":"LIBRARY", - "sub_dir":"" - }, - { - "path":"lib/arm64-v8a/libsodium.so", - "parent_dir_type":"LIBRARY", - "sub_dir":"" - } - ], - "parent_dir_type":"LIBRARY", - "sub_dir":"", - "filename":"arm64-v8a-libcommon" - }, - { - "download_link":"", - "abi":"arm64-v8a", - "keep_after_unzip":false, - "unzip_files":[ - { - "path":"lib/arm64-v8a/*.so", - "parent_dir_type":"LIBRARY", - "sub_dir":"" - } - ], - "parent_dir_type":"LIBRARY", - "sub_dir":"", - "filename":"arm64-v8a-libs" - }, - { - "is_main_resource": true, - "keep_after_unzip": true, - "download_link":"", - "parent_dir_type":"PACKAGE", - "sub_dir":"", - "filename":"main" - } - ] -} diff --git a/Assets/Plugins/ByteGame/com.bytedance.starksdk.unitytools/Editor/unitytoolsEditor.dll b/Assets/Plugins/ByteGame/com.bytedance.starksdk.unitytools/Editor/unitytoolsEditor.dll deleted file mode 100644 index b18f159d..00000000 Binary files a/Assets/Plugins/ByteGame/com.bytedance.starksdk.unitytools/Editor/unitytoolsEditor.dll and /dev/null differ diff --git a/Assets/Plugins/ByteGame/com.bytedance.starksdk.unitytools/Editor/unitytoolsEditor.xml b/Assets/Plugins/ByteGame/com.bytedance.starksdk.unitytools/Editor/unitytoolsEditor.xml deleted file mode 100644 index 7ca13610..00000000 --- a/Assets/Plugins/ByteGame/com.bytedance.starksdk.unitytools/Editor/unitytoolsEditor.xml +++ /dev/null @@ -1,11119 +0,0 @@ - - - - unitytoolsEditor - - - - - - - 是否为Dev版 - - Apk文件名 - 游戏Appid - 宿主 - 压缩方法 - 运行环境 - - - - - - - - 发布游戏 - - 游戏版本号 - 小程序平台Uid - 游戏Appid - 游戏APK - 发布描述 - 上传进度变化时的回调函数(参数为上传进度的百分比) - 上传完成时的回调函数(无参) - - - - - 查询发布状态 - - 小程序平台Uid - 游戏Appid - - - - - 生成二维码 - - 小程序平台Uid - 游戏Appid - 可选latest和current - - - - - 请求版本号 - - 小程序平台Uid - 游戏Appid - 可选latest和current - - - - - 发送Get请求 - - 地址 - 请求参数定义 - - - - - 运行一个命令 使用 arguments - - - - 如果是true,最后会给一个弹框提示运行结果。 - - 限制运行等待时间,单位: 秒,传入 0 则不限制 - 限制卡顿无任何输出的等待时间,单位: 秒,传入 0 则不限制 - - - - - Kill the running cmd, giving a popup dialog if use prompt UI - - if true, giving a popup dialog to choose confirmation - kill confirmed - - - - 工具集 - - - - 编译得到的Wasm文件所在目录:{ProjectRootDir}/Build/{ProjectName}/Build - - - 用于发布的WebGLPackage导出目录:{ProjectRootDir}/Build/webgl_package - - - 用于发布的WebGLPackage压缩文件路径:{ProjectRootDir}/Build/webgl_package.zip - - - - 运行一个命令 使用 arguments - - - - 如果是true,最后会给一个弹框提示运行结果。 - 日志级别 - 限制运行等待时间,单位: 秒,传入 0 则不限制 - 限制卡顿无任何输出的等待时间,单位: 秒,传入 0 则不限制 - - - - - Kill the running cmd, giving a popup dialog if use prompt UI - - if true, giving a popup dialog to choose confirmation - kill confirmed - - - 从服务器端下载得到的分包后Wasm文件保存目录:{SystemTempDir}/wasm_split - - - Wasm分包结果目录:{ProjectRootDir}/Build/wasm_split - - - - 压缩文件 - - 要压缩的文件全名 - 压缩后的文件名 - 密码 - 压缩结果 - - - - 拓展方法 - - - - - 跳过序列化的标签 - - - - - Determines whether the json contains an element that has the specified key. - - The key to locate in the json. - true if the json contains an element that has the specified key; otherwise, false. - - - - Unity内建类型拓展 - - - - - An example class to demonstrate compression and decompression of BZip2 streams. - - - - - Decompress the input writing - uncompressed data to the output stream - - The readable stream containing data to decompress. - The output stream to receive the decompressed data. - Both streams are closed on completion if true. - - - - Compress the input stream sending - result data to output stream - - The readable stream to compress. - The output stream to receive the compressed data. - Both streams are closed on completion if true. - Block size acts as compression level (1 to 9) with 1 giving - the lowest compression and 9 the highest. - - - - Defines internal values for both compression and decompression - - - - - Random numbers used to randomise repetitive blocks - - - - - When multiplied by compression parameter (1-9) gives the block size for compression - 9 gives the best compression but uses the most memory. - - - - - Backend constant - - - - - Backend constant - - - - - Backend constant - - - - - Backend constant - - - - - Backend constant - - - - - Backend constant - - - - - Backend constant - - - - - Backend constant - - - - - Backend constant - - - - - BZip2Exception represents exceptions specific to BZip2 classes and code. - - - - - Initialise a new instance of . - - - - - Initialise a new instance of with its message string. - - A that describes the error. - - - - Initialise a new instance of . - - A that describes the error. - The that caused this exception. - - - - Initializes a new instance of the BZip2Exception class with serialized data. - - - The System.Runtime.Serialization.SerializationInfo that holds the serialized - object data about the exception being thrown. - - - The System.Runtime.Serialization.StreamingContext that contains contextual information - about the source or destination. - - - - - An input stream that decompresses files in the BZip2 format - - - - - Construct instance for reading from stream - - Data source - - - - Get/set flag indicating ownership of underlying stream. - When the flag is true will close the underlying stream also. - - - - - Gets a value indicating if the stream supports reading - - - - - Gets a value indicating whether the current stream supports seeking. - - - - - Gets a value indicating whether the current stream supports writing. - This property always returns false - - - - - Gets the length in bytes of the stream. - - - - - Gets the current position of the stream. - Setting the position is not supported and will throw a NotSupportException. - - Any attempt to set the position. - - - - Flushes the stream. - - - - - Set the streams position. This operation is not supported and will throw a NotSupportedException - - A byte offset relative to the parameter. - A value of type indicating the reference point used to obtain the new position. - The new position of the stream. - Any access - - - - Sets the length of this stream to the given value. - This operation is not supported and will throw a NotSupportedExceptionortedException - - The new length for the stream. - Any access - - - - Writes a block of bytes to this stream using data from a buffer. - This operation is not supported and will throw a NotSupportedException - - The buffer to source data from. - The offset to start obtaining data from. - The number of bytes of data to write. - Any access - - - - Writes a byte to the current position in the file stream. - This operation is not supported and will throw a NotSupportedException - - The value to write. - Any access - - - - Read a sequence of bytes and advances the read position by one byte. - - Array of bytes to store values in - Offset in array to begin storing data - The maximum number of bytes to read - The total number of bytes read into the buffer. This might be less - than the number of bytes requested if that number of bytes are not - currently available or zero if the end of the stream is reached. - - - - - Closes the stream, releasing any associated resources. - - - - - Read a byte from stream advancing position - - byte read or -1 on end of stream - - - - An output stream that compresses into the BZip2 format - including file header chars into another stream. - - - - - Construct a default output stream with maximum block size - - The stream to write BZip data onto. - - - - Initialise a new instance of the - for the specified stream, using the given blocksize. - - The stream to write compressed data to. - The block size to use. - - Valid block sizes are in the range 1..9, with 1 giving - the lowest compression and 9 the highest. - - - - - Ensures that resources are freed and other cleanup operations - are performed when the garbage collector reclaims the BZip2OutputStream. - - - - - Gets or sets a flag indicating ownership of underlying stream. - When the flag is true will close the underlying stream also. - - The default value is true. - - - - Gets a value indicating whether the current stream supports reading - - - - - Gets a value indicating whether the current stream supports seeking - - - - - Gets a value indicating whether the current stream supports writing - - - - - Gets the length in bytes of the stream - - - - - Gets or sets the current position of this stream. - - - - - Sets the current position of this stream to the given value. - - The point relative to the offset from which to being seeking. - The reference point from which to begin seeking. - The new position in the stream. - - - - Sets the length of this stream to the given value. - - The new stream length. - - - - Read a byte from the stream advancing the position. - - The byte read cast to an int; -1 if end of stream. - - - - Read a block of bytes - - The buffer to read into. - The offset in the buffer to start storing data at. - The maximum number of bytes to read. - The total number of bytes read. This might be less than the number of bytes - requested if that number of bytes are not currently available, or zero - if the end of the stream is reached. - - - - Write a block of bytes to the stream - - The buffer containing data to write. - The offset of the first byte to write. - The number of bytes to write. - - - - Write a byte to the stream. - - The byte to write to the stream. - - - - Get the number of bytes written to output. - - - - - Get the number of bytes written to the output. - - - - - Releases the unmanaged resources used by the and optionally releases the managed resources. - - true to release both managed and unmanaged resources; false to release only unmanaged resources. - - - - Flush output buffers - - - - - Computes Adler32 checksum for a stream of data. An Adler32 - checksum is not as reliable as a CRC32 checksum, but a lot faster to - compute. - - The specification for Adler32 may be found in RFC 1950. - ZLIB Compressed Data Format Specification version 3.3) - - - From that document: - - "ADLER32 (Adler-32 checksum) - This contains a checksum value of the uncompressed data - (excluding any dictionary data) computed according to Adler-32 - algorithm. This algorithm is a 32-bit extension and improvement - of the Fletcher algorithm, used in the ITU-T X.224 / ISO 8073 - standard. - - Adler-32 is composed of two sums accumulated per byte: s1 is - the sum of all bytes, s2 is the sum of all s1 values. Both sums - are done modulo 65521. s1 is initialized to 1, s2 to zero. The - Adler-32 checksum is stored as s2*65536 + s1 in most- - significant-byte first (network) order." - - "8.2. The Adler-32 algorithm - - The Adler-32 algorithm is much faster than the CRC32 algorithm yet - still provides an extremely low probability of undetected errors. - - The modulo on unsigned long accumulators can be delayed for 5552 - bytes, so the modulo operation time is negligible. If the bytes - are a, b, c, the second sum is 3a + 2b + c + 3, and so is position - and order sensitive, unlike the first sum, which is just a - checksum. That 65521 is prime is important to avoid a possible - large class of two-byte errors that leave the check unchanged. - (The Fletcher checksum uses 255, which is not prime and which also - makes the Fletcher check insensitive to single byte changes 0 - - 255.) - - The sum s1 is initialized to 1 instead of zero to make the length - of the sequence part of s2, so that the length does not have to be - checked separately. (Any sequence of zeroes has a Fletcher - checksum of zero.)" - - - - - - - largest prime smaller than 65536 - - - - - The CRC data checksum so far. - - - - - Initialise a default instance of - - - - - Resets the Adler32 data checksum as if no update was ever called. - - - - - Returns the Adler32 data checksum computed so far. - - - - - Updates the checksum with the byte b. - - - The data value to add. The high byte of the int is ignored. - - - - - Updates the Adler32 data checksum with the bytes taken from - a block of data. - - Contains the data to update the checksum with. - - - - Update Adler32 data checksum based on a portion of a block of data - - - The chunk of data to add - - - - - CRC-32 with unreversed data and reversed output - - - Generate a table for a byte-wise 32-bit CRC calculation on the polynomial: - x^32+x^26+x^23+x^22+x^16+x^12+x^11+x^10+x^8+x^7+x^5+x^4+x^2+x^1+x^0. - - Polynomials over GF(2) are represented in binary, one bit per coefficient, - with the lowest powers in the most significant bit. Then adding polynomials - is just exclusive-or, and multiplying a polynomial by x is a right shift by - one. If we call the above polynomial p, and represent a byte as the - polynomial q, also with the lowest power in the most significant bit (so the - byte 0xb1 is the polynomial x^7+x^3+x+1), then the CRC is (q*x^32) mod p, - where a mod b means the remainder after dividing a by b. - - This calculation is done using the shift-register method of multiplying and - taking the remainder. The register is initialized to zero, and for each - incoming bit, x^32 is added mod p to the register if the bit is a one (where - x^32 mod p is p+x^32 = x^26+...+1), and the register is multiplied mod p by - x (which is shifting right by one and adding x^32 mod p if the bit shifted - out is a one). We start with the highest power (least significant bit) of - q and repeat for all eight bits of q. - - This implementation uses sixteen lookup tables stored in one linear array - to implement the slicing-by-16 algorithm, a variant of the slicing-by-8 - algorithm described in this Intel white paper: - - https://web.archive.org/web/20120722193753/http://download.intel.com/technology/comms/perfnet/download/slicing-by-8.pdf - - The first lookup table is simply the CRC of all possible eight bit values. - Each successive lookup table is derived from the original table generated - by Sarwate's algorithm. Slicing a 16-bit input and XORing the outputs - together will produce the same output as a byte-by-byte CRC loop with - fewer arithmetic and bit manipulation operations, at the cost of increased - memory consumed by the lookup tables. (Slicing-by-16 requires a 16KB table, - which is still small enough to fit in most processors' L1 cache.) - - - - - The CRC data checksum so far. - - - - - Initialise a default instance of - - - - - Resets the CRC data checksum as if no update was ever called. - - - - - Returns the CRC data checksum computed so far. - - Reversed Out = true - - - - Updates the checksum with the int bval. - - - the byte is taken as the lower 8 bits of bval - - Reversed Data = false - - - - Updates the CRC data checksum with the bytes taken from - a block of data. - - Contains the data to update the CRC with. - - - - Update CRC data checksum based on a portion of a block of data - - - The chunk of data to add - - - - - Internal helper function for updating a block of data using slicing. - - The array containing the data to add - Range start for (inclusive) - The number of bytes to checksum starting from - - - - A non-inlined function for updating data that doesn't fit in a 16-byte - block. We don't expect to enter this function most of the time, and when - we do we're not here for long, so disabling inlining here improves - performance overall. - - The array containing the data to add - Range start for (inclusive) - Range end for (exclusive) - - - - CRC-32 with reversed data and unreversed output - - - Generate a table for a byte-wise 32-bit CRC calculation on the polynomial: - x^32+x^26+x^23+x^22+x^16+x^12+x^11+x^10+x^8+x^7+x^5+x^4+x^2+x^1+x^0. - - Polynomials over GF(2) are represented in binary, one bit per coefficient, - with the lowest powers in the most significant bit. Then adding polynomials - is just exclusive-or, and multiplying a polynomial by x is a right shift by - one. If we call the above polynomial p, and represent a byte as the - polynomial q, also with the lowest power in the most significant bit (so the - byte 0xb1 is the polynomial x^7+x^3+x+1), then the CRC is (q*x^32) mod p, - where a mod b means the remainder after dividing a by b. - - This calculation is done using the shift-register method of multiplying and - taking the remainder. The register is initialized to zero, and for each - incoming bit, x^32 is added mod p to the register if the bit is a one (where - x^32 mod p is p+x^32 = x^26+...+1), and the register is multiplied mod p by - x (which is shifting right by one and adding x^32 mod p if the bit shifted - out is a one). We start with the highest power (least significant bit) of - q and repeat for all eight bits of q. - - This implementation uses sixteen lookup tables stored in one linear array - to implement the slicing-by-16 algorithm, a variant of the slicing-by-8 - algorithm described in this Intel white paper: - - https://web.archive.org/web/20120722193753/http://download.intel.com/technology/comms/perfnet/download/slicing-by-8.pdf - - The first lookup table is simply the CRC of all possible eight bit values. - Each successive lookup table is derived from the original table generated - by Sarwate's algorithm. Slicing a 16-bit input and XORing the outputs - together will produce the same output as a byte-by-byte CRC loop with - fewer arithmetic and bit manipulation operations, at the cost of increased - memory consumed by the lookup tables. (Slicing-by-16 requires a 16KB table, - which is still small enough to fit in most processors' L1 cache.) - - - - - The CRC data checksum so far. - - - - - Initialise a default instance of - - - - - Resets the CRC data checksum as if no update was ever called. - - - - - Returns the CRC data checksum computed so far. - - Reversed Out = false - - - - Updates the checksum with the int bval. - - - the byte is taken as the lower 8 bits of bval - - Reversed Data = true - - - - Updates the CRC data checksum with the bytes taken from - a block of data. - - Contains the data to update the CRC with. - - - - Update CRC data checksum based on a portion of a block of data - - - The chunk of data to add - - - - - Internal helper function for updating a block of data using slicing. - - The array containing the data to add - Range start for (inclusive) - The number of bytes to checksum starting from - - - - A non-inlined function for updating data that doesn't fit in a 16-byte - block. We don't expect to enter this function most of the time, and when - we do we're not here for long, so disabling inlining here improves - performance overall. - - The array containing the data to add - Range start for (inclusive) - Range end for (exclusive) - - - - The number of slicing lookup tables to generate. - - - - - Generates multiple CRC lookup tables for a given polynomial, stored - in a linear array of uints. The first block (i.e. the first 256 - elements) is the same as the byte-by-byte CRC lookup table. - - The generating CRC polynomial - Whether the polynomial is in reversed bit order - A linear array of 256 * elements - - This table could also be generated as a rectangular array, but the - JIT compiler generates slower code than if we use a linear array. - Known issue, see: https://github.com/dotnet/runtime/issues/30275 - - - - - Mixes the first four bytes of input with - using normal ordering before calling . - - Array of data to checksum - Offset to start reading from - The table to use for slicing-by-16 lookup - Checksum state before this update call - A new unfinalized checksum value - - - Assumes input[offset]..input[offset + 15] are valid array indexes. - For performance reasons, this must be checked by the caller. - - - - - Mixes the first four bytes of input with - using reflected ordering before calling . - - Array of data to checksum - Offset to start reading from - The table to use for slicing-by-16 lookup - Checksum state before this update call - A new unfinalized checksum value - - - Assumes input[offset]..input[offset + 15] are valid array indexes. - For performance reasons, this must be checked by the caller. - - - - - A shared method for updating an unfinalized CRC checksum using slicing-by-16. - - Array of data to checksum - Offset to start reading from - The table to use for slicing-by-16 lookup - First byte of input after mixing with the old CRC - Second byte of input after mixing with the old CRC - Third byte of input after mixing with the old CRC - Fourth byte of input after mixing with the old CRC - A new unfinalized checksum value - - - Even though the first four bytes of input are fed in as arguments, - should be the same value passed to this - function's caller (either or - ). This method will get inlined - into both functions, so using the same offset produces faster code. - - - Because most processors running C# have some kind of instruction-level - parallelism, the order of XOR operations can affect performance. This - ordering assumes that the assembly code generated by the just-in-time - compiler will emit a bunch of arithmetic operations for checking array - bounds. Then it opportunistically XORs a1 and a2 to keep the processor - busy while those other parts of the pipeline handle the range check - calculations. - - - - - - Interface to compute a data checksum used by checked input/output streams. - A data checksum can be updated by one byte or with a byte array. After each - update the value of the current checksum can be returned by calling - getValue. The complete checksum object can also be reset - so it can be used again with new data. - - - - - Resets the data checksum as if no update was ever called. - - - - - Returns the data checksum computed so far. - - - - - Adds one byte to the data checksum. - - - the data value to add. The high byte of the int is ignored. - - - - - Updates the data checksum with the bytes taken from the array. - - - buffer an array of bytes - - - - - Adds the byte array to the data checksum. - - - The chunk of data to add - - - - - Event arguments for scanning. - - - - - Initialise a new instance of - - The file or directory name. - - - - The file or directory name for this event. - - - - - Get set a value indicating if scanning should continue or not. - - - - - Event arguments during processing of a single file or directory. - - - - - Initialise a new instance of - - The file or directory name if known. - The number of bytes processed so far - The total number of bytes to process, 0 if not known - - - - The name for this event if known. - - - - - Get set a value indicating whether scanning should continue or not. - - - - - Get a percentage representing how much of the has been processed - - 0.0 to 100.0 percent; 0 if target is not known. - - - - The number of bytes processed so far - - - - - The number of bytes to process. - - Target may be 0 or negative if the value isnt known. - - - - Event arguments for directories. - - - - - Initialize an instance of . - - The name for this directory. - Flag value indicating if any matching files are contained in this directory. - - - - Get a value indicating if the directory contains any matching files or not. - - - - - Arguments passed when scan failures are detected. - - - - - Initialise a new instance of - - The name to apply. - The exception to use. - - - - The applicable name. - - - - - The applicable exception. - - - - - Get / set a value indicating whether scanning should continue. - - - - - Delegate invoked before starting to process a file. - - The source of the event - The event arguments. - - - - Delegate invoked during processing of a file or directory - - The source of the event - The event arguments. - - - - Delegate invoked when a file has been completely processed. - - The source of the event - The event arguments. - - - - Delegate invoked when a directory failure is detected. - - The source of the event - The event arguments. - - - - Delegate invoked when a file failure is detected. - - The source of the event - The event arguments. - - - - FileSystemScanner provides facilities scanning of files and directories. - - - - - Initialise a new instance of - - The file filter to apply when scanning. - - - - Initialise a new instance of - - The file filter to apply. - The directory filter to apply. - - - - Initialise a new instance of - - The file filter to apply. - - - - Initialise a new instance of - - The file filter to apply. - The directory filter to apply. - - - - Delegate to invoke when a directory is processed. - - - - - Delegate to invoke when a file is processed. - - - - - Delegate to invoke when processing for a file has finished. - - - - - Delegate to invoke when a directory failure is detected. - - - - - Delegate to invoke when a file failure is detected. - - - - - Raise the DirectoryFailure event. - - The directory name. - The exception detected. - - - - Raise the FileFailure event. - - The file name. - The exception detected. - - - - Raise the ProcessFile event. - - The file name. - - - - Raise the complete file event - - The file name - - - - Raise the ProcessDirectory event. - - The directory name. - Flag indicating if the directory has matching files. - - - - Scan a directory. - - The base directory to scan. - True to recurse subdirectories, false to scan a single directory. - - - - The file filter currently in use. - - - - - The directory filter currently in use. - - - - - Flag indicating if scanning should continue running. - - - - - INameTransform defines how file system names are transformed for use with archives, or vice versa. - - - - - Given a file name determine the transformed value. - - The name to transform. - The transformed file name. - - - - Given a directory name determine the transformed value. - - The name to transform. - The transformed directory name - - - - InvalidNameException is thrown for invalid names such as directory traversal paths and names with invalid characters - - - - - Initializes a new instance of the InvalidNameException class with a default error message. - - - - - Initializes a new instance of the InvalidNameException class with a specified error message. - - A message describing the exception. - - - - Initializes a new instance of the InvalidNameException class with a specified - error message and a reference to the inner exception that is the cause of this exception. - - A message describing the exception. - The inner exception - - - - Initializes a new instance of the InvalidNameException class with serialized data. - - - The System.Runtime.Serialization.SerializationInfo that holds the serialized - object data about the exception being thrown. - - - The System.Runtime.Serialization.StreamingContext that contains contextual information - about the source or destination. - - - - - Scanning filters support filtering of names. - - - - - Test a name to see if it 'matches' the filter. - - The name to test. - Returns true if the name matches the filter, false if it does not match. - - - - NameFilter is a string matching class which allows for both positive and negative - matching. - A filter is a sequence of independant regular expressions separated by semi-colons ';'. - To include a semi-colon it may be quoted as in \;. Each expression can be prefixed by a plus '+' sign or - a minus '-' sign to denote the expression is intended to include or exclude names. - If neither a plus or minus sign is found include is the default. - A given name is tested for inclusion before checking exclusions. Only names matching an include spec - and not matching an exclude spec are deemed to match the filter. - An empty filter matches any name. - - The following expression includes all name ending in '.dat' with the exception of 'dummy.dat' - "+\.dat$;-^dummy\.dat$" - - - - - Construct an instance based on the filter expression passed - - The filter expression. - - - - Test a string to see if it is a valid regular expression. - - The expression to test. - True if expression is a valid false otherwise. - - - - Test an expression to see if it is valid as a filter. - - The filter expression to test. - True if the expression is valid, false otherwise. - - - - Split a string into its component pieces - - The original string - Returns an array of values containing the individual filter elements. - - - - Convert this filter to its string equivalent. - - The string equivalent for this filter. - - - - Test a value to see if it is included by the filter. - - The value to test. - True if the value is included, false otherwise. - - - - Test a value to see if it is excluded by the filter. - - The value to test. - True if the value is excluded, false otherwise. - - - - Test a value to see if it matches the filter. - - The value to test. - True if the value matches, false otherwise. - - - - Compile this filter. - - - - - PathFilter filters directories and files using a form of regular expressions - by full path name. - See NameFilter for more detail on filtering. - - - - - Initialise a new instance of . - - The filter expression to apply. - - - - Test a name to see if it matches the filter. - - The name to test. - True if the name matches, false otherwise. - is used to get the full path before matching. - - - - ExtendedPathFilter filters based on name, file size, and the last write time of the file. - - Provides an example of how to customise filtering. - - - - Initialise a new instance of ExtendedPathFilter. - - The filter to apply. - The minimum file size to include. - The maximum file size to include. - - - - Initialise a new instance of ExtendedPathFilter. - - The filter to apply. - The minimum to include. - The maximum to include. - - - - Initialise a new instance of ExtendedPathFilter. - - The filter to apply. - The minimum file size to include. - The maximum file size to include. - The minimum to include. - The maximum to include. - - - - Test a filename to see if it matches the filter. - - The filename to test. - True if the filter matches, false otherwise. - The doesnt exist - - - - Get/set the minimum size/length for a file that will match this filter. - - The default value is zero. - value is less than zero; greater than - - - - Get/set the maximum size/length for a file that will match this filter. - - The default value is - value is less than zero or less than - - - - Get/set the minimum value that will match for this filter. - - Files with a LastWrite time less than this value are excluded by the filter. - - - - Get/set the maximum value that will match for this filter. - - Files with a LastWrite time greater than this value are excluded by the filter. - - - - NameAndSizeFilter filters based on name and file size. - - A sample showing how filters might be extended. - - - - Initialise a new instance of NameAndSizeFilter. - - The filter to apply. - The minimum file size to include. - The maximum file size to include. - - - - Test a filename to see if it matches the filter. - - The filename to test. - True if the filter matches, false otherwise. - - - - Get/set the minimum size for a file that will match this filter. - - - - - Get/set the maximum size for a file that will match this filter. - - - - - PathUtils provides simple utilities for handling paths. - - - - - Remove any path root present in the path - - A containing path information. - The path with the root removed if it was present; path otherwise. - - - - Returns a random file name in the users temporary directory, or in directory of if specified - - If specified, used as the base file name for the temporary file - Returns a temporary file name - - - - Provides simple " utilities. - - - - - Read from a ensuring all the required data is read. - - The stream to read. - The buffer to fill. - - - - - Read from a " ensuring all the required data is read. - - The stream to read data from. - The buffer to store data in. - The offset at which to begin storing data. - The number of bytes of data to store. - Required parameter is null - and or are invalid. - End of stream is encountered before all the data has been read. - - - - Read as much data as possible from a ", up to the requested number of bytes - - The stream to read data from. - The buffer to store data in. - The offset at which to begin storing data. - The number of bytes of data to store. - Required parameter is null - and or are invalid. - - - - Copy the contents of one to another. - - The stream to source data from. - The stream to write data to. - The buffer to use during copying. - - - - Copy the contents of one to another. - - The stream to source data from. - The stream to write data to. - The buffer to use during copying. - The progress handler delegate to use. - The minimum between progress updates. - The source for this event. - The name to use with the event. - This form is specialised for use within #Zip to support events during archive operations. - - - - Copy the contents of one to another. - - The stream to source data from. - The stream to write data to. - The buffer to use during copying. - The progress handler delegate to use. - The minimum between progress updates. - The source for this event. - The name to use with the event. - A predetermined fixed target value to use with progress updates. - If the value is negative the target is calculated by looking at the stream. - This form is specialised for use within #Zip to support events during archive operations. - - - - Initialise an instance of - - - - - SharpZipBaseException is the base exception class for SharpZipLib. - All library exceptions are derived from this. - - NOTE: Not all exceptions thrown will be derived from this class. - A variety of other exceptions are possible for example - - - - Initializes a new instance of the SharpZipBaseException class. - - - - - Initializes a new instance of the SharpZipBaseException class with a specified error message. - - A message describing the exception. - - - - Initializes a new instance of the SharpZipBaseException class with a specified - error message and a reference to the inner exception that is the cause of this exception. - - A message describing the exception. - The inner exception - - - - Initializes a new instance of the SharpZipBaseException class with serialized data. - - - The System.Runtime.Serialization.SerializationInfo that holds the serialized - object data about the exception being thrown. - - - The System.Runtime.Serialization.StreamingContext that contains contextual information - about the source or destination. - - - - - Indicates that an error occurred during decoding of a input stream due to corrupt - data or (unintentional) library incompatibility. - - - - - Initializes a new instance of the StreamDecodingException with a generic message - - - - - Initializes a new instance of the StreamDecodingException class with a specified error message. - - A message describing the exception. - - - - Initializes a new instance of the StreamDecodingException class with a specified - error message and a reference to the inner exception that is the cause of this exception. - - A message describing the exception. - The inner exception - - - - Initializes a new instance of the StreamDecodingException class with serialized data. - - - The System.Runtime.Serialization.SerializationInfo that holds the serialized - object data about the exception being thrown. - - - The System.Runtime.Serialization.StreamingContext that contains contextual information - about the source or destination. - - - - - Indicates that the input stream could not decoded due to known library incompability or missing features - - - - - Initializes a new instance of the StreamUnsupportedException with a generic message - - - - - Initializes a new instance of the StreamUnsupportedException class with a specified error message. - - A message describing the exception. - - - - Initializes a new instance of the StreamUnsupportedException class with a specified - error message and a reference to the inner exception that is the cause of this exception. - - A message describing the exception. - The inner exception - - - - Initializes a new instance of the StreamUnsupportedException class with serialized data. - - - The System.Runtime.Serialization.SerializationInfo that holds the serialized - object data about the exception being thrown. - - - The System.Runtime.Serialization.StreamingContext that contains contextual information - about the source or destination. - - - - - Indicates that the input stream could not decoded due to the stream ending before enough data had been provided - - - - - Initializes a new instance of the UnexpectedEndOfStreamException with a generic message - - - - - Initializes a new instance of the UnexpectedEndOfStreamException class with a specified error message. - - A message describing the exception. - - - - Initializes a new instance of the UnexpectedEndOfStreamException class with a specified - error message and a reference to the inner exception that is the cause of this exception. - - A message describing the exception. - The inner exception - - - - Initializes a new instance of the UnexpectedEndOfStreamException class with serialized data. - - - The System.Runtime.Serialization.SerializationInfo that holds the serialized - object data about the exception being thrown. - - - The System.Runtime.Serialization.StreamingContext that contains contextual information - about the source or destination. - - - - - Indicates that a value was outside of the expected range when decoding an input stream - - - - - Initializes a new instance of the ValueOutOfRangeException class naming the causing variable - - Name of the variable, use: nameof() - - - - Initializes a new instance of the ValueOutOfRangeException class naming the causing variable, - it's current value and expected range. - - Name of the variable, use: nameof() - The invalid value - Expected maximum value - Expected minimum value - - - - Initializes a new instance of the ValueOutOfRangeException class naming the causing variable, - it's current value and expected range. - - Name of the variable, use: nameof() - The invalid value - Expected maximum value - Expected minimum value - - - - Initializes a new instance of the ValueOutOfRangeException class with serialized data. - - - The System.Runtime.Serialization.SerializationInfo that holds the serialized - object data about the exception being thrown. - - - The System.Runtime.Serialization.StreamingContext that contains contextual information - about the source or destination. - - - - - PkzipClassic embodies the classic or original encryption facilities used in Pkzip archives. - While it has been superceded by more recent and more powerful algorithms, its still in use and - is viable for preventing casual snooping - - - - - Generates new encryption keys based on given seed - - The seed value to initialise keys with. - A new key value. - - - - PkzipClassicCryptoBase provides the low level facilities for encryption - and decryption using the PkzipClassic algorithm. - - - - - Transform a single byte - - - The transformed value - - - - - Set the key schedule for encryption/decryption. - - The data use to set the keys from. - - - - Update encryption keys - - - - - Reset the internal state. - - - - - PkzipClassic CryptoTransform for encryption. - - - - - Initialise a new instance of - - The key block to use. - - - - Transforms the specified region of the specified byte array. - - The input for which to compute the transform. - The offset into the byte array from which to begin using data. - The number of bytes in the byte array to use as data. - The computed transform. - - - - Transforms the specified region of the input byte array and copies - the resulting transform to the specified region of the output byte array. - - The input for which to compute the transform. - The offset into the input byte array from which to begin using data. - The number of bytes in the input byte array to use as data. - The output to which to write the transform. - The offset into the output byte array from which to begin writing data. - The number of bytes written. - - - - Gets a value indicating whether the current transform can be reused. - - - - - Gets the size of the input data blocks in bytes. - - - - - Gets the size of the output data blocks in bytes. - - - - - Gets a value indicating whether multiple blocks can be transformed. - - - - - Cleanup internal state. - - - - - PkzipClassic CryptoTransform for decryption. - - - - - Initialise a new instance of . - - The key block to decrypt with. - - - - Transforms the specified region of the specified byte array. - - The input for which to compute the transform. - The offset into the byte array from which to begin using data. - The number of bytes in the byte array to use as data. - The computed transform. - - - - Transforms the specified region of the input byte array and copies - the resulting transform to the specified region of the output byte array. - - The input for which to compute the transform. - The offset into the input byte array from which to begin using data. - The number of bytes in the input byte array to use as data. - The output to which to write the transform. - The offset into the output byte array from which to begin writing data. - The number of bytes written. - - - - Gets a value indicating whether the current transform can be reused. - - - - - Gets the size of the input data blocks in bytes. - - - - - Gets the size of the output data blocks in bytes. - - - - - Gets a value indicating whether multiple blocks can be transformed. - - - - - Cleanup internal state. - - - - - Defines a wrapper object to access the Pkzip algorithm. - This class cannot be inherited. - - - - - Get / set the applicable block size in bits. - - The only valid block size is 8. - - - - Get an array of legal key sizes. - - - - - Generate an initial vector. - - - - - Get an array of legal block sizes. - - - - - Get / set the key value applicable. - - - - - Generate a new random key. - - - - - Create an encryptor. - - The key to use for this encryptor. - Initialisation vector for the new encryptor. - Returns a new PkzipClassic encryptor - - - - Create a decryptor. - - Keys to use for this new decryptor. - Initialisation vector for the new decryptor. - Returns a new decryptor. - - - - Encrypts and decrypts AES ZIP - - - Based on information from http://www.winzip.com/aes_info.htm - and http://www.gladman.me.uk/cryptography_technology/fileencrypt/ - - - - - Constructor - - The stream on which to perform the cryptographic transformation. - Instance of ZipAESTransform - Read or Write - - - - Reads a sequence of bytes from the current CryptoStream into buffer, - and advances the position within the stream by the number of bytes read. - - - - - - - - Writes a sequence of bytes to the current stream and advances the current position within this stream by the number of bytes written. - - An array of bytes. This method copies count bytes from buffer to the current stream. - The byte offset in buffer at which to begin copying bytes to the current stream. - The number of bytes to be written to the current stream. - - - - Transforms stream using AES in CTR mode - - - - - Constructor. - - Password string - Random bytes, length depends on encryption strength. - 128 bits = 8 bytes, 192 bits = 12 bytes, 256 bits = 16 bytes. - The encryption strength, in bytes eg 16 for 128 bits. - True when creating a zip, false when reading. For the AuthCode. - - - - - Implement the ICryptoTransform method. - - - - - Returns the 2 byte password verifier - - - - - Returns the 10 byte AUTH CODE to be checked or appended immediately following the AES data stream. - - - - - Not implemented. - - - - - Gets the size of the input data blocks in bytes. - - - - - Gets the size of the output data blocks in bytes. - - - - - Gets a value indicating whether multiple blocks can be transformed. - - - - - Gets a value indicating whether the current transform can be reused. - - - - - Cleanup internal state. - - - - - An example class to demonstrate compression and decompression of GZip streams. - - - - - Decompress the input writing - uncompressed data to the output stream - - The readable stream containing data to decompress. - The output stream to receive the decompressed data. - Both streams are closed on completion if true. - Input or output stream is null - - - - Compress the input stream sending - result data to output stream - - The readable stream to compress. - The output stream to receive the compressed data. - Both streams are closed on completion if true. - Deflate buffer size, minimum 512 - Deflate compression level, 0-9 - Input or output stream is null - Buffer Size is smaller than 512 - Compression level outside 0-9 - - - - This class contains constants used for gzip. - - - - - First GZip identification byte - - - - - Second GZip identification byte - - - - - Deflate compression method - - - - - Get the GZip specified encoding (CP-1252 if supported, otherwise ASCII) - - - - - GZip header flags - - - - - Text flag hinting that the file is in ASCII - - - - - CRC flag indicating that a CRC16 preceeds the data - - - - - Extra flag indicating that extra fields are present - - - - - Filename flag indicating that the original filename is present - - - - - Flag bit mask indicating that a comment is present - - - - - GZipException represents exceptions specific to GZip classes and code. - - - - - Initialise a new instance of . - - - - - Initialise a new instance of with its message string. - - A that describes the error. - - - - Initialise a new instance of . - - A that describes the error. - The that caused this exception. - - - - Initializes a new instance of the GZipException class with serialized data. - - - The System.Runtime.Serialization.SerializationInfo that holds the serialized - object data about the exception being thrown. - - - The System.Runtime.Serialization.StreamingContext that contains contextual information - about the source or destination. - - - - - This filter stream is used to decompress a "GZIP" format stream. - The "GZIP" format is described baseInputStream RFC 1952. - - author of the original java version : John Leuner - - This sample shows how to unzip a gzipped file - - using System; - using System.IO; - - using StarkWebGL.SharpZipLib.Core; - using StarkWebGL.SharpZipLib.GZip; - - class MainClass - { - public static void Main(string[] args) - { - using (Stream inStream = new GZipInputStream(File.OpenRead(args[0]))) - using (FileStream outStream = File.Create(Path.GetFileNameWithoutExtension(args[0]))) { - byte[] buffer = new byte[4096]; - StreamUtils.Copy(inStream, outStream, buffer); - } - } - } - - - - - - CRC-32 value for uncompressed data - - - - - Flag to indicate if we've read the GZIP header yet for the current member (block of compressed data). - This is tracked per-block as the file is parsed. - - - - - Flag to indicate if at least one block in a stream with concatenated blocks was read successfully. - This allows us to exit gracefully if downstream data is not in gzip format. - - - - - Creates a GZipInputStream with the default buffer size - - - The stream to read compressed data from (baseInputStream GZIP format) - - - - - Creates a GZIPInputStream with the specified buffer size - - - The stream to read compressed data from (baseInputStream GZIP format) - - - Size of the buffer to use - - - - - Reads uncompressed data into an array of bytes - - - The buffer to read uncompressed data into - - - The offset indicating where the data should be placed - - - The number of uncompressed bytes to be read - - Returns the number of bytes actually read. - - - - Retrieves the filename header field for the block last read - - - - - - This filter stream is used to compress a stream into a "GZIP" stream. - The "GZIP" format is described in RFC 1952. - - author of the original java version : John Leuner - - This sample shows how to gzip a file - - using System; - using System.IO; - - using StarkWebGL.SharpZipLib.GZip; - using StarkWebGL.SharpZipLib.Core; - - class MainClass - { - public static void Main(string[] args) - { - using (Stream s = new GZipOutputStream(File.Create(args[0] + ".gz"))) - using (FileStream fs = File.OpenRead(args[0])) { - byte[] writeData = new byte[4096]; - Streamutils.Copy(s, fs, writeData); - } - } - } - } - - - - - - CRC-32 value for uncompressed data - - - - - Creates a GzipOutputStream with the default buffer size - - - The stream to read data (to be compressed) from - - - - - Creates a GZipOutputStream with the specified buffer size - - - The stream to read data (to be compressed) from - - - Size of the buffer to use - - - - - Sets the active compression level (0-9). The new level will be activated - immediately. - - The compression level to set. - - Level specified is not supported. - - - - - - Get the current compression level. - - The current compression level. - - - - Original filename - - - - - Write given buffer to output updating crc - - Buffer to write - Offset of first byte in buf to write - Number of bytes to write - - - - Writes remaining compressed output data to the output stream - and closes it. - - - - - Flushes the stream by ensuring the header is written, and then calling Flush - on the deflater. - - - - - Finish compression and write any footer information required to stream - - - - - This class contains constants used for LZW - - - - - Magic number found at start of LZW header: 0x1f 0x9d - - - - - Maximum number of bits per code - - - - - Mask for 'number of compression bits' - - - - - Indicates the presence of a fourth header byte - - - - - Reserved bits - - - - - Block compression: if table is full and compression rate is dropping, - clear the dictionary. - - - - - LZW file header size (in bytes) - - - - - Initial number of bits per code - - - - - LzwException represents exceptions specific to LZW classes and code. - - - - - Initialise a new instance of . - - - - - Initialise a new instance of with its message string. - - A that describes the error. - - - - Initialise a new instance of . - - A that describes the error. - The that caused this exception. - - - - Initializes a new instance of the LzwException class with serialized data. - - - The System.Runtime.Serialization.SerializationInfo that holds the serialized - object data about the exception being thrown. - - - The System.Runtime.Serialization.StreamingContext that contains contextual information - about the source or destination. - - - - - This filter stream is used to decompress a LZW format stream. - Specifically, a stream that uses the LZC compression method. - This file format is usually associated with the .Z file extension. - - See http://en.wikipedia.org/wiki/Compress - See http://wiki.wxwidgets.org/Development:_Z_File_Format - - The file header consists of 3 (or optionally 4) bytes. The first two bytes - contain the magic marker "0x1f 0x9d", followed by a byte of flags. - - Based on Java code by Ronald Tschalar, which in turn was based on the unlzw.c - code in the gzip package. - - This sample shows how to unzip a compressed file - - using System; - using System.IO; - - using StarkWebGL.SharpZipLib.Core; - using StarkWebGL.SharpZipLib.LZW; - - class MainClass - { - public static void Main(string[] args) - { - using (Stream inStream = new LzwInputStream(File.OpenRead(args[0]))) - using (FileStream outStream = File.Create(Path.GetFileNameWithoutExtension(args[0]))) { - byte[] buffer = new byte[4096]; - StreamUtils.Copy(inStream, outStream, buffer); - // OR - inStream.Read(buffer, 0, buffer.Length); - // now do something with the buffer - } - } - } - - - - - - Gets or sets a flag indicating ownership of underlying stream. - When the flag is true will close the underlying stream also. - - The default value is true. - - - - Creates a LzwInputStream - - - The stream to read compressed data from (baseInputStream LZW format) - - - - - See - - - - - - Reads decompressed data into the provided buffer byte array - - - The array to read and decompress data into - - - The offset indicating where the data should be placed - - - The number of bytes to decompress - - The number of bytes read. Zero signals the end of stream - - - - Moves the unread data in the buffer to the beginning and resets - the pointers. - - - - - - - Gets a value indicating whether the current stream supports reading - - - - - Gets a value of false indicating seeking is not supported for this stream. - - - - - Gets a value of false indicating that this stream is not writeable. - - - - - A value representing the length of the stream in bytes. - - - - - The current position within the stream. - Throws a NotSupportedException when attempting to set the position - - Attempting to set the position - - - - Flushes the baseInputStream - - - - - Sets the position within the current stream - Always throws a NotSupportedException - - The relative offset to seek to. - The defining where to seek from. - The new position in the stream. - Any access - - - - Set the length of the current stream - Always throws a NotSupportedException - - The new length value for the stream. - Any access - - - - Writes a sequence of bytes to stream and advances the current position - This method always throws a NotSupportedException - - The buffer containing data to write. - The offset of the first byte to write. - The number of bytes to write. - Any access - - - - Writes one byte to the current stream and advances the current position - Always throws a NotSupportedException - - The byte to write. - Any access - - - - Closes the input stream. When - is true the underlying stream is also closed. - - - - - Flag indicating wether this instance has been closed or not. - - - - - This exception is used to indicate that there is a problem - with a TAR archive header. - - - - - Initialise a new instance of the InvalidHeaderException class. - - - - - Initialises a new instance of the InvalidHeaderException class with a specified message. - - Message describing the exception cause. - - - - Initialise a new instance of InvalidHeaderException - - Message describing the problem. - The exception that is the cause of the current exception. - - - - Initializes a new instance of the InvalidHeaderException class with serialized data. - - - The System.Runtime.Serialization.SerializationInfo that holds the serialized - object data about the exception being thrown. - - - The System.Runtime.Serialization.StreamingContext that contains contextual information - about the source or destination. - - - - - Used to advise clients of 'events' while processing archives - - - - - The TarArchive class implements the concept of a - 'Tape Archive'. A tar archive is a series of entries, each of - which represents a file system object. Each entry in - the archive consists of a header block followed by 0 or more data blocks. - Directory entries consist only of the header block, and are followed by entries - for the directory's contents. File entries consist of a - header followed by the number of blocks needed to - contain the file's contents. All entries are written on - block boundaries. Blocks are 512 bytes long. - - TarArchives are instantiated in either read or write mode, - based upon whether they are instantiated with an InputStream - or an OutputStream. Once instantiated TarArchives read/write - mode can not be changed. - - There is currently no support for random access to tar archives. - However, it seems that subclassing TarArchive, and using the - TarBuffer.CurrentRecord and TarBuffer.CurrentBlock - properties, this would be rather trivial. - - - - - Client hook allowing detailed information to be reported during processing - - - - - Raises the ProgressMessage event - - The TarEntry for this event - message for this event. Null is no message - - - - Constructor for a default . - - - - - Initialise a TarArchive for input. - - The to use for input. - - - - Initialise a TarArchive for output. - - The to use for output. - - - - The InputStream based constructors create a TarArchive for the - purposes of extracting or listing a tar archive. Thus, use - these constructors when you wish to extract files from or list - the contents of an existing tar archive. - - The stream to retrieve archive data from. - Returns a new suitable for reading from. - - - - The InputStream based constructors create a TarArchive for the - purposes of extracting or listing a tar archive. Thus, use - these constructors when you wish to extract files from or list - the contents of an existing tar archive. - - The stream to retrieve archive data from. - The used for the Name fields, or null for ASCII only - Returns a new suitable for reading from. - - - - Create TarArchive for reading setting block factor - - A stream containing the tar archive contents - The blocking factor to apply - Returns a suitable for reading. - - - - Create TarArchive for reading setting block factor - - A stream containing the tar archive contents - The blocking factor to apply - The used for the Name fields, or null for ASCII only - Returns a suitable for reading. - - - - Create a TarArchive for writing to, using the default blocking factor - - The to write to - The used for the Name fields, or null for ASCII only - Returns a suitable for writing. - - - - Create a TarArchive for writing to, using the default blocking factor - - The to write to - Returns a suitable for writing. - - - - Create a tar archive for writing. - - The stream to write to - The blocking factor to use for buffering. - Returns a suitable for writing. - - - - Create a tar archive for writing. - - The stream to write to - The blocking factor to use for buffering. - The used for the Name fields, or null for ASCII only - Returns a suitable for writing. - - - - Set the flag that determines whether existing files are - kept, or overwritten during extraction. - - - If true, do not overwrite existing files. - - - - - Get/set the ascii file translation flag. If ascii file translation - is true, then the file is checked to see if it a binary file or not. - If the flag is true and the test indicates it is ascii text - file, it will be translated. The translation converts the local - operating system's concept of line ends into the UNIX line end, - '\n', which is the defacto standard for a TAR archive. This makes - text files compatible with UNIX. - - - - - Set the ascii file translation flag. - - - If true, translate ascii text files. - - - - - PathPrefix is added to entry names as they are written if the value is not null. - A slash character is appended after PathPrefix - - - - - RootPath is removed from entry names if it is found at the - beginning of the name. - - - - - Set user and group information that will be used to fill in the - tar archive's entry headers. This information is based on that available - for the linux operating system, which is not always available on other - operating systems. TarArchive allows the programmer to specify values - to be used in their place. - is set to true by this call. - - - The user id to use in the headers. - - - The user name to use in the headers. - - - The group id to use in the headers. - - - The group name to use in the headers. - - - - - Get or set a value indicating if overrides defined by SetUserInfo should be applied. - - If overrides are not applied then the values as set in each header will be used. - - - - Get the archive user id. - See ApplyUserInfoOverrides for detail - on how to allow setting values on a per entry basis. - - - The current user id. - - - - - Get the archive user name. - See ApplyUserInfoOverrides for detail - on how to allow setting values on a per entry basis. - - - The current user name. - - - - - Get the archive group id. - See ApplyUserInfoOverrides for detail - on how to allow setting values on a per entry basis. - - - The current group id. - - - - - Get the archive group name. - See ApplyUserInfoOverrides for detail - on how to allow setting values on a per entry basis. - - - The current group name. - - - - - Get the archive's record size. Tar archives are composed of - a series of RECORDS each containing a number of BLOCKS. - This allowed tar archives to match the IO characteristics of - the physical device being used. Archives are expected - to be properly "blocked". - - - The record size this archive is using. - - - - - Sets the IsStreamOwner property on the underlying stream. - Set this to false to prevent the Close of the TarArchive from closing the stream. - - - - - Close the archive. - - - - - Perform the "list" command for the archive contents. - - NOTE That this method uses the progress event to actually list - the contents. If the progress display event is not set, nothing will be listed! - - - - - Perform the "extract" command and extract the contents of the archive. - - - The destination directory into which to extract. - - - - - Perform the "extract" command and extract the contents of the archive. - - - The destination directory into which to extract. - - Allow parent directory traversal in file paths (e.g. ../file) - - - - Extract an entry from the archive. This method assumes that the - tarIn stream has been properly set with a call to GetNextEntry(). - - - The destination directory into which to extract. - - - The TarEntry returned by tarIn.GetNextEntry(). - - Allow parent directory traversal in file paths (e.g. ../file) - - - - Write an entry to the archive. This method will call the putNextEntry - and then write the contents of the entry, and finally call closeEntry() - for entries that are files. For directories, it will call putNextEntry(), - and then, if the recurse flag is true, process each entry that is a - child of the directory. - - - The TarEntry representing the entry to write to the archive. - - - If true, process the children of directory entries. - - - - - Write an entry to the archive. This method will call the putNextEntry - and then write the contents of the entry, and finally call closeEntry() - for entries that are files. For directories, it will call putNextEntry(), - and then, if the recurse flag is true, process each entry that is a - child of the directory. - - - The TarEntry representing the entry to write to the archive. - - - If true, process the children of directory entries. - - - - - Performs application-defined tasks associated with freeing, releasing, or resetting unmanaged resources. - - - - - Releases the unmanaged resources used by the FileStream and optionally releases the managed resources. - - true to release both managed and unmanaged resources; - false to release only unmanaged resources. - - - - Closes the archive and releases any associated resources. - - - - - Ensures that resources are freed and other cleanup operations are performed - when the garbage collector reclaims the . - - - - - The TarBuffer class implements the tar archive concept - of a buffered input stream. This concept goes back to the - days of blocked tape drives and special io devices. In the - C# universe, the only real function that this class - performs is to ensure that files have the correct "record" - size, or other tars will complain. -

- You should never have a need to access this class directly. - TarBuffers are created by Tar IO Streams. -

-
-
- - - The size of a block in a tar archive in bytes. - - This is 512 bytes. - - - - The number of blocks in a default record. - - - The default value is 20 blocks per record. - - - - - The size in bytes of a default record. - - - The default size is 10KB. - - - - - Get the record size for this buffer - - The record size in bytes. - This is equal to the multiplied by the - - - - Get the TAR Buffer's record size. - - The record size in bytes. - This is equal to the multiplied by the - - - - Get the Blocking factor for the buffer - - This is the number of blocks in each record. - - - - Get the TAR Buffer's block factor - - The block factor; the number of blocks per record. - - - - Construct a default TarBuffer - - - - - Create TarBuffer for reading with default BlockFactor - - Stream to buffer - A new suitable for input. - - - - Construct TarBuffer for reading inputStream setting BlockFactor - - Stream to buffer - Blocking factor to apply - A new suitable for input. - - - - Construct TarBuffer for writing with default BlockFactor - - output stream for buffer - A new suitable for output. - - - - Construct TarBuffer for writing Tar output to streams. - - Output stream to write to. - Blocking factor to apply - A new suitable for output. - - - - Initialization common to all constructors. - - - - - Determine if an archive block indicates End of Archive. End of - archive is indicated by a block that consists entirely of null bytes. - All remaining blocks for the record should also be null's - However some older tars only do a couple of null blocks (Old GNU tar for one) - and also partial records - - The data block to check. - Returns true if the block is an EOF block; false otherwise. - - - - Determine if an archive block indicates the End of an Archive has been reached. - End of archive is indicated by a block that consists entirely of null bytes. - All remaining blocks for the record should also be null's - However some older tars only do a couple of null blocks (Old GNU tar for one) - and also partial records - - The data block to check. - Returns true if the block is an EOF block; false otherwise. - - - - Skip over a block on the input stream. - - - - - Read a block from the input stream. - - - The block of data read. - - - - - Read a record from data stream. - - - false if End-Of-File, else true. - - - - - Get the current block number, within the current record, zero based. - - Block numbers are zero based values - - - - - Gets or sets a flag indicating ownership of underlying stream. - When the flag is true will close the underlying stream also. - - The default value is true. - - - - Get the current block number, within the current record, zero based. - - - The current zero based block number. - - - The absolute block number = (record number * block factor) + block number. - - - - - Get the current record number. - - - The current zero based record number. - - - - - Get the current record number. - - - The current zero based record number. - - - - - Write a block of data to the archive. - - - The data to write to the archive. - - - - - Write an archive record to the archive, where the record may be - inside of a larger array buffer. The buffer must be "offset plus - record size" long. - - - The buffer containing the record data to write. - - - The offset of the record data within buffer. - - - - - Write a TarBuffer record to the archive. - - - - - WriteFinalRecord writes the current record buffer to output any unwritten data is present. - - Any trailing bytes are set to zero which is by definition correct behaviour - for the end of a tar stream. - - - - Close the TarBuffer. If this is an output buffer, also flush the - current block before closing. - - - - - This class represents an entry in a Tar archive. It consists - of the entry's header, as well as the entry's File. Entries - can be instantiated in one of three ways, depending on how - they are to be used. -

- TarEntries that are created from the header bytes read from - an archive are instantiated with the TarEntry( byte[] ) - constructor. These entries will be used when extracting from - or listing the contents of an archive. These entries have their - header filled in using the header bytes. They also set the File - to null, since they reference an archive entry not a file.

-

- TarEntries that are created from files that are to be written - into an archive are instantiated with the CreateEntryFromFile(string) - pseudo constructor. These entries have their header filled in using - the File's information. They also keep a reference to the File - for convenience when writing entries.

-

- Finally, TarEntries can be constructed from nothing but a name. - This allows the programmer to construct the entry by hand, for - instance when only an InputStream is available for writing to - the archive, and the header information is constructed from - other information. In this case the header fields are set to - defaults and the File is set to null.

- -
-
- - - Initialise a default instance of . - - - - - Construct an entry from an archive's header bytes. File is set - to null. - - - The header bytes from a tar archive entry. - - - - - Construct an entry from an archive's header bytes. File is set - to null. - - - The header bytes from a tar archive entry. - - - The used for the Name fields, or null for ASCII only - - - - - Construct a TarEntry using the header provided - - Header details for entry - - - - Clone this tar entry. - - Returns a clone of this entry. - - - - Construct an entry with only a name. - This allows the programmer to construct the entry's header "by hand". - - The name to use for the entry - Returns the newly created - - - - Construct an entry for a file. File is set to file, and the - header is constructed from information from the file. - - The file name that the entry represents. - Returns the newly created - - - - Determine if the two entries are equal. Equality is determined - by the header names being equal. - - The to compare with the current Object. - - True if the entries are equal; false if not. - - - - - Derive a Hash value for the current - - A Hash code for the current - - - - Determine if the given entry is a descendant of this entry. - Descendancy is determined by the name of the descendant - starting with this entry's name. - - - Entry to be checked as a descendent of this. - - - True if entry is a descendant of this. - - - - - Get this entry's header. - - - This entry's TarHeader. - - - - - Get/Set this entry's name. - - - - - Get/set this entry's user id. - - - - - Get/set this entry's group id. - - - - - Get/set this entry's user name. - - - - - Get/set this entry's group name. - - - - - Convenience method to set this entry's group and user ids. - - - This entry's new user id. - - - This entry's new group id. - - - - - Convenience method to set this entry's group and user names. - - - This entry's new user name. - - - This entry's new group name. - - - - - Get/Set the modification time for this entry - - - - - Get this entry's file. - - - This entry's file. - - - - - Get/set this entry's recorded file size. - - - - - Return true if this entry represents a directory, false otherwise - - - True if this entry is a directory. - - - - - Fill in a TarHeader with information from a File. - - - The TarHeader to fill in. - - - The file from which to get the header information. - - - - - Get entries for all files present in this entries directory. - If this entry doesnt represent a directory zero entries are returned. - - - An array of TarEntry's for this entry's children. - - - - - Write an entry's header information to a header buffer. - - - The tar entry header buffer to fill in. - - - - - Write an entry's header information to a header buffer. - - - The tar entry header buffer to fill in. - - - The used for the Name fields, or null for ASCII only - - - - - Convenience method that will modify an entry's name directly - in place in an entry header buffer byte array. - - - The buffer containing the entry header to modify. - - - The new name to place into the header buffer. - - - - - Convenience method that will modify an entry's name directly - in place in an entry header buffer byte array. - - - The buffer containing the entry header to modify. - - - The new name to place into the header buffer. - - - The used for the Name fields, or null for ASCII only - - - - - Fill in a TarHeader given only the entry's name. - - - The TarHeader to fill in. - - - The tar entry name. - - - - - The name of the file this entry represents or null if the entry is not based on a file. - - - - - The entry's header information. - - - - - TarException represents exceptions specific to Tar classes and code. - - - - - Initialise a new instance of . - - - - - Initialise a new instance of with its message string. - - A that describes the error. - - - - Initialise a new instance of . - - A that describes the error. - The that caused this exception. - - - - Initializes a new instance of the TarException class with serialized data. - - - The System.Runtime.Serialization.SerializationInfo that holds the serialized - object data about the exception being thrown. - - - The System.Runtime.Serialization.StreamingContext that contains contextual information - about the source or destination. - - - - - Reads the extended header of a Tar stream - - - - - Creates a new . - - - - - Read bytes from - - - - - - - Returns the parsed headers as key-value strings - - - - - This class encapsulates the Tar Entry Header used in Tar Archives. - The class also holds a number of tar constants, used mostly in headers. - - - The tar format and its POSIX successor PAX have a long history which makes for compatability - issues when creating and reading files. - - This is further complicated by a large number of programs with variations on formats - One common issue is the handling of names longer than 100 characters. - GNU style long names are currently supported. - - This is the ustar (Posix 1003.1) header. - - struct header - { - char t_name[100]; // 0 Filename - char t_mode[8]; // 100 Permissions - char t_uid[8]; // 108 Numerical User ID - char t_gid[8]; // 116 Numerical Group ID - char t_size[12]; // 124 Filesize - char t_mtime[12]; // 136 st_mtime - char t_chksum[8]; // 148 Checksum - char t_typeflag; // 156 Type of File - char t_linkname[100]; // 157 Target of Links - char t_magic[6]; // 257 "ustar" or other... - char t_version[2]; // 263 Version fixed to 00 - char t_uname[32]; // 265 User Name - char t_gname[32]; // 297 Group Name - char t_devmajor[8]; // 329 Major for devices - char t_devminor[8]; // 337 Minor for devices - char t_prefix[155]; // 345 Prefix for t_name - char t_mfill[12]; // 500 Filler up to 512 - }; - - - - - The length of the name field in a header buffer. - - - - - The length of the mode field in a header buffer. - - - - - The length of the user id field in a header buffer. - - - - - The length of the group id field in a header buffer. - - - - - The length of the checksum field in a header buffer. - - - - - Offset of checksum in a header buffer. - - - - - The length of the size field in a header buffer. - - - - - The length of the magic field in a header buffer. - - - - - The length of the version field in a header buffer. - - - - - The length of the modification time field in a header buffer. - - - - - The length of the user name field in a header buffer. - - - - - The length of the group name field in a header buffer. - - - - - The length of the devices field in a header buffer. - - - - - The length of the name prefix field in a header buffer. - - - - - The "old way" of indicating a normal file. - - - - - Normal file type. - - - - - Link file type. - - - - - Symbolic link file type. - - - - - Character device file type. - - - - - Block device file type. - - - - - Directory file type. - - - - - FIFO (pipe) file type. - - - - - Contiguous file type. - - - - - Posix.1 2001 global extended header - - - - - Posix.1 2001 extended header - - - - - Solaris access control list file type - - - - - GNU dir dump file type - This is a dir entry that contains the names of files that were in the - dir at the time the dump was made - - - - - Solaris Extended Attribute File - - - - - Inode (metadata only) no file content - - - - - Identifies the next file on the tape as having a long link name - - - - - Identifies the next file on the tape as having a long name - - - - - Continuation of a file that began on another volume - - - - - For storing filenames that dont fit in the main header (old GNU) - - - - - GNU Sparse file - - - - - GNU Tape/volume header ignore on extraction - - - - - The magic tag representing a POSIX tar archive. (would be written with a trailing NULL) - - - - - The magic tag representing an old GNU tar archive where version is included in magic and overwrites it - - - - - Initialise a default TarHeader instance - - - - - Get/set the name for this tar entry. - - Thrown when attempting to set the property to null. - - - - Get the name of this entry. - - The entry's name. - - - - Get/set the entry's Unix style permission mode. - - - - - The entry's user id. - - - This is only directly relevant to unix systems. - The default is zero. - - - - - Get/set the entry's group id. - - - This is only directly relevant to linux/unix systems. - The default value is zero. - - - - - Get/set the entry's size. - - Thrown when setting the size to less than zero. - - - - Get/set the entry's modification time. - - - The modification time is only accurate to within a second. - - Thrown when setting the date time to less than 1/1/1970. - - - - Get the entry's checksum. This is only valid/updated after writing or reading an entry. - - - - - Get value of true if the header checksum is valid, false otherwise. - - - - - Get/set the entry's type flag. - - - - - The entry's link name. - - Thrown when attempting to set LinkName to null. - - - - Get/set the entry's magic tag. - - Thrown when attempting to set Magic to null. - - - - The entry's version. - - Thrown when attempting to set Version to null. - - - - The entry's user name. - - - - - Get/set the entry's group name. - - - This is only directly relevant to unix systems. - - - - - Get/set the entry's major device number. - - - - - Get/set the entry's minor device number. - - - - - Create a new that is a copy of the current instance. - - A new that is a copy of the current instance. - - - - Parse TarHeader information from a header buffer. - - - The tar entry header buffer to get information from. - - - The used for the Name field, or null for ASCII only - - - - - Parse TarHeader information from a header buffer. - - - The tar entry header buffer to get information from. - - - - - 'Write' header information to buffer provided, updating the check sum. - - output buffer for header information - - - - 'Write' header information to buffer provided, updating the check sum. - - output buffer for header information - The used for the Name field, or null for ASCII only - - - - Get a hash code for the current object. - - A hash code for the current object. - - - - Determines if this instance is equal to the specified object. - - The object to compare with. - true if the objects are equal, false otherwise. - - - - Set defaults for values used when constructing a TarHeader instance. - - Value to apply as a default for userId. - Value to apply as a default for userName. - Value to apply as a default for groupId. - Value to apply as a default for groupName. - - - - Parse an octal string from a header buffer. - - The header buffer from which to parse. - The offset into the buffer from which to parse. - The number of header bytes to parse. - The long equivalent of the octal string. - - - - Parse a name from a header buffer. - - - The header buffer from which to parse. - - - The offset into the buffer from which to parse. - - - The number of header bytes to parse. - - - The name parsed. - - - - - Parse a name from a header buffer. - - - The header buffer from which to parse. - - - The offset into the buffer from which to parse. - - - The number of header bytes to parse. - - - name encoding, or null for ASCII only - - - The name parsed. - - - - - Add name to the buffer as a collection of bytes - - The name to add - The offset of the first character - The buffer to add to - The index of the first byte to add - The number of characters/bytes to add - The next free index in the - - - - Add name to the buffer as a collection of bytes - - The name to add - The offset of the first character - The buffer to add to - The index of the first byte to add - The number of characters/bytes to add - The next free index in the - - - - Add name to the buffer as a collection of bytes - - The name to add - The offset of the first character - The buffer to add to - The index of the first byte to add - The number of characters/bytes to add - name encoding, or null for ASCII only - The next free index in the - - - - Add an entry name to the buffer - - - The name to add - - - The buffer to add to - - - The offset into the buffer from which to start adding - - - The number of header bytes to add - - - The index of the next free byte in the buffer - - TODO: what should be default behavior?(omit upper byte or UTF8?) - - - - Add an entry name to the buffer - - - The name to add - - - The buffer to add to - - - The offset into the buffer from which to start adding - - - The number of header bytes to add - - - - - The index of the next free byte in the buffer - - - - - Add an entry name to the buffer - - The name to add - The buffer to add to - The offset into the buffer from which to start adding - The number of header bytes to add - The index of the next free byte in the buffer - TODO: what should be default behavior?(omit upper byte or UTF8?) - - - - Add an entry name to the buffer - - The name to add - The buffer to add to - The offset into the buffer from which to start adding - The number of header bytes to add - - The index of the next free byte in the buffer - - - - Add a string to a buffer as a collection of ascii bytes. - - The string to add - The offset of the first character to add. - The buffer to add to. - The offset to start adding at. - The number of ascii characters to add. - The next free index in the buffer. - - - - Add a string to a buffer as a collection of ascii bytes. - - The string to add - The offset of the first character to add. - The buffer to add to. - The offset to start adding at. - The number of ascii characters to add. - String encoding, or null for ASCII only - The next free index in the buffer. - - - - Put an octal representation of a value into a buffer - - - the value to be converted to octal - - - buffer to store the octal string - - - The offset into the buffer where the value starts - - - The length of the octal string to create - - - The offset of the character next byte after the octal string - - - - - Put an octal or binary representation of a value into a buffer - - Value to be convert to octal - The buffer to update - The offset into the buffer to store the value - The length of the octal string. Must be 12. - Index of next byte - - - - Add the checksum integer to header buffer. - - - The header buffer to set the checksum for - The offset into the buffer for the checksum - The number of header bytes to update. - It's formatted differently from the other fields: it has 6 digits, a - null, then a space -- rather than digits, a space, then a null. - The final space is already there, from checksumming - - The modified buffer offset - - - - Compute the checksum for a tar entry header. - The checksum field must be all spaces prior to this happening - - The tar entry's header buffer. - The computed checksum. - - - - Make a checksum for a tar entry ignoring the checksum contents. - - The tar entry's header buffer. - The checksum for the buffer - - - - The TarInputStream reads a UNIX tar archive as an InputStream. - methods are provided to position at each successive entry in - the archive, and the read each entry as a normal input stream - using read(). - - - - - Construct a TarInputStream with default block factor - - stream to source data from - - - - Construct a TarInputStream with default block factor - - stream to source data from - The used for the Name fields, or null for ASCII only - - - - Construct a TarInputStream with user specified block factor - - stream to source data from - block factor to apply to archive - - - - Construct a TarInputStream with user specified block factor - - stream to source data from - block factor to apply to archive - The used for the Name fields, or null for ASCII only - - - - Gets or sets a flag indicating ownership of underlying stream. - When the flag is true will close the underlying stream also. - - The default value is true. - - - - Gets a value indicating whether the current stream supports reading - - - - - Gets a value indicating whether the current stream supports seeking - This property always returns false. - - - - - Gets a value indicating if the stream supports writing. - This property always returns false. - - - - - The length in bytes of the stream - - - - - Gets or sets the position within the stream. - Setting the Position is not supported and throws a NotSupportedExceptionNotSupportedException - - Any attempt to set position - - - - Flushes the baseInputStream - - - - - Set the streams position. This operation is not supported and will throw a NotSupportedException - - The offset relative to the origin to seek to. - The to start seeking from. - The new position in the stream. - Any access - - - - Sets the length of the stream - This operation is not supported and will throw a NotSupportedException - - The new stream length. - Any access - - - - Writes a block of bytes to this stream using data from a buffer. - This operation is not supported and will throw a NotSupportedException - - The buffer containing bytes to write. - The offset in the buffer of the frist byte to write. - The number of bytes to write. - Any access - - - - Writes a byte to the current position in the file stream. - This operation is not supported and will throw a NotSupportedException - - The byte value to write. - Any access - - - - Reads a byte from the current tar archive entry. - - A byte cast to an int; -1 if the at the end of the stream. - - - - Reads bytes from the current tar archive entry. - - This method is aware of the boundaries of the current - entry in the archive and will deal with them appropriately - - - The buffer into which to place bytes read. - - - The offset at which to place bytes read. - - - The number of bytes to read. - - - The number of bytes read, or 0 at end of stream/EOF. - - - - - Closes this stream. Calls the TarBuffer's close() method. - The underlying stream is closed by the TarBuffer. - - - - - Set the entry factory for this instance. - - The factory for creating new entries - - - - Get the record size being used by this stream's TarBuffer. - - - - - Get the record size being used by this stream's TarBuffer. - - - TarBuffer record size. - - - - - Get the available data that can be read from the current - entry in the archive. This does not indicate how much data - is left in the entire archive, only in the current entry. - This value is determined from the entry's size header field - and the amount of data already read from the current entry. - - - The number of available bytes for the current entry. - - - - - Skip bytes in the input buffer. This skips bytes in the - current entry's data, not the entire archive, and will - stop at the end of the current entry's data if the number - to skip extends beyond that point. - - - The number of bytes to skip. - - - - - Return a value of true if marking is supported; false otherwise. - - Currently marking is not supported, the return value is always false. - - - - Since we do not support marking just yet, we do nothing. - - - The limit to mark. - - - - - Since we do not support marking just yet, we do nothing. - - - - - Get the next entry in this tar archive. This will skip - over any remaining data in the current entry, if there - is one, and place the input stream at the header of the - next entry, and read the header and instantiate a new - TarEntry from the header bytes and return that entry. - If there are no more entries in the archive, null will - be returned to indicate that the end of the archive has - been reached. - - - The next TarEntry in the archive, or null. - - - - - Copies the contents of the current tar archive entry directly into - an output stream. - - - The OutputStream into which to write the entry's data. - - - - - This interface is provided, along with the method , to allow - the programmer to have their own subclass instantiated for the - entries return from . - - - - - Create an entry based on name alone - - - Name of the new EntryPointNotFoundException to create - - created TarEntry or descendant class - - - - Create an instance based on an actual file - - - Name of file to represent in the entry - - - Created TarEntry or descendant class - - - - - Create a tar entry based on the header information passed - - - Buffer containing header information to create an entry from. - - - Created TarEntry or descendant class - - - - - Standard entry factory class creating instances of the class TarEntry - - - - - Construct standard entry factory class with ASCII name encoding - - - - - Construct standard entry factory with name encoding - - The used for the Name fields, or null for ASCII only - - - - Create a based on named - - The name to use for the entry - A new - - - - Create a tar entry with details obtained from file - - The name of the file to retrieve details from. - A new - - - - Create an entry based on details in header - - The buffer containing entry details. - A new - - - - Flag set when last block has been read - - - - - Size of this entry as recorded in header - - - - - Number of bytes read for this entry so far - - - - - Buffer used with calls to Read() - - - - - Working buffer - - - - - Current entry being read - - - - - Factory used to create TarEntry or descendant class instance - - - - - Stream used as the source of input data. - - - - - The TarOutputStream writes a UNIX tar archive as an OutputStream. - Methods are provided to put entries, and then write their contents - by writing to this stream using write(). - - public - - - - Construct TarOutputStream using default block factor - - stream to write to - - - - Construct TarOutputStream using default block factor - - stream to write to - The used for the Name fields, or null for ASCII only - - - - Construct TarOutputStream with user specified block factor - - stream to write to - blocking factor - - - - Construct TarOutputStream with user specified block factor - - stream to write to - blocking factor - The used for the Name fields, or null for ASCII only - - - - Gets or sets a flag indicating ownership of underlying stream. - When the flag is true will close the underlying stream also. - - The default value is true. - - - - true if the stream supports reading; otherwise, false. - - - - - true if the stream supports seeking; otherwise, false. - - - - - true if stream supports writing; otherwise, false. - - - - - length of stream in bytes - - - - - gets or sets the position within the current stream. - - - - - set the position within the current stream - - The offset relative to the to seek to - The to seek from. - The new position in the stream. - - - - Set the length of the current stream - - The new stream length. - - - - Read a byte from the stream and advance the position within the stream - by one byte or returns -1 if at the end of the stream. - - The byte value or -1 if at end of stream - - - - read bytes from the current stream and advance the position within the - stream by the number of bytes read. - - The buffer to store read bytes in. - The index into the buffer to being storing bytes at. - The desired number of bytes to read. - The total number of bytes read, or zero if at the end of the stream. - The number of bytes may be less than the count - requested if data is not available. - - - - All buffered data is written to destination - - - - - Ends the TAR archive without closing the underlying OutputStream. - The result is that the EOF block of nulls is written. - - - - - Ends the TAR archive and closes the underlying OutputStream. - - This means that Finish() is called followed by calling the - TarBuffer's Close(). - - - - Get the record size being used by this stream's TarBuffer. - - - - - Get the record size being used by this stream's TarBuffer. - - - The TarBuffer record size. - - - - - Get a value indicating whether an entry is open, requiring more data to be written. - - - - - Put an entry on the output stream. This writes the entry's - header and positions the output stream for writing - the contents of the entry. Once this method is called, the - stream is ready for calls to write() to write the entry's - contents. Once the contents are written, closeEntry() - MUST be called to ensure that all buffered data - is completely written to the output stream. - - - The TarEntry to be written to the archive. - - - - - Close an entry. This method MUST be called for all file - entries that contain data. The reason is that we must - buffer data written to the stream in order to satisfy - the buffer's block based writes. Thus, there may be - data fragments still being assembled that must be written - to the output stream before this entry is closed and the - next entry written. - - - - - Writes a byte to the current tar archive entry. - This method simply calls Write(byte[], int, int). - - - The byte to be written. - - - - - Writes bytes to the current tar archive entry. This method - is aware of the current entry and will throw an exception if - you attempt to write bytes past the length specified for the - current entry. The method is also (painfully) aware of the - record buffering required by TarBuffer, and manages buffers - that are not a multiple of recordsize in length, including - assembling records from small buffers. - - - The buffer to write to the archive. - - - The offset in the buffer from which to get bytes. - - - The number of bytes to write. - - - - - Write an EOF (end of archive) block to the tar archive. - The end of the archive is indicated by two blocks consisting entirely of zero bytes. - - - - - bytes written for this entry so far - - - - - current 'Assembly' buffer length - - - - - Flag indicating whether this instance has been closed or not. - - - - - Size for the current entry - - - - - single block working buffer - - - - - 'Assembly' buffer used to assemble data before writing - - - - - TarBuffer used to provide correct blocking factor - - - - - the destination stream for the archive contents - - - - - name encoding - - - - - FastZipEvents supports all events applicable to FastZip operations. - - - - - Delegate to invoke when processing directories. - - - - - Delegate to invoke when processing files. - - - - - Delegate to invoke during processing of files. - - - - - Delegate to invoke when processing for a file has been completed. - - - - - Delegate to invoke when processing directory failures. - - - - - Delegate to invoke when processing file failures. - - - - - Raise the directory failure event. - - The directory causing the failure. - The exception for this event. - A boolean indicating if execution should continue or not. - - - - Fires the file failure handler delegate. - - The file causing the failure. - The exception for this failure. - A boolean indicating if execution should continue or not. - - - - Fires the ProcessFile delegate. - - The file being processed. - A boolean indicating if execution should continue or not. - - - - Fires the delegate - - The file whose processing has been completed. - A boolean indicating if execution should continue or not. - - - - Fires the process directory delegate. - - The directory being processed. - Flag indicating if the directory has matching files as determined by the current filter. - A of true if the operation should continue; false otherwise. - - - - The minimum timespan between events. - - The minimum period of time between events. - - The default interval is three seconds. - - - - FastZip provides facilities for creating and extracting zip files. - - - - - Defines the desired handling when overwriting files during extraction. - - - - - Prompt the user to confirm overwriting - - - - - Never overwrite files. - - - - - Always overwrite files. - - - - - Initialise a default instance of . - - - - - Initialise a new instance of using the specified - - The time setting to use when creating or extracting Zip entries. - Using TimeSetting.LastAccessTime[Utc] when - creating an archive will set the file time to the moment of reading. - - - - - Initialise a new instance of using the specified - - The time to set all values for created or extracted Zip Entries. - - - - Initialise a new instance of - - The events to use during operations. - - - - Get/set a value indicating whether empty directories should be created. - - - - - Get / set the password value. - - - - - Get / set the method of encrypting entries. - - - Only applies when is set. - Defaults to ZipCrypto for backwards compatibility purposes. - - - - - Get or set the active when creating Zip files. - - - - - - Get or set the active when creating Zip files. - - - - - Gets or sets the setting for Zip64 handling when writing. - - - The default value is dynamic which is not backwards compatible with old - programs and can cause problems with XP's built in compression which cant - read Zip64 archives. However it does avoid the situation were a large file - is added and cannot be completed correctly. - NOTE: Setting the size for entries before they are added is the best solution! - By default the EntryFactory used by FastZip will set the file size. - - - - - Get/set a value indicating whether file dates and times should - be restored when extracting files from an archive. - - The default value is false. - - - - Get/set a value indicating whether file attributes should - be restored during extract operations - - - - - Get/set the Compression Level that will be used - when creating the zip - - - - - Delegate called when confirming overwriting of files. - - - - - Create a zip file. - - The name of the zip file to create. - The directory to source files from. - True to recurse directories, false for no recursion. - The file filter to apply. - The directory filter to apply. - - - - Create a zip file/archive. - - The name of the zip file to create. - The directory to obtain files and directories from. - True to recurse directories, false for no recursion. - The file filter to apply. - - - - Create a zip archive sending output to the passed. - - The stream to write archive data to. - The directory to source files from. - True to recurse directories, false for no recursion. - The file filter to apply. - The directory filter to apply. - The is closed after creation. - - - - Create a zip archive sending output to the passed. - - The stream to write archive data to. - The directory to source files from. - True to recurse directories, false for no recursion. - The file filter to apply. - The directory filter to apply. - true to leave open after the zip has been created, false to dispose it. - - - - Create a zip file. - - The name of the zip file to create. - The directory to source files from. - True to recurse directories, false for no recursion. - The file filter to apply. - The directory filter to apply. - - - - Create a zip archive sending output to the passed. - - The stream to write archive data to. - The directory to source files from. - True to recurse directories, false for no recursion. - The file filter to apply. - The directory filter to apply. - true to leave open after the zip has been created, false to dispose it. - - - - Create a zip archive sending output to the passed. - - The stream to write archive data to. - The directory to source files from. - True to recurse directories, false for no recursion. - For performing the actual file system scan - true to leave open after the zip has been created, false to dispose it. - The is closed after creation. - - - - Extract the contents of a zip file. - - The zip file to extract from. - The directory to save extracted information in. - A filter to apply to files. - - - - Extract the contents of a zip file. - - The zip file to extract from. - The directory to save extracted information in. - The style of overwriting to apply. - A delegate to invoke when confirming overwriting. - A filter to apply to files. - A filter to apply to directories. - Flag indicating whether to restore the date and time for extracted files. - Allow parent directory traversal in file paths (e.g. ../file) - - - - Extract the contents of a zip file held in a stream. - - The seekable input stream containing the zip to extract from. - The directory to save extracted information in. - The style of overwriting to apply. - A delegate to invoke when confirming overwriting. - A filter to apply to files. - A filter to apply to directories. - Flag indicating whether to restore the date and time for extracted files. - Flag indicating whether the inputStream will be closed by this method. - Allow parent directory traversal in file paths (e.g. ../file) - - - - Defines factory methods for creating new values. - - - - - Create a for a file given its name - - The name of the file to create an entry for. - Returns a file entry based on the passed. - - - - Create a for a file given its name - - The name of the file to create an entry for. - If true get details from the file system if the file exists. - Returns a file entry based on the passed. - - - - Create a for a file given its actual name and optional override name - - The name of the file to create an entry for. - An alternative name to be used for the new entry. Null if not applicable. - If true get details from the file system if the file exists. - Returns a file entry based on the passed. - - - - Create a for a directory given its name - - The name of the directory to create an entry for. - Returns a directory entry based on the passed. - - - - Create a for a directory given its name - - The name of the directory to create an entry for. - If true get details from the file system for this directory if it exists. - Returns a directory entry based on the passed. - - - - Get/set the applicable. - - - - - Get the in use. - - - - - Get the value to use when is set to , - or if not specified, the value of when the class was the initialized - - - - - WindowsNameTransform transforms names to windows compatible ones. - - - - - The maximum windows path name permitted. - - This may not valid for all windows systems - CE?, etc but I cant find the equivalent in the CLR. - - - - In this case we need Windows' invalid path characters. - Path.GetInvalidPathChars() only returns a subset invalid on all platforms. - - - - - Initialises a new instance of - - - Allow parent directory traversal in file paths (e.g. ../file) - - - - Initialise a default instance of - - - - - Gets or sets a value containing the target directory to prefix values with. - - - - - Allow parent directory traversal in file paths (e.g. ../file) - - - - - Gets or sets a value indicating whether paths on incoming values should be removed. - - - - - Transform a Zip directory name to a windows directory name. - - The directory name to transform. - The transformed name. - - - - Transform a Zip format file name to a windows style one. - - The file name to transform. - The transformed name. - - - - Test a name to see if it is a valid name for a windows filename as extracted from a Zip archive. - - The name to test. - Returns true if the name is a valid zip name; false otherwise. - The filename isnt a true windows path in some fundamental ways like no absolute paths, no rooted paths etc. - - - - Force a name to be valid by replacing invalid characters with a fixed value - - The name to make valid - The replacement character to use for any invalid characters. - Returns a valid name - - - - Gets or set the character to replace invalid characters during transformations. - - - - - Determines how entries are tested to see if they should use Zip64 extensions or not. - - - - - Zip64 will not be forced on entries during processing. - - An entry can have this overridden if required - - - - Zip64 should always be used. - - - - - #ZipLib will determine use based on entry values when added to archive. - - - - - The kind of compression used for an entry in an archive - - - - - A direct copy of the file contents is held in the archive - - - - - Common Zip compression method using a sliding dictionary - of up to 32KB and secondary compression from Huffman/Shannon-Fano trees - - - - - An extension to deflate with a 64KB window. Not supported by #Zip currently - - - - - BZip2 compression. Not supported by #Zip. - - - - - LZMA compression. Not supported by #Zip. - - - - - PPMd compression. Not supported by #Zip. - - - - - WinZip special for AES encryption, Now supported by #Zip. - - - - - Identifies the encryption algorithm used for an entry - - - - - No encryption has been used. - - - - - Encrypted using PKZIP 2.0 or 'classic' encryption. - - - - - DES encryption has been used. - - - - - RC2 encryption has been used for encryption. - - - - - Triple DES encryption with 168 bit keys has been used for this entry. - - - - - Triple DES with 112 bit keys has been used for this entry. - - - - - AES 128 has been used for encryption. - - - - - AES 192 has been used for encryption. - - - - - AES 256 has been used for encryption. - - - - - RC2 corrected has been used for encryption. - - - - - Blowfish has been used for encryption. - - - - - Twofish has been used for encryption. - - - - - RC4 has been used for encryption. - - - - - An unknown algorithm has been used for encryption. - - - - - Defines the contents of the general bit flags field for an archive entry. - - - - - Bit 0 if set indicates that the file is encrypted - - - - - Bits 1 and 2 - Two bits defining the compression method (only for Method 6 Imploding and 8,9 Deflating) - - - - - Bit 3 if set indicates a trailing data descriptor is appended to the entry data - - - - - Bit 4 is reserved for use with method 8 for enhanced deflation - - - - - Bit 5 if set indicates the file contains Pkzip compressed patched data. - Requires version 2.7 or greater. - - - - - Bit 6 if set indicates strong encryption has been used for this entry. - - - - - Bit 7 is currently unused - - - - - Bit 8 is currently unused - - - - - Bit 9 is currently unused - - - - - Bit 10 is currently unused - - - - - Bit 11 if set indicates the filename and - comment fields for this file must be encoded using UTF-8. - - - - - Bit 12 is documented as being reserved by PKware for enhanced compression. - - - - - Bit 13 if set indicates that values in the local header are masked to hide - their actual values, and the central directory is encrypted. - - - Used when encrypting the central directory contents. - - - - - Bit 14 is documented as being reserved for use by PKware - - - - - Bit 15 is documented as being reserved for use by PKware - - - - - This class contains constants used for Zip format files - - - - - The version made by field for entries in the central header when created by this library - - - This is also the Zip version for the library when comparing against the version required to extract - for an entry. See . - - - - - The version made by field for entries in the central header when created by this library - - - This is also the Zip version for the library when comparing against the version required to extract - for an entry. See ZipInputStream.CanDecompressEntry. - - - - - The minimum version required to support strong encryption - - - - - The minimum version required to support strong encryption - - - - - Version indicating AES encryption - - - - - The version required for Zip64 extensions (4.5 or higher) - - - - - The version required for BZip2 compression (4.6 or higher) - - - - - Size of local entry header (excluding variable length fields at end) - - - - - Size of local entry header (excluding variable length fields at end) - - - - - Size of Zip64 data descriptor - - - - - Size of data descriptor - - - - - Size of data descriptor - - - - - Size of central header entry (excluding variable fields) - - - - - Size of central header entry - - - - - Size of end of central record (excluding variable fields) - - - - - Size of end of central record (excluding variable fields) - - - - - Size of 'classic' cryptographic header stored before any entry data - - - - - Size of cryptographic header stored before entry data - - - - - The size of the Zip64 central directory locator. - - - - - Signature for local entry header - - - - - Signature for local entry header - - - - - Signature for spanning entry - - - - - Signature for spanning entry - - - - - Signature for temporary spanning entry - - - - - Signature for temporary spanning entry - - - - - Signature for data descriptor - - - This is only used where the length, Crc, or compressed size isnt known when the - entry is created and the output stream doesnt support seeking. - The local entry cannot be 'patched' with the correct values in this case - so the values are recorded after the data prefixed by this header, as well as in the central directory. - - - - - Signature for data descriptor - - - This is only used where the length, Crc, or compressed size isnt known when the - entry is created and the output stream doesnt support seeking. - The local entry cannot be 'patched' with the correct values in this case - so the values are recorded after the data prefixed by this header, as well as in the central directory. - - - - - Signature for central header - - - - - Signature for central header - - - - - Signature for Zip64 central file header - - - - - Signature for Zip64 central file header - - - - - Signature for Zip64 central directory locator - - - - - Signature for archive extra data signature (were headers are encrypted). - - - - - Central header digital signature - - - - - Central header digital signature - - - - - End of central directory record signature - - - - - End of central directory record signature - - - - - Default encoding used for string conversion. 0 gives the default system OEM code page. - Using the default code page isnt the full solution necessarily - there are many variable factors, codepage 850 is often a good choice for - European users, however be careful about compatability. - - - - Deprecated wrapper for - - - Deprecated wrapper for - - - Deprecated wrapper for - - - Deprecated wrapper for - - - Deprecated wrapper for - - - Deprecated wrapper for - - - - The method of encrypting entries when creating zip archives. - - - - - No encryption will be used. - - - - - Encrypt entries with ZipCrypto. - - - - - Encrypt entries with AES 128. - - - - - Encrypt entries with AES 256. - - - - - Defines known values for the property. - - - - - Host system = MSDOS - - - - - Host system = Amiga - - - - - Host system = Open VMS - - - - - Host system = Unix - - - - - Host system = VMCms - - - - - Host system = Atari ST - - - - - Host system = OS2 - - - - - Host system = Macintosh - - - - - Host system = ZSystem - - - - - Host system = Cpm - - - - - Host system = Windows NT - - - - - Host system = MVS - - - - - Host system = VSE - - - - - Host system = Acorn RISC - - - - - Host system = VFAT - - - - - Host system = Alternate MVS - - - - - Host system = BEOS - - - - - Host system = Tandem - - - - - Host system = OS400 - - - - - Host system = OSX - - - - - Host system = WinZIP AES - - - - - This class represents an entry in a zip archive. This can be a file - or a directory - ZipFile and ZipInputStream will give you instances of this class as - information about the members in an archive. ZipOutputStream - uses an instance of this class when creating an entry in a Zip file. -
-
Author of the original java version : Jochen Hoenicke -
-
- - - Creates a zip entry with the given name. - - - The name for this entry. Can include directory components. - The convention for names is 'unix' style paths with relative names only. - There are with no device names and path elements are separated by '/' characters. - - - The name passed is null - - - - - Creates a zip entry with the given name and version required to extract - - - The name for this entry. Can include directory components. - The convention for names is 'unix' style paths with no device names and - path elements separated by '/' characters. This is not enforced see CleanName - on how to ensure names are valid if this is desired. - - - The minimum 'feature version' required this entry - - - The name passed is null - - - - - Initializes an entry with the given name and made by information - - Name for this entry - Version and HostSystem Information - Minimum required zip feature version required to extract this entry - Compression method for this entry. - - The name passed is null - - - versionRequiredToExtract should be 0 (auto-calculate) or > 10 - - - This constructor is used by the ZipFile class when reading from the central header - It is not generally useful, use the constructor specifying the name only. - - - - - Creates a deep copy of the given zip entry. - - - The entry to copy. - - - - - Get a value indicating whether the entry has a CRC value available. - - - - - Get/Set flag indicating if entry is encrypted. - A simple helper routine to aid interpretation of flags - - This is an assistant that interprets the flags property. - - - - Get / set a flag indicating whether entry name and comment text are - encoded in unicode UTF8. - - This is an assistant that interprets the flags property. - - - - Value used during password checking for PKZIP 2.0 / 'classic' encryption. - - - - - Get/Set general purpose bit flag for entry - - - General purpose bit flag
-
- Bit 0: If set, indicates the file is encrypted
- Bit 1-2 Only used for compression type 6 Imploding, and 8, 9 deflating
- Imploding:
- Bit 1 if set indicates an 8K sliding dictionary was used. If clear a 4k dictionary was used
- Bit 2 if set indicates 3 Shannon-Fanno trees were used to encode the sliding dictionary, 2 otherwise
-
- Deflating:
- Bit 2 Bit 1
- 0 0 Normal compression was used
- 0 1 Maximum compression was used
- 1 0 Fast compression was used
- 1 1 Super fast compression was used
-
- Bit 3: If set, the fields crc-32, compressed size - and uncompressed size are were not able to be written during zip file creation - The correct values are held in a data descriptor immediately following the compressed data.
- Bit 4: Reserved for use by PKZIP for enhanced deflating
- Bit 5: If set indicates the file contains compressed patch data
- Bit 6: If set indicates strong encryption was used.
- Bit 7-10: Unused or reserved
- Bit 11: If set the name and comments for this entry are in unicode.
- Bit 12-15: Unused or reserved
-
- - -
- - - Get/Set index of this entry in Zip file - - This is only valid when the entry is part of a - - - - Get/set offset for use in central header - - - - - Get/Set external file attributes as an integer. - The values of this are operating system dependent see - HostSystem for details - - - - - Get the version made by for this entry or zero if unknown. - The value / 10 indicates the major version number, and - the value mod 10 is the minor version number - - - - - Get a value indicating this entry is for a DOS/Windows system. - - - - - Test the external attributes for this to - see if the external attributes are Dos based (including WINNT and variants) - and match the values - - The attributes to test. - Returns true if the external attributes are known to be DOS/Windows - based and have the same attributes set as the value passed. - - - - Gets the compatibility information for the external file attribute - If the external file attributes are compatible with MS-DOS and can be read - by PKZIP for DOS version 2.04g then this value will be zero. Otherwise the value - will be non-zero and identify the host system on which the attributes are compatible. - - - - The values for this as defined in the Zip File format and by others are shown below. The values are somewhat - misleading in some cases as they are not all used as shown. You should consult the relevant documentation - to obtain up to date and correct information. The modified appnote by the infozip group is - particularly helpful as it documents a lot of peculiarities. The document is however a little dated. - - 0 - MS-DOS and OS/2 (FAT / VFAT / FAT32 file systems) - 1 - Amiga - 2 - OpenVMS - 3 - Unix - 4 - VM/CMS - 5 - Atari ST - 6 - OS/2 HPFS - 7 - Macintosh - 8 - Z-System - 9 - CP/M - 10 - Windows NTFS - 11 - MVS (OS/390 - Z/OS) - 12 - VSE - 13 - Acorn Risc - 14 - VFAT - 15 - Alternate MVS - 16 - BeOS - 17 - Tandem - 18 - OS/400 - 19 - OS/X (Darwin) - 99 - WinZip AES - remainder - unused - - - - - - Get minimum Zip feature version required to extract this entry - - - Minimum features are defined as:
- 1.0 - Default value
- 1.1 - File is a volume label
- 2.0 - File is a folder/directory
- 2.0 - File is compressed using Deflate compression
- 2.0 - File is encrypted using traditional encryption
- 2.1 - File is compressed using Deflate64
- 2.5 - File is compressed using PKWARE DCL Implode
- 2.7 - File is a patch data set
- 4.5 - File uses Zip64 format extensions
- 4.6 - File is compressed using BZIP2 compression
- 5.0 - File is encrypted using DES
- 5.0 - File is encrypted using 3DES
- 5.0 - File is encrypted using original RC2 encryption
- 5.0 - File is encrypted using RC4 encryption
- 5.1 - File is encrypted using AES encryption
- 5.1 - File is encrypted using corrected RC2 encryption
- 5.1 - File is encrypted using corrected RC2-64 encryption
- 6.1 - File is encrypted using non-OAEP key wrapping
- 6.2 - Central directory encryption (not confirmed yet)
- 6.3 - File is compressed using LZMA
- 6.3 - File is compressed using PPMD+
- 6.3 - File is encrypted using Blowfish
- 6.3 - File is encrypted using Twofish
-
- -
- - - Get a value indicating whether this entry can be decompressed by the library. - - This is based on the and - whether the compression method is supported. - - - - Force this entry to be recorded using Zip64 extensions. - - - - - Get a value indicating whether Zip64 extensions were forced. - - A value of true if Zip64 extensions have been forced on; false if not. - - - - Gets a value indicating if the entry requires Zip64 extensions - to store the full entry values. - - A value of true if a local header requires Zip64 extensions; false if not. - - - - Get a value indicating whether the central directory entry requires Zip64 extensions to be stored. - - - - - Get/Set DosTime value. - - - The MS-DOS date format can only represent dates between 1/1/1980 and 12/31/2107. - - - - - Gets/Sets the time of last modification of the entry. - - - The property is updated to match this as far as possible. - - - - - Returns the entry name. - - - The unix naming convention is followed. - Path components in the entry should always separated by forward slashes ('/'). - Dos device names like C: should also be removed. - See the class, or - - - - - Gets/Sets the size of the uncompressed data. - - - The size or -1 if unknown. - - Setting the size before adding an entry to an archive can help - avoid compatibility problems with some archivers which don't understand Zip64 extensions. - - - - Gets/Sets the size of the compressed data. - - - The compressed entry size or -1 if unknown. - - - - - Gets/Sets the crc of the uncompressed data. - - - Crc is not in the range 0..0xffffffffL - - - The crc value or -1 if unknown. - - - - - Gets/Sets the compression method. - - - The compression method for this entry - - - - - Gets the compression method for outputting to the local or central header. - Returns same value as CompressionMethod except when AES encrypting, which - places 99 in the method and places the real method in the extra data. - - - - - Gets/Sets the extra data. - - - Extra data is longer than 64KB (0xffff) bytes. - - - Extra data or null if not set. - - - - - For AES encrypted files returns or sets the number of bits of encryption (128, 192 or 256). - When setting, only 0 (off), 128 or 256 is supported. - - - - - AES Encryption strength for storage in extra data in entry header. - 1 is 128 bit, 2 is 192 bit, 3 is 256 bit. - - - - - Returns the length of the salt, in bytes - - Key size -> Salt length: 128 bits = 8 bytes, 192 bits = 12 bytes, 256 bits = 16 bytes. - - - - Number of extra bytes required to hold the AES Header fields (Salt, Pwd verify, AuthCode) - - File format: - Bytes | Content - ---------+--------------------------- - Variable | Salt value - 2 | Password verification value - Variable | Encrypted file data - 10 | Authentication code - - - - Number of extra bytes required to hold the encryption header fields. - - - - - Process extra data fields updating the entry based on the contents. - - True if the extra data fields should be handled - for a local header, rather than for a central header. - - - - - Gets/Sets the entry comment. - - - If comment is longer than 0xffff. - - - The comment or null if not set. - - - A comment is only available for entries when read via the class. - The class doesn't have the comment data available. - - - - - Gets a value indicating if the entry is a directory. - however. - - - A directory is determined by an entry name with a trailing slash '/'. - The external file attributes can also indicate an entry is for a directory. - Currently only dos/windows attributes are tested in this manner. - The trailing slash convention should always be followed. - - - - - Get a value of true if the entry appears to be a file; false otherwise - - - This only takes account of DOS/Windows attributes. Other operating systems are ignored. - For linux and others the result may be incorrect. - - - - - Test entry to see if data can be extracted. - - Returns true if data can be extracted for this entry; false otherwise. - - - - Creates a copy of this zip entry. - - An that is a copy of the current instance. - - - - Gets a string representation of this ZipEntry. - - A readable textual representation of this - - - - Test a compression method to see if this library - supports extracting data compressed with that method - - The compression method to test. - Returns true if the compression method is supported; false otherwise - - - - Cleans a name making it conform to Zip file conventions. - Devices names ('c:\') and UNC share names ('\\server\share') are removed - and forward slashes ('\') are converted to back slashes ('/'). - Names are made relative by trimming leading slashes which is compatible - with the ZIP naming convention. - - The name to clean - The 'cleaned' name. - - The Zip name transform class is more flexible. - - - - - General ZipEntry helper extensions - - - - - Efficiently check if a flag is set without enum un-/boxing - - - - Returns whether the flag was set - - - - Efficiently set a flag without enum un-/boxing - - - - Whether the passed flag should be set (1) or cleared (0) - - - - Basic implementation of - - - - - Defines the possible values to be used for the . - - - - - Use the recorded LastWriteTime value for the file. - - - - - Use the recorded LastWriteTimeUtc value for the file - - - - - Use the recorded CreateTime value for the file. - - - - - Use the recorded CreateTimeUtc value for the file. - - - - - Use the recorded LastAccessTime value for the file. - - - - - Use the recorded LastAccessTimeUtc value for the file. - - - - - Use a fixed value. - - The actual value used can be - specified via the constructor or - using the with the setting set - to which will use the when this class was constructed. - The property can also be used to set this value. - - - - Initialise a new instance of the class. - - A default , and the LastWriteTime for files is used. - - - - Initialise a new instance of using the specified - - The time setting to use when creating Zip entries. - - - - Initialise a new instance of using the specified - - The time to set all values to. - - - - Get / set the to be used when creating new values. - - - Setting this property to null will cause a default name transform to be used. - - - - - Get / set the in use. - - - - - Get / set the value to use when is set to - - - - - A bitmask defining the attributes to be retrieved from the actual file. - - The default is to get all possible attributes from the actual file. - - - - A bitmask defining which attributes are to be set on. - - By default no attributes are set on. - - - - Get set a value indicating whether unidoce text should be set on. - - - - - Make a new for a file. - - The name of the file to create a new entry for. - Returns a new based on the . - - - - Make a new for a file. - - The name of the file to create a new entry for. - If true entry detail is retrieved from the file system if the file exists. - Returns a new based on the . - - - - Make a new from a name. - - The name of the file to create a new entry for. - An alternative name to be used for the new entry. Null if not applicable. - If true entry detail is retrieved from the file system if the file exists. - Returns a new based on the . - - - - Make a new for a directory. - - The raw untransformed name for the new directory - Returns a new representing a directory. - - - - Make a new for a directory. - - The raw untransformed name for the new directory - If true entry detail is retrieved from the file system if the file exists. - Returns a new representing a directory. - - - - ZipException represents exceptions specific to Zip classes and code. - - - - - Initialise a new instance of . - - - - - Initialise a new instance of with its message string. - - A that describes the error. - - - - Initialise a new instance of . - - A that describes the error. - The that caused this exception. - - - - Initializes a new instance of the ZipException class with serialized data. - - - The System.Runtime.Serialization.SerializationInfo that holds the serialized - object data about the exception being thrown. - - - The System.Runtime.Serialization.StreamingContext that contains contextual information - about the source or destination. - - - - - ExtraData tagged value interface. - - - - - Get the ID for this tagged data value. - - - - - Set the contents of this instance from the data passed. - - The data to extract contents from. - The offset to begin extracting data from. - The number of bytes to extract. - - - - Get the data representing this instance. - - Returns the data for this instance. - - - - A raw binary tagged value - - - - - Initialise a new instance. - - The tag ID. - - - - Get the ID for this tagged data value. - - - - - Set the data from the raw values provided. - - The raw data to extract values from. - The index to start extracting values from. - The number of bytes available. - - - - Get the binary data representing this instance. - - The raw binary data representing this instance. - - - - Get /set the binary data representing this instance. - - The raw binary data representing this instance. - - - - The tag ID for this instance. - - - - - Class representing extended unix date time values. - - - - - Flags indicate which values are included in this instance. - - - - - The modification time is included - - - - - The access time is included - - - - - The create time is included. - - - - - Get the ID - - - - - Set the data from the raw values provided. - - The raw data to extract values from. - The index to start extracting values from. - The number of bytes available. - - - - Get the binary data representing this instance. - - The raw binary data representing this instance. - - - - Test a value to see if is valid and can be represented here. - - The value to test. - Returns true if the value is valid and can be represented; false if not. - The standard Unix time is a signed integer data type, directly encoding the Unix time number, - which is the number of seconds since 1970-01-01. - Being 32 bits means the values here cover a range of about 136 years. - The minimum representable time is 1901-12-13 20:45:52, - and the maximum representable time is 2038-01-19 03:14:07. - - - - - Get /set the Modification Time - - - - - - - Get / set the Access Time - - - - - - - Get / Set the Create Time - - - - - - - Get/set the values to include. - - - - - Class handling NT date time values. - - - - - Get the ID for this tagged data value. - - - - - Set the data from the raw values provided. - - The raw data to extract values from. - The index to start extracting values from. - The number of bytes available. - - - - Get the binary data representing this instance. - - The raw binary data representing this instance. - - - - Test a valuie to see if is valid and can be represented here. - - The value to test. - Returns true if the value is valid and can be represented; false if not. - - NTFS filetimes are 64-bit unsigned integers, stored in Intel - (least significant byte first) byte order. They determine the - number of 1.0E-07 seconds (1/10th microseconds!) past WinNT "epoch", - which is "01-Jan-1601 00:00:00 UTC". 28 May 60056 is the upper limit - - - - - Get/set the last modification time. - - - - - Get /set the create time - - - - - Get /set the last access time. - - - - - A factory that creates tagged data instances. - - - - - Get data for a specific tag value. - - The tag ID to find. - The data to search. - The offset to begin extracting data from. - The number of bytes to extract. - The located value found, or null if not found. - - - - - A class to handle the extra data field for Zip entries - - - Extra data contains 0 or more values each prefixed by a header tag and length. - They contain zero or more bytes of actual data. - The data is held internally using a copy on write strategy. This is more efficient but - means that for extra data created by passing in data can have the values modified by the caller - in some circumstances. - - - - - Initialise a default instance. - - - - - Initialise with known extra data. - - The extra data. - - - - Get the raw extra data value - - Returns the raw byte[] extra data this instance represents. - - - - Clear the stored data. - - - - - Gets the current extra data length. - - - - - Get a read-only for the associated tag. - - The tag to locate data for. - Returns a containing tag data or null if no tag was found. - - - - Get the tagged data for a tag. - - The tag to search for. - Returns a tagged value or null if none found. - - - - Get the length of the last value found by - - This is only valid if has previously returned true. - - - - Get the index for the current read value. - - This is only valid if has previously returned true. - Initially the result will be the index of the first byte of actual data. The value is updated after calls to - , and . - - - - Get the number of bytes remaining to be read for the current value; - - - - - Find an extra data value - - The identifier for the value to find. - Returns true if the value was found; false otherwise. - - - - Add a new entry to extra data. - - The value to add. - - - - Add a new entry to extra data - - The ID for this entry. - The data to add. - If the ID already exists its contents are replaced. - - - - Start adding a new entry. - - Add data using , , , or . - The new entry is completed and actually added by calling - - - - - Add entry data added since using the ID passed. - - The identifier to use for this entry. - - - - Add a byte of data to the pending new entry. - - The byte to add. - - - - - Add data to a pending new entry. - - The data to add. - - - - - Add a short value in little endian order to the pending new entry. - - The data to add. - - - - - Add an integer value in little endian order to the pending new entry. - - The data to add. - - - - - Add a long value in little endian order to the pending new entry. - - The data to add. - - - - - Delete an extra data field. - - The identifier of the field to delete. - Returns true if the field was found and deleted. - - - - Read a long in little endian form from the last found data value - - Returns the long value read. - - - - Read an integer in little endian form from the last found data value. - - Returns the integer read. - - - - Read a short value in little endian form from the last found data value. - - Returns the short value read. - - - - Read a byte from an extra data - - The byte value read or -1 if the end of data has been reached. - - - - Skip data during reading. - - The number of bytes to skip. - - - - Internal form of that reads data at any location. - - Returns the short value read. - - - - Dispose of this instance. - - - - - Arguments used with KeysRequiredEvent - - - - - Initialise a new instance of - - The name of the file for which keys are required. - - - - Initialise a new instance of - - The name of the file for which keys are required. - The current key value. - - - - Gets the name of the file for which keys are required. - - - - - Gets or sets the key value - - - - - The strategy to apply to testing. - - - - - Find the first error only. - - - - - Find all possible errors. - - - - - The operation in progress reported by a during testing. - - TestArchive - - - - Setting up testing. - - - - - Testing an individual entries header - - - - - Testing an individual entries data - - - - - Testing an individual entry has completed. - - - - - Running miscellaneous tests - - - - - Testing is complete - - - - - Status returned by during testing. - - TestArchive - - - - Initialise a new instance of - - The this status applies to. - - - - Get the current in progress. - - - - - Get the this status is applicable to. - - - - - Get the current/last entry tested. - - - - - Get the number of errors detected so far. - - - - - Get the number of bytes tested so far for the current entry. - - - - - Get a value indicating whether the last entry test was valid. - - - - - Delegate invoked during testing if supplied indicating current progress and status. - - If the message is non-null an error has occured. If the message is null - the operation as found in status has started. - - - - The possible ways of applying updates to an archive. - - - - - Perform all updates on temporary files ensuring that the original file is saved. - - - - - Update the archive directly, which is faster but less safe. - - - - - This class represents a Zip archive. You can ask for the contained - entries, or get an input stream for a file entry. The entry is - automatically decompressed. - - You can also update the archive adding or deleting entries. - - This class is thread safe for input: You can open input streams for arbitrary - entries in different threads. -
-
Author of the original java version : Jochen Hoenicke -
- - - using System; - using System.Text; - using System.Collections; - using System.IO; - - using StarkWebGL.SharpZipLib.Zip; - - class MainClass - { - static public void Main(string[] args) - { - using (ZipFile zFile = new ZipFile(args[0])) { - Console.WriteLine("Listing of : " + zFile.Name); - Console.WriteLine(""); - Console.WriteLine("Raw Size Size Date Time Name"); - Console.WriteLine("-------- -------- -------- ------ ---------"); - foreach (ZipEntry e in zFile) { - if ( e.IsFile ) { - DateTime d = e.DateTime; - Console.WriteLine("{0, -10}{1, -10}{2} {3} {4}", e.Size, e.CompressedSize, - d.ToString("dd-MM-yy"), d.ToString("HH:mm"), - e.Name); - } - } - } - } - } - - -
- - - Delegate for handling keys/password setting during compression/decompression. - - - - - Event handler for handling encryption keys. - - - - - Handles getting of encryption keys when required. - - The file for which encryption keys are required. - - - - Get/set the encryption key value. - - - - - Password to be used for encrypting/decrypting files. - - Set to null if no password is required. - - - - Get a value indicating whether encryption keys are currently available. - - - - - Opens a Zip file with the given name for reading. - - The name of the file to open. - The argument supplied is null. - - An i/o error occurs - - - The file doesn't contain a valid zip archive. - - - - - Opens a Zip file reading the given . - - The to read archive data from. - The supplied argument is null. - - An i/o error occurs. - - - The file doesn't contain a valid zip archive. - - - - - Opens a Zip file reading the given . - - The to read archive data from. - true to leave the file open when the ZipFile is disposed, false to dispose of it - The supplied argument is null. - - An i/o error occurs. - - - The file doesn't contain a valid zip archive. - - - - - Opens a Zip file reading the given . - - The to read archive data from. - - An i/o error occurs - - - The stream doesn't contain a valid zip archive.
-
- - The stream doesnt support seeking. - - - The stream argument is null. - -
- - - Opens a Zip file reading the given . - - The to read archive data from. - true to leave the stream open when the ZipFile is disposed, false to dispose of it - - An i/o error occurs - - - The stream doesn't contain a valid zip archive.
-
- - The stream doesnt support seeking. - - - The stream argument is null. - -
- - - Initialises a default instance with no entries and no file storage. - - - - - Finalize this instance. - - - - - Closes the ZipFile. If the stream is owned then this also closes the underlying input stream. - Once closed, no further instance methods should be called. - - - An i/o error occurs. - - - - - Create a new whose data will be stored in a file. - - The name of the archive to create. - Returns the newly created - is null - - - - Create a new whose data will be stored on a stream. - - The stream providing data storage. - Returns the newly created - is null - doesnt support writing. - - - - Get/set a flag indicating if the underlying stream is owned by the ZipFile instance. - If the flag is true then the stream will be closed when Close is called. - - - The default value is true in all cases. - - - - - Get a value indicating whether - this archive is embedded in another file or not. - - - - - Get a value indicating that this archive is a new one. - - - - - Gets the comment for the zip file. - - - - - Gets the name of this zip file. - - - - - Gets the number of entries in this zip file. - - - The Zip file has been closed. - - - - - Get the number of entries contained in this . - - - - - Indexer property for ZipEntries - - - - - Gets an enumerator for the Zip entries in this Zip file. - - Returns an for this archive. - - The Zip file has been closed. - - - - - Return the index of the entry with a matching name - - Entry name to find - If true the comparison is case insensitive - The index position of the matching entry or -1 if not found - - The Zip file has been closed. - - - - - Searches for a zip entry in this archive with the given name. - String comparisons are case insensitive - - - The name to find. May contain directory components separated by slashes ('/'). - - - A clone of the zip entry, or null if no entry with that name exists. - - - The Zip file has been closed. - - - - - Gets an input stream for reading the given zip entry data in an uncompressed form. - Normally the should be an entry returned by GetEntry(). - - The to obtain a data for - An input containing data for this - - The ZipFile has already been closed - - - The compression method for the entry is unknown - - - The entry is not found in the ZipFile - - - - - Creates an input stream reading a zip entry - - The index of the entry to obtain an input stream for. - - An input containing data for this - - - The ZipFile has already been closed - - - The compression method for the entry is unknown - - - The entry is not found in the ZipFile - - - - - Test an archive for integrity/validity - - Perform low level data Crc check - true if all tests pass, false otherwise - Testing will terminate on the first error found. - - - - Test an archive for integrity/validity - - Perform low level data Crc check - The to apply. - The handler to call during testing. - true if all tests pass, false otherwise - The object has already been closed. - - - - Test a local header against that provided from the central directory - - - The entry to test against - - The type of tests to carry out. - The offset of the entries data in the file - - - - The kind of update to apply. - - - - - Get / set the to apply to names when updating. - - - - - Get/set the used to generate values - during updates. - - - - - Get /set the buffer size to be used when updating this zip file. - - - - - Get a value indicating an update has been started. - - - - - Get / set a value indicating how Zip64 Extension usage is determined when adding entries. - - - - - Begin updating this archive. - - The archive storage for use during the update. - The data source to utilise during updating. - ZipFile has been closed. - One of the arguments provided is null - ZipFile has been closed. - - - - Begin updating to this archive. - - The storage to use during the update. - - - - Begin updating this archive. - - - - - - - - Commit current updates, updating this archive. - - - - ZipFile has been closed. - - - - Abort updating leaving the archive unchanged. - - - - - - - Set the file comment to be recorded when the current update is commited. - - The comment to record. - ZipFile has been closed. - - - - Add a new entry to the archive. - - The name of the file to add. - The compression method to use. - Ensure Unicode text is used for name and comment for this entry. - Argument supplied is null. - ZipFile has been closed. - Compression method is not supported for creating entries. - - - - Add a new entry to the archive. - - The name of the file to add. - The compression method to use. - ZipFile has been closed. - Compression method is not supported for creating entries. - - - - Add a file to the archive. - - The name of the file to add. - Argument supplied is null. - - - - Add a file to the archive. - - The name of the file to add. - The name to use for the on the Zip file created. - Argument supplied is null. - - - - Add a file entry with data. - - The source of the data for this entry. - The name to give to the entry. - - - - Add a file entry with data. - - The source of the data for this entry. - The name to give to the entry. - The compression method to use. - Compression method is not supported for creating entries. - - - - Add a file entry with data. - - The source of the data for this entry. - The name to give to the entry. - The compression method to use. - Ensure Unicode text is used for name and comments for this entry. - Compression method is not supported for creating entries. - - - - Add a that contains no data. - - The entry to add. - This can be used to add directories, volume labels, or empty file entries. - - - - Add a with data. - - The source of the data for this entry. - The entry to add. - This can be used to add file entries with a custom data source. - - The encryption method specified in is unsupported. - - Compression method is not supported for creating entries. - - - - Add a directory entry to the archive. - - The directory to add. - - - - Check if the specified compression method is supported for adding a new entry. - - The compression method for the new entry. - - - - Delete an entry by name - - The filename to delete - True if the entry was found and deleted; false otherwise. - - - - Delete a from the archive. - - The entry to delete. - - - - Write an unsigned short in little endian byte order. - - - - - Write an int in little endian byte order. - - - - - Write an unsigned int in little endian byte order. - - - - - Write a long in little endian byte order. - - - - - Get a raw memory buffer. - - Returns a raw memory buffer. - - - - Get the size of the source descriptor for a . - - The update to get the size for. - Whether to include the signature size - The descriptor size, zero if there isn't one. - - - - Get an output stream for the specified - - The entry to get an output stream for. - The output stream obtained for the entry. - - - - Class used to sort updates. - - - - - Compares two objects and returns a value indicating whether one is - less than, equal to or greater than the other. - - First object to compare - Second object to compare. - Compare result. - - - - Represents a pending update to a Zip file. - - - - - Copy an existing entry. - - The existing entry to copy. - - - - Get the for this update. - - This is the source or original entry. - - - - Get the that will be written to the updated/new file. - - - - - Get the command for this update. - - - - - Get the filename if any for this update. Null if none exists. - - - - - Get/set the location of the size patch for this update. - - - - - Get /set the location of the crc patch for this update. - - - - - Get/set the size calculated by offset. - Specifically, the difference between this and next entry's starting offset. - - - - - Releases the unmanaged resources used by the this instance and optionally releases the managed resources. - - true to release both managed and unmanaged resources; - false to release only unmanaged resources. - - - - Read an unsigned short in little endian byte order. - - Returns the value read. - - The stream ends prematurely - - - - - Read a uint in little endian byte order. - - Returns the value read. - - An i/o error occurs. - - - The file ends prematurely - - - - - Search for and read the central directory of a zip file filling the entries array. - - - An i/o error occurs. - - - The central directory is malformed or cannot be found - - - - - Locate the data for a given entry. - - - The start offset of the data. - - - The stream ends prematurely - - - The local header signature is invalid, the entry and central header file name lengths are different - or the local and entry compression methods dont match - - - - - Represents a string from a which is stored as an array of bytes. - - - - - Initialise a with a string. - - The textual string form. - - - - Initialise a using a string in its binary 'raw' form. - - - - - - Get a value indicating the original source of data for this instance. - True if the source was a string; false if the source was binary data. - - - - - Get the length of the comment when represented as raw bytes. - - - - - Get the comment in its 'raw' form as plain bytes. - - - - - Reset the comment to its initial state. - - - - - Implicit conversion of comment to a string. - - The to convert to a string. - The textual equivalent for the input value. - - - - An enumerator for Zip entries - - - - - An is a stream that you can write uncompressed data - to and flush, but cannot read, seek or do anything else to. - - - - - Gets a value indicating whether the current stream supports reading. - - - - - Write any buffered data to underlying storage. - - - - - Gets a value indicating whether the current stream supports writing. - - - - - Gets a value indicating whether the current stream supports seeking. - - - - - Get the length in bytes of the stream. - - - - - Gets or sets the position within the current stream. - - - - - Reads a sequence of bytes from the current stream and advances the position within the stream by the number of bytes read. - - An array of bytes. When this method returns, the buffer contains the specified byte array with the values between offset and (offset + count - 1) replaced by the bytes read from the current source. - The zero-based byte offset in buffer at which to begin storing the data read from the current stream. - The maximum number of bytes to be read from the current stream. - - The total number of bytes read into the buffer. This can be less than the number of bytes requested if that many bytes are not currently available, or zero (0) if the end of the stream has been reached. - - The sum of offset and count is larger than the buffer length. - Methods were called after the stream was closed. - The stream does not support reading. - buffer is null. - An I/O error occurs. - offset or count is negative. - - - - Sets the position within the current stream. - - A byte offset relative to the origin parameter. - A value of type indicating the reference point used to obtain the new position. - - The new position within the current stream. - - An I/O error occurs. - The stream does not support seeking, such as if the stream is constructed from a pipe or console output. - Methods were called after the stream was closed. - - - - Sets the length of the current stream. - - The desired length of the current stream in bytes. - The stream does not support both writing and seeking, such as if the stream is constructed from a pipe or console output. - An I/O error occurs. - Methods were called after the stream was closed. - - - - Writes a sequence of bytes to the current stream and advances the current position within this stream by the number of bytes written. - - An array of bytes. This method copies count bytes from buffer to the current stream. - The zero-based byte offset in buffer at which to begin copying bytes to the current stream. - The number of bytes to be written to the current stream. - An I/O error occurs. - The stream does not support writing. - Methods were called after the stream was closed. - buffer is null. - The sum of offset and count is greater than the buffer length. - offset or count is negative. - - - - A is an - whose data is only a part or subsection of a file. - - - - - Initialise a new instance of the class. - - The containing the underlying stream to use for IO. - The start of the partial data. - The length of the partial data. - - - - Read a byte from this stream. - - Returns the byte read or -1 on end of stream. - - - - Reads a sequence of bytes from the current stream and advances the position within the stream by the number of bytes read. - - An array of bytes. When this method returns, the buffer contains the specified byte array with the values between offset and (offset + count - 1) replaced by the bytes read from the current source. - The zero-based byte offset in buffer at which to begin storing the data read from the current stream. - The maximum number of bytes to be read from the current stream. - - The total number of bytes read into the buffer. This can be less than the number of bytes requested if that many bytes are not currently available, or zero (0) if the end of the stream has been reached. - - The sum of offset and count is larger than the buffer length. - Methods were called after the stream was closed. - The stream does not support reading. - buffer is null. - An I/O error occurs. - offset or count is negative. - - - - Writes a sequence of bytes to the current stream and advances the current position within this stream by the number of bytes written. - - An array of bytes. This method copies count bytes from buffer to the current stream. - The zero-based byte offset in buffer at which to begin copying bytes to the current stream. - The number of bytes to be written to the current stream. - An I/O error occurs. - The stream does not support writing. - Methods were called after the stream was closed. - buffer is null. - The sum of offset and count is greater than the buffer length. - offset or count is negative. - - - - When overridden in a derived class, sets the length of the current stream. - - The desired length of the current stream in bytes. - The stream does not support both writing and seeking, such as if the stream is constructed from a pipe or console output. - An I/O error occurs. - Methods were called after the stream was closed. - - - - When overridden in a derived class, sets the position within the current stream. - - A byte offset relative to the origin parameter. - A value of type indicating the reference point used to obtain the new position. - - The new position within the current stream. - - An I/O error occurs. - The stream does not support seeking, such as if the stream is constructed from a pipe or console output. - Methods were called after the stream was closed. - - - - Clears all buffers for this stream and causes any buffered data to be written to the underlying device. - - An I/O error occurs. - - - - Gets or sets the position within the current stream. - - - The current position within the stream. - An I/O error occurs. - The stream does not support seeking. - Methods were called after the stream was closed. - - - - Gets the length in bytes of the stream. - - - A long value representing the length of the stream in bytes. - A class derived from Stream does not support seeking. - Methods were called after the stream was closed. - - - - Gets a value indicating whether the current stream supports writing. - - false - true if the stream supports writing; otherwise, false. - - - - Gets a value indicating whether the current stream supports seeking. - - true - true if the stream supports seeking; otherwise, false. - - - - Gets a value indicating whether the current stream supports reading. - - true. - true if the stream supports reading; otherwise, false. - - - - Gets a value that determines whether the current stream can time out. - - - A value that determines whether the current stream can time out. - - - - Provides a static way to obtain a source of data for an entry. - - - - - Get a source of data by creating a new stream. - - Returns a to use for compression input. - Ideally a new stream is created and opened to achieve this, to avoid locking problems. - - - - Represents a source of data that can dynamically provide - multiple data sources based on the parameters passed. - - - - - Get a data source. - - The to get a source for. - The name for data if known. - Returns a to use for compression input. - Ideally a new stream is created and opened to achieve this, to avoid locking problems. - - - - Default implementation of a for use with files stored on disk. - - - - - Initialise a new instance of - - The name of the file to obtain data from. - - - - Get a providing data. - - Returns a providing data. - - - - Default implementation of for files stored on disk. - - - - - Get a providing data for an entry. - - The entry to provide data for. - The file name for data if known. - Returns a stream providing data; or null if not available - - - - Defines facilities for data storage when updating Zip Archives. - - - - - Get the to apply during updates. - - - - - Get an empty that can be used for temporary output. - - Returns a temporary output - - - - - Convert a temporary output stream to a final stream. - - The resulting final - - - - - Make a temporary copy of the original stream. - - The to copy. - Returns a temporary output that is a copy of the input. - - - - Return a stream suitable for performing direct updates on the original source. - - The current stream. - Returns a stream suitable for direct updating. - This may be the current stream passed. - - - - Dispose of this instance. - - - - - An abstract suitable for extension by inheritance. - - - - - Initializes a new instance of the class. - - The update mode. - - - - Gets a temporary output - - Returns the temporary output stream. - - - - - Converts the temporary to its final form. - - Returns a that can be used to read - the final storage for the archive. - - - - - Make a temporary copy of a . - - The to make a copy of. - Returns a temporary output that is a copy of the input. - - - - Return a stream suitable for performing direct updates on the original source. - - The to open for direct update. - Returns a stream suitable for direct updating. - - - - Disposes this instance. - - - - - Gets the update mode applicable. - - The update mode. - - - - An implementation suitable for hard disks. - - - - - Initializes a new instance of the class. - - The file. - The update mode. - - - - Initializes a new instance of the class. - - The file. - - - - Gets a temporary output for performing updates on. - - Returns the temporary output stream. - - - - Converts a temporary to its final form. - - Returns a that can be used to read - the final storage for the archive. - - - - Make a temporary copy of a stream. - - The to copy. - Returns a temporary output that is a copy of the input. - - - - Return a stream suitable for performing direct updates on the original source. - - The current stream. - Returns a stream suitable for direct updating. - If the is not null this is used as is. - - - - Disposes this instance. - - - - - An implementation suitable for in memory streams. - - - - - Initializes a new instance of the class. - - - - - Initializes a new instance of the class. - - The to use - This constructor is for testing as memory streams dont really require safe mode. - - - - Get the stream returned by if this was in fact called. - - - - - Gets the temporary output - - Returns the temporary output stream. - - - - Converts the temporary to its final form. - - Returns a that can be used to read - the final storage for the archive. - - - - Make a temporary copy of the original stream. - - The to copy. - Returns a temporary output that is a copy of the input. - - - - Return a stream suitable for performing direct updates on the original source. - - The original source stream - Returns a stream suitable for direct updating. - If the passed is not null this is used; - otherwise a new is returned. - - - - Disposes this instance. - - - - - Holds data pertinent to a data descriptor. - - - - - Get /set the compressed size of data. - - - - - Get / set the uncompressed size of data - - - - - Get /set the crc value. - - - - - This class assists with writing/reading from Zip files. - - - - - Initialise an instance of this class. - - The name of the file to open. - - - - Initialise a new instance of . - - The stream to use. - - - - Get / set a value indicating whether the underlying stream is owned or not. - - If the stream is owned it is closed when this instance is closed. - - - - Close the stream. - - - The underlying stream is closed only if is true. - - - - - Locates a block with the desired . - - The signature to find. - Location, marking the end of block. - Minimum size of the block. - The maximum variable data. - Returns the offset of the first byte after the signature; -1 if not found - - - - Write Zip64 end of central directory records (File header and locator). - - The number of entries in the central directory. - The size of entries in the central directory. - The offset of the central directory. - - - - Write the required records to end the central directory. - - The number of entries in the directory. - The size of the entries in the directory. - The start of the central directory. - The archive comment. (This can be null). - - - - Read an unsigned short in little endian byte order. - - Returns the value read. - - An i/o error occurs. - - - The file ends prematurely - - - - - Read an int in little endian byte order. - - Returns the value read. - - An i/o error occurs. - - - The file ends prematurely - - - - - Read a long in little endian byte order. - - The value read. - - - - Write an unsigned short in little endian byte order. - - The value to write. - - - - Write a ushort in little endian byte order. - - The value to write. - - - - Write an int in little endian byte order. - - The value to write. - - - - Write a uint in little endian byte order. - - The value to write. - - - - Write a long in little endian byte order. - - The value to write. - - - - Write a ulong in little endian byte order. - - The value to write. - - - - Write a data descriptor. - - The entry to write a descriptor for. - Returns the number of descriptor bytes written. - - - - Read data descriptor at the end of compressed data. - - if set to true [zip64]. - The data to fill in. - Returns the number of bytes read in the descriptor. - - - - This is an InflaterInputStream that reads the files baseInputStream an zip archive - one after another. It has a special method to get the zip entry of - the next file. The zip entry contains information about the file name - size, compressed size, Crc, etc. - It includes support for Stored and Deflated entries. -
-
Author of the original java version : Jochen Hoenicke -
- - This sample shows how to read a zip file - - using System; - using System.Text; - using System.IO; - - using StarkWebGL.SharpZipLib.Zip; - - class MainClass - { - public static void Main(string[] args) - { - using ( ZipInputStream s = new ZipInputStream(File.OpenRead(args[0]))) { - - ZipEntry theEntry; - const int size = 2048; - byte[] data = new byte[2048]; - - while ((theEntry = s.GetNextEntry()) != null) { - if ( entry.IsFile ) { - Console.Write("Show contents (y/n) ?"); - if (Console.ReadLine() == "y") { - while (true) { - size = s.Read(data, 0, data.Length); - if (size > 0) { - Console.Write(new ASCIIEncoding().GetString(data, 0, size)); - } else { - break; - } - } - } - } - } - } - } - } - - -
- - - Delegate for reading bytes from a stream. - - - - - The current reader this instance. - - - - - Creates a new Zip input stream, for reading a zip archive. - - The underlying providing data. - - - - Creates a new Zip input stream, for reading a zip archive. - - The underlying providing data. - Size of the buffer. - - - - Optional password used for encryption when non-null - - A password for all encrypted entries in this - - - - Gets a value indicating if there is a current entry and it can be decompressed - - - The entry can only be decompressed if the library supports the zip features required to extract it. - See the ZipEntry Version property for more details. - - Since uses the local headers for extraction, entries with no compression combined with the - flag set, cannot be extracted as the end of the entry data cannot be deduced. - - - - - Is the compression method for the specified entry supported? - - - Uses entry.CompressionMethodForHeader so that entries of type WinZipAES will be rejected. - - the entry to check. - true if the compression method is supported, false if not. - - - - Advances to the next entry in the archive - - - The next entry in the archive or null if there are no more entries. - - - If the previous entry is still open CloseEntry is called. - - - Input stream is closed - - - Password is not set, password is invalid, compression method is invalid, - version required to extract is not supported - - - - - Read data descriptor at the end of compressed data. - - - - - Complete cleanup as the final part of closing. - - True if the crc value should be tested - - - - Closes the current zip entry and moves to the next one. - - - The stream is closed - - - The Zip stream ends early - - - - - Returns 1 if there is an entry available - Otherwise returns 0. - - - - - Returns the current size that can be read from the current entry if available - - Thrown if the entry size is not known. - Thrown if no entry is currently available. - - - - Reads a byte from the current zip entry. - - - The byte or -1 if end of stream is reached. - - - - - Handle attempts to read by throwing an . - - The destination array to store data in. - The offset at which data read should be stored. - The maximum number of bytes to read. - Returns the number of bytes actually read. - - - - Handle attempts to read from this entry by throwing an exception - - - - - Handle attempts to read from this entry by throwing an exception - - - - - Perform the initial read on an entry which may include - reading encryption headers and setting up inflation. - - The destination to fill with data read. - The offset to start reading at. - The maximum number of bytes to read. - The actual number of bytes read. - - - - Read a block of bytes from the stream. - - The destination for the bytes. - The index to start storing data. - The number of bytes to attempt to read. - Returns the number of bytes read. - Zero bytes read means end of stream. - - - - Reads a block of bytes from the current zip entry. - - - The number of bytes read (this may be less than the length requested, even before the end of stream), or 0 on end of stream. - - - An i/o error occurred. - - - The deflated stream is corrupted. - - - The stream is not open. - - - - - Closes the zip input stream - - - - - ZipNameTransform transforms names as per the Zip file naming convention. - - The use of absolute names is supported although its use is not valid - according to Zip naming conventions, and should not be used if maximum compatability is desired. - - - - Initialize a new instance of - - - - - Initialize a new instance of - - The string to trim from the front of paths if found. - - - - Static constructor. - - - - - Transform a windows directory name according to the Zip file naming conventions. - - The directory name to transform. - The transformed name. - - - - Transform a windows file name according to the Zip file naming conventions. - - The file name to transform. - The transformed name. - - - - Get/set the path prefix to be trimmed from paths if present. - - The prefix is trimmed before any conversion from - a windows path is done. - - - - Force a name to be valid by replacing invalid characters with a fixed value - - The name to force valid - The replacement character to use. - Returns a valid name - - - - Test a name to see if it is a valid name for a zip entry. - - The name to test. - If true checking is relaxed about windows file names and absolute paths. - Returns true if the name is a valid zip name; false otherwise. - Zip path names are actually in Unix format, and should only contain relative paths. - This means that any path stored should not contain a drive or - device letter, or a leading slash. All slashes should forward slashes '/'. - An empty name is valid for a file where the input comes from standard input. - A null name is not considered valid. - - - - - Test a name to see if it is a valid name for a zip entry. - - The name to test. - Returns true if the name is a valid zip name; false otherwise. - Zip path names are actually in unix format, - and should only contain relative paths if a path is present. - This means that the path stored should not contain a drive or - device letter, or a leading slash. All slashes should forward slashes '/'. - An empty name is valid where the input comes from standard input. - A null name is not considered valid. - - - - - An implementation of INameTransform that transforms entry paths as per the Zip file naming convention. - Strips path roots and puts directory separators in the correct format ('/') - - - - - Initialize a new instance of - - - - - Transform a windows directory name according to the Zip file naming conventions. - - The directory name to transform. - The transformed name. - - - - Transform a windows file name according to the Zip file naming conventions. - - The file name to transform. - The transformed name. - - - - This is a DeflaterOutputStream that writes the files into a zip - archive one after another. It has a special method to start a new - zip entry. The zip entries contains information about the file name - size, compressed size, CRC, etc. - - It includes support for Stored and Deflated entries. - This class is not thread safe. -
-
Author of the original java version : Jochen Hoenicke -
- This sample shows how to create a zip file - - using System; - using System.IO; - - using StarkWebGL.SharpZipLib.Core; - using StarkWebGL.SharpZipLib.Zip; - - class MainClass - { - public static void Main(string[] args) - { - string[] filenames = Directory.GetFiles(args[0]); - byte[] buffer = new byte[4096]; - - using ( ZipOutputStream s = new ZipOutputStream(File.Create(args[1])) ) { - - s.SetLevel(9); // 0 - store only to 9 - means best compression - - foreach (string file in filenames) { - ZipEntry entry = new ZipEntry(file); - s.PutNextEntry(entry); - - using (FileStream fs = File.OpenRead(file)) { - StreamUtils.Copy(fs, s, buffer); - } - } - } - } - } - - -
- - - Creates a new Zip output stream, writing a zip archive. - - - The output stream to which the archive contents are written. - - - - - Creates a new Zip output stream, writing a zip archive. - - The output stream to which the archive contents are written. - Size of the buffer to use. - - - - Gets a flag value of true if the central header has been added for this archive; false if it has not been added. - - No further entries can be added once this has been done. - - - - Set the zip file comment. - - - The comment text for the entire archive. - - - The converted comment is longer than 0xffff bytes. - - - - - Sets the compression level. The new level will be activated - immediately. - - The new compression level (1 to 9). - - Level specified is not supported. - - - - - - Get the current deflater compression level - - The current compression level - - - - Get / set a value indicating how Zip64 Extension usage is determined when adding entries. - - Older archivers may not understand Zip64 extensions. - If backwards compatability is an issue be careful when adding entries to an archive. - Setting this property to off is workable but less desirable as in those circumstances adding a file - larger then 4GB will fail. - - - - Used for transforming the names of entries added by . - Defaults to , set to null to disable transforms and use names as supplied. - - - - - Write an unsigned short in little endian byte order. - - - - - Write an int in little endian byte order. - - - - - Write an int in little endian byte order. - - - - - Starts a new Zip entry. It automatically closes the previous - entry if present. - All entry elements bar name are optional, but must be correct if present. - If the compression method is stored and the output is not patchable - the compression for that entry is automatically changed to deflate level 0 - - - the entry. - - - if entry passed is null. - - - if an I/O error occured. - - - if stream was finished - - - Too many entries in the Zip file
- Entry name is too long
- Finish has already been called
-
- - The Compression method specified for the entry is unsupported. - -
- - - Closes the current entry, updating header and footer information as required - - - Invalid entry field values. - - - An I/O error occurs. - - - No entry is active. - - - - - Writes the given buffer to the current entry. - - The buffer containing data to write. - The offset of the first byte to write. - The number of bytes to write. - Archive size is invalid - No entry is active. - - - - Finishes the stream. This will write the central directory at the - end of the zip file and flush the stream. - - - This is automatically called when the stream is closed. - - - An I/O error occurs. - - - Comment exceeds the maximum length
- Entry name exceeds the maximum length -
-
- - - Flushes the stream by calling Flush on the deflater stream unless - the current compression method is . Then it flushes the underlying output stream. - - - - - The entries for the archive. - - - - - Used to track the crc of data added to entries. - - - - - The current entry being added. - - - - - Used to track the size of data for an entry during writing. - - - - - Offset to be recorded for each entry in the central header. - - - - - Comment for the entire archive recorded in central header. - - - - - Flag indicating that header patching is required for the current entry. - - - - - Position to patch crc - - - - - Position to patch size. - - - - - This static class contains functions for encoding and decoding zip file strings - - - - Code page backing field - - The original Zip specification (https://pkware.cachefly.net/webdocs/casestudies/APPNOTE.TXT) states - that file names should only be encoded with IBM Code Page 437 or UTF-8. - In practice, most zip apps use OEM or system encoding (typically cp437 on Windows). - Let's be good citizens and default to UTF-8 http://utf8everywhere.org/ - - - - Automatically select codepage while opening archive - see https://github.com/icsharpcode/SharpZipLib/pull/280#issuecomment-433608324 - - - - - Encoding used for string conversion. Setting this to 65001 (UTF-8) will - also set the Language encoding flag to indicate UTF-8 encoded file names. - - - - - Attempt to get the operating system default codepage, or failing that, to - the fallback code page IBM 437. - - - - - Get whether the default codepage is set to UTF-8. Setting this property to false will - set the to - - - /// Get OEM codepage from NetFX, which parses the NLP file with culture info table etc etc. - But sometimes it yields the special value of 1 which is nicknamed CodePageNoOEM in sources (might also mean CP_OEMCP, but Encoding puts it so). - This was observed on Ukranian and Hindu systems. - Given this value, throws an . - So replace it with , (IBM 437 which is the default code page in a default Windows installation console. - - - - - Convert a portion of a byte array to a string using - - - Data to convert to string - - - Number of bytes to convert starting from index 0 - - - data[0]..data[count - 1] converted to a string - - - - - Convert a byte array to a string using - - - Byte array to convert - - - dataconverted to a string - - - - - Convert a byte array to a string using - - The applicable general purpose bits flags - - Byte array to convert - - The number of bytes to convert. - - dataconverted to a string - - - - - Convert a byte array to a string using - - - Byte array to convert - - The applicable general purpose bits flags - - dataconverted to a string - - - - - Convert a string to a byte array using - - - String to convert to an array - - Converted array - - - - Convert a string to a byte array using - - The applicable general purpose bits flags - - String to convert to an array - - Converted array - - - - This is the Deflater class. The deflater class compresses input - with the deflate algorithm described in RFC 1951. It has several - compression levels and three different strategies described below. - - This class is not thread safe. This is inherent in the API, due - to the split of deflate and setInput. - - author of the original java version : Jochen Hoenicke - - - - - The best and slowest compression level. This tries to find very - long and distant string repetitions. - - - - - The worst but fastest compression level. - - - - - The default compression level. - - - - - This level won't compress at all but output uncompressed blocks. - - - - - The compression method. This is the only method supported so far. - There is no need to use this constant at all. - - - - - Compression Level as an enum for safer use - - - - - The best and slowest compression level. This tries to find very - long and distant string repetitions. - - - - - The worst but fastest compression level. - - - - - The default compression level. - - - - - This level won't compress at all but output uncompressed blocks. - - - - - The compression method. This is the only method supported so far. - There is no need to use this constant at all. - - - - - Creates a new deflater with default compression level. - - - - - Creates a new deflater with given compression level. - - - the compression level, a value between NO_COMPRESSION - and BEST_COMPRESSION, or DEFAULT_COMPRESSION. - - if lvl is out of range. - - - - Creates a new deflater with given compression level. - - - the compression level, a value between NO_COMPRESSION - and BEST_COMPRESSION. - - - true, if we should suppress the Zlib/RFC1950 header at the - beginning and the adler checksum at the end of the output. This is - useful for the GZIP/PKZIP formats. - - if lvl is out of range. - - - - Resets the deflater. The deflater acts afterwards as if it was - just created with the same compression level and strategy as it - had before. - - - - - Gets the current adler checksum of the data that was processed so far. - - - - - Gets the number of input bytes processed so far. - - - - - Gets the number of output bytes so far. - - - - - Flushes the current input block. Further calls to deflate() will - produce enough output to inflate everything in the current input - block. This is not part of Sun's JDK so I have made it package - private. It is used by DeflaterOutputStream to implement - flush(). - - - - - Finishes the deflater with the current input block. It is an error - to give more input after this method was called. This method must - be called to force all bytes to be flushed. - - - - - Returns true if the stream was finished and no more output bytes - are available. - - - - - Returns true, if the input buffer is empty. - You should then call setInput(). - NOTE: This method can also return true when the stream - was finished. - - - - - Sets the data which should be compressed next. This should be only - called when needsInput indicates that more input is needed. - If you call setInput when needsInput() returns false, the - previous input that is still pending will be thrown away. - The given byte array should not be changed, before needsInput() returns - true again. - This call is equivalent to setInput(input, 0, input.length). - - - the buffer containing the input data. - - - if the buffer was finished() or ended(). - - - - - Sets the data which should be compressed next. This should be - only called when needsInput indicates that more input is needed. - The given byte array should not be changed, before needsInput() returns - true again. - - - the buffer containing the input data. - - - the start of the data. - - - the number of data bytes of input. - - - if the buffer was Finish()ed or if previous input is still pending. - - - - - Sets the compression level. There is no guarantee of the exact - position of the change, but if you call this when needsInput is - true the change of compression level will occur somewhere near - before the end of the so far given input. - - - the new compression level. - - - - - Get current compression level - - Returns the current compression level - - - - Sets the compression strategy. Strategy is one of - DEFAULT_STRATEGY, HUFFMAN_ONLY and FILTERED. For the exact - position where the strategy is changed, the same as for - SetLevel() applies. - - - The new compression strategy. - - - - - Deflates the current input block with to the given array. - - - The buffer where compressed data is stored - - - The number of compressed bytes added to the output, or 0 if either - IsNeedingInput() or IsFinished returns true or length is zero. - - - - - Deflates the current input block to the given array. - - - Buffer to store the compressed data. - - - Offset into the output array. - - - The maximum number of bytes that may be stored. - - - The number of compressed bytes added to the output, or 0 if either - needsInput() or finished() returns true or length is zero. - - - If Finish() was previously called. - - - If offset or length don't match the array length. - - - - - Sets the dictionary which should be used in the deflate process. - This call is equivalent to setDictionary(dict, 0, dict.Length). - - - the dictionary. - - - if SetInput () or Deflate () were already called or another dictionary was already set. - - - - - Sets the dictionary which should be used in the deflate process. - The dictionary is a byte array containing strings that are - likely to occur in the data which should be compressed. The - dictionary is not stored in the compressed output, only a - checksum. To decompress the output you need to supply the same - dictionary again. - - - The dictionary data - - - The index where dictionary information commences. - - - The number of bytes in the dictionary. - - - If SetInput () or Deflate() were already called or another dictionary was already set. - - - - - Compression level. - - - - - If true no Zlib/RFC1950 headers or footers are generated - - - - - The current state. - - - - - The total bytes of output written. - - - - - The pending output. - - - - - The deflater engine. - - - - - This class contains constants used for deflation. - - - - - Set to true to enable debugging - - - - - Written to Zip file to identify a stored block - - - - - Identifies static tree in Zip file - - - - - Identifies dynamic tree in Zip file - - - - - Header flag indicating a preset dictionary for deflation - - - - - Sets internal buffer sizes for Huffman encoding - - - - - Internal compression engine constant - - - - - Internal compression engine constant - - - - - Internal compression engine constant - - - - - Internal compression engine constant - - - - - Internal compression engine constant - - - - - Internal compression engine constant - - - - - Internal compression engine constant - - - - - Internal compression engine constant - - - - - Internal compression engine constant - - - - - Internal compression engine constant - - - - - Internal compression engine constant - - - - - Internal compression engine constant - - - - - Internal compression engine constant - - - - - Internal compression engine constant - - - - - Internal compression engine constant - - - - - Internal compression engine constant - - - - - Internal compression engine constant - - - - - Internal compression engine constant - - - - - Internal compression engine constant - - - - - Internal compression engine constant - - - - - Internal compression engine constant - - - - - Strategies for deflater - - - - - The default strategy - - - - - This strategy will only allow longer string repetitions. It is - useful for random data with a small character set. - - - - - This strategy will not look for string repetitions at all. It - only encodes with Huffman trees (which means, that more common - characters get a smaller encoding. - - - - - Low level compression engine for deflate algorithm which uses a 32K sliding window - with secondary compression from Huffman/Shannon-Fano codes. - - - - - Construct instance with pending buffer - Adler calculation will be performed - - - Pending buffer to use - - - - - Construct instance with pending buffer - - - Pending buffer to use - - - If no adler calculation should be performed - - - - - Deflate drives actual compression of data - - True to flush input buffers - Finish deflation with the current input. - Returns true if progress has been made. - - - - Sets input data to be deflated. Should only be called when NeedsInput() - returns true - - The buffer containing input data. - The offset of the first byte of data. - The number of bytes of data to use as input. - - - - Determines if more input is needed. - - Return true if input is needed via SetInput - - - - Set compression dictionary - - The buffer containing the dictionary data - The offset in the buffer for the first byte of data - The length of the dictionary data. - - - - Reset internal state - - - - - Reset Adler checksum - - - - - Get current value of Adler checksum - - - - - Total data processed - - - - - Get/set the deflate strategy - - - - - Set the deflate level (0-9) - - The value to set the level to. - - - - Fill the window - - - - - Inserts the current string in the head hash and returns the previous - value for this hash. - - The previous hash value - - - - Find the best (longest) string in the window matching the - string starting at strstart. - - Preconditions: - - strstart + DeflaterConstants.MAX_MATCH <= window.length. - - - True if a match greater than the minimum length is found - - - - Hashtable, hashing three characters to an index for window, so - that window[index]..window[index+2] have this hash code. - Note that the array should really be unsigned short, so you need - to and the values with 0xffff. - - - - - prev[index & WMASK] points to the previous index that has the - same hash code as the string starting at index. This way - entries with the same hash code are in a linked list. - Note that the array should really be unsigned short, so you need - to and the values with 0xffff. - - - - - Points to the current character in the window. - - - - - lookahead is the number of characters starting at strstart in - window that are valid. - So window[strstart] until window[strstart+lookahead-1] are valid - characters. - - - - - This array contains the part of the uncompressed stream that - is of relevance. The current character is indexed by strstart. - - - - - The current compression function. - - - - - The input data for compression. - - - - - The total bytes of input read. - - - - - The offset into inputBuf, where input data starts. - - - - - The end offset of the input data. - - - - - The adler checksum - - - - - This is the DeflaterHuffman class. - - This class is not thread safe. This is inherent in the API, due - to the split of Deflate and SetInput. - - author of the original java version : Jochen Hoenicke - - - - - Resets the internal state of the tree - - - - - Check that all frequencies are zero - - - At least one frequency is non-zero - - - - - Set static codes and length - - new codes - length for new codes - - - - Build dynamic codes and lengths - - - - - Get encoded length - - Encoded length, the sum of frequencies * lengths - - - - Scan a literal or distance tree to determine the frequencies of the codes - in the bit length tree. - - - - - Write tree values - - Tree to write - - - - Pending buffer to use - - - - - Construct instance with pending buffer - - Pending buffer to use - - - - Reset internal state - - - - - Write all trees to pending buffer - - The number/rank of treecodes to send. - - - - Compress current buffer writing data to pending buffer - - - - - Flush block to output with no compression - - Data to write - Index of first byte to write - Count of bytes to write - True if this is the last block - - - - Flush block to output with compression - - Data to flush - Index of first byte to flush - Count of bytes to flush - True if this is the last block - - - - Get value indicating if internal buffer is full - - true if buffer is full - - - - Add literal to buffer - - Literal value to add to buffer. - Value indicating internal buffer is full - - - - Add distance code and length to literal and distance trees - - Distance code - Length - Value indicating if internal buffer is full - - - - Reverse the bits of a 16 bit value. - - Value to reverse bits - Value with bits reversed - - - - This class stores the pending output of the Deflater. - - author of the original java version : Jochen Hoenicke - - - - - Construct instance with default buffer size - - - - - Inflater is used to decompress data that has been compressed according - to the "deflate" standard described in rfc1951. - - By default Zlib (rfc1950) headers and footers are expected in the input. - You can use constructor public Inflater(bool noHeader) passing true - if there is no Zlib header information - - The usage is as following. First you have to set some input with - SetInput(), then Inflate() it. If inflate doesn't - inflate any bytes there may be three reasons: -
    -
  • IsNeedingInput() returns true because the input buffer is empty. - You have to provide more input with SetInput(). - NOTE: IsNeedingInput() also returns true when, the stream is finished. -
  • -
  • IsNeedingDictionary() returns true, you have to provide a preset - dictionary with SetDictionary().
  • -
  • IsFinished returns true, the inflater has finished.
  • -
- Once the first output byte is produced, a dictionary will not be - needed at a later stage. - - author of the original java version : John Leuner, Jochen Hoenicke -
-
- - - Copy lengths for literal codes 257..285 - - - - - Extra bits for literal codes 257..285 - - - - - Copy offsets for distance codes 0..29 - - - - - Extra bits for distance codes - - - - - These are the possible states for an inflater - - - - - This variable contains the current state. - - - - - The adler checksum of the dictionary or of the decompressed - stream, as it is written in the header resp. footer of the - compressed stream. - Only valid if mode is DECODE_DICT or DECODE_CHKSUM. - - - - - The number of bits needed to complete the current state. This - is valid, if mode is DECODE_DICT, DECODE_CHKSUM, - DECODE_HUFFMAN_LENBITS or DECODE_HUFFMAN_DISTBITS. - - - - - True, if the last block flag was set in the last block of the - inflated stream. This means that the stream ends after the - current block. - - - - - The total number of inflated bytes. - - - - - The total number of bytes set with setInput(). This is not the - value returned by the TotalIn property, since this also includes the - unprocessed input. - - - - - This variable stores the noHeader flag that was given to the constructor. - True means, that the inflated stream doesn't contain a Zlib header or - footer. - - - - - Creates a new inflater or RFC1951 decompressor - RFC1950/Zlib headers and footers will be expected in the input data - - - - - Creates a new inflater. - - - True if no RFC1950/Zlib header and footer fields are expected in the input data - - This is used for GZIPed/Zipped input. - - For compatibility with - Sun JDK you should provide one byte of input more than needed in - this case. - - - - - Resets the inflater so that a new stream can be decompressed. All - pending input and output will be discarded. - - - - - Decodes a zlib/RFC1950 header. - - - False if more input is needed. - - - The header is invalid. - - - - - Decodes the dictionary checksum after the deflate header. - - - False if more input is needed. - - - - - Decodes the huffman encoded symbols in the input stream. - - - false if more input is needed, true if output window is - full or the current block ends. - - - if deflated stream is invalid. - - - - - Decodes the adler checksum after the deflate stream. - - - false if more input is needed. - - - If checksum doesn't match. - - - - - Decodes the deflated stream. - - - false if more input is needed, or if finished. - - - if deflated stream is invalid. - - - - - Sets the preset dictionary. This should only be called, if - needsDictionary() returns true and it should set the same - dictionary, that was used for deflating. The getAdler() - function returns the checksum of the dictionary needed. - - - The dictionary. - - - - - Sets the preset dictionary. This should only be called, if - needsDictionary() returns true and it should set the same - dictionary, that was used for deflating. The getAdler() - function returns the checksum of the dictionary needed. - - - The dictionary. - - - The index into buffer where the dictionary starts. - - - The number of bytes in the dictionary. - - - No dictionary is needed. - - - The adler checksum for the buffer is invalid - - - - - Sets the input. This should only be called, if needsInput() - returns true. - - - the input. - - - - - Sets the input. This should only be called, if needsInput() - returns true. - - - The source of input data - - - The index into buffer where the input starts. - - - The number of bytes of input to use. - - - No input is needed. - - - The index and/or count are wrong. - - - - - Inflates the compressed stream to the output buffer. If this - returns 0, you should check, whether IsNeedingDictionary(), - IsNeedingInput() or IsFinished() returns true, to determine why no - further output is produced. - - - the output buffer. - - - The number of bytes written to the buffer, 0 if no further - output can be produced. - - - if buffer has length 0. - - - if deflated stream is invalid. - - - - - Inflates the compressed stream to the output buffer. If this - returns 0, you should check, whether needsDictionary(), - needsInput() or finished() returns true, to determine why no - further output is produced. - - - the output buffer. - - - the offset in buffer where storing starts. - - - the maximum number of bytes to output. - - - the number of bytes written to the buffer, 0 if no further output can be produced. - - - if count is less than 0. - - - if the index and / or count are wrong. - - - if deflated stream is invalid. - - - - - Returns true, if the input buffer is empty. - You should then call setInput(). - NOTE: This method also returns true when the stream is finished. - - - - - Returns true, if a preset dictionary is needed to inflate the input. - - - - - Returns true, if the inflater has finished. This means, that no - input is needed and no output can be produced. - - - - - Gets the adler checksum. This is either the checksum of all - uncompressed bytes returned by inflate(), or if needsDictionary() - returns true (and thus no output was yet produced) this is the - adler checksum of the expected dictionary. - - - the adler checksum. - - - - - Gets the total number of output bytes returned by Inflate(). - - - the total number of output bytes. - - - - - Gets the total number of processed compressed input bytes. - - - The total number of bytes of processed input bytes. - - - - - Gets the number of unprocessed input bytes. Useful, if the end of the - stream is reached and you want to further process the bytes after - the deflate stream. - - - The number of bytes of the input which have not been processed. - - - - - Continue decoding header from until more bits are needed or decoding has been completed - - Returns whether decoding could be completed - - - - Get literal/length huffman tree, must not be used before has returned true - - If hader has not been successfully read by the state machine - - - - Get distance huffman tree, must not be used before has returned true - - If hader has not been successfully read by the state machine - - - - Huffman tree used for inflation - - - - - Literal length tree - - - - - Distance tree - - - - - Constructs a Huffman tree from the array of code lengths. - - - the array of code lengths - - - - - Reads the next symbol from input. The symbol is encoded using the - huffman tree. - - - input the input source. - - - the next symbol, or -1 if not enough input is available. - - - - - This class is general purpose class for writing data to a buffer. - - It allows you to write bits as well as bytes - Based on DeflaterPending.java - - author of the original java version : Jochen Hoenicke - - - - - Internal work buffer - - - - - construct instance using default buffer size of 4096 - - - - - construct instance using specified buffer size - - - size to use for internal buffer - - - - - Clear internal state/buffers - - - - - Write a byte to buffer - - - The value to write - - - - - Write a short value to buffer LSB first - - - The value to write. - - - - - write an integer LSB first - - The value to write. - - - - Write a block of data to buffer - - data to write - offset of first byte to write - number of bytes to write - - - - The number of bits written to the buffer - - - - - Align internal buffer on a byte boundary - - - - - Write bits to internal buffer - - source of bits - number of bits to write - - - - Write a short value to internal buffer most significant byte first - - value to write - - - - Indicates if buffer has been flushed - - - - - Flushes the pending buffer into the given output array. If the - output array is to small, only a partial flush is done. - - The output array. - The offset into output array. - The maximum number of bytes to store. - The number of bytes flushed. - - - - Convert internal buffer to byte array. - Buffer is empty on completion - - - The internal buffer contents converted to a byte array. - - - - - A special stream deflating or compressing the bytes that are - written to it. It uses a Deflater to perform actual deflating.
- Authors of the original java version : Tom Tromey, Jochen Hoenicke -
-
- - - Creates a new DeflaterOutputStream with a default Deflater and default buffer size. - - - the output stream where deflated output should be written. - - - - - Creates a new DeflaterOutputStream with the given Deflater and - default buffer size. - - - the output stream where deflated output should be written. - - - the underlying deflater. - - - - - Creates a new DeflaterOutputStream with the given Deflater and - buffer size. - - - The output stream where deflated output is written. - - - The underlying deflater to use - - - The buffer size in bytes to use when deflating (minimum value 512) - - - bufsize is less than or equal to zero. - - - baseOutputStream does not support writing - - - deflater instance is null - - - - - Finishes the stream by calling finish() on the deflater. - - - Not all input is deflated - - - - - Gets or sets a flag indicating ownership of underlying stream. - When the flag is true will close the underlying stream also. - - The default value is true. - - - - Allows client to determine if an entry can be patched after its added - - - - - Returns the 10 byte AUTH CODE to be appended immediately following the AES data stream. - - - - - Get/set the password used for encryption. - - When set to null or if the password is empty no encryption is performed - - - - Encrypt a block of data - - - Data to encrypt. NOTE the original contents of the buffer are lost - - - Offset of first byte in buffer to encrypt - - - Number of bytes in buffer to encrypt - - - - - Initializes encryption keys based on given . - - The password. - - - - Initializes encryption keys based on given password. - - - - - Deflates everything in the input buffers. This will call - def.deflate() until all bytes from the input buffers - are processed. - - - - - Gets value indicating stream can be read from - - - - - Gets a value indicating if seeking is supported for this stream - This property always returns false - - - - - Get value indicating if this stream supports writing - - - - - Get current length of stream - - - - - Gets the current position within the stream. - - Any attempt to set position - - - - Sets the current position of this stream to the given value. Not supported by this class! - - The offset relative to the to seek. - The to seek from. - The new position in the stream. - Any access - - - - Sets the length of this stream to the given value. Not supported by this class! - - The new stream length. - Any access - - - - Read a byte from stream advancing position by one - - The byte read cast to an int. THe value is -1 if at the end of the stream. - Any access - - - - Read a block of bytes from stream - - The buffer to store read data in. - The offset to start storing at. - The maximum number of bytes to read. - The actual number of bytes read. Zero if end of stream is detected. - Any access - - - - Flushes the stream by calling Flush on the deflater and then - on the underlying stream. This ensures that all bytes are flushed. - - - - - Calls and closes the underlying - stream when is true. - - - - - Get the Auth code for AES encrypted entries - - - - - Writes a single byte to the compressed output stream. - - - The byte value. - - - - - Writes bytes from an array to the compressed stream. - - - The byte array - - - The offset into the byte array where to start. - - - The number of bytes to write. - - - - - This buffer is used temporarily to retrieve the bytes from the - deflater and write them to the underlying output stream. - - - - - The deflater which is used to deflate the stream. - - - - - Base stream the deflater depends on. - - - - - An input buffer customised for use by - - - The buffer supports decryption of incoming data. - - - - - Initialise a new instance of with a default buffer size - - The stream to buffer. - - - - Initialise a new instance of - - The stream to buffer. - The size to use for the buffer - A minimum buffer size of 1KB is permitted. Lower sizes are treated as 1KB. - - - - Get the length of bytes in the - - - - - Get the contents of the raw data buffer. - - This may contain encrypted data. - - - - Get the number of useable bytes in - - - - - Get the contents of the clear text buffer. - - - - - Get/set the number of bytes available - - - - - Call passing the current clear text buffer contents. - - The inflater to set input for. - - - - Fill the buffer from the underlying input stream. - - - - - Read a buffer directly from the input stream - - The buffer to fill - Returns the number of bytes read. - - - - Read a buffer directly from the input stream - - The buffer to read into - The offset to start reading data into. - The number of bytes to read. - Returns the number of bytes read. - - - - Read clear text data from the input stream. - - The buffer to add data to. - The offset to start adding data at. - The number of bytes to read. - Returns the number of bytes actually read. - - - - Read a from the input stream. - - Returns the byte read. - - - - Read an in little endian byte order. - - The short value read case to an int. - - - - Read an in little endian byte order. - - The int value read. - - - - Read a in little endian byte order. - - The long value read. - - - - Get/set the to apply to any data. - - Set this value to null to have no transform applied. - - - - This filter stream is used to decompress data compressed using the "deflate" - format. The "deflate" format is described in RFC 1951. - - This stream may form the basis for other decompression filters, such - as the GZipInputStream. - - Author of the original java version : John Leuner. - - - - - Create an InflaterInputStream with the default decompressor - and a default buffer size of 4KB. - - - The InputStream to read bytes from - - - - - Create an InflaterInputStream with the specified decompressor - and a default buffer size of 4KB. - - - The source of input data - - - The decompressor used to decompress data read from baseInputStream - - - - - Create an InflaterInputStream with the specified decompressor - and the specified buffer size. - - - The InputStream to read bytes from - - - The decompressor to use - - - Size of the buffer to use - - - - - Gets or sets a flag indicating ownership of underlying stream. - When the flag is true will close the underlying stream also. - - The default value is true. - - - - Skip specified number of bytes of uncompressed data - - - Number of bytes to skip - - - The number of bytes skipped, zero if the end of - stream has been reached - - - The number of bytes to skip is less than or equal to zero. - - - - - Clear any cryptographic state. - - - - - Returns 0 once the end of the stream (EOF) has been reached. - Otherwise returns 1. - - - - - Fills the buffer with more data to decompress. - - - Stream ends early - - - - - Gets a value indicating whether the current stream supports reading - - - - - Gets a value of false indicating seeking is not supported for this stream. - - - - - Gets a value of false indicating that this stream is not writeable. - - - - - A value representing the length of the stream in bytes. - - - - - The current position within the stream. - Throws a NotSupportedException when attempting to set the position - - Attempting to set the position - - - - Flushes the baseInputStream - - - - - Sets the position within the current stream - Always throws a NotSupportedException - - The relative offset to seek to. - The defining where to seek from. - The new position in the stream. - Any access - - - - Set the length of the current stream - Always throws a NotSupportedException - - The new length value for the stream. - Any access - - - - Writes a sequence of bytes to stream and advances the current position - This method always throws a NotSupportedException - - The buffer containing data to write. - The offset of the first byte to write. - The number of bytes to write. - Any access - - - - Writes one byte to the current stream and advances the current position - Always throws a NotSupportedException - - The byte to write. - Any access - - - - Closes the input stream. When - is true the underlying stream is also closed. - - - - - Reads decompressed data into the provided buffer byte array - - - The array to read and decompress data into - - - The offset indicating where the data should be placed - - - The number of bytes to decompress - - The number of bytes read. Zero signals the end of stream - - Inflater needs a dictionary - - - - - Decompressor for this stream - - - - - Input buffer for this stream. - - - - - Base stream the inflater reads from. - - - - - The compressed size - - - - - Flag indicating whether this instance has been closed or not. - - - - - Contains the output from the Inflation process. - We need to have a window so that we can refer backwards into the output stream - to repeat stuff.
- Author of the original java version : John Leuner -
-
- - - Write a byte to this output window - - value to write - - if window is full - - - - - Append a byte pattern already in the window itself - - length of pattern to copy - distance from end of window pattern occurs - - If the repeated data overflows the window - - - - - Copy from input manipulator to internal window - - source of data - length of data to copy - the number of bytes copied - - - - Copy dictionary to window - - source dictionary - offset of start in source dictionary - length of dictionary - - If window isnt empty - - - - - Get remaining unfilled space in window - - Number of bytes left in window - - - - Get bytes available for output in window - - Number of bytes filled - - - - Copy contents of window to output - - buffer to copy to - offset to start at - number of bytes to count - The number of bytes copied - - If a window underflow occurs - - - - - Reset by clearing window so GetAvailable returns 0 - - - - - This class allows us to retrieve a specified number of bits from - the input buffer, as well as copy big byte blocks. - - It uses an int buffer to store up to 31 bits for direct - manipulation. This guarantees that we can get at least 16 bits, - but we only need at most 15, so this is all safe. - - There are some optimizations in this class, for example, you must - never peek more than 8 bits more than needed, and you must first - peek bits before you may drop them. This is not a general purpose - class but optimized for the behaviour of the Inflater. - - authors of the original java version : John Leuner, Jochen Hoenicke - - - - - Get the next sequence of bits but don't increase input pointer. bitCount must be - less or equal 16 and if this call succeeds, you must drop - at least n - 8 bits in the next call. - - The number of bits to peek. - - the value of the bits, or -1 if not enough bits available. */ - - - - - Tries to grab the next bits from the input and - sets to the value, adding . - - true if enough bits could be read, otherwise false - - - - Tries to grab the next bits from the input and - sets of to the value. - - true if enough bits could be read, otherwise false - - - - Drops the next n bits from the input. You should have called PeekBits - with a bigger or equal n before, to make sure that enough bits are in - the bit buffer. - - The number of bits to drop. - - - - Gets the next n bits and increases input pointer. This is equivalent - to followed by , except for correct error handling. - - The number of bits to retrieve. - - the value of the bits, or -1 if not enough bits available. - - - - - Gets the number of bits available in the bit buffer. This must be - only called when a previous PeekBits() returned -1. - - - the number of bits available. - - - - - Gets the number of bytes available. - - - The number of bytes available. - - - - - Skips to the next byte boundary. - - - - - Returns true when SetInput can be called - - - - - Copies bytes from input buffer to output buffer starting - at output[offset]. You have to make sure, that the buffer is - byte aligned. If not enough bytes are available, copies fewer - bytes. - - - The buffer to copy bytes to. - - - The offset in the buffer at which copying starts - - - The length to copy, 0 is allowed. - - - The number of bytes copied, 0 if no bytes were available. - - - Length is less than zero - - - Bit buffer isnt byte aligned - - - - - Resets state and empties internal buffers - - - - - Add more input for consumption. - Only call when IsNeedingInput returns true - - data to be input - offset of first byte of input - number of bytes of input to add. - -
-
diff --git a/Assets/Plugins/ByteGame/com.bytedance.starksdk.unitytools/Tools.meta b/Assets/Plugins/ByteGame/com.bytedance.starksdk.unitytools/Tools.meta index 3432b201..7981cc45 100644 --- a/Assets/Plugins/ByteGame/com.bytedance.starksdk.unitytools/Tools.meta +++ b/Assets/Plugins/ByteGame/com.bytedance.starksdk.unitytools/Tools.meta @@ -1,8 +1,8 @@ -fileFormatVersion: 2 -guid: 4d814a3c03d914a4c876153d8b873a36 -folderAsset: yes -DefaultImporter: - externalObjects: {} - userData: - assetBundleName: - assetBundleVariant: +fileFormatVersion: 2 +guid: 4d814a3c03d914a4c876153d8b873a36 +folderAsset: yes +DefaultImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/Plugins/ByteGame/com.bytedance.starksdk.unitytools/dofuscatorConfig.xml b/Assets/Plugins/ByteGame/com.bytedance.starksdk.unitytools/dofuscatorConfig.xml deleted file mode 100644 index f98cce2a..00000000 --- a/Assets/Plugins/ByteGame/com.bytedance.starksdk.unitytools/dofuscatorConfig.xml +++ /dev/null @@ -1,77 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/Assets/Plugins/ByteGame/com.bytedance.starksdk.unitytools/package.json b/Assets/Plugins/ByteGame/com.bytedance.starksdk.unitytools/package.json index 7e998b81..b825729b 100644 --- a/Assets/Plugins/ByteGame/com.bytedance.starksdk.unitytools/package.json +++ b/Assets/Plugins/ByteGame/com.bytedance.starksdk.unitytools/package.json @@ -2,8 +2,8 @@ { "displayName" : "Stark SDK - Unity Tools", "name" : "com.bytedance.starksdk.unitytools", - "version" : "2.5.101", - "description" : "SC\u6E38\u620F\u8C03\u8BD5\u53D1\u5E03\u5DE5\u5177\uFF0C\u672A\u6DF7\u6DC6\uFF0C\u4F9B\u6D4B\u8BD5", + "version" : "3.1.0", + "description" : "Stark SDK Unity Tools\\n\u7528\u4E8E\u6784\u5EFAUnity Apk\u3001WebGL\u4EE5\u53CA\u53D1\u5E03\u6E38\u620F\u5230\u6296\u97F3\u5E73\u53F0\u7684\u5DE5\u5177", "keywords" : [ ], "category" : "Libraries", @@ -13,6 +13,6 @@ "url" : "https://bytedance.feishu.cn/docs/doccnGEsOm0yquys4iAgtVi7nKh#" } ], - "unitySinceBuild" : "2019.4", + "unitySinceBuild" : "2021.3", "unityUntilBuild" : "*" } \ No newline at end of file diff --git a/Assets/Plugins/ByteGame/com.bytedance.starksdk.unitytools/package.json.meta b/Assets/Plugins/ByteGame/com.bytedance.starksdk.unitytools/package.json.meta index 34a4942a..d6f7efc1 100644 --- a/Assets/Plugins/ByteGame/com.bytedance.starksdk.unitytools/package.json.meta +++ b/Assets/Plugins/ByteGame/com.bytedance.starksdk.unitytools/package.json.meta @@ -1,7 +1,7 @@ -fileFormatVersion: 2 -guid: ef821ebf8e0d46043a2d6ad503530bdb -TextScriptImporter: - externalObjects: {} - userData: - assetBundleName: - assetBundleVariant: +fileFormatVersion: 2 +guid: 3c5a8ad6f0b1c4e6ab37b0a69cf0c57f +TextScriptImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/Plugins/ByteGame/com.bytedance.starksdk/Android/starkminiapk.aar b/Assets/Plugins/ByteGame/com.bytedance.starksdk/Android/starkminiapk.aar deleted file mode 100644 index b4556378..00000000 Binary files a/Assets/Plugins/ByteGame/com.bytedance.starksdk/Android/starkminiapk.aar and /dev/null differ diff --git a/Assets/Plugins/ByteGame/com.bytedance.starksdk/Android/starkvideolib.aar b/Assets/Plugins/ByteGame/com.bytedance.starksdk/Android/starkvideolib.aar deleted file mode 100644 index 5087dbfe..00000000 Binary files a/Assets/Plugins/ByteGame/com.bytedance.starksdk/Android/starkvideolib.aar and /dev/null differ diff --git a/Assets/Plugins/ByteGame/com.bytedance.starksdk/ByteREC/readme.txt b/Assets/Plugins/ByteGame/com.bytedance.starksdk/ByteREC/readme.txt deleted file mode 100644 index c32e3fe2..00000000 --- a/Assets/Plugins/ByteGame/com.bytedance.starksdk/ByteREC/readme.txt +++ /dev/null @@ -1,12 +0,0 @@ -# 2021-07-08 Unity VERSION = 8 -- 修复切后台音频补帧逻辑异常问题(切后台场景不需要做补帧) - -# 2021-07-02 Unity VERSION = 7 -- 传递ColorSpace给Native解决LinearSpace下渲染颜色异常问题 -- 解决URP下录制时候游戏画面刷新问题 - -# 2021-06-17 Unity VERSION = 6 -- 移除部分冗余逻辑 -- 增加异常日志 -- 支持将关键日志通过SendLogInfo抛给Native做后续上报 -- 支持将录制相关参数通过调用Native的startRecordV2带给Native diff --git a/Assets/Plugins/ByteGame/com.bytedance.starksdk/ByteREC/readme.txt.meta b/Assets/Plugins/ByteGame/com.bytedance.starksdk/ByteREC/readme.txt.meta deleted file mode 100644 index 37d38dd5..00000000 --- a/Assets/Plugins/ByteGame/com.bytedance.starksdk/ByteREC/readme.txt.meta +++ /dev/null @@ -1,3 +0,0 @@ -fileFormatVersion: 2 -guid: 83dd72336f3e4b5cb2e23add525f9b88 -timeCreated: 1623940585 \ No newline at end of file diff --git a/Assets/Plugins/ByteGame/com.bytedance.starksdk/Editor/starksdkEditor.dll b/Assets/Plugins/ByteGame/com.bytedance.starksdk/Editor/starksdkEditor.dll deleted file mode 100644 index 50d91f43..00000000 Binary files a/Assets/Plugins/ByteGame/com.bytedance.starksdk/Editor/starksdkEditor.dll and /dev/null differ diff --git a/Assets/Plugins/ByteGame/com.bytedance.starksdk/Editor/starksdkEditor.xml b/Assets/Plugins/ByteGame/com.bytedance.starksdk/Editor/starksdkEditor.xml deleted file mode 100644 index 5741e325..00000000 --- a/Assets/Plugins/ByteGame/com.bytedance.starksdk/Editor/starksdkEditor.xml +++ /dev/null @@ -1,13 +0,0 @@ - - - - starksdkEditor - - - - - Returns the player build processor callback order. - - - - diff --git a/Assets/Plugins/ByteGame/com.bytedance.starksdk/Icons.meta b/Assets/Plugins/ByteGame/com.bytedance.starksdk/Icons.meta index f64502b1..ebbe6152 100644 --- a/Assets/Plugins/ByteGame/com.bytedance.starksdk/Icons.meta +++ b/Assets/Plugins/ByteGame/com.bytedance.starksdk/Icons.meta @@ -1,8 +1,8 @@ -fileFormatVersion: 2 -guid: 26f23d3dcdf359f45a1ebe2c8a23b0a7 -folderAsset: yes -DefaultImporter: - externalObjects: {} - userData: - assetBundleName: - assetBundleVariant: +fileFormatVersion: 2 +guid: 26f23d3dcdf359f45a1ebe2c8a23b0a7 +folderAsset: yes +DefaultImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/Plugins/ByteGame/com.bytedance.starksdk/LitJson.meta b/Assets/Plugins/ByteGame/com.bytedance.starksdk/LitJson.meta new file mode 100644 index 00000000..bcd145cc --- /dev/null +++ b/Assets/Plugins/ByteGame/com.bytedance.starksdk/LitJson.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: ea02cbe86a19e44a1a08543618e2ebca +folderAsset: yes +DefaultImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/Plugins/ByteGame/com.bytedance.starksdk/LitJson/IJsonWrapper.cs b/Assets/Plugins/ByteGame/com.bytedance.starksdk/LitJson/IJsonWrapper.cs new file mode 100644 index 00000000..a2c5d0bf --- /dev/null +++ b/Assets/Plugins/ByteGame/com.bytedance.starksdk/LitJson/IJsonWrapper.cs @@ -0,0 +1,60 @@ +#region Header +/** + * IJsonWrapper.cs + * Interface that represents a type capable of handling all kinds of JSON + * data. This is mainly used when mapping objects through JsonMapper, and + * it's implemented by JsonData. + * + * The authors disclaim copyright to this source code. For more details, see + * the COPYING file included with this distribution. + **/ +#endregion + + +using System.Collections; +using System.Collections.Specialized; + + +namespace StarkSDKSpace.UNBridgeLib.LitJson +{ + public enum JsonType + { + None, + + Object, + Array, + String, + Int, + Long, + Double, + Boolean + } + + public interface IJsonWrapper : IList, IOrderedDictionary + { + bool IsArray { get; } + bool IsBoolean { get; } + bool IsDouble { get; } + bool IsInt { get; } + bool IsLong { get; } + bool IsObject { get; } + bool IsString { get; } + + bool GetBoolean (); + double GetDouble (); + int GetInt (); + JsonType GetJsonType (); + long GetLong (); + string GetString (); + + void SetBoolean (bool val); + void SetDouble (double val); + void SetInt (int val); + void SetJsonType (JsonType type); + void SetLong (long val); + void SetString (string val); + + string ToJson (); + void ToJson (JsonWriter writer); + } +} diff --git a/Assets/Plugins/ByteGame/com.bytedance.starksdk/LitJson/IJsonWrapper.cs.meta b/Assets/Plugins/ByteGame/com.bytedance.starksdk/LitJson/IJsonWrapper.cs.meta new file mode 100644 index 00000000..906ca107 --- /dev/null +++ b/Assets/Plugins/ByteGame/com.bytedance.starksdk/LitJson/IJsonWrapper.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: dea886f2fe55d41d8955fcc2ba93a48a +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/Plugins/ByteGame/com.bytedance.starksdk/LitJson/JsonData.cs b/Assets/Plugins/ByteGame/com.bytedance.starksdk/LitJson/JsonData.cs new file mode 100644 index 00000000..b2da7d09 --- /dev/null +++ b/Assets/Plugins/ByteGame/com.bytedance.starksdk/LitJson/JsonData.cs @@ -0,0 +1,1289 @@ +#region Header +/** + * JsonData.cs + * Generic type to hold JSON data (objects, arrays, and so on). This is + * the default type returned by JsonMapper.ToObject(). + * + * The authors disclaim copyright to this source code. For more details, see + * the COPYING file included with this distribution. + **/ +#endregion + + +using System; +using System.Collections; +using System.Collections.Generic; +using System.Collections.Specialized; +using System.IO; + + +namespace StarkSDKSpace.UNBridgeLib.LitJson +{ + public class JsonData : IJsonWrapper, IEquatable + { + #region Fields + private IList inst_array; + private bool inst_boolean; + private double inst_double; + private int inst_int; + private long inst_long; + private IDictionary inst_object; + private string inst_string; + private string json; + private JsonType type; + + // Used to implement the IOrderedDictionary interface + private IList> object_list; + #endregion + + + #region Properties + public int Count { + get { return EnsureCollection ().Count; } + } + + public bool IsArray { + get { return type == JsonType.Array; } + } + + public bool IsBoolean { + get { return type == JsonType.Boolean; } + } + + public bool IsDouble { + get { return type == JsonType.Double; } + } + + public bool IsInt { + get { return type == JsonType.Int; } + } + + public bool IsLong { + get { return type == JsonType.Long; } + } + + public bool IsObject { + get { return type == JsonType.Object; } + } + + public bool IsString { + get { return type == JsonType.String; } + } + + public ICollection Keys { + get { EnsureDictionary (); return inst_object.Keys; } + } + + /// + /// Determines whether the json contains an element that has the specified key. + /// + /// The key to locate in the json. + /// true if the json contains an element that has the specified key; otherwise, false. + public Boolean ContainsKey(String key) { + EnsureDictionary(); + return this.inst_object.Keys.Contains(key); + } + #endregion + + + #region ICollection Properties + int ICollection.Count { + get { + return Count; + } + } + + bool ICollection.IsSynchronized { + get { + return EnsureCollection ().IsSynchronized; + } + } + + object ICollection.SyncRoot { + get { + return EnsureCollection ().SyncRoot; + } + } + #endregion + + + #region IDictionary Properties + bool IDictionary.IsFixedSize { + get { + return EnsureDictionary ().IsFixedSize; + } + } + + bool IDictionary.IsReadOnly { + get { + return EnsureDictionary ().IsReadOnly; + } + } + + ICollection IDictionary.Keys { + get { + EnsureDictionary (); + IList keys = new List (); + + foreach (KeyValuePair entry in + object_list) { + keys.Add (entry.Key); + } + + return (ICollection) keys; + } + } + + ICollection IDictionary.Values { + get { + EnsureDictionary (); + IList values = new List (); + + foreach (KeyValuePair entry in + object_list) { + values.Add (entry.Value); + } + + return (ICollection) values; + } + } + #endregion + + + + #region IJsonWrapper Properties + bool IJsonWrapper.IsArray { + get { return IsArray; } + } + + bool IJsonWrapper.IsBoolean { + get { return IsBoolean; } + } + + bool IJsonWrapper.IsDouble { + get { return IsDouble; } + } + + bool IJsonWrapper.IsInt { + get { return IsInt; } + } + + bool IJsonWrapper.IsLong { + get { return IsLong; } + } + + bool IJsonWrapper.IsObject { + get { return IsObject; } + } + + bool IJsonWrapper.IsString { + get { return IsString; } + } + #endregion + + + #region IList Properties + bool IList.IsFixedSize { + get { + return EnsureList ().IsFixedSize; + } + } + + bool IList.IsReadOnly { + get { + return EnsureList ().IsReadOnly; + } + } + #endregion + + + #region IDictionary Indexer + object IDictionary.this[object key] { + get { + return EnsureDictionary ()[key]; + } + + set { + if (! (key is String)) + throw new ArgumentException ( + "The key has to be a string"); + + JsonData data = ToJsonData (value); + + this[(string) key] = data; + } + } + #endregion + + + #region IOrderedDictionary Indexer + object IOrderedDictionary.this[int idx] { + get { + EnsureDictionary (); + return object_list[idx].Value; + } + + set { + EnsureDictionary (); + JsonData data = ToJsonData (value); + + KeyValuePair old_entry = object_list[idx]; + + inst_object[old_entry.Key] = data; + + KeyValuePair entry = + new KeyValuePair (old_entry.Key, data); + + object_list[idx] = entry; + } + } + #endregion + + + #region IList Indexer + object IList.this[int index] { + get { + return EnsureList ()[index]; + } + + set { + EnsureList (); + JsonData data = ToJsonData (value); + + this[index] = data; + } + } + #endregion + + + #region Public Indexers + public JsonData this[string prop_name] { + get { + EnsureDictionary (); + inst_object.TryGetValue(prop_name, out var value); + return value; + } + + set { + EnsureDictionary (); + + KeyValuePair entry = + new KeyValuePair (prop_name, value); + + if (inst_object.ContainsKey (prop_name)) { + for (int i = 0; i < object_list.Count; i++) { + if (object_list[i].Key == prop_name) { + object_list[i] = entry; + break; + } + } + } else + object_list.Add (entry); + + inst_object[prop_name] = value; + + json = null; + } + } + + public String OptGetString(string propName, string defaultValue = "") { + EnsureDictionary (); + inst_object.TryGetValue(propName, out var value); + if (value == null) + { + return defaultValue; + } + + if (value.IsString) + { + return (string)value; + } + + return defaultValue; + } + + public int OptGetInt(string propName, int defaultValue = 0) { + EnsureDictionary (); + inst_object.TryGetValue(propName, out var value); + if (value == null) + { + return defaultValue; + } + + if (value.IsInt) + { + return (int)value; + } + + return defaultValue; + } + + public double OptGetDouble(string propName, double defaultValue = 0) { + EnsureDictionary (); + inst_object.TryGetValue(propName, out var value); + if (value == null) + { + return defaultValue; + } + + if (value.IsDouble) + { + return (double)value; + } + + return defaultValue; + } + + public long OptGetLong(string propName, long defaultValue = 0) { + EnsureDictionary (); + inst_object.TryGetValue(propName, out var value); + if (value == null) + { + return defaultValue; + } + + if (value.IsLong) + { + return (long)value; + } + + return defaultValue; + } + + public bool OptGetBoolean(string propName, bool defaultValue = false) { + EnsureDictionary (); + inst_object.TryGetValue(propName, out var value); + if (value == null) + { + return defaultValue; + } + + if (value.IsBoolean) + { + return (bool)value; + } + + return defaultValue; + } + + public JsonData OptGetObject(string propName, JsonData defaultValue) { + EnsureDictionary (); + inst_object.TryGetValue(propName, out var value); + if (value == null) + { + return defaultValue; + } + + if (value.IsObject) + { + return (JsonData)value; + } + + return defaultValue; + } + + public JsonData OptGetJsonArray(string propName, JsonData defaultValue) { + EnsureDictionary (); + inst_object.TryGetValue(propName, out var value); + if (value == null) + { + return defaultValue; + } + + if (value.IsArray) + { + return (JsonData)value; + } + + return defaultValue; + } + + public JsonData this[int index] { + get { + EnsureCollection (); + + if (type == JsonType.Array) + return inst_array[index]; + + return object_list[index].Value; + } + + set { + EnsureCollection (); + + if (type == JsonType.Array) + inst_array[index] = value; + else { + KeyValuePair entry = object_list[index]; + KeyValuePair new_entry = + new KeyValuePair (entry.Key, value); + + object_list[index] = new_entry; + inst_object[entry.Key] = value; + } + + json = null; + } + } + #endregion + + + #region Constructors + public JsonData () + { + } + + public JsonData (bool boolean) + { + type = JsonType.Boolean; + inst_boolean = boolean; + } + + public JsonData (double number) + { + type = JsonType.Double; + inst_double = number; + } + + public JsonData (int number) + { + type = JsonType.Int; + inst_int = number; + } + + public JsonData (long number) + { + type = JsonType.Long; + inst_long = number; + } + + public static JsonData NewJsonArray() + { + JsonData jsonData = new JsonData(); + jsonData.EnsureList(); + return jsonData; + } + + public JsonData (object obj) + { + if (obj is Boolean) { + type = JsonType.Boolean; + inst_boolean = (bool) obj; + return; + } + + if (obj is Single) + { + type = JsonType.Double; + inst_double = Convert.ToDouble(obj); + return; + } + + if (obj is Double) { + type = JsonType.Double; + inst_double = (double) obj; + return; + } + + if (obj is Int32) { + type = JsonType.Int; + inst_int = (int) obj; + return; + } + + if (obj is Int64) { + type = JsonType.Long; + inst_long = (long) obj; + return; + } + + if (obj is String) { + type = JsonType.String; + inst_string = (string) obj; + return; + } + + throw new ArgumentException ( + "Unable to wrap the given object with JsonData"); + } + + public JsonData (string str) + { + type = JsonType.String; + inst_string = str; + } + #endregion + + + #region Implicit Conversions + public static implicit operator JsonData (Boolean data) + { + return new JsonData (data); + } + + public static implicit operator JsonData (Double data) + { + return new JsonData (data); + } + + public static implicit operator JsonData (Int32 data) + { + return new JsonData (data); + } + + public static implicit operator JsonData (Int64 data) + { + return new JsonData (data); + } + + public static implicit operator JsonData (String data) + { + return new JsonData (data); + } + #endregion + + + #region Explicit Conversions + public static explicit operator Boolean (JsonData data) + { + if (data == null) return false; + if (data.type != JsonType.Boolean) + throw new InvalidCastException ( + "Instance of JsonData doesn't hold a Boolean"); + + return data.inst_boolean; + } + + public static explicit operator Double (JsonData data) + { + if (data == null) return 0; + if (data.type != JsonType.Double) + { + if (data.type == JsonType.Int || data.type == JsonType.Long) + return data.type == JsonType.Int ? data.inst_int : (int)data.inst_long; + throw new InvalidCastException( + "Instance of JsonData doesn't hold a double"); + } + + return data.inst_double; + } + + public static explicit operator Int32(JsonData data) + { + if (data == null) return 0; + if (data.type != JsonType.Int && data.type != JsonType.Long) + { + throw new InvalidCastException( + "Instance of JsonData doesn't hold an int"); + } + + // cast may truncate data... but that's up to the user to consider + return data.type == JsonType.Int ? data.inst_int : (int)data.inst_long; + } + + public static explicit operator Int64(JsonData data) + { + if (data == null) return 0; + if (data.type != JsonType.Long && data.type != JsonType.Int) + { + throw new InvalidCastException( + "Instance of JsonData doesn't hold a long"); + } + + return data.type == JsonType.Long ? data.inst_long : data.inst_int; + } + + public static explicit operator String (JsonData data) + { + if (data == null) return null; + if (data.type != JsonType.String) + throw new InvalidCastException ( + $"Instance of JsonData {data} doesn't hold a string"); + + return data.inst_string; + } + #endregion + + + #region ICollection Methods + void ICollection.CopyTo (Array array, int index) + { + EnsureCollection ().CopyTo (array, index); + } + #endregion + + + #region IDictionary Methods + void IDictionary.Add (object key, object value) + { + JsonData data = ToJsonData (value); + + EnsureDictionary ().Add (key, data); + + KeyValuePair entry = + new KeyValuePair ((string) key, data); + object_list.Add (entry); + + json = null; + } + + void IDictionary.Clear () + { + EnsureDictionary ().Clear (); + object_list.Clear (); + json = null; + } + + bool IDictionary.Contains (object key) + { + return EnsureDictionary ().Contains (key); + } + + IDictionaryEnumerator IDictionary.GetEnumerator () + { + return ((IOrderedDictionary) this).GetEnumerator (); + } + + void IDictionary.Remove (object key) + { + EnsureDictionary ().Remove (key); + + for (int i = 0; i < object_list.Count; i++) { + if (object_list[i].Key == (string) key) { + object_list.RemoveAt (i); + break; + } + } + + json = null; + } + #endregion + + + #region IEnumerable Methods + IEnumerator IEnumerable.GetEnumerator () + { + return EnsureCollection ().GetEnumerator (); + } + #endregion + + + #region IJsonWrapper Methods + bool IJsonWrapper.GetBoolean () + { + if (type != JsonType.Boolean) + throw new InvalidOperationException ( + "JsonData instance doesn't hold a boolean"); + + return inst_boolean; + } + + double IJsonWrapper.GetDouble () + { + if (type != JsonType.Double) + throw new InvalidOperationException ( + "JsonData instance doesn't hold a double"); + + return inst_double; + } + + int IJsonWrapper.GetInt () + { + if (type != JsonType.Int) + throw new InvalidOperationException ( + "JsonData instance doesn't hold an int"); + + return inst_int; + } + + long IJsonWrapper.GetLong () + { + if (type != JsonType.Long) + throw new InvalidOperationException ( + "JsonData instance doesn't hold a long"); + + return inst_long; + } + + string IJsonWrapper.GetString () + { + if (type != JsonType.String) + throw new InvalidOperationException ( + "JsonData instance doesn't hold a string"); + + return inst_string; + } + + void IJsonWrapper.SetBoolean (bool val) + { + type = JsonType.Boolean; + inst_boolean = val; + json = null; + } + + void IJsonWrapper.SetDouble (double val) + { + type = JsonType.Double; + inst_double = val; + json = null; + } + + void IJsonWrapper.SetInt (int val) + { + type = JsonType.Int; + inst_int = val; + json = null; + } + + void IJsonWrapper.SetLong (long val) + { + type = JsonType.Long; + inst_long = val; + json = null; + } + + void IJsonWrapper.SetString (string val) + { + type = JsonType.String; + inst_string = val; + json = null; + } + + string IJsonWrapper.ToJson () + { + return ToJson (); + } + + void IJsonWrapper.ToJson (JsonWriter writer) + { + ToJson (writer); + } + #endregion + + + #region IList Methods + int IList.Add (object value) + { + return Add (value); + } + + void IList.Clear () + { + EnsureList ().Clear (); + json = null; + } + + bool IList.Contains (object value) + { + return EnsureList ().Contains (value); + } + + int IList.IndexOf (object value) + { + return EnsureList ().IndexOf (value); + } + + void IList.Insert (int index, object value) + { + EnsureList ().Insert (index, value); + json = null; + } + + void IList.Remove (object value) + { + EnsureList ().Remove (value); + json = null; + } + + void IList.RemoveAt (int index) + { + EnsureList ().RemoveAt (index); + json = null; + } + #endregion + + + #region IOrderedDictionary Methods + IDictionaryEnumerator IOrderedDictionary.GetEnumerator () + { + EnsureDictionary (); + + return new OrderedDictionaryEnumerator ( + object_list.GetEnumerator ()); + } + + void IOrderedDictionary.Insert (int idx, object key, object value) + { + string property = (string) key; + JsonData data = ToJsonData (value); + + this[property] = data; + + KeyValuePair entry = + new KeyValuePair (property, data); + + object_list.Insert (idx, entry); + } + + void IOrderedDictionary.RemoveAt (int idx) + { + EnsureDictionary (); + + inst_object.Remove (object_list[idx].Key); + object_list.RemoveAt (idx); + } + #endregion + + + #region Private Methods + private ICollection EnsureCollection () + { + if (type == JsonType.Array) + return (ICollection) inst_array; + + if (type == JsonType.Object) + return (ICollection) inst_object; + + throw new InvalidOperationException ( + "The JsonData instance has to be initialized first"); + } + + private IDictionary EnsureDictionary () + { + if (type == JsonType.Object) + return (IDictionary) inst_object; + + if (type != JsonType.None) + throw new InvalidOperationException ( + "Instance of JsonData is not a dictionary"); + + type = JsonType.Object; + inst_object = new Dictionary (); + object_list = new List> (); + + return (IDictionary) inst_object; + } + + private IList EnsureList () + { + if (type == JsonType.Array) + return (IList) inst_array; + + if (type != JsonType.None) + throw new InvalidOperationException ( + "Instance of JsonData is not a list"); + + type = JsonType.Array; + inst_array = new List (); + + return (IList) inst_array; + } + + private JsonData ToJsonData (object obj) + { + if (obj == null) + return null; + + if (obj is JsonData) + return (JsonData) obj; + + return new JsonData (obj); + } + + private static void WriteJson (IJsonWrapper obj, JsonWriter writer) + { + if (obj == null) { + writer.Write (null); + return; + } + + if (obj.IsString) { + writer.Write (obj.GetString ()); + return; + } + + if (obj.IsBoolean) { + writer.Write (obj.GetBoolean ()); + return; + } + + if (obj.IsDouble) { + writer.Write (obj.GetDouble ()); + return; + } + + if (obj.IsInt) { + writer.Write (obj.GetInt ()); + return; + } + + if (obj.IsLong) { + writer.Write (obj.GetLong ()); + return; + } + + if (obj.IsArray) { + writer.WriteArrayStart (); + foreach (object elem in (IList) obj) + WriteJson ((JsonData) elem, writer); + writer.WriteArrayEnd (); + + return; + } + + if (obj.IsObject) { + writer.WriteObjectStart (); + + foreach (DictionaryEntry entry in ((IDictionary) obj)) { + writer.WritePropertyName ((string) entry.Key); + WriteJson ((JsonData) entry.Value, writer); + } + writer.WriteObjectEnd (); + + return; + } + } + #endregion + + + public int Add (object value) + { + JsonData data = ToJsonData (value); + + json = null; + + return EnsureList ().Add (data); + } + + public bool Remove(object obj) + { + json = null; + if(IsObject) + { + JsonData value = null; + if (inst_object.TryGetValue((string)obj, out value)) + return inst_object.Remove((string)obj) && object_list.Remove(new KeyValuePair((string)obj, value)); + else + throw new KeyNotFoundException("The specified key was not found in the JsonData object."); + } + if(IsArray) + { + return inst_array.Remove(ToJsonData(obj)); + } + throw new InvalidOperationException ( + "Instance of JsonData is not an object or a list."); + } + + public void Clear () + { + if (IsObject) { + ((IDictionary) this).Clear (); + return; + } + + if (IsArray) { + ((IList) this).Clear (); + return; + } + } + + public bool Equals (JsonData x) + { + if (x == null) + return false; + + if (x.type != this.type) + { + // further check to see if this is a long to int comparison + if ((x.type != JsonType.Int && x.type != JsonType.Long) + || (this.type != JsonType.Int && this.type != JsonType.Long)) + { + return false; + } + } + + switch (this.type) { + case JsonType.None: + return true; + + case JsonType.Object: + return this.inst_object.Equals (x.inst_object); + + case JsonType.Array: + return this.inst_array.Equals (x.inst_array); + + case JsonType.String: + return this.inst_string.Equals (x.inst_string); + + case JsonType.Int: + { + if (x.IsLong) + { + if (x.inst_long < Int32.MinValue || x.inst_long > Int32.MaxValue) + return false; + return this.inst_int.Equals((int)x.inst_long); + } + return this.inst_int.Equals(x.inst_int); + } + + case JsonType.Long: + { + if (x.IsInt) + { + if (this.inst_long < Int32.MinValue || this.inst_long > Int32.MaxValue) + return false; + return x.inst_int.Equals((int)this.inst_long); + } + return this.inst_long.Equals(x.inst_long); + } + + case JsonType.Double: + return this.inst_double.Equals (x.inst_double); + + case JsonType.Boolean: + return this.inst_boolean.Equals (x.inst_boolean); + } + + return false; + } + + public JsonType GetJsonType () + { + return type; + } + + public void SetJsonType (JsonType type) + { + if (this.type == type) + return; + + switch (type) { + case JsonType.None: + break; + + case JsonType.Object: + inst_object = new Dictionary (); + object_list = new List> (); + break; + + case JsonType.Array: + inst_array = new List (); + break; + + case JsonType.String: + inst_string = default (String); + break; + + case JsonType.Int: + inst_int = default (Int32); + break; + + case JsonType.Long: + inst_long = default (Int64); + break; + + case JsonType.Double: + inst_double = default (Double); + break; + + case JsonType.Boolean: + inst_boolean = default (Boolean); + break; + } + + this.type = type; + } + + public string ToJson () + { + if (json != null) + return json; + + StringWriter sw = new StringWriter (); + JsonWriter writer = new JsonWriter (sw); + writer.Validate = false; + + WriteJson (this, writer); + json = sw.ToString (); + + return json; + } + + public string ToEJson () + { + if (json != null) + return json; + + StringWriter sw = new StringWriter (); + JsonWriter writer = new JsonWriter (sw); + writer.Validate = false; + + WriteEJson (this, writer); + json = sw.ToString (); + + return json; + } + private static void WriteEJson (IJsonWrapper obj, JsonWriter writer) + { + if (obj == null) { + writer.Write (null); + return; + } + + if (obj.IsString) { + writer.Write (obj.GetString ()); + return; + } + + if (obj.IsBoolean) { + writer.Write (obj.GetBoolean ()); + return; + } + + if (obj.IsDouble) { + JsonData tmpData = new JsonData(); + tmpData["$numberDouble"] = obj.GetDouble().ToString(); + writer.WriteObjectStart (); + foreach (DictionaryEntry entry in ((IDictionary) tmpData)) { + writer.WritePropertyName ((string) entry.Key); + WriteEJson ((JsonData) entry.Value, writer); + } + writer.WriteObjectEnd (); + + // writer.Write (obj.GetDouble ()); + return; + } + + if (obj.IsInt) { + JsonData tmpData = new JsonData(); + tmpData["$numberInt"] = obj.GetInt().ToString(); + writer.WriteObjectStart (); + foreach (DictionaryEntry entry in ((IDictionary) tmpData)) { + writer.WritePropertyName ((string) entry.Key); + WriteEJson ((JsonData) entry.Value, writer); + } + writer.WriteObjectEnd (); + return; + } + + if (obj.IsLong) { + JsonData tmpData = new JsonData(); + tmpData["$numberLong"] = obj.GetLong().ToString(); + writer.WriteObjectStart (); + foreach (DictionaryEntry entry in ((IDictionary) tmpData)) { + writer.WritePropertyName ((string) entry.Key); + WriteEJson ((JsonData) entry.Value, writer); + } + writer.WriteObjectEnd (); + + // writer.Write (obj.GetLong ()); + return; + } + + if (obj.IsArray) { + writer.WriteArrayStart (); + foreach (object elem in (IList) obj) + WriteEJson ((JsonData) elem, writer); + writer.WriteArrayEnd (); + + return; + } + + if (obj.IsObject) { + writer.WriteObjectStart (); + + foreach (DictionaryEntry entry in ((IDictionary) obj)) { + writer.WritePropertyName ((string) entry.Key); + WriteEJson ((JsonData) entry.Value, writer); + } + writer.WriteObjectEnd (); + + return; + } + } + + + public void ToJson (JsonWriter writer) + { + bool old_validate = writer.Validate; + + writer.Validate = false; + + WriteJson (this, writer); + + writer.Validate = old_validate; + } + + public override string ToString () + { + switch (type) { + case JsonType.Array: + return ToJson(); + + case JsonType.Boolean: + return inst_boolean.ToString (); + + case JsonType.Double: + return inst_double.ToString (); + + case JsonType.Int: + return inst_int.ToString (); + + case JsonType.Long: + return inst_long.ToString (); + + case JsonType.Object: + return ToJson(); + + case JsonType.String: + return inst_string; + } + + return "Uninitialized JsonData"; + } + } + + + internal class OrderedDictionaryEnumerator : IDictionaryEnumerator + { + IEnumerator> list_enumerator; + + + public object Current { + get { return Entry; } + } + + public DictionaryEntry Entry { + get { + KeyValuePair curr = list_enumerator.Current; + return new DictionaryEntry (curr.Key, curr.Value); + } + } + + public object Key { + get { return list_enumerator.Current.Key; } + } + + public object Value { + get { return list_enumerator.Current.Value; } + } + + + public OrderedDictionaryEnumerator ( + IEnumerator> enumerator) + { + list_enumerator = enumerator; + } + + + public bool MoveNext () + { + return list_enumerator.MoveNext (); + } + + public void Reset () + { + list_enumerator.Reset (); + } + } +} diff --git a/Assets/Plugins/ByteGame/com.bytedance.starksdk/LitJson/JsonData.cs.meta b/Assets/Plugins/ByteGame/com.bytedance.starksdk/LitJson/JsonData.cs.meta new file mode 100644 index 00000000..371fe411 --- /dev/null +++ b/Assets/Plugins/ByteGame/com.bytedance.starksdk/LitJson/JsonData.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: 3b4d367937f874446bdc35395f7c8340 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/Plugins/ByteGame/com.bytedance.starksdk/LitJson/JsonException.cs b/Assets/Plugins/ByteGame/com.bytedance.starksdk/LitJson/JsonException.cs new file mode 100644 index 00000000..c45c2fd4 --- /dev/null +++ b/Assets/Plugins/ByteGame/com.bytedance.starksdk/LitJson/JsonException.cs @@ -0,0 +1,65 @@ +#region Header +/** + * JsonException.cs + * Base class throwed by LitJSON when a parsing error occurs. + * + * The authors disclaim copyright to this source code. For more details, see + * the COPYING file included with this distribution. + **/ +#endregion + + +using System; + + +namespace StarkSDKSpace.UNBridgeLib.LitJson +{ + public class JsonException : +#if NETSTANDARD1_5 + Exception +#else + ApplicationException +#endif + { + public JsonException () : base () + { + } + + internal JsonException (ParserToken token) : + base (String.Format ( + "Invalid token '{0}' in input string", token)) + { + } + + internal JsonException (ParserToken token, + Exception inner_exception) : + base (String.Format ( + "Invalid token '{0}' in input string", token), + inner_exception) + { + } + + internal JsonException (int c) : + base (String.Format ( + "Invalid character '{0}' in input string", (char) c)) + { + } + + internal JsonException (int c, Exception inner_exception) : + base (String.Format ( + "Invalid character '{0}' in input string", (char) c), + inner_exception) + { + } + + + public JsonException (string message) : base (message) + { + } + + public JsonException (string message, Exception inner_exception) : + base (message, inner_exception) + { + } + } +} diff --git a/Assets/Plugins/ByteGame/com.bytedance.starksdk/LitJson/JsonException.cs.meta b/Assets/Plugins/ByteGame/com.bytedance.starksdk/LitJson/JsonException.cs.meta new file mode 100644 index 00000000..30da36b3 --- /dev/null +++ b/Assets/Plugins/ByteGame/com.bytedance.starksdk/LitJson/JsonException.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: a47fc37bfbb3f4380bb0ed013bbc2b5b +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/Plugins/ByteGame/com.bytedance.starksdk/LitJson/JsonMapper.cs b/Assets/Plugins/ByteGame/com.bytedance.starksdk/LitJson/JsonMapper.cs new file mode 100644 index 00000000..6e5c736e --- /dev/null +++ b/Assets/Plugins/ByteGame/com.bytedance.starksdk/LitJson/JsonMapper.cs @@ -0,0 +1,977 @@ +#region Header +/** + * JsonMapper.cs + * JSON to .Net object and object to JSON conversions. + * + * The authors disclaim copyright to this source code. For more details, see + * the COPYING file included with this distribution. + **/ +#endregion + + +using System; +using System.Collections; +using System.Collections.Generic; +using System.Globalization; +using System.IO; +using System.Reflection; + + +namespace StarkSDKSpace.UNBridgeLib.LitJson +{ + internal struct PropertyMetadata + { + public MemberInfo Info; + public bool IsField; + public Type Type; + } + + + internal struct ArrayMetadata + { + private Type element_type; + private bool is_array; + private bool is_list; + + + public Type ElementType { + get { + if (element_type == null) + return typeof (JsonData); + + return element_type; + } + + set { element_type = value; } + } + + public bool IsArray { + get { return is_array; } + set { is_array = value; } + } + + public bool IsList { + get { return is_list; } + set { is_list = value; } + } + } + + + internal struct ObjectMetadata + { + private Type element_type; + private bool is_dictionary; + + private IDictionary properties; + + + public Type ElementType { + get { + if (element_type == null) + return typeof (JsonData); + + return element_type; + } + + set { element_type = value; } + } + + public bool IsDictionary { + get { return is_dictionary; } + set { is_dictionary = value; } + } + + public IDictionary Properties { + get { return properties; } + set { properties = value; } + } + } + + + internal delegate void ExporterFunc (object obj, JsonWriter writer); + public delegate void ExporterFunc (T obj, JsonWriter writer); + + internal delegate object ImporterFunc (object input); + public delegate TValue ImporterFunc (TJson input); + + public delegate IJsonWrapper WrapperFactory (); + + + public class JsonMapper + { + #region Fields + private static readonly int max_nesting_depth; + + private static readonly IFormatProvider datetime_format; + + private static readonly IDictionary base_exporters_table; + private static readonly IDictionary custom_exporters_table; + + private static readonly IDictionary> base_importers_table; + private static readonly IDictionary> custom_importers_table; + + private static readonly IDictionary array_metadata; + private static readonly object array_metadata_lock = new Object (); + + private static readonly IDictionary> conv_ops; + private static readonly object conv_ops_lock = new Object (); + + private static readonly IDictionary object_metadata; + private static readonly object object_metadata_lock = new Object (); + + private static readonly IDictionary> type_properties; + private static readonly object type_properties_lock = new Object (); + + private static readonly JsonWriter static_writer; + private static readonly object static_writer_lock = new Object (); + #endregion + + + #region Constructors + static JsonMapper () + { + max_nesting_depth = 100; + + array_metadata = new Dictionary (); + conv_ops = new Dictionary> (); + object_metadata = new Dictionary (); + type_properties = new Dictionary> (); + + static_writer = new JsonWriter (); + + datetime_format = DateTimeFormatInfo.InvariantInfo; + + base_exporters_table = new Dictionary (); + custom_exporters_table = new Dictionary (); + + base_importers_table = new Dictionary> (); + custom_importers_table = new Dictionary> (); + + RegisterBaseExporters (); + RegisterBaseImporters (); + } + #endregion + + + #region Private Methods + private static void AddArrayMetadata (Type type) + { + if (array_metadata.ContainsKey (type)) + return; + + ArrayMetadata data = new ArrayMetadata (); + + data.IsArray = type.IsArray; + + if (type.GetInterface ("System.Collections.IList") != null) + data.IsList = true; + + foreach (PropertyInfo p_info in type.GetProperties ()) { + if (p_info.Name != "Item") + continue; + + ParameterInfo[] parameters = p_info.GetIndexParameters (); + + if (parameters.Length != 1) + continue; + + if (parameters[0].ParameterType == typeof (int)) + data.ElementType = p_info.PropertyType; + } + + lock (array_metadata_lock) { + try { + array_metadata.Add (type, data); + } catch (ArgumentException) { + return; + } + } + } + + private static void AddObjectMetadata (Type type) + { + if (object_metadata.ContainsKey (type)) + return; + + ObjectMetadata data = new ObjectMetadata (); + + if (type.GetInterface ("System.Collections.IDictionary") != null) + data.IsDictionary = true; + + data.Properties = new Dictionary (); + + foreach (PropertyInfo p_info in type.GetProperties ()) { + if (p_info.Name == "Item") { + ParameterInfo[] parameters = p_info.GetIndexParameters (); + + if (parameters.Length != 1) + continue; + + if (parameters[0].ParameterType == typeof (string)) + data.ElementType = p_info.PropertyType; + + continue; + } + + PropertyMetadata p_data = new PropertyMetadata (); + p_data.Info = p_info; + p_data.Type = p_info.PropertyType; + + data.Properties.Add (p_info.Name, p_data); + } + + foreach (FieldInfo f_info in type.GetFields ()) { + PropertyMetadata p_data = new PropertyMetadata (); + p_data.Info = f_info; + p_data.IsField = true; + p_data.Type = f_info.FieldType; + + data.Properties.Add (f_info.Name, p_data); + } + + lock (object_metadata_lock) { + try { + object_metadata.Add (type, data); + } catch (ArgumentException) { + return; + } + } + } + + private static void AddTypeProperties (Type type) + { + if (type_properties.ContainsKey (type)) + return; + + IList props = new List (); + + foreach (PropertyInfo p_info in type.GetProperties ()) { + if (p_info.Name == "Item") + continue; + + PropertyMetadata p_data = new PropertyMetadata (); + p_data.Info = p_info; + p_data.IsField = false; + props.Add (p_data); + } + + foreach (FieldInfo f_info in type.GetFields ()) { + PropertyMetadata p_data = new PropertyMetadata (); + p_data.Info = f_info; + p_data.IsField = true; + + props.Add (p_data); + } + + lock (type_properties_lock) { + try { + type_properties.Add (type, props); + } catch (ArgumentException) { + return; + } + } + } + + private static MethodInfo GetConvOp (Type t1, Type t2) + { + lock (conv_ops_lock) { + if (! conv_ops.ContainsKey (t1)) + conv_ops.Add (t1, new Dictionary ()); + } + + if (conv_ops[t1].ContainsKey (t2)) + return conv_ops[t1][t2]; + + MethodInfo op = t1.GetMethod ( + "op_Implicit", new Type[] { t2 }); + + lock (conv_ops_lock) { + try { + conv_ops[t1].Add (t2, op); + } catch (ArgumentException) { + return conv_ops[t1][t2]; + } + } + + return op; + } + + private static object ReadValue (Type inst_type, JsonReader reader) + { + reader.Read (); + + if (reader.Token == JsonToken.ArrayEnd) + return null; + + Type underlying_type = Nullable.GetUnderlyingType(inst_type); + Type value_type = underlying_type ?? inst_type; + + if (reader.Token == JsonToken.Null) { + #if NETSTANDARD1_5 + if (inst_type.IsClass() || underlying_type != null) { + return null; + } + #else + if (inst_type.IsClass || underlying_type != null) { + return null; + } + #endif + + throw new JsonException (String.Format ( + "Can't assign null to an instance of type {0}", + inst_type)); + } + + if (reader.Token == JsonToken.Double || + reader.Token == JsonToken.Int || + reader.Token == JsonToken.Long || + reader.Token == JsonToken.String || + reader.Token == JsonToken.Boolean) { + + Type json_type = reader.Value.GetType (); + + if (value_type.IsAssignableFrom (json_type)) + return reader.Value; + + // If there's a custom importer that fits, use it + if (custom_importers_table.ContainsKey (json_type) && + custom_importers_table[json_type].ContainsKey ( + value_type)) { + + ImporterFunc importer = + custom_importers_table[json_type][value_type]; + + return importer (reader.Value); + } + + // Maybe there's a base importer that works + if (base_importers_table.ContainsKey (json_type) && + base_importers_table[json_type].ContainsKey ( + value_type)) { + + ImporterFunc importer = + base_importers_table[json_type][value_type]; + + return importer (reader.Value); + } + + // Maybe it's an enum + #if NETSTANDARD1_5 + if (value_type.IsEnum()) + return Enum.ToObject (value_type, reader.Value); + #else + if (value_type.IsEnum) + return Enum.ToObject (value_type, reader.Value); + #endif + // Try using an implicit conversion operator + MethodInfo conv_op = GetConvOp (value_type, json_type); + + if (conv_op != null) + return conv_op.Invoke (null, + new object[] { reader.Value }); + + // No luck + throw new JsonException (String.Format ( + "Can't assign value '{0}' (type {1}) to type {2}", + reader.Value, json_type, inst_type)); + } + + object instance = null; + + if (reader.Token == JsonToken.ArrayStart) { + + AddArrayMetadata (inst_type); + ArrayMetadata t_data = array_metadata[inst_type]; + + if (! t_data.IsArray && ! t_data.IsList) + throw new JsonException (String.Format ( + "Type {0} can't act as an array", + inst_type)); + + IList list; + Type elem_type; + + if (! t_data.IsArray) { + list = (IList) Activator.CreateInstance (inst_type); + elem_type = t_data.ElementType; + } else { + list = new ArrayList (); + elem_type = inst_type.GetElementType (); + } + + list.Clear(); + + while (true) { + object item = ReadValue (elem_type, reader); + if (item == null && reader.Token == JsonToken.ArrayEnd) + break; + + list.Add (item); + } + + if (t_data.IsArray) { + int n = list.Count; + instance = Array.CreateInstance (elem_type, n); + + for (int i = 0; i < n; i++) + ((Array) instance).SetValue (list[i], i); + } else + instance = list; + + } else if (reader.Token == JsonToken.ObjectStart) { + AddObjectMetadata (value_type); + ObjectMetadata t_data = object_metadata[value_type]; + + instance = Activator.CreateInstance (value_type); + + while (true) { + reader.Read (); + + if (reader.Token == JsonToken.ObjectEnd) + break; + + string property = (string) reader.Value; + + if (t_data.Properties.ContainsKey (property)) { + PropertyMetadata prop_data = + t_data.Properties[property]; + + if (prop_data.IsField) { + ((FieldInfo) prop_data.Info).SetValue ( + instance, ReadValue (prop_data.Type, reader)); + } else { + PropertyInfo p_info = + (PropertyInfo) prop_data.Info; + + if (p_info.CanWrite) + p_info.SetValue ( + instance, + ReadValue (prop_data.Type, reader), + null); + else + ReadValue (prop_data.Type, reader); + } + + } else { + if (! t_data.IsDictionary) { + + if (! reader.SkipNonMembers) { + throw new JsonException (String.Format ( + "The type {0} doesn't have the " + + "property '{1}'", + inst_type, property)); + } else { + ReadSkip (reader); + continue; + } + } + + ((IDictionary) instance).Add ( + property, ReadValue ( + t_data.ElementType, reader)); + } + + } + + } + + return instance; + } + + private static IJsonWrapper ReadValue (WrapperFactory factory, + JsonReader reader) + { + reader.Read (); + + if (reader.Token == JsonToken.ArrayEnd || + reader.Token == JsonToken.Null) + return null; + + IJsonWrapper instance = factory (); + + if (reader.Token == JsonToken.String) { + instance.SetString ((string) reader.Value); + return instance; + } + + if (reader.Token == JsonToken.Double) { + instance.SetDouble ((double) reader.Value); + return instance; + } + + if (reader.Token == JsonToken.Int) { + instance.SetInt ((int) reader.Value); + return instance; + } + + if (reader.Token == JsonToken.Long) { + instance.SetLong ((long) reader.Value); + return instance; + } + + if (reader.Token == JsonToken.Boolean) { + instance.SetBoolean ((bool) reader.Value); + return instance; + } + + if (reader.Token == JsonToken.ArrayStart) { + instance.SetJsonType (JsonType.Array); + + while (true) { + IJsonWrapper item = ReadValue (factory, reader); + if (item == null && reader.Token == JsonToken.ArrayEnd) + break; + + ((IList) instance).Add (item); + } + } + else if (reader.Token == JsonToken.ObjectStart) { + instance.SetJsonType (JsonType.Object); + + while (true) { + reader.Read (); + + if (reader.Token == JsonToken.ObjectEnd) + break; + + string property = (string) reader.Value; + + ((IDictionary) instance)[property] = ReadValue ( + factory, reader); + } + + } + + return instance; + } + + private static void ReadSkip (JsonReader reader) + { + ToWrapper ( + delegate { return new JsonMockWrapper (); }, reader); + } + + private static void RegisterBaseExporters () + { + base_exporters_table[typeof (byte)] = + delegate (object obj, JsonWriter writer) { + writer.Write (Convert.ToInt32 ((byte) obj)); + }; + + base_exporters_table[typeof (char)] = + delegate (object obj, JsonWriter writer) { + writer.Write (Convert.ToString ((char) obj)); + }; + + base_exporters_table[typeof (DateTime)] = + delegate (object obj, JsonWriter writer) { + writer.Write (Convert.ToString ((DateTime) obj, + datetime_format)); + }; + + base_exporters_table[typeof (decimal)] = + delegate (object obj, JsonWriter writer) { + writer.Write ((decimal) obj); + }; + + base_exporters_table[typeof (sbyte)] = + delegate (object obj, JsonWriter writer) { + writer.Write (Convert.ToInt32 ((sbyte) obj)); + }; + + base_exporters_table[typeof (short)] = + delegate (object obj, JsonWriter writer) { + writer.Write (Convert.ToInt32 ((short) obj)); + }; + + base_exporters_table[typeof (ushort)] = + delegate (object obj, JsonWriter writer) { + writer.Write (Convert.ToInt32 ((ushort) obj)); + }; + + base_exporters_table[typeof (uint)] = + delegate (object obj, JsonWriter writer) { + writer.Write (Convert.ToUInt64 ((uint) obj)); + }; + + base_exporters_table[typeof (ulong)] = + delegate (object obj, JsonWriter writer) { + writer.Write ((ulong) obj); + }; + + base_exporters_table[typeof(DateTimeOffset)] = + delegate (object obj, JsonWriter writer) { + writer.Write(((DateTimeOffset)obj).ToString("yyyy-MM-ddTHH:mm:ss.fffffffzzz", datetime_format)); + }; + } + + private static void RegisterBaseImporters () + { + ImporterFunc importer; + + importer = delegate (object input) { + return Convert.ToByte ((int) input); + }; + RegisterImporter (base_importers_table, typeof (int), + typeof (byte), importer); + + importer = delegate (object input) { + return Convert.ToUInt64 ((int) input); + }; + RegisterImporter (base_importers_table, typeof (int), + typeof (ulong), importer); + + importer = delegate (object input) { + return Convert.ToInt64((int)input); + }; + RegisterImporter(base_importers_table, typeof(int), + typeof(long), importer); + + importer = delegate (object input) { + return Convert.ToSByte ((int) input); + }; + RegisterImporter (base_importers_table, typeof (int), + typeof (sbyte), importer); + + importer = delegate (object input) { + return Convert.ToInt16 ((int) input); + }; + RegisterImporter (base_importers_table, typeof (int), + typeof (short), importer); + + importer = delegate (object input) { + return Convert.ToUInt16 ((int) input); + }; + RegisterImporter (base_importers_table, typeof (int), + typeof (ushort), importer); + + importer = delegate (object input) { + return Convert.ToUInt32 ((int) input); + }; + RegisterImporter (base_importers_table, typeof (int), + typeof (uint), importer); + + importer = delegate (object input) { + return Convert.ToSingle ((int) input); + }; + RegisterImporter (base_importers_table, typeof (int), + typeof (float), importer); + + importer = delegate (object input) { + return Convert.ToDouble ((int) input); + }; + RegisterImporter (base_importers_table, typeof (int), + typeof (double), importer); + + importer = delegate (object input) { + return Convert.ToDecimal ((double) input); + }; + RegisterImporter (base_importers_table, typeof (double), + typeof (decimal), importer); + + importer = delegate (object input) { + return Convert.ToSingle((double)input); + }; + RegisterImporter(base_importers_table, typeof(double), + typeof(float), importer); + + importer = delegate (object input) { + return Convert.ToUInt32 ((long) input); + }; + RegisterImporter (base_importers_table, typeof (long), + typeof (uint), importer); + + importer = delegate (object input) { + return Convert.ToChar ((string) input); + }; + RegisterImporter (base_importers_table, typeof (string), + typeof (char), importer); + + importer = delegate (object input) { + return Convert.ToDateTime ((string) input, datetime_format); + }; + RegisterImporter (base_importers_table, typeof (string), + typeof (DateTime), importer); + + importer = delegate (object input) { + return DateTimeOffset.Parse((string)input, datetime_format); + }; + RegisterImporter(base_importers_table, typeof(string), + typeof(DateTimeOffset), importer); + } + + private static void RegisterImporter ( + IDictionary> table, + Type json_type, Type value_type, ImporterFunc importer) + { + if (! table.ContainsKey (json_type)) + table.Add (json_type, new Dictionary ()); + + table[json_type][value_type] = importer; + } + + private static void WriteValue (object obj, JsonWriter writer, + bool writer_is_private, + int depth) + { + if (depth > max_nesting_depth) + throw new JsonException ( + String.Format ("Max allowed object depth reached while " + + "trying to export from type {0}", + obj.GetType ())); + + if (obj == null) { + writer.Write (null); + return; + } + + if (obj is IJsonWrapper) { + if (writer_is_private) + writer.TextWriter.Write (((IJsonWrapper) obj).ToJson ()); + else + ((IJsonWrapper) obj).ToJson (writer); + + return; + } + + if (obj is String) { + writer.Write ((string) obj); + return; + } + + if (obj is Double) { + writer.Write ((double) obj); + return; + } + + if (obj is Single) + { + writer.Write((float)obj); + return; + } + + if (obj is Int32) { + writer.Write ((int) obj); + return; + } + + if (obj is Boolean) { + writer.Write ((bool) obj); + return; + } + + if (obj is Int64) { + writer.Write ((long) obj); + return; + } + + if (obj is Array) { + writer.WriteArrayStart (); + + foreach (object elem in (Array) obj) + WriteValue (elem, writer, writer_is_private, depth + 1); + + writer.WriteArrayEnd (); + + return; + } + + if (obj is IList) { + writer.WriteArrayStart (); + foreach (object elem in (IList) obj) + WriteValue (elem, writer, writer_is_private, depth + 1); + writer.WriteArrayEnd (); + + return; + } + + if (obj is IDictionary dictionary) { + writer.WriteObjectStart (); + foreach (DictionaryEntry entry in dictionary) { + var propertyName = entry.Key is string key ? + key + : Convert.ToString(entry.Key, CultureInfo.InvariantCulture); + writer.WritePropertyName (propertyName); + WriteValue (entry.Value, writer, writer_is_private, + depth + 1); + } + writer.WriteObjectEnd (); + + return; + } + + Type obj_type = obj.GetType (); + + // See if there's a custom exporter for the object + if (custom_exporters_table.ContainsKey (obj_type)) { + ExporterFunc exporter = custom_exporters_table[obj_type]; + exporter (obj, writer); + + return; + } + + // If not, maybe there's a base exporter + if (base_exporters_table.ContainsKey (obj_type)) { + ExporterFunc exporter = base_exporters_table[obj_type]; + exporter (obj, writer); + + return; + } + + // Last option, let's see if it's an enum + if (obj is Enum) { + Type e_type = Enum.GetUnderlyingType (obj_type); + + if (e_type == typeof (long) + || e_type == typeof (uint) + || e_type == typeof (ulong)) + writer.Write ((ulong) obj); + else + writer.Write ((int) obj); + + return; + } + + // Okay, so it looks like the input should be exported as an + // object + AddTypeProperties (obj_type); + IList props = type_properties[obj_type]; + + writer.WriteObjectStart (); + foreach (PropertyMetadata p_data in props) { + if (p_data.IsField) { + writer.WritePropertyName (p_data.Info.Name); + WriteValue (((FieldInfo) p_data.Info).GetValue (obj), + writer, writer_is_private, depth + 1); + } + else { + PropertyInfo p_info = (PropertyInfo) p_data.Info; + + if (p_info.CanRead) { + writer.WritePropertyName (p_data.Info.Name); + WriteValue (p_info.GetValue (obj, null), + writer, writer_is_private, depth + 1); + } + } + } + writer.WriteObjectEnd (); + } + #endregion + + + public static string ToJson (object obj) + { + lock (static_writer_lock) { + static_writer.Reset (); + + WriteValue (obj, static_writer, true, 0); + + return static_writer.ToString (); + } + } + + public static void ToJson (object obj, JsonWriter writer) + { + WriteValue (obj, writer, false, 0); + } + + public static JsonData ToObject (JsonReader reader) + { + return (JsonData) ToWrapper ( + delegate { return new JsonData (); }, reader); + } + + public static JsonData ToObject (TextReader reader) + { + JsonReader json_reader = new JsonReader (reader); + + return (JsonData) ToWrapper ( + delegate { return new JsonData (); }, json_reader); + } + + public static JsonData ToObject (string json) + { + return (JsonData) ToWrapper ( + delegate { return new JsonData (); }, json); + } + + public static T ToObject (JsonReader reader) + { + return (T) ReadValue (typeof (T), reader); + } + + public static T ToObject (TextReader reader) + { + JsonReader json_reader = new JsonReader (reader); + + return (T) ReadValue (typeof (T), json_reader); + } + + public static T ToObject (string json) + { + JsonReader reader = new JsonReader (json); + + return (T) ReadValue (typeof (T), reader); + } + + public static object ToObject(string json, Type ConvertType ) + { + JsonReader reader = new JsonReader(json); + + return ReadValue(ConvertType, reader); + } + + public static IJsonWrapper ToWrapper (WrapperFactory factory, + JsonReader reader) + { + return ReadValue (factory, reader); + } + + public static IJsonWrapper ToWrapper (WrapperFactory factory, + string json) + { + JsonReader reader = new JsonReader (json); + + return ReadValue (factory, reader); + } + + public static void RegisterExporter (ExporterFunc exporter) + { + ExporterFunc exporter_wrapper = + delegate (object obj, JsonWriter writer) { + exporter ((T) obj, writer); + }; + + custom_exporters_table[typeof (T)] = exporter_wrapper; + } + + public static void RegisterImporter ( + ImporterFunc importer) + { + ImporterFunc importer_wrapper = + delegate (object input) { + return importer ((TJson) input); + }; + + RegisterImporter (custom_importers_table, typeof (TJson), + typeof (TValue), importer_wrapper); + } + + public static void UnregisterExporters () + { + custom_exporters_table.Clear (); + } + + public static void UnregisterImporters () + { + custom_importers_table.Clear (); + } + } +} diff --git a/Assets/Plugins/ByteGame/com.bytedance.starksdk/LitJson/JsonMapper.cs.meta b/Assets/Plugins/ByteGame/com.bytedance.starksdk/LitJson/JsonMapper.cs.meta new file mode 100644 index 00000000..75a51d42 --- /dev/null +++ b/Assets/Plugins/ByteGame/com.bytedance.starksdk/LitJson/JsonMapper.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: 61663b4846a6045f6a6fb271bd35d027 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/Plugins/ByteGame/com.bytedance.starksdk/LitJson/JsonMockWrapper.cs b/Assets/Plugins/ByteGame/com.bytedance.starksdk/LitJson/JsonMockWrapper.cs new file mode 100644 index 00000000..e1954653 --- /dev/null +++ b/Assets/Plugins/ByteGame/com.bytedance.starksdk/LitJson/JsonMockWrapper.cs @@ -0,0 +1,105 @@ +#region Header +/** + * JsonMockWrapper.cs + * Mock object implementing IJsonWrapper, to facilitate actions like + * skipping data more efficiently. + * + * The authors disclaim copyright to this source code. For more details, see + * the COPYING file included with this distribution. + **/ +#endregion + + +using System; +using System.Collections; +using System.Collections.Specialized; + + +namespace StarkSDKSpace.UNBridgeLib.LitJson +{ + public class JsonMockWrapper : IJsonWrapper + { + public bool IsArray { get { return false; } } + public bool IsBoolean { get { return false; } } + public bool IsDouble { get { return false; } } + public bool IsInt { get { return false; } } + public bool IsLong { get { return false; } } + public bool IsObject { get { return false; } } + public bool IsString { get { return false; } } + + public bool GetBoolean () { return false; } + public double GetDouble () { return 0.0; } + public int GetInt () { return 0; } + public JsonType GetJsonType () { return JsonType.None; } + public long GetLong () { return 0L; } + public string GetString () { return ""; } + + public void SetBoolean (bool val) {} + public void SetDouble (double val) {} + public void SetInt (int val) {} + public void SetJsonType (JsonType type) {} + public void SetLong (long val) {} + public void SetString (string val) {} + + public string ToJson () { return ""; } + public void ToJson (JsonWriter writer) {} + + + bool IList.IsFixedSize { get { return true; } } + bool IList.IsReadOnly { get { return true; } } + + object IList.this[int index] { + get { return null; } + set {} + } + + int IList.Add (object value) { return 0; } + void IList.Clear () {} + bool IList.Contains (object value) { return false; } + int IList.IndexOf (object value) { return -1; } + void IList.Insert (int i, object v) {} + void IList.Remove (object value) {} + void IList.RemoveAt (int index) {} + + + int ICollection.Count { get { return 0; } } + bool ICollection.IsSynchronized { get { return false; } } + object ICollection.SyncRoot { get { return null; } } + + void ICollection.CopyTo (Array array, int index) {} + + + IEnumerator IEnumerable.GetEnumerator () { return null; } + + + bool IDictionary.IsFixedSize { get { return true; } } + bool IDictionary.IsReadOnly { get { return true; } } + + ICollection IDictionary.Keys { get { return null; } } + ICollection IDictionary.Values { get { return null; } } + + object IDictionary.this[object key] { + get { return null; } + set {} + } + + void IDictionary.Add (object k, object v) {} + void IDictionary.Clear () {} + bool IDictionary.Contains (object key) { return false; } + void IDictionary.Remove (object key) {} + + IDictionaryEnumerator IDictionary.GetEnumerator () { return null; } + + + object IOrderedDictionary.this[int idx] { + get { return null; } + set {} + } + + IDictionaryEnumerator IOrderedDictionary.GetEnumerator () { + return null; + } + void IOrderedDictionary.Insert (int i, object k, object v) {} + void IOrderedDictionary.RemoveAt (int i) {} + } +} diff --git a/Assets/Plugins/ByteGame/com.bytedance.starksdk/LitJson/JsonMockWrapper.cs.meta b/Assets/Plugins/ByteGame/com.bytedance.starksdk/LitJson/JsonMockWrapper.cs.meta new file mode 100644 index 00000000..4c2088e0 --- /dev/null +++ b/Assets/Plugins/ByteGame/com.bytedance.starksdk/LitJson/JsonMockWrapper.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: 5056410c48dd048a7b585f9ebde0a43a +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/Plugins/ByteGame/com.bytedance.starksdk/LitJson/JsonReader.cs b/Assets/Plugins/ByteGame/com.bytedance.starksdk/LitJson/JsonReader.cs new file mode 100644 index 00000000..49209b48 --- /dev/null +++ b/Assets/Plugins/ByteGame/com.bytedance.starksdk/LitJson/JsonReader.cs @@ -0,0 +1,478 @@ +#region Header +/** + * JsonReader.cs + * Stream-like access to JSON text. + * + * The authors disclaim copyright to this source code. For more details, see + * the COPYING file included with this distribution. + **/ +#endregion + + +using System; +using System.Collections.Generic; +using System.Globalization; +using System.IO; +using System.Text; + + +namespace StarkSDKSpace.UNBridgeLib.LitJson +{ + public enum JsonToken + { + None, + + ObjectStart, + PropertyName, + ObjectEnd, + + ArrayStart, + ArrayEnd, + + Int, + Long, + Double, + + String, + + Boolean, + Null + } + + + public class JsonReader + { + #region Fields + private static readonly IDictionary> parse_table; + + private Stack automaton_stack; + private int current_input; + private int current_symbol; + private bool end_of_json; + private bool end_of_input; + private Lexer lexer; + private bool parser_in_string; + private bool parser_return; + private bool read_started; + private TextReader reader; + private bool reader_is_owned; + private bool skip_non_members; + private object token_value; + private JsonToken token; + #endregion + + + #region Public Properties + public bool AllowComments { + get { return lexer.AllowComments; } + set { lexer.AllowComments = value; } + } + + public bool AllowSingleQuotedStrings { + get { return lexer.AllowSingleQuotedStrings; } + set { lexer.AllowSingleQuotedStrings = value; } + } + + public bool SkipNonMembers { + get { return skip_non_members; } + set { skip_non_members = value; } + } + + public bool EndOfInput { + get { return end_of_input; } + } + + public bool EndOfJson { + get { return end_of_json; } + } + + public JsonToken Token { + get { return token; } + } + + public object Value { + get { return token_value; } + } + #endregion + + + #region Constructors + static JsonReader () + { + parse_table = PopulateParseTable (); + } + + public JsonReader (string json_text) : + this (new StringReader (json_text), true) + { + } + + public JsonReader (TextReader reader) : + this (reader, false) + { + } + + private JsonReader (TextReader reader, bool owned) + { + if (reader == null) + throw new ArgumentNullException ("reader"); + + parser_in_string = false; + parser_return = false; + + read_started = false; + automaton_stack = new Stack (); + automaton_stack.Push ((int) ParserToken.End); + automaton_stack.Push ((int) ParserToken.Text); + + lexer = new Lexer (reader); + + end_of_input = false; + end_of_json = false; + + skip_non_members = true; + + this.reader = reader; + reader_is_owned = owned; + } + #endregion + + + #region Static Methods + private static IDictionary> PopulateParseTable () + { + // See section A.2. of the manual for details + IDictionary> parse_table = new Dictionary> (); + + TableAddRow (parse_table, ParserToken.Array); + TableAddCol (parse_table, ParserToken.Array, '[', + '[', + (int) ParserToken.ArrayPrime); + + TableAddRow (parse_table, ParserToken.ArrayPrime); + TableAddCol (parse_table, ParserToken.ArrayPrime, '"', + (int) ParserToken.Value, + + (int) ParserToken.ValueRest, + ']'); + TableAddCol (parse_table, ParserToken.ArrayPrime, '[', + (int) ParserToken.Value, + (int) ParserToken.ValueRest, + ']'); + TableAddCol (parse_table, ParserToken.ArrayPrime, ']', + ']'); + TableAddCol (parse_table, ParserToken.ArrayPrime, '{', + (int) ParserToken.Value, + (int) ParserToken.ValueRest, + ']'); + TableAddCol (parse_table, ParserToken.ArrayPrime, (int) ParserToken.Number, + (int) ParserToken.Value, + (int) ParserToken.ValueRest, + ']'); + TableAddCol (parse_table, ParserToken.ArrayPrime, (int) ParserToken.True, + (int) ParserToken.Value, + (int) ParserToken.ValueRest, + ']'); + TableAddCol (parse_table, ParserToken.ArrayPrime, (int) ParserToken.False, + (int) ParserToken.Value, + (int) ParserToken.ValueRest, + ']'); + TableAddCol (parse_table, ParserToken.ArrayPrime, (int) ParserToken.Null, + (int) ParserToken.Value, + (int) ParserToken.ValueRest, + ']'); + + TableAddRow (parse_table, ParserToken.Object); + TableAddCol (parse_table, ParserToken.Object, '{', + '{', + (int) ParserToken.ObjectPrime); + + TableAddRow (parse_table, ParserToken.ObjectPrime); + TableAddCol (parse_table, ParserToken.ObjectPrime, '"', + (int) ParserToken.Pair, + (int) ParserToken.PairRest, + '}'); + TableAddCol (parse_table, ParserToken.ObjectPrime, '}', + '}'); + + TableAddRow (parse_table, ParserToken.Pair); + TableAddCol (parse_table, ParserToken.Pair, '"', + (int) ParserToken.String, + ':', + (int) ParserToken.Value); + + TableAddRow (parse_table, ParserToken.PairRest); + TableAddCol (parse_table, ParserToken.PairRest, ',', + ',', + (int) ParserToken.Pair, + (int) ParserToken.PairRest); + TableAddCol (parse_table, ParserToken.PairRest, '}', + (int) ParserToken.Epsilon); + + TableAddRow (parse_table, ParserToken.String); + TableAddCol (parse_table, ParserToken.String, '"', + '"', + (int) ParserToken.CharSeq, + '"'); + + TableAddRow (parse_table, ParserToken.Text); + TableAddCol (parse_table, ParserToken.Text, '[', + (int) ParserToken.Array); + TableAddCol (parse_table, ParserToken.Text, '{', + (int) ParserToken.Object); + + TableAddRow (parse_table, ParserToken.Value); + TableAddCol (parse_table, ParserToken.Value, '"', + (int) ParserToken.String); + TableAddCol (parse_table, ParserToken.Value, '[', + (int) ParserToken.Array); + TableAddCol (parse_table, ParserToken.Value, '{', + (int) ParserToken.Object); + TableAddCol (parse_table, ParserToken.Value, (int) ParserToken.Number, + (int) ParserToken.Number); + TableAddCol (parse_table, ParserToken.Value, (int) ParserToken.True, + (int) ParserToken.True); + TableAddCol (parse_table, ParserToken.Value, (int) ParserToken.False, + (int) ParserToken.False); + TableAddCol (parse_table, ParserToken.Value, (int) ParserToken.Null, + (int) ParserToken.Null); + + TableAddRow (parse_table, ParserToken.ValueRest); + TableAddCol (parse_table, ParserToken.ValueRest, ',', + ',', + (int) ParserToken.Value, + (int) ParserToken.ValueRest); + TableAddCol (parse_table, ParserToken.ValueRest, ']', + (int) ParserToken.Epsilon); + + return parse_table; + } + + private static void TableAddCol (IDictionary> parse_table, ParserToken row, int col, + params int[] symbols) + { + parse_table[(int) row].Add (col, symbols); + } + + private static void TableAddRow (IDictionary> parse_table, ParserToken rule) + { + parse_table.Add ((int) rule, new Dictionary ()); + } + #endregion + + + #region Private Methods + private void ProcessNumber (string number) + { + if (number.IndexOf ('.') != -1 || + number.IndexOf ('e') != -1 || + number.IndexOf ('E') != -1) { + + double n_double; + if (double.TryParse (number, NumberStyles.Any, CultureInfo.InvariantCulture, out n_double)) { + token = JsonToken.Double; + token_value = n_double; + + return; + } + } + + int n_int32; + if (int.TryParse (number, NumberStyles.Integer, CultureInfo.InvariantCulture, out n_int32)) { + token = JsonToken.Int; + token_value = n_int32; + + return; + } + + long n_int64; + if (long.TryParse (number, NumberStyles.Integer, CultureInfo.InvariantCulture, out n_int64)) { + token = JsonToken.Long; + token_value = n_int64; + + return; + } + + ulong n_uint64; + if (ulong.TryParse(number, NumberStyles.Integer, CultureInfo.InvariantCulture, out n_uint64)) + { + token = JsonToken.Long; + token_value = n_uint64; + + return; + } + + // Shouldn't happen, but just in case, return something + token = JsonToken.Int; + token_value = 0; + } + + private void ProcessSymbol () + { + if (current_symbol == '[') { + token = JsonToken.ArrayStart; + parser_return = true; + + } else if (current_symbol == ']') { + token = JsonToken.ArrayEnd; + parser_return = true; + + } else if (current_symbol == '{') { + token = JsonToken.ObjectStart; + parser_return = true; + + } else if (current_symbol == '}') { + token = JsonToken.ObjectEnd; + parser_return = true; + + } else if (current_symbol == '"') { + if (parser_in_string) { + parser_in_string = false; + + parser_return = true; + + } else { + if (token == JsonToken.None) + token = JsonToken.String; + + parser_in_string = true; + } + + } else if (current_symbol == (int) ParserToken.CharSeq) { + token_value = lexer.StringValue; + + } else if (current_symbol == (int) ParserToken.False) { + token = JsonToken.Boolean; + token_value = false; + parser_return = true; + + } else if (current_symbol == (int) ParserToken.Null) { + token = JsonToken.Null; + parser_return = true; + + } else if (current_symbol == (int) ParserToken.Number) { + ProcessNumber (lexer.StringValue); + + parser_return = true; + + } else if (current_symbol == (int) ParserToken.Pair) { + token = JsonToken.PropertyName; + + } else if (current_symbol == (int) ParserToken.True) { + token = JsonToken.Boolean; + token_value = true; + parser_return = true; + + } + } + + private bool ReadToken () + { + if (end_of_input) + return false; + + lexer.NextToken (); + + if (lexer.EndOfInput) { + Close (); + + return false; + } + + current_input = lexer.Token; + + return true; + } + #endregion + + + public void Close () + { + if (end_of_input) + return; + + end_of_input = true; + end_of_json = true; + + if (reader_is_owned) + { + using(reader){} + } + + reader = null; + } + + public bool Read () + { + if (end_of_input) + return false; + + if (end_of_json) { + end_of_json = false; + automaton_stack.Clear (); + automaton_stack.Push ((int) ParserToken.End); + automaton_stack.Push ((int) ParserToken.Text); + } + + parser_in_string = false; + parser_return = false; + + token = JsonToken.None; + token_value = null; + + if (! read_started) { + read_started = true; + + if (! ReadToken ()) + return false; + } + + + int[] entry_symbols; + + while (true) { + if (parser_return) { + if (automaton_stack.Peek () == (int) ParserToken.End) + end_of_json = true; + + return true; + } + + current_symbol = automaton_stack.Pop (); + + ProcessSymbol (); + + if (current_symbol == current_input) { + if (! ReadToken ()) { + if (automaton_stack.Peek () != (int) ParserToken.End) + throw new JsonException ( + "Input doesn't evaluate to proper JSON text"); + + if (parser_return) + return true; + + return false; + } + + continue; + } + + try { + + entry_symbols = + parse_table[current_symbol][current_input]; + + } catch (KeyNotFoundException e) { + throw new JsonException ((ParserToken) current_input, e); + } + + if (entry_symbols[0] == (int) ParserToken.Epsilon) + continue; + + for (int i = entry_symbols.Length - 1; i >= 0; i--) + automaton_stack.Push (entry_symbols[i]); + } + } + + } +} diff --git a/Assets/Plugins/ByteGame/com.bytedance.starksdk/LitJson/JsonReader.cs.meta b/Assets/Plugins/ByteGame/com.bytedance.starksdk/LitJson/JsonReader.cs.meta new file mode 100644 index 00000000..ef4371a0 --- /dev/null +++ b/Assets/Plugins/ByteGame/com.bytedance.starksdk/LitJson/JsonReader.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: 89c3872119ab049c9904caaff379a104 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/Plugins/ByteGame/com.bytedance.starksdk/LitJson/JsonWriter.cs b/Assets/Plugins/ByteGame/com.bytedance.starksdk/LitJson/JsonWriter.cs new file mode 100644 index 00000000..25f5ed48 --- /dev/null +++ b/Assets/Plugins/ByteGame/com.bytedance.starksdk/LitJson/JsonWriter.cs @@ -0,0 +1,485 @@ +#region Header +/** + * JsonWriter.cs + * Stream-like facility to output JSON text. + * + * The authors disclaim copyright to this source code. For more details, see + * the COPYING file included with this distribution. + **/ +#endregion + + +using System; +using System.Collections.Generic; +using System.Globalization; +using System.IO; +using System.Text; + + +namespace StarkSDKSpace.UNBridgeLib.LitJson +{ + internal enum Condition + { + InArray, + InObject, + NotAProperty, + Property, + Value + } + + internal class WriterContext + { + public int Count; + public bool InArray; + public bool InObject; + public bool ExpectingValue; + public int Padding; + } + + public class JsonWriter + { + #region Fields + private static readonly NumberFormatInfo number_format; + + private WriterContext context; + private Stack ctx_stack; + private bool has_reached_end; + private char[] hex_seq; + private int indentation; + private int indent_value; + private StringBuilder inst_string_builder; + private bool pretty_print; + private bool validate; + private bool lower_case_properties; + private TextWriter writer; + #endregion + + + #region Properties + public int IndentValue { + get { return indent_value; } + set { + indentation = (indentation / indent_value) * value; + indent_value = value; + } + } + + public bool PrettyPrint { + get { return pretty_print; } + set { pretty_print = value; } + } + + public TextWriter TextWriter { + get { return writer; } + } + + public bool Validate { + get { return validate; } + set { validate = value; } + } + + public bool LowerCaseProperties { + get { return lower_case_properties; } + set { lower_case_properties = value; } + } + #endregion + + + #region Constructors + static JsonWriter () + { + number_format = NumberFormatInfo.InvariantInfo; + } + + public JsonWriter () + { + inst_string_builder = new StringBuilder (); + writer = new StringWriter (inst_string_builder); + + Init (); + } + + public JsonWriter (StringBuilder sb) : + this (new StringWriter (sb)) + { + } + + public JsonWriter (TextWriter writer) + { + if (writer == null) + throw new ArgumentNullException ("writer"); + + this.writer = writer; + + Init (); + } + #endregion + + + #region Private Methods + private void DoValidation (Condition cond) + { + if (! context.ExpectingValue) + context.Count++; + + if (! validate) + return; + + if (has_reached_end) + throw new JsonException ( + "A complete JSON symbol has already been written"); + + switch (cond) { + case Condition.InArray: + if (! context.InArray) + throw new JsonException ( + "Can't close an array here"); + break; + + case Condition.InObject: + if (! context.InObject || context.ExpectingValue) + throw new JsonException ( + "Can't close an object here"); + break; + + case Condition.NotAProperty: + if (context.InObject && ! context.ExpectingValue) + throw new JsonException ( + "Expected a property"); + break; + + case Condition.Property: + if (! context.InObject || context.ExpectingValue) + throw new JsonException ( + "Can't add a property here"); + break; + + case Condition.Value: + if (! context.InArray && + (! context.InObject || ! context.ExpectingValue)) + throw new JsonException ( + "Can't add a value here"); + + break; + } + } + + private void Init () + { + has_reached_end = false; + hex_seq = new char[4]; + indentation = 0; + indent_value = 4; + pretty_print = false; + validate = true; + lower_case_properties = false; + + ctx_stack = new Stack (); + context = new WriterContext (); + ctx_stack.Push (context); + } + + private static void IntToHex (int n, char[] hex) + { + int num; + + for (int i = 0; i < 4; i++) { + num = n % 16; + + if (num < 10) + hex[3 - i] = (char) ('0' + num); + else + hex[3 - i] = (char) ('A' + (num - 10)); + + n >>= 4; + } + } + + private void Indent () + { + if (pretty_print) + indentation += indent_value; + } + + + private void Put (string str) + { + if (pretty_print && ! context.ExpectingValue) + for (int i = 0; i < indentation; i++) + writer.Write (' '); + + writer.Write (str); + } + + private void PutNewline () + { + PutNewline (true); + } + + private void PutNewline (bool add_comma) + { + if (add_comma && ! context.ExpectingValue && + context.Count > 1) + writer.Write (','); + + if (pretty_print && ! context.ExpectingValue) + writer.Write (Environment.NewLine); + } + + private void PutString (string str) + { + Put (String.Empty); + + writer.Write ('"'); + + int n = str.Length; + for (int i = 0; i < n; i++) { + switch (str[i]) { + case '\n': + writer.Write ("\\n"); + continue; + + case '\r': + writer.Write ("\\r"); + continue; + + case '\t': + writer.Write ("\\t"); + continue; + + case '"': + case '\\': + writer.Write ('\\'); + writer.Write (str[i]); + continue; + + case '\f': + writer.Write ("\\f"); + continue; + + case '\b': + writer.Write ("\\b"); + continue; + } + + //兼容中文 + if ((int) str[i] >= 32 && (int) str[i] <= 126 || str[i] > 127) { + writer.Write (str[i]); + continue; + } + + // Default, turn into a \uXXXX sequence + IntToHex ((int) str[i], hex_seq); + writer.Write ("\\u"); + writer.Write (hex_seq); + } + + writer.Write ('"'); + } + + private void Unindent () + { + if (pretty_print) + indentation -= indent_value; + } + #endregion + + + public override string ToString () + { + if (inst_string_builder == null) + return String.Empty; + + return inst_string_builder.ToString (); + } + + public void Reset () + { + has_reached_end = false; + + ctx_stack.Clear (); + context = new WriterContext (); + ctx_stack.Push (context); + + if (inst_string_builder != null) + inst_string_builder.Remove (0, inst_string_builder.Length); + } + + public void Write (bool boolean) + { + DoValidation (Condition.Value); + PutNewline (); + + Put (boolean ? "true" : "false"); + + context.ExpectingValue = false; + } + + public void Write (decimal number) + { + DoValidation (Condition.Value); + PutNewline (); + + Put (Convert.ToString (number, number_format)); + + context.ExpectingValue = false; + } + + public void Write (double number) + { + DoValidation (Condition.Value); + PutNewline (); + + string str = Convert.ToString (number, number_format); + Put (str); + + if (str.IndexOf ('.') == -1 && + str.IndexOf ('E') == -1) + writer.Write (".0"); + + context.ExpectingValue = false; + } + + public void Write(float number) + { + DoValidation(Condition.Value); + PutNewline(); + + string str = Convert.ToString(number, number_format); + Put(str); + + context.ExpectingValue = false; + } + + public void Write (int number) + { + DoValidation (Condition.Value); + PutNewline (); + + Put (Convert.ToString (number, number_format)); + + context.ExpectingValue = false; + } + + public void Write (long number) + { + DoValidation (Condition.Value); + PutNewline (); + + Put (Convert.ToString (number, number_format)); + + context.ExpectingValue = false; + } + + public void Write (string str) + { + DoValidation (Condition.Value); + PutNewline (); + + if (str == null) + Put ("null"); + else + PutString (str); + + context.ExpectingValue = false; + } + + [CLSCompliant(false)] + public void Write (ulong number) + { + DoValidation (Condition.Value); + PutNewline (); + + Put (Convert.ToString (number, number_format)); + + context.ExpectingValue = false; + } + + public void WriteArrayEnd () + { + DoValidation (Condition.InArray); + PutNewline (false); + + ctx_stack.Pop (); + if (ctx_stack.Count == 1) + has_reached_end = true; + else { + context = ctx_stack.Peek (); + context.ExpectingValue = false; + } + + Unindent (); + Put ("]"); + } + + public void WriteArrayStart () + { + DoValidation (Condition.NotAProperty); + PutNewline (); + + Put ("["); + + context = new WriterContext (); + context.InArray = true; + ctx_stack.Push (context); + + Indent (); + } + + public void WriteObjectEnd () + { + DoValidation (Condition.InObject); + PutNewline (false); + + ctx_stack.Pop (); + if (ctx_stack.Count == 1) + has_reached_end = true; + else { + context = ctx_stack.Peek (); + context.ExpectingValue = false; + } + + Unindent (); + Put ("}"); + } + + public void WriteObjectStart () + { + DoValidation (Condition.NotAProperty); + PutNewline (); + + Put ("{"); + + context = new WriterContext (); + context.InObject = true; + ctx_stack.Push (context); + + Indent (); + } + + public void WritePropertyName (string property_name) + { + DoValidation (Condition.Property); + PutNewline (); + string propertyName = (property_name == null || !lower_case_properties) + ? property_name + : property_name.ToLowerInvariant(); + + PutString (propertyName); + + if (pretty_print) { + if (propertyName.Length > context.Padding) + context.Padding = propertyName.Length; + + for (int i = context.Padding - propertyName.Length; + i >= 0; i--) + writer.Write (' '); + + writer.Write (": "); + } else + writer.Write (':'); + + context.ExpectingValue = true; + } + } +} diff --git a/Assets/Plugins/ByteGame/com.bytedance.starksdk/LitJson/JsonWriter.cs.meta b/Assets/Plugins/ByteGame/com.bytedance.starksdk/LitJson/JsonWriter.cs.meta new file mode 100644 index 00000000..ba98c845 --- /dev/null +++ b/Assets/Plugins/ByteGame/com.bytedance.starksdk/LitJson/JsonWriter.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: 80078eb8f6eaf475d89128f3b1d6b630 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/Plugins/ByteGame/com.bytedance.starksdk/LitJson/Lexer.cs b/Assets/Plugins/ByteGame/com.bytedance.starksdk/LitJson/Lexer.cs new file mode 100644 index 00000000..946c30eb --- /dev/null +++ b/Assets/Plugins/ByteGame/com.bytedance.starksdk/LitJson/Lexer.cs @@ -0,0 +1,912 @@ +#region Header +/** + * Lexer.cs + * JSON lexer implementation based on a finite state machine. + * + * The authors disclaim copyright to this source code. For more details, see + * the COPYING file included with this distribution. + **/ +#endregion + + +using System; +using System.Collections.Generic; +using System.IO; +using System.Text; + + +namespace StarkSDKSpace.UNBridgeLib.LitJson +{ + internal class FsmContext + { + public bool Return; + public int NextState; + public Lexer L; + public int StateStack; + } + + + internal class Lexer + { + #region Fields + private delegate bool StateHandler (FsmContext ctx); + + private static readonly int[] fsm_return_table; + private static readonly StateHandler[] fsm_handler_table; + + private bool allow_comments; + private bool allow_single_quoted_strings; + private bool end_of_input; + private FsmContext fsm_context; + private int input_buffer; + private int input_char; + private TextReader reader; + private int state; + private StringBuilder string_buffer; + private string string_value; + private int token; + private int unichar; + #endregion + + + #region Properties + public bool AllowComments { + get { return allow_comments; } + set { allow_comments = value; } + } + + public bool AllowSingleQuotedStrings { + get { return allow_single_quoted_strings; } + set { allow_single_quoted_strings = value; } + } + + public bool EndOfInput { + get { return end_of_input; } + } + + public int Token { + get { return token; } + } + + public string StringValue { + get { return string_value; } + } + #endregion + + + #region Constructors + static Lexer () + { + PopulateFsmTables (out fsm_handler_table, out fsm_return_table); + } + + public Lexer (TextReader reader) + { + allow_comments = true; + allow_single_quoted_strings = true; + + input_buffer = 0; + string_buffer = new StringBuilder (128); + state = 1; + end_of_input = false; + this.reader = reader; + + fsm_context = new FsmContext (); + fsm_context.L = this; + } + #endregion + + + #region Static Methods + private static int HexValue (int digit) + { + switch (digit) { + case 'a': + case 'A': + return 10; + + case 'b': + case 'B': + return 11; + + case 'c': + case 'C': + return 12; + + case 'd': + case 'D': + return 13; + + case 'e': + case 'E': + return 14; + + case 'f': + case 'F': + return 15; + + default: + return digit - '0'; + } + } + + private static void PopulateFsmTables (out StateHandler[] fsm_handler_table, out int[] fsm_return_table) + { + // See section A.1. of the manual for details of the finite + // state machine. + fsm_handler_table = new StateHandler[28] { + State1, + State2, + State3, + State4, + State5, + State6, + State7, + State8, + State9, + State10, + State11, + State12, + State13, + State14, + State15, + State16, + State17, + State18, + State19, + State20, + State21, + State22, + State23, + State24, + State25, + State26, + State27, + State28 + }; + + fsm_return_table = new int[28] { + (int) ParserToken.Char, + 0, + (int) ParserToken.Number, + (int) ParserToken.Number, + 0, + (int) ParserToken.Number, + 0, + (int) ParserToken.Number, + 0, + 0, + (int) ParserToken.True, + 0, + 0, + 0, + (int) ParserToken.False, + 0, + 0, + (int) ParserToken.Null, + (int) ParserToken.CharSeq, + (int) ParserToken.Char, + 0, + 0, + (int) ParserToken.CharSeq, + (int) ParserToken.Char, + 0, + 0, + 0, + 0 + }; + } + + private static char ProcessEscChar (int esc_char) + { + switch (esc_char) { + case '"': + case '\'': + case '\\': + case '/': + return Convert.ToChar (esc_char); + + case 'n': + return '\n'; + + case 't': + return '\t'; + + case 'r': + return '\r'; + + case 'b': + return '\b'; + + case 'f': + return '\f'; + + default: + // Unreachable + return '?'; + } + } + + private static bool State1 (FsmContext ctx) + { + while (ctx.L.GetChar ()) { + if (ctx.L.input_char == ' ' || + ctx.L.input_char >= '\t' && ctx.L.input_char <= '\r') + continue; + + if (ctx.L.input_char >= '1' && ctx.L.input_char <= '9') { + ctx.L.string_buffer.Append ((char) ctx.L.input_char); + ctx.NextState = 3; + return true; + } + + switch (ctx.L.input_char) { + case '"': + ctx.NextState = 19; + ctx.Return = true; + return true; + + case ',': + case ':': + case '[': + case ']': + case '{': + case '}': + ctx.NextState = 1; + ctx.Return = true; + return true; + + case '-': + ctx.L.string_buffer.Append ((char) ctx.L.input_char); + ctx.NextState = 2; + return true; + + case '0': + ctx.L.string_buffer.Append ((char) ctx.L.input_char); + ctx.NextState = 4; + return true; + + case 'f': + ctx.NextState = 12; + return true; + + case 'n': + ctx.NextState = 16; + return true; + + case 't': + ctx.NextState = 9; + return true; + + case '\'': + if (! ctx.L.allow_single_quoted_strings) + return false; + + ctx.L.input_char = '"'; + ctx.NextState = 23; + ctx.Return = true; + return true; + + case '/': + if (! ctx.L.allow_comments) + return false; + + ctx.NextState = 25; + return true; + + default: + return false; + } + } + + return true; + } + + private static bool State2 (FsmContext ctx) + { + ctx.L.GetChar (); + + if (ctx.L.input_char >= '1' && ctx.L.input_char<= '9') { + ctx.L.string_buffer.Append ((char) ctx.L.input_char); + ctx.NextState = 3; + return true; + } + + switch (ctx.L.input_char) { + case '0': + ctx.L.string_buffer.Append ((char) ctx.L.input_char); + ctx.NextState = 4; + return true; + + default: + return false; + } + } + + private static bool State3 (FsmContext ctx) + { + while (ctx.L.GetChar ()) { + if (ctx.L.input_char >= '0' && ctx.L.input_char <= '9') { + ctx.L.string_buffer.Append ((char) ctx.L.input_char); + continue; + } + + if (ctx.L.input_char == ' ' || + ctx.L.input_char >= '\t' && ctx.L.input_char <= '\r') { + ctx.Return = true; + ctx.NextState = 1; + return true; + } + + switch (ctx.L.input_char) { + case ',': + case ']': + case '}': + ctx.L.UngetChar (); + ctx.Return = true; + ctx.NextState = 1; + return true; + + case '.': + ctx.L.string_buffer.Append ((char) ctx.L.input_char); + ctx.NextState = 5; + return true; + + case 'e': + case 'E': + ctx.L.string_buffer.Append ((char) ctx.L.input_char); + ctx.NextState = 7; + return true; + + default: + return false; + } + } + return true; + } + + private static bool State4 (FsmContext ctx) + { + ctx.L.GetChar (); + + if (ctx.L.input_char == ' ' || + ctx.L.input_char >= '\t' && ctx.L.input_char <= '\r') { + ctx.Return = true; + ctx.NextState = 1; + return true; + } + + switch (ctx.L.input_char) { + case ',': + case ']': + case '}': + ctx.L.UngetChar (); + ctx.Return = true; + ctx.NextState = 1; + return true; + + case '.': + ctx.L.string_buffer.Append ((char) ctx.L.input_char); + ctx.NextState = 5; + return true; + + case 'e': + case 'E': + ctx.L.string_buffer.Append ((char) ctx.L.input_char); + ctx.NextState = 7; + return true; + + default: + return false; + } + } + + private static bool State5 (FsmContext ctx) + { + ctx.L.GetChar (); + + if (ctx.L.input_char >= '0' && ctx.L.input_char <= '9') { + ctx.L.string_buffer.Append ((char) ctx.L.input_char); + ctx.NextState = 6; + return true; + } + + return false; + } + + private static bool State6 (FsmContext ctx) + { + while (ctx.L.GetChar ()) { + if (ctx.L.input_char >= '0' && ctx.L.input_char <= '9') { + ctx.L.string_buffer.Append ((char) ctx.L.input_char); + continue; + } + + if (ctx.L.input_char == ' ' || + ctx.L.input_char >= '\t' && ctx.L.input_char <= '\r') { + ctx.Return = true; + ctx.NextState = 1; + return true; + } + + switch (ctx.L.input_char) { + case ',': + case ']': + case '}': + ctx.L.UngetChar (); + ctx.Return = true; + ctx.NextState = 1; + return true; + + case 'e': + case 'E': + ctx.L.string_buffer.Append ((char) ctx.L.input_char); + ctx.NextState = 7; + return true; + + default: + return false; + } + } + + return true; + } + + private static bool State7 (FsmContext ctx) + { + ctx.L.GetChar (); + + if (ctx.L.input_char >= '0' && ctx.L.input_char<= '9') { + ctx.L.string_buffer.Append ((char) ctx.L.input_char); + ctx.NextState = 8; + return true; + } + + switch (ctx.L.input_char) { + case '+': + case '-': + ctx.L.string_buffer.Append ((char) ctx.L.input_char); + ctx.NextState = 8; + return true; + + default: + return false; + } + } + + private static bool State8 (FsmContext ctx) + { + while (ctx.L.GetChar ()) { + if (ctx.L.input_char >= '0' && ctx.L.input_char<= '9') { + ctx.L.string_buffer.Append ((char) ctx.L.input_char); + continue; + } + + if (ctx.L.input_char == ' ' || + ctx.L.input_char >= '\t' && ctx.L.input_char<= '\r') { + ctx.Return = true; + ctx.NextState = 1; + return true; + } + + switch (ctx.L.input_char) { + case ',': + case ']': + case '}': + ctx.L.UngetChar (); + ctx.Return = true; + ctx.NextState = 1; + return true; + + default: + return false; + } + } + + return true; + } + + private static bool State9 (FsmContext ctx) + { + ctx.L.GetChar (); + + switch (ctx.L.input_char) { + case 'r': + ctx.NextState = 10; + return true; + + default: + return false; + } + } + + private static bool State10 (FsmContext ctx) + { + ctx.L.GetChar (); + + switch (ctx.L.input_char) { + case 'u': + ctx.NextState = 11; + return true; + + default: + return false; + } + } + + private static bool State11 (FsmContext ctx) + { + ctx.L.GetChar (); + + switch (ctx.L.input_char) { + case 'e': + ctx.Return = true; + ctx.NextState = 1; + return true; + + default: + return false; + } + } + + private static bool State12 (FsmContext ctx) + { + ctx.L.GetChar (); + + switch (ctx.L.input_char) { + case 'a': + ctx.NextState = 13; + return true; + + default: + return false; + } + } + + private static bool State13 (FsmContext ctx) + { + ctx.L.GetChar (); + + switch (ctx.L.input_char) { + case 'l': + ctx.NextState = 14; + return true; + + default: + return false; + } + } + + private static bool State14 (FsmContext ctx) + { + ctx.L.GetChar (); + + switch (ctx.L.input_char) { + case 's': + ctx.NextState = 15; + return true; + + default: + return false; + } + } + + private static bool State15 (FsmContext ctx) + { + ctx.L.GetChar (); + + switch (ctx.L.input_char) { + case 'e': + ctx.Return = true; + ctx.NextState = 1; + return true; + + default: + return false; + } + } + + private static bool State16 (FsmContext ctx) + { + ctx.L.GetChar (); + + switch (ctx.L.input_char) { + case 'u': + ctx.NextState = 17; + return true; + + default: + return false; + } + } + + private static bool State17 (FsmContext ctx) + { + ctx.L.GetChar (); + + switch (ctx.L.input_char) { + case 'l': + ctx.NextState = 18; + return true; + + default: + return false; + } + } + + private static bool State18 (FsmContext ctx) + { + ctx.L.GetChar (); + + switch (ctx.L.input_char) { + case 'l': + ctx.Return = true; + ctx.NextState = 1; + return true; + + default: + return false; + } + } + + private static bool State19 (FsmContext ctx) + { + while (ctx.L.GetChar ()) { + switch (ctx.L.input_char) { + case '"': + ctx.L.UngetChar (); + ctx.Return = true; + ctx.NextState = 20; + return true; + + case '\\': + ctx.StateStack = 19; + ctx.NextState = 21; + return true; + + default: + ctx.L.string_buffer.Append ((char) ctx.L.input_char); + continue; + } + } + + return true; + } + + private static bool State20 (FsmContext ctx) + { + ctx.L.GetChar (); + + switch (ctx.L.input_char) { + case '"': + ctx.Return = true; + ctx.NextState = 1; + return true; + + default: + return false; + } + } + + private static bool State21 (FsmContext ctx) + { + ctx.L.GetChar (); + + switch (ctx.L.input_char) { + case 'u': + ctx.NextState = 22; + return true; + + case '"': + case '\'': + case '/': + case '\\': + case 'b': + case 'f': + case 'n': + case 'r': + case 't': + ctx.L.string_buffer.Append ( + ProcessEscChar (ctx.L.input_char)); + ctx.NextState = ctx.StateStack; + return true; + + default: + return false; + } + } + + private static bool State22 (FsmContext ctx) + { + int counter = 0; + int mult = 4096; + + ctx.L.unichar = 0; + + while (ctx.L.GetChar ()) { + + if (ctx.L.input_char >= '0' && ctx.L.input_char <= '9' || + ctx.L.input_char >= 'A' && ctx.L.input_char <= 'F' || + ctx.L.input_char >= 'a' && ctx.L.input_char <= 'f') { + + ctx.L.unichar += HexValue (ctx.L.input_char) * mult; + + counter++; + mult /= 16; + + if (counter == 4) { + ctx.L.string_buffer.Append ( + Convert.ToChar (ctx.L.unichar)); + ctx.NextState = ctx.StateStack; + return true; + } + + continue; + } + + return false; + } + + return true; + } + + private static bool State23 (FsmContext ctx) + { + while (ctx.L.GetChar ()) { + switch (ctx.L.input_char) { + case '\'': + ctx.L.UngetChar (); + ctx.Return = true; + ctx.NextState = 24; + return true; + + case '\\': + ctx.StateStack = 23; + ctx.NextState = 21; + return true; + + default: + ctx.L.string_buffer.Append ((char) ctx.L.input_char); + continue; + } + } + + return true; + } + + private static bool State24 (FsmContext ctx) + { + ctx.L.GetChar (); + + switch (ctx.L.input_char) { + case '\'': + ctx.L.input_char = '"'; + ctx.Return = true; + ctx.NextState = 1; + return true; + + default: + return false; + } + } + + private static bool State25 (FsmContext ctx) + { + ctx.L.GetChar (); + + switch (ctx.L.input_char) { + case '*': + ctx.NextState = 27; + return true; + + case '/': + ctx.NextState = 26; + return true; + + default: + return false; + } + } + + private static bool State26 (FsmContext ctx) + { + while (ctx.L.GetChar ()) { + if (ctx.L.input_char == '\n') { + ctx.NextState = 1; + return true; + } + } + + return true; + } + + private static bool State27 (FsmContext ctx) + { + while (ctx.L.GetChar ()) { + if (ctx.L.input_char == '*') { + ctx.NextState = 28; + return true; + } + } + + return true; + } + + private static bool State28 (FsmContext ctx) + { + while (ctx.L.GetChar ()) { + if (ctx.L.input_char == '*') + continue; + + if (ctx.L.input_char == '/') { + ctx.NextState = 1; + return true; + } + + ctx.NextState = 27; + return true; + } + + return true; + } + #endregion + + + private bool GetChar () + { + if ((input_char = NextChar ()) != -1) + return true; + + end_of_input = true; + return false; + } + + private int NextChar () + { + if (input_buffer != 0) { + int tmp = input_buffer; + input_buffer = 0; + + return tmp; + } + + return reader.Read (); + } + + public bool NextToken () + { + StateHandler handler; + fsm_context.Return = false; + + while (true) { + handler = fsm_handler_table[state - 1]; + + if (! handler (fsm_context)) + throw new JsonException (input_char); + + if (end_of_input) + return false; + + if (fsm_context.Return) { + string_value = string_buffer.ToString (); + string_buffer.Remove (0, string_buffer.Length); + token = fsm_return_table[state - 1]; + + if (token == (int) ParserToken.Char) + token = input_char; + + state = fsm_context.NextState; + + return true; + } + + state = fsm_context.NextState; + } + } + + private void UngetChar () + { + input_buffer = input_char; + } + } +} diff --git a/Assets/Plugins/ByteGame/com.bytedance.starksdk/LitJson/Lexer.cs.meta b/Assets/Plugins/ByteGame/com.bytedance.starksdk/LitJson/Lexer.cs.meta new file mode 100644 index 00000000..d6505a2b --- /dev/null +++ b/Assets/Plugins/ByteGame/com.bytedance.starksdk/LitJson/Lexer.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: 45d279d19430b4edf9a54895c5dc1e48 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/Plugins/ByteGame/com.bytedance.starksdk/LitJson/Netstandard15Polyfill.cs b/Assets/Plugins/ByteGame/com.bytedance.starksdk/LitJson/Netstandard15Polyfill.cs new file mode 100644 index 00000000..2e40f0c9 --- /dev/null +++ b/Assets/Plugins/ByteGame/com.bytedance.starksdk/LitJson/Netstandard15Polyfill.cs @@ -0,0 +1,24 @@ +#if NETSTANDARD1_5 +using System; +using System.Reflection; +namespace StarkSDKSpace.UNBridgeLib.LitJson +{ + internal static class Netstandard15Polyfill + { + internal static Type GetInterface(this Type type, string name) + { + return type.GetTypeInfo().GetInterface(name); + } + + internal static bool IsClass(this Type type) + { + return type.GetTypeInfo().IsClass; + } + + internal static bool IsEnum(this Type type) + { + return type.GetTypeInfo().IsEnum; + } + } +} +#endif \ No newline at end of file diff --git a/Assets/Plugins/ByteGame/com.bytedance.starksdk/LitJson/Netstandard15Polyfill.cs.meta b/Assets/Plugins/ByteGame/com.bytedance.starksdk/LitJson/Netstandard15Polyfill.cs.meta new file mode 100644 index 00000000..f188734e --- /dev/null +++ b/Assets/Plugins/ByteGame/com.bytedance.starksdk/LitJson/Netstandard15Polyfill.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: e102764b296af4570a0eb216671cbfbb +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/Plugins/ByteGame/com.bytedance.starksdk/LitJson/ParserToken.cs b/Assets/Plugins/ByteGame/com.bytedance.starksdk/LitJson/ParserToken.cs new file mode 100644 index 00000000..c937d201 --- /dev/null +++ b/Assets/Plugins/ByteGame/com.bytedance.starksdk/LitJson/ParserToken.cs @@ -0,0 +1,44 @@ +#region Header +/** + * ParserToken.cs + * Internal representation of the tokens used by the lexer and the parser. + * + * The authors disclaim copyright to this source code. For more details, see + * the COPYING file included with this distribution. + **/ +#endregion + + +namespace StarkSDKSpace.UNBridgeLib.LitJson +{ + internal enum ParserToken + { + // Lexer tokens (see section A.1.1. of the manual) + None = System.Char.MaxValue + 1, + Number, + True, + False, + Null, + CharSeq, + // Single char + Char, + + // Parser Rules (see section A.2.1 of the manual) + Text, + Object, + ObjectPrime, + Pair, + PairRest, + Array, + ArrayPrime, + Value, + ValueRest, + String, + + // End of input + End, + + // The empty rule + Epsilon + } +} diff --git a/Assets/Plugins/ByteGame/com.bytedance.starksdk/LitJson/ParserToken.cs.meta b/Assets/Plugins/ByteGame/com.bytedance.starksdk/LitJson/ParserToken.cs.meta new file mode 100644 index 00000000..a4eb9234 --- /dev/null +++ b/Assets/Plugins/ByteGame/com.bytedance.starksdk/LitJson/ParserToken.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: d285c0add2b094b95979f373f05fdfd0 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/Plugins/ByteGame/com.bytedance.starksdk/LitJson/StarkLitJson.asmdef b/Assets/Plugins/ByteGame/com.bytedance.starksdk/LitJson/StarkLitJson.asmdef new file mode 100644 index 00000000..9f2b4a0e --- /dev/null +++ b/Assets/Plugins/ByteGame/com.bytedance.starksdk/LitJson/StarkLitJson.asmdef @@ -0,0 +1,3 @@ +{ + "name": "StarkLitJson" +} diff --git a/Assets/Plugins/ByteGame/com.bytedance.starksdk/LitJson/StarkLitJson.asmdef.meta b/Assets/Plugins/ByteGame/com.bytedance.starksdk/LitJson/StarkLitJson.asmdef.meta new file mode 100644 index 00000000..3d69b213 --- /dev/null +++ b/Assets/Plugins/ByteGame/com.bytedance.starksdk/LitJson/StarkLitJson.asmdef.meta @@ -0,0 +1,7 @@ +fileFormatVersion: 2 +guid: 1e8ccb870274c4d3dbd4e7aa724ad45e +AssemblyDefinitionImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/Plugins/ByteGame/com.bytedance.starksdk/Resources.meta b/Assets/Plugins/ByteGame/com.bytedance.starksdk/Resources.meta index 3326f3b3..3288185a 100644 --- a/Assets/Plugins/ByteGame/com.bytedance.starksdk/Resources.meta +++ b/Assets/Plugins/ByteGame/com.bytedance.starksdk/Resources.meta @@ -1,8 +1,8 @@ -fileFormatVersion: 2 -guid: 67672cc7de9954752be4a2d1f005c220 -folderAsset: yes -DefaultImporter: - externalObjects: {} - userData: - assetBundleName: - assetBundleVariant: +fileFormatVersion: 2 +guid: 67672cc7de9954752be4a2d1f005c220 +folderAsset: yes +DefaultImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/Plugins/ByteGame/com.bytedance.starksdk/Runtime/starksdkRuntime.dll b/Assets/Plugins/ByteGame/com.bytedance.starksdk/Runtime/starksdkRuntime.dll deleted file mode 100644 index 2260d875..00000000 Binary files a/Assets/Plugins/ByteGame/com.bytedance.starksdk/Runtime/starksdkRuntime.dll and /dev/null differ diff --git a/Assets/Plugins/ByteGame/com.bytedance.starksdk/StarkMiniApk.meta b/Assets/Plugins/ByteGame/com.bytedance.starksdk/StarkMiniApk.meta deleted file mode 100644 index 789ee7ab..00000000 --- a/Assets/Plugins/ByteGame/com.bytedance.starksdk/StarkMiniApk.meta +++ /dev/null @@ -1,8 +0,0 @@ -fileFormatVersion: 2 -guid: 9e81055a458e64296b49bb6f134d5e02 -folderAsset: yes -DefaultImporter: - externalObjects: {} - userData: - assetBundleName: - assetBundleVariant: diff --git a/Assets/Plugins/ByteGame/com.bytedance.starksdk/StarkMiniApk/CHANGELOG.md b/Assets/Plugins/ByteGame/com.bytedance.starksdk/StarkMiniApk/CHANGELOG.md deleted file mode 100644 index d16e3588..00000000 --- a/Assets/Plugins/ByteGame/com.bytedance.starksdk/StarkMiniApk/CHANGELOG.md +++ /dev/null @@ -1,42 +0,0 @@ -# Ci Buildlog -[Jenkins activity ↗](http://10.94.85.240:8080/blue/organizations/jenkins/com-bytedance-starkminiapk-unity/activity) - -# Stark MiniApk 引导包 for Unity Changelog - -## [1.0.36] - 2020-10-20 -- 调整Editor菜单名称:MiniApk引导包 - -## [1.0.35] - 2020-10-20 -- 适配StarkMini 1.1.5 dll的接口 - -## [1.0.32] - 2020-10-10 -- 更新Gradle插件版本,打包服务迁移到打包机上。 - -## [1.0.31] - 2020-10-10 -- 修正小包已安装但版本不匹配时,CanUseAdAPI判断为false的问题。 - -## [1.0.30] - 2020-10-10 -- 移除apk中androidx的引入。 - -## [1.0.29] - 2020-09-30 -- Gradle script 增加参数:UC 小游戏 版本类型 `GAME_VER_TYPE` -- MiniApkTool 工具增加新参数: `UcGameVerType`,增加:Revert 按钮、是否有修改提示、支持Ctrl S快捷键。 -- UnionAd `InstallApp`接口,如果已安装小包、且最新版本匹配,自动Toast提示"已添加桌面入口"。 - -## [1.0.28] - 2020-09-30 -- 微调注释 - -## [1.0.27] - 2020-09-29 -- 增加:封装的穿山甲广告类:`class UnionAdAppManager` - -## [1.0.25] - 2020-09-29 -- 调整:Runtime 命名: `namespace StarkMiniApk`, `class MiniApkApi` -- 调整:简化 `MiniApkApi.Init` 参数. - -## [1.0.19] - 2020-09-29 -- 新增:Editor设置 MiniApkSetting 工具 - - 菜单项:***ByteGame/StarkMiniApk/Open MiniApkTool*** -- 新增:运行时读取 MiniApkSetting 接口 - - `MiniApkSetting.InitLoad()` - - `MiniApkSetting.Get()` - diff --git a/Assets/Plugins/ByteGame/com.bytedance.starksdk/StarkMiniApk/CHANGELOG.md.meta b/Assets/Plugins/ByteGame/com.bytedance.starksdk/StarkMiniApk/CHANGELOG.md.meta deleted file mode 100644 index 71975778..00000000 --- a/Assets/Plugins/ByteGame/com.bytedance.starksdk/StarkMiniApk/CHANGELOG.md.meta +++ /dev/null @@ -1,7 +0,0 @@ -fileFormatVersion: 2 -guid: ff9f4cc5655e24381b83bad5f56c4ac7 -TextScriptImporter: - externalObjects: {} - userData: - assetBundleName: - assetBundleVariant: diff --git a/Assets/Plugins/ByteGame/com.bytedance.starksdk/StarkMiniApk/README.md b/Assets/Plugins/ByteGame/com.bytedance.starksdk/StarkMiniApk/README.md deleted file mode 100644 index 8470dc0d..00000000 --- a/Assets/Plugins/ByteGame/com.bytedance.starksdk/StarkMiniApk/README.md +++ /dev/null @@ -1,21 +0,0 @@ -# Stark MiniApk 引导包 for Unity ----- -Stark MiniApk 引导包 for Unity - - -## code: -https://code.byted.org/ttgame/com.bytedance.starkminiapk-unity - -## Changelog: -- [View Changelog](CHANGELOG.md) - -## Docs: -- [README](README.md) -- todo - -## Features: -- todo - -## Build CI -[Jenkins activity ↗](http://10.94.85.240:8080/blue/organizations/jenkins/com-bytedance-starkminiapk-unity/activity) - diff --git a/Assets/Plugins/ByteGame/com.bytedance.starksdk/StarkMiniApk/README.md.meta b/Assets/Plugins/ByteGame/com.bytedance.starksdk/StarkMiniApk/README.md.meta deleted file mode 100644 index 54966750..00000000 --- a/Assets/Plugins/ByteGame/com.bytedance.starksdk/StarkMiniApk/README.md.meta +++ /dev/null @@ -1,7 +0,0 @@ -fileFormatVersion: 2 -guid: c34c0d0b3a2e243b39cbcb3d741131d7 -TextScriptImporter: - externalObjects: {} - userData: - assetBundleName: - assetBundleVariant: diff --git a/Assets/Plugins/ByteGame/com.bytedance.starksdk/StarkMiniApk/package.json b/Assets/Plugins/ByteGame/com.bytedance.starksdk/StarkMiniApk/package.json deleted file mode 100644 index 4fa87700..00000000 --- a/Assets/Plugins/ByteGame/com.bytedance.starksdk/StarkMiniApk/package.json +++ /dev/null @@ -1,13 +0,0 @@ -{ - "name": "com.bytedance.starkminiapk", - "displayName": "Stark MiniApk 引导包", - "version": "1.0.36", - "unity": "2019.4.9f1", - "description": "StarkMiniApk Plugin", - "keywords": [], - "category": "Libraries", - "links": [ - ], - "dependencies": { - } -} diff --git a/Assets/Plugins/ByteGame/com.bytedance.starksdk/StarkMiniApk/package.json.meta b/Assets/Plugins/ByteGame/com.bytedance.starksdk/StarkMiniApk/package.json.meta deleted file mode 100644 index 58970d9f..00000000 --- a/Assets/Plugins/ByteGame/com.bytedance.starksdk/StarkMiniApk/package.json.meta +++ /dev/null @@ -1,7 +0,0 @@ -fileFormatVersion: 2 -guid: ea8e57511099941e0b02ce98d091f8cc -TextScriptImporter: - externalObjects: {} - userData: - assetBundleName: - assetBundleVariant: diff --git a/Assets/Plugins/ByteGame/com.bytedance.starksdk/WebGL.meta b/Assets/Plugins/ByteGame/com.bytedance.starksdk/WebGL.meta index 75f448fd..7b75660c 100644 --- a/Assets/Plugins/ByteGame/com.bytedance.starksdk/WebGL.meta +++ b/Assets/Plugins/ByteGame/com.bytedance.starksdk/WebGL.meta @@ -1,8 +1,8 @@ -fileFormatVersion: 2 -guid: 623abae924ac542f6860900e26fcde01 -folderAsset: yes -DefaultImporter: - externalObjects: {} - userData: - assetBundleName: - assetBundleVariant: +fileFormatVersion: 2 +guid: 623abae924ac542f6860900e26fcde01 +folderAsset: yes +DefaultImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/Plugins/ByteGame/com.bytedance.starksdk/WebGL/FileSystem.meta b/Assets/Plugins/ByteGame/com.bytedance.starksdk/WebGL/FileSystem.meta new file mode 100644 index 00000000..fb1cbef2 --- /dev/null +++ b/Assets/Plugins/ByteGame/com.bytedance.starksdk/WebGL/FileSystem.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: 02217e80a764540f081b7ff8d36a1041 +folderAsset: yes +DefaultImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/Plugins/ByteGame/com.bytedance.starksdk/WebGL/FileSystem/StarkFileSystemManager.cs b/Assets/Plugins/ByteGame/com.bytedance.starksdk/WebGL/FileSystem/StarkFileSystemManager.cs new file mode 100644 index 00000000..73e1bf99 --- /dev/null +++ b/Assets/Plugins/ByteGame/com.bytedance.starksdk/WebGL/FileSystem/StarkFileSystemManager.cs @@ -0,0 +1,243 @@ +using System.Runtime.InteropServices; + +namespace StarkSDKSpace +{ + /** + * 文件存储接口 + * 具体使用说明参考文档:https://bytedance.feishu.cn/docx/JpAMdacnaoyFDdx0fhXcUwL5nAe + */ + public abstract class StarkFileSystemManager + { + /// + /// 用户数据存储的路径 + /// + public const string USER_DATA_PATH = "scfile://user"; + + /// + /// 将字符串写入文件(同步) + /// + /// 要写入的文件路径 + /// 要写入的文本 + /// 指定写入文件的字符编码 + /// 成功返回空字符串,失败返回错误信息 + public abstract string WriteFileSync(string filePath, string data, string encoding = "utf8"); + + /// + /// 将二进制写入文件(同步) + /// + /// 要写入的文件路径 + /// 要写入的二进制数据 + /// 成功返回空字符串,失败返回错误信息 + public abstract string WriteFileSync(string filePath, byte[] data); + + /// + /// 将二进制写入文件(异步) + /// + /// + public abstract void WriteFile(WriteFileParam param); + + /// + /// 将字符串写入文件(异步) + /// + /// + public abstract void WriteFile(WriteFileStringParam param); + + /// + /// 读取本地文件内容(异步) + /// + /// + public abstract void ReadFile(ReadFileParam param); + + /// + /// 从本地文件读取二进制数据数据(同步) + /// + /// + /// 字节数据,读取失败返回null + public abstract byte[] ReadFileSync(string filePath); + + /// + /// 从本地文件读取字符串数据(同步) + /// + /// 要读取的文件的路径 + /// 指定读取文件的字符编码, 不能为空 + /// 字符串数据,读取失败返回null + public abstract string ReadFileSync(string filePath, string encoding); + + /// + /// 判断文件/目录是否存在(同步) + /// + /// 要判断是否存在的文件/目录路径 + /// 成功返回 true, 失败返回 false + public abstract bool AccessSync(string path); + + /// + /// 判断文件/目录是否存在(异步) + /// + /// + public abstract void Access(AccessParam param); + + /// + /// 复制文件(同步) + /// + /// 源文件路径 + /// 目标文件路径 + /// 成功返回空字符串,失败返回错误信息 + public abstract string CopyFileSync(string srcPath, string destPath); + + /// + /// 复制文件(异步) + /// + /// + public abstract void CopyFile(CopyFileParam param); + + /// + /// 重命名文件(异步) + /// + /// + public abstract void RenameFile(RenameFileParam param); + + /// + /// 重命名文件(同步) + /// + /// 源文件路径 + /// 目标文件路径 + /// 成功返回空字符串,失败返回错误信息 + public abstract string RenameFileSync(string srcPath, string destPath); + + /// + /// 删除文件(同步) + /// + /// 源文件路径,支持本地路径 + /// 成功返回空字符串,失败返回错误信息 + public abstract string UnlinkSync(string filePath); + + /// + /// 删除文件(异步) + /// + /// + public abstract void Unlink(UnlinkParam param); + + /// + /// 创建目录(异步) + /// + /// + public abstract void Mkdir(MkdirParam param); + + /// + /// 创建目录(同步) + /// + /// 创建的目录路径 + /// 是否在递归创建该目录的上级目录后再创建该目录。如果对应的上级目录已经存在,则不创建该上级目录。如 dirPath 为 a/b/c/d 且 recursive 为 true,将创建 a 目录,再在 a 目录下创建 b 目录,以此类推直至创建 a/b/c 目录下的 d 目录。 + /// 成功返回空字符串,失败返回错误信息 + public abstract string MkdirSync(string dirPath, bool recursive = false); + + /// + /// 删除目录(异步) + /// + /// + public abstract void Rmdir(RmdirParam param); + + /// + /// 删除目录(同步) + /// + /// 创建的目录路径 + /// 是否递归删除目录。如果为 true,则删除该目录和该目录下的所有子目录以及文件 。 + /// 成功返回空字符串,失败返回错误信息 + public abstract string RmdirSync(string dirPath, bool recursive = false); + + /// + /// 读取文件描述信息(同步) + /// + /// 文件/目录路径 + /// 是否递归获取目录下的每个文件的 Stat 信息 + /// 是否抛出错误信息,如果抛出错误信息,当文件不存在时则会抛出异常,错误信息从异常中获取。 + /// 返回文件信息,如果访问失败则返回null + public abstract StarkStatInfo StatSync(string path, bool throwException = false); + + /// + /// 读取文件描述信息(异步) + /// + /// + public abstract void Stat(StatParam param); + + /// + /// 获取保存的用户目录文件列表(仅WebGL平台可用) + /// + public abstract void GetSavedFileList(GetSavedFileListParam param); + + /// + /// 根据url链接获取本地缓存文件路径(仅WebGL平台可用) + /// + /// 输入文件下载链接url + /// 返回本地缓存文件路径,以scfile://user开头的路径,可以直接用这个路径访问该文件 + public abstract string GetLocalCachedPathForUrl(string url); + + /// + /// 判断该url是否有本地缓存文件(仅WebGL平台可用) + /// + /// 输入文件下载链接url + /// 如果存在缓存文件则返回true,不存在缓存文件则返回false + public abstract bool IsUrlCached(string url); + + private static int _isDataMigrated = -1; + +#if UNITY_WEBGL && !UNITY_EDITOR + [DllImport("__Internal")] + private static extern bool StarkCanUseLocalStorage(); +#else + private static bool StarkCanUseLocalStorage() + { + return false; + } +#endif + +#if UNITY_WEBGL && !UNITY_EDITOR + [DllImport("__Internal")] + private static extern bool StarkIsDataMigrated(); +#else + private static bool StarkIsDataMigrated() + { + return false; + } +#endif + +#if UNITY_WEBGL && !UNITY_EDITOR + [DllImport("__Internal")] + private static extern void StarkMigratingData(); +#else + private static void StarkMigratingData() + { + } +#endif + + public static bool CanUseLocalStorage() + { + return StarkCanUseLocalStorage(); + } + + public static bool IsDataMigrated() + { + if (_isDataMigrated == 1) + { + return true; + } + else if (_isDataMigrated == 0) + { + return false; + } + + var migrated = StarkIsDataMigrated(); + _isDataMigrated = migrated ? 1 : 0; + return migrated; + } + + public static void MigratingData() + { + if (!IsDataMigrated()) + { + StarkMigratingData(); + _isDataMigrated = 1; + } + } + } +} \ No newline at end of file diff --git a/Assets/Plugins/ByteGame/com.bytedance.starksdk/WebGL/FileSystem/StarkFileSystemManager.cs.meta b/Assets/Plugins/ByteGame/com.bytedance.starksdk/WebGL/FileSystem/StarkFileSystemManager.cs.meta new file mode 100644 index 00000000..eefe983b --- /dev/null +++ b/Assets/Plugins/ByteGame/com.bytedance.starksdk/WebGL/FileSystem/StarkFileSystemManager.cs.meta @@ -0,0 +1,3 @@ +fileFormatVersion: 2 +guid: 4a5b2a390f1b4921a367f65280ae9c29 +timeCreated: 1678263025 \ No newline at end of file diff --git a/Assets/Plugins/ByteGame/com.bytedance.starksdk/WebGL/FileSystem/StarkFileSystemManagerDefault.cs b/Assets/Plugins/ByteGame/com.bytedance.starksdk/WebGL/FileSystem/StarkFileSystemManagerDefault.cs new file mode 100644 index 00000000..1cac2417 --- /dev/null +++ b/Assets/Plugins/ByteGame/com.bytedance.starksdk/WebGL/FileSystem/StarkFileSystemManagerDefault.cs @@ -0,0 +1,527 @@ +namespace StarkSDKSpace +{ + public class StarkFileSystemManagerDefault : StarkFileSystemManager + { + public static readonly StarkFileSystemManagerDefault Instance = new StarkFileSystemManagerDefault(); + + /// + /// 将字符串写入文件(同步) + /// + /// 要写入的文件路径 + /// 要写入的文本 + /// 指定写入文件的字符编码 + /// 成功返回空字符串,失败返回错误信息 + public override string WriteFileSync(string filePath, string data, string encoding = "utf8") + { + if (!System.IO.Directory.Exists(System.IO.Path.GetDirectoryName(filePath))) + { + return $"{System.IO.Path.GetDirectoryName(filePath)} not exist"; + } + + try + { + System.IO.File.WriteAllText(filePath, data); + } + catch (System.Exception exception) + { + return exception.Message; + } + + return ""; + } + + /// + /// 将二进制写入文件(同步) + /// + /// 要写入的文件路径 + /// 要写入的二进制数据 + /// 成功返回空字符串,失败返回错误信息 + public override string WriteFileSync(string filePath, byte[] data) + { + if (!System.IO.Directory.Exists(System.IO.Path.GetDirectoryName(filePath))) + { + return $"{System.IO.Path.GetDirectoryName(filePath)} not exist"; + } + + try + { + System.IO.File.WriteAllBytes(filePath, data); + } + catch (System.Exception exception) + { + return exception.Message; + } + + return ""; + } + + /// + /// 将二进制写入文件(异步) + /// + /// + public override void WriteFile(WriteFileParam param) + { + var errMsg = WriteFileSync(param.filePath, param.data); + CallbackBaseResponse(errMsg, param.success, param.fail); + } + + /// + /// 将字符串写入文件(异步) + /// + /// + public override void WriteFile(WriteFileStringParam param) + { + var errMsg = WriteFileSync(param.filePath, param.data); + CallbackBaseResponse(errMsg, param.success, param.fail); + } + + /// + /// 读取本地文件内容(异步) + /// + /// + public override void ReadFile(ReadFileParam param) + { + if (!System.IO.File.Exists(param.filePath)) + { + CallbackReadFileResponse("file not exist", param.success, param.fail); + return; + } + + if (string.IsNullOrEmpty(param.encoding) || param.encoding.Equals("binary")) + { + var data = System.IO.File.ReadAllBytes(param.filePath); + CallbackReadFileResponse("", param.success, param.fail, data); + } + else + { + var data = System.IO.File.ReadAllText(param.filePath); + CallbackReadFileResponse("", param.success, param.fail, null, data); + } + } + + /// + /// 从本地文件读取二进制数据数据(同步) + /// + /// + /// 字节数据,读取失败返回null + public override byte[] ReadFileSync(string filePath) + { + try + { + return System.IO.File.ReadAllBytes(filePath); + } + catch (System.Exception exception) + { + UnityEngine.Debug.LogError($"ReadFileSync: {exception.Message}"); + return null; + } + } + + /// + /// 从本地文件读取字符串数据(同步) + /// + /// 要读取的文件的路径 + /// 指定读取文件的字符编码, 不能为空 + /// 字符串数据,读取失败返回null + public override string ReadFileSync(string filePath, string encoding) + { + try + { + return System.IO.File.ReadAllText(filePath); + } + catch (System.Exception exception) + { + UnityEngine.Debug.LogError($"ReadFileSync: {exception.Message}"); + return null; + } + } + + /// + /// 判断文件/目录是否存在(同步) + /// + /// 要判断是否存在的文件/目录路径 + /// 成功返回 true, 失败返回 false + public override bool AccessSync(string path) + { + return System.IO.File.Exists(path) || System.IO.Directory.Exists(path); + } + + /// + /// 判断文件/目录是否存在(异步) + /// + /// + public override void Access(AccessParam param) + { + var exist = AccessSync(param.path); + CallbackBaseResponse(exist ? "" : "no such file or directory", param.success, param.fail); + } + + /// + /// 复制文件(同步) + /// + /// 源文件路径 + /// 目标文件路径 + /// 成功返回空字符串,失败返回错误信息 + public override string CopyFileSync(string srcPath, string destPath) + { + if (System.IO.File.Exists(srcPath)) + { + try + { + System.IO.File.Copy(srcPath, destPath, true); + } + catch (System.Exception exception) + { + return exception.Message; + } + + return ""; + } + else + { + return "source file not exist"; + } + } + + /// + /// 复制文件(异步) + /// + /// + public override void CopyFile(CopyFileParam param) + { + var errMsg = CopyFileSync(param.srcPath, param.destPath); + CallbackBaseResponse(errMsg, param.success, param.fail); + } + + /// + /// 重命名文件(异步) + /// + /// + public override void RenameFile(RenameFileParam param) + { + var errMsg = RenameFileSync(param.srcPath, param.destPath); + CallbackBaseResponse(errMsg, param.success, param.fail); + } + + /// + /// 重命名文件(同步) + /// + /// 源文件路径 + /// 目标文件路径 + /// 成功返回空字符串,失败返回错误信息 + public override string RenameFileSync(string srcPath, string destPath) + { + if (System.IO.File.Exists(srcPath)) + { + try + { + if (System.IO.File.Exists(destPath)) + { + System.IO.File.Delete(destPath); + } + + System.IO.File.Move(srcPath, destPath); + } + catch (System.Exception exception) + { + return exception.Message; + } + + return ""; + } + + return "source file not exist"; + } + + /// + /// 删除文件(同步) + /// + /// 源文件路径,支持本地路径 + /// 成功返回空字符串,失败返回错误信息 + public override string UnlinkSync(string filePath) + { + if (System.IO.File.Exists(filePath)) + { + try + { + System.IO.File.Delete(filePath); + } + catch (System.Exception exception) + { + return exception.Message; + } + + return ""; + } + + return "file not exist"; + } + + /// + /// 删除文件(异步) + /// + /// + public override void Unlink(UnlinkParam param) + { + var errMsg = UnlinkSync(param.filePath); + CallbackBaseResponse(errMsg, param.success, param.fail); + } + + /// + /// 创建目录(异步) + /// + /// + public override void Mkdir(MkdirParam param) + { + var errMsg = MkdirSync(param.dirPath, param.recursive); + CallbackBaseResponse(errMsg, param.success, param.fail); + } + + /// + /// 创建目录(同步) + /// + /// 创建的目录路径 + /// 是否在递归创建该目录的上级目录后再创建该目录。如果对应的上级目录已经存在,则不创建该上级目录。如 dirPath 为 a/b/c/d 且 recursive 为 true,将创建 a 目录,再在 a 目录下创建 b 目录,以此类推直至创建 a/b/c 目录下的 d 目录。 + /// 成功返回空字符串,失败返回错误信息 + public override string MkdirSync(string dirPath, bool recursive = false) + { + if (!System.IO.Directory.Exists(dirPath)) + { + try + { + System.IO.Directory.CreateDirectory(dirPath); + } + catch (System.Exception exception) + { + return exception.Message; + } + } + + return ""; + } + + /// + /// 删除目录(异步) + /// + /// + public override void Rmdir(RmdirParam param) + { + var errMsg = RmdirSync(param.dirPath, param.recursive); + CallbackBaseResponse(errMsg, param.success, param.fail); + } + + /// + /// 删除目录(同步) + /// + /// 创建的目录路径 + /// 是否递归删除目录。如果为 true,则删除该目录和该目录下的所有子目录以及文件 。 + /// 成功返回空字符串,失败返回错误信息 + public override string RmdirSync(string dirPath, bool recursive = false) + { + if (System.IO.Directory.Exists(dirPath)) + { + try + { + System.IO.Directory.Delete(dirPath, recursive); + } + catch (System.Exception exception) + { + return exception.Message; + } + + return ""; + } + else + { + return "directory not exist"; + } + } + + /// + /// 读取文件描述信息(同步) + /// + /// 文件/目录路径 + /// 是否递归获取目录下的每个文件的 Stat 信息 + /// 是否抛出错误信息,如果抛出错误信息,当文件不存在时则会抛出异常,错误信息从异常中获取。 + /// 返回文件信息,如果访问失败则返回null + public override StarkStatInfo StatSync(string path, bool throwException = false) + { + if (System.IO.File.Exists(path)) + { + var fileInfo = new System.IO.FileInfo(path); + return new StarkStatInfo() + { + size = fileInfo.Length, + mode = 33060, + lastAccessedTime = GetUnixTime(fileInfo.LastAccessTime.Ticks), + lastModifiedTime = GetUnixTime(fileInfo.LastWriteTime.Ticks) + }; + } + else if (System.IO.Directory.Exists(path)) + { + var dirInfo = new System.IO.DirectoryInfo(path); + return new StarkStatInfo() + { + size = 0, + mode = 16676, + lastAccessedTime = GetUnixTime(dirInfo.LastAccessTime.Ticks), + lastModifiedTime = GetUnixTime(dirInfo.LastWriteTime.Ticks) + }; + } + else + { + return null; + } + } + + /// + /// 读取文件描述信息(异步) + /// + /// + public override void Stat(StatParam param) + { + var info = StatSync(param.path); + if (info != null) + { + param.success?.Invoke(new StarkStatResponse() + { + stat = info + }); + } + else + { + param.fail?.Invoke(new StarkStatResponse() + { + errCode = -1, + errMsg = "No such file or directory" + }); + } + } + + private void GetFilesRecursively(string path, System.Collections.Generic.List fileInfos) + { + System.IO.DirectoryInfo dir = new System.IO.DirectoryInfo(path); + if (dir.Exists) + { + System.IO.FileInfo[] files = dir.GetFiles(); + if (files != null && files.Length > 0) + { + System.DateTime unixEpoch = new System.DateTime(1970, 1, 1, 0, 0, 0, System.DateTimeKind.Utc); + foreach (System.IO.FileInfo file in files) + { + long unixTimeStampInTicks = (file.CreationTime.ToUniversalTime() - unixEpoch).Ticks; + long unixTimeStampInSeconds = unixTimeStampInTicks / System.TimeSpan.TicksPerSecond; + fileInfos.Add(new StarkFileInfo() + { + mode = 33060, + size = file.Length, + createTime = unixTimeStampInSeconds, + filePath = file.FullName + }); + } + } + + System.IO.DirectoryInfo[] subDirs = dir.GetDirectories(); + if (subDirs != null && subDirs.Length > 0) + { + System.DateTime unixEpoch = new System.DateTime(1970, 1, 1, 0, 0, 0, System.DateTimeKind.Utc); + foreach (var subDir in subDirs) + { + long unixTimeStampInTicks = (subDir.CreationTime.ToUniversalTime() - unixEpoch).Ticks; + long unixTimeStampInSeconds = unixTimeStampInTicks / System.TimeSpan.TicksPerSecond; + fileInfos.Add(new StarkFileInfo() + { + mode = 16676, + size = 0, + createTime = unixTimeStampInSeconds, + filePath = subDir.FullName + }); + GetFilesRecursively(subDir.FullName, fileInfos); + } + } + } + } + + /// + /// 获取保存的用户目录文件列表 + /// + public override void GetSavedFileList(GetSavedFileListParam param) + { + System.Collections.Generic.List fileInfos = + new System.Collections.Generic.List(); + GetFilesRecursively(UnityEngine.Application.persistentDataPath, fileInfos); + param.success?.Invoke(new StarkGetSavedFileListResponse() + { + fileList = fileInfos.ToArray() + }); + } + + /// + /// 根据url链接获取本地缓存文件路径 + /// + /// 输入文件下载链接url + /// 返回本地缓存文件路径,以scfile://user开头的路径,可以直接用这个路径访问该文件 + public override string GetLocalCachedPathForUrl(string url) + { + return ""; + } + + /// + /// 判断该url是否有本地缓存文件 + /// + /// 输入文件下载链接url + /// 如果存在缓存文件则返回true,不存在缓存文件则返回false + public override bool IsUrlCached(string url) + { + return false; + } + + private static void CallbackReadFileResponse(string errMsg, + System.Action success, + System.Action fail, + byte[] binData = null, + string stringData = null) + { + if (string.IsNullOrEmpty(errMsg)) + { + success?.Invoke(new StarkReadFileResponse() + { + binData = binData, + stringData = stringData + }); + } + else + { + fail?.Invoke(new StarkReadFileResponse() + { + errCode = -1, + errMsg = errMsg + }); + } + } + + private static void CallbackBaseResponse(string errMsg, System.Action success, + System.Action fail) + { + if (string.IsNullOrEmpty(errMsg)) + { + success?.Invoke(new StarkBaseResponse()); + } + else + { + fail?.Invoke(new StarkBaseResponse() + { + errCode = -1, + errMsg = errMsg + }); + } + } + + private static long GetUnixTime(long ticks) + { + var epochTicks = new System.DateTime(1970, 1, 1).Ticks; + var unixTime = ((ticks - epochTicks) / System.TimeSpan.TicksPerSecond); + return unixTime; + } + } +} \ No newline at end of file diff --git a/Assets/Plugins/ByteGame/com.bytedance.starksdk/WebGL/FileSystem/StarkFileSystemManagerDefault.cs.meta b/Assets/Plugins/ByteGame/com.bytedance.starksdk/WebGL/FileSystem/StarkFileSystemManagerDefault.cs.meta new file mode 100644 index 00000000..2c60d122 --- /dev/null +++ b/Assets/Plugins/ByteGame/com.bytedance.starksdk/WebGL/FileSystem/StarkFileSystemManagerDefault.cs.meta @@ -0,0 +1,3 @@ +fileFormatVersion: 2 +guid: d1274781cdbc4d4bbb901ab078f1c41e +timeCreated: 1678263488 \ No newline at end of file diff --git a/Assets/Plugins/ByteGame/com.bytedance.starksdk/WebGL/FileSystem/StarkFileSystemManagerWebGL.cs b/Assets/Plugins/ByteGame/com.bytedance.starksdk/WebGL/FileSystem/StarkFileSystemManagerWebGL.cs new file mode 100644 index 00000000..15697520 --- /dev/null +++ b/Assets/Plugins/ByteGame/com.bytedance.starksdk/WebGL/FileSystem/StarkFileSystemManagerWebGL.cs @@ -0,0 +1,752 @@ +using System; +using System.Collections.Generic; +using System.Runtime.InteropServices; +using StarkSDKSpace.UNBridgeLib.LitJson; +using UnityEngine; +using Object = UnityEngine.Object; + +namespace StarkSDKSpace +{ + public class StarkFileSystemManagerWebGL : StarkFileSystemManager + { +#if UNITY_WEBGL && !UNITY_EDITOR + [DllImport("__Internal")] + private static extern string StarkWriteStringFileSync(string filePath, string data, string encoding); +#else + private static string StarkWriteStringFileSync(string filePath, string data, string encoding) + { + return StarkFileSystemManagerDefault.Instance.WriteFileSync(filePath, data, encoding); + } +#endif + +#if UNITY_WEBGL && !UNITY_EDITOR + [DllImport("__Internal")] + private static extern string StarkWriteBinFileSync(string filePath, byte[] data, int dataLength); +#else + private static string StarkWriteBinFileSync(string filePath, byte[] data, int dataLength) + { + return StarkFileSystemManagerDefault.Instance.WriteFileSync(filePath, data); + } +#endif + +#if UNITY_WEBGL && !UNITY_EDITOR + [DllImport("__Internal")] + private static extern void StarkWriteBinFile(string filePath, byte[] data, int dataLength, string s, string f); +#else + private static void StarkWriteBinFile(string filePath, byte[] data, int dataLength, string s, string f) + { + StarkFileSystemManagerDefault.Instance.WriteFileSync(filePath, data); + } +#endif + +#if UNITY_WEBGL && !UNITY_EDITOR + [DllImport("__Internal")] + private static extern void StarkWriteStringFile(string filePath, string data, string encoding, string s, + string f); +#else + private static void StarkWriteStringFile(string filePath, string data, string encoding, string s, + string f) + { + StarkFileSystemManagerDefault.Instance.WriteFileSync(filePath, data, encoding); + } +#endif + +#if UNITY_WEBGL && !UNITY_EDITOR + [DllImport("__Internal")] + private static extern void StarkReadFile(string filePath, string encoding, string callbackId); +#else + private static void StarkReadFile(string filePath, string encoding, string callbackId) + { + } +#endif + +#if UNITY_WEBGL && !UNITY_EDITOR + [DllImport("__Internal")] + private static extern string StarkReadStringFileSync(string filePath, string encoding); +#else + private static string StarkReadStringFileSync(string filePath, string encoding) + { + return StarkFileSystemManagerDefault.Instance.ReadFileSync(filePath, encoding); + } +#endif + +#if UNITY_WEBGL && !UNITY_EDITOR + [DllImport("__Internal")] + private static extern int StarkReadBinFileSync(string filePath); +#else + private static int StarkReadBinFileSync(string filePath) + { + return 0; + } +#endif + +#if UNITY_WEBGL && !UNITY_EDITOR + [DllImport("__Internal")] + private static extern void StarkShareFileBuffer(byte[] data, string callbackId); +#else + private static void StarkShareFileBuffer(byte[] data, string callbackId) + { + } +#endif + +#if UNITY_WEBGL && !UNITY_EDITOR + [DllImport("__Internal")] + private static extern bool StarkAccessFileSync(string filePath); +#else + private static bool StarkAccessFileSync(string filePath) + { + return StarkFileSystemManagerDefault.Instance.AccessSync(filePath); + } +#endif + +#if UNITY_WEBGL && !UNITY_EDITOR + [DllImport("__Internal")] + private static extern void StarkAccessFile(string filePath, string s, string f); +#else + private static void StarkAccessFile(string filePath, string s, string f) + { + } +#endif + +#if UNITY_WEBGL && !UNITY_EDITOR + [DllImport("__Internal")] + private static extern string StarkCopyFileSync(string srcPath, string destPath); +#else + private static string StarkCopyFileSync(string srcPath, string destPath) + { + return StarkFileSystemManagerDefault.Instance.CopyFileSync(srcPath, destPath); + } +#endif + +#if UNITY_WEBGL && !UNITY_EDITOR + [DllImport("__Internal")] + private static extern string StarkRenameFileSync(string srcPath, string destPath); +#else + private static string StarkRenameFileSync(string srcPath, string destPath) + { + return StarkFileSystemManagerDefault.Instance.RenameFileSync(srcPath, destPath); + } +#endif + +#if UNITY_WEBGL && !UNITY_EDITOR + [DllImport("__Internal")] + private static extern void StarkCopyFile(string srcPath, string destPath, string s, string f); +#else + private static void StarkCopyFile(string srcPath, string destPath, string s, string f) + { + StarkFileSystemManagerDefault.Instance.CopyFileSync(srcPath, destPath); + } +#endif + +#if UNITY_WEBGL && !UNITY_EDITOR + [DllImport("__Internal")] + private static extern void StarkRenameFile(string srcPath, string destPath, string s, string f); +#else + private static void StarkRenameFile(string srcPath, string destPath, string s, string f) + { + StarkFileSystemManagerDefault.Instance.RenameFileSync(srcPath, destPath); + } +#endif + +#if UNITY_WEBGL && !UNITY_EDITOR + [DllImport("__Internal")] + private static extern string StarkUnlinkSync(string filePath); +#else + private static string StarkUnlinkSync(string filePath) + { + return StarkFileSystemManagerDefault.Instance.UnlinkSync(filePath); + } +#endif + +#if UNITY_WEBGL && !UNITY_EDITOR + [DllImport("__Internal")] + private static extern void StarkUnlink(string filePath, string s, string f); +#else + private static void StarkUnlink(string filePath, string s, string f) + { + StarkFileSystemManagerDefault.Instance.UnlinkSync(filePath); + } +#endif + +#if UNITY_WEBGL && !UNITY_EDITOR + [DllImport("__Internal")] + private static extern void StarkMkdir(string dirPath, bool recursive, string s, string f); +#else + private static void StarkMkdir(string dirPath, bool recursive, string s, string f) + { + StarkFileSystemManagerDefault.Instance.MkdirSync(dirPath); + } +#endif + +#if UNITY_WEBGL && !UNITY_EDITOR + [DllImport("__Internal")] + private static extern string StarkMkdirSync(string dirPath, bool recursive); +#else + private static string StarkMkdirSync(string dirPath, bool recursive) + { + return StarkFileSystemManagerDefault.Instance.MkdirSync(dirPath); + } +#endif + +#if UNITY_WEBGL && !UNITY_EDITOR + [DllImport("__Internal")] + private static extern void StarkRmdir(string dirPath, bool recursive, string s, string f); +#else + private static void StarkRmdir(string dirPath, bool recursive, string s, string f) + { + StarkFileSystemManagerDefault.Instance.RmdirSync(dirPath); + } +#endif + +#if UNITY_WEBGL && !UNITY_EDITOR + [DllImport("__Internal")] + private static extern string StarkRmdirSync(string dirPath, bool recursive); +#else + private static string StarkRmdirSync(string dirPath, bool recursive) + { + return StarkFileSystemManagerDefault.Instance.RmdirSync(dirPath); + } +#endif + +#if UNITY_WEBGL && !UNITY_EDITOR + [DllImport("__Internal")] + private static extern string StarkStatSync(string path); +#else + private static string StarkStatSync(string path) + { + return ""; + } +#endif + +#if UNITY_WEBGL && !UNITY_EDITOR + [DllImport("__Internal")] + private static extern void StarkStat(string path, string callbackId); +#else + private static void StarkStat(string path, string callbackId) + { + } +#endif + +#if UNITY_WEBGL && !UNITY_EDITOR + [DllImport("__Internal")] + private static extern void StarkGetSavedFileList(string callbackId); +#else + private static void StarkGetSavedFileList(string callbackId) + { + } +#endif + +#if UNITY_WEBGL && !UNITY_EDITOR + [DllImport("__Internal")] + private static extern string StarkGetCachedPathForUrl(string url); +#else + private static string StarkGetCachedPathForUrl(string url) + { + return ""; + } +#endif + + public static readonly StarkFileSystemManagerWebGL Instance = new StarkFileSystemManagerWebGL(); + + private static Dictionary s_readFileParams = new Dictionary(); + private static Dictionary s_statParams = new Dictionary(); + + private static Dictionary s_getSavedFileListParams = + new Dictionary(); + + private static bool _initialized; + + public StarkFileSystemManagerWebGL() + { + MigratingData(); + CreateStarkFileSystemHandler(); + } + + private void CreateStarkFileSystemHandler() + { + if (!_initialized) + { + _initialized = true; + GameObject obj = new GameObject(); + Object.DontDestroyOnLoad(obj); + obj.name = "StarkFileSystemManager"; + obj.AddComponent(); + } + } + + public class StarkFileSystemHandler : MonoBehaviour + { + public void HandleNativeCallback(string msg) + { + Debug.Log($"HandleNativeCallback - {msg}"); + StarkCallbackHandler.InvokeResponseCallback(msg); + } + + public void HandleReadFileCallback(string msg) + { + Debug.Log($"HandleReadFileCallback - {msg}"); + var res = JsonUtility.FromJson(msg); + var conf = s_readFileParams[res.callbackId]; + if (conf == null) + { + Debug.LogWarning($"HandleReadFileCallback - no callback for callbackId: {res.callbackId}"); + return; + } + + s_readFileParams.Remove(res.callbackId); + + if (res.errCode == 0) + { + if (string.IsNullOrEmpty(conf.encoding) || conf.encoding.Equals("binary")) + { + var sharedBuffer = new byte[res.byteLength]; + StarkShareFileBuffer(sharedBuffer, res.callbackId); + var obj = new StarkReadFileResponse() + { + binData = sharedBuffer, + }; + conf.success?.Invoke(obj); + } + else + { + var obj = new StarkReadFileResponse() + { + stringData = res.data + }; + conf.success?.Invoke(obj); + } + } + else + { + var obj = new StarkReadFileResponse() + { + errCode = res.errCode, + errMsg = res.errMsg + }; + conf.fail?.Invoke(obj); + } + } + + public void HandleStatCallback(string msg) + { + Debug.Log($"HandleStatCallback - {msg}"); + StarkStatResponse res; + try + { + res = JsonMapper.ToObject(msg); + } + catch (Exception exception) + { + Debug.LogError($"failed to parse json data: {msg}, {exception}"); + return; + } + if (res == null) + { + Debug.LogError("empty response"); + return; + } + var conf = s_statParams[res.callbackId]; + if (conf == null) + { + Debug.LogWarning($"HandleStatCallback - no callback for callbackId: {res.callbackId}"); + return; + } + + s_statParams.Remove(res.callbackId); + + if (res.errCode == 0) + { + if (res.stat == null) + { + Debug.LogWarning("empty stat info"); + res.stat = new StarkStatInfo(); + } + conf.success?.Invoke(res); + } + else + { + res.stat = new StarkStatInfo(); + conf.fail?.Invoke(res); + } + } + + public void HandleGetSavedFileListCallback(string msg) + { + Debug.Log($"HandleGetSavedFileListCallback - {msg}"); + StarkGetSavedFileListResponse res; + try + { + res = JsonMapper.ToObject(msg); + } + catch (Exception exception) + { + Debug.LogError($"failed to parse json data: {msg}, {exception}"); + return; + } + + if (res == null) + { + Debug.LogError("empty response"); + return; + } + var conf = s_getSavedFileListParams[res.callbackId]; + if (conf == null) + { + Debug.LogWarning($"HandleStatCallback - no callback for callbackId: {res.callbackId}"); + return; + } + + s_statParams.Remove(res.callbackId); + + if (res.errCode == 0) + { + if (res.fileList == null) + { + res.fileList = new StarkFileInfo[0]; + } + + conf.success?.Invoke(res); + } + else + { + res.fileList = new StarkFileInfo[0]; + conf.fail?.Invoke(res); + } + } + } + + private string FixFilePath(string filePath) + { + if (filePath.StartsWith(USER_DATA_PATH)) + { + return filePath; + } + + if (filePath.StartsWith(Application.persistentDataPath)) + { + filePath = filePath.Replace(Application.persistentDataPath, USER_DATA_PATH); + } + else + { + if (filePath.StartsWith("/")) + { + filePath = filePath.Substring(1); + } + + filePath = $"{USER_DATA_PATH}/{filePath}"; + } + + return filePath; + } + + /// + /// 将字符串写入文件(同步) + /// + /// 要写入的文件路径 + /// 要写入的文本 + /// 指定写入文件的字符编码 + /// 成功返回空字符串,失败返回错误信息 + public override string WriteFileSync(string filePath, string data, string encoding = "utf8") + { + if (string.IsNullOrEmpty(encoding)) + { + encoding = "utf8"; + } + + return StarkWriteStringFileSync(FixFilePath(filePath), data, encoding); + } + + /// + /// 将二进制写入文件(同步) + /// + /// 要写入的文件路径 + /// 要写入的二进制数据 + /// 成功返回空字符串,失败返回错误信息 + public override string WriteFileSync(string filePath, byte[] data) + { + return StarkWriteBinFileSync(FixFilePath(filePath), data, data.Length); + } + + /// + /// 将二进制写入文件(异步) + /// + /// + public override void WriteFile(WriteFileParam param) + { + StarkWriteBinFile( + FixFilePath(param.filePath), + param.data, + param.data.Length, + StarkCallbackHandler.Add(param.success), + StarkCallbackHandler.Add(param.fail) + ); + } + + /// + /// 将字符串写入文件(异步) + /// + /// + public override void WriteFile(WriteFileStringParam param) + { + if (string.IsNullOrEmpty(param.encoding)) + { + param.encoding = "utf8"; + } + + StarkWriteStringFile( + FixFilePath(param.filePath), + param.data, + param.encoding, + StarkCallbackHandler.Add(param.success), + StarkCallbackHandler.Add(param.fail) + ); + } + + /// + /// 读取本地文件内容(异步) + /// + /// + public override void ReadFile(ReadFileParam param) + { + var key = StarkCallbackHandler.MakeKey(); + s_readFileParams.Add(key, param); + StarkReadFile(FixFilePath(param.filePath), param.encoding, key); + } + + /// + /// 从本地文件读取二进制数据数据(同步) + /// + /// + /// 字节数据,读取失败返回null + public override byte[] ReadFileSync(string filePath) + { + if (Application.platform == RuntimePlatform.WebGLPlayer) + { + filePath = FixFilePath(filePath); + var length = StarkReadBinFileSync(filePath); + if (length == 0) + { + return null; + } + + var sharedBuffer = new byte[length]; + StarkShareFileBuffer(sharedBuffer, filePath); + return sharedBuffer; + } + else + { + return System.IO.File.ReadAllBytes(filePath); + } + } + + /// + /// 从本地文件读取字符串数据(同步) + /// + /// 要读取的文件的路径 + /// 指定读取文件的字符编码, 不能为空 + /// 字符串数据,读取失败返回null + public override string ReadFileSync(string filePath, string encoding) + { + return StarkReadStringFileSync(FixFilePath(filePath), encoding); + } + + /// + /// 判断文件/目录是否存在(同步) + /// + /// 要判断是否存在的文件/目录路径 + /// 成功返回 true, 失败返回 false + public override bool AccessSync(string path) + { + return StarkAccessFileSync(FixFilePath(path)); + } + + /// + /// 判断文件/目录是否存在(异步) + /// + /// + public override void Access(AccessParam param) + { + StarkAccessFile(FixFilePath(param.path), StarkCallbackHandler.Add(param.success), + StarkCallbackHandler.Add(param.fail)); + } + + /// + /// 复制文件(同步) + /// + /// 源文件路径 + /// 目标文件路径 + /// 成功返回空字符串,失败返回错误信息 + public override string CopyFileSync(string srcPath, string destPath) + { + return StarkCopyFileSync(FixFilePath(srcPath), FixFilePath(destPath)); + } + + /// + /// 复制文件(异步) + /// + /// + public override void CopyFile(CopyFileParam param) + { + StarkCopyFile(FixFilePath(param.srcPath), FixFilePath(param.destPath), + StarkCallbackHandler.Add(param.success), + StarkCallbackHandler.Add(param.fail)); + } + + /// + /// 重命名文件(异步) + /// + /// + public override void RenameFile(RenameFileParam param) + { + StarkRenameFile(FixFilePath(param.srcPath), FixFilePath(param.destPath), + StarkCallbackHandler.Add(param.success), + StarkCallbackHandler.Add(param.fail)); + } + + /// + /// 重命名文件(同步) + /// + /// 源文件路径 + /// 目标文件路径 + /// 成功返回空字符串,失败返回错误信息 + public override string RenameFileSync(string srcPath, string destPath) + { + return StarkRenameFileSync(FixFilePath(srcPath), FixFilePath(destPath)); + } + + /// + /// 删除文件(同步) + /// + /// 源文件路径,支持本地路径 + /// 成功返回空字符串,失败返回错误信息 + public override string UnlinkSync(string filePath) + { + return StarkUnlinkSync(FixFilePath(filePath)); + } + + /// + /// 删除文件(异步) + /// + /// + public override void Unlink(UnlinkParam param) + { + StarkUnlink(FixFilePath(param.filePath), StarkCallbackHandler.Add(param.success), + StarkCallbackHandler.Add(param.fail)); + } + + /// + /// 创建目录(异步) + /// + /// + public override void Mkdir(MkdirParam param) + { + StarkMkdir(FixFilePath(param.dirPath), param.recursive, StarkCallbackHandler.Add(param.success), + StarkCallbackHandler.Add(param.fail)); + } + + /// + /// 创建目录(同步) + /// + /// 创建的目录路径 + /// 是否在递归创建该目录的上级目录后再创建该目录。如果对应的上级目录已经存在,则不创建该上级目录。如 dirPath 为 a/b/c/d 且 recursive 为 true,将创建 a 目录,再在 a 目录下创建 b 目录,以此类推直至创建 a/b/c 目录下的 d 目录。 + /// 成功返回空字符串,失败返回错误信息 + public override string MkdirSync(string dirPath, bool recursive = false) + { + return StarkMkdirSync(FixFilePath(dirPath), recursive); + } + + /// + /// 删除目录(异步) + /// + /// + public override void Rmdir(RmdirParam param) + { + StarkRmdir(FixFilePath(param.dirPath), param.recursive, StarkCallbackHandler.Add(param.success), + StarkCallbackHandler.Add(param.fail)); + } + + /// + /// 删除目录(同步) + /// + /// 创建的目录路径 + /// 是否递归删除目录。如果为 true,则删除该目录和该目录下的所有子目录以及文件 。 + /// 成功返回空字符串,失败返回错误信息 + public override string RmdirSync(string dirPath, bool recursive = false) + { + return StarkRmdirSync(FixFilePath(dirPath), recursive); + } + + /// + /// 读取文件描述信息(同步) + /// + /// 文件/目录路径 + /// 是否递归获取目录下的每个文件的 Stat 信息 + /// 是否抛出错误信息,如果抛出错误信息,当文件不存在时则会抛出异常,错误信息从异常中获取。 + /// 返回文件信息,如果访问失败则返回null + public override StarkStatInfo StatSync(string path, bool throwException = false) + { + var info = StarkStatSync(FixFilePath(path)); + try + { + return JsonUtility.FromJson(info); + } + catch (Exception exception) + { + if (throwException) + { + if (string.IsNullOrEmpty(info)) + { + info = "stat failed"; + } + + throw new Exception(info); + } + + return null; + } + } + + /// + /// 读取文件描述信息(异步) + /// + /// + public override void Stat(StatParam param) + { + var key = StarkCallbackHandler.MakeKey(); + s_statParams.Add(key, param); + StarkStat(FixFilePath(param.path), key); + } + + /// + /// 获取保存的用户目录文件列表 + /// + /// + public override void GetSavedFileList(GetSavedFileListParam param) + { + var key = StarkCallbackHandler.MakeKey(); + s_getSavedFileListParams.Add(key, param); + StarkGetSavedFileList(key); + } + + /// + /// 根据url链接获取本地缓存文件路径 + /// + /// 输入文件下载链接url + /// 返回本地缓存文件路径,以scfile://user开头的路径,可以直接用这个路径访问该文件 + public override string GetLocalCachedPathForUrl(string url) + { + return StarkGetCachedPathForUrl(url); + } + + /// + /// 判断该url是否有本地缓存文件 + /// + /// 输入文件下载链接url + /// 如果存在缓存文件则返回true,不存在缓存文件则返回false + public override bool IsUrlCached(string url) + { + var path = GetLocalCachedPathForUrl(url); + return !string.IsNullOrEmpty(path) && AccessSync(path); + } + } +} \ No newline at end of file diff --git a/Assets/Plugins/ByteGame/com.bytedance.starksdk/WebGL/FileSystem/StarkFileSystemManagerWebGL.cs.meta b/Assets/Plugins/ByteGame/com.bytedance.starksdk/WebGL/FileSystem/StarkFileSystemManagerWebGL.cs.meta new file mode 100644 index 00000000..e284322b --- /dev/null +++ b/Assets/Plugins/ByteGame/com.bytedance.starksdk/WebGL/FileSystem/StarkFileSystemManagerWebGL.cs.meta @@ -0,0 +1,3 @@ +fileFormatVersion: 2 +guid: ae3aef89ea5642568f546df03dc82887 +timeCreated: 1678263449 \ No newline at end of file diff --git a/Assets/Plugins/ByteGame/com.bytedance.starksdk/WebGL/StarkCallbackHandler.cs b/Assets/Plugins/ByteGame/com.bytedance.starksdk/WebGL/StarkCallbackHandler.cs new file mode 100644 index 00000000..e5565c82 --- /dev/null +++ b/Assets/Plugins/ByteGame/com.bytedance.starksdk/WebGL/StarkCallbackHandler.cs @@ -0,0 +1,69 @@ +using System; +using System.Collections; +using UnityEngine; + +namespace StarkSDKSpace +{ + class StarkCallbackHandler + { + private static readonly Hashtable responseHT = new Hashtable(); + + private static int htCounter = 0; + + private static int GenarateCallbackId() + { + if (htCounter > 1000000) + { + htCounter = 0; + } + + htCounter++; + return htCounter; + } + + public static string Add(Action callback) where T : StarkBaseResponse + { + if (callback == null) + { + return ""; + } + var key = MakeKey(); + responseHT.Add(key, callback); + return key; + } + + public static string MakeKey() + { + int id = GenarateCallbackId(); + TimeSpan ts = DateTime.Now - new DateTime(1970, 1, 1, 0, 0, 0, 0); + var timestamp = Convert.ToInt64(ts.TotalSeconds); + var key = timestamp.ToString() + '-' + id; + return key; + } + + public static void InvokeResponseCallback(string str) where T : StarkBaseResponse + { + if (!string.IsNullOrEmpty(str)) + { + T res = JsonUtility.FromJson(str); + var id = res.callbackId; + + Callback(id, res); + } + } + + public static void Callback(string id, T res) + { + if (responseHT.ContainsKey(id)) + { + var callback = (Action) responseHT[id]; + callback(res); + responseHT.Remove(id); + } + else + { + Debug.LogError($"callback id not found, id: {id}"); + } + } + } +} \ No newline at end of file diff --git a/Assets/Plugins/ByteGame/com.bytedance.starksdk/WebGL/StarkCallbackHandler.cs.meta b/Assets/Plugins/ByteGame/com.bytedance.starksdk/WebGL/StarkCallbackHandler.cs.meta new file mode 100644 index 00000000..c778cc86 --- /dev/null +++ b/Assets/Plugins/ByteGame/com.bytedance.starksdk/WebGL/StarkCallbackHandler.cs.meta @@ -0,0 +1,3 @@ +fileFormatVersion: 2 +guid: 1496dd5728954f29887b69f36a47449f +timeCreated: 1672296842 \ No newline at end of file diff --git a/Assets/Plugins/ByteGame/com.bytedance.starksdk/WebGL/StarkModel.cs b/Assets/Plugins/ByteGame/com.bytedance.starksdk/WebGL/StarkModel.cs new file mode 100644 index 00000000..3a4ca1dd --- /dev/null +++ b/Assets/Plugins/ByteGame/com.bytedance.starksdk/WebGL/StarkModel.cs @@ -0,0 +1,205 @@ +namespace StarkSDKSpace +{ + public class StarkBaseResponse + { + public string callbackId; //回调id,调用者不需要关注 + public string errMsg; + public int errCode; + } + + public class StarkBaseActionParam + { + public System.Action success; //接口调用成功的回调函数 + public System.Action fail; //接口调用失败的回调函数 + } + + public class StarkReadFileResponse : StarkBaseResponse + { + /// + /// 如果返回二进制,则数据在这个字段 + /// + public byte[] binData; + + /// + /// 如果返回的是字符串,则数据在这个字段 + /// + public string stringData; + } + + public class AccessParam : StarkBaseActionParam + { + public string path; + } + + public class UnlinkParam : StarkBaseActionParam + { + public string filePath; + } + + public class MkdirParam : StarkBaseActionParam + { + /// + /// 创建的目录路径 (本地路径) + /// + public string dirPath; + + /// + /// 是否在递归创建该目录的上级目录后再创建该目录。如果对应的上级目录已经存在,则不创建该上级目录。如 dirPath 为 a/b/c/d 且 recursive 为 true,将创建 a 目录,再在 a 目录下创建 b 目录,以此类推直至创建 a/b/c 目录下的 d 目录。 + /// + public bool recursive = false; + } + + public class RmdirParam : StarkBaseActionParam + { + /// + /// 删除的目录路径 (本地路径) + /// + public string dirPath; + + /// + /// 是否递归删除目录。如果为 true,则删除该目录和该目录下的所有子目录以及文件。 + /// + public bool recursive = false; + } + + public class CopyFileParam : StarkBaseActionParam + { + public string srcPath; + public string destPath; + } + + public class RenameFileParam : StarkBaseActionParam + { + public string srcPath; + public string destPath; + } + + public class WriteFileParam : StarkBaseActionParam + { + /// + /// 要写入的文件路径 (本地路径) + /// + public string filePath; + + /// + /// 要写入的二进制数据 + /// + public byte[] data; + } + + public class WriteFileStringParam : StarkBaseActionParam + { + /// + /// 要写入的文件路径 (本地路径) + /// + public string filePath; + + /// + /// 要写入的二进制数据 + /// + public string data; + + /// + /// 指定写入文件的字符编码 + /// + public string encoding = "utf8"; + } + + public class ReadFileParam : StarkBaseActionParam + { + /// + /// 要读取的文件的路径 (本地路径) + /// + public string filePath; + + /// + /// 指定读取文件的字符编码,如果不传 encoding,则以 ArrayBuffer 格式读取文件的二进制内容 + /// + public string encoding; + } + + public class StatParam : StarkBaseActionParam + { + /// + /// 文件/目录路径 + /// + public string path; + } + + public class GetSavedFileListParam : StarkBaseActionParam + { + } + + public class StarkReadFileCallback : StarkBaseResponse + { + public string data; + public int byteLength; + } + + public class StarkGetSavedFileListResponse : StarkBaseResponse + { + public StarkFileInfo[] fileList; + } + + public class StarkStatResponse : StarkBaseResponse + { + public StarkStatInfo stat; + } + + public class StarkBaseFileInfo + { + /// + /// 文件大小,单位:B + /// + public long size; + + /// + /// 文件的类型和存取的权限 + /// + public int mode; + + /// + /// 判断当前文件是否一个普通文件 + /// + /// 是普通文件返回true,不是则返回false + public bool IsFile() + { + return (61440 & mode) == 32768; + } + + /// + /// 判断当前文件是否一个目录 + /// + /// 是目录返回true,不是则返回false + public bool IsDirectory() + { + return (61440 & mode) == 16384; + } + } + + public class StarkFileInfo : StarkBaseFileInfo + { + /// + /// 文件创建时间 + /// + public long createTime; + + /// + /// 文件路径 + /// + public string filePath; + } + + public class StarkStatInfo : StarkBaseFileInfo + { + /// + /// 文件最近一次被存取或被执行的时间 + /// + public long lastAccessedTime; + + /// + /// 文件最后一次被修改的时间 + /// + public long lastModifiedTime; + } +} \ No newline at end of file diff --git a/Assets/Plugins/ByteGame/com.bytedance.starksdk/WebGL/StarkModel.cs.meta b/Assets/Plugins/ByteGame/com.bytedance.starksdk/WebGL/StarkModel.cs.meta new file mode 100644 index 00000000..7aa0b7dd --- /dev/null +++ b/Assets/Plugins/ByteGame/com.bytedance.starksdk/WebGL/StarkModel.cs.meta @@ -0,0 +1,3 @@ +fileFormatVersion: 2 +guid: 289f6ebab1ff4758a53ef038b01f89ca +timeCreated: 1672296563 \ No newline at end of file diff --git a/Assets/Plugins/ByteGame/com.bytedance.starksdk/WebGL/StarkSDK.jslib b/Assets/Plugins/ByteGame/com.bytedance.starksdk/WebGL/StarkSDK.jslib new file mode 100644 index 00000000..e5d27926 --- /dev/null +++ b/Assets/Plugins/ByteGame/com.bytedance.starksdk/WebGL/StarkSDK.jslib @@ -0,0 +1,260 @@ +mergeInto(LibraryManager.library, { + StarkPointerStringify: function(str) { + if (typeof UTF8ToString !== "undefined") { + return UTF8ToString(str) + } + return Pointer_stringify(str) + }, + StarkMigratingData: function() { + if (!window.StarkSDK) return false; + return window.StarkSDK.MigratingData(); + }, + StarkIsDataMigrated: function() { + if (!window.StarkSDK) return false; + return window.StarkSDK.IsDataMigrated(); + }, + StarkCanUseLocalStorage: function() { + if (!window.StarkSDK) return false; + return window.StarkSDK.CanUseLocalStorage(); + }, + StarkStorageSetIntSync: function(key, value) { + window.StarkSDK && window.StarkSDK.SetStorageSync(_StarkPointerStringify(key), value); + }, + StarkStorageGetIntSync: function(key, defaultValue) { + if (!window.StarkSDK) return defaultValue; + return window.StarkSDK.GetStorageSync(_StarkPointerStringify(key), defaultValue); + }, + StarkStorageSetFloatSync: function(key, value) { + window.StarkSDK && window.StarkSDK.SetStorageSync(_StarkPointerStringify(key), value); + }, + StarkStorageGetFloatSync: function(key, defaultValue) { + if (!window.StarkSDK) return defaultValue; + return window.StarkSDK.GetStorageSync(_StarkPointerStringify(key), defaultValue); + }, + StarkStorageSetStringSync: function(key, value) { + window.StarkSDK && window.StarkSDK.SetStorageSync(_StarkPointerStringify(key), _StarkPointerStringify(value)); + }, + StarkStorageGetStringSync: function(key, defaultValue) { + if (!window.StarkSDK) return defaultValue; + var returnStr = window.StarkSDK.GetStorageSync(_StarkPointerStringify(key), _StarkPointerStringify(defaultValue)); + var bufferSize = lengthBytesUTF8(returnStr) + 1; + var buffer = _malloc(bufferSize); + stringToUTF8(returnStr, buffer, bufferSize); + return buffer; + }, + StarkStorageDeleteAllSync: function() { + window.StarkSDK && window.StarkSDK.ClearStorageSync(); + }, + StarkStorageDeleteKeySync: function(key) { + window.StarkSDK && window.StarkSDK.RemoveStorageSync(_StarkPointerStringify(key)); + }, + StarkStorageHasKeySync: function(key) { + if (!window.StarkSDK) return; + return window.StarkSDK.StorageHasKeySync(_StarkPointerStringify(key)); + }, + StarkWriteBinFile: function(filePath, data, dataLength, s, f) { + window.StarkSDK && window.StarkSDK.WriteFile( + _StarkPointerStringify(filePath), + HEAPU8.slice(data, dataLength + data), + "binary", + _StarkPointerStringify(s), + _StarkPointerStringify(f) + ) + }, + StarkWriteBinFileSync: function(filePath, data, dataLength) { + if (!window.StarkSDK) return; + var returnStr = window.StarkSDK.WriteFileSync( + _StarkPointerStringify(filePath), + HEAPU8.slice(data, dataLength + data), + "binary" + ) + if (!returnStr) { + return; + } + var bufferSize = lengthBytesUTF8(returnStr) + 1; + var buffer = _malloc(bufferSize); + stringToUTF8(returnStr, buffer, bufferSize); + return buffer; + }, + StarkWriteStringFile: function(filePath, data, encoding, s, f) { + window.StarkSDK && window.StarkSDK.WriteFile( + _StarkPointerStringify(filePath), + _StarkPointerStringify(data), + _StarkPointerStringify(encoding), + _StarkPointerStringify(s), + _StarkPointerStringify(f) + ) + }, + StarkWriteStringFileSync: function(filePath, data, encoding) { + if (!window.StarkSDK) return; + var returnStr = window.StarkSDK.WriteFileSync(_StarkPointerStringify(filePath), _StarkPointerStringify(data), _StarkPointerStringify(encoding)); + if (!returnStr) { + return; + } + var bufferSize = lengthBytesUTF8(returnStr) + 1; + var buffer = _malloc(bufferSize); + stringToUTF8(returnStr, buffer, bufferSize); + return buffer; + }, + StarkReadFile: function(filePath, encoding, callbackId) { + window.StarkSDK && window.StarkSDK.ReadFile( + _StarkPointerStringify(filePath), + _StarkPointerStringify(encoding), + _StarkPointerStringify(callbackId) + ); + }, + StarkReadStringFileSync: function(filePath, encoding) { + if (!window.StarkSDK) return; + var returnStr = window.StarkSDK.ReadStringFileSync(_StarkPointerStringify(filePath), _StarkPointerStringify(encoding)); + if (!returnStr) { + return; + } + var bufferSize = lengthBytesUTF8(returnStr) + 1; + var buffer = _malloc(bufferSize); + stringToUTF8(returnStr, buffer, bufferSize); + return buffer; + }, + StarkReadBinFileSync: function(filePath) { + if (!window.StarkSDK) return; + return window.StarkSDK.ReadBinFileSync( + _StarkPointerStringify(filePath) + ); + }, + StarkShareFileBuffer: function(offset, callbackId) { + window.StarkSDK && window.StarkSDK.ShareFileBuffer( + HEAPU8, + offset, + _StarkPointerStringify(callbackId) + ) + }, + StarkAccessFileSync: function(path) { + if (!window.StarkSDK) return false; + return window.StarkSDK.AccessFileSync(_StarkPointerStringify(path)); + }, + StarkAccessFile: function(path, s, f) { + window.StarkSDK && window.StarkSDK.AccessFile( + _StarkPointerStringify(path), + _StarkPointerStringify(s), + _StarkPointerStringify(f)); + }, + StarkCopyFileSync: function(srcPath, destPath) { + if (!window.StarkSDK) return; + var returnStr = window.StarkSDK.CopyFileSync(_StarkPointerStringify(srcPath), _StarkPointerStringify(destPath)); + if (!returnStr) { + return; + } + var bufferSize = lengthBytesUTF8(returnStr) + 1; + var buffer = _malloc(bufferSize); + stringToUTF8(returnStr, buffer, bufferSize); + return buffer; + }, + StarkCopyFile: function(srcPath, destPath, s, f) { + window.StarkSDK && window.StarkSDK.CopyFile( + _StarkPointerStringify(srcPath), + _StarkPointerStringify(destPath), + _StarkPointerStringify(s), + _StarkPointerStringify(f)); + }, + StarkRenameFileSync: function(srcPath, destPath) { + if (!window.StarkSDK) return; + var returnStr = window.StarkSDK.RenameFileSync(_StarkPointerStringify(srcPath), _StarkPointerStringify(destPath)); + if (!returnStr) { + return; + } + var bufferSize = lengthBytesUTF8(returnStr) + 1; + var buffer = _malloc(bufferSize); + stringToUTF8(returnStr, buffer, bufferSize); + return buffer; + }, + StarkRenameFile: function(srcPath, destPath, s, f) { + window.StarkSDK && window.StarkSDK.RenameFile( + _StarkPointerStringify(srcPath), + _StarkPointerStringify(destPath), + _StarkPointerStringify(s), + _StarkPointerStringify(f)); + }, + StarkUnlinkSync: function(filePath) { + if (!window.StarkSDK) return; + var returnStr = window.StarkSDK.UnlinkSync(_StarkPointerStringify(filePath)); + if (!returnStr) { + return; + } + var bufferSize = lengthBytesUTF8(returnStr) + 1; + var buffer = _malloc(bufferSize); + stringToUTF8(returnStr, buffer, bufferSize); + return buffer; + }, + StarkUnlink: function(filePath, s, f) { + window.StarkSDK && window.StarkSDK.Unlink( + _StarkPointerStringify(filePath), + _StarkPointerStringify(s), + _StarkPointerStringify(f)); + }, + StarkMkdir: function(dirPath, recursive, s, f) { + window.StarkSDK && window.StarkSDK.Mkdir( + _StarkPointerStringify(dirPath), + recursive, + _StarkPointerStringify(s), + _StarkPointerStringify(f)); + }, + StarkMkdirSync: function(dirPath, recursive) { + if (!window.StarkSDK) return; + var returnStr = window.StarkSDK.MkdirSync(_StarkPointerStringify(dirPath), recursive); + if (!returnStr) { + return; + } + var bufferSize = lengthBytesUTF8(returnStr) + 1; + var buffer = _malloc(bufferSize); + stringToUTF8(returnStr, buffer, bufferSize); + return buffer; + }, + StarkRmdir: function(dirPath, recursive, s, f) { + window.StarkSDK && window.StarkSDK.Rmdir( + _StarkPointerStringify(dirPath), + recursive, + _StarkPointerStringify(s), + _StarkPointerStringify(f)); + }, + StarkRmdirSync: function(dirPath, recursive) { + if (!window.StarkSDK) return; + var returnStr = window.StarkSDK.RmdirSync(_StarkPointerStringify(dirPath), recursive); + if (!returnStr) { + return; + } + var bufferSize = lengthBytesUTF8(returnStr) + 1; + var buffer = _malloc(bufferSize); + stringToUTF8(returnStr, buffer, bufferSize); + return buffer; + }, + StarkStatSync: function(path) { + if (!window.StarkSDK) return; + var returnStr = window.StarkSDK.StatSync(_StarkPointerStringify(path)); + if (!returnStr) { + return; + } + var bufferSize = lengthBytesUTF8(returnStr) + 1; + var buffer = _malloc(bufferSize); + stringToUTF8(returnStr, buffer, bufferSize); + return buffer; + }, + StarkStat: function(path, callbackId) { + window.StarkSDK && window.StarkSDK.Stat( + _StarkPointerStringify(path), + _StarkPointerStringify(callbackId)); + }, + StarkGetSavedFileList: function(callbackId) { + window.StarkSDK && window.StarkSDK.GetSavedFileList( + _StarkPointerStringify(callbackId)); + }, + StarkGetCachedPathForUrl: function(url) { + if (!window.StarkSDK) return; + var returnStr = window.StarkSDK.getCachedPathForUrl(_StarkPointerStringify(url)); + if (!returnStr) { + return; + } + var bufferSize = lengthBytesUTF8(returnStr) + 1; + var buffer = _malloc(bufferSize); + stringToUTF8(returnStr, buffer, bufferSize); + return buffer; + } +}); \ No newline at end of file diff --git a/Assets/Plugins/ByteGame/com.bytedance.starksdk/Android/starkminiapk.aar.meta b/Assets/Plugins/ByteGame/com.bytedance.starksdk/WebGL/StarkSDK.jslib.meta similarity index 85% rename from Assets/Plugins/ByteGame/com.bytedance.starksdk/Android/starkminiapk.aar.meta rename to Assets/Plugins/ByteGame/com.bytedance.starksdk/WebGL/StarkSDK.jslib.meta index 821dd001..b9c673c7 100644 --- a/Assets/Plugins/ByteGame/com.bytedance.starksdk/Android/starkminiapk.aar.meta +++ b/Assets/Plugins/ByteGame/com.bytedance.starksdk/WebGL/StarkSDK.jslib.meta @@ -1,5 +1,5 @@ fileFormatVersion: 2 -guid: 9af3023969f5eef4cbfd6f436ad8c435 +guid: 2b9f8dd5ea2a0470d996764adb521d05 PluginImporter: externalObjects: {} serializedVersion: 2 @@ -11,11 +11,6 @@ PluginImporter: isExplicitlyReferenced: 0 validateReferences: 1 platformData: - - first: - Android: Android - second: - enabled: 1 - settings: {} - first: Any: second: @@ -27,6 +22,11 @@ PluginImporter: enabled: 0 settings: DefaultValueInitialized: true + - first: + WebGL: WebGL + second: + enabled: 1 + settings: {} userData: assetBundleName: assetBundleVariant: diff --git a/Assets/Plugins/ByteGame/com.bytedance.starksdk/WebGL/StarkStorageManager.cs b/Assets/Plugins/ByteGame/com.bytedance.starksdk/WebGL/StarkStorageManager.cs new file mode 100644 index 00000000..62ac4033 --- /dev/null +++ b/Assets/Plugins/ByteGame/com.bytedance.starksdk/WebGL/StarkStorageManager.cs @@ -0,0 +1,155 @@ +using System.Runtime.InteropServices; +using UnityEngine.Scripting; + +namespace StarkSDKSpace +{ + public static class StarkStorage + { + public static void SetIntSync(string key, int value) + { + StarkStorageSetIntSync(key, value); + } + + public static int GetIntSync(string key, int defaultValue) + { + return StarkStorageGetIntSync(key, defaultValue); + } + + public static void SetFloatSync(string key, float value) + { + StarkStorageSetFloatSync(key, value); + } + + public static float GetFloatSync(string key, float defaultValue) + { + return StarkStorageGetFloatSync(key, defaultValue); + } + + public static void SetStringSync(string key, string value) + { + StarkStorageSetStringSync(key, value); + } + + public static string GetStringSync(string key, string defaultValue) + { + return StarkStorageGetStringSync(key, defaultValue); + } + + public static bool HasKeySync(string key) + { + return StarkStorageHasKeySync(key); + } + + public static void DeleteKeySync(string key) + { + StarkStorageDeleteKeySync(key); + } + + public static void DeleteAllSync() + { + StarkStorageDeleteAllSync(); + } + +#if UNITY_WEBGL && !UNITY_EDITOR + [DllImport("__Internal")] + private static extern void StarkStorageSetIntSync(string key, int value); +#else + static void StarkStorageSetIntSync(string key, int value) + { + UnityEngine.PlayerPrefs.SetInt(key, value); + } +#endif + +#if UNITY_WEBGL && !UNITY_EDITOR + [DllImport("__Internal")] + private static extern int StarkStorageGetIntSync(string key, int defaultValue); +#else + static int StarkStorageGetIntSync(string key, int defaultValue) + { + return UnityEngine.PlayerPrefs.GetInt(key, defaultValue); + } +#endif + +#if UNITY_WEBGL && !UNITY_EDITOR + [DllImport("__Internal")] + private static extern void StarkStorageSetStringSync(string key, string value); +#else + static void StarkStorageSetStringSync(string key, string value) + { + UnityEngine.PlayerPrefs.SetString(key, value); + } +#endif + + +#if UNITY_WEBGL && !UNITY_EDITOR + [DllImport("__Internal")] + private static extern string StarkStorageGetStringSync(string key, string defaultValue); +#else + static string StarkStorageGetStringSync(string key, string defaultValue) + { + return UnityEngine.PlayerPrefs.GetString(key, defaultValue); + } +#endif + + +#if UNITY_WEBGL && !UNITY_EDITOR + [DllImport("__Internal")] + private static extern void StarkStorageSetFloatSync(string key, float value); +#else + static void StarkStorageSetFloatSync(string key, float value) + { + UnityEngine.PlayerPrefs.SetFloat(key, value); + } +#endif + + +#if UNITY_WEBGL && !UNITY_EDITOR + [DllImport("__Internal")] + private static extern float StarkStorageGetFloatSync(string key, float defaultValue); +#else + static float StarkStorageGetFloatSync(string key, float defaultValue) + { + return UnityEngine.PlayerPrefs.GetFloat(key, defaultValue); + } +#endif + + +#if UNITY_WEBGL && !UNITY_EDITOR + [DllImport("__Internal")] + private static extern void StarkStorageDeleteAllSync(); +#else + static void StarkStorageDeleteAllSync() + { + UnityEngine.PlayerPrefs.DeleteAll(); + } +#endif + + +#if UNITY_WEBGL && !UNITY_EDITOR + [DllImport("__Internal")] + private static extern void StarkStorageDeleteKeySync(string key); +#else + static void StarkStorageDeleteKeySync(string key) + { + UnityEngine.PlayerPrefs.DeleteKey(key); + } +#endif + + +#if UNITY_WEBGL && !UNITY_EDITOR + [DllImport("__Internal")] + private static extern bool StarkStorageHasKeySync(string key); +#else + static bool StarkStorageHasKeySync(string key) + { + return UnityEngine.PlayerPrefs.HasKey(key); + } +#endif + +#if UNITY_WEBGL && !UNITY_EDITOR + [Preserve] + [DllImport("__Internal")] + private static extern void StarkPointerStringify(); +#endif + } +} \ No newline at end of file diff --git a/Assets/Plugins/ByteGame/com.bytedance.starksdk/WebGL/StarkStorageManager.cs.meta b/Assets/Plugins/ByteGame/com.bytedance.starksdk/WebGL/StarkStorageManager.cs.meta new file mode 100644 index 00000000..2bf2cf2b --- /dev/null +++ b/Assets/Plugins/ByteGame/com.bytedance.starksdk/WebGL/StarkStorageManager.cs.meta @@ -0,0 +1,3 @@ +fileFormatVersion: 2 +guid: 7ecfd14bfe5d41f68deef0ac6f78382f +timeCreated: 1672225760 \ No newline at end of file diff --git a/Assets/Plugins/ByteGame/com.bytedance.starksdk/WebGL/StarkWebGL.asmdef b/Assets/Plugins/ByteGame/com.bytedance.starksdk/WebGL/StarkWebGL.asmdef new file mode 100644 index 00000000..08d887a3 --- /dev/null +++ b/Assets/Plugins/ByteGame/com.bytedance.starksdk/WebGL/StarkWebGL.asmdef @@ -0,0 +1,16 @@ +{ + "name": "StarkWebGL", + "rootNamespace": "", + "references": [ + "GUID:1e8ccb870274c4d3dbd4e7aa724ad45e" + ], + "includePlatforms": [], + "excludePlatforms": [], + "allowUnsafeCode": false, + "overrideReferences": false, + "precompiledReferences": [], + "autoReferenced": true, + "defineConstraints": [], + "versionDefines": [], + "noEngineReferences": false +} \ No newline at end of file diff --git a/Assets/Plugins/ByteGame/com.bytedance.starksdk/WebGL/StarkWebGL.asmdef.meta b/Assets/Plugins/ByteGame/com.bytedance.starksdk/WebGL/StarkWebGL.asmdef.meta new file mode 100644 index 00000000..8d03b030 --- /dev/null +++ b/Assets/Plugins/ByteGame/com.bytedance.starksdk/WebGL/StarkWebGL.asmdef.meta @@ -0,0 +1,7 @@ +fileFormatVersion: 2 +guid: 0f8df04a5a494444eb8fa0504f6fb965 +AssemblyDefinitionImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/Plugins/ByteGame/com.bytedance.starksdk/UNBridge/WebGLInterface.cs b/Assets/Plugins/ByteGame/com.bytedance.starksdk/WebGL/StarkWebGLInterface.cs similarity index 57% rename from Assets/Plugins/ByteGame/com.bytedance.starksdk/UNBridge/WebGLInterface.cs rename to Assets/Plugins/ByteGame/com.bytedance.starksdk/WebGL/StarkWebGLInterface.cs index e16fb13e..2a405c67 100644 --- a/Assets/Plugins/ByteGame/com.bytedance.starksdk/UNBridge/WebGLInterface.cs +++ b/Assets/Plugins/ByteGame/com.bytedance.starksdk/WebGL/StarkWebGLInterface.cs @@ -3,27 +3,46 @@ using UnityEngine.Scripting; [assembly: Preserve] -namespace StarkSDKSpace.UNBridgeLib +namespace StarkSDKSpace { - public class WebGLInterface + public class StarkWebGLInterface { #if UNITY_WEBPLAYER || UNITY_WEBGL //以下接口为Web使用,用于调用JS代码。 [method: Preserve] [DllImport("__Internal")] public static extern void unityCallJs(string msg); - + [method: Preserve] [DllImport("__Internal")] public static extern string unityCallJsSync(string msg); - + [method: Preserve] [DllImport("__Internal")] public static extern bool h5HasAPI(string apiName); - + [method: Preserve] [DllImport("__Internal")] public static extern string unityMixCallJs(string msg); +#else + public static void unityCallJs(string msg) + { + } + + public static string unityCallJsSync(string msg) + { + return ""; + } + + public static bool h5HasAPI(string apiName) + { + return false; + } + + public static string unityMixCallJs(string msg) + { + return ""; + } #endif } } \ No newline at end of file diff --git a/Assets/Plugins/ByteGame/com.bytedance.starksdk/UNBridge/WebGLInterface.cs.meta b/Assets/Plugins/ByteGame/com.bytedance.starksdk/WebGL/StarkWebGLInterface.cs.meta similarity index 100% rename from Assets/Plugins/ByteGame/com.bytedance.starksdk/UNBridge/WebGLInterface.cs.meta rename to Assets/Plugins/ByteGame/com.bytedance.starksdk/WebGL/StarkWebGLInterface.cs.meta diff --git a/Assets/Plugins/ByteGame/com.bytedance.starksdk/WebGL/UNBridge.jslib b/Assets/Plugins/ByteGame/com.bytedance.starksdk/WebGL/UNBridge.jslib index 051c37ea..ddcb04d1 100644 --- a/Assets/Plugins/ByteGame/com.bytedance.starksdk/WebGL/UNBridge.jslib +++ b/Assets/Plugins/ByteGame/com.bytedance.starksdk/WebGL/UNBridge.jslib @@ -1,40 +1,34 @@ -mergeInto(LibraryManager.library,{ - unityCallJs:function(msg){ - if (typeof UTF8ToString !== "undefined") { - UNBridgeCore.handleMsgFromUnity(UTF8ToString(msg)); - } else { - UNBridgeCore.handleMsgFromUnity(Pointer_stringify(msg)); +mergeInto(LibraryManager.library, { + unityCallJs: function(msg) { + if (typeof(UNBridgeCore) === "undefined") { + return; } + UNBridgeCore.handleMsgFromUnity(_StarkPointerStringify(msg)); }, - unityCallJsSync:function(msg){ - var result; - if (typeof UTF8ToString !== "undefined") { - result = UNBridgeCore.handleMsgFromUnitySync(UTF8ToString(msg)); - } else { - result = UNBridgeCore.handleMsgFromUnitySync(Pointer_stringify(msg)); + unityCallJsSync: function(msg) { + if (typeof(UNBridgeCore) === "undefined") { + return; } + var result = UNBridgeCore.handleMsgFromUnitySync(_StarkPointerStringify(msg)); var bufferSize = lengthBytesUTF8(result) + 1; var buffer = _malloc(bufferSize); stringToUTF8(result, buffer, bufferSize); return buffer; }, - h5HasAPI:function(apiName){ - if (typeof UTF8ToString !== "undefined") { - return UNBridge.h5HasAPI(UTF8ToString(apiName)); - } else { - return UNBridge.h5HasAPI(Pointer_stringify(apiName)); + h5HasAPI: function(apiName) { + if (typeof(UNBridgeCore) === "undefined") { + return; } + return UNBridge.h5HasAPI(_StarkPointerStringify(apiName)); }, - unityMixCallJs:function(msg){ - var result; - if (typeof UTF8ToString !== "undefined") { - result = UNBridgeCore.onUnityMixCall(UTF8ToString(msg)); - } else { - result = UNBridgeCore.onUnityMixCall(Pointer_stringify(msg)); + unityMixCallJs: function(msg) { + if (typeof(UNBridgeCore) === "undefined") { + return; } + var result = UNBridgeCore.onUnityMixCall(_StarkPointerStringify(msg)); var bufferSize = lengthBytesUTF8(result) + 1; var buffer = _malloc(bufferSize); stringToUTF8(result, buffer, bufferSize); return buffer; } -}); +}); \ No newline at end of file diff --git a/Assets/Plugins/ByteGame/com.bytedance.starksdk/package.json b/Assets/Plugins/ByteGame/com.bytedance.starksdk/package.json index a6d415f6..8c0e2a11 100644 --- a/Assets/Plugins/ByteGame/com.bytedance.starksdk/package.json +++ b/Assets/Plugins/ByteGame/com.bytedance.starksdk/package.json @@ -1,7 +1,7 @@ { "displayName": "Stark SDK", "name": "com.bytedance.starksdk", - "version": "5.33.5", + "version": "5.50.3", "scripts": { "postinstall": "", "preuninstall": "" @@ -14,13 +14,13 @@ "links": [ { "label": "View Document", - "url": "https://bytedance.feishu.cn/docs/doccngutoUd3Y8P3HemS5Mq2vHe" + "url": "https://developer.open-douyin.com/docs/resource/zh-CN/mini-game/develop/guide/game-engine/rd-to-SCgame/unity-game-access/sc_stark_sdk" }, { "label": "View Changelog", - "url": "https://bytedance.feishu.cn/docs/doccnfO07C3R783siaLMS4VdaKd#" + "url": "https://developer.open-douyin.com/docs/resource/zh-CN/mini-game/develop/guide/game-engine/rd-to-SCgame/unity-game-access/sc_changelog" } ], - "unitySinceBuild": "2019.4", + "unitySinceBuild": "*", "unityUntilBuild": "*" } \ No newline at end of file diff --git a/Assets/Plugins/ByteGame/com.bytedance.starksdk/package.json.meta b/Assets/Plugins/ByteGame/com.bytedance.starksdk/package.json.meta index 9053a31c..37425a50 100644 --- a/Assets/Plugins/ByteGame/com.bytedance.starksdk/package.json.meta +++ b/Assets/Plugins/ByteGame/com.bytedance.starksdk/package.json.meta @@ -1,7 +1,7 @@ -fileFormatVersion: 2 -guid: ff1445f1a48424f5d91a5f2eb0691a1d -TextScriptImporter: - externalObjects: {} - userData: - assetBundleName: - assetBundleVariant: +fileFormatVersion: 2 +guid: ff1445f1a48424f5d91a5f2eb0691a1d +TextScriptImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/Plugins/ByteGame/com.bytedance.starksdk/starksdk.dll b/Assets/Plugins/ByteGame/com.bytedance.starksdk/starksdk.dll new file mode 100644 index 00000000..52b76945 Binary files /dev/null and b/Assets/Plugins/ByteGame/com.bytedance.starksdk/starksdk.dll differ diff --git a/Assets/Plugins/ByteGame/com.bytedance.starksdk/Runtime/starksdkRuntime.dll.meta b/Assets/Plugins/ByteGame/com.bytedance.starksdk/starksdk.dll.meta similarity index 93% rename from Assets/Plugins/ByteGame/com.bytedance.starksdk/Runtime/starksdkRuntime.dll.meta rename to Assets/Plugins/ByteGame/com.bytedance.starksdk/starksdk.dll.meta index 809b467e..40a9c880 100644 --- a/Assets/Plugins/ByteGame/com.bytedance.starksdk/Runtime/starksdkRuntime.dll.meta +++ b/Assets/Plugins/ByteGame/com.bytedance.starksdk/starksdk.dll.meta @@ -1,5 +1,5 @@ fileFormatVersion: 2 -guid: 7e1ec893444594eaebabe42552238055 +guid: 3ab2468ed96164da58da75a5cd92f850 PluginImporter: externalObjects: {} serializedVersion: 2 diff --git a/Assets/Plugins/ByteGame/com.bytedance.starksdk/Runtime/starksdkRuntime.xml b/Assets/Plugins/ByteGame/com.bytedance.starksdk/starksdk.xml similarity index 70% rename from Assets/Plugins/ByteGame/com.bytedance.starksdk/Runtime/starksdkRuntime.xml rename to Assets/Plugins/ByteGame/com.bytedance.starksdk/starksdk.xml index 94d43d96..a6f0ee00 100644 --- a/Assets/Plugins/ByteGame/com.bytedance.starksdk/Runtime/starksdkRuntime.xml +++ b/Assets/Plugins/ByteGame/com.bytedance.starksdk/starksdk.xml @@ -1,9 +1,202 @@ - starksdkRuntime + starksdk + + + Unity声音录制 + + + + + Unity层使用的接口 + + + + + 开始录屏 + + + + + 停止录屏 + + + + + 开启录制游戏声音 + + + + + 关闭录制游戏声音 + + + + + 设置录制分辨率 + + + + + Unity层使用的接口 + + + + 检查是否有多个ActiveAndEnable AudioListener + + + + Unity声音录制接口 + + + + + Unity层使用的接口 + + + + + Unity版本号,每对外升级一次,自增1,详情见 + + + + + UnityRenderEvent的回调的指针,可以通过 + + + + + + 录制图片 + + + + + + + + + 录制纹理 + + + + + + 传递Unity前后台切换消息 + + + + + + 录音,传递PCM的float数组 + + + + + + + + 录音,传递PCM的byte数组 + + + + + + + + 传递录音的配置参数,JSON格式 + + + + + + 通知JNI DeAttach 当前线程,不然会引起crash + + + + + 设置使用的音频引擎类型:0-unity,1-wwise plugin, 2-wwise mix + + + + + 开始录屏 + + + + + 停止录屏 + + + + + 开启录制游戏声音 + + + + + 关闭录制游戏声音 + + + + + 声音采样间隔,单位毫秒 + + + + + 是否需要将PCM从float数组转为byte数组 + + + + + 是否在录制中 + + + + + 提供给Java端通过UnityPlayer.UnitySendMessage("ByteREC","NativeStopRecord","");来停止录屏 + + + + + 提供给Java端通过UnityPlayer.UnitySendMessage("ByteREC","NativeStartRecord","");来启动录屏 + + + + + 提供给Java端通过UnityPlayer.UnitySendMessage("ByteREC","StartRecord","");来触发录制 + + + + + + 提供给Java端通过UnityPlayer.UnitySendMessage("ByteREC","NativeRecordVoice","");来设置是否录音 + + + + + + 设置是否在Unity测转换PCM + + + + + + 支持外部注入RT进行录制 + + + + + Unity声音录制 + + + + 将数组添加到List里。 + 宿主枚举 @@ -34,6 +227,18 @@ 获取query字段,即小程序的启动参数,可能为空,使用时需判空 + + + 启动场景(该字段目前只有在「侧边栏」启动场景才会返回,返回的属性值为:homepage) + + + + + + 启动场景(该字段目前只有在「侧边栏」启动场景才会返回,返回的属性值为:homepage) + + + 获取小程序启动时的参数,里面的参数可能为空,使用时需判空; 可以在StarkSDK.init()之后调用,确保得到非空值 @@ -112,6 +317,11 @@ 控制sdk中的Log级别 + + + 获取小程序启动时的参数,里面的参数可能为空,使用时需判空; 可以在StarkSDK.init()之后调用,确保得到非空值 + + 账号模块 @@ -263,18 +473,34 @@ 获取游戏跳转模块 - - - 获取视频播放接口 - - StarkVideoManager - 打开客服聊天页 打开客服聊天页回调,参数为是否成功,true表示成功,false表示失败 + + + 是平台提供的小游戏客服能力 + + type:(1 :小 6 客服 2 : 抖音IM 客服(仅支持抖音))sessionFrom:(保留字段,暂时可以不填),例如{"type":1,"sessionFrom":"xxx"} + 打开客服页面成功或者失败回调 + + + + 通过客服页面发起支付 + 接口说明:https://bytedance.feishu.cn/docx/doxcnUkE86LjFTFdTJREIEGT9bb + + JsonData内容如下 + buyQuantity number 必填 金币购买数量,金币数量必须满足:金币数量*金币单价 = 限定价格等级(详见下方 buyQuantity 限制说明。开发者可以在字节小游戏平台的“支付”tab 设置游戏币单价) + customId string 必填 游戏开发者自定义的唯一订单号,订单支付成功后通过服务端支付结果回调回传 + currencyType string 非必填 币种, 目前仅为"CNY" + zoneId string 非必填 游戏服务区 id,默认值为1,开发者自定义。游戏不分大区则默认填写"1"。如果应用支持多角色,则角色 ID 接在分区 ID 后,用"_"连接 + extraInfo string 非必填 游戏开发者自定义的其他信息,订单支付成功后通过服务端支付结果回调回传。字符串长度最大不能超过 256。(强烈建议传入) + + 打开客服页成功 + 打开客服聊天页回调,参数为是否成功,true表示成功,false表示失败 + 跳转到抖音视频 @@ -289,6 +515,12 @@ 是否显示退出提示对话框,true为在退出前显示二次提示对话框架,false则不显示对话框而直接退出程序 接口调用成功状态回调,true表示成功,false表示失败 + + + 重启小游戏 + + 接口调用失败时的回调 + 获取系统信息。类似小程序开发平台 tt.getSystemInfoSync 接口返回值。 @@ -309,12 +541,93 @@ 接口调用状态回调,(bool success, string errMsg) => {} + + + 获取陀螺仪接口 + + + + + 替换敏感词 + + 要检查和替换的词语 + 回调 + int: 返回状态码,0为成功,否则为失败 + string: 错误信息 + JsonData: + audit_result int 1: 有敏感内容;2: 无敏感内容 + audit_content string 被替换的内容(无敏感内容则返回值与传入的word相同) + + 获取键盘管理器(仅WebGL支持) StarkKeyboard + + + 宿主事件监听 + + + + + 操作剪切板 + + + + + 群聊相关操作 + + + + + + 方向监听 + + + + + + 屏幕相关操作 + + + + + + + + + + + 抖音云功能相关接口 + 可以参考 小游戏抖音云相关文档 https://developer.open-douyin.com/docs/resource/zh-CN/developer/tools/cloud/develop-guide/invoke-sever/cloud-sdk + + + + + + 侧边栏跳转相关接口 + https://bytedance.feishu.cn/docx/NkzOdcUPXo02bdxl6zqcemGinzb + + + + + + + 获取菜单按钮(右上角胶囊按钮)的布局位置信息。坐标信息以屏幕左上角为原点。 + https://developer.open-douyin.com/docs/resource/zh-CN/mini-game/develop/api/interface/menu/tt-get-menu-button-layout/ + + + JsonData + width number 宽度,单位:px + height number 高度,单位:px + top number 上边界坐标,单位:px + right number 右边界坐标,单位:px + bottom number 下边界坐标,单位:px + left number 左边界坐标,单位:px + + 创建mock模块 @@ -356,6 +669,204 @@ + + + 本地音频播放管理器 + + + + + 创建 InnerAudioContext + + + + + + + 音频资源 url 地址,也支持相对路径的地址。只支持 mp3、wav、m4a、aac 格式。 + 如果 url 地址是一个相对路径的地址,比如 Assets/Sound/music.mp3, + 那么会自动根据配置的 url 前缀拼接为完整的url:${url_prefix}/Assets/Sound/music.mp3 + 有两种方法设置 url 前缀: + 1. 构建 WebGL 时填写【游戏资源CDN】url 前缀,运行时会自动拼接为完整 url。 + 2. 通过调用 StarkAudioManager.SetAudioUrlPrefix 函数设置 url 前缀。 + 如果同时填写了【游戏资源CDN】和调用了 StarkAudioManager.SetAudioUrlPrefix 函数,默认优先使用构建时填写的【游戏资源CDN】url前缀。 + + + + + 开始播放的位置(单位:s) + + + + + 是否自动播放 + + + + + 是否自动循环 + + + + + 当前音量,范围 0 ~ 1 + + + + + 播放速度。范围 0.5 ~ 2.0,默认为 1 + + + + + 是否需要下载,如果为true,则会完全下载后再触发OnCanplay + + + + + 音频实例上下文对象,完成对音频播放 + 同时支持Android及WebGL平台,但如果是Android下播放mp3文件,Unity引擎需要为Unity2020.1.14f1及以上版本 + + + + + 监听音频进入可以播放状态,但不保证后面可以流畅播放 + + + + + 监听音频播放事件 + + + + + 监听音频暂停事件 + + + + + 监听音频停止播放事件 + + + + 监听自然播放结束事件 + + + + 监听音频播放出错事件, + (errMsg) => {} + + + + + 监听音频加载中事件,当音频因为数据不足,需要停下来加载时会触发 + + + + + 监听音频开始进行 seek 操作的事件 + + + + + 监听音频完成 seek 操作的事件 + + + + + 当前音频ID + + + + + 获取音频时长,单位 s + + + + + 获取当前播放时长,单位 s + (由于WebGL底层实现方案的原因,只能将结果异步返回) + + (currentTime) => {} + + audioContext.GetCurrentTime(value => + { + Debug.Log($"audio currentTime: {value} s"); + }); + + + + + 获取当前音频是否是暂停状态 + (由于WebGL底层实现方案的原因,只能将结果异步返回) + + (isPaused) => {} + + audioContext.GetBuffered(isPaused => + { + Debug.Log($"audio isPaused: {isPaused}"); + }); + + + + + 获取当前已缓冲的音频长度,单位 s + (由于WebGL底层实现方案的原因,只能将结果异步返回) + + + audioContext.GetBuffered(buffered => + { + Debug.Log($"audio buffered: {buffered} s"); + }); + + + + + 内部方法(请勿调用) + + + + + 播放音频 + 同时支持Android及WebGL平台,但如果是Android下播放mp3文件,Unity引擎需要为Unity2020.1.14f1及以上版本 + + + + + 暂停播放 + + + + + 停止播放 + + + + + 销毁当前实例。销毁后该实例将不存在,如需播放需要再次创建 + + + + + 跳转到指定位置播放 + + + + + + 音量。范围 0~1。默认为 1 + + + + + 静音,静音时将音量设置为 0,取消静音则恢复原来的音量 + + + + + 设置是否循环播放,默认为 false + + 记录已判断支持的函数 @@ -439,8 +950,8 @@ Native method object return value - - + + Convenient method to register c# API for Android @@ -880,7 +1391,7 @@ RTC模块 - + 登录 @@ -933,7 +1444,7 @@ 设置激励视频广告的回调。获取完整的回调信息,一般处理都可以通过ShowVideoAd完成,评估必要性 - 已播放时长. + 已播放时长. @@ -951,7 +1462,7 @@ 广告是否加载完成 - + 初始化 @@ -971,6 +1482,28 @@ 异步请求并显示广告 + + + 转换服务端 返回的 json 数据, 主要处理 id 和 date 数据 + + + + + + + 指定要返回的字段 + Field 示例 + 1. 指定返回doc中字段a,b, projection设置为{a: true, b:true} + 2. 嵌套的字段 {a.b : true} + + + + + + + 上传下载国产回调逻辑 + + 未进行视频裁剪 @@ -991,7 +1524,7 @@ 视频裁剪失败 - + 开始录屏回调 @@ -1102,7 +1635,7 @@ 视频录制失败回调 - + 获取录屏时长 @@ -1142,13 +1675,6 @@ 构造函数 - - - 显示视频 - - - - 获取上一次的拉起信息 @@ -1226,8 +1752,10 @@ 当游戏Activity#OnResume的方法被调用时调用该C#方法 - - + + + 分享模块 + OK @@ -1309,7 +1837,7 @@ 需要白名单 获取 RtcEngine 实例(包含音视频应用程序调用的主要方法的接口类实例),应当只调用一次, 重复调用返回上次创建的,destroy后则重新创建。 - rtc服务使用的appId + rtc服务使用的appId, 不是你的游戏的appid @@ -1318,12 +1846,13 @@ 成功回调 失败回调 - + 加入到通信房间 加入语音频道的id 加入语音频道用户的唯一标识,建议统一使用当前用户的 openId/匿名 openId + 加入房间的accessToken 成功回调 失败回调 @@ -1679,6 +2208,152 @@ 登录后获取登录的用户信息 + + + https://developer.open-douyin.com/docs/resource/zh-CN/mini-game/develop/open-capacity/user-information/authorization/authorization/ + + + + + 是否授权用户信息 + 对应接口:tt.getUserInfo + + + + + 是否授权地理位置 + 对应接口:tt.getLocation + + + + + 是否授权录音功能 + 对应接口:tt.getRecorderManager.start + + + + + 是否授权保存到相册 + 对应接口:tt.saveImageToPhotosAlbum, tt.saveVideoToPhotosAlbum + + + + + 是否授权摄像头 + 对应接口:tt.scanCode, tt.chooseImage, tt.chooseVideo + + + + + 是否授权录屏,默认为开。在 onError 里面报错到没有录屏权限时,可以尝试主动调用 + 对应接口:tt.getGameRecorderManager + + + + + 是否授权添加日历事件 + 对应接口:tt.addPhoneCalendar + + + + + 用户权限授权结果 + + 代码示例 1:检查用户是否已授权指定权限: + ``` + if (AuthSetting.UserInfo) + { + Debug.Log($"用户已授权 UserInfo 权限。"); + } + else + { + Debug.Log($"用户未授权过或已拒绝 UserInfo 权限。"); + } + ``` + + 代码示例 2:检查用户已授权、拒绝或未授权过指定权限: + ``` + var scope = AuthorizeScope.UserInfo; + if (AuthSetting.TryGetValue(scope, out var authorized)) + { + if (authorized) + { + Debug.Log($"用户已授权 {scope} 权限。"); + } + else + { + Debug.Log($"用户已拒绝 {scope} 权限。"); + } + } + else + { + Debug.Log($"用户未授权过 {scope} 权限。"); + } + ``` + + + + + 是否授权用户信息 + 对应接口:tt.getUserInfo + + + + + 是否授权地理位置 + 对应接口:tt.getLocation + + + + + 是否授权录音功能 + 对应接口:tt.getRecorderManager.start + + + + + 是否授权保存到相册 + 对应接口:tt.saveImageToPhotosAlbum tt.saveVideoToPhotosAlbum + + + + + 是否授权摄像头 + 对应接口:tt.scanCode tt.chooseImage tt.chooseVideo + + + + + 是否授权录屏,默认为开。在 onError 里面报错到没有录屏权限时,可以尝试主动调用 + 对应接口:tt.getGameRecorderManager + + + + + 是否授权添加日历事件 + 对应接口:tt.addPhoneCalendar + + + + + 需获取的抖音权限在授权弹窗中的默认状态 + + + + + 必选项(用户无法取消) + + + + + 非必选,默认选中 + + + + + 非必选,默认不选中 + + Stark账号系统 @@ -1738,6 +2413,57 @@ + + + 获取用户已经授权过的配置时,接口调用成功的回调函数。 + + 授权结果 + + + + 获取用户已经授权过的配置时,接口调用失败的回调函数。 + + + + + + 打开设置页面,返回用户设置过的授权结果时,接口调用成功的回调函数。 + + 授权结果 + + + + 打开设置页面,返回用户设置过的授权结果时,接口调用失败的回调函数。 + + + + + + 实名认证窗口拉起成功回调 + + + + + + 实名认证窗口拉起失败回调 + "access:fail " + 详细错误信息 + + + + + 展示抖音权限授权弹窗成功回调 + 回调信息 + 请求授权返回的票据,此处对标开放平台的 authCode + 用户授权的权限 + + + + + 展示抖音权限授权弹窗失败回调 + 错误码 + 错误信息 + + 登录-获取临时登录凭证 @@ -1788,12 +2514,55 @@ 如果调用宿主代码失败则会调用onGetUserInfoAuthFail + + + 获取用户已经授权过的配置。 + 结果中只会包含向用户请求过的权限。 + 与 OpenSetting 的区别是 GetSetting 只会获取配置,而不会打开配置页面。 + + 接口调用成功的回调函数 + 接口调用失败的回调函数 + + + + 打开设置页面,返回用户设置过的授权结果。 + 结果中只会包含用户请求过的权限。 + 与 GetSetting 的区别是,OpenSetting 会打开设置页面,而 GetSetting 只会返回用户授权的设置信息。 + 接口调用成功的回调函数 + 接口调用失败的回调函数 + + 用户在实名认证弹窗完成实名认证后回调 需要在初始化时设置,回调时机为:游戏中弹出实名认证,用户完成了实名认证时触发 + + + 获取已登录用户的基本信息或特殊信息 + 若匿名登录后 userinfo里面字段全部为默认值 + 登录了宿主后可以获取账号数据,下次不用login GetScUserInfo也可以返回正确数据 + + 是否获取加密信息以及 CloudId + 验证有效的回调 + 验证无效或者验证失败的回调 + + + + + 拉起实名认证窗口。 + 注意:调用该接口前请确保用户已登录。 + + 实名认证窗口拉起成功回调 + 实名认证窗口拉起失败回调 + + + + 提供小游戏获取抖音权限的能力,展示出抖音权限授权弹窗。 + 在使用在接口前,需要小游戏拥有者登录抖音开发平台申请开通小游戏需要的权限。 + + 广告管理模块 @@ -1824,7 +2593,30 @@ 视频广告错误回调,参数含义 errCode, errMsg 表明错误码和错误描述. 视频广告详细过程回调,一般可以不关注. - + + + 展示激励视频广告,在广告未加载时会发起异步请求,弱网情况下会进行重试。失败会调用errCallback + 激励视频广告只支持一个实例,申请多个激励视频广告位是无效的 + 简单回调设置,激励视频完成和错误的回调函数 + 与 SetVideoAdCallBack 不冲突,在结束时都会被调用到,会同时收到close和complete + 错误码由sdk传出,原因参考 + https://bytedance.feishu.cn/docs/doccn1lAbZzMOqI5ueq1gCyPdcg# + https://microapp.bytedance.com/docs/zh-CN/mini-game/develop/open-capacity/ads/ads-error-code-description/ + https://microapp.bytedance.com/docs/zh-CN/mini-app/develop/api/open-interface/ads/tt-create-interstitial-ad + 1004 可能是由于广告请求被限制了次数,需要跟广告投放沟通 + 如果需要更详细的回调信息,可使用 SetVideoAdCallBack + + 广告aid. + 视频广告关闭回调,参数含义 IsComplete,表明广告是否播放完成. + 视频广告错误回调,参数含义 errCode, errMsg 表明错误码和错误描述. + 视频广告详细过程回调,一般可以不关注. + 再得添加 https://developer.open-douyin.com/docs/resource/zh-CN/mini-game/develop/open-capacity/ads/rewardagainintroduce + 是否开启再得广告模式(只支持安卓系统的抖音和抖音极速版) + 再得广告的奖励文案,玩家每看完一个广告都会展示,如【再看1个获得xx】xx就multitonRewardMsg中的文案,按顺序依次展示,单个文案最大长度为 7,multiton为true时必填 + 额外观看广告的次数,合法的数据范围为1-4,multiton为true时必填 + 是否开启进度提醒,开启时广告文案为【再看N个获得xx】,关闭时为【 再看1个获得xx】。N表示玩家当前还需额外观看广告的次数。 + + 创建Banner广告,返回 BannerAd 实例。支持多实例,可以在一个页面下展示多个。也可以分页面展示 竖屏情况下,Banner广告接受的宽度范围是 0.8*屏幕宽度,1.0*屏幕宽度。 @@ -1840,6 +2632,7 @@ 广告错误回调,参数表明错误码和错误描述. 广告加载回调. 广告样式改变回调,第一个参数是width.第二个参数是height. + 广告关闭回调,仅在WebGL有效 @@ -1852,7 +2645,6 @@ https://microapp.bytedance.com/docs/zh-CN/mini-game/develop/open-capacity/ads/tt-create-interstitial-ad 插屏广告位的adid - 是否自动展示 广告视频错误回调,参数含义 errCode, errMsg 表明错误码和错误描述. 广告视频关闭回调. 广告加载回调. @@ -1873,7 +2665,7 @@ 隐藏 - + 销毁 @@ -1884,10 +2676,11 @@ 成功后会调用CreateBannerAd的参数 resizeCallback 横屏下可以更改位置和宽度,竖屏下只能更改位置。 + 样式:"style":{"top":0, "left":0, "width":128}} - 是否有效,bannerad在load出错的情况下,如果adInterval为-1,则无法再进行刷新。此时认为已失效,需要destory再重新创建 + 是否有效,bannerad在load出错的情况下,如果adInterval为-1,则无法再进行刷新。此时认为已失效,需要destroy再重新创建 @@ -1910,7 +2703,7 @@ 是否已加载 - + 销毁 @@ -1950,9 +2743,9 @@ 广告加载成功 - + - 广告开始播放 + 广告播放成功,Unity测触发该回调时间不准确,具体触发Show的时间参考返回毫秒时间戳 @@ -1979,9 +2772,385 @@ 是否显示广告加载进度弹窗 - - - + + + 游戏切到前台事件 + + + + + 游戏切到后台事件 + + + + + 监听游戏切到前台 + + + + + 监听游戏切到后台 + + + + + 监听游戏切到前台,统一所有平台,并携带参数 + + + + + 监听游戏切到后台,统一所有平台 + + + + + 监听游戏到前台,统一所有平台,携带参数的格式为字典,可以根据指定key获取指定数据 + https://bytedance.feishu.cn/docx/NkzOdcUPXo02bdxl6zqcemGinzb + + + + + 监听游戏退出 + + 返回值为true,则表示由开发者自行处理退出逻辑,可以调用StarkSDK.API.ExitApp来手动退出游戏。返回值为false,则默认退出游戏。 + + + + 设置剪切板信息 + + 设置的内容 + bool = true设置成功,反则关注错误信息 + + + + 获取剪切板信息 + + bool = true获取成功,value为内容,反则关注错误信息 + + + + 开始监听设备方向变化 + + "监听设备方向的变化回调函数的执行频率,game 适用于更新游戏的回调频率,在 20ms/次 左右,ui 适用于更新 UI 的回调频率,在 60ms/次 左右,normal 普通的回调频率,在 200ms/次 左右" + + + + + 停止监听设备方向变化 + + + + + + 监听设备方向变化事件 + + + + + 抖音云模块 + + + + + 请求相关设置 + + + + 网络请求方法,支持 GET/POST/OPTIONS/PUT/HEAD/DELETE + + + 请求header + + + Post 请求的参数 + + + CloudId key 开发自己定义, value 是cloudId 数据, 相关key value 数据会被自动加到post 请求的body 中 + + + + 请求响应 + + + + + + 请求抖音云服务端接口 + 可以参考 小游戏抖音云相关文档 https://developer.open-douyin.com/docs/resource/zh-CN/developer/tools/cloud/develop-guide/invoke-sever/cloud-sdk + + 抖音云平台环境id + 抖音云平台服务id + 请求path + 请求参数 + 成功回调 + 失败回调 + + + + 获取抖音云文件访问地址 + + 抖音云平台环境id + 云文件path + 最大有效期 + 成功回调 + 失败回调 + + + + 抖音云文件删除 + + 抖音云平台环境id + 云文件path + 成功回调 + 失败回调 + + + + 抖音云文件上传 + + 抖音云平台环境id + 云文件path + 需要传递绝对路径 + 上传进度回调 + 上传成功毁掉 + 上传失败回调 + + + + 下载抖音云文件 + + 抖音云平台环境id + 云文件path + 需要传递绝对路径 + 下载进度回调 + 下载成功毁掉 + 下载成功毁掉 + + + + 返回抖音云操作数据库对象 + + + + + + 返回一个 ServerDate 对象, 用于表示服务端时间, 可以用于插入数据或者 查询的条件判断 + + + + + + + 创建 DBCollection 对象 + + + + + + + + + 创建 DbCmd 对象 + + + + + + + 返回一个 逻辑 CMD 可以调用 AND OR NOR相关方法 + + + + + + 基于 docid 获取单个文档 + + + + + + + 添加数据, 当前进支持单个添加 + + + + + + + + + + where 条件查询, 录入 a=1, a.b=1 + + + + + + + 多种条件同时查询, 具体支持请看 CloudDBCommand + + + + + + + 设置查询结果返回的字段, a=true a.b=true + + + + + + + 设置查询数据量限制 + + + + + + + 设置查询跳过的数量 + + + + + + + 设置查询的排序方式 + + + + + + + + 获取查询结果 + + + + + + + 获取查询结果 使用 count 语句 + + + + + + + + 基于设置的条件 更新数据 + + + + + + + + 基于设置的条件 删除数据 + + + + + + + 数据库操作符 And + + + + + + + 数据库操作符 Or + + + + + + + 数据库操作 Not or + + + + + + + 数据库操作符 = + + + + + + + 数据库操作符 != + + + + + + + + + 数据库操作符 > + + + + + + + 数据库操作符 >= + + + + + + + 数据库操作符 in + + + + + + + 数据库操作符 not in + + + + + + + 获取抖音云数据单个文档数据 + + + + + + + + 更新单个云文档数据 + + + + + + + + 设置单个云文档数据, 仅会更新已有字段 + + + + + + + + + 删除单个云文档数据 + + + + + + + 游戏收藏 @@ -2007,6 +3176,13 @@ 弹窗文案,仅style为 Tip 时可修改,最多显示 12 个字符。 + + + 调起引导用户复访的提示弹窗,目前仅抖音宿主支持。 + 为了更好的玩家体验,建议在按钮的点击回调中使用。 + + 调起复访提示回调,true表示成功,false表示失败 + 游戏内录屏模块 @@ -2262,6 +3438,118 @@ 函数调用状态,调用成功返回true,否则返回false + + + 金币发放or扣除 + + 订单类型,1-发放金币,2-消耗金币, int + 点位ID,在开发者后台中金币配置中获取, string + 金币数量, int + 开发者自定义的订单号, string + 以上参数使用json的形式传入,例如:{"type":1,"bizId":"xxxxx","goldNum":1,"customId":"xxxx"} + 执行成功的回调函数,会返回平台订单号,例如:{"orderId":"xxxxx"} + 接口调用成功的回调函数 + 接口调用失败的回调函数 + + + + 互推格子模块 + + + + + 游戏互推组件能力 + + GridGamePanelCount,表示游戏推荐组件的格子数量 + 从组件内打开游戏时附带的query信息 + GridGamePanelSize,表示组件大小,large:100%,medium:90%,small:80%。仅 gridCount = one | four 时有效。 + 控制游戏推荐组件的展示位置,不传入时默认展示在屏幕右下角。仅 gridCount = one 时有效。 + + + + + 显示 + + + + + 隐藏 + + + + + 销毁 + + + + + https://developer.open-douyin.com/docs/resource/zh-CN/mini-game/develop/open-capacity/im-group/groupchatintroduce + + + + + 查询用户通过小游戏平台创建的群的信息 + 如游戏开发者在平台创建了群聊 ABC,那么游戏侧可以基于游戏开发者在这个游戏中的 openid,查询其在小游戏平台创建了哪些群,群的状态如何,做游戏内的加群逻辑优化 + + 建群用户的 openid 必填 + 接口调用成功的回调函数 必填 + 接口调用失败的回调函数 必填 + 会话来源 可空 + 附加信息 可空 + + + + 在平台创建群聊,获得 groupid 后,游戏内通过这个方法引导用户加入抖音群 + + 群 ID 必填 + 接口调用成功/失败的回调函数 必填 + 会话来源 可空 + 附加信息 可空 + + + + 开始监听陀螺仪 + + 获取陀螺仪数据的间隔时间,单位为毫秒(ms),默认大小为 50 + 接口调用状态回调,(bool success, string errMsg) => {} + + + + 停止监听陀螺仪 + + 接口调用状态回调,(bool success, string errMsg) => {} + + + + 陀螺仪回调 + + x 轴的角速度。 + y 轴的角速度。 + z 轴的角速度。 + 从设备启动到现在经过的时间戳,单位是 ms。 + 姿态角值,围绕 Z 轴旋转,也叫翻滚角。 + 姿态角值,围绕 X 轴旋转,也叫做俯仰角。 + 姿态角值,围绕 Y 轴旋转,也叫偏航角。 + + + + + 宿主事件监听 + + + + + 添加宿主事件监听 + + 事件名 + 回调函数,(result) => {},宿主事件触发后自动调用 + + + + 移除宿主事件监听 + + 事件名 + 抖音好友邀请状态变化 @@ -2499,19 +3787,6 @@ 当播放的视频被关闭时调用改接口 - - - 显示一个游戏视频,当点击视频时跳转到对应游戏,只能在宿主抖音和头条下使用 - 抖音极速版和头条极速版不支持, - 可通过获取当前的宿主类型。 - 互跳的条目信息可有两个来源,网络动态拉取找对应QA同学配置,本地配置方法见类 - StarkNavigateGame的注释。 - - 跳转返回时调用该方法 - 跳转失败时调用该方法,如没有获取到跳转信息 - 视频界面关闭时的回调 - 跳转到对应游戏时传递的自定义参数 - 直接跳转至目标索引号所代表的游戏 @@ -2546,7 +3821,7 @@ 初始化,从服务器获取导航信息 - + 不开放给用户StarkSDK实现的调用SCPlugin的存储文件的方法 @@ -2738,6 +4013,149 @@ extraInfo string 游戏开发者自定义的其他信息,订单支付成功后通过服务端支付结果回调回传。字符串长度最大不能超过 256 + + + `StarkPlayerPrefs` is a class that stores Player preferences between game sessions. It can store string, float and integer values into the user’s platform registry. + + + + + Sets a single integer value for the preference identified by the given key. You can use StarkPlayerPrefs.GetInt to retrieve this value. + + + + + + + Returns the value corresponding to key in the preference file if it exists. + + + + + + + Sets the float value of the preference identified by the given key. You can use StarkPlayerPrefs.GetFloat to retrieve this value. + + + + + + + Returns the value corresponding to key in the preference file if it exists. + + + + + + + Sets a single string value for the preference identified by the given key. You can use StarkPlayerPrefs.GetString to retrieve this value. + + + + + + + Returns the value corresponding to key in the preference file if it exists. + + + + + + + Returns true if the given key exists in StarkPlayerPrefs, otherwise returns false. + + + + + + Removes the given key from the StarkPlayerPrefs. If the key does not exist, DeleteKey has no impact. + + + + + + Removes all keys and values from the preferences. Use with caution. + + + + + Writes all modified preferences to disk. + + + + https://developer.open-douyin.com/docs/resource/zh-CN/mini-game/develop/open-capacity/game-rank/setImRankData + + 在关键的游戏场景,设置写入用户的排行榜数据(游戏成绩信息),该数据会上传到服务端 + + 0:数字类型、1:枚举类型;数字类型(0)往往适用于游戏的通关分数(103分、105分),枚举类型(1)适用于段位信息(青铜、白银); + 展示出来的数值,dataType == 0 时只能传正数的字符串,否则会报错。value为具体的值,若dataType为0,请传入数字(eg:103、105);若dataType为1,则传入字符串(eg:青铜、白银) + dataType 为 1 时,需要传入这个值判断权重,dataType 为 0 时,不填即可 + 预留字段 + 回调函数 + + + https://developer.open-douyin.com/docs/resource/zh-CN/mini-game/develop/open-capacity/game-rank/setImRankData + + 在关键的游戏场景,设置写入用户的排行榜数据(游戏成绩信息),该数据会上传到服务端 + + 0:数字类型、1:枚举类型;数字类型(0)往往适用于游戏的通关分数(103分、105分),枚举类型(1)适用于段位信息(青铜、白银);--(Require) + 展示出来的数值,dataType == 0 时只能传正数的字符串,否则会报错。value为具体的值,若dataType为0,请传入数字(eg:103、105);若dataType为1,则传入字符串(eg:青铜、白银)--(Require) + dataType 为 1 时,需要传入这个值判断权重,dataType 为 0 时,不填即可--(Require) + 预留字段--(Nullable) + 排行榜分区标识--(Nullable) + 以上参数使用json格式传入,例如"{"dataType":0,"value":"100","priority":0,"zoneId":"default"}" + 回调函数 + + + + 获取排行榜列表,调用 API 后, 根据参数自动绘制游戏好友排行榜 + + 代表数据排序周期,day为当日写入的数据做排序;week为自然周,month为自然月,all为半年 + 由于数字类型的数据与枚举类型的数据无法同时排序,因此需要选择排序哪些类型的数据 + 选择榜单展示范围。default: 好友及总榜都展示,all:仅总榜单 + 数据后缀,最后展示样式为 value + suffix,若suffix传“分”,则展示 103分、104分 + 排行榜标题的文案 + 回调函数 + + + + 获取排行榜列表,调用 API 后, 根据参数自动绘制游戏好友排行榜 + + 代表数据排序周期,day为当日写入的数据做排序;week为自然周,month为自然月,all为半年--(Require) + 由于数字类型的数据与枚举类型的数据无法同时排序,因此需要选择排序哪些类型的数据--(Require) + 选择榜单展示范围。default: 好友及总榜都展示,all:仅总榜单--(Nullable) + 数据后缀,最后展示样式为 value + suffix,若suffix传“分”,则展示 103分、104分--(Nullable) + 排行榜标题的文案--(Nullable) + 排行榜分区标识--(Nullable) + 以上参数使用json格式传入,例如"{"rankType":"week","dataType":0,"relationType":"all","suffix":"分","rankTitle":"","zoneId":"default"}" + 回调函数 + + + + 获取排序好的「好友/总榜」数据源,开发者基于数据源自行渲染返回的数据 + + day、week、month、all + 0:数字类型 、 1:枚举类型 + friend:当前登录用户的好友的游戏数据排行,default:全部写入数据的排行 ,all: 总榜 + 页码,从1开始 + 每页长度,大于 0 小于 40 + 获取成功回调 + 获取失败回调 + + + + 获取排序好的「好友/总榜」数据源,开发者基于数据源自行渲染返回的数据 + + day、week、month、all--(Require) + 0:数字类型 、 1:枚举类型--(Require) + friend:当前登录用户的好友的游戏数据排行,default:全部写入数据的排行 ,all: 总榜--(Require) + 页码,从1开始--(Require) + 每页长度,大于 0 小于 40--(Require) + 排行榜分区标识--(Nullable) + 以上参数使用Json格式传入, + 获取成功回调 + 获取失败回调 + 游戏内网络请求模块 @@ -2788,7 +4206,30 @@ 请求'成功'的回调 请求失败的回调 - + + + 设置是否保持屏幕常亮状态 + + 是否保持屏幕常亮 + 接口调用成功的回调函数 + 接口调用失败的回调函数 + + + + 获取屏幕亮度。 + + 接口调用成功的回调函数,屏幕亮度值,范围 0 ~ 1。0 最暗,1 最亮。 + 接口调用失败的回调函数 + + + + 设置屏幕亮度。 + + 屏幕亮度值,范围 0 ~ 1。(0 最暗,1 最亮) + 接口调用成功的回调函数 + 接口调用失败的回调函数 + + 分享成功 @@ -2826,150 +4267,86 @@ 取消监听用户点击右上角菜单的“转发”按钮时触发的事件。 https://microapp.bytedance.com/docs/zh-CN/mini-game/develop/api/retweet/tt-off-share-app-message - + - 视频播放回调接口 + 通用分享 - 视频在列表中的位置(第一个位置从0开始) + 可填的字段信息参考:https://developer.open-douyin.com/docs/resource/zh-CN/mini-game/develop/api/retweet/tt-share-message-to-friend/ + openId string 是 发送对象的 openId + templateId string 是 分享素材模板 id,指定通过平台审核的 templateId 来选择分享内容,需在平台设置且通过审核 + query string 否 查询字符串,必须是 key1=val1&key2=val2 的格式。从这条转发消息进入后,可通过 tt.getLaunchOptionsSync 或 tt.onShow 获取启动参数中的 query用来实现信息透传 + + 分享成功回调 + 分享失败回调 + 分享取消回调 - + - 视频点击回调 + ShowShareMenu 接口调用成功回调 - + - 文本点击回调 + ShowShareMenu 接口调用失败回调 - + - 播放的视频页发生变化 + ShowShareMenu 接口调用结束回调(调用成功、失败都会执行) - + - 视频播放结束 + 设置小游戏转发按钮为显示状态。 + 转发按钮位于小游戏页面右上角的“更多”中。 + 详细信息:https://developer.open-douyin.com/docs/resource/zh-CN/mini-game/develop/api/retweet/tt-show-share-menu + + 接口调用成功的回调函数 + 接口调用失败的回调函数 + 接口调用结束的回调函数 + + + + HideShareMenu 接口调用成功回调 - + - 视频播放失败 + HideShareMenu 接口调用失败回调 - + - 视频界面关闭回调 + HideShareMenu 接口调用结束回调(调用成功、失败都会执行) - + - 视频播放模块 + 设置小游戏转发按钮为隐藏状态。 + 转发按钮位于小游戏页面右上角的“更多”中。 + 详细信息:https://developer.open-douyin.com/docs/resource/zh-CN/mini-game/develop/api/retweet/tt-hide-share-menu + 接口调用成功的回调函数 + 接口调用失败的回调函数 + 接口调用结束的回调函数 - + - 抖音短视频分享链接 + 确认当前宿主版本是否支持跳转某个小游戏入口场景。 + 需要确认的入口场景(目前仅支持的入参为'sidebar') + 接口调用成功的回调函数, bool为true说明支持,false表示不支持 + 接口调用结束的回调函数(调用成功、失败都会执行) + 接口调用失败的回调函数 - + - 用于显示的文本 + 调用该API可以跳转到某个小游戏入口场景。 - - - - 文本颜色,默认为白色 - - - - - 抖音视频播放 - - 视频列表(如果之前有播放过视频,下次调用时可以传 null 或空列表) - 视频播放回调,具体参见 StarkVideoCallback 定义 - 视频播放窗口的关闭按钮延迟显示时间,单位毫秒,小于等于0则表示立即显示。 - 窗口横坐标位置(相对于屏幕左上角) - 窗口纵坐标位置(相对于屏幕左上角) - 视频播放窗口宽度,小于等于0则占满屏幕宽度 - 视频播放窗口高度,小于等于0则占满屏幕高度 - - - List<StarkVideoManager.StarkVideo> videos = new List<StarkVideoManager.StarkVideo>(); - videos.Add(new StarkVideoManager.StarkVideo("https://v.douyin.com/JppLfuu/", "This is the first video")); - StarkVideoCallback callback = new StarkVideoCallback(); - callback.OnVideoClickedCallback = index => - { - Debug.Log("video clicked, index: " + index); - }; - callback.OnTextClickedCallback = index => - { - Debug.Log("text clicked, index: " + index); - }; - callback.OnVideoPageChanged = index => - { - Debug.Log("video page selected, index: " + index); - if (index + 1 == StarkSDK.API.GetStarkVideoManager().GetVideoCount()) - { - var video = new StarkVideoManager.StarkVideo - { - VideoUrl = "https://v.douyin.com/Jpgo15A/", - VideoText = "This is a new video", - TextColor = 0xff00ff00, - }; - StarkSDK.API.GetStarkVideoManager().AddVideo(video); - // if you want add multiple videos, you can call 'StarkSDK.API.GetStarkVideoManager().AddVideos' to add a video list - } - }; - callback.OnVideoPlayCompleted = index => - { - Debug.Log("video play completed, index: " + index); - }; - callback.OnVideoPlayError = index => - { - Debug.Log("video play error, index: " + index); - }; - - - - - - 关闭窗口 - - - - - 添加视频到播放列表末尾 - - 视频信息 - - - - 添加多个视频到播放列表末尾 - - 视频列表信息 - - - - 获取当前列表中的视频数量 - - 视频数量 - - - - 开始播放当前页展示的视频 - - - - - 暂停当前正在播放的视频 - - - - - 视频是否正在播放 - - 正在播放返回 true ,否则返回 false + 需要确认的入口场景(目前仅支持的入参为'sidebar') + 接口调用成功的回调函数, bool为true说明支持,false表示不支持 + 接口调用结束的回调函数(调用成功、失败都会执行) + 接口调用失败的回调函数 @@ -3012,6 +4389,24 @@ + + + 获取用户已经授权过的配置。 + 结果中只会包含向用户请求过的权限。 + 与 OpenSetting 的区别是 GetSetting 只会获取配置,而不会打开配置页面。 + + 接口调用成功的回调函数 + 接口调用失败的回调函数 + + + + 打开设置页面,返回用户设置过的授权结果。 + 结果中只会包含用户请求过的权限。 + 与 GetSetting 的区别是,OpenSetting 会打开设置页面,而 GetSetting 只会返回用户授权的设置信息。 + 接口调用成功的回调函数 + 接口调用失败的回调函数 + + 用户在实名认证弹窗完成实名认证后回调 @@ -3048,12 +4443,12 @@ Banner广告的Mock模块 - + 分享模块的mock层 - + 分享模块的mock层 @@ -3230,7 +4625,7 @@ 成功回调 失败回调 - + Android Toast提示 @@ -3381,7 +4776,7 @@ 获取当前时间,单位ms - + 创建用于视频裁剪的时间片段 (需要在开始录屏后调用) @@ -4016,206 +5411,75 @@ 参数 回调ID - + - Determines whether the json contains an element that has the specified key. - - The key to locate in the json. - true if the json contains an element that has the specified key; otherwise, false. - - - - Unity声音录制 + `PlayerPrefs` is a class that stores Player preferences between game sessions. It can store string, float and integer values into the user’s platform registry. - + - Unity层使用的接口 - - - - - 开始录屏 - - - - - 停止录屏 - - - - - 开启录制游戏声音 - - - - - 关闭录制游戏声音 - - - - - 设置录制分辨率 - - - - - Unity层使用的接口 - - - - 检查是否有多个ActiveAndEnable AudioListener - - - - Unity声音录制接口 - - - - - 声音采样间隔,单位毫秒 - - - - - 是否需要将PCM从float数组转为byte数组 - - - - - 是否在录制中 - - - - - 提供给Java端通过UnityPlayer.UnitySendMessage("ByteREC","NativeStopRecord","");来停止录屏 - - - - - 提供给Java端通过UnityPlayer.UnitySendMessage("ByteREC","NativeStartRecord","");来启动录屏 - - - - - 提供给Java端通过UnityPlayer.UnitySendMessage("ByteREC","StartRecord","");来触发录制 - - - - - - 提供给Java端通过UnityPlayer.UnitySendMessage("ByteREC","NativeRecordVoice","");来设置是否录音 - - - - - - 设置是否在Unity测转换PCM + Sets a single integer value for the preference identified by the given key. You can use PlayerPrefs.GetInt to retrieve this value. + - + - 支持外部注入RT进行录制 + Returns the value corresponding to key in the preference file if it exists. + + + + + + + Sets the float value of the preference identified by the given key. You can use PlayerPrefs.GetFloat to retrieve this value. + + + + + + + Returns the value corresponding to key in the preference file if it exists. + + + + + + + Sets a single string value for the preference identified by the given key. You can use PlayerPrefs.GetString to retrieve this value. + + + + + + + Returns the value corresponding to key in the preference file if it exists. + + + + + + + Returns true if the given key exists in PlayerPrefs, otherwise returns false. + + + + + + Removes the given key from the PlayerPrefs. If the key does not exist, DeleteKey has no impact. + + + + + + Removes all keys and values from the preferences. Use with caution. - + - Unity层使用的接口 + Writes all modified preferences to disk. - - - Unity版本号,每对外升级一次,自增1,详情见 - - - - - UnityRenderEvent的回调的指针,可以通过 - - - - - - 录制图片 - - - - - - - - - 录制纹理 - - - - - - 传递Unity前后台切换消息 - - - - - - 录音,传递PCM的float数组 - - - - - - - - 录音,传递PCM的byte数组 - - - - - - - - 传递录音的配置参数,JSON格式 - - - - - - 通知JNI DeAttach 当前线程,不然会引起crash - - - - - 设置使用的音频引擎类型:0-unity,1-wwise plugin, 2-wwise mix - - - - - 开始录屏 - - - - - 停止录屏 - - - - - 开启录制游戏声音 - - - - - 关闭录制游戏声音 - - - - - Unity声音录制 - - - - 将数组添加到List里。 - Unicode转utf8编码 diff --git a/Assets/Plugins/ByteGame/com.bytedance.starksdk/Runtime/starksdkRuntime.xml.meta b/Assets/Plugins/ByteGame/com.bytedance.starksdk/starksdk.xml.meta similarity index 75% rename from Assets/Plugins/ByteGame/com.bytedance.starksdk/Runtime/starksdkRuntime.xml.meta rename to Assets/Plugins/ByteGame/com.bytedance.starksdk/starksdk.xml.meta index fe7ac568..70221cfd 100644 --- a/Assets/Plugins/ByteGame/com.bytedance.starksdk/Runtime/starksdkRuntime.xml.meta +++ b/Assets/Plugins/ByteGame/com.bytedance.starksdk/starksdk.xml.meta @@ -1,5 +1,5 @@ fileFormatVersion: 2 -guid: e43a94da5b8aa46dbbd218a8c4f32f8a +guid: 4356e9cc3d7224e8aae63252274f0bef TextScriptImporter: externalObjects: {} userData: diff --git a/Assets/Scripts/UI/CustomControl/EndingCell.cs b/Assets/Scripts/UI/CustomControl/EndingCell.cs index 2348c15c..d37db5d6 100644 --- a/Assets/Scripts/UI/CustomControl/EndingCell.cs +++ b/Assets/Scripts/UI/CustomControl/EndingCell.cs @@ -112,7 +112,7 @@ public class EndingCell : MonoBehaviour private void OnClickAdTip() { - TKGSDKManager.Instance.ShowRewardAd(TKGRVPositionName.RV_sound_unlock, WatchAdSucceed, () => + TKGSDKManager.Instance.ShowRewardAd(HC.HCRVPositionName.RV_sound_unlock, WatchAdSucceed, () => { UIManager.Instance.OpenUI(); }); diff --git a/Assets/Scripts/UI/CustomControl/LevelPage/LevelPage.cs b/Assets/Scripts/UI/CustomControl/LevelPage/LevelPage.cs index eba96e13..4798229f 100644 --- a/Assets/Scripts/UI/CustomControl/LevelPage/LevelPage.cs +++ b/Assets/Scripts/UI/CustomControl/LevelPage/LevelPage.cs @@ -92,7 +92,7 @@ public class LevelPage : PageView private void OnClickUnlockLevel(int pLevelIndex) { - TKGSDKManager.Instance.ShowRewardAd(TKGRVPositionName.RV_level_unlock, (pResult) => + TKGSDKManager.Instance.ShowRewardAd(HC.HCRVPositionName.RV_level_unlock, (pResult) => { if (pResult) { diff --git a/Assets/Scripts/UI/PanelGame.cs b/Assets/Scripts/UI/PanelGame.cs index 15555317..9ccdc8b0 100644 --- a/Assets/Scripts/UI/PanelGame.cs +++ b/Assets/Scripts/UI/PanelGame.cs @@ -53,11 +53,8 @@ public class PanelGame : BasePanel mAni = GetComponent(); -#if H5_DY - mBtnShareGame.gameObject.SetActive(false); -#elif H5_WX + Debug.Log("HC SHARE OR RECORD BTN"); mBtnShareGame.gameObject.SetActive(true); -#endif } public void Init(bool pWithOpening = false) @@ -182,7 +179,7 @@ public class PanelGame : BasePanel { if (!PlayerData.Instance.HasWatchedEndingAdTip(GameConfig.Instance.LevelSort[PlayerData.Instance.CurrentLevel-1], 0)) { - TKGSDKManager.Instance.ShowRewardAd(TKGRVPositionName.RV_GetTips, (_isReward) => + TKGSDKManager.Instance.ShowRewardAd(HC.HCRVPositionName.RV_GetTips, (_isReward) => { if (_isReward) { diff --git a/Assets/Scripts/UI/PanelRecord.cs b/Assets/Scripts/UI/PanelRecord.cs index 46f95b4b..3840ca7f 100644 --- a/Assets/Scripts/UI/PanelRecord.cs +++ b/Assets/Scripts/UI/PanelRecord.cs @@ -1,6 +1,5 @@ using System.Collections; using System.Collections.Generic; -using StarkSDKSpace; using UnityEngine; using UnityEngine.UI; @@ -17,15 +16,15 @@ public class PanelRecord : BasePanel #if H5_WX gameObject.SetActive(false); #elif H5_DY - string platform = StarkSDK.API.GetSystemInfo().platform; - if (platform != null && platform.ToLower().Contains("ios")) - { - gameObject.SetActive(false); - } - Debug.Log("SYSTEM INFO : " + platform); + //string platform = StarkSDK.API.GetSystemInfo().platform; + //if (platform != null && platform.ToLower().Contains("ios")) + //{ + // gameObject.SetActive(false); + //} + //Debug.Log("SYSTEM INFO : " + platform); #endif - - + Debug.Log("HC SHARE OR RECORD BTN"); + gameObject.SetActive(true); mBtnStartRecord.gameObject.SetActive(true); mBtnRecording.gameObject.SetActive(false); mBtnShare.gameObject.SetActive(false); @@ -56,7 +55,7 @@ public class PanelRecord : BasePanel private void OnClickShareGame() { Debug.Log("PanelGame - OnClickShareGame"); -#if H5_DY + _sclCategory = GetSclCategoryState(_sclCategory); Debug.Log("OnClickShareGame, _sclCategory : " + _sclCategory); @@ -65,7 +64,7 @@ public class PanelRecord : BasePanel Debug.Log("分享结束 ----"); }); RefershUI(); -#endif + } private TKGSDKManager.SCLCategory GetSclCategoryState(TKGSDKManager.SCLCategory _sclCategory) diff --git a/Assets/Scripts/UI/PanelResult.cs b/Assets/Scripts/UI/PanelResult.cs index c8b45464..55426dab 100644 --- a/Assets/Scripts/UI/PanelResult.cs +++ b/Assets/Scripts/UI/PanelResult.cs @@ -60,25 +60,27 @@ public class PanelResult : BasePanel UIUtils.BindBtn(mBtnShareSkip, OnClickShareSkip, AudioClipType.Click_Normal); mBtnEndings.DelClick = OnClickShowEndingsDirectly; + Debug.Log("HC SHARE OR RECORD BTN"); - - -#if H5_DY - string platform = StarkSDK.API.GetSystemInfo().platform; - if (platform != null && platform.ToLower().Contains("ios")) - { - mBtnSuccShare.gameObject.SetActive(false); - } - else - { - mBtnSuccShare.gameObject.SetActive(true); - } - + mBtnSuccShare.gameObject.SetActive(true); mBtnShareResult.gameObject.SetActive(false); -#else - mBtnSuccShare.gameObject.SetActive(false); - mBtnShareResult.gameObject.SetActive(true); -#endif + + //#if H5_DY + // //string platform = StarkSDK.API.GetSystemInfo().platform; + // //if (platform != null && platform.ToLower().Contains("ios")) + // //{ + // // mBtnSuccShare.gameObject.SetActive(false); + // //} + // //else + // //{ + // // mBtnSuccShare.gameObject.SetActive(true); + // //} + // mBtnSuccShare.gameObject.SetActive(true); + // mBtnShareResult.gameObject.SetActive(false); + //#else + // mBtnSuccShare.gameObject.SetActive(false); + // mBtnShareResult.gameObject.SetActive(true); + //#endif } public override void OnFocus(bool pFocus) @@ -145,7 +147,7 @@ public class PanelResult : BasePanel if(pLevelID > 0) { Debug.Log("pLevelID > 0 才展示插屏"); - TKGSDKManager.Instance.ShowInterstitialAd(TKGIVAdPositionName.resultpanel); + TKGSDKManager.Instance.ShowInterstitialAd(HC.HCIVPositionName.resultpanel); } } @@ -203,7 +205,7 @@ public class PanelResult : BasePanel { if (!PlayerData.Instance.HasWatchedEndingAdTip(GameConfig.Instance.LevelSort[PlayerData.Instance.CurrentLevel - 1], 0)) { - TKGSDKManager.Instance.ShowRewardAd(TKGRVPositionName.RV_GetTips, (_isReward) => + TKGSDKManager.Instance.ShowRewardAd(HC.HCRVPositionName.RV_GetTips, (_isReward) => { if (_isReward) { @@ -229,7 +231,7 @@ public class PanelResult : BasePanel private void OnClickSkip() { - TKGSDKManager.Instance.ShowRewardAd(TKGRVPositionName.RV_end_skip, (pResult) => + TKGSDKManager.Instance.ShowRewardAd(HC.HCRVPositionName.RV_end_skip, (pResult) => { if (pResult) { diff --git a/Assets/TKGSDK/Common/GameInterface/TKGSDKManager.cs b/Assets/TKGSDK/Common/GameInterface/TKGSDKManager.cs index 21423caa..b4da4246 100644 --- a/Assets/TKGSDK/Common/GameInterface/TKGSDKManager.cs +++ b/Assets/TKGSDK/Common/GameInterface/TKGSDKManager.cs @@ -3,14 +3,14 @@ using System.Collections; using System.Collections.Generic; using UnityEngine; using Touka; +using HC; #if H5_WX using WeChatWASM; #endif #if H5_DY -using StarkSDKSpace; -using StarkSDKSpace.UNBridgeLib.LitJson; +using HC; #endif public class TKGSDKManager : TKGSingleton @@ -109,17 +109,9 @@ public class TKGSDKManager : TKGSingleton public void InitSDK(Action _initCallback = null) { if (isInit) return; - - m_sdkInterface.InitSDK(_initCallback); - isInit = true; - mLoginCount++; - if (IsIAPEnabled) - { -#if USE_IAP - IAPTool.Instance.Initialize(); -#endif - } + HCSDKManager.Instance.InitializeSdk(); + isInit = true; } /// @@ -128,13 +120,13 @@ public class TKGSDKManager : TKGSingleton /// public void SetGameFocusListener(Action _gameFocusAction) { - m_sdkInterface.SetGameFocusListener(_gameFocusAction); + HCSDKManager.Instance.SetGameFocusListener = _gameFocusAction; } // reward click callback public void SetRewardClickListener(Action _clickCallback = null) { - m_sdkInterface.SetRewardClickListener(_clickCallback); + } /// @@ -143,7 +135,7 @@ public class TKGSDKManager : TKGSingleton /// public AppChannel GetChannel() { - return m_sdkInterface.GetChannel(); + return AppChannel.None; } /// @@ -151,15 +143,14 @@ public class TKGSDKManager : TKGSingleton /// public void SetLogEnable(bool _enable) { - StaticOtherConfig.IsDebugLog = _enable; - m_sdkInterface.SetLogEnable(_enable); + } #region Ads // 去广告接口调用 public void PurchasedRemoveAds() { - m_sdkInterface.PurchasedRemoveAds(); + } /// /// Show Interstitial Ad @@ -167,26 +158,9 @@ public class TKGSDKManager : TKGSingleton /// Name of interstitial ad placement. /// Callback of interstitial ad close and show interstitial failed /// IVADType for distinguish interstitial ads frequency, default use iv1 - public void ShowInterstitialAd(TKGIVAdPositionName _adPos, Action _callback = null, IVADType _IvType = IVADType.IV1) + public void ShowInterstitialAd(HCIVPositionName _adPos, Action _callback = null, HCIVADType _IvType = HCIVADType.IV1) { -#if UNITY_EDITOR || NO_AD - if (null != _callback) - { - Debug.Log("Need Show IV, in editor directly invoke callback."); - _callback.Invoke(); - } - return; - -#endif - Debug.Log("TKGSDKManager ShowInterstitialAd pos : " + _adPos.ToString()); - if (IsNoAllAD || IsRemoveAds) - { - _callback?.Invoke(); - } - else - { - m_sdkInterface.ShowInterstitialAd(_adPos, _callback, _IvType); - } + HCSDKManager.Instance.ShowInterstitial(_adPos, _IvType, _callback); } /// @@ -195,34 +169,14 @@ public class TKGSDKManager : TKGSingleton /// Name of reward ad placement /// true:reward succ, false: reward failed /// Callback of reward ad show fail - public void ShowRewardAd(TKGRVPositionName _adPos, Action _rewardCallback = null, Action _showFailedCallback = null) + public void ShowRewardAd(HCRVPositionName _adPos, Action _rewardCallback = null, Action _showFailedCallback = null) { -#if UNITY_EDITOR || NO_AD - if (null != _rewardCallback) - { - _rewardCallback.Invoke(true); - } - return; -#endif - - if (IsNoAllAD) - { - _rewardCallback?.Invoke(true); - } - else - { - m_sdkInterface.ShowRewardAd(_adPos, _rewardCallback, _showFailedCallback); - } + HCSDKManager.Instance.ShowRewardedAd(_adPos,_rewardCallback, _showFailedCallback); } public void ShowNative(RectTransform pRect, Camera pCam = null, string pAdPos = "") { -#if !NO_AD - if (!IsNoAllAD && !IsRemoveAds) - { - m_sdkInterface.ShowNativeAd(pRect, pCam, pAdPos); - } -#endif + } /// @@ -232,7 +186,7 @@ public class TKGSDKManager : TKGSingleton public bool IsReadyInterstitialAd() { - return m_sdkInterface.IsReadyInterstitialAd(); + return HCSDKManager.Instance.IsInterstitialReady(); } @@ -242,7 +196,7 @@ public class TKGSDKManager : TKGSingleton /// public bool IsReadyRewardAd() { - return m_sdkInterface.IsReadyRewardAd(); + return HCSDKManager.Instance.IsRewardedAdReady(); } /// @@ -251,11 +205,7 @@ public class TKGSDKManager : TKGSingleton /// public bool IsReadyNativeAd() { -#if NO_AD return false; -#else - return m_sdkInterface.IsReadyNativeAd(); -#endif } /// @@ -264,12 +214,7 @@ public class TKGSDKManager : TKGSingleton /// bannerAlign public void ShowBanner(TKGBannerAlign _bannerAlign) { -#if !NO_AD - if (!IsNoAllAD && !IsRemoveAds) - { - m_sdkInterface.ShowBanner(_bannerAlign); - } -#endif + HCSDKManager.Instance.ShowBanner(); } /// @@ -277,7 +222,7 @@ public class TKGSDKManager : TKGSingleton /// public void HideBanner() { - m_sdkInterface.HideBanner(); + HCSDKManager.Instance.HideBanner(); } @@ -286,7 +231,6 @@ public class TKGSDKManager : TKGSingleton /// public void RemoveNative() { - m_sdkInterface.RemoveNativeAd(); } #endregion @@ -301,8 +245,7 @@ public class TKGSDKManager : TKGSingleton /// public void LogEvent(string _eventSort) { - m_sdkInterface.LogEvent(_eventSort); - + HCSDKManager.Instance.LogEvent(_eventSort); } /// @@ -313,7 +256,7 @@ public class TKGSDKManager : TKGSingleton /// public void LogEvent(string _eventSort, string _key, string _value) { - m_sdkInterface.LogEvent(_eventSort, _key, _value); + HCSDKManager.Instance.LogEvent(_eventSort,_key,_value); } /// @@ -326,7 +269,7 @@ public class TKGSDKManager : TKGSingleton /// public void LogEvent(string _eventSort, string _key01, string _value01, string _key02, string _value02) { - m_sdkInterface.LogEvent(_eventSort, _key01, _value01, _key02, _value02); + HCSDKManager.Instance.LogEvent(_eventSort, _key01, _value01, _key02, _value02); } /// @@ -334,9 +277,10 @@ public class TKGSDKManager : TKGSingleton /// /// /// - public void LogEvent(string _eventSort, Dictionary _eventDic = null) + public void LogEvent(string _eventSort, Dictionary _eventDic = null) { - m_sdkInterface.LogEvent(_eventSort, _eventDic); + + HCSDKManager.Instance.LogEvent(_eventSort, _eventDic); } #endregion @@ -349,7 +293,8 @@ public class TKGSDKManager : TKGSingleton /// public void LevelStart(int _level) { - LevelStart(_level.ToString()); +// todo + } /// @@ -358,7 +303,7 @@ public class TKGSDKManager : TKGSingleton /// public void LevelStart(string _level) { - m_sdkInterface.LevelStart(_level); + } /// @@ -366,9 +311,9 @@ public class TKGSDKManager : TKGSingleton /// /// /// - public bool LevelEnd(int _level, StageResult _stageResult) + public void LevelEnd(int _level, StageResult _stageResult) { - return LevelEnd(_level.ToString(), _stageResult); + } /// @@ -376,44 +321,14 @@ public class TKGSDKManager : TKGSingleton /// /// /// - public bool LevelEnd(string _level, StageResult _stageResult) + public void LevelEnd(string _level, StageResult _stageResult) { - m_sdkInterface.LevelEnd(_level, _stageResult); - if (_stageResult == StageResult.StageSucc) - { - mPassCount++; -#if UNITY_IOS//only ios has review popup - return !CheckReviewPop(mPassCount); -#endif - } - - return true; } - private bool CheckReviewPop(int pLevel) + private void CheckReviewPop(int pLevel) { - if (mHasPoppedReview) - return false; - - if (mLoginCount == 1 && pLevel == StaticOtherConfig.FirstLoginPopLevel) - { - Debug.Log("pop first review"); - mHasPoppedReview = true; - Review(); - - return true; - } - else if (mLoginCount > 1 && pLevel == StaticOtherConfig.OtherLoginPopLevel) - { - Debug.Log("pop other review"); - mHasPoppedReview = true; - Review(); - - return true; - } - - return false; + HCSDKManager.Instance.Review(); } #endregion @@ -425,7 +340,7 @@ public class TKGSDKManager : TKGSingleton /// public void LogRewardAdBtnShow(string _pos) { - m_sdkInterface.LogRewardAdBtnShow(_pos); + HCSDKManager.Instance.LogRewardBtnShow(_pos); } #endregion @@ -438,7 +353,7 @@ public class TKGSDKManager : TKGSingleton /// private void LogTrackingEvent(TrackingEventType _eventType) { - //m_sdkInterface.LogTrackingEvent(_eventType); + } #endregion @@ -454,8 +369,8 @@ public class TKGSDKManager : TKGSingleton /// public string GetConfigStr(TKGParamKey _key) { - - return m_sdkInterface.GetConfigStr(_key.ToString()); + + return HCSDKManager.Instance.GetRemoteConfigStr(_key.ToString(),""); } /// @@ -465,8 +380,8 @@ public class TKGSDKManager : TKGSingleton /// public int GetConfigInt(TKGParamKey _key) { - - return m_sdkInterface.GetConfigInt(_key.ToString()); + + return HCSDKManager.Instance.GetRemoteConfigInt(_key.ToString(),0); } @@ -477,7 +392,8 @@ public class TKGSDKManager : TKGSingleton /// public bool GetConfigBool(TKGParamKey _key) { - return m_sdkInterface.GetConfigBool(_key.ToString()); + + return HCSDKManager.Instance.GetRemoteConfigBool(_key.ToString(),false); } #endregion @@ -489,7 +405,7 @@ public class TKGSDKManager : TKGSingleton /// public void Review() { - m_sdkInterface.Review(); + HCSDKManager.Instance.Review(); } /// 使用 OpenPolicyPop 接口 === Use OpenPolicyPop @@ -520,7 +436,7 @@ public class TKGSDKManager : TKGSingleton /// public void OpenMoreGame() { - m_sdkInterface.OpenMoreGame(); + } /// @@ -529,12 +445,10 @@ public class TKGSDKManager : TKGSingleton /// public void OpenUrlByBrowser(string _url) { - m_sdkInterface.OpenUrlByBrowser(_url); } public void OpenPolicyPop() { - m_sdkInterface.OpenPolicyPop(); } /// @@ -544,7 +458,6 @@ public class TKGSDKManager : TKGSingleton /// ios 0~1, android any num public void Shake(int _shakeType, float _intensity = 1) { - m_sdkInterface.Shake(_shakeType, _intensity); } /// @@ -553,7 +466,6 @@ public class TKGSDKManager : TKGSingleton /// public void Share(string shareText) { - m_sdkInterface.ShareTxt(shareText); } /// @@ -562,7 +474,6 @@ public class TKGSDKManager : TKGSingleton public void RegistAPNS() { - m_sdkInterface.RegistAPNS(); } /// @@ -577,7 +488,6 @@ public class TKGSDKManager : TKGSingleton public void RegistNotification(string notiId, string body, string fireDate, int badge = 1, string title = "", string subTitle = "") { - m_sdkInterface.RegistNotification(notiId,body,fireDate,badge,title,subTitle); } /// @@ -585,8 +495,6 @@ public class TKGSDKManager : TKGSingleton /// public void RemoveAllNotifications() { - - m_sdkInterface.RemoveAllNotifications(); } /// @@ -596,7 +504,6 @@ public class TKGSDKManager : TKGSingleton public void RemoveNotification(string notiId) { - m_sdkInterface.RemoveNotification(notiId); } #endregion @@ -609,7 +516,6 @@ public class TKGSDKManager : TKGSingleton /// true : origin user,false : not origin user public void SetUserSourceListener(Action _userSourceAction) { - m_sdkInterface.SetUserSourceListener(_userSourceAction); } /// @@ -618,7 +524,6 @@ public class TKGSDKManager : TKGSingleton /// public void SetTKGCommonCallback(Action _commonCallbackAction) { - m_sdkInterface.SetTKGCommonCallback(_commonCallbackAction); } #endregion @@ -653,36 +558,8 @@ public class TKGSDKManager : TKGSingleton public void ShareShareAppMessageByType(ShareType _shareType = ShareType.ShareAppOriginImg) { - Debug.Log("ShareShareAppMessageByType, type : " + _shareType); -#if H5_DY - + HCDebugger.LogDebug("ShareShareAppMessageByType, type : " + _shareType); ShareNormalImg(); - return; -#endif - - //for(int i = 0; i < 30; i++) - //{ - // int tipIndex = GetRandomIndex(); - // string title = GetRandomShareTips(tipIndex); - // string imgurl = string.Format("{0}ShareImg/ShareImg{1}.png", cdnPath, (tipIndex + 1)); - // Debug.Log("title : " + title + " , imgUrl : " + imgurl); - //} - - int tipIndex = GetRandomIndex(); - string img2 = string.Format("{0}ShareImg/ShareImg{1}.png", cdnPath, (tipIndex + 1)); - Debug.Log("img2 : " + img2); - - if (_shareType == ShareType.ShareAppOriginImg) - { -#if !UNITY_EDITOR - ShareAppMessageOriginImg(); -#endif - }else if(_shareType == ShareType.ShareAppFixedImg) - { -#if !UNITY_EDITOR - ShareAppMessageFixedImg(); -#endif - } } public void ShowShareMenu() @@ -771,55 +648,57 @@ public class TKGSDKManager : TKGSingleton /// public void ScreenRecordingLogic(SCLCategory sCLCategory, string title, List topics, System.Action actA = null) { -#if H5_DY - string platform = StarkSDK.API.GetSystemInfo().platform; - if (platform != null && platform.ToLower().Contains("ios")) - { - return; - } - bool flg = StarkSDKSpace.CanIUse.GetStarkGameRecorder; - Debug.Log("can use flg : " + flg + " , sCLCategory : " + sCLCategory); + switch (sCLCategory) { case SCLCategory.开始: - Debug.Log("call StartRecord"); - - StarkSDK.API.GetStarkGameRecorder().StartRecord(true, 600, () => { Debug.Log("开始录制"); }, (errcode, errmsg) => { Debug.Log("录制错误:" + errcode + "," + errmsg); }, (_videoPath)=> { Debug.Log("video path : " + _videoPath); }); + HCDebugger.LogDebug("call StartRecord"); + HCSDKManager.Instance.StartRecord(true, 600, () => { HCDebugger.LogDebug("开始录制"); }, (errcode, errmsg) => { HCDebugger.LogDebug("录制错误:" + errcode + "," + errmsg); }, (_videoPath) => { HCDebugger.LogDebug("video path : " + _videoPath); }); break; case SCLCategory.结束: - Debug.Log("call StopRecord"); - StarkSDK.API.GetStarkGameRecorder().StopRecord((videopath) => { Debug.Log("录制成功,存放路径为" + videopath); }, (err, errmsg) => { Debug.Log("录制错误:" + err + "," + errmsg); }); + HCDebugger.LogDebug("call StopRecord"); + + HCSDKManager.Instance.StopRecord((videopath) => { HCDebugger.LogDebug("录制成功,存放路径为" + videopath); }, (err, errmsg) => { HCDebugger.LogDebug("录制错误:" + err + "," + errmsg); }); break; case SCLCategory.分享: - Debug.Log("call GetVideoRecordState"); - if (StarkSDK.API.GetStarkGameRecorder().GetVideoRecordState() == StarkSDKSpace.StarkGameRecorder.VideoRecordState.RECORD_COMPLETED) + HCDebugger.LogDebug("call GetVideoRecordState"); + int tipIndex = GetRandomIndex(); + string titleTemp = GetRandomShareTips(tipIndex); + HCSDKManager.Instance.DyShareRecordVideo(titleTemp, topics.ToArray(), (_onShareVideoSuccessCallback,msg,resDic) => { - Debug.Log("call 录制结束了,可以分享"); - - int tipIndex = GetRandomIndex(); - string titleTemp = GetRandomShareTips(tipIndex); - - StarkSDKSpace.StarkSDK.API.GetStarkGameRecorder().ShareVideoWithTitleTopics((_onShareVideoSuccessCallback) => { - Debug.Log("分享成功,获得奖励"); actA?.Invoke(); - }, (errMsg) => { - Debug.Log("分享失败:" + errMsg); - if(errMsg.ToLower().Contains("short")) + if (_onShareVideoSuccessCallback) + { + HCDebugger.LogDebug("分享成功,获得奖励"); + actA?.Invoke(); + } + else + { + if (msg.Equals("cancelled")) { - PopupTipsPanel.PopupTips("录制时间少于3s,请重新录制"); + HCDebugger.LogDebug("取消分享"); } else { - PopupTipsPanel.PopupTips("分享失败,请重新录制"); + if (msg.ToLower().Contains("short")) + { + HCDebugger.LogDebug("录制时间少于3s,请重新录制"); + PopupTipsPanel.PopupTips("录制时间少于3s,请重新录制"); + } + else + { + HCDebugger.LogDebug("分享失败,请重新录制"); + PopupTipsPanel.PopupTips("分享失败,请重新录制"); + } } - }, () => { Debug.Log("取消分享"); - }, titleTemp, topics); - } + } + + }); break; default: break; } -#endif + } public enum SCLCategory @@ -832,28 +711,9 @@ public class TKGSDKManager : TKGSingleton public void ShareNormalImg() { -#if H5_DY int tipIndex = GetRandomIndex(); string imgUrl = string.Format("{0}ShareImg/ShareImg{1}.png", cdnPath, (tipIndex + 1)); - JsonData shareJson = new JsonData(); - shareJson["desc"] = GetRandomShareTips(tipIndex); - shareJson["imageUrl"] = imgUrl; - StarkSDK.API.GetStarkShare().ShareAppMessage((_shareSucc) => - { - // Share succeed - - }, (errMsg) => - { - - // Share failed - }, () => - { - - // Share cancelled - }, - shareJson); - -#endif + HCSDKManager.Instance.Share(GetRandomShareTips(tipIndex), imgUrl); } #endregion diff --git a/Assets/TKGSDK/Demo/ToukaSDKDemo.cs b/Assets/TKGSDK/Demo/ToukaSDKDemo.cs index 86392c12..50d44c50 100644 --- a/Assets/TKGSDK/Demo/ToukaSDKDemo.cs +++ b/Assets/TKGSDK/Demo/ToukaSDKDemo.cs @@ -85,7 +85,6 @@ namespace Touka public void OnButton_ShowRewardAd() { Debug.Log("[ToukaSDKDemo] OnButton_ShowRewardAd click"); - TKGSDKManager.Instance.ShowRewardAd(TKGRVPositionName.RV_GetDoubleCoin, RewardResult, RvShowFailed); } /// @@ -172,7 +171,6 @@ namespace Touka TKGSDKManager.Instance.LogEvent("logEvent01"); TKGSDKManager.Instance.LogEvent("logEvent02", "key02", "value02"); TKGSDKManager.Instance.LogEvent("logEvent03", "key03-1", "value03-1", "key03-2", "value03-2"); - TKGSDKManager.Instance.LogEvent("logEvent04", new Dictionary { { "DicKey04", "DicKey04" } }); } diff --git a/Assets/TKGSDK/NativeSDK/Scripts/SDK/TKGNativeInterfaceWebgl.cs b/Assets/TKGSDK/NativeSDK/Scripts/SDK/TKGNativeInterfaceWebgl.cs index f26fccc4..00f71e63 100644 --- a/Assets/TKGSDK/NativeSDK/Scripts/SDK/TKGNativeInterfaceWebgl.cs +++ b/Assets/TKGSDK/NativeSDK/Scripts/SDK/TKGNativeInterfaceWebgl.cs @@ -1,4 +1,4 @@ -#if UNITY_WEBGL || H5_DY +#if UNITY_WEBGL || H5_DY || H5_WX using System; using System.Collections; @@ -8,8 +8,6 @@ using UnityEngine; #if H5_WX using WeChatWASM; -#elif H5_DY -using StarkSDKSpace; #endif namespace Touka @@ -32,12 +30,12 @@ namespace Touka public string DY_IV_ID = "dd5iaf297h193cbbfn"; public string DY_Banner_ID = ""; - private int px2dp(int px) => (int)(px * (160 / Screen.dpi)); - StarkAdManager.BannerStyle m_style = new StarkAdManager.BannerStyle(); - StarkAdManager.BannerAd m_bannerAdIns = null; + //private int px2dp(int px) => (int)(px * (160 / Screen.dpi)); + //StarkAdManager.BannerStyle m_style = new StarkAdManager.BannerStyle(); + //StarkAdManager.BannerAd m_bannerAdIns = null; - StarkAdManager.InterstitialAd m_interstitalAd = null; + //StarkAdManager.InterstitialAd m_interstitalAd = null; #endif @@ -72,11 +70,13 @@ namespace Touka #endif #if H5_DY - StarkSDK.API.GetStarkAdManager(); - StarkAdManager.IsShowLoadAdToast = false; + //StarkSDK.API.GetStarkAdManager(); + //StarkAdManager.IsShowLoadAdToast = false; _initCallback(); initAds(); + + #endif TKGDebugger.LogDebug("init ----- 02"); } @@ -150,11 +150,11 @@ namespace Touka bannerAd.style.top = (int)sysInfo.windowHeight - res.height; }); #elif H5_DY - m_style.width = 320; - m_style.left = 10; - m_style.top = 100; - m_bannerAdIns = StarkSDK.API.GetStarkAdManager().CreateBannerAd(DY_Banner_ID, m_style, 30, - OnAdError, OnBannerLoaded, OnBannerResize); + //m_style.width = 320; + //m_style.left = 10; + //m_style.top = 100; + //m_bannerAdIns = StarkSDK.API.GetStarkAdManager().CreateBannerAd(DY_Banner_ID, m_style, 30, + //OnAdError, OnBannerLoaded, OnBannerResize); #endif } @@ -175,10 +175,10 @@ namespace Touka { Debug.Log("OnBannerLoaded"); - if (m_bannerAdIns != null) + //if (m_bannerAdIns != null) - m_bannerAdIns.Show(); - ChangeBannerStyle(); + // m_bannerAdIns.Show(); + // ChangeBannerStyle(); } /// @@ -193,19 +193,19 @@ namespace Touka private void ChangeBannerStyle() { - int w = m_style.width; //获取banner宽度大小 - int h = m_style.height; //获取banner高度大小 - int sw = px2dp(Screen.width); //获得屏幕宽度(dp) - int sh = px2dp(Screen.height); //获得屏幕高度(dp) + //int w = m_style.width; //获取banner宽度大小 + //int h = m_style.height; //获取banner高度大小 + //int sw = px2dp(Screen.width); //获得屏幕宽度(dp) + //int sh = px2dp(Screen.height); //获得屏幕高度(dp) - m_style.top = sh - h; //底部 - m_style.left = sw / 2 - w / 2; //中央 - m_style.width = w; + //m_style.top = sh - h; //底部 + //m_style.left = sw / 2 - w / 2; //中央 + //m_style.width = w; - if(m_bannerAdIns != null) - { - m_bannerAdIns.ReSize(m_style); //使用Resize函数调整位置和大小 - } + //if(m_bannerAdIns != null) + //{ + // m_bannerAdIns.ReSize(m_style); //使用Resize函数调整位置和大小 + //} } /// @@ -275,7 +275,7 @@ namespace Touka private void CreateAndLoadIV() { - m_interstitalAd = StarkSDK.API.GetStarkAdManager().CreateInterstitialAd(DY_IV_ID, OnIVError, OnIVClose, OnIVLoaded); + //m_interstitalAd = StarkSDK.API.GetStarkAdManager().CreateInterstitialAd(DY_IV_ID, OnIVError, OnIVClose, OnIVLoaded); } private void OnIVError(int errorCode, string errorMsg) @@ -285,19 +285,19 @@ namespace Touka private void OnIVClose() { - if(m_interstitalAd != null) - { - m_interstitalAd.Destory(); - } - m_interstitalAd = null; + //if(m_interstitalAd != null) + //{ + // m_interstitalAd.Destory(); + //} + //m_interstitalAd = null; } private void OnIVLoaded() { - if(m_interstitalAd != null) - { - Debug.Log("m_interstitalAd OnIVLoaded"); - } + //if(m_interstitalAd != null) + //{ + // Debug.Log("m_interstitalAd OnIVLoaded"); + //} } /// @@ -327,26 +327,26 @@ namespace Touka } #elif H5_DY - if(m_interstitalAd != null) - { - Debug.Log("in show iv, m_interstitalAd is not null"); - if (m_interstitalAd.IsLoaded()) - { - Debug.Log("in show iv, m_interstitalAd is loaded"); - m_interstitalAd.Show(); - } - else - { - Debug.Log("in show iv, m_interstitalAd is not loaded"); - m_interstitalAd.Load(); - m_interstitalAd.Show(); - } - } - else - { - Debug.Log("in show iv, m_interstitalAd is null"); - CreateAndLoadIV(); - } + //if(m_interstitalAd != null) + //{ + // Debug.Log("in show iv, m_interstitalAd is not null"); + // if (m_interstitalAd.IsLoaded()) + // { + // Debug.Log("in show iv, m_interstitalAd is loaded"); + // m_interstitalAd.Show(); + // } + // else + // { + // Debug.Log("in show iv, m_interstitalAd is not loaded"); + // m_interstitalAd.Load(); + // m_interstitalAd.Show(); + // } + //} + //else + //{ + // Debug.Log("in show iv, m_interstitalAd is null"); + // CreateAndLoadIV(); + //} #endif } @@ -382,37 +382,37 @@ namespace Touka } #elif H5_DY //抖音 - StarkSDKSpace.StarkSDK.API.GetStarkAdManager().ShowVideoAdWithId(DY_RV_ID, (isdone) => - { - if (isdone) - { - //播放成功 - //RecordEvents("AdComplete", "WhereCompleteAd", title); - Debug.Log("关闭回调,播放成功"); - if (TKGSDKCallback.mRewardCallback != null) - { - TKGSDKCallback.mRewardCallback.Invoke(true); - TKGSDKCallback.mRewardCallback = null; - } - } - else - { - Debug.Log("关闭回调,播放失败"); - if (TKGSDKCallback.mRewardCallback != null) - { - TKGSDKCallback.mRewardCallback.Invoke(false); - TKGSDKCallback.mRewardCallback = null; - } - } - }, (errcode, errmessage) => - { - Debug.Log("失败回调, errorcode : " + errcode + " , errmessage : " + errmessage); - if (TKGSDKCallback.mRewardShowFailedCallback != null) - { - TKGSDKCallback.mRewardShowFailedCallback.Invoke(); - TKGSDKCallback.mRewardShowFailedCallback = null; - } - }, null); + //StarkSDKSpace.StarkSDK.API.GetStarkAdManager().ShowVideoAdWithId(DY_RV_ID, (isdone) => + //{ + // if (isdone) + // { + // //播放成功 + // //RecordEvents("AdComplete", "WhereCompleteAd", title); + // Debug.Log("关闭回调,播放成功"); + // if (TKGSDKCallback.mRewardCallback != null) + // { + // TKGSDKCallback.mRewardCallback.Invoke(true); + // TKGSDKCallback.mRewardCallback = null; + // } + // } + // else + // { + // Debug.Log("关闭回调,播放失败"); + // if (TKGSDKCallback.mRewardCallback != null) + // { + // TKGSDKCallback.mRewardCallback.Invoke(false); + // TKGSDKCallback.mRewardCallback = null; + // } + // } + //}, (errcode, errmessage) => + //{ + // Debug.Log("失败回调, errorcode : " + errcode + " , errmessage : " + errmessage); + // if (TKGSDKCallback.mRewardShowFailedCallback != null) + // { + // TKGSDKCallback.mRewardShowFailedCallback.Invoke(); + // TKGSDKCallback.mRewardShowFailedCallback = null; + // } + //}, null); #endif } diff --git a/Assets/ThirdPlugins/Easy Save 3/Resources/ES3/ES3Defaults.asset b/Assets/ThirdPlugins/Easy Save 3/Resources/ES3/ES3Defaults.asset index 8c9522be..335a9a1c 100644 --- a/Assets/ThirdPlugins/Easy Save 3/Resources/ES3/ES3Defaults.asset +++ b/Assets/ThirdPlugins/Easy Save 3/Resources/ES3/ES3Defaults.asset @@ -29,13 +29,16 @@ MonoBehaviour: referenceMode: 2 serializationDepthLimit: 64 assemblyNames: - - StompyRobot.SRDebugger - Assembly-CSharp - StompyRobot.SRF - - Assembly-CSharp-firstpass - - StompyRobot.SRDebugger.Editor + - StompyRobot.SRDebugger + - ThinkingSDK + - ThinkingAnalytics + - StarkWebGL + - StarkLitJson - PsdPlugin - StompyRobot.SRF.Editor + - StompyRobot.SRDebugger.Editor showAdvancedSettings: 0 addMgrToSceneAutomatically: 0 autoUpdateReferences: 1 diff --git a/Assets/ThirdPlugins/Easy Save 3/Scripts/ES3Prefab.cs b/Assets/ThirdPlugins/Easy Save 3/Scripts/ES3Prefab.cs index 22913dbd..4f62165b 100644 --- a/Assets/ThirdPlugins/Easy Save 3/Scripts/ES3Prefab.cs +++ b/Assets/ThirdPlugins/Easy Save 3/Scripts/ES3Prefab.cs @@ -2,7 +2,7 @@ using UnityEngine; using ES3Internal; #if UNITY_EDITOR -using UnityEditor.Experimental.SceneManagement; + using UnityEditor; #endif @@ -91,7 +91,7 @@ namespace ES3Internal public void GeneratePrefabReferences() { #if UNITY_2018_3_OR_NEWER - if (this.gameObject.scene.name != null || PrefabStageUtility.GetCurrentPrefabStage() != null) + if (this.gameObject.scene.name != null || UnityEditor.SceneManagement.PrefabStageUtility.GetCurrentPrefabStage() != null) #else if (this.gameObject.scene.name != null) #endif diff --git a/Packages/manifest.json b/Packages/manifest.json index c5ba926f..15053c8d 100644 --- a/Packages/manifest.json +++ b/Packages/manifest.json @@ -1,18 +1,18 @@ { "dependencies": { - "com.unity.2d.animation": "3.2.18", - "com.unity.2d.pixel-perfect": "2.1.0", - "com.unity.2d.psdimporter": "2.1.11", + "com.unity.2d.animation": "7.0.8", + "com.unity.2d.pixel-perfect": "5.0.1", + "com.unity.2d.psdimporter": "6.0.6", "com.unity.2d.sprite": "1.0.0", - "com.unity.2d.spriteshape": "3.0.18", + "com.unity.2d.spriteshape": "7.0.6", "com.unity.2d.tilemap": "1.0.0", - "com.unity.collab-proxy": "1.14.18", - "com.unity.ide.rider": "1.2.1", + "com.unity.collab-proxy": "1.17.6", + "com.unity.ide.rider": "3.0.16", "com.unity.ide.visualstudio": "2.0.16", "com.unity.ide.vscode": "1.2.5", "com.unity.test-framework": "1.1.33", - "com.unity.textmeshpro": "2.1.6", - "com.unity.timeline": "1.2.18", + "com.unity.textmeshpro": "3.0.6", + "com.unity.timeline": "1.6.4", "com.unity.ugui": "1.0.0", "com.unity.modules.ai": "1.0.0", "com.unity.modules.androidjni": "1.0.0", diff --git a/Packages/packages-lock.json b/Packages/packages-lock.json index ae1461b7..1753f761 100644 --- a/Packages/packages-lock.json +++ b/Packages/packages-lock.json @@ -1,12 +1,11 @@ { "dependencies": { "com.unity.2d.animation": { - "version": "3.2.18", + "version": "7.0.8", "depth": 0, "source": "registry", "dependencies": { - "com.unity.2d.common": "2.1.2", - "com.unity.mathematics": "1.1.0", + "com.unity.2d.common": "6.0.5", "com.unity.2d.sprite": "1.0.0", "com.unity.modules.animation": "1.0.0", "com.unity.modules.uielements": "1.0.0" @@ -14,36 +13,38 @@ "url": "https://packages.unity.com" }, "com.unity.2d.common": { - "version": "2.1.2", + "version": "6.0.5", "depth": 1, "source": "registry", "dependencies": { "com.unity.2d.sprite": "1.0.0", - "com.unity.modules.uielements": "1.0.0" + "com.unity.mathematics": "1.1.0", + "com.unity.modules.uielements": "1.0.0", + "com.unity.burst": "1.5.1" }, "url": "https://packages.unity.com" }, "com.unity.2d.path": { - "version": "2.1.1", + "version": "5.0.2", "depth": 1, "source": "registry", "dependencies": {}, "url": "https://packages.unity.com" }, "com.unity.2d.pixel-perfect": { - "version": "2.1.0", + "version": "5.0.1", "depth": 0, "source": "registry", "dependencies": {}, "url": "https://packages.unity.com" }, "com.unity.2d.psdimporter": { - "version": "2.1.11", + "version": "6.0.6", "depth": 0, "source": "registry", "dependencies": { - "com.unity.2d.common": "2.1.2", - "com.unity.2d.animation": "3.2.17", + "com.unity.2d.animation": "7.0.8", + "com.unity.2d.common": "6.0.5", "com.unity.2d.sprite": "1.0.0" }, "url": "https://packages.unity.com" @@ -55,13 +56,14 @@ "dependencies": {} }, "com.unity.2d.spriteshape": { - "version": "3.0.18", + "version": "7.0.6", "depth": 0, "source": "registry", "dependencies": { "com.unity.mathematics": "1.1.0", - "com.unity.2d.common": "2.1.0", - "com.unity.2d.path": "2.1.1" + "com.unity.2d.common": "6.0.4", + "com.unity.2d.path": "5.0.2", + "com.unity.modules.physics2d": "1.0.0" }, "url": "https://packages.unity.com" }, @@ -71,11 +73,22 @@ "source": "builtin", "dependencies": {} }, + "com.unity.burst": { + "version": "1.6.6", + "depth": 2, + "source": "registry", + "dependencies": { + "com.unity.mathematics": "1.2.1" + }, + "url": "https://packages.unity.com" + }, "com.unity.collab-proxy": { - "version": "1.14.18", + "version": "1.17.6", "depth": 0, "source": "registry", - "dependencies": {}, + "dependencies": { + "com.unity.services.core": "1.0.1" + }, "url": "https://packages.unity.com" }, "com.unity.ext.nunit": { @@ -86,11 +99,11 @@ "url": "https://packages.unity.com" }, "com.unity.ide.rider": { - "version": "1.2.1", + "version": "3.0.16", "depth": 0, "source": "registry", "dependencies": { - "com.unity.test-framework": "1.1.1" + "com.unity.ext.nunit": "1.0.6" }, "url": "https://packages.unity.com" }, @@ -111,12 +124,30 @@ "url": "https://packages.unity.com" }, "com.unity.mathematics": { - "version": "1.1.0", + "version": "1.2.6", "depth": 1, "source": "registry", "dependencies": {}, "url": "https://packages.unity.com" }, + "com.unity.nuget.newtonsoft-json": { + "version": "3.0.2", + "depth": 2, + "source": "registry", + "dependencies": {}, + "url": "https://packages.unity.com" + }, + "com.unity.services.core": { + "version": "1.6.0", + "depth": 1, + "source": "registry", + "dependencies": { + "com.unity.modules.unitywebrequest": "1.0.0", + "com.unity.nuget.newtonsoft-json": "3.0.2", + "com.unity.modules.androidjni": "1.0.0" + }, + "url": "https://packages.unity.com" + }, "com.unity.test-framework": { "version": "1.1.33", "depth": 0, @@ -129,7 +160,7 @@ "url": "https://packages.unity.com" }, "com.unity.textmeshpro": { - "version": "2.1.6", + "version": "3.0.6", "depth": 0, "source": "registry", "dependencies": { @@ -138,7 +169,7 @@ "url": "https://packages.unity.com" }, "com.unity.timeline": { - "version": "1.2.18", + "version": "1.6.4", "depth": 0, "source": "registry", "dependencies": { @@ -291,6 +322,18 @@ "depth": 0, "source": "builtin", "dependencies": { + "com.unity.modules.ui": "1.0.0", + "com.unity.modules.imgui": "1.0.0", + "com.unity.modules.jsonserialize": "1.0.0", + "com.unity.modules.uielementsnative": "1.0.0" + } + }, + "com.unity.modules.uielementsnative": { + "version": "1.0.0", + "depth": 1, + "source": "builtin", + "dependencies": { + "com.unity.modules.ui": "1.0.0", "com.unity.modules.imgui": "1.0.0", "com.unity.modules.jsonserialize": "1.0.0" } diff --git a/ProjectSettings/ProjectSettings.asset b/ProjectSettings/ProjectSettings.asset index c42d5361..8f0fab8a 100644 --- a/ProjectSettings/ProjectSettings.asset +++ b/ProjectSettings/ProjectSettings.asset @@ -3,7 +3,7 @@ --- !u!129 &1 PlayerSettings: m_ObjectHideFlags: 0 - serializedVersion: 20 + serializedVersion: 23 productGUID: 844c860da179746f4bc4ee365a72a9d8 AndroidProfiler: 0 AndroidFilterTouchesWhenObscured: 0 @@ -49,6 +49,8 @@ PlayerSettings: m_StereoRenderingPath: 0 m_ActiveColorSpace: 0 m_MTRendering: 1 + mipStripping: 0 + numberOfMipsStripped: 0 m_StackTraceTypes: 010000000100000001000000010000000100000001000000 iosShowActivityIndicatorOnLoading: -1 androidShowActivityIndicatorOnLoading: -1 @@ -74,7 +76,7 @@ PlayerSettings: androidFullscreenMode: 1 defaultIsNativeResolution: 1 macRetinaSupport: 1 - runInBackground: 1 + runInBackground: 0 captureSingleScreen: 0 muteOtherAudioSources: 0 Prepare IOS For Recording: 0 @@ -123,7 +125,9 @@ PlayerSettings: stadiaTargetFramerate: 0 vulkanNumSwapchainBuffers: 3 vulkanEnableSetSRGBWrite: 0 + vulkanEnablePreTransform: 0 vulkanEnableLateAcquireNextImage: 0 + vulkanEnableCommandBufferRecycling: 1 m_SupportedAspectRatios: 4:3: 1 5:4: 1 @@ -138,39 +142,16 @@ PlayerSettings: xboxOneDisableKinectGpuReservation: 1 xboxOneEnable7thCore: 1 vrSettings: - cardboard: - depthFormat: 0 - enableTransitionView: 0 - daydream: - depthFormat: 0 - useSustainedPerformanceMode: 0 - enableVideoLayer: 0 - useProtectedVideoMemory: 0 - minimumSupportedHeadTracking: 0 - maximumSupportedHeadTracking: 1 - hololens: - depthFormat: 1 - depthBufferSharingEnabled: 1 - lumin: - depthFormat: 0 - frameTiming: 2 - enableGLCache: 0 - glCacheMaxBlobSize: 524288 - glCacheMaxFileSize: 8388608 - oculus: - sharedDepthBuffer: 1 - dashSupport: 1 - lowOverheadMode: 0 - protectedContext: 0 - v2Signing: 1 enable360StereoCapture: 0 isWsaHolographicRemotingEnabled: 0 enableFrameTimingStats: 0 + enableOpenGLProfilerGPURecorders: 1 useHDRDisplay: 0 D3DHDRBitDepth: 0 m_ColorGamuts: 00000000 targetPixelDensity: 30 resolutionScalingMode: 0 + resetResolutionOnWindowResize: 0 androidSupportedAspectRatio: 1 androidMaxAspectRatio: 2.1 applicationIdentifier: @@ -181,8 +162,9 @@ PlayerSettings: Standalone: 0 iPhone: 1 tvOS: 0 + overrideDefaultApplicationIdentifier: 1 AndroidBundleVersionCode: 1 - AndroidMinSdkVersion: 19 + AndroidMinSdkVersion: 22 AndroidTargetSdkVersion: 0 AndroidPreferredInstallLocation: 1 aotOptions: @@ -234,10 +216,11 @@ PlayerSettings: iOSLaunchScreeniPadFillPct: 100 iOSLaunchScreeniPadSize: 100 iOSLaunchScreeniPadCustomXibPath: - iOSUseLaunchScreenStoryboard: 0 iOSLaunchScreenCustomStoryboardPath: + iOSLaunchScreeniPadCustomStoryboardPath: iOSDeviceRequirements: [] iOSURLSchemes: [] + macOSURLSchemes: [] iOSBackgroundModes: 0 iOSMetalForceHardShadows: 0 metalEditorSupport: 1 @@ -253,28 +236,39 @@ PlayerSettings: iOSRequireARKit: 0 iOSAutomaticallyDetectAndAddCapabilities: 1 appleEnableProMotion: 0 + shaderPrecisionModel: 0 clonedFromGUID: 5f34be1353de5cf4398729fda238591b templatePackageId: com.unity.template.2d@3.3.2 templateDefaultScene: Assets/Scenes/SampleScene.unity + useCustomMainManifest: 0 + useCustomLauncherManifest: 0 + useCustomMainGradleTemplate: 0 + useCustomLauncherGradleManifest: 0 + useCustomBaseGradleTemplate: 0 + useCustomGradlePropertiesTemplate: 0 + useCustomProguardFile: 0 AndroidTargetArchitectures: 3 AndroidTargetDevices: 0 AndroidSplashScreenScale: 0 androidSplashScreen: {fileID: 0} - AndroidKeystoreName: - AndroidKeyaliasName: + AndroidKeystoreName: '{dedicated}: Downloads/user.keystore' + AndroidKeyaliasName: mysticspring AndroidBuildApkPerCpuArchitecture: 0 AndroidTVCompatibility: 0 AndroidIsGame: 1 AndroidEnableTango: 0 androidEnableBanner: 1 androidUseLowAccuracyLocation: 0 - androidUseCustomKeystore: 0 + androidUseCustomKeystore: 1 m_AndroidBanners: - width: 320 height: 180 banner: {fileID: 0} androidGamepadSupportLevel: 0 chromeosInputEmulation: 1 + AndroidMinifyWithR8: 0 + AndroidMinifyRelease: 0 + AndroidMinifyDebug: 0 AndroidValidateAppBundleSize: 1 AndroidAppBundleSizeToValidate: 150 m_BuildTargetIcons: @@ -378,7 +372,105 @@ PlayerSettings: m_Height: 36 m_Kind: 0 m_SubKind: + - m_BuildTarget: iPhone + m_Icons: + - m_Textures: [] + m_Width: 180 + m_Height: 180 + m_Kind: 0 + m_SubKind: iPhone + - m_Textures: [] + m_Width: 120 + m_Height: 120 + m_Kind: 0 + m_SubKind: iPhone + - m_Textures: [] + m_Width: 167 + m_Height: 167 + m_Kind: 0 + m_SubKind: iPad + - m_Textures: [] + m_Width: 152 + m_Height: 152 + m_Kind: 0 + m_SubKind: iPad + - m_Textures: [] + m_Width: 76 + m_Height: 76 + m_Kind: 0 + m_SubKind: iPad + - m_Textures: [] + m_Width: 120 + m_Height: 120 + m_Kind: 3 + m_SubKind: iPhone + - m_Textures: [] + m_Width: 80 + m_Height: 80 + m_Kind: 3 + m_SubKind: iPhone + - m_Textures: [] + m_Width: 80 + m_Height: 80 + m_Kind: 3 + m_SubKind: iPad + - m_Textures: [] + m_Width: 40 + m_Height: 40 + m_Kind: 3 + m_SubKind: iPad + - m_Textures: [] + m_Width: 87 + m_Height: 87 + m_Kind: 1 + m_SubKind: iPhone + - m_Textures: [] + m_Width: 58 + m_Height: 58 + m_Kind: 1 + m_SubKind: iPhone + - m_Textures: [] + m_Width: 29 + m_Height: 29 + m_Kind: 1 + m_SubKind: iPhone + - m_Textures: [] + m_Width: 58 + m_Height: 58 + m_Kind: 1 + m_SubKind: iPad + - m_Textures: [] + m_Width: 29 + m_Height: 29 + m_Kind: 1 + m_SubKind: iPad + - m_Textures: [] + m_Width: 60 + m_Height: 60 + m_Kind: 2 + m_SubKind: iPhone + - m_Textures: [] + m_Width: 40 + m_Height: 40 + m_Kind: 2 + m_SubKind: iPhone + - m_Textures: [] + m_Width: 40 + m_Height: 40 + m_Kind: 2 + m_SubKind: iPad + - m_Textures: [] + m_Width: 20 + m_Height: 20 + m_Kind: 2 + m_SubKind: iPad + - m_Textures: [] + m_Width: 1024 + m_Height: 1024 + m_Kind: 4 + m_SubKind: App Store m_BuildTargetBatching: [] + m_BuildTargetShaderSettings: [] m_BuildTargetGraphicsJobs: - m_BuildTarget: MacStandaloneSupport m_GraphicsJobs: 0 @@ -413,8 +505,8 @@ PlayerSettings: m_GraphicsJobMode: 0 m_BuildTargetGraphicsAPIs: - m_BuildTarget: AndroidPlayer - m_APIs: 150000000b000000 - m_Automatic: 1 + m_APIs: 0b00000008000000 + m_Automatic: 0 - m_BuildTarget: iOSSupport m_APIs: 10000000 m_Automatic: 1 @@ -422,6 +514,8 @@ PlayerSettings: m_APIs: 08000000 m_Automatic: 0 m_BuildTargetVRSettings: [] + m_DefaultShaderChunkSizeInMB: 16 + m_DefaultShaderChunkCount: 0 openGLRequireES31: 0 openGLRequireES31AEP: 0 openGLRequireES32: 0 @@ -432,6 +526,8 @@ PlayerSettings: tvOS: 1 m_BuildTargetGroupLightmapEncodingQuality: [] m_BuildTargetGroupLightmapSettings: [] + m_BuildTargetNormalMapEncoding: [] + m_BuildTargetDefaultTextureCompressionFormat: [] playModeTestRunnerEnabled: 0 runPlayModeTestAsEditModeTest: 0 actionOnDotNetUnhandledException: 1 @@ -441,12 +537,16 @@ PlayerSettings: cameraUsageDescription: locationUsageDescription: microphoneUsageDescription: + bluetoothUsageDescription: + switchNMETAOverride: switchNetLibKey: switchSocketMemoryPoolSize: 6144 switchSocketAllocatorPoolSize: 128 switchSocketConcurrencyLimit: 14 switchScreenResolutionBehavior: 2 switchUseCPUProfiler: 0 + switchUseGOLDLinker: 0 + switchLTOSetting: 0 switchApplicationID: 0x01004b9000490000 switchNSODependencies: switchTitleNames_0: @@ -575,8 +675,11 @@ PlayerSettings: switchSocketInitializeEnabled: 1 switchNetworkInterfaceManagerInitializeEnabled: 1 switchPlayerConnectionEnabled: 1 + switchUseNewStyleFilepaths: 0 switchUseMicroSleepForYield: 1 + switchEnableRamDiskSupport: 0 switchMicroSleepForYieldTime: 25 + switchRamDiskSpaceSize: 12 ps4NPAgeRating: 12 ps4NPTitleSecret: ps4NPTrophyPackPath: @@ -652,53 +755,32 @@ PlayerSettings: ps4attribEyeToEyeDistanceSettingVR: 0 ps4IncludedModules: [] ps4attribVROutputEnabled: 0 - ps5ParamFilePath: - ps5VideoOutPixelFormat: 0 - ps5VideoOutInitialWidth: 1920 - ps5VideoOutOutputMode: 1 - ps5BackgroundImagePath: - ps5StartupImagePath: - ps5Pic2Path: - ps5StartupImagesFolder: - ps5IconImagesFolder: - ps5SaveDataImagePath: - ps5SdkOverride: - ps5BGMPath: - ps5ShareOverlayImagePath: - ps5NPConfigZipPath: - ps5Passcode: 5PN2qmWqBlQ9wQj99nsQzldVI5ZuGXbE - ps5UseResolutionFallback: 0 - ps5UseAudio3dBackend: 0 - ps5ScriptOptimizationLevel: 2 - ps5Audio3dVirtualSpeakerCount: 14 - ps5UpdateReferencePackage: - ps5disableAutoHideSplash: 0 - ps5OperatingSystemCanDisableSplashScreen: 0 - ps5IncludedModules: [] - ps5SharedBinaryContentLabels: [] - ps5SharedBinarySystemFolders: [] monoEnv: splashScreenBackgroundSourceLandscape: {fileID: 0} splashScreenBackgroundSourcePortrait: {fileID: 0} blurSplashScreenBackground: 1 spritePackerPolicy: - webGLMemorySize: 16 + webGLMemorySize: 512 webGLExceptionSupport: 1 webGLNameFilesAsHashes: 0 webGLDataCaching: 0 - webGLDebugSymbols: 0 - webGLEmscriptenArgs: + webGLDebugSymbols: 1 + webGLEmscriptenArgs: ' -s TOTAL_MEMORY=512MB' webGLModulesDirectory: webGLTemplate: APPLICATION:Default webGLAnalyzeBuildSize: 0 webGLUseEmbeddedResources: 0 webGLCompressionFormat: 2 + webGLWasmArithmeticExceptions: 0 webGLLinkerTarget: 1 webGLThreadsSupport: 0 - webGLWasmStreaming: 0 + webGLDecompressionFallback: 0 + webGLPowerPreference: 2 scriptingDefineSymbols: - 0: H5_DY - 7: H5_DY + : H5_DY + Android: H5_DY;WEBGL_BYTEDANCE + WebGL: WEBGL_BYTEDANCE + additionalCompilerArguments: {} platformArchitecture: {} scriptingBackend: Android: 1 @@ -707,6 +789,9 @@ PlayerSettings: incrementalIl2cppBuild: {} suppressCommonWarnings: 1 allowUnsafeCode: 0 + useDeterministicCompilation: 1 + enableRoslynAnalyzers: 1 + selectedPlatform: 2 additionalIl2CppArgs: scriptingRuntimeVersion: 1 gcIncremental: 0 @@ -742,6 +827,7 @@ PlayerSettings: metroFTAName: metroFTAFileTypes: [] metroProtocolName: + vcxProjDefaultLanguage: XboxOneProductId: XboxOneUpdateKey: XboxOneSandboxId: @@ -769,10 +855,7 @@ PlayerSettings: XboxOneXTitleMemory: 8 XboxOneOverrideIdentityName: XboxOneOverrideIdentityPublisher: - vrEditorSettings: - daydream: - daydreamIconForeground: {fileID: 0} - daydreamIconBackground: {fileID: 0} + vrEditorSettings: {} cloudServicesEnabled: UNet: 1 luminIcon: @@ -787,11 +870,15 @@ PlayerSettings: m_VersionCode: 1 m_VersionName: apiCompatibilityLevel: 6 + activeInputHandler: 0 + windowsGamepadBackendHint: 0 cloudProjectId: framebufferDepthMemorylessMode: 0 + qualitySettingsNames: [] projectName: organizationId: cloudEnabled: 0 - enableNativePlatformBackendsForNewInputSystem: 0 - disableOldInputManagerSupport: 0 legacyClampBlendShapeWeights: 0 + playerDataPath: + forceSRGBBlit: 1 + virtualTexturingSupportEnabled: 0 diff --git a/ProjectSettings/ProjectVersion.txt b/ProjectSettings/ProjectVersion.txt index 89a11d71..6a95707e 100644 --- a/ProjectSettings/ProjectVersion.txt +++ b/ProjectSettings/ProjectVersion.txt @@ -1,2 +1,2 @@ -m_EditorVersion: 2019.4.35f1 -m_EditorVersionWithRevision: 2019.4.35f1 (0462406dff2e) +m_EditorVersion: 2021.3.14f1 +m_EditorVersionWithRevision: 2021.3.14f1 (eee1884e7226) diff --git a/qrcodes/qrcode-20240307192825.png b/qrcodes/qrcode-20240307192825.png new file mode 100644 index 00000000..d859fac2 Binary files /dev/null and b/qrcodes/qrcode-20240307192825.png differ diff --git a/qrcodes/qrcode-20240307194145.png b/qrcodes/qrcode-20240307194145.png new file mode 100644 index 00000000..224405a6 Binary files /dev/null and b/qrcodes/qrcode-20240307194145.png differ