diff --git a/microscript/ILibDuktape_Polyfills.c b/microscript/ILibDuktape_Polyfills.c index b9a13c6..5f08751 100644 --- a/microscript/ILibDuktape_Polyfills.c +++ b/microscript/ILibDuktape_Polyfills.c @@ -46,6 +46,208 @@ typedef enum ILibDuktape_Console_DestinationFlags ILibDuktape_Console_DestinationFlags_LogFile = 8 }ILibDuktape_Console_DestinationFlags; + +// refer to ../modules/promise.js for the human readable source +char promise[] = +{ + 0x2F,0x2A,0x0A,0x43,0x6F,0x70,0x79,0x72,0x69,0x67,0x68,0x74,0x20,0x32,0x30,0x31,0x38,0x20,0x49,0x6E,0x74,0x65,0x6C,0x20,0x43,0x6F,0x72,0x70,0x6F,0x72,0x61,0x74, + 0x69,0x6F,0x6E,0x0A,0x0A,0x4C,0x69,0x63,0x65,0x6E,0x73,0x65,0x64,0x20,0x75,0x6E,0x64,0x65,0x72,0x20,0x74,0x68,0x65,0x20,0x41,0x70,0x61,0x63,0x68,0x65,0x20,0x4C, + 0x69,0x63,0x65,0x6E,0x73,0x65,0x2C,0x20,0x56,0x65,0x72,0x73,0x69,0x6F,0x6E,0x20,0x32,0x2E,0x30,0x20,0x28,0x74,0x68,0x65,0x20,0x22,0x4C,0x69,0x63,0x65,0x6E,0x73, + 0x65,0x22,0x29,0x3B,0x0A,0x79,0x6F,0x75,0x20,0x6D,0x61,0x79,0x20,0x6E,0x6F,0x74,0x20,0x75,0x73,0x65,0x20,0x74,0x68,0x69,0x73,0x20,0x66,0x69,0x6C,0x65,0x20,0x65, + 0x78,0x63,0x65,0x70,0x74,0x20,0x69,0x6E,0x20,0x63,0x6F,0x6D,0x70,0x6C,0x69,0x61,0x6E,0x63,0x65,0x20,0x77,0x69,0x74,0x68,0x20,0x74,0x68,0x65,0x20,0x4C,0x69,0x63, + 0x65,0x6E,0x73,0x65,0x2E,0x0A,0x59,0x6F,0x75,0x20,0x6D,0x61,0x79,0x20,0x6F,0x62,0x74,0x61,0x69,0x6E,0x20,0x61,0x20,0x63,0x6F,0x70,0x79,0x20,0x6F,0x66,0x20,0x74, + 0x68,0x65,0x20,0x4C,0x69,0x63,0x65,0x6E,0x73,0x65,0x20,0x61,0x74,0x0A,0x0A,0x20,0x20,0x20,0x20,0x68,0x74,0x74,0x70,0x3A,0x2F,0x2F,0x77,0x77,0x77,0x2E,0x61,0x70, + 0x61,0x63,0x68,0x65,0x2E,0x6F,0x72,0x67,0x2F,0x6C,0x69,0x63,0x65,0x6E,0x73,0x65,0x73,0x2F,0x4C,0x49,0x43,0x45,0x4E,0x53,0x45,0x2D,0x32,0x2E,0x30,0x0A,0x0A,0x55, + 0x6E,0x6C,0x65,0x73,0x73,0x20,0x72,0x65,0x71,0x75,0x69,0x72,0x65,0x64,0x20,0x62,0x79,0x20,0x61,0x70,0x70,0x6C,0x69,0x63,0x61,0x62,0x6C,0x65,0x20,0x6C,0x61,0x77, + 0x20,0x6F,0x72,0x20,0x61,0x67,0x72,0x65,0x65,0x64,0x20,0x74,0x6F,0x20,0x69,0x6E,0x20,0x77,0x72,0x69,0x74,0x69,0x6E,0x67,0x2C,0x20,0x73,0x6F,0x66,0x74,0x77,0x61, + 0x72,0x65,0x0A,0x64,0x69,0x73,0x74,0x72,0x69,0x62,0x75,0x74,0x65,0x64,0x20,0x75,0x6E,0x64,0x65,0x72,0x20,0x74,0x68,0x65,0x20,0x4C,0x69,0x63,0x65,0x6E,0x73,0x65, + 0x20,0x69,0x73,0x20,0x64,0x69,0x73,0x74,0x72,0x69,0x62,0x75,0x74,0x65,0x64,0x20,0x6F,0x6E,0x20,0x61,0x6E,0x20,0x22,0x41,0x53,0x20,0x49,0x53,0x22,0x20,0x42,0x41, + 0x53,0x49,0x53,0x2C,0x0A,0x57,0x49,0x54,0x48,0x4F,0x55,0x54,0x20,0x57,0x41,0x52,0x52,0x41,0x4E,0x54,0x49,0x45,0x53,0x20,0x4F,0x52,0x20,0x43,0x4F,0x4E,0x44,0x49, + 0x54,0x49,0x4F,0x4E,0x53,0x20,0x4F,0x46,0x20,0x41,0x4E,0x59,0x20,0x4B,0x49,0x4E,0x44,0x2C,0x20,0x65,0x69,0x74,0x68,0x65,0x72,0x20,0x65,0x78,0x70,0x72,0x65,0x73, + 0x73,0x20,0x6F,0x72,0x20,0x69,0x6D,0x70,0x6C,0x69,0x65,0x64,0x2E,0x0A,0x53,0x65,0x65,0x20,0x74,0x68,0x65,0x20,0x4C,0x69,0x63,0x65,0x6E,0x73,0x65,0x20,0x66,0x6F, + 0x72,0x20,0x74,0x68,0x65,0x20,0x73,0x70,0x65,0x63,0x69,0x66,0x69,0x63,0x20,0x6C,0x61,0x6E,0x67,0x75,0x61,0x67,0x65,0x20,0x67,0x6F,0x76,0x65,0x72,0x6E,0x69,0x6E, + 0x67,0x20,0x70,0x65,0x72,0x6D,0x69,0x73,0x73,0x69,0x6F,0x6E,0x73,0x20,0x61,0x6E,0x64,0x0A,0x6C,0x69,0x6D,0x69,0x74,0x61,0x74,0x69,0x6F,0x6E,0x73,0x20,0x75,0x6E, + 0x64,0x65,0x72,0x20,0x74,0x68,0x65,0x20,0x4C,0x69,0x63,0x65,0x6E,0x73,0x65,0x2E,0x0A,0x2A,0x2F,0x0A,0x0A,0x76,0x61,0x72,0x20,0x72,0x65,0x66,0x54,0x61,0x62,0x6C, + 0x65,0x20,0x3D,0x20,0x7B,0x7D,0x3B,0x0A,0x0A,0x66,0x75,0x6E,0x63,0x74,0x69,0x6F,0x6E,0x20,0x65,0x76,0x65,0x6E,0x74,0x5F,0x73,0x77,0x69,0x74,0x63,0x68,0x65,0x72, + 0x5F,0x68,0x65,0x6C,0x70,0x65,0x72,0x28,0x64,0x65,0x73,0x69,0x72,0x65,0x64,0x5F,0x63,0x61,0x6C,0x6C,0x65,0x65,0x2C,0x20,0x74,0x61,0x72,0x67,0x65,0x74,0x29,0x0A, + 0x7B,0x0A,0x20,0x20,0x20,0x20,0x74,0x68,0x69,0x73,0x2E,0x5F,0x4F,0x62,0x6A,0x65,0x63,0x74,0x49,0x44,0x20,0x3D,0x20,0x27,0x65,0x76,0x65,0x6E,0x74,0x5F,0x73,0x77, + 0x69,0x74,0x63,0x68,0x65,0x72,0x27,0x3B,0x0A,0x20,0x20,0x20,0x20,0x74,0x68,0x69,0x73,0x2E,0x66,0x75,0x6E,0x63,0x20,0x3D,0x20,0x66,0x75,0x6E,0x63,0x74,0x69,0x6F, + 0x6E,0x20,0x66,0x75,0x6E,0x63,0x28,0x29,0x0D,0x0A,0x20,0x20,0x20,0x20,0x7B,0x0D,0x0A,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x76,0x61,0x72,0x20,0x61,0x72,0x67, + 0x73,0x20,0x3D,0x20,0x5B,0x5D,0x3B,0x0D,0x0A,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x66,0x6F,0x72,0x28,0x76,0x61,0x72,0x20,0x69,0x20,0x69,0x6E,0x20,0x61,0x72, + 0x67,0x75,0x6D,0x65,0x6E,0x74,0x73,0x29,0x0D,0x0A,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x7B,0x0D,0x0A,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20, + 0x20,0x61,0x72,0x67,0x73,0x2E,0x70,0x75,0x73,0x68,0x28,0x61,0x72,0x67,0x75,0x6D,0x65,0x6E,0x74,0x73,0x5B,0x69,0x5D,0x29,0x3B,0x0D,0x0A,0x20,0x20,0x20,0x20,0x20, + 0x20,0x20,0x20,0x7D,0x0D,0x0A,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x72,0x65,0x74,0x75,0x72,0x6E,0x20,0x28,0x66,0x75,0x6E,0x63,0x2E,0x74,0x61,0x72,0x67,0x65, + 0x74,0x2E,0x61,0x70,0x70,0x6C,0x79,0x28,0x66,0x75,0x6E,0x63,0x2E,0x64,0x65,0x73,0x69,0x72,0x65,0x64,0x2C,0x20,0x61,0x72,0x67,0x73,0x29,0x29,0x3B,0x0D,0x0A,0x20, + 0x20,0x20,0x20,0x7D,0x3B,0x0D,0x0A,0x20,0x20,0x20,0x20,0x74,0x68,0x69,0x73,0x2E,0x66,0x75,0x6E,0x63,0x2E,0x64,0x65,0x73,0x69,0x72,0x65,0x64,0x20,0x3D,0x20,0x64, + 0x65,0x73,0x69,0x72,0x65,0x64,0x5F,0x63,0x61,0x6C,0x6C,0x65,0x65,0x3B,0x0D,0x0A,0x20,0x20,0x20,0x20,0x74,0x68,0x69,0x73,0x2E,0x66,0x75,0x6E,0x63,0x2E,0x74,0x61, + 0x72,0x67,0x65,0x74,0x20,0x3D,0x20,0x74,0x61,0x72,0x67,0x65,0x74,0x3B,0x0D,0x0A,0x20,0x20,0x20,0x20,0x74,0x68,0x69,0x73,0x2E,0x66,0x75,0x6E,0x63,0x2E,0x73,0x65, + 0x6C,0x66,0x20,0x3D,0x20,0x74,0x68,0x69,0x73,0x3B,0x0D,0x0A,0x7D,0x0A,0x66,0x75,0x6E,0x63,0x74,0x69,0x6F,0x6E,0x20,0x65,0x76,0x65,0x6E,0x74,0x5F,0x73,0x77,0x69, + 0x74,0x63,0x68,0x65,0x72,0x28,0x64,0x65,0x73,0x69,0x72,0x65,0x64,0x5F,0x63,0x61,0x6C,0x6C,0x65,0x65,0x2C,0x20,0x74,0x61,0x72,0x67,0x65,0x74,0x29,0x0A,0x7B,0x0D, + 0x0A,0x20,0x20,0x20,0x20,0x72,0x65,0x74,0x75,0x72,0x6E,0x20,0x28,0x6E,0x65,0x77,0x20,0x65,0x76,0x65,0x6E,0x74,0x5F,0x73,0x77,0x69,0x74,0x63,0x68,0x65,0x72,0x5F, + 0x68,0x65,0x6C,0x70,0x65,0x72,0x28,0x64,0x65,0x73,0x69,0x72,0x65,0x64,0x5F,0x63,0x61,0x6C,0x6C,0x65,0x65,0x2C,0x20,0x74,0x61,0x72,0x67,0x65,0x74,0x29,0x29,0x3B, + 0x0D,0x0A,0x7D,0x0A,0x0A,0x66,0x75,0x6E,0x63,0x74,0x69,0x6F,0x6E,0x20,0x50,0x72,0x6F,0x6D,0x69,0x73,0x65,0x28,0x70,0x72,0x6F,0x6D,0x69,0x73,0x65,0x46,0x75,0x6E, + 0x63,0x29,0x0A,0x7B,0x0A,0x20,0x20,0x20,0x20,0x74,0x68,0x69,0x73,0x2E,0x5F,0x4F,0x62,0x6A,0x65,0x63,0x74,0x49,0x44,0x20,0x3D,0x20,0x27,0x70,0x72,0x6F,0x6D,0x69, + 0x73,0x65,0x27,0x3B,0x0A,0x20,0x20,0x20,0x20,0x74,0x68,0x69,0x73,0x2E,0x70,0x72,0x6F,0x6D,0x69,0x73,0x65,0x20,0x3D,0x20,0x74,0x68,0x69,0x73,0x3B,0x0A,0x20,0x20, + 0x20,0x20,0x74,0x68,0x69,0x73,0x2E,0x5F,0x69,0x6E,0x74,0x65,0x72,0x6E,0x61,0x6C,0x20,0x3D,0x20,0x7B,0x20,0x5F,0x4F,0x62,0x6A,0x65,0x63,0x74,0x49,0x44,0x3A,0x20, + 0x27,0x70,0x72,0x6F,0x6D,0x69,0x73,0x65,0x2E,0x69,0x6E,0x74,0x65,0x72,0x6E,0x61,0x6C,0x27,0x2C,0x20,0x70,0x72,0x6F,0x6D,0x69,0x73,0x65,0x3A,0x20,0x74,0x68,0x69, + 0x73,0x2C,0x20,0x66,0x75,0x6E,0x63,0x3A,0x20,0x70,0x72,0x6F,0x6D,0x69,0x73,0x65,0x46,0x75,0x6E,0x63,0x2C,0x20,0x63,0x6F,0x6D,0x70,0x6C,0x65,0x74,0x65,0x64,0x3A, + 0x20,0x66,0x61,0x6C,0x73,0x65,0x2C,0x20,0x65,0x72,0x72,0x6F,0x72,0x73,0x3A,0x20,0x66,0x61,0x6C,0x73,0x65,0x2C,0x20,0x63,0x6F,0x6D,0x70,0x6C,0x65,0x74,0x65,0x64, + 0x41,0x72,0x67,0x73,0x3A,0x20,0x5B,0x5D,0x20,0x7D,0x3B,0x0A,0x20,0x20,0x20,0x20,0x72,0x65,0x71,0x75,0x69,0x72,0x65,0x28,0x27,0x65,0x76,0x65,0x6E,0x74,0x73,0x27, + 0x29,0x2E,0x45,0x76,0x65,0x6E,0x74,0x45,0x6D,0x69,0x74,0x74,0x65,0x72,0x2E,0x63,0x61,0x6C,0x6C,0x28,0x74,0x68,0x69,0x73,0x2E,0x5F,0x69,0x6E,0x74,0x65,0x72,0x6E, + 0x61,0x6C,0x29,0x3B,0x0A,0x20,0x20,0x20,0x20,0x74,0x68,0x69,0x73,0x2E,0x5F,0x69,0x6E,0x74,0x65,0x72,0x6E,0x61,0x6C,0x2E,0x6F,0x6E,0x28,0x27,0x5F,0x65,0x76,0x65, + 0x6E,0x74,0x48,0x6F,0x6F,0x6B,0x27,0x2C,0x20,0x66,0x75,0x6E,0x63,0x74,0x69,0x6F,0x6E,0x20,0x28,0x65,0x76,0x65,0x6E,0x74,0x4E,0x61,0x6D,0x65,0x2C,0x20,0x65,0x76, + 0x65,0x6E,0x74,0x43,0x61,0x6C,0x6C,0x62,0x61,0x63,0x6B,0x29,0x0A,0x20,0x20,0x20,0x20,0x7B,0x0A,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x2F,0x2F,0x63,0x6F,0x6E, + 0x73,0x6F,0x6C,0x65,0x2E,0x6C,0x6F,0x67,0x28,0x27,0x68,0x6F,0x6F,0x6B,0x27,0x2C,0x20,0x65,0x76,0x65,0x6E,0x74,0x4E,0x61,0x6D,0x65,0x2C,0x20,0x27,0x65,0x72,0x72, + 0x6F,0x72,0x73,0x2F,0x27,0x20,0x2B,0x20,0x74,0x68,0x69,0x73,0x2E,0x65,0x72,0x72,0x6F,0x72,0x73,0x20,0x2B,0x20,0x27,0x20,0x63,0x6F,0x6D,0x70,0x6C,0x65,0x74,0x65, + 0x64,0x2F,0x27,0x20,0x2B,0x20,0x74,0x68,0x69,0x73,0x2E,0x63,0x6F,0x6D,0x70,0x6C,0x65,0x74,0x65,0x64,0x29,0x3B,0x0A,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x76, + 0x61,0x72,0x20,0x72,0x20,0x3D,0x20,0x6E,0x75,0x6C,0x6C,0x3B,0x0A,0x0A,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x69,0x66,0x20,0x28,0x65,0x76,0x65,0x6E,0x74,0x4E, + 0x61,0x6D,0x65,0x20,0x3D,0x3D,0x20,0x27,0x72,0x65,0x73,0x6F,0x6C,0x76,0x65,0x64,0x27,0x20,0x26,0x26,0x20,0x21,0x74,0x68,0x69,0x73,0x2E,0x65,0x72,0x72,0x6F,0x72, + 0x73,0x20,0x26,0x26,0x20,0x74,0x68,0x69,0x73,0x2E,0x63,0x6F,0x6D,0x70,0x6C,0x65,0x74,0x65,0x64,0x29,0x0A,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x7B,0x0A,0x20, + 0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x72,0x20,0x3D,0x20,0x65,0x76,0x65,0x6E,0x74,0x43,0x61,0x6C,0x6C,0x62,0x61,0x63,0x6B,0x2E,0x61,0x70,0x70, + 0x6C,0x79,0x28,0x74,0x68,0x69,0x73,0x2C,0x20,0x74,0x68,0x69,0x73,0x2E,0x63,0x6F,0x6D,0x70,0x6C,0x65,0x74,0x65,0x64,0x41,0x72,0x67,0x73,0x29,0x3B,0x0A,0x20,0x20, + 0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x69,0x66,0x28,0x72,0x21,0x3D,0x6E,0x75,0x6C,0x6C,0x29,0x0A,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20, + 0x20,0x20,0x7B,0x0A,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x74,0x68,0x69,0x73,0x2E,0x65,0x6D,0x69,0x74,0x5F,0x72,0x65, + 0x74,0x75,0x72,0x6E,0x56,0x61,0x6C,0x75,0x65,0x28,0x27,0x72,0x65,0x73,0x6F,0x6C,0x76,0x65,0x64,0x27,0x2C,0x20,0x72,0x29,0x3B,0x0A,0x20,0x20,0x20,0x20,0x20,0x20, + 0x20,0x20,0x20,0x20,0x20,0x20,0x7D,0x0A,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x7D,0x0A,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x69,0x66,0x20,0x28,0x65,0x76, + 0x65,0x6E,0x74,0x4E,0x61,0x6D,0x65,0x20,0x3D,0x3D,0x20,0x27,0x72,0x65,0x6A,0x65,0x63,0x74,0x65,0x64,0x27,0x20,0x26,0x26,0x20,0x74,0x68,0x69,0x73,0x2E,0x65,0x72, + 0x72,0x6F,0x72,0x73,0x20,0x26,0x26,0x20,0x74,0x68,0x69,0x73,0x2E,0x63,0x6F,0x6D,0x70,0x6C,0x65,0x74,0x65,0x64,0x29,0x0A,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20, + 0x7B,0x0A,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x65,0x76,0x65,0x6E,0x74,0x43,0x61,0x6C,0x6C,0x62,0x61,0x63,0x6B,0x2E,0x61,0x70,0x70,0x6C, + 0x79,0x28,0x74,0x68,0x69,0x73,0x2C,0x20,0x74,0x68,0x69,0x73,0x2E,0x63,0x6F,0x6D,0x70,0x6C,0x65,0x74,0x65,0x64,0x41,0x72,0x67,0x73,0x29,0x3B,0x0A,0x20,0x20,0x20, + 0x20,0x20,0x20,0x20,0x20,0x7D,0x0A,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x69,0x66,0x20,0x28,0x65,0x76,0x65,0x6E,0x74,0x4E,0x61,0x6D,0x65,0x20,0x3D,0x3D,0x20, + 0x27,0x73,0x65,0x74,0x74,0x6C,0x65,0x64,0x27,0x20,0x26,0x26,0x20,0x74,0x68,0x69,0x73,0x2E,0x63,0x6F,0x6D,0x70,0x6C,0x65,0x74,0x65,0x64,0x29,0x0A,0x20,0x20,0x20, + 0x20,0x20,0x20,0x20,0x20,0x7B,0x0A,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x65,0x76,0x65,0x6E,0x74,0x43,0x61,0x6C,0x6C,0x62,0x61,0x63,0x6B, + 0x2E,0x61,0x70,0x70,0x6C,0x79,0x28,0x74,0x68,0x69,0x73,0x2C,0x20,0x5B,0x5D,0x29,0x3B,0x0A,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x7D,0x0A,0x20,0x20,0x20,0x20, + 0x7D,0x29,0x3B,0x0A,0x20,0x20,0x20,0x20,0x74,0x68,0x69,0x73,0x2E,0x5F,0x69,0x6E,0x74,0x65,0x72,0x6E,0x61,0x6C,0x2E,0x72,0x65,0x73,0x6F,0x6C,0x76,0x65,0x72,0x20, + 0x3D,0x20,0x66,0x75,0x6E,0x63,0x74,0x69,0x6F,0x6E,0x20,0x5F,0x72,0x65,0x73,0x6F,0x6C,0x76,0x65,0x72,0x28,0x29,0x0A,0x20,0x20,0x20,0x20,0x7B,0x0A,0x20,0x20,0x20, + 0x20,0x20,0x20,0x20,0x20,0x5F,0x72,0x65,0x73,0x6F,0x6C,0x76,0x65,0x72,0x2E,0x5F,0x73,0x65,0x6C,0x66,0x2E,0x65,0x72,0x72,0x6F,0x72,0x73,0x20,0x3D,0x20,0x66,0x61, + 0x6C,0x73,0x65,0x3B,0x0A,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5F,0x72,0x65,0x73,0x6F,0x6C,0x76,0x65,0x72,0x2E,0x5F,0x73,0x65,0x6C,0x66,0x2E,0x63,0x6F,0x6D, + 0x70,0x6C,0x65,0x74,0x65,0x64,0x20,0x3D,0x20,0x74,0x72,0x75,0x65,0x3B,0x0A,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5F,0x72,0x65,0x73,0x6F,0x6C,0x76,0x65,0x72, + 0x2E,0x5F,0x73,0x65,0x6C,0x66,0x2E,0x63,0x6F,0x6D,0x70,0x6C,0x65,0x74,0x65,0x64,0x41,0x72,0x67,0x73,0x20,0x3D,0x20,0x5B,0x5D,0x3B,0x0A,0x20,0x20,0x20,0x20,0x20, + 0x20,0x20,0x20,0x76,0x61,0x72,0x20,0x61,0x72,0x67,0x73,0x20,0x3D,0x20,0x5B,0x27,0x72,0x65,0x73,0x6F,0x6C,0x76,0x65,0x64,0x27,0x5D,0x3B,0x0A,0x20,0x20,0x20,0x20, + 0x20,0x20,0x20,0x20,0x69,0x66,0x20,0x28,0x74,0x68,0x69,0x73,0x2E,0x65,0x6D,0x69,0x74,0x5F,0x72,0x65,0x74,0x75,0x72,0x6E,0x56,0x61,0x6C,0x75,0x65,0x20,0x26,0x26, + 0x20,0x74,0x68,0x69,0x73,0x2E,0x65,0x6D,0x69,0x74,0x5F,0x72,0x65,0x74,0x75,0x72,0x6E,0x56,0x61,0x6C,0x75,0x65,0x28,0x27,0x72,0x65,0x73,0x6F,0x6C,0x76,0x65,0x64, + 0x27,0x29,0x20,0x21,0x3D,0x20,0x6E,0x75,0x6C,0x6C,0x29,0x0A,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x7B,0x0A,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20, + 0x20,0x20,0x5F,0x72,0x65,0x73,0x6F,0x6C,0x76,0x65,0x72,0x2E,0x5F,0x73,0x65,0x6C,0x66,0x2E,0x63,0x6F,0x6D,0x70,0x6C,0x65,0x74,0x65,0x64,0x41,0x72,0x67,0x73,0x2E, + 0x70,0x75,0x73,0x68,0x28,0x74,0x68,0x69,0x73,0x2E,0x65,0x6D,0x69,0x74,0x5F,0x72,0x65,0x74,0x75,0x72,0x6E,0x56,0x61,0x6C,0x75,0x65,0x28,0x27,0x72,0x65,0x73,0x6F, + 0x6C,0x76,0x65,0x64,0x27,0x29,0x29,0x3B,0x0A,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x61,0x72,0x67,0x73,0x2E,0x70,0x75,0x73,0x68,0x28,0x74, + 0x68,0x69,0x73,0x2E,0x65,0x6D,0x69,0x74,0x5F,0x72,0x65,0x74,0x75,0x72,0x6E,0x56,0x61,0x6C,0x75,0x65,0x28,0x27,0x72,0x65,0x73,0x6F,0x6C,0x76,0x65,0x64,0x27,0x29, + 0x29,0x3B,0x0A,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x7D,0x0A,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x65,0x6C,0x73,0x65,0x0A,0x20,0x20,0x20,0x20,0x20,0x20, + 0x20,0x20,0x7B,0x0A,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x66,0x6F,0x72,0x20,0x28,0x76,0x61,0x72,0x20,0x61,0x20,0x69,0x6E,0x20,0x61,0x72, + 0x67,0x75,0x6D,0x65,0x6E,0x74,0x73,0x29,0x0A,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x7B,0x0A,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20, + 0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5F,0x72,0x65,0x73,0x6F,0x6C,0x76,0x65,0x72,0x2E,0x5F,0x73,0x65,0x6C,0x66,0x2E,0x63,0x6F,0x6D,0x70,0x6C,0x65,0x74,0x65,0x64, + 0x41,0x72,0x67,0x73,0x2E,0x70,0x75,0x73,0x68,0x28,0x61,0x72,0x67,0x75,0x6D,0x65,0x6E,0x74,0x73,0x5B,0x61,0x5D,0x29,0x3B,0x0A,0x20,0x20,0x20,0x20,0x20,0x20,0x20, + 0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x61,0x72,0x67,0x73,0x2E,0x70,0x75,0x73,0x68,0x28,0x61,0x72,0x67,0x75,0x6D,0x65,0x6E,0x74,0x73,0x5B,0x61,0x5D,0x29, + 0x3B,0x0A,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x7D,0x0A,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x7D,0x0A,0x20,0x20,0x20,0x20,0x20,0x20, + 0x20,0x20,0x5F,0x72,0x65,0x73,0x6F,0x6C,0x76,0x65,0x72,0x2E,0x5F,0x73,0x65,0x6C,0x66,0x2E,0x65,0x6D,0x69,0x74,0x2E,0x61,0x70,0x70,0x6C,0x79,0x28,0x5F,0x72,0x65, + 0x73,0x6F,0x6C,0x76,0x65,0x72,0x2E,0x5F,0x73,0x65,0x6C,0x66,0x2C,0x20,0x61,0x72,0x67,0x73,0x29,0x3B,0x0A,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5F,0x72,0x65, + 0x73,0x6F,0x6C,0x76,0x65,0x72,0x2E,0x5F,0x73,0x65,0x6C,0x66,0x2E,0x65,0x6D,0x69,0x74,0x28,0x27,0x73,0x65,0x74,0x74,0x6C,0x65,0x64,0x27,0x29,0x3B,0x0A,0x20,0x20, + 0x20,0x20,0x7D,0x3B,0x0A,0x20,0x20,0x20,0x20,0x74,0x68,0x69,0x73,0x2E,0x5F,0x69,0x6E,0x74,0x65,0x72,0x6E,0x61,0x6C,0x2E,0x72,0x65,0x6A,0x65,0x63,0x74,0x6F,0x72, + 0x20,0x3D,0x20,0x66,0x75,0x6E,0x63,0x74,0x69,0x6F,0x6E,0x20,0x5F,0x72,0x65,0x6A,0x65,0x63,0x74,0x6F,0x72,0x28,0x29,0x0A,0x20,0x20,0x20,0x20,0x7B,0x0A,0x20,0x20, + 0x20,0x20,0x20,0x20,0x20,0x20,0x5F,0x72,0x65,0x6A,0x65,0x63,0x74,0x6F,0x72,0x2E,0x5F,0x73,0x65,0x6C,0x66,0x2E,0x65,0x72,0x72,0x6F,0x72,0x73,0x20,0x3D,0x20,0x74, + 0x72,0x75,0x65,0x3B,0x0A,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5F,0x72,0x65,0x6A,0x65,0x63,0x74,0x6F,0x72,0x2E,0x5F,0x73,0x65,0x6C,0x66,0x2E,0x63,0x6F,0x6D, + 0x70,0x6C,0x65,0x74,0x65,0x64,0x20,0x3D,0x20,0x74,0x72,0x75,0x65,0x3B,0x0A,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5F,0x72,0x65,0x6A,0x65,0x63,0x74,0x6F,0x72, + 0x2E,0x5F,0x73,0x65,0x6C,0x66,0x2E,0x63,0x6F,0x6D,0x70,0x6C,0x65,0x74,0x65,0x64,0x41,0x72,0x67,0x73,0x20,0x3D,0x20,0x5B,0x5D,0x3B,0x0A,0x20,0x20,0x20,0x20,0x20, + 0x20,0x20,0x20,0x76,0x61,0x72,0x20,0x61,0x72,0x67,0x73,0x20,0x3D,0x20,0x5B,0x27,0x72,0x65,0x6A,0x65,0x63,0x74,0x65,0x64,0x27,0x5D,0x3B,0x0A,0x20,0x20,0x20,0x20, + 0x20,0x20,0x20,0x20,0x66,0x6F,0x72,0x20,0x28,0x76,0x61,0x72,0x20,0x61,0x20,0x69,0x6E,0x20,0x61,0x72,0x67,0x75,0x6D,0x65,0x6E,0x74,0x73,0x29,0x0A,0x20,0x20,0x20, + 0x20,0x20,0x20,0x20,0x20,0x7B,0x0A,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5F,0x72,0x65,0x6A,0x65,0x63,0x74,0x6F,0x72,0x2E,0x5F,0x73,0x65, + 0x6C,0x66,0x2E,0x63,0x6F,0x6D,0x70,0x6C,0x65,0x74,0x65,0x64,0x41,0x72,0x67,0x73,0x2E,0x70,0x75,0x73,0x68,0x28,0x61,0x72,0x67,0x75,0x6D,0x65,0x6E,0x74,0x73,0x5B, + 0x61,0x5D,0x29,0x3B,0x0A,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x61,0x72,0x67,0x73,0x2E,0x70,0x75,0x73,0x68,0x28,0x61,0x72,0x67,0x75,0x6D, + 0x65,0x6E,0x74,0x73,0x5B,0x61,0x5D,0x29,0x3B,0x0A,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x7D,0x0A,0x0A,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5F,0x72,0x65, + 0x6A,0x65,0x63,0x74,0x6F,0x72,0x2E,0x5F,0x73,0x65,0x6C,0x66,0x2E,0x65,0x6D,0x69,0x74,0x2E,0x61,0x70,0x70,0x6C,0x79,0x28,0x5F,0x72,0x65,0x6A,0x65,0x63,0x74,0x6F, + 0x72,0x2E,0x5F,0x73,0x65,0x6C,0x66,0x2C,0x20,0x61,0x72,0x67,0x73,0x29,0x3B,0x0A,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5F,0x72,0x65,0x6A,0x65,0x63,0x74,0x6F, + 0x72,0x2E,0x5F,0x73,0x65,0x6C,0x66,0x2E,0x65,0x6D,0x69,0x74,0x28,0x27,0x73,0x65,0x74,0x74,0x6C,0x65,0x64,0x27,0x29,0x3B,0x0A,0x20,0x20,0x20,0x20,0x7D,0x3B,0x0A, + 0x20,0x20,0x20,0x20,0x74,0x68,0x69,0x73,0x2E,0x63,0x61,0x74,0x63,0x68,0x20,0x3D,0x20,0x66,0x75,0x6E,0x63,0x74,0x69,0x6F,0x6E,0x28,0x66,0x75,0x6E,0x63,0x29,0x0A, + 0x20,0x20,0x20,0x20,0x7B,0x0A,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x74,0x68,0x69,0x73,0x2E,0x5F,0x69,0x6E,0x74,0x65,0x72,0x6E,0x61,0x6C,0x2E,0x6F,0x6E,0x63, + 0x65,0x28,0x27,0x72,0x65,0x6A,0x65,0x63,0x74,0x65,0x64,0x27,0x2C,0x20,0x65,0x76,0x65,0x6E,0x74,0x5F,0x73,0x77,0x69,0x74,0x63,0x68,0x65,0x72,0x28,0x74,0x68,0x69, + 0x73,0x2C,0x20,0x66,0x75,0x6E,0x63,0x29,0x2E,0x66,0x75,0x6E,0x63,0x29,0x3B,0x0A,0x20,0x20,0x20,0x20,0x7D,0x0A,0x20,0x20,0x20,0x20,0x74,0x68,0x69,0x73,0x2E,0x66, + 0x69,0x6E,0x61,0x6C,0x6C,0x79,0x20,0x3D,0x20,0x66,0x75,0x6E,0x63,0x74,0x69,0x6F,0x6E,0x20,0x28,0x66,0x75,0x6E,0x63,0x29,0x0A,0x20,0x20,0x20,0x20,0x7B,0x0A,0x20, + 0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x74,0x68,0x69,0x73,0x2E,0x5F,0x69,0x6E,0x74,0x65,0x72,0x6E,0x61,0x6C,0x2E,0x6F,0x6E,0x63,0x65,0x28,0x27,0x73,0x65,0x74,0x74, + 0x6C,0x65,0x64,0x27,0x2C,0x20,0x65,0x76,0x65,0x6E,0x74,0x5F,0x73,0x77,0x69,0x74,0x63,0x68,0x65,0x72,0x28,0x74,0x68,0x69,0x73,0x2C,0x20,0x66,0x75,0x6E,0x63,0x29, + 0x2E,0x66,0x75,0x6E,0x63,0x29,0x3B,0x0A,0x20,0x20,0x20,0x20,0x7D,0x3B,0x0A,0x20,0x20,0x20,0x20,0x74,0x68,0x69,0x73,0x2E,0x74,0x68,0x65,0x6E,0x20,0x3D,0x20,0x66, + 0x75,0x6E,0x63,0x74,0x69,0x6F,0x6E,0x20,0x28,0x72,0x65,0x73,0x6F,0x6C,0x76,0x65,0x64,0x2C,0x20,0x72,0x65,0x6A,0x65,0x63,0x74,0x65,0x64,0x29,0x0A,0x20,0x20,0x20, + 0x20,0x7B,0x0A,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x69,0x66,0x20,0x28,0x72,0x65,0x73,0x6F,0x6C,0x76,0x65,0x64,0x29,0x20,0x7B,0x20,0x74,0x68,0x69,0x73,0x2E, + 0x5F,0x69,0x6E,0x74,0x65,0x72,0x6E,0x61,0x6C,0x2E,0x6F,0x6E,0x63,0x65,0x28,0x27,0x72,0x65,0x73,0x6F,0x6C,0x76,0x65,0x64,0x27,0x2C,0x20,0x65,0x76,0x65,0x6E,0x74, + 0x5F,0x73,0x77,0x69,0x74,0x63,0x68,0x65,0x72,0x28,0x74,0x68,0x69,0x73,0x2C,0x20,0x72,0x65,0x73,0x6F,0x6C,0x76,0x65,0x64,0x29,0x2E,0x66,0x75,0x6E,0x63,0x29,0x3B, + 0x20,0x7D,0x0A,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x69,0x66,0x20,0x28,0x72,0x65,0x6A,0x65,0x63,0x74,0x65,0x64,0x29,0x20,0x7B,0x20,0x74,0x68,0x69,0x73,0x2E, + 0x5F,0x69,0x6E,0x74,0x65,0x72,0x6E,0x61,0x6C,0x2E,0x6F,0x6E,0x63,0x65,0x28,0x27,0x72,0x65,0x6A,0x65,0x63,0x74,0x65,0x64,0x27,0x2C,0x20,0x65,0x76,0x65,0x6E,0x74, + 0x5F,0x73,0x77,0x69,0x74,0x63,0x68,0x65,0x72,0x28,0x74,0x68,0x69,0x73,0x2C,0x20,0x72,0x65,0x6A,0x65,0x63,0x74,0x65,0x64,0x29,0x2E,0x66,0x75,0x6E,0x63,0x29,0x3B, + 0x20,0x7D,0x0A,0x0A,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x76,0x61,0x72,0x20,0x72,0x65,0x74,0x56,0x61,0x6C,0x20,0x3D,0x20,0x6E,0x65,0x77,0x20,0x50,0x72,0x6F, + 0x6D,0x69,0x73,0x65,0x28,0x66,0x75,0x6E,0x63,0x74,0x69,0x6F,0x6E,0x20,0x28,0x72,0x2C,0x20,0x6A,0x29,0x20,0x7B,0x20,0x7D,0x29,0x3B,0x0A,0x20,0x20,0x20,0x20,0x20, + 0x20,0x20,0x20,0x74,0x68,0x69,0x73,0x2E,0x5F,0x69,0x6E,0x74,0x65,0x72,0x6E,0x61,0x6C,0x2E,0x6F,0x6E,0x63,0x65,0x28,0x27,0x72,0x65,0x73,0x6F,0x6C,0x76,0x65,0x64, + 0x27,0x2C,0x20,0x72,0x65,0x74,0x56,0x61,0x6C,0x2E,0x5F,0x69,0x6E,0x74,0x65,0x72,0x6E,0x61,0x6C,0x2E,0x72,0x65,0x73,0x6F,0x6C,0x76,0x65,0x72,0x29,0x3B,0x0A,0x20, + 0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x74,0x68,0x69,0x73,0x2E,0x5F,0x69,0x6E,0x74,0x65,0x72,0x6E,0x61,0x6C,0x2E,0x6F,0x6E,0x63,0x65,0x28,0x27,0x72,0x65,0x6A,0x65, + 0x63,0x74,0x65,0x64,0x27,0x2C,0x20,0x72,0x65,0x74,0x56,0x61,0x6C,0x2E,0x5F,0x69,0x6E,0x74,0x65,0x72,0x6E,0x61,0x6C,0x2E,0x72,0x65,0x6A,0x65,0x63,0x74,0x6F,0x72, + 0x29,0x3B,0x0A,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x72,0x65,0x74,0x56,0x61,0x6C,0x2E,0x70,0x61,0x72,0x65,0x6E,0x74,0x50,0x72,0x6F,0x6D,0x69,0x73,0x65,0x20, + 0x3D,0x20,0x74,0x68,0x69,0x73,0x3B,0x0A,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x72,0x65,0x74,0x75,0x72,0x6E,0x20,0x28,0x72,0x65,0x74,0x56,0x61,0x6C,0x29,0x3B, + 0x0A,0x20,0x20,0x20,0x20,0x7D,0x3B,0x0A,0x0A,0x20,0x20,0x20,0x20,0x74,0x68,0x69,0x73,0x2E,0x5F,0x69,0x6E,0x74,0x65,0x72,0x6E,0x61,0x6C,0x2E,0x72,0x65,0x73,0x6F, + 0x6C,0x76,0x65,0x72,0x2E,0x5F,0x73,0x65,0x6C,0x66,0x20,0x3D,0x20,0x74,0x68,0x69,0x73,0x2E,0x5F,0x69,0x6E,0x74,0x65,0x72,0x6E,0x61,0x6C,0x3B,0x0A,0x20,0x20,0x20, + 0x20,0x74,0x68,0x69,0x73,0x2E,0x5F,0x69,0x6E,0x74,0x65,0x72,0x6E,0x61,0x6C,0x2E,0x72,0x65,0x6A,0x65,0x63,0x74,0x6F,0x72,0x2E,0x5F,0x73,0x65,0x6C,0x66,0x20,0x3D, + 0x20,0x74,0x68,0x69,0x73,0x2E,0x5F,0x69,0x6E,0x74,0x65,0x72,0x6E,0x61,0x6C,0x3B,0x3B,0x0A,0x0A,0x20,0x20,0x20,0x20,0x74,0x72,0x79,0x0A,0x20,0x20,0x20,0x20,0x7B, + 0x0A,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x70,0x72,0x6F,0x6D,0x69,0x73,0x65,0x46,0x75,0x6E,0x63,0x2E,0x63,0x61,0x6C,0x6C,0x28,0x74,0x68,0x69,0x73,0x2C,0x20, + 0x74,0x68,0x69,0x73,0x2E,0x5F,0x69,0x6E,0x74,0x65,0x72,0x6E,0x61,0x6C,0x2E,0x72,0x65,0x73,0x6F,0x6C,0x76,0x65,0x72,0x2C,0x20,0x74,0x68,0x69,0x73,0x2E,0x5F,0x69, + 0x6E,0x74,0x65,0x72,0x6E,0x61,0x6C,0x2E,0x72,0x65,0x6A,0x65,0x63,0x74,0x6F,0x72,0x29,0x3B,0x0A,0x20,0x20,0x20,0x20,0x7D,0x0A,0x20,0x20,0x20,0x20,0x63,0x61,0x74, + 0x63,0x68,0x28,0x65,0x29,0x0A,0x20,0x20,0x20,0x20,0x7B,0x0A,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x74,0x68,0x69,0x73,0x2E,0x5F,0x69,0x6E,0x74,0x65,0x72,0x6E, + 0x61,0x6C,0x2E,0x65,0x72,0x72,0x6F,0x72,0x73,0x20,0x3D,0x20,0x74,0x72,0x75,0x65,0x3B,0x0A,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x74,0x68,0x69,0x73,0x2E,0x5F, + 0x69,0x6E,0x74,0x65,0x72,0x6E,0x61,0x6C,0x2E,0x63,0x6F,0x6D,0x70,0x6C,0x65,0x74,0x65,0x64,0x20,0x3D,0x20,0x74,0x72,0x75,0x65,0x3B,0x0A,0x20,0x20,0x20,0x20,0x20, + 0x20,0x20,0x20,0x74,0x68,0x69,0x73,0x2E,0x5F,0x69,0x6E,0x74,0x65,0x72,0x6E,0x61,0x6C,0x2E,0x63,0x6F,0x6D,0x70,0x6C,0x65,0x74,0x65,0x64,0x41,0x72,0x67,0x73,0x20, + 0x3D,0x20,0x5B,0x65,0x5D,0x3B,0x0A,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x74,0x68,0x69,0x73,0x2E,0x5F,0x69,0x6E,0x74,0x65,0x72,0x6E,0x61,0x6C,0x2E,0x65,0x6D, + 0x69,0x74,0x28,0x27,0x72,0x65,0x6A,0x65,0x63,0x74,0x65,0x64,0x27,0x2C,0x20,0x65,0x29,0x3B,0x0A,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x74,0x68,0x69,0x73,0x2E, + 0x5F,0x69,0x6E,0x74,0x65,0x72,0x6E,0x61,0x6C,0x2E,0x65,0x6D,0x69,0x74,0x28,0x27,0x73,0x65,0x74,0x74,0x6C,0x65,0x64,0x27,0x29,0x3B,0x0A,0x20,0x20,0x20,0x20,0x7D, + 0x0A,0x0A,0x20,0x20,0x20,0x20,0x69,0x66,0x28,0x21,0x74,0x68,0x69,0x73,0x2E,0x5F,0x69,0x6E,0x74,0x65,0x72,0x6E,0x61,0x6C,0x2E,0x63,0x6F,0x6D,0x70,0x6C,0x65,0x74, + 0x65,0x64,0x29,0x0A,0x20,0x20,0x20,0x20,0x7B,0x0A,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x2F,0x2F,0x20,0x53,0x61,0x76,0x65,0x20,0x72,0x65,0x66,0x65,0x72,0x65, + 0x6E,0x63,0x65,0x20,0x6F,0x66,0x20,0x74,0x68,0x69,0x73,0x20,0x6F,0x62,0x6A,0x65,0x63,0x74,0x0A,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x72,0x65,0x66,0x54,0x61, + 0x62,0x6C,0x65,0x5B,0x74,0x68,0x69,0x73,0x2E,0x5F,0x69,0x6E,0x74,0x65,0x72,0x6E,0x61,0x6C,0x2E,0x5F,0x68,0x61,0x73,0x68,0x43,0x6F,0x64,0x65,0x28,0x29,0x5D,0x20, + 0x3D,0x20,0x74,0x68,0x69,0x73,0x2E,0x5F,0x69,0x6E,0x74,0x65,0x72,0x6E,0x61,0x6C,0x3B,0x0A,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x74,0x68,0x69,0x73,0x2E,0x5F, + 0x69,0x6E,0x74,0x65,0x72,0x6E,0x61,0x6C,0x2E,0x6F,0x6E,0x63,0x65,0x28,0x27,0x73,0x65,0x74,0x74,0x6C,0x65,0x64,0x27,0x2C,0x20,0x66,0x75,0x6E,0x63,0x74,0x69,0x6F, + 0x6E,0x20,0x28,0x29,0x20,0x7B,0x20,0x72,0x65,0x66,0x54,0x61,0x62,0x6C,0x65,0x5B,0x74,0x68,0x69,0x73,0x2E,0x5F,0x68,0x61,0x73,0x68,0x43,0x6F,0x64,0x65,0x28,0x29, + 0x5D,0x20,0x3D,0x20,0x6E,0x75,0x6C,0x6C,0x3B,0x20,0x7D,0x29,0x3B,0x0A,0x20,0x20,0x20,0x20,0x7D,0x0A,0x7D,0x0A,0x0A,0x50,0x72,0x6F,0x6D,0x69,0x73,0x65,0x2E,0x72, + 0x65,0x73,0x6F,0x6C,0x76,0x65,0x20,0x3D,0x20,0x66,0x75,0x6E,0x63,0x74,0x69,0x6F,0x6E,0x20,0x72,0x65,0x73,0x6F,0x6C,0x76,0x65,0x28,0x29,0x0A,0x7B,0x0A,0x20,0x20, + 0x20,0x20,0x76,0x61,0x72,0x20,0x72,0x65,0x74,0x56,0x61,0x6C,0x20,0x3D,0x20,0x6E,0x65,0x77,0x20,0x50,0x72,0x6F,0x6D,0x69,0x73,0x65,0x28,0x66,0x75,0x6E,0x63,0x74, + 0x69,0x6F,0x6E,0x20,0x28,0x72,0x2C,0x20,0x6A,0x29,0x20,0x7B,0x20,0x7D,0x29,0x3B,0x0A,0x20,0x20,0x20,0x20,0x76,0x61,0x72,0x20,0x61,0x72,0x67,0x73,0x20,0x3D,0x20, + 0x5B,0x5D,0x3B,0x0A,0x20,0x20,0x20,0x20,0x66,0x6F,0x72,0x20,0x28,0x76,0x61,0x72,0x20,0x69,0x20,0x69,0x6E,0x20,0x61,0x72,0x67,0x75,0x6D,0x65,0x6E,0x74,0x73,0x29, + 0x0A,0x20,0x20,0x20,0x20,0x7B,0x0A,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x61,0x72,0x67,0x73,0x2E,0x70,0x75,0x73,0x68,0x28,0x61,0x72,0x67,0x75,0x6D,0x65,0x6E, + 0x74,0x73,0x5B,0x69,0x5D,0x29,0x3B,0x0A,0x20,0x20,0x20,0x20,0x7D,0x0A,0x20,0x20,0x20,0x20,0x72,0x65,0x74,0x56,0x61,0x6C,0x2E,0x5F,0x69,0x6E,0x74,0x65,0x72,0x6E, + 0x61,0x6C,0x2E,0x72,0x65,0x73,0x6F,0x6C,0x76,0x65,0x72,0x2E,0x61,0x70,0x70,0x6C,0x79,0x28,0x72,0x65,0x74,0x56,0x61,0x6C,0x2E,0x5F,0x69,0x6E,0x74,0x65,0x72,0x6E, + 0x61,0x6C,0x2C,0x20,0x61,0x72,0x67,0x73,0x29,0x3B,0x0A,0x20,0x20,0x20,0x20,0x72,0x65,0x74,0x75,0x72,0x6E,0x20,0x28,0x72,0x65,0x74,0x56,0x61,0x6C,0x29,0x3B,0x0A, + 0x7D,0x3B,0x0A,0x50,0x72,0x6F,0x6D,0x69,0x73,0x65,0x2E,0x72,0x65,0x6A,0x65,0x63,0x74,0x20,0x3D,0x20,0x66,0x75,0x6E,0x63,0x74,0x69,0x6F,0x6E,0x20,0x72,0x65,0x6A, + 0x65,0x63,0x74,0x28,0x29,0x20,0x7B,0x0A,0x20,0x20,0x20,0x20,0x76,0x61,0x72,0x20,0x72,0x65,0x74,0x56,0x61,0x6C,0x20,0x3D,0x20,0x6E,0x65,0x77,0x20,0x50,0x72,0x6F, + 0x6D,0x69,0x73,0x65,0x28,0x66,0x75,0x6E,0x63,0x74,0x69,0x6F,0x6E,0x20,0x28,0x72,0x2C,0x20,0x6A,0x29,0x20,0x7B,0x20,0x7D,0x29,0x3B,0x0A,0x20,0x20,0x20,0x20,0x76, + 0x61,0x72,0x20,0x61,0x72,0x67,0x73,0x20,0x3D,0x20,0x5B,0x5D,0x3B,0x0A,0x20,0x20,0x20,0x20,0x66,0x6F,0x72,0x20,0x28,0x76,0x61,0x72,0x20,0x69,0x20,0x69,0x6E,0x20, + 0x61,0x72,0x67,0x75,0x6D,0x65,0x6E,0x74,0x73,0x29,0x20,0x7B,0x0A,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x61,0x72,0x67,0x73,0x2E,0x70,0x75,0x73,0x68,0x28,0x61, + 0x72,0x67,0x75,0x6D,0x65,0x6E,0x74,0x73,0x5B,0x69,0x5D,0x29,0x3B,0x0A,0x20,0x20,0x20,0x20,0x7D,0x0A,0x20,0x20,0x20,0x20,0x72,0x65,0x74,0x56,0x61,0x6C,0x2E,0x5F, + 0x69,0x6E,0x74,0x65,0x72,0x6E,0x61,0x6C,0x2E,0x72,0x65,0x6A,0x65,0x63,0x74,0x6F,0x72,0x2E,0x61,0x70,0x70,0x6C,0x79,0x28,0x72,0x65,0x74,0x56,0x61,0x6C,0x2E,0x5F, + 0x69,0x6E,0x74,0x65,0x72,0x6E,0x61,0x6C,0x2C,0x20,0x61,0x72,0x67,0x73,0x29,0x3B,0x0A,0x20,0x20,0x20,0x20,0x72,0x65,0x74,0x75,0x72,0x6E,0x20,0x28,0x72,0x65,0x74, + 0x56,0x61,0x6C,0x29,0x3B,0x0A,0x7D,0x3B,0x0A,0x50,0x72,0x6F,0x6D,0x69,0x73,0x65,0x2E,0x61,0x6C,0x6C,0x20,0x3D,0x20,0x66,0x75,0x6E,0x63,0x74,0x69,0x6F,0x6E,0x20, + 0x61,0x6C,0x6C,0x28,0x70,0x72,0x6F,0x6D,0x69,0x73,0x65,0x4C,0x69,0x73,0x74,0x29,0x0D,0x0A,0x7B,0x0D,0x0A,0x20,0x20,0x20,0x20,0x76,0x61,0x72,0x20,0x72,0x65,0x74, + 0x20,0x3D,0x20,0x6E,0x65,0x77,0x20,0x50,0x72,0x6F,0x6D,0x69,0x73,0x65,0x28,0x66,0x75,0x6E,0x63,0x74,0x69,0x6F,0x6E,0x20,0x28,0x72,0x65,0x73,0x2C,0x20,0x72,0x65, + 0x6A,0x29,0x0D,0x0A,0x20,0x20,0x20,0x20,0x7B,0x0D,0x0A,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x74,0x68,0x69,0x73,0x2E,0x5F,0x5F,0x72,0x65,0x6A,0x65,0x63,0x74, + 0x6F,0x72,0x20,0x3D,0x20,0x72,0x65,0x6A,0x3B,0x0D,0x0A,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x74,0x68,0x69,0x73,0x2E,0x5F,0x5F,0x72,0x65,0x73,0x6F,0x6C,0x76, + 0x65,0x72,0x20,0x3D,0x20,0x72,0x65,0x73,0x3B,0x0D,0x0A,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x74,0x68,0x69,0x73,0x2E,0x5F,0x5F,0x70,0x72,0x6F,0x6D,0x69,0x73, + 0x65,0x4C,0x69,0x73,0x74,0x20,0x3D,0x20,0x70,0x72,0x6F,0x6D,0x69,0x73,0x65,0x4C,0x69,0x73,0x74,0x3B,0x0D,0x0A,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x74,0x68, + 0x69,0x73,0x2E,0x5F,0x5F,0x64,0x6F,0x6E,0x65,0x20,0x3D,0x20,0x66,0x61,0x6C,0x73,0x65,0x3B,0x0D,0x0A,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x74,0x68,0x69,0x73, + 0x2E,0x5F,0x5F,0x63,0x6F,0x75,0x6E,0x74,0x20,0x3D,0x20,0x30,0x3B,0x0D,0x0A,0x20,0x20,0x20,0x20,0x7D,0x29,0x3B,0x0D,0x0A,0x0D,0x0A,0x20,0x20,0x20,0x20,0x66,0x6F, + 0x72,0x20,0x28,0x76,0x61,0x72,0x20,0x69,0x20,0x69,0x6E,0x20,0x70,0x72,0x6F,0x6D,0x69,0x73,0x65,0x4C,0x69,0x73,0x74,0x29,0x0D,0x0A,0x20,0x20,0x20,0x20,0x7B,0x0D, + 0x0A,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x70,0x72,0x6F,0x6D,0x69,0x73,0x65,0x4C,0x69,0x73,0x74,0x5B,0x69,0x5D,0x2E,0x74,0x68,0x65,0x6E,0x28,0x66,0x75,0x6E, + 0x63,0x74,0x69,0x6F,0x6E,0x20,0x28,0x29,0x0D,0x0A,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x7B,0x0D,0x0A,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20, + 0x20,0x2F,0x2F,0x20,0x53,0x75,0x63,0x63,0x65,0x73,0x73,0x0D,0x0A,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x69,0x66,0x28,0x2B,0x2B,0x72,0x65, + 0x74,0x2E,0x5F,0x5F,0x63,0x6F,0x75,0x6E,0x74,0x20,0x3D,0x3D,0x20,0x72,0x65,0x74,0x2E,0x5F,0x5F,0x70,0x72,0x6F,0x6D,0x69,0x73,0x65,0x4C,0x69,0x73,0x74,0x2E,0x6C, + 0x65,0x6E,0x67,0x74,0x68,0x29,0x0D,0x0A,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x7B,0x0D,0x0A,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20, + 0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x72,0x65,0x74,0x2E,0x5F,0x5F,0x64,0x6F,0x6E,0x65,0x20,0x3D,0x20,0x74,0x72,0x75,0x65,0x3B,0x0D,0x0A,0x20,0x20,0x20,0x20,0x20, + 0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x72,0x65,0x74,0x2E,0x5F,0x5F,0x72,0x65,0x73,0x6F,0x6C,0x76,0x65,0x72,0x28,0x72,0x65,0x74,0x2E,0x5F,0x5F, + 0x70,0x72,0x6F,0x6D,0x69,0x73,0x65,0x4C,0x69,0x73,0x74,0x29,0x3B,0x0D,0x0A,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x7D,0x0D,0x0A,0x20,0x20, + 0x20,0x20,0x20,0x20,0x20,0x20,0x7D,0x2C,0x20,0x66,0x75,0x6E,0x63,0x74,0x69,0x6F,0x6E,0x20,0x28,0x61,0x72,0x67,0x29,0x0D,0x0A,0x20,0x20,0x20,0x20,0x20,0x20,0x20, + 0x20,0x7B,0x0D,0x0A,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x2F,0x2F,0x20,0x46,0x61,0x69,0x6C,0x75,0x72,0x65,0x0D,0x0A,0x20,0x20,0x20,0x20, + 0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x69,0x66,0x28,0x21,0x72,0x65,0x74,0x2E,0x5F,0x5F,0x64,0x6F,0x6E,0x65,0x29,0x0D,0x0A,0x20,0x20,0x20,0x20,0x20,0x20,0x20, + 0x20,0x20,0x20,0x20,0x20,0x7B,0x0D,0x0A,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x72,0x65,0x74,0x2E,0x5F,0x5F,0x64,0x6F, + 0x6E,0x65,0x20,0x3D,0x20,0x74,0x72,0x75,0x65,0x3B,0x0D,0x0A,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x72,0x65,0x74,0x2E, + 0x5F,0x5F,0x72,0x65,0x6A,0x65,0x63,0x74,0x6F,0x72,0x28,0x61,0x72,0x67,0x29,0x3B,0x0D,0x0A,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x7D,0x0D, + 0x0A,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x7D,0x29,0x3B,0x0D,0x0A,0x20,0x20,0x20,0x20,0x7D,0x0D,0x0A,0x20,0x20,0x20,0x20,0x69,0x66,0x20,0x28,0x70,0x72,0x6F, + 0x6D,0x69,0x73,0x65,0x4C,0x69,0x73,0x74,0x2E,0x6C,0x65,0x6E,0x67,0x74,0x68,0x20,0x3D,0x3D,0x20,0x30,0x29,0x0D,0x0A,0x20,0x20,0x20,0x20,0x7B,0x0D,0x0A,0x20,0x20, + 0x20,0x20,0x20,0x20,0x20,0x20,0x72,0x65,0x74,0x2E,0x5F,0x5F,0x72,0x65,0x73,0x6F,0x6C,0x76,0x65,0x72,0x28,0x70,0x72,0x6F,0x6D,0x69,0x73,0x65,0x4C,0x69,0x73,0x74, + 0x29,0x3B,0x0D,0x0A,0x20,0x20,0x20,0x20,0x7D,0x0D,0x0A,0x20,0x20,0x20,0x20,0x72,0x65,0x74,0x75,0x72,0x6E,0x20,0x28,0x72,0x65,0x74,0x29,0x3B,0x0D,0x0A,0x7D,0x3B, + 0x0A,0x0A,0x6D,0x6F,0x64,0x75,0x6C,0x65,0x2E,0x65,0x78,0x70,0x6F,0x72,0x74,0x73,0x20,0x3D,0x20,0x50,0x72,0x6F,0x6D,0x69,0x73,0x65,0x3B }; + + int g_displayStreamPipeMessages = 0; int g_displayFinalizerMessages = 0; @@ -133,8 +335,7 @@ duk_ret_t ILibDuktape_Polyfills_Buffer_from(duk_context *ctx) if (nargs == 1) { str = (char*)duk_get_lstring(ctx, 0, &strlength); - duk_push_fixed_buffer(ctx, strlength); - buffer = Duktape_GetBuffer(ctx, -1, NULL); + buffer = duk_push_fixed_buffer(ctx, strlength); memcpy_s(buffer, strlength, str, strlength); duk_push_buffer_object(ctx, -1, 0, strlength, DUK_BUFOBJ_NODEJS_BUFFER); return(1); @@ -151,16 +352,14 @@ duk_ret_t ILibDuktape_Polyfills_Buffer_from(duk_context *ctx) if (strcmp(encoding, "base64") == 0) { - // Base64 - duk_push_fixed_buffer(ctx, ILibBase64DecodeLength((int)strlength)); - buffer = Duktape_GetBuffer(ctx, -1, NULL); + // Base64 + buffer = duk_push_fixed_buffer(ctx, ILibBase64DecodeLength((int)strlength)); bufferLen = ILibBase64Decode((unsigned char*)str, (int)strlength, (unsigned char**)&buffer); duk_push_buffer_object(ctx, -1, 0, bufferLen, DUK_BUFOBJ_NODEJS_BUFFER); } else if (strcmp(encoding, "hex") == 0) - { - duk_push_fixed_buffer(ctx, strlength / 2); - buffer = Duktape_GetBuffer(ctx, -1, NULL); + { + buffer = duk_push_fixed_buffer(ctx, strlength / 2); bufferLen = util_hexToBuf(str, (int)strlength, buffer); duk_push_buffer_object(ctx, -1, 0, bufferLen, DUK_BUFOBJ_NODEJS_BUFFER); } @@ -187,9 +386,13 @@ duk_ret_t ILibDuktape_Polyfills_Buffer_readInt32BE(duk_context *ctx) duk_ret_t ILibDuktape_Polyfills_Buffer_alloc(duk_context *ctx) { int sz = duk_require_int(ctx, 0); + int fill = 0; + + if (duk_is_number(ctx, 1)) { fill = duk_require_int(ctx, 1); } + duk_push_fixed_buffer(ctx, sz); char *buffer = Duktape_GetBuffer(ctx, -1, NULL); - memset(buffer, 0, sz); + memset(buffer, fill, sz); duk_push_buffer_object(ctx, -1, 0, sz, DUK_BUFOBJ_NODEJS_BUFFER); return(1); } @@ -713,6 +916,9 @@ void ILibDuktape_Polyfills_timer_elapsed(void *obj) duk_context *ctx = ptrs->ctx; char *funcName; + if (!ILibMemory_CanaryOK(ptrs)) { return; } + if (duk_check_stack(ctx, 3) == 0) { return; } + duk_push_heapptr(ctx, ptrs->callback); // [func] funcName = Duktape_GetStringPropertyValue(ctx, -1, "name", "unknown_method"); duk_push_heapptr(ctx, ptrs->object); // [func][this] @@ -724,6 +930,13 @@ void ILibDuktape_Polyfills_timer_elapsed(void *obj) } else { + if (ptrs->timerType == ILibDuktape_Timer_Type_IMMEDIATE) + { + duk_push_heap_stash(ctx); + duk_del_prop_string(ctx, -1, Duktape_GetStashKey(ptrs->object)); + duk_pop(ctx); + } + duk_del_prop_string(ctx, -2, "\xFF_callback"); duk_del_prop_string(ctx, -2, "\xFF_argArray"); duk_del_prop_string(ctx, -2, ILibDuktape_Timer_Ptrs); @@ -751,11 +964,16 @@ duk_ret_t ILibDuktape_Polyfills_timer_set(duk_context *ctx) duk_get_prop_string(ctx, -1, "type"); timerType = (ILibDuktape_Timer_Type)duk_get_int(ctx, -1); - duk_push_object(ctx); //[retVal] + duk_push_object(ctx); //[retVal] switch (timerType) { case ILibDuktape_Timer_Type_IMMEDIATE: - ILibDuktape_WriteID(ctx, "Timers.immediate"); + ILibDuktape_WriteID(ctx, "Timers.immediate"); + // We're only saving a reference for immediates + duk_push_heap_stash(ctx); //[retVal][stash] + duk_dup(ctx, -2); //[retVal][stash][immediate] + duk_put_prop_string(ctx, -2, Duktape_GetStashKey(duk_get_heapptr(ctx, -1))); //[retVal][stash] + duk_pop(ctx); //[retVal] break; case ILibDuktape_Timer_Type_INTERVAL: ILibDuktape_WriteID(ctx, "Timers.interval"); @@ -765,10 +983,9 @@ duk_ret_t ILibDuktape_Polyfills_timer_set(duk_context *ctx) break; } ILibDuktape_CreateFinalizer(ctx, ILibDuktape_Polyfills_timer_finalizer); - duk_push_fixed_buffer(ctx, sizeof(ILibDuktape_Timer)); //[retVal][ptrs] - ptrs = (ILibDuktape_Timer*)Duktape_GetBuffer(ctx, -1, NULL); - memset(ptrs, 0, sizeof(ILibDuktape_Timer)); - duk_put_prop_string(ctx, -2, ILibDuktape_Timer_Ptrs); //[retVal] + + ptrs = (ILibDuktape_Timer*)Duktape_PushBuffer(ctx, sizeof(ILibDuktape_Timer)); //[retVal][ptrs] + duk_put_prop_string(ctx, -2, ILibDuktape_Timer_Ptrs); //[retVal] ptrs->ctx = ctx; ptrs->object = duk_get_heapptr(ctx, -1); @@ -816,6 +1033,13 @@ duk_ret_t ILibDuktape_Polyfills_timer_clear(duk_context *ctx) duk_get_prop_string(ctx, 0, ILibDuktape_Timer_Ptrs); ptrs = (ILibDuktape_Timer*)Duktape_GetBuffer(ctx, -1, NULL); + if (ptrs->timerType == ILibDuktape_Timer_Type_IMMEDIATE) + { + duk_push_heap_stash(ctx); + duk_del_prop_string(ctx, -1, Duktape_GetStashKey(ptrs->object)); + duk_pop(ctx); + } + ILibLifeTime_Remove(ILibGetBaseTimer(Duktape_GetChain(ctx)), ptrs); return 0; } @@ -1244,7 +1468,6 @@ duk_ret_t ILibDuktape_Stream_Writable_WriteSink_Flush(duk_context *ctx) } else { - duk_push_this(ctx); ILibDuktape_WritableStream *WS = (ILibDuktape_WritableStream*)Duktape_GetPointerProperty(ctx, -1, ILibDuktape_Stream_WritablePtr); ILibDuktape_WritableStream_Ready(WS); } @@ -1275,6 +1498,7 @@ ILibTransport_DoneState ILibDuktape_Stream_Writable_WriteSink(struct ILibDuktape duk_dup(stream->ctx, -2); // [_write][this][string/buffer][callback][stash][callback] duk_put_prop_string(stream->ctx, -2, Duktape_GetStashKey(h)); // [_write][this][string/buffer][callback][stash] duk_pop(stream->ctx); // [_write][this][string/buffer][callback] + duk_push_pointer(stream->ctx, stream); duk_put_prop_string(stream->ctx, -2, ILibDuktape_Stream_WritablePtr); duk_push_pointer(stream->ctx, &retVal); // [_write][this][string/buffer][callback][retval] duk_put_prop_string(stream->ctx, -2, "retval"); // [_write][this][string/buffer][callback] @@ -1294,12 +1518,24 @@ ILibTransport_DoneState ILibDuktape_Stream_Writable_WriteSink(struct ILibDuktape return(retVal); } +duk_ret_t ILibDuktape_Stream_Writable_EndSink_finish(duk_context *ctx) +{ + duk_push_current_function(ctx); + ILibDuktape_WritableStream *ws = (ILibDuktape_WritableStream*)Duktape_GetPointerProperty(ctx, -1, "ptr"); + if (ILibMemory_CanaryOK(ws)) + { + ILibDuktape_WritableStream_Finish(ws); + } + return(0); +} void ILibDuktape_Stream_Writable_EndSink(struct ILibDuktape_WritableStream *stream, void *user) { - duk_push_this(stream->ctx); // [writable] - duk_get_prop_string(stream->ctx, -1, "_final"); // [writable][_final] - duk_swap_top(stream->ctx, -2); // [_final][this] - if (duk_pcall_method(stream->ctx, 0) != 0) { ILibDuktape_Process_UncaughtExceptionEx(stream->ctx, "stream.writable._final(): "); } + duk_push_this(stream->ctx); // [writable] + duk_get_prop_string(stream->ctx, -1, "_final"); // [writable][_final] + duk_swap_top(stream->ctx, -2); // [_final][this] + duk_push_c_function(stream->ctx, ILibDuktape_Stream_Writable_EndSink_finish, 0); // [_final][this][callback] + duk_push_pointer(stream->ctx, stream); duk_put_prop_string(stream->ctx, -2, "ptr"); + if (duk_pcall_method(stream->ctx, 1) != 0) { ILibDuktape_Process_UncaughtExceptionEx(stream->ctx, "stream.writable._final(): "); } duk_pop(stream->ctx); // ... } duk_ret_t ILibDuktape_Stream_newWritable(duk_context *ctx) @@ -1529,6 +1765,12 @@ duk_ret_t ILibDuktape_Polyfills_Object_hashCode(duk_context *ctx) duk_push_string(ctx, Duktape_GetStashKey(duk_get_heapptr(ctx, -1))); return(1); } +duk_ret_t ILibDuktape_Polyfills_Array_peek(duk_context *ctx) +{ + duk_push_this(ctx); // [Array] + duk_get_prop_index(ctx, -1, (duk_uarridx_t)duk_get_length(ctx, -1) - 1); + return(1); +} void ILibDuktape_Polyfills_object(duk_context *ctx) { // Polyfill Object._hashCode() @@ -1537,9 +1779,164 @@ void ILibDuktape_Polyfills_object(duk_context *ctx) duk_push_c_function(ctx, ILibDuktape_Polyfills_Object_hashCode, 0); // [g][Object][prototype][func] ILibDuktape_CreateReadonlyProperty(ctx, "_hashCode"); // [g][Object][prototype] duk_pop_2(ctx); // [g] + + duk_get_prop_string(ctx, -1, "Array"); // [g][Array] + duk_get_prop_string(ctx, -1, "prototype"); // [g][Array][prototype] + duk_push_c_function(ctx, ILibDuktape_Polyfills_Array_peek, 0); // [g][Array][prototype][peek] + ILibDuktape_CreateReadonlyProperty(ctx, "peek"); // [g][Array][prototype] + duk_pop_2(ctx); // [g] } +#ifndef MICROSTACK_NOTLS +void ILibDuktape_bignum_addBigNumMethods(duk_context *ctx, BIGNUM *b); +duk_ret_t ILibDuktape_bignum_toString(duk_context *ctx) +{ + duk_push_this(ctx); + BIGNUM *b = (BIGNUM*)Duktape_GetPointerProperty(ctx, -1, "\xFF_BIGNUM"); + if (b != NULL) + { + char *numstr = BN_bn2dec(b); + duk_push_string(ctx, numstr); + OPENSSL_free(numstr); + return(1); + } + else + { + return(ILibDuktape_Error(ctx, "Invalid BIGNUM")); + } +} +duk_ret_t ILibDuktape_bignum_add(duk_context* ctx) +{ + BIGNUM *ret = BN_new(); + BIGNUM *r1, *r2; + + duk_push_this(ctx); + r1 = (BIGNUM*)Duktape_GetPointerProperty(ctx, -1, "\xFF_BIGNUM"); + r2 = (BIGNUM*)Duktape_GetPointerProperty(ctx, 0, "\xFF_BIGNUM"); + + BN_add(ret, r1, r2); + ILibDuktape_bignum_addBigNumMethods(ctx, ret); + return(1); +} +duk_ret_t ILibDuktape_bignum_sub(duk_context* ctx) +{ + BIGNUM *ret = BN_new(); + BIGNUM *r1, *r2; + + duk_push_this(ctx); + r1 = (BIGNUM*)Duktape_GetPointerProperty(ctx, -1, "\xFF_BIGNUM"); + r2 = (BIGNUM*)Duktape_GetPointerProperty(ctx, 0, "\xFF_BIGNUM"); + + BN_sub(ret, r1, r2); + ILibDuktape_bignum_addBigNumMethods(ctx, ret); + return(1); +} +duk_ret_t ILibDuktape_bignum_mul(duk_context* ctx) +{ + BN_CTX *bx = BN_CTX_new(); + BIGNUM *ret = BN_new(); + BIGNUM *r1, *r2; + + duk_push_this(ctx); + r1 = (BIGNUM*)Duktape_GetPointerProperty(ctx, -1, "\xFF_BIGNUM"); + r2 = (BIGNUM*)Duktape_GetPointerProperty(ctx, 0, "\xFF_BIGNUM"); + BN_mul(ret, r1, r2, bx); + BN_CTX_free(bx); + ILibDuktape_bignum_addBigNumMethods(ctx, ret); + return(1); +} +duk_ret_t ILibDuktape_bignum_div(duk_context* ctx) +{ + BN_CTX *bx = BN_CTX_new(); + BIGNUM *ret = BN_new(); + BIGNUM *r1, *r2; + + duk_push_this(ctx); + r1 = (BIGNUM*)Duktape_GetPointerProperty(ctx, -1, "\xFF_BIGNUM"); + r2 = (BIGNUM*)Duktape_GetPointerProperty(ctx, 0, "\xFF_BIGNUM"); + BN_div(ret, NULL, r1, r2, bx); + + BN_CTX_free(bx); + ILibDuktape_bignum_addBigNumMethods(ctx, ret); + return(1); +} +duk_ret_t ILibDuktape_bignum_mod(duk_context* ctx) +{ + BN_CTX *bx = BN_CTX_new(); + BIGNUM *ret = BN_new(); + BIGNUM *r1, *r2; + + duk_push_this(ctx); + r1 = (BIGNUM*)Duktape_GetPointerProperty(ctx, -1, "\xFF_BIGNUM"); + r2 = (BIGNUM*)Duktape_GetPointerProperty(ctx, 0, "\xFF_BIGNUM"); + BN_div(NULL, ret, r1, r2, bx); + + BN_CTX_free(bx); + ILibDuktape_bignum_addBigNumMethods(ctx, ret); + return(1); +} + +duk_ret_t ILibDuktape_bignum_finalizer(duk_context *ctx) +{ + BIGNUM *b = (BIGNUM*)Duktape_GetPointerProperty(ctx, 0, "\xFF_BIGNUM"); + if (b != NULL) + { + BN_free(b); + } + return(0); +} +void ILibDuktape_bignum_addBigNumMethods(duk_context *ctx, BIGNUM *b) +{ + duk_push_object(ctx); + duk_push_pointer(ctx, b); duk_put_prop_string(ctx, -2, "\xFF_BIGNUM"); + ILibDuktape_CreateProperty_InstanceMethod(ctx, "toString", ILibDuktape_bignum_toString, DUK_VARARGS); + ILibDuktape_CreateInstanceMethod(ctx, "add", ILibDuktape_bignum_add, 1); + ILibDuktape_CreateInstanceMethod(ctx, "sub", ILibDuktape_bignum_sub, 1); + ILibDuktape_CreateInstanceMethod(ctx, "mul", ILibDuktape_bignum_mul, 1); + ILibDuktape_CreateInstanceMethod(ctx, "div", ILibDuktape_bignum_div, 1); + ILibDuktape_CreateInstanceMethod(ctx, "mod", ILibDuktape_bignum_mod, 1); + duk_push_c_function(ctx, ILibDuktape_bignum_finalizer, 1); duk_set_finalizer(ctx, -2); + duk_eval_string(ctx, "(function toNumber(){return(parseInt(this.toString()));})"); duk_put_prop_string(ctx, -2, "toNumber"); +} +duk_ret_t ILibDuktape_bignum_fromBuffer(duk_context *ctx) +{ + char *endian = duk_get_top(ctx) > 1 ? Duktape_GetStringPropertyValue(ctx, 1, "endian", "big") : "big"; + duk_size_t len; + char *buffer = Duktape_GetBuffer(ctx, 0, &len); + BIGNUM *b; + + if (strcmp(endian, "big") == 0) + { + b = BN_bin2bn((unsigned char*)buffer, (int)len, NULL); + } + else if (strcmp(endian, "little") == 0) + { + b = BN_lebin2bn((unsigned char*)buffer, (int)len, NULL); + } + else + { + return(ILibDuktape_Error(ctx, "Invalid endian specified")); + } + + ILibDuktape_bignum_addBigNumMethods(ctx, b); + return(1); +} + +duk_ret_t ILibDuktape_bignum_func(duk_context *ctx) +{ + BIGNUM *b = NULL; + BN_dec2bn(&b, duk_require_string(ctx, 0)); + ILibDuktape_bignum_addBigNumMethods(ctx, b); + return(1); +} +void ILibDuktape_bignum_Push(duk_context *ctx, void *chain) +{ + duk_push_c_function(ctx, ILibDuktape_bignum_func, DUK_VARARGS); + duk_push_c_function(ctx, ILibDuktape_bignum_fromBuffer, DUK_VARARGS); duk_put_prop_string(ctx, -2, "fromBuffer"); +} +#endif + void ILibDuktape_Polyfills_Init(duk_context *ctx) { ILibDuktape_ModSearch_AddHandler(ctx, "queue", ILibDuktape_Queue_Push); @@ -1548,6 +1945,11 @@ void ILibDuktape_Polyfills_Init(duk_context *ctx) #ifndef MICROSTACK_NOTLS ILibDuktape_ModSearch_AddHandler(ctx, "pkcs7", ILibDuktape_PKCS7_Push); #endif + ILibDuktape_ModSearch_AddModule(ctx, "promise", promise, sizeof(promise) - 1); +#ifndef MICROSTACK_NOTLS + ILibDuktape_ModSearch_AddHandler(ctx, "bignum", ILibDuktape_bignum_Push); +#endif + // Global Polyfills duk_push_global_object(ctx); // [g]