/*********************************************************************** THIS FILE IS AUTOMATICALLY GENERATED. DO NOT MODIFY DEVELOPER: Zihan Chen(vczh) ***********************************************************************/ #include "VlppWorkflowCompiler.h" /*********************************************************************** .\ANALYZER\WFANALYZER.CPP ***********************************************************************/ namespace vl { namespace workflow { namespace analyzer { using namespace collections; using namespace reflection::description; /*********************************************************************** WfLexicalSymbol ***********************************************************************/ WfLexicalSymbol::WfLexicalSymbol(WfLexicalScope* _ownerScope) :ownerScope(_ownerScope) { } WfLexicalSymbol::~WfLexicalSymbol() { } WString WfLexicalSymbol::GetFriendlyName() { return ownerScope->GetFriendlyName() + L"::" + name; } /*********************************************************************** WfLexicalScope ***********************************************************************/ WfLexicalScope::WfLexicalScope(WfLexicalScopeManager* _ownerManager) :ownerManager(_ownerManager) { } WfLexicalScope::WfLexicalScope(Ptr _parentScope) :ownerManager(0) , parentScope(_parentScope) { } WfLexicalScope::~WfLexicalScope() { } WfLexicalScopeManager* WfLexicalScope::FindManager() { WfLexicalScope* scope = this; while (scope) { if (scope->ownerManager) { return scope->ownerManager; } scope = scope->parentScope.Obj(); } return 0; } Ptr WfLexicalScope::FindModule() { WfLexicalScope* scope = this; while (scope) { if (auto module = scope->ownerNode.Cast()) { return module; } scope = scope->parentScope.Obj(); } return 0; } WfLexicalScope* WfLexicalScope::FindFunctionScope() { auto scope = this; while (scope) { if (scope->functionConfig) { return scope; } scope = scope->parentScope.Obj(); } return nullptr; } WString WfLexicalScope::GetFriendlyName() { if (auto module = ownerNode.Cast()) { return L"<" + module->name.value + L">"; } else if (auto decl = ownerNode.Cast()) { auto name = decl->name.value; if (name == L"") { name = L""; } return parentScope->GetFriendlyName() + L"::" + name; } else if (!parentScope) { return L""; } else { return parentScope->GetFriendlyName() + L"::<>"; } } /*********************************************************************** WfLexicalScopeName ***********************************************************************/ WfLexicalScopeName::WfLexicalScopeName(bool _imported) :imported(_imported) { } WfLexicalScopeName::~WfLexicalScopeName() { } Ptr WfLexicalScopeName::AccessChild(const WString& name, bool imported) { vint index = children.Keys().IndexOf(name); if (index == -1) { auto newName = Ptr(new WfLexicalScopeName(imported)); newName->name = name; newName->parent = this; children.Add(name, newName); return newName; } else { return children.Values()[index]; } } void WfLexicalScopeName::RemoveNonTypeDescriptorNames(WfLexicalScopeManager* manager) { for (auto name : children.Values()) { name->RemoveNonTypeDescriptorNames(manager); } for (vint i = children.Count() - 1; i >= 0; i--) { auto subScopeName = children.Values()[i]; if (!subScopeName->imported) { children.Remove(children.Keys()[i]); if (subScopeName->typeDescriptor) { manager->typeNames.Remove(subScopeName->typeDescriptor); } } } declarations.Clear(); } WString WfLexicalScopeName::GetFriendlyName() { if (parent) { WString parentName = parent->GetFriendlyName(); if (parentName == L"") { return name; } else { return parentName + L"::" + name; } } else { return L""; } } /*********************************************************************** ResolveExpressionResult ***********************************************************************/ WString ResolveExpressionResult::GetFriendlyName(bool upperCase)const { WString typeName, result; if (type) { typeName= + L" of type \"" + type->GetTypeFriendlyName() + L"\""; } if (scopeName) { result = scopeName->GetFriendlyName(); } else if (symbol) { result = symbol->GetFriendlyName() + typeName; } else if (propertyInfo) { result = L"property \"" + propertyInfo->GetName() + L"\" in \"" + propertyInfo->GetOwnerTypeDescriptor()->GetTypeName() + L"\"" + typeName; } else if (methodInfo) { if (methodInfo->GetName() == L"") { result = L"constructor in \"" + methodInfo->GetOwnerTypeDescriptor()->GetTypeName() + L"\"" + typeName; } else { result = L"method \"" + methodInfo->GetName() + L"\" in \"" + methodInfo->GetOwnerTypeDescriptor()->GetTypeName() + L"\"" + typeName; } } else if (eventInfo) { result = L"event \"" + eventInfo->GetName() + L"\" in \"" + eventInfo->GetOwnerTypeDescriptor()->GetTypeName() + L"\""; } else if (type) { result = L"expression" + typeName; } else { result = L""; } if (result.Length() > 0 && upperCase) { result = INVLOC.ToUpper(result.Left(1)) + result.Right(result.Length() - 1); } return result; } ResolveExpressionResult ResolveExpressionResult::ScopeName(Ptr _scopeName) { ResolveExpressionResult result; result.scopeName = _scopeName; return result; } ResolveExpressionResult ResolveExpressionResult::ReadonlySymbol(Ptr _symbol) { ResolveExpressionResult result; result.symbol = _symbol; result.type = _symbol->typeInfo; return result; } ResolveExpressionResult ResolveExpressionResult::Symbol(Ptr _symbol) { ResolveExpressionResult result; result.symbol = _symbol; result.type = _symbol->typeInfo; if (_symbol->creatorNode.Cast()) { result.writableType = _symbol->typeInfo; } return result; } ResolveExpressionResult ResolveExpressionResult::ReadonlyType(Ptr _type) { ResolveExpressionResult result; result.type = _type; return result; } ResolveExpressionResult ResolveExpressionResult::WritableType(Ptr _type) { ResolveExpressionResult result; result.type = _type; result.writableType = _type; return result; } ResolveExpressionResult ResolveExpressionResult::Property(reflection::description::IPropertyInfo* _propertyInfo) { Ptr getterType = CopyTypeInfo(_propertyInfo->GetReturn()); Ptr setterType; if (getterType) { if (IMethodInfo* setter = _propertyInfo->GetSetter()) { setterType = getterType; if (setter->GetParameterCount() == 1 && !IsSameType(getterType.Obj(), setter->GetParameter(0)->GetType())) { setterType = CopyTypeInfo(setter->GetParameter(0)->GetType()); } } else if (_propertyInfo->IsWritable()) { auto td = _propertyInfo->GetOwnerTypeDescriptor(); if ((td->GetTypeDescriptorFlags() & TypeDescriptorFlags::ReferenceType) != TypeDescriptorFlags::Undefined) { setterType = CopyTypeInfo(_propertyInfo->GetReturn()); } } } ResolveExpressionResult result; result.propertyInfo = _propertyInfo; result.type = getterType; result.writableType = setterType; return result; } ResolveExpressionResult ResolveExpressionResult::Method(reflection::description::IMethodInfo* _methodInfo) { ResolveExpressionResult result; result.methodInfo = _methodInfo; result.type = CreateTypeInfoFromMethodInfo(_methodInfo); return result; } ResolveExpressionResult ResolveExpressionResult::Constructor(reflection::description::IMethodInfo* _constructorInfo) { ResolveExpressionResult result; result.constructorInfo = _constructorInfo; result.type = CopyTypeInfo(_constructorInfo->GetReturn()); return result; } ResolveExpressionResult ResolveExpressionResult::Event(reflection::description::IEventInfo* _eventInfo) { ResolveExpressionResult result; result.eventInfo = _eventInfo; return result; } bool IsSameTypeOrNull(ITypeInfo* fromType, ITypeInfo* toType) { if (fromType == toType) return true; if ((fromType == nullptr) ^ (toType == nullptr)) return false; return IsSameType(fromType, toType); } bool ResolveExpressionResult::operator==(const ResolveExpressionResult& result) const { if (scopeName != result.scopeName) return false; if (symbol != result.symbol) return false; if (propertyInfo != result.propertyInfo) return false; if (methodInfo != result.methodInfo) return false; if (constructorInfo != result.constructorInfo) return false; if (eventInfo != result.eventInfo) return false; if (!IsSameTypeOrNull(type.Obj(), result.type.Obj())) return false; if (!IsSameTypeOrNull(writableType.Obj(), result.writableType.Obj())) return false; if (!IsSameTypeOrNull(expectedType.Obj(), result.expectedType.Obj())) return false; return true; } bool ResolveExpressionResult::operator!=(const ResolveExpressionResult& result) const { return !(*this == result); } /*********************************************************************** WfLexicalScopeManager ***********************************************************************/ WfLexicalScopeManager::WfLexicalScopeManager(workflow::Parser& _workflowParser, WfCpuArchitecture _cpuArchitecture) :workflowParser(_workflowParser) , cpuArchitecture(_cpuArchitecture) { workflowParserHandler = glr::InstallDefaultErrorMessageGenerator(workflowParser, errors); attributes.Add({ L"cpp", L"File" }, TypeInfoRetriver::CreateTypeInfo()); attributes.Add({ L"cpp", L"UserImpl" }, TypeInfoRetriver::CreateTypeInfo()); attributes.Add({ L"cpp", L"Private" }, TypeInfoRetriver::CreateTypeInfo()); attributes.Add({ L"cpp", L"Protected" }, TypeInfoRetriver::CreateTypeInfo()); attributes.Add({ L"cpp", L"Friend" }, TypeInfoRetriver::CreateTypeInfo()); switch (cpuArchitecture) { case WfCpuArchitecture::x86: cputdSInt = reflection::description::GetTypeDescriptor(); cputdUInt = reflection::description::GetTypeDescriptor(); cputiSInt = reflection::description::TypeInfoRetriver::CreateTypeInfo(); cputiUInt = reflection::description::TypeInfoRetriver::CreateTypeInfo(); break; case WfCpuArchitecture::x64: cputdSInt = reflection::description::GetTypeDescriptor(); cputdUInt = reflection::description::GetTypeDescriptor(); cputiSInt = reflection::description::TypeInfoRetriver::CreateTypeInfo(); cputiUInt = reflection::description::TypeInfoRetriver::CreateTypeInfo(); break; case WfCpuArchitecture::AsExecutable: cputdSInt = reflection::description::GetTypeDescriptor(); cputdUInt = reflection::description::GetTypeDescriptor(); cputiSInt = reflection::description::TypeInfoRetriver::CreateTypeInfo(); cputiUInt = reflection::description::TypeInfoRetriver::CreateTypeInfo(); break; } } WfLexicalScopeManager::~WfLexicalScopeManager() { workflowParser.OnError.Remove(workflowParserHandler); } vint WfLexicalScopeManager::AddModule(const WString& moduleCode) { if (auto module = ParseModule(moduleCode, workflowParser, usedCodeIndex)) { modules.Add(module); moduleCodes.Add(moduleCode); } return usedCodeIndex++; } vint WfLexicalScopeManager::AddModule(Ptr module) { module->codeRange.codeIndex = usedCodeIndex; modules.Add(module); moduleCodes.Add(L""); return usedCodeIndex++; } WfLexicalScopeManager::ModuleList& WfLexicalScopeManager::GetModules() { return modules; } WfLexicalScopeManager::ModuleCodeList& WfLexicalScopeManager::GetModuleCodes() { return moduleCodes; } void WfLexicalScopeManager::Clear(bool keepTypeDescriptorNames, bool deleteModules) { if (globalName) { if (keepTypeDescriptorNames) { globalName->RemoveNonTypeDescriptorNames(this); } else { globalName = 0; typeNames.Clear(); } } if (deleteModules) { modules.Clear(); moduleCodes.Clear(); usedCodeIndex = 0; } usedTempVars = 0; errors.Clear(); namespaceNames.Clear(); nodeScopes.Clear(); checkedScopes_DuplicatedSymbol.Clear(); checkedScopes_SymbolType.Clear(); expressionResolvings.Clear(); coNewCoroutineResolvings.Clear(); coOperatorResolvings.Clear(); coProviderResolvings.Clear(); coCastResultResolvings.Clear(); baseConstructorCallResolvings.Clear(); lambdaCaptures.Clear(); interfaceMethodImpls.Clear(); declaractionScopeSources.Clear(); declarationTypes.Clear(); declarationMemberInfos.Clear(); stateInputMethods.Clear(); stateInputArguments.Clear(); stateDeclArguments.Clear(); stateMachineInfos.Clear(); } #define EXECUTE_CALLBACK(EXPR) if (callback) callback->EXPR void WfLexicalScopeManager::Rebuild(bool keepTypeDescriptorNames, IWfCompilerCallback* callback) { EXECUTE_CALLBACK(OnLoadEnvironment()); Clear(keepTypeDescriptorNames, false); if (!globalName) { globalName = Ptr(new WfLexicalScopeName(true)); BuildGlobalNameFromTypeDescriptors(this); } EXECUTE_CALLBACK(OnInitialize(this)); vint errorCount = errors.Count(); #define EXIT_IF_ERRORS_EXIST\ do\ {\ if (errors.Count() != errorCount) return;\ }while (0) EXIT_IF_ERRORS_EXIST; for (auto module : modules) { ContextFreeModuleDesugar(this, module); ValidateModuleStructure(this, module); } EXIT_IF_ERRORS_EXIST; BuildGlobalNameFromModules(this); for (auto module : modules) { BuildScopeForModule(this, module); } ValidateScopeName(this, globalName); CheckScopes_DuplicatedSymbol(this); EXIT_IF_ERRORS_EXIST; for (auto module : modules) { CompleteScopeForModule(this, module); } CheckScopes_SymbolType(this); CheckScopes_CycleDependency(this); EXIT_IF_ERRORS_EXIST; for (auto module : modules) { EXECUTE_CALLBACK(OnValidateModule(module)); ValidateModuleSemantic(this, module); } #undef EXIT_IF_ERRORS_EXIST } #undef EXECUTE_CALLBACK bool WfLexicalScopeManager::ResolveMember(ITypeDescriptor* typeDescriptor, const WString& name, bool preferStatic, collections::SortedList& searchedTypes, collections::List& results) { if (searchedTypes.Contains(typeDescriptor)) { return true; } searchedTypes.Add(typeDescriptor); bool found = false; bool foundStaticMember = false; if ((typeDescriptor->GetTypeDescriptorFlags() & TypeDescriptorFlags::EnumType) != TypeDescriptorFlags::Undefined) { if (preferStatic) { auto enumType = typeDescriptor->GetEnumType(); vint index = enumType->IndexOfItem(name); if (index != -1) { results.Add(ResolveExpressionResult::ReadonlyType(Ptr(new TypeDescriptorTypeInfo(typeDescriptor, TypeInfoHint::Normal)))); return true; } } return false; } { auto scopeName = typeNames[typeDescriptor]; vint index = scopeName->children.Keys().IndexOf(name); if (index != -1) { auto subScopeName = scopeName->children.Values()[index]; found = true; foundStaticMember = true; results.Add(ResolveExpressionResult::ScopeName(subScopeName)); } } if (auto group = typeDescriptor->GetMethodGroupByName(name, false)) { for (vint i = 0; i < group->GetMethodCount(); i++) { auto info = group->GetMethod(i); if (info->IsStatic()) { found = true; foundStaticMember = true; results.Add(ResolveExpressionResult::Method(info)); } } } if (foundStaticMember && preferStatic) { return true; } if (auto group = typeDescriptor->GetMethodGroupByName(name, false)) { for (vint i = 0; i < group->GetMethodCount(); i++) { auto info = group->GetMethod(i); if (!info->IsStatic()) { found = true; results.Add(ResolveExpressionResult::Method(info)); } } } if (auto info = typeDescriptor->GetPropertyByName(name, false)) { found = true; results.Add(ResolveExpressionResult::Property(info)); } if (auto info = typeDescriptor->GetEventByName(name, false)) { found = true; results.Add(ResolveExpressionResult::Event(info)); } if (!found) { vint count = typeDescriptor->GetBaseTypeDescriptorCount(); for (vint i = 0; i < count; i++) { if (ResolveMember(typeDescriptor->GetBaseTypeDescriptor(i), name, preferStatic, searchedTypes, results)) { found = true; } } } return found; } class UsingPathToNameVisitor :public Object, public WfModuleUsingFragment::IVisitor { public: WString name; WString result; UsingPathToNameVisitor(const WString& _name) :name(_name) { } void Visit(WfModuleUsingNameFragment* node) { result = node->name.value; } void Visit(WfModuleUsingWildCardFragment* node) { result = name; } static WString Execute(Ptr fragment, const WString& name) { UsingPathToNameVisitor visitor(name); fragment->Accept(&visitor); return visitor.result; } }; bool WfLexicalScopeManager::ResolveName(WfLexicalScope* scope, const WString& name, collections::List& results) { vint oldResultCount = results.Count(); bool visibleToNonStatic = false; WfLexicalScope* firstConfigScope = nullptr; while (scope) { if (scope->ownerNode.Cast() || scope->ownerNode.Cast()) { break; } if (scope->functionConfig) { visibleToNonStatic = scope->functionConfig->thisAccessable || scope->functionConfig->parentThisAccessable; if (!firstConfigScope) { firstConfigScope = scope; } } vint index = scope->symbols.Keys().IndexOf(name); if (index != -1) { if (scope->typeOfThisExpr) { if (scope->ownerNode.Cast()) { for (auto symbol : scope->symbols.GetByIndex(index)) { if (auto functionDecl = symbol->creatorNode.Cast()) { if (firstConfigScope->parentScope != scope || functionDecl->functionKind != WfFunctionKind::Normal) { continue; } } else if (auto autoPropDecl = symbol->creatorNode.Cast()) { if (firstConfigScope->parentScope != scope || autoPropDecl->functionKind != WfFunctionKind::Normal) { continue; } } auto result = ResolveExpressionResult::Symbol(symbol); if (!results.Contains(result)) { results.Add(result); } } } } else { for (auto symbol : scope->symbols.GetByIndex(index)) { auto result = ResolveExpressionResult::Symbol(symbol); if (!results.Contains(result)) { results.Add(result); } } } } if (scope->typeOfThisExpr) { SortedList searchedTypes; ResolveMember(scope->typeOfThisExpr, name, !visibleToNonStatic, searchedTypes, results); } scope = scope->parentScope.Obj(); } while (scope) { if (auto nsDecl = scope->ownerNode.Cast()) { auto scopeName = namespaceNames[nsDecl.Obj()]; vint index = scopeName->children.Keys().IndexOf(name); if (index != -1) { auto subScopeName = scopeName->children.Values()[index]; auto result = ResolveExpressionResult::ScopeName(subScopeName); if (!results.Contains(result)) { results.Add(result); } } scope = scope->parentScope.Obj(); } else { break; } } vint index = globalName->children.Keys().IndexOf(name); if (index != -1) { auto subScopeName = globalName->children.Values()[index]; auto result = ResolveExpressionResult::ScopeName(subScopeName); if (!results.Contains(result)) { results.Add(result); } } if (auto module = scope->ownerNode.Cast()) { for (auto path : module->paths) { auto scopeName = globalName; for (auto item : path->items) { WString fragmentName; for (auto fragment : item->fragments) { fragmentName += UsingPathToNameVisitor::Execute(fragment, name); } vint index = scopeName->children.Keys().IndexOf(fragmentName); if (index == -1) goto USING_PATH_MATCHING_FAILED; scopeName = scopeName->children.Values()[index]; } { auto result = ResolveExpressionResult::ScopeName(scopeName); if (!results.Contains(result)) { results.Add(result); } } USING_PATH_MATCHING_FAILED:; } } return results.Count() > oldResultCount; } Ptr WfLexicalScopeManager::GetDeclarationSymbol(WfLexicalScope* scope, WfDeclaration* node) { auto symbol = From(scope->parentScope->symbols[node->name.value]) .Where([=](Ptr symbol) { return symbol->creatorNode == node; }) .First(); return symbol; } void WfLexicalScopeManager::CreateLambdaCapture(glr::ParsingAstBase* node, Ptr capture) { if (!capture) { capture = Ptr(new WfLexicalCapture); } lambdaCaptures.Add(node, capture); } } } } /*********************************************************************** .\ANALYZER\WFANALYZER_BUILDGLOBALNAMEFROMMODULES.CPP ***********************************************************************/ namespace vl { namespace workflow { namespace analyzer { using namespace reflection::description; using namespace typeimpl; /*********************************************************************** BuildGlobalNameFromModules ***********************************************************************/ class BuildClassMemberVisitor : public Object , public WfDeclaration::IVisitor , public WfVirtualCseDeclaration::IVisitor { public: WfLexicalScopeManager* manager; Ptr scopeName; WfClassDeclaration* classDecl; Ptr td; BuildClassMemberVisitor(WfLexicalScopeManager* _manager, Ptr _scopeName, WfClassDeclaration* _classDecl, Ptr _td) :manager(_manager) , scopeName(_scopeName) , classDecl(_classDecl) , td(_td) { } static WString GetTypeName(WfLexicalScopeManager* manager, Ptr scopeName) { WString typeName = scopeName->name; { WfLexicalScopeName* name = scopeName->parent; while (name && name != manager->globalName.Obj()) { typeName = name->name + L"::" + typeName; name = name->parent; } } return typeName; } static void AddCustomType(WfLexicalScopeManager* manager, Ptr scopeName, WfDeclaration* declaration, Ptr td) { manager->declarationTypes.Add(Ptr(declaration), td); if (!scopeName->typeDescriptor) { scopeName->typeDescriptor = td.Obj(); manager->typeNames.Add(td.Obj(), scopeName); } } static void BuildClass(WfLexicalScopeManager* manager, Ptr scopeName, WfClassDeclaration* declaration) { WString typeName = GetTypeName(manager, scopeName); Ptr td; switch (declaration->kind) { case WfClassKind::Class: td = Ptr(new WfClass(typeName)); break; case WfClassKind::Interface: td = Ptr(new WfInterface(typeName)); break; default:; } AddCustomType(manager, scopeName, declaration, td); for (auto memberDecl : declaration->declarations) { BuildClassMemberVisitor visitor(manager, scopeName, declaration, td); memberDecl->Accept(&visitor); } } void Visit(WfNamespaceDeclaration* node)override { } void Visit(WfFunctionDeclaration* node)override { if (node->functionKind == WfFunctionKind::Static) { auto info = Ptr(new WfStaticMethod); td->AddMember(node->name.value, info); manager->declarationMemberInfos.Add(Ptr(node), info); } else { switch (classDecl->kind) { case WfClassKind::Class: { auto info = Ptr(new WfClassMethod); td->AddMember(node->name.value, info); manager->declarationMemberInfos.Add(Ptr(node), info); } break; case WfClassKind::Interface: { auto info = Ptr(new WfInterfaceMethod); td->AddMember(node->name.value, info); manager->declarationMemberInfos.Add(Ptr(node), info); } break; default:; } } } void Visit(WfVariableDeclaration* node)override { auto info = Ptr(new WfField(td.Obj(), node->name.value)); td->AddMember(info); manager->declarationMemberInfos.Add(Ptr(node), info); } void Visit(WfEventDeclaration* node)override { auto info = Ptr(new WfEvent(td.Obj(), node->name.value)); td->AddMember(info); manager->declarationMemberInfos.Add(Ptr(node), info); } void Visit(WfPropertyDeclaration* node)override { auto info = Ptr(new WfProperty(td.Obj(), node->name.value)); td->AddMember(info); manager->declarationMemberInfos.Add(Ptr(node), info); } void Visit(WfStaticInitDeclaration* node)override { } void Visit(WfConstructorDeclaration* node)override { Ptr typeInfo; { auto elementType = Ptr(new TypeDescriptorTypeInfo(td.Obj(), TypeInfoHint::Normal)); if (node->constructorType == WfConstructorType::RawPtr) { typeInfo = Ptr(new RawPtrTypeInfo(elementType)); } else { typeInfo = Ptr(new SharedPtrTypeInfo(elementType)); } } auto info = Ptr(new WfClassConstructor(typeInfo)); td->AddMember(info); manager->declarationMemberInfos.Add(Ptr(node), info); } void Visit(WfDestructorDeclaration* node)override { } void Visit(WfClassDeclaration* node)override { auto newScopeName = scopeName->AccessChild(node->name.value, false); newScopeName->declarations.Add(Ptr(node)); BuildClass(manager, newScopeName, node); } void Visit(WfEnumDeclaration* node)override { BuildNameForDeclaration(manager, scopeName, Ptr(node)); } void Visit(WfStructDeclaration* node)override { BuildNameForDeclaration(manager, scopeName, Ptr(node)); } void Visit(WfVirtualCfeDeclaration* node)override { for (auto decl : node->expandedDeclarations) { decl->Accept(this); } } void Visit(WfVirtualCseDeclaration* node)override { node->Accept((WfVirtualCseDeclaration::IVisitor*)this); } void Visit(WfStateMachineDeclaration* node)override { for (auto input : node->inputs) { auto info = Ptr(new WfClassMethod); td->AddMember(input->name.value, info); manager->stateInputMethods.Add(input, info); for (auto argument : input->arguments) { auto info = Ptr(new WfField(td.Obj(), L"name.value + L">" + argument->name.value)); td->AddMember(info); manager->stateInputArguments.Add(argument, info); } } for (auto state : node->states) { for (auto argument : state->arguments) { auto info = Ptr(new WfField(td.Obj(), L"name.value + L">" + argument->name.value)); td->AddMember(info); manager->stateDeclArguments.Add(argument, info); } } auto smInfo = Ptr(new WfStateMachineInfo); { smInfo->createCoroutineMethod = Ptr(new WfClassMethod); td->AddMember(L"CreateCoroutine", smInfo->createCoroutineMethod); } manager->stateMachineInfos.Add(Ptr(node), smInfo); } }; class BuildNameDeclarationVisitor : public empty_visitor::DeclarationVisitor , public empty_visitor::VirtualCseDeclarationVisitor { public: WfLexicalScopeManager* manager; Ptr scopeName; BuildNameDeclarationVisitor(WfLexicalScopeManager* _manager, Ptr _scopeName) :manager(_manager) , scopeName(_scopeName) { } void Dispatch(WfVirtualCfeDeclaration* node)override { for (auto decl : node->expandedDeclarations) { decl->Accept(this); } } void Dispatch(WfVirtualCseDeclaration* node)override { node->Accept((WfVirtualCseDeclaration::IVisitor*)this); } void Visit(WfNamespaceDeclaration* node)override { manager->namespaceNames.Add(Ptr(node), scopeName); for (auto subDecl : node->declarations) { BuildNameForDeclaration(manager, scopeName, subDecl); } } void Visit(WfClassDeclaration* node)override { BuildClassMemberVisitor::BuildClass(manager, scopeName, node); } void Visit(WfEnumDeclaration* node)override { auto td = Ptr(new WfEnum(node->kind == WfEnumKind::Flag, BuildClassMemberVisitor::GetTypeName(manager, scopeName))); BuildClassMemberVisitor::AddCustomType(manager, scopeName, node, td); } void Visit(WfStructDeclaration* node)override { auto td = Ptr(new WfStruct(BuildClassMemberVisitor::GetTypeName(manager, scopeName))); BuildClassMemberVisitor::AddCustomType(manager, scopeName, node, td); } }; void BuildNameForDeclaration(WfLexicalScopeManager* manager, Ptr name, Ptr decl) { auto scopeName = name->AccessChild(decl->name.value, false); scopeName->declarations.Add(decl); BuildNameDeclarationVisitor visitor(manager, scopeName); decl->Accept(&visitor); } void BuildGlobalNameFromModules(WfLexicalScopeManager* manager) { for (auto module : manager->GetModules()) { for (auto decl : module->declarations) { BuildNameForDeclaration(manager, manager->globalName, decl); } } } } } } /*********************************************************************** .\ANALYZER\WFANALYZER_BUILDGLOBALNAMEFROMTYPEDESCRIPTORS.CPP ***********************************************************************/ namespace vl { namespace workflow { namespace analyzer { using namespace reflection::description; /*********************************************************************** BuildGlobalNameFromTypeDescriptors ***********************************************************************/ void BuildGlobalNameFromTypeDescriptors(WfLexicalScopeManager* manager) { for (vint i = 0; i < GetGlobalTypeManager()->GetTypeDescriptorCount(); i++) { ITypeDescriptor* typeDescriptor = GetGlobalTypeManager()->GetTypeDescriptor(i); WString name = typeDescriptor->GetTypeName(); const wchar_t* reading = name.Buffer(); Ptr currentName = manager->globalName; while (true) { WString fragment; const wchar_t* delimiter = wcsstr(reading, L"::"); if (delimiter) { fragment = WString::CopyFrom(reading, vint(delimiter - reading)); reading = delimiter + 2; } else { fragment = reading; reading = 0; } currentName = currentName->AccessChild(fragment, true); if (!reading) { currentName->typeDescriptor = typeDescriptor; manager->typeNames.Add(typeDescriptor, currentName); break; } } } } } } } /*********************************************************************** .\ANALYZER\WFANALYZER_BUILDSCOPE.CPP ***********************************************************************/ namespace vl { namespace workflow { namespace analyzer { using namespace collections; using namespace reflection::description; /*********************************************************************** BuildScopeForDeclaration ***********************************************************************/ class BuildScopeForDeclarationVisitor : public Object , public WfDeclaration::IVisitor , public WfVirtualCseDeclaration::IVisitor { public: WfLexicalScopeManager* manager; glr::ParsingAstBase* source; Ptr parentScope; Ptr resultScope; BuildScopeForDeclarationVisitor(WfLexicalScopeManager* _manager, Ptr _parentScope, glr::ParsingAstBase* _source) :manager(_manager) , source(_source) , parentScope(_parentScope) { } void Visit(Ptr scope, List>& attributes) { for (auto attribute : attributes) { if (attribute->value) { BuildScopeForExpression(manager, scope, attribute->value); } } } void Visit(WfNamespaceDeclaration* node)override { auto symbol = Ptr(new WfLexicalSymbol(parentScope.Obj())); symbol->name = node->name.value; symbol->creatorNode = Ptr(node); parentScope->symbols.Add(symbol->name, symbol); resultScope = Ptr(new WfLexicalScope(parentScope)); for (auto declaration : node->declarations) { BuildScopeForDeclaration(manager, resultScope, declaration, node); } } void Visit(WfFunctionDeclaration* node)override { resultScope = Ptr(new WfLexicalScope(parentScope)); auto config = Ptr(new WfLexicalFunctionConfig); resultScope->functionConfig = config; resultScope->ownerNodeSource = source; if (source) { if (dynamic_cast(source)) { config->lambda = true; config->thisAccessable = false; config->parentThisAccessable = true; } else if (dynamic_cast(source)) { config->lambda = true; config->thisAccessable = true; config->parentThisAccessable = true; } else if (dynamic_cast(source)) { config->lambda = false; config->thisAccessable = node->functionKind != WfFunctionKind::Static; config->parentThisAccessable = false; } } if (node->anonymity == WfFunctionAnonymity::Named) { Ptr functionNameScope = parentScope; if (source && dynamic_cast(source)) { functionNameScope = resultScope; } auto symbol = Ptr(new WfLexicalSymbol(functionNameScope.Obj())); symbol->name = node->name.value; symbol->creatorNode = Ptr(node); { auto type = Ptr(new WfFunctionType); type->result = node->returnType; for (auto argument : node->arguments) { type->arguments.Add(argument->type); } symbol->type = type; } functionNameScope->symbols.Add(symbol->name, symbol); } if (node->statement) { for (auto argument : node->arguments) { auto argumentSymbol = Ptr(new WfLexicalSymbol(resultScope.Obj())); argumentSymbol->name = argument->name.value; argumentSymbol->type = argument->type; argumentSymbol->creatorNode = argument; resultScope->symbols.Add(argumentSymbol->name, argumentSymbol); Visit(parentScope, argument->attributes); } BuildScopeForStatement(manager, resultScope, node->statement); } } void Visit(WfVariableDeclaration* node)override { auto symbol = Ptr(new WfLexicalSymbol(parentScope.Obj())); symbol->name = node->name.value; symbol->creatorNode = Ptr(node); symbol->type = node->type; parentScope->symbols.Add(symbol->name, symbol); BuildScopeForExpression(manager, parentScope, node->expression); } void Visit(WfEventDeclaration* node)override { auto symbol = Ptr(new WfLexicalSymbol(parentScope.Obj())); symbol->name = node->name.value; symbol->creatorNode = Ptr(node); parentScope->symbols.Add(symbol->name, symbol); } void Visit(WfPropertyDeclaration* node)override { auto symbol = Ptr(new WfLexicalSymbol(parentScope.Obj())); symbol->name = node->name.value; symbol->creatorNode = Ptr(node); symbol->type = node->type; parentScope->symbols.Add(symbol->name, symbol); } void Visit(WfStaticInitDeclaration* node)override { resultScope = Ptr(new WfLexicalScope(parentScope)); auto config = Ptr(new WfLexicalFunctionConfig); resultScope->functionConfig = config; BuildScopeForStatement(manager, resultScope, node->statement); } void Visit(WfConstructorDeclaration* node)override { resultScope = Ptr(new WfLexicalScope(parentScope)); for (auto argument : node->arguments) { auto argumentSymbol = Ptr(new WfLexicalSymbol(resultScope.Obj())); argumentSymbol->name = argument->name.value; argumentSymbol->type = argument->type; argumentSymbol->creatorNode = argument; resultScope->symbols.Add(argumentSymbol->name, argumentSymbol); } for (auto call : node->baseConstructorCalls) { for (auto argument : call->arguments) { BuildScopeForExpression(manager, resultScope, argument); } } auto bodyScope = Ptr(new WfLexicalScope(resultScope)); { auto config = Ptr(new WfLexicalFunctionConfig); bodyScope->functionConfig = config; config->lambda = false; config->thisAccessable = true; config->parentThisAccessable = false; } BuildScopeForStatement(manager, bodyScope, node->statement); } void Visit(WfDestructorDeclaration* node)override { resultScope = Ptr(new WfLexicalScope(parentScope)); { auto config = Ptr(new WfLexicalFunctionConfig); resultScope->functionConfig = config; config->lambda = false; config->thisAccessable = true; config->parentThisAccessable = false; } BuildScopeForStatement(manager, resultScope, node->statement); } void Visit(WfClassDeclaration* node)override { auto symbol = Ptr(new WfLexicalSymbol(parentScope.Obj())); symbol->name = node->name.value; symbol->creatorNode = Ptr(node); parentScope->symbols.Add(symbol->name, symbol); auto td = manager->declarationTypes[node]; resultScope = Ptr(new WfLexicalScope(parentScope)); resultScope->typeOfThisExpr = td.Obj(); for (auto memberDecl : node->declarations) { BuildScopeForDeclaration(manager, resultScope, memberDecl, node); } } void Visit(WfEnumDeclaration* node)override { auto symbol = Ptr(new WfLexicalSymbol(parentScope.Obj())); symbol->name = node->name.value; symbol->creatorNode = Ptr(node); parentScope->symbols.Add(symbol->name, symbol); for (auto item : node->items) { Visit(parentScope, item->attributes); } } void Visit(WfStructDeclaration* node)override { auto symbol = Ptr(new WfLexicalSymbol(parentScope.Obj())); symbol->name = node->name.value; symbol->creatorNode = Ptr(node); parentScope->symbols.Add(symbol->name, symbol); for (auto member : node->members) { Visit(parentScope, member->attributes); } } void Visit(WfVirtualCfeDeclaration* node)override { for (auto decl : node->expandedDeclarations) { Execute(manager, parentScope, source, decl); } } void Visit(WfVirtualCseDeclaration* node)override { node->Accept((WfVirtualCseDeclaration::IVisitor*)this); } void Visit(WfStateMachineDeclaration* node)override { for (auto input : node->inputs) { auto stateSymbol = Ptr(new WfLexicalSymbol(parentScope.Obj())); stateSymbol->name = input->name.value; stateSymbol->creatorNode = input; parentScope->symbols.Add(stateSymbol->name, stateSymbol); } for (auto state : node->states) { auto stateSymbol = Ptr(new WfLexicalSymbol(parentScope.Obj())); stateSymbol->name = state->name.value; stateSymbol->creatorNode = state; parentScope->symbols.Add(stateSymbol->name, stateSymbol); auto stateScope = Ptr(new WfLexicalScope(parentScope)); { auto config = Ptr(new WfLexicalFunctionConfig); stateScope->functionConfig = config; config->lambda = false; config->thisAccessable = true; config->parentThisAccessable = true; } stateScope->ownerNode = state; manager->nodeScopes.Add(state.Obj(), stateScope); for (auto argument : state->arguments) { auto argumentSymbol = Ptr(new WfLexicalSymbol(stateScope.Obj())); argumentSymbol->name = argument->name.value; argumentSymbol->type = argument->type; argumentSymbol->creatorNode = argument; stateScope->symbols.Add(argumentSymbol->name, argumentSymbol); } BuildScopeForStatement(manager, stateScope, state->statement); } } static Ptr Execute(WfLexicalScopeManager* manager, Ptr parentScope, glr::ParsingAstBase* source, Ptr declaration) { BuildScopeForDeclarationVisitor visitor(manager, parentScope, source); declaration->Accept(&visitor); visitor.Visit(parentScope, declaration->attributes); manager->declaractionScopeSources.Add(declaration, source); if (visitor.resultScope) { manager->nodeScopes.Add(declaration.Obj(), visitor.resultScope); visitor.resultScope->ownerNode = declaration; } else { manager->nodeScopes.Add(declaration.Obj(), parentScope); } return visitor.resultScope; } }; /*********************************************************************** BuildScopeForStatement ***********************************************************************/ class BuildScopeForStatementVisitor : public Object , public WfStatement::IVisitor , public WfVirtualCseStatement::IVisitor , public WfCoroutineStatement::IVisitor , public WfStateMachineStatement::IVisitor { public: WfLexicalScopeManager* manager; Ptr parentScope; Ptr resultScope; BuildScopeForStatementVisitor(WfLexicalScopeManager* _manager, Ptr _parentScope) :manager(_manager) , parentScope(_parentScope) { } void Visit(WfBreakStatement* node)override { } void Visit(WfContinueStatement* node)override { } void Visit(WfReturnStatement* node)override { if (node->expression) { BuildScopeForExpression(manager, parentScope, node->expression); } } void Visit(WfDeleteStatement* node)override { BuildScopeForExpression(manager, parentScope, node->expression); } void Visit(WfRaiseExceptionStatement* node)override { if (node->expression) { BuildScopeForExpression(manager, parentScope, node->expression); } } void Visit(WfIfStatement* node)override { resultScope = Ptr(new WfLexicalScope(parentScope)); if (node->type) { auto symbol = Ptr(new WfLexicalSymbol(resultScope.Obj())); symbol->name = node->name.value; symbol->type = node->type; symbol->creatorNode = Ptr(node); resultScope->symbols.Add(symbol->name, symbol); } BuildScopeForExpression(manager, resultScope, node->expression); BuildScopeForStatement(manager, resultScope, node->trueBranch); if (node->falseBranch) { BuildScopeForStatement(manager, resultScope, node->falseBranch); } } void Visit(WfWhileStatement* node)override { BuildScopeForExpression(manager, parentScope, node->condition); BuildScopeForStatement(manager, parentScope, node->statement); } void Visit(WfTryStatement* node)override { BuildScopeForStatement(manager, parentScope, node->protectedStatement); if (node->catchStatement) { resultScope = Ptr(new WfLexicalScope(parentScope)); auto symbol = Ptr(new WfLexicalSymbol(resultScope.Obj())); symbol->name = node->name.value; symbol->creatorNode = Ptr(node); { auto system = Ptr(new WfTopQualifiedType); system->name.value = L"system"; auto exception = Ptr(new WfChildType); exception->parent = system; exception->name.value = L"Exception"; auto sharedPtr = Ptr(new WfSharedPointerType); sharedPtr->element = exception; symbol->type = sharedPtr; } resultScope->symbols.Add(symbol->name, symbol); BuildScopeForStatement(manager, resultScope, node->catchStatement); } if (node->finallyStatement) { BuildScopeForStatement(manager, parentScope, node->finallyStatement); } } void Visit(WfBlockStatement* node)override { resultScope = Ptr(new WfLexicalScope(parentScope)); for (auto statement : node->statements) { BuildScopeForStatement(manager, resultScope, statement); } } void Visit(WfGotoStatement* node)override { } void Visit(WfExpressionStatement* node)override { BuildScopeForExpression(manager, parentScope, node->expression); } void Visit(WfVariableStatement* node)override { BuildScopeForDeclaration(manager, parentScope, node->variable, node); } void Visit(WfVirtualCseStatement* node)override { node->Accept((WfVirtualCseStatement::IVisitor*)this); } void Visit(WfSwitchStatement* node)override { BuildScopeForExpression(manager, parentScope, node->expression); for (auto switchCase : node->caseBranches) { BuildScopeForExpression(manager, parentScope, switchCase->expression); BuildScopeForStatement(manager, parentScope, switchCase->statement); } if (node->defaultBranch) { BuildScopeForStatement(manager, parentScope, node->defaultBranch); } } void Visit(WfForEachStatement* node)override { resultScope = Ptr(new WfLexicalScope(parentScope)); auto symbol = Ptr(new WfLexicalSymbol(resultScope.Obj())); symbol->name = node->name.value; symbol->creatorNode = Ptr(node); resultScope->symbols.Add(symbol->name, symbol); BuildScopeForExpression(manager, parentScope, node->collection); BuildScopeForStatement(manager, resultScope, node->statement); } void Visit(WfCoProviderStatement* node)override { resultScope = Ptr(new WfLexicalScope(parentScope)); { auto symbol = Ptr(new WfLexicalSymbol(resultScope.Obj())); symbol->name = L"$PROVIDER"; symbol->creatorNode = Ptr(node); resultScope->symbols.Add(symbol->name, symbol); } { auto symbol = Ptr(new WfLexicalSymbol(resultScope.Obj())); symbol->name = L"$IMPL"; symbol->creatorNode = Ptr(node); resultScope->symbols.Add(symbol->name, symbol); } BuildScopeForStatement(manager, resultScope, node->statement); } void Visit(WfCoroutineStatement* node)override { node->Accept((WfCoroutineStatement::IVisitor*)this); } void Visit(WfCoPauseStatement* node)override { if (node->statement) { BuildScopeForStatement(manager, parentScope, node->statement); } } void Visit(WfCoOperatorStatement* node)override { if (node->varName.value != L"") { auto symbol = Ptr(new WfLexicalSymbol(parentScope.Obj())); symbol->name = node->varName.value; symbol->creatorNode = Ptr(node); parentScope->symbols.Add(symbol->name, symbol); } for (auto argument : node->arguments) { BuildScopeForExpression(manager, parentScope, argument); } } void Visit(WfStateMachineStatement* node)override { node->Accept((WfStateMachineStatement::IVisitor*)this); } void Visit(WfStateSwitchStatement* node)override { resultScope = Ptr(new WfLexicalScope(parentScope)); for (auto switchCase : node->caseBranches) { auto caseScope = Ptr(new WfLexicalScope(resultScope)); caseScope->ownerNode = switchCase; manager->nodeScopes.Add(switchCase.Obj(), caseScope); for (auto argument : switchCase->arguments) { auto symbol = Ptr(new WfLexicalSymbol(caseScope.Obj())); symbol->name = argument->name.value; symbol->creatorNode = argument; caseScope->symbols.Add(symbol->name, symbol); } BuildScopeForStatement(manager, caseScope, switchCase->statement); } } void Visit(WfStateInvokeStatement* node)override { for (auto argument : node->arguments) { BuildScopeForExpression(manager, parentScope, argument); } } static Ptr Execute(WfLexicalScopeManager* manager, Ptr parentScope, Ptr statement) { BuildScopeForStatementVisitor visitor(manager, parentScope); statement->Accept(&visitor); if (visitor.resultScope) { manager->nodeScopes.Add(statement.Obj(), visitor.resultScope); visitor.resultScope->ownerNode = statement; } else { manager->nodeScopes.Add(statement.Obj(), parentScope); } return visitor.resultScope; } }; /*********************************************************************** BuildScopeForExpression ***********************************************************************/ class BuildScopeForExpressionVisitor : public Object , public WfExpression::IVisitor , public WfVirtualCseExpression::IVisitor { public: WfLexicalScopeManager* manager; Ptr parentScope; Ptr resultScope; BuildScopeForExpressionVisitor(WfLexicalScopeManager* _manager, Ptr _parentScope) :manager(_manager) , parentScope(_parentScope) { } void Visit(WfThisExpression* node)override { } void Visit(WfTopQualifiedExpression* node)override { } void Visit(WfReferenceExpression* node)override { } void Visit(WfOrderedNameExpression* node)override { } void Visit(WfOrderedLambdaExpression* node)override { manager->CreateLambdaCapture(node); SortedList names; SearchOrderedName(parentScope.Obj(), node->body, names); resultScope = Ptr(new WfLexicalScope(parentScope)); auto config = Ptr(new WfLexicalFunctionConfig); resultScope->functionConfig = config; config->lambda = true; config->thisAccessable = false; config->parentThisAccessable = true; for (auto name : names) { auto symbol = Ptr(new WfLexicalSymbol(resultScope.Obj())); symbol->name = L"$" + itow(name); symbol->creatorNode = Ptr(node); resultScope->symbols.Add(symbol->name, symbol); } BuildScopeForExpression(manager, resultScope, node->body); } void Visit(WfMemberExpression* node)override { BuildScopeForExpression(manager, parentScope, node->parent); } void Visit(WfChildExpression* node)override { BuildScopeForExpression(manager, parentScope, node->parent); } void Visit(WfLiteralExpression* node)override { } void Visit(WfFloatingExpression* node)override { } void Visit(WfIntegerExpression* node)override { } void Visit(WfStringExpression* node)override { } void Visit(WfUnaryExpression* node)override { BuildScopeForExpression(manager, parentScope, node->operand); } void Visit(WfBinaryExpression* node)override { BuildScopeForExpression(manager, parentScope, node->first); BuildScopeForExpression(manager, parentScope, node->second); } void Visit(WfLetExpression* node)override { resultScope = Ptr(new WfLexicalScope(parentScope)); for (auto variable : node->variables) { auto symbol = Ptr(new WfLexicalSymbol(resultScope.Obj())); symbol->name = variable->name.value; symbol->creatorNode = Ptr(node); resultScope->symbols.Add(symbol->name, symbol); BuildScopeForExpression(manager, resultScope, variable->value); } BuildScopeForExpression(manager, resultScope, node->expression); } void Visit(WfIfExpression* node)override { BuildScopeForExpression(manager, parentScope, node->condition); BuildScopeForExpression(manager, parentScope, node->trueBranch); BuildScopeForExpression(manager, parentScope, node->falseBranch); } void Visit(WfRangeExpression* node)override { BuildScopeForExpression(manager, parentScope, node->begin); BuildScopeForExpression(manager, parentScope, node->end); } void Visit(WfSetTestingExpression* node)override { BuildScopeForExpression(manager, parentScope, node->element); BuildScopeForExpression(manager, parentScope, node->collection); } void Visit(WfConstructorExpression* node)override { for (auto argument : node->arguments) { BuildScopeForExpression(manager, parentScope, argument->key); if (argument->value) { BuildScopeForExpression(manager, parentScope, argument->value); } } } void Visit(WfInferExpression* node)override { BuildScopeForExpression(manager, parentScope, node->expression); } void Visit(WfTypeCastingExpression* node)override { BuildScopeForExpression(manager, parentScope, node->expression); } void Visit(WfTypeTestingExpression* node)override { if (node->expression) { BuildScopeForExpression(manager, parentScope, node->expression); } } void Visit(WfTypeOfTypeExpression* node)override { } void Visit(WfTypeOfExpressionExpression* node)override { BuildScopeForExpression(manager, parentScope, node->expression); } void Visit(WfAttachEventExpression* node)override { BuildScopeForExpression(manager, parentScope, node->event); BuildScopeForExpression(manager, parentScope, node->function); } void Visit(WfDetachEventExpression* node)override { BuildScopeForExpression(manager, parentScope, node->event); BuildScopeForExpression(manager, parentScope, node->handler); } void Visit(WfObserveExpression* node)override { BuildScopeForExpression(manager, parentScope, node->parent); if (node->observeType == WfObserveType::SimpleObserve) { BuildScopeForExpression(manager, parentScope, node->expression); for (auto event : node->events) { BuildScopeForExpression(manager, parentScope, event); } } else { resultScope = Ptr(new WfLexicalScope(parentScope)); { auto symbol = Ptr(new WfLexicalSymbol(resultScope.Obj())); symbol->name = node->name.value; symbol->creatorNode = Ptr(node); resultScope->symbols.Add(symbol->name, symbol); } BuildScopeForExpression(manager, resultScope, node->expression); for (auto event : node->events) { BuildScopeForExpression(manager, resultScope, event); } } } void Visit(WfCallExpression* node)override { BuildScopeForExpression(manager, parentScope, node->function); for (auto argument : node->arguments) { BuildScopeForExpression(manager, parentScope, argument); } } void Visit(WfFunctionExpression* node)override { manager->CreateLambdaCapture(node->function.Obj()); BuildScopeForDeclaration(manager, parentScope, node->function, node); } void Visit(WfNewClassExpression* node)override { for (auto argument : node->arguments) { BuildScopeForExpression(manager, parentScope, argument); } } class CreateLambdaCaptureVisitor : public empty_visitor::DeclarationVisitor { public: WfLexicalScopeManager* manager; Ptr capture; CreateLambdaCaptureVisitor(WfLexicalScopeManager* _manager, Ptr _capture) :manager(_manager) , capture(_capture) { } void Dispatch(WfVirtualCfeDeclaration* node)override { for (auto decl : node->expandedDeclarations) { decl->Accept(this); } } void Dispatch(WfVirtualCseDeclaration* node)override { } void Visit(WfFunctionDeclaration* node)override { manager->CreateLambdaCapture(node, capture); } }; void Visit(WfNewInterfaceExpression* node)override { resultScope = Ptr(new WfLexicalScope(parentScope)); auto capture = Ptr(new WfLexicalCapture); manager->CreateLambdaCapture(node, capture); CreateLambdaCaptureVisitor visitor(manager, capture); for (auto memberDecl : node->declarations) { memberDecl->Accept(&visitor); BuildScopeForDeclaration(manager, resultScope, memberDecl, node); } } void Visit(WfVirtualCfeExpression* node)override { BuildScopeForExpression(manager, parentScope, node->expandedExpression); } void Visit(WfVirtualCseExpression* node)override { node->Accept((WfVirtualCseExpression::IVisitor*)this); } void Visit(WfBindExpression* node)override { BuildScopeForExpression(manager, parentScope, node->expression); } void Visit(WfNewCoroutineExpression* node)override { manager->CreateLambdaCapture(node); resultScope = Ptr(new WfLexicalScope(parentScope)); auto config = Ptr(new WfLexicalFunctionConfig); resultScope->functionConfig = config; if (node->name.value != L"") { auto symbol = Ptr(new WfLexicalSymbol(resultScope.Obj())); symbol->name = node->name.value; symbol->creatorNode = Ptr(node); symbol->typeInfo = TypeInfoRetriver>::CreateTypeInfo(); symbol->type = GetTypeFromTypeInfo(symbol->typeInfo.Obj()); resultScope->symbols.Add(symbol->name, symbol); } config->lambda = true; config->thisAccessable = false; config->parentThisAccessable = true; BuildScopeForStatement(manager, resultScope, node->statement); } void Visit(WfMixinCastExpression* node)override { BuildScopeForExpression(manager, parentScope, node->expression); } void Visit(WfExpectedTypeCastExpression* node)override { BuildScopeForExpression(manager, parentScope, node->expression); } void Visit(WfCoOperatorExpression* node)override { } static Ptr Execute(WfLexicalScopeManager* manager, Ptr parentScope, Ptr expression) { BuildScopeForExpressionVisitor visitor(manager, parentScope); expression->Accept(&visitor); if (visitor.resultScope) { manager->nodeScopes.Add(expression.Obj(), visitor.resultScope); visitor.resultScope->ownerNode = expression; } else { manager->nodeScopes.Add(expression.Obj(), parentScope); } return visitor.resultScope; } }; /*********************************************************************** BuildScope ***********************************************************************/ void BuildScopeForModule(WfLexicalScopeManager* manager, Ptr module) { auto scope = Ptr(new WfLexicalScope(manager)); scope->ownerNode = module; manager->nodeScopes.Add(module.Obj(), scope); for (auto declaration : module->declarations) { BuildScopeForDeclaration(manager, scope, declaration, module.Obj()); } } void BuildScopeForDeclaration(WfLexicalScopeManager* manager, Ptr parentScope, Ptr declaration, glr::ParsingAstBase* source) { BuildScopeForDeclarationVisitor::Execute(manager, parentScope, source, declaration); } void BuildScopeForStatement(WfLexicalScopeManager* manager, Ptr parentScope, Ptr statement) { BuildScopeForStatementVisitor::Execute(manager, parentScope, statement); } void BuildScopeForExpression(WfLexicalScopeManager* manager, Ptr parentScope, Ptr expression) { BuildScopeForExpressionVisitor::Execute(manager, parentScope, expression); } } } } /*********************************************************************** .\ANALYZER\WFANALYZER_CHECKSCOPES_CYCLEDEPENDENCY.CPP ***********************************************************************/ namespace vl { namespace workflow { namespace analyzer { using namespace collections; using namespace reflection; using namespace reflection::description; using namespace typeimpl; /*********************************************************************** CheckBaseClass ***********************************************************************/ class CheckCycleDependencyDeclarationVisitor : public empty_visitor::DeclarationVisitor , public empty_visitor::VirtualCseDeclarationVisitor { public: WfLexicalScopeManager* manager; ITypeDescriptor* tdDescriptableObject = description::GetTypeDescriptor(); ITypeDescriptor* tdIDescriptable = description::GetTypeDescriptor(); vint step = 0; Dictionary depItems; Group depGroup; CheckCycleDependencyDeclarationVisitor(WfLexicalScopeManager* _manager) :manager(_manager) { } void Dispatch(WfVirtualCfeDeclaration* node)override { for (auto decl : node->expandedDeclarations) { decl->Accept(this); } } void Dispatch(WfVirtualCseDeclaration* node)override { node->Accept((WfVirtualCseDeclaration::IVisitor*)this); } void Visit(WfNamespaceDeclaration* node)override { for (auto decl : node->declarations) { decl->Accept(this); } } void Visit(WfStructDeclaration* node)override { auto scope = manager->nodeScopes[node]; auto td = manager->declarationTypes[node].Obj(); if (step == 1) { depItems.Add(td, node); } else if (step == 2) { vint count = td->GetPropertyCount(); for (vint i = 0; i < count; i++) { auto propType = td->GetProperty(i)->GetReturn(); if (propType->GetDecorator() == ITypeInfo::Nullable) { propType = propType->GetElementType(); } if (propType->GetDecorator() == ITypeInfo::TypeDescriptor) { auto propTd = propType->GetTypeDescriptor(); if (!depItems.Keys().Contains(propTd)) continue; if (td == propTd) { List tds; tds.Add(td); manager->errors.Add(WfErrors::StructRecursivelyIncludeItself(node, tds)); } else if (propTd->GetTypeDescriptorFlags() == TypeDescriptorFlags::Struct) { if (!depGroup.Contains(td, propTd)) { depGroup.Add(td, propTd); } } } } } } void Visit(WfClassDeclaration* node)override { auto scope = manager->nodeScopes[node]; auto td = manager->declarationTypes[node].Obj(); if (step == 1) { depItems.Add(td, node); } else if (step == 2) { vint count = td->GetBaseTypeDescriptorCount(); for (vint i = 0; i < count; i++) { auto baseTd = td->GetBaseTypeDescriptor(i); bool isClass = baseTd->GetTypeDescriptorFlags() == TypeDescriptorFlags::Class; bool isInterface = baseTd->GetTypeDescriptorFlags() == TypeDescriptorFlags::Interface; switch (node->kind) { case WfClassKind::Class: { if (!isClass || !baseTd->IsAggregatable()) { if (!dynamic_cast(baseTd) && baseTd != tdDescriptableObject) { manager->errors.Add(WfErrors::WrongBaseTypeOfClass(node, baseTd)); } } } break; case WfClassKind::Interface: { if (!isInterface && baseTd != tdIDescriptable) { manager->errors.Add(WfErrors::WrongBaseTypeOfInterface(node, baseTd)); } } break; default:; } if (!depItems.Keys().Contains(baseTd)) continue; if (baseTd == td) { List tds; tds.Add(td); if (isClass) { manager->errors.Add(WfErrors::ClassRecursiveInheritance(node, tds)); } else if (isInterface) { manager->errors.Add(WfErrors::InterfaceRecursiveInheritance(node, tds)); } } else if (baseTd->GetTypeDescriptorFlags() == td->GetTypeDescriptorFlags()) { if (!depGroup.Contains(td, baseTd)) { depGroup.Add(td, baseTd); } } } } for (auto memberDecl : node->declarations) { memberDecl->Accept(this); } } void Execute(vint _step) { step = _step; for (auto module : manager->GetModules()) { for (auto declaration : module->declarations) { declaration->Accept(this); } } } void ExecuteCollectTypes() { Execute(1); } void ExecuteCollectDependencies() { Execute(2); } }; /*********************************************************************** CheckScopes_CycleDependency ***********************************************************************/ void CheckScopes_DuplicatedBaseClass(WfLexicalScopeManager* manager, WfClassDeclaration* node, ITypeDescriptor* td) { List baseTypes; SortedList duplicatedTypes; baseTypes.Add(td); for (vint i = 0; i < baseTypes.Count(); i++) { auto currentTd = baseTypes[i]; vint count = currentTd->GetBaseTypeDescriptorCount(); for (vint j = 0; j < count; j++) { auto baseTd = currentTd->GetBaseTypeDescriptor(j); if (baseTd->GetTypeDescriptorFlags() == TypeDescriptorFlags::Class && baseTd != description::GetTypeDescriptor()) { if (baseTypes.Contains(baseTd)) { if (!duplicatedTypes.Contains(baseTd)) { duplicatedTypes.Add(baseTd); manager->errors.Add(WfErrors::DuplicatedBaseClass(node, baseTd)); } } else { baseTypes.Add(baseTd); } } } } } bool CheckScopes_CycleDependency(WfLexicalScopeManager* manager) { vint errorCount = manager->errors.Count(); CheckCycleDependencyDeclarationVisitor visitor(manager); visitor.ExecuteCollectTypes(); visitor.ExecuteCollectDependencies(); { PartialOrderingProcessor pop; pop.InitWithGroup(visitor.depItems.Keys(), visitor.depGroup); pop.Sort(); for (vint i = 0; i < pop.components.Count(); i++) { auto& component = pop.components[i]; if (component.nodeCount > 1) { List tds; CopyFrom( tds, From(component.firstNode, component.firstNode + component.nodeCount) .Select([&](vint nodeIndex) { return visitor.depItems.Keys()[nodeIndex]; }) ); auto selectedTd = tds[0]; for (auto candidateTd : From(tds).Skip(1)) { auto selectedRange = visitor.depItems[selectedTd]->codeRange; auto candidateRange = visitor.depItems[candidateTd]->codeRange; if (candidateRange.codeIndex > selectedRange.codeIndex) { selectedTd = candidateTd; continue; } if (candidateRange.start > selectedRange.start) { selectedTd = candidateTd; continue; } } switch (selectedTd->GetTypeDescriptorFlags()) { case TypeDescriptorFlags::Struct: manager->errors.Add(WfErrors::StructRecursivelyIncludeItself(dynamic_cast(visitor.depItems[selectedTd]), tds)); break; case TypeDescriptorFlags::Class: manager->errors.Add(WfErrors::ClassRecursiveInheritance(dynamic_cast(visitor.depItems[selectedTd]), tds)); break; case TypeDescriptorFlags::Interface: manager->errors.Add(WfErrors::InterfaceRecursiveInheritance(dynamic_cast(visitor.depItems[selectedTd]), tds)); break; default:; } } } } if (errorCount == manager->errors.Count()) { for (vint i = 0; i < visitor.depItems.Count(); i++) { auto key = visitor.depItems.Keys()[i]; auto value = dynamic_cast(visitor.depItems.Values()[i]); if (value && value->kind == WfClassKind::Class) { CheckScopes_DuplicatedBaseClass(manager, value, key); } } } return errorCount == manager->errors.Count(); } } } } /*********************************************************************** .\ANALYZER\WFANALYZER_CHECKSCOPE_DUPLICATEDSYMBOL.CPP ***********************************************************************/ namespace vl { namespace workflow { namespace analyzer { using namespace collections; /*********************************************************************** CheckScopes_DuplicatedSymbol ***********************************************************************/ bool CheckScopes_DuplicatedSymbol(WfLexicalScopeManager* manager) { vint errorCount = manager->errors.Count(); for (auto scope : manager->nodeScopes.Values()) { if (!manager->checkedScopes_DuplicatedSymbol.Contains(scope.Obj())) { manager->checkedScopes_DuplicatedSymbol.Add(scope.Obj()); for (vint i = 0; i < scope->symbols.Count(); i++) { const auto& symbols = scope->symbols.GetByIndex(i); if (symbols.Count() > 1) { if (!scope->ownerNode.Cast() && !scope->ownerNode.Cast()) { if (symbols.Count() > 1) { for (auto symbol : From(symbols)) { if (auto decl = symbol->creatorNode.Cast()) { if (!decl.Cast()) { manager->errors.Add(WfErrors::DuplicatedSymbol(decl.Obj(), symbol)); } } else if (auto arg = symbol->creatorNode.Cast()) { manager->errors.Add(WfErrors::DuplicatedSymbol(arg.Obj(), symbol)); } else if (auto stat = symbol->creatorNode.Cast()) { manager->errors.Add(WfErrors::DuplicatedSymbol(stat.Obj(), symbol)); } else if (auto expr = symbol->creatorNode.Cast()) { manager->errors.Add(WfErrors::DuplicatedSymbol(expr.Obj(), symbol)); } else if (auto input = symbol->creatorNode.Cast()) { if (symbols.Count() == 2) { // Ignore the generated function from the state input auto methodSymbol = symbols[1 - symbols.IndexOf(symbol.Obj())]; auto funcDecl = methodSymbol->creatorNode.Cast(); vint index = manager->declarationMemberInfos.Keys().IndexOf(funcDecl.Obj()); if (index != -1) { auto methodInfo = manager->declarationMemberInfos.Values()[index]; if (manager->stateInputMethods[input.Obj()].Obj() == methodInfo.Obj()) { goto NO_ERROR; } } } manager->errors.Add(WfErrors::DuplicatedSymbol(input.Obj(), symbol)); NO_ERROR:; } else if (auto state = symbol->creatorNode.Cast()) { manager->errors.Add(WfErrors::DuplicatedSymbol(state.Obj(), symbol)); } else if (auto sarg = symbol->creatorNode.Cast()) { manager->errors.Add(WfErrors::DuplicatedSymbol(sarg.Obj(), symbol)); } } } } } } } } return errorCount == manager->errors.Count(); } } } } /*********************************************************************** .\ANALYZER\WFANALYZER_CHECKSCOPE_SYMBOLTYPE.CPP ***********************************************************************/ namespace vl { namespace workflow { namespace analyzer { using namespace collections; /*********************************************************************** CheckScopes_SymbolType ***********************************************************************/ bool CheckScopes_SymbolType(WfLexicalScopeManager* manager) { vint errorCount = manager->errors.Count(); for (auto scope : From(manager->nodeScopes) .Select([](auto&& pair) -> Pair> { return pair; }) .OrderBy([](auto&& a, auto&& b) { auto rangeA = a.key->codeRange; auto rangeB = b.key->codeRange; std::strong_ordering result = rangeA.codeIndex <=> rangeB.codeIndex; if (result != 0) return result; result = rangeA.start <=> rangeB.start; if (result != 0) return result; return result; }) .Select([](auto&& pair) { return pair.value; }) ) { if (!manager->checkedScopes_SymbolType.Contains(scope.Obj())) { manager->checkedScopes_SymbolType.Add(scope.Obj()); for (vint i = 0; i < scope->symbols.Count(); i++) { for (auto symbol : scope->symbols.GetByIndex(i)) { if (symbol->type) { symbol->typeInfo = CreateTypeInfoFromType(scope.Obj(), symbol->type); } } } } } return errorCount == manager->errors.Count(); } } } } /*********************************************************************** .\ANALYZER\WFANALYZER_COMPLETESCOPE.CPP ***********************************************************************/ namespace vl { namespace workflow { namespace analyzer { using namespace collections; using namespace reflection; using namespace reflection::description; using namespace typeimpl; /*********************************************************************** CompleteScopeForClassMember ***********************************************************************/ class CompleteScopeForClassMemberVisitor : public Object , public WfDeclaration::IVisitor , public WfVirtualCseDeclaration::IVisitor { public: WfLexicalScopeManager* manager; Ptr td; CompleteScopeForClassMemberVisitor(WfLexicalScopeManager* _manager, Ptr _td) :manager(_manager) , td(_td) { } void Visit(WfNamespaceDeclaration* node)override { } void Visit(WfFunctionDeclaration* node)override { auto scope = manager->nodeScopes[node]; auto info = manager->declarationMemberInfos[node].Cast(); for (auto argument : node->arguments) { if (auto typeInfo = CreateTypeInfoFromType(scope.Obj(), argument->type)) { auto paramInfo = Ptr(new ParameterInfoImpl(info.Obj(), argument->name.value, typeInfo)); info->AddParameter(paramInfo); } } if (auto typeInfo = CreateTypeInfoFromType(scope.Obj(), node->returnType)) { info->SetReturn(typeInfo); } } void Visit(WfVariableDeclaration* node)override { auto scope = manager->nodeScopes[node]; if (auto typeInfo = CreateTypeInfoFromType(scope.Obj(), node->type)) { auto info = manager->declarationMemberInfos[node].Cast(); info->SetReturn(typeInfo); } } void Visit(WfEventDeclaration* node)override { auto scope = manager->nodeScopes[node]; auto type = Ptr(new WfFunctionType); { auto voidType = Ptr(new WfPredefinedType); voidType->name = WfPredefinedTypeName::Void; type->result = voidType; } for (auto argument : node->arguments) { type->arguments.Add(argument); } if (auto typeInfo = CreateTypeInfoFromType(scope.Obj(), type)) { auto info = manager->declarationMemberInfos[node].Cast(); info->SetHandlerType(typeInfo); } } void Visit(WfPropertyDeclaration* node)override { auto scope = manager->nodeScopes[node]; auto info = manager->declarationMemberInfos[node].Cast(); if (node->getter.value != L"") { info->SetGetter(dynamic_cast(td->GetMethodGroupByName(node->getter.value, false)->GetMethod(0))); } if (node->setter.value != L"") { info->SetSetter(dynamic_cast(td->GetMethodGroupByName(node->setter.value, false)->GetMethod(0))); } if (node->valueChangedEvent.value != L"") { info->SetValueChangedEvent(dynamic_cast(td->GetEventByName(node->valueChangedEvent.value, false))); } } void Visit(WfStaticInitDeclaration* node)override { } void Visit(WfConstructorDeclaration* node)override { auto scope = manager->nodeScopes[node]; auto info = manager->declarationMemberInfos[node].Cast(); for (auto argument : node->arguments) { if (auto typeInfo = CreateTypeInfoFromType(scope.Obj(), argument->type)) { auto paramInfo = Ptr(new ParameterInfoImpl(info.Obj(), argument->name.value, typeInfo)); info->AddParameter(paramInfo); } } } void Visit(WfDestructorDeclaration* node)override { } void Visit(WfClassDeclaration* node)override { CompleteScopeForDeclaration(manager, node); } void Visit(WfEnumDeclaration* node)override { CompleteScopeForDeclaration(manager, node); } void Visit(WfStructDeclaration* node)override { CompleteScopeForDeclaration(manager, node); } void Visit(WfVirtualCfeDeclaration* node)override { for (auto decl : node->expandedDeclarations) { decl->Accept(this); } } void Visit(WfVirtualCseDeclaration* node)override { node->Accept((WfVirtualCseDeclaration::IVisitor*)this); } void Visit(WfStateMachineDeclaration* node)override { auto scope = manager->nodeScopes[node]; for (auto input : node->inputs) { auto method = manager->stateInputMethods[input.Obj()]; method->SetReturn(TypeInfoRetriver::CreateTypeInfo()); for (auto argument : input->arguments) { if (auto typeInfo = CreateTypeInfoFromType(scope.Obj(), argument->type)) { auto field = manager->stateInputArguments[argument.Obj()]; field->SetReturn(typeInfo); method->AddParameter(Ptr(new ParameterInfoImpl(method.Obj(), argument->name.value, typeInfo))); } } } for (auto state : node->states) { for (auto argument : state->arguments) { if (auto typeInfo = CreateTypeInfoFromType(scope.Obj(), argument->type)) { auto field = manager->stateDeclArguments[argument.Obj()]; field->SetReturn(typeInfo); } } } auto& smInfo = manager->stateMachineInfos[node]; smInfo->createCoroutineMethod->AddParameter(Ptr(new ParameterInfoImpl(smInfo->createCoroutineMethod.Obj(), L"startState", manager->cputiSInt))); smInfo->createCoroutineMethod->SetReturn(TypeInfoRetriver::CreateTypeInfo()); } static void Execute(WfLexicalScopeManager* manager, Ptr td, Ptr memberDecl) { CompleteScopeForClassMemberVisitor visitor(manager, td); memberDecl->Accept(&visitor); } }; /*********************************************************************** CompleteScopeForDeclaration ***********************************************************************/ class CompleteScopeForDeclarationVisitor : public Object , public WfDeclaration::IVisitor , public WfVirtualCseDeclaration::IVisitor { public: WfLexicalScopeManager* manager; CompleteScopeForDeclarationVisitor(WfLexicalScopeManager* _manager) :manager(_manager) { } void Visit(WfNamespaceDeclaration* node)override { for (auto decl : node->declarations) { CompleteScopeForDeclaration(manager, decl.Obj()); } } void Visit(WfFunctionDeclaration* node)override { } void Visit(WfVariableDeclaration* node)override { } void Visit(WfEventDeclaration* node)override { } void Visit(WfPropertyDeclaration* node)override { } void Visit(WfStaticInitDeclaration* node)override { } void Visit(WfConstructorDeclaration* node)override { } void Visit(WfDestructorDeclaration* node)override { } void Visit(WfClassDeclaration* node)override { auto scope = manager->nodeScopes[node]; auto td = manager->declarationTypes[node].Cast(); if (node->baseTypes.Count() > 0) { for (auto baseType : node->baseTypes) { if (auto scopeName = GetScopeNameFromReferenceType(scope->parentScope.Obj(), baseType)) { if (scopeName->typeDescriptor) { td->AddBaseType(scopeName->typeDescriptor); } } } } else if (node->kind == WfClassKind::Class) { td->AddBaseType(description::GetTypeDescriptor()); } else if (node->kind == WfClassKind::Interface) { td->AddBaseType(description::GetTypeDescriptor()); } if (node->kind == WfClassKind::Interface) { switch (node->constructorType) { case WfConstructorType::SharedPtr: { auto elementType = Ptr(new TypeDescriptorTypeInfo(td.Obj(), TypeInfoHint::Normal)); auto pointerType = Ptr(new SharedPtrTypeInfo(elementType)); auto ctor = Ptr(new WfInterfaceConstructor(pointerType)); td->AddMember(ctor); } break; case WfConstructorType::RawPtr: { auto elementType = Ptr(new TypeDescriptorTypeInfo(td.Obj(), TypeInfoHint::Normal)); auto pointerType = Ptr(new RawPtrTypeInfo(elementType)); auto ctor = Ptr(new WfInterfaceConstructor(pointerType)); td->AddMember(ctor); } break; default:; } } for (auto memberDecl : node->declarations) { CompleteScopeForClassMember(manager, td, memberDecl); } } void Visit(WfEnumDeclaration* node)override { auto td = manager->declarationTypes[node].Cast(); Dictionary items; for (auto item : node->items) { vuint64_t value = 0; switch (item->kind) { case WfEnumItemKind::Constant: TypedValueSerializerProvider::Deserialize(item->number.value, value); break; case WfEnumItemKind::Intersection: for (auto itemInt : item->intersections) { value |= items[itemInt->name.value]; } break; default:; } td->AddEnumItem(item->name.value, value); items.Add(item->name.value, value); } } void Visit(WfStructDeclaration* node)override { auto scope = manager->nodeScopes[node]; auto td = manager->declarationTypes[node].Cast(); for (auto member : node->members) { if (auto typeInfo = CreateTypeInfoFromType(scope.Obj(), member->type)) { auto field = Ptr(new WfStructField(td.Obj(), member->name.value)); field->SetReturn(typeInfo); td->AddMember(field); } } } void Visit(WfVirtualCfeDeclaration* node)override { for (auto decl : node->expandedDeclarations) { decl->Accept(this); } } void Visit(WfVirtualCseDeclaration* node)override { node->Accept((WfVirtualCseDeclaration::IVisitor*)this); for (auto decl : node->expandedDeclarations) { decl->Accept(this); } } void Visit(WfStateMachineDeclaration* node)override { } static void Execute(WfLexicalScopeManager* manager, WfDeclaration* declaration) { CompleteScopeForDeclarationVisitor visitor(manager); declaration->Accept(&visitor); } }; /*********************************************************************** CompleteScope ***********************************************************************/ void CompleteScopeForClassMember(WfLexicalScopeManager* manager, Ptr td, Ptr memberDecl) { CompleteScopeForClassMemberVisitor::Execute(manager, td, memberDecl); } void CompleteScopeForDeclaration(WfLexicalScopeManager* manager, WfDeclaration* declaration) { CompleteScopeForDeclarationVisitor::Execute(manager, declaration); } void CompleteScopeForModule(WfLexicalScopeManager* manager, Ptr module) { for (auto declaration : module->declarations) { CompleteScopeForDeclaration(manager, declaration.Obj()); } } } } } /*********************************************************************** .\ANALYZER\WFANALYZER_CONTEXTFREEDESUGAR.CPP ***********************************************************************/ namespace vl { namespace workflow { namespace analyzer { using namespace collections; using namespace glr; using namespace reflection::description; /*********************************************************************** SetCodeRange ***********************************************************************/ class SetCodeRangeVisitor : public traverse_visitor::AstVisitor { public: ParsingTextRange range; bool asOffset; SetCodeRangeVisitor(ParsingTextRange _range, bool _asOffset) :range(_range) , asOffset(_asOffset) { } void UpdateTextPos(ParsingTextPos& pos) { if (pos.row == -1 || pos.column == -1) { pos = range.start; } else { if (pos.row == 0) { pos.column += range.start.column; } pos.row += range.start.row; } } void Traverse(ParsingAstBase *node)override { if (node->codeRange == ParsingTextRange()) { node->codeRange = range; } else if (asOffset) { UpdateTextPos(node->codeRange.start); UpdateTextPos(node->codeRange.end); if (node->codeRange.codeIndex == -1) { node->codeRange.codeIndex = range.codeIndex; } } } void Traverse(ParsingToken& token)override { if (token.codeRange == ParsingTextRange()) { token.codeRange = range; } else if (asOffset) { UpdateTextPos(token.codeRange.start); UpdateTextPos(token.codeRange.end); if (token.codeRange.codeIndex == -1) { token.codeRange.codeIndex = range.codeIndex; } } } }; void SetCodeRange(Ptr node, glr::ParsingTextRange codeRange, bool asOffset) { SetCodeRangeVisitor(codeRange, asOffset).InspectInto(node.Obj()); } void SetCodeRange(Ptr node, glr::ParsingTextRange codeRange, bool asOffset) { SetCodeRangeVisitor(codeRange, asOffset).InspectInto(node.Obj()); } void SetCodeRange(Ptr node, glr::ParsingTextRange codeRange, bool asOffset) { SetCodeRangeVisitor(codeRange, asOffset).InspectInto(node.Obj()); } void SetCodeRange(Ptr node, glr::ParsingTextRange codeRange, bool asOffset) { SetCodeRangeVisitor(codeRange, asOffset).InspectInto(node.Obj()); } void SetCodeRange(Ptr node, glr::ParsingTextRange codeRange, bool asOffset) { SetCodeRangeVisitor(codeRange, asOffset).InspectInto(node.Obj()); } /*********************************************************************** ContextFreeModuleDesugar ***********************************************************************/ class ContextFreeDesugarVisitor : public traverse_visitor::AstVisitor { public: WfLexicalScopeManager* manager; WfClassDeclaration* surroundingClassDecl = nullptr; WfNewInterfaceExpression* surroundingLambda = nullptr; ContextFreeDesugarVisitor(WfLexicalScopeManager* _manager) :manager(_manager) { } void Traverse(WfFormatExpression* node)override { if (node->expandedExpression) { return; } List> expressions; const wchar_t* reading = node->value.value.Buffer(); const wchar_t* textPosCounter = reading; ParsingTextPos formatPos = node->codeRange.start; formatPos.column += 2; while (*reading) { const wchar_t* begin = wcsstr(reading, L"$("); if (begin) { auto expression = Ptr(new WfStringExpression); expression->codeRange = node->codeRange; expression->value.value = WString::CopyFrom(reading, vint(begin - reading)); expressions.Add(expression); } else { break; } const wchar_t* end = begin + 2; vint counter = 1; while (wchar_t c = *end++) { switch (c) { case L'(': counter++; break; case L')': counter--; break; } if (counter == 0) { break; } } if (counter != 0) { auto error = WfErrors::WrongFormatStringSyntax(node); error.message += L" (Does not find matched close bracket.)"; manager->errors.Add(error); return; } else { WString input = WString::CopyFrom(begin + 2, vint(end - begin - 3)); vint currentErrorCount = manager->errors.Count(); if (auto expression = ParseExpression(input, manager->workflowParser)) { expressions.Add(expression); while (textPosCounter++ < begin + 2) { switch (textPosCounter[-1]) { case '\n': formatPos.row++; formatPos.column = 0; break; default: formatPos.column++; break; } } SetCodeRange(expression, { formatPos,formatPos,node->codeRange.codeIndex }, true); } for (vint i = currentErrorCount; i < manager->errors.Count(); i++) { auto&& existing = manager->errors[i]; auto error = WfErrors::WrongFormatStringSyntax(node); existing.message = error.message + L" (" + existing.message + L")"; } reading = end; } } if (*reading || expressions.Count() == 0) { auto expression = Ptr(new WfStringExpression); expression->codeRange = node->codeRange; expression->value.value = reading; expressions.Add(expression); } if (expressions.Count() > 0) { Ptr current = expressions[0]; for (auto expression : From(expressions).Skip(1)) { auto binary = Ptr(new WfBinaryExpression); binary->codeRange = node->codeRange; binary->first = current; binary->second = expression; binary->op = WfBinaryOperator::FlagAnd; current = binary; } node->expandedExpression = current; SetCodeRange(node->expandedExpression, node->codeRange); } } void Traverse(WfAutoPropertyDeclaration* node)override { if (node->expandedDeclarations.Count() > 0) { return; } bool needVariable = false; bool needVirtual = false; bool needEvent = false; bool needProperty = false; if (surroundingClassDecl) { switch (surroundingClassDecl->kind) { case WfClassKind::Class: { needVariable = true; needVirtual = false; needEvent = node->configObserve == WfAPObserve::Observable; needProperty = true; } break; case WfClassKind::Interface: { needVariable = false; needVirtual = true; needEvent = node->configObserve == WfAPObserve::Observable; needProperty = true; } break; default:; } } else if (surroundingLambda) { needVariable = true; needVirtual = false; needEvent = false; needProperty = false; } auto varName = L"" + node->name.value; auto getterName = L"Get" + node->name.value; auto setterName = L"Set" + node->name.value; auto eventName = node->name.value + L"Changed"; if (needVariable && node->expression) { auto decl = Ptr(new WfVariableDeclaration); node->expandedDeclarations.Add(decl); decl->name.value = varName; decl->type = CopyType(node->type); decl->expression = CopyExpression(node->expression, true); auto att = Ptr(new WfAttribute); att->category.value = L"cpp"; att->name.value = L"Private"; decl->attributes.Add(att); } { auto decl = Ptr(new WfFunctionDeclaration); node->expandedDeclarations.Add(decl); decl->functionKind = WfFunctionKind::Normal; decl->anonymity = WfFunctionAnonymity::Named; decl->name.value = getterName; decl->returnType = CopyType(node->type); if (!needVirtual) { auto refExpr = Ptr(new WfReferenceExpression); refExpr->name.value = varName; auto returnStat = Ptr(new WfReturnStatement); returnStat->expression = refExpr; auto block = Ptr(new WfBlockStatement); block->statements.Add(returnStat); decl->statement = block; } } if (!needVirtual || node->configConst == WfAPConst::Writable) { auto decl = Ptr(new WfFunctionDeclaration); node->expandedDeclarations.Add(decl); decl->functionKind = WfFunctionKind::Normal; decl->anonymity = WfFunctionAnonymity::Named; decl->name.value = setterName; if (node->configConst == WfAPConst::Readonly) { auto att = Ptr(new WfAttribute); att->category.value = L"cpp"; att->name.value = L"Protected"; decl->attributes.Add(att); } { auto argument = Ptr(new WfFunctionArgument); argument->name.value = L""; argument->type = CopyType(node->type); decl->arguments.Add(argument); } { auto voidType = Ptr(new WfPredefinedType); voidType->name = WfPredefinedTypeName::Void; decl->returnType = voidType; } if (!needVirtual) { auto block = Ptr(new WfBlockStatement); decl->statement = block; auto createBinaryExpr = [&](WfBinaryOperator op) { auto refArgument = Ptr(new WfReferenceExpression); refArgument->name.value = L""; auto refVar = Ptr(new WfReferenceExpression); refVar->name.value = varName; auto binaryExpr = Ptr(new WfBinaryExpression); binaryExpr->first = refVar; binaryExpr->second = refArgument; binaryExpr->op = op; return binaryExpr; }; if (node->configObserve == WfAPObserve::Observable) { auto ifStat = Ptr(new WfIfStatement); ifStat->expression = createBinaryExpr(WfBinaryOperator::NE); auto trueBlock = Ptr(new WfBlockStatement); ifStat->trueBranch = trueBlock; { auto stat = Ptr(new WfExpressionStatement); stat->expression = createBinaryExpr(WfBinaryOperator::Assign); trueBlock->statements.Add(stat); } { auto refEvent = Ptr(new WfReferenceExpression); refEvent->name.value = eventName; auto callExpr = Ptr(new WfCallExpression); callExpr->function = refEvent; auto stat = Ptr(new WfExpressionStatement); stat->expression = callExpr; trueBlock->statements.Add(stat); } block->statements.Add(ifStat); } else { auto stat = Ptr(new WfExpressionStatement); stat->expression = createBinaryExpr(WfBinaryOperator::Assign); block->statements.Add(stat); } } } if (needEvent) { auto decl = Ptr(new WfEventDeclaration); node->expandedDeclarations.Add(decl); decl->name.value = eventName; } if (needProperty) { auto decl = Ptr(new WfPropertyDeclaration); node->expandedDeclarations.Add(decl); decl->type = CopyType(node->type); decl->name.value = node->name.value; decl->getter.value = getterName; if (node->configConst == WfAPConst::Writable) { decl->setter.value = setterName; } if (node->configObserve == WfAPObserve::Observable) { decl->valueChangedEvent.value = eventName; } } for (auto decl : From(node->expandedDeclarations).FindType()) { decl->functionKind = WfFunctionKind::Normal; if (surroundingLambda) { if (decl->name.value == getterName) { decl->functionKind = WfFunctionKind::Override; } else if (decl->name.value == setterName) { if (node->configConst == WfAPConst::Writable) { decl->functionKind = WfFunctionKind::Override; } } } SetCodeRange(decl, node->codeRange); } } void Traverse(WfCastResultInterfaceDeclaration* node)override { if (node->expandedDeclarations.Count() > 0) { return; } auto decl = Ptr(new WfClassDeclaration); node->expandedDeclarations.Add(decl); decl->kind = WfClassKind::Interface; decl->constructorType = WfConstructorType::SharedPtr; decl->name.value = node->name.value; decl->baseTypes.Add(CopyType(node->baseType)); { auto funcDecl = Ptr(new WfFunctionDeclaration); decl->declarations.Add(funcDecl); funcDecl->functionKind = WfFunctionKind::Static; funcDecl->anonymity = WfFunctionAnonymity::Named; funcDecl->name.value = L"CastResult"; funcDecl->returnType = CopyType(node->elementType); { auto argument = Ptr(new WfFunctionArgument); funcDecl->arguments.Add(argument); argument->name.value = L"value"; argument->type = GetTypeFromTypeInfo(TypeInfoRetriver::CreateTypeInfo().Obj()); } { auto block = Ptr(new WfBlockStatement); funcDecl->statement = block; auto refValue = Ptr(new WfReferenceExpression); refValue->name.value = L"value"; auto castExpr = Ptr(new WfTypeCastingExpression); castExpr->strategy = WfTypeCastingStrategy::Strong; castExpr->type = CopyType(node->elementType); castExpr->expression = refValue; auto stat = Ptr(new WfReturnStatement); stat->expression = castExpr; block->statements.Add(stat); } } { auto funcDecl = Ptr(new WfFunctionDeclaration); decl->declarations.Add(funcDecl); funcDecl->functionKind = WfFunctionKind::Static; funcDecl->anonymity = WfFunctionAnonymity::Named; funcDecl->name.value = L"StoreResult"; funcDecl->returnType = GetTypeFromTypeInfo(TypeInfoRetriver::CreateTypeInfo().Obj()); { auto argument = Ptr(new WfFunctionArgument); funcDecl->arguments.Add(argument); argument->name.value = L"value"; argument->type = CopyType(node->elementType); } { auto block = Ptr(new WfBlockStatement); funcDecl->statement = block; auto refValue = Ptr(new WfReferenceExpression); refValue->name.value = L"value"; auto stat = Ptr(new WfReturnStatement); stat->expression = refValue; block->statements.Add(stat); } } SetCodeRange(Ptr(decl), node->codeRange); } #define PUSH_SURROUNDING\ auto o1 = surroundingClassDecl;\ auto o2 = surroundingLambda;\ surroundingClassDecl = nullptr;\ surroundingLambda = nullptr;\ #define POP_SURROUNDING\ surroundingClassDecl = o1;\ surroundingLambda = o2;\ void Visit(WfClassDeclaration* node)override { PUSH_SURROUNDING surroundingClassDecl = node; traverse_visitor::AstVisitor::Visit(node); POP_SURROUNDING } void Visit(WfNewInterfaceExpression* node)override { PUSH_SURROUNDING surroundingLambda = node; traverse_visitor::AstVisitor::Visit(node); POP_SURROUNDING } #undef PUSH_SURROUNDING #undef POP_SURROUNDING }; void ContextFreeModuleDesugar(WfLexicalScopeManager* manager, Ptr module) { ContextFreeDesugarVisitor(manager).InspectInto(module.Obj()); } void ContextFreeDeclarationDesugar(WfLexicalScopeManager* manager, Ptr declaration) { ContextFreeDesugarVisitor(manager).InspectInto(declaration.Obj()); } void ContextFreeStatementDesugar(WfLexicalScopeManager* manager, Ptr statement) { ContextFreeDesugarVisitor(manager).InspectInto(statement.Obj()); } void ContextFreeExpressionDesugar(WfLexicalScopeManager* manager, Ptr expression) { ContextFreeDesugarVisitor(manager).InspectInto(expression.Obj()); } } } } /*********************************************************************** .\ANALYZER\WFANALYZER_ERRORS.CPP ***********************************************************************/ namespace vl { namespace workflow { namespace analyzer { using namespace collections; using namespace glr; using namespace reflection; using namespace reflection::description; ParsingError MakeParsingError(ParsingAstBase* node, const WString& message) { return { node, node->codeRange, message }; } template WString ListToErrorMessage(List& items, F&& f) { WString description; for (auto friendlyName : From(items) .Select(f) .OrderBySelf() ) { description += L"\r\n\t"; description += friendlyName; } return description; } /*********************************************************************** WfErrors ***********************************************************************/ glr::ParsingError WfErrors::WrongFormatStringSyntax(WfExpression* node) { return MakeParsingError(node, L"A0: Wrong format string syntax."); } glr::ParsingError WfErrors::WrongSimpleObserveExpression(WfExpression* node) { return MakeParsingError(node, L"A1: Simple observe expression should observe a property under the observed object."); } glr::ParsingError WfErrors::WrongSimpleObserveEvent(WfExpression* node) { return MakeParsingError(node, L"A2: Simple observe expression should react to an event under the observed object."); } glr::ParsingError WfErrors::EmptyObserveEvent(WfExpression* node) { return MakeParsingError(node, L"A2: Observe expression should react to at least one event."); } glr::ParsingError WfErrors::ObserveNotInBind(WfExpression* node) { return MakeParsingError(node, L"A3: Observe expression should appear in a bind expression."); } glr::ParsingError WfErrors::ObserveInObserveEvent(WfExpression* node) { return MakeParsingError(node, L"A4: Observe expression should not appear in the event expression in another observe expression."); } glr::ParsingError WfErrors::BindInBind(WfExpression* node) { return MakeParsingError(node, L"A4: Bind expression should not appear in another bind expression."); } glr::ParsingError WfErrors::AttachInBind(WfExpression* node) { return MakeParsingError(node, L"A4: Attach expression should not appear in another bind expression."); } glr::ParsingError WfErrors::DetachInBind(WfExpression* node) { return MakeParsingError(node, L"A4: Detach expression should not appear in another bind expression."); } glr::ParsingError WfErrors::ConstructorMixMapAndList(WfExpression* node) { return MakeParsingError(node, L"A5: Key-value pairs are not allowed in list constructor expression."); } glr::ParsingError WfErrors::ConstructorMixStructAndList(WfExpression* node) { return MakeParsingError(node, L"A5: Field-value pairs are expected in struct constructor expression."); } glr::ParsingError WfErrors::DuplicatedConstructorField(WfReferenceExpression* node) { return MakeParsingError(node, L"A5: The same field cannot be assigned more than once in struct constructor expression."); } glr::ParsingError WfErrors::ConstructorMixClassAndInterface(WfNewClassExpression* node) { return MakeParsingError(node, L"A6: Arguments are not allowed in new interface expression."); } glr::ParsingError WfErrors::ConstructorMixClassAndInterface(WfNewInterfaceExpression* node) { return MakeParsingError(node, L"A6: Members are not allowed in new class expression."); } glr::ParsingError WfErrors::ScopeNameIsNotExpression(WfExpression* node, Ptr scopeName) { return MakeParsingError(node, L"A7: Symbol \"" + scopeName->GetFriendlyName() + L"\" cannot be used as an expression."); } glr::ParsingError WfErrors::EventIsNotExpression(WfExpression* node, reflection::description::IEventInfo* eventInfo) { return MakeParsingError(node, L"A7: Event \"" + eventInfo->GetName() + L"\" of type \"" + eventInfo->GetOwnerTypeDescriptor()->GetTypeName() + L"\" cannot be used as an expression."); } glr::ParsingError WfErrors::ExpressionIsNotScopeName(WfExpression* node) { return MakeParsingError(node, L"A8: Expression does not reference to a declaration."); } glr::ParsingError WfErrors::ExpressionIsNotEvent(WfExpression* node) { return MakeParsingError(node, L"A8: Expression does not reference to an event."); } glr::ParsingError WfErrors::ExpressionCannotResolveType(WfExpression* node, Ptr symbol) { return MakeParsingError(node, L"A9: Expression referencing to symbol \"" + symbol->name + L"\" failed to resolve its type."); } glr::ParsingError WfErrors::NullCannotResolveType(WfExpression* node) { return MakeParsingError(node, L"A9: Expression \"null\" failed to resolve its type."); } glr::ParsingError WfErrors::ConstructorCannotResolveType(WfExpression* node) { return MakeParsingError(node, L"A9: Expression \"{}\" failed to resolve its type."); } glr::ParsingError WfErrors::OrderedLambdaCannotResolveType(WfExpression* node) { return MakeParsingError(node, L"A9: Ordered lambda expression failed to resolve its type."); } glr::ParsingError WfErrors::NullCannotImplicitlyConvertToType(WfExpression* node, reflection::description::ITypeInfo* toType) { return MakeParsingError(node, L"A10: Expression \"null\" cannot implicitly convert to \"" + toType->GetTypeFriendlyName() + L"\"."); } glr::ParsingError WfErrors::ConstructorCannotImplicitlyConvertToType(WfExpression* node, reflection::description::ITypeInfo* toType) { return MakeParsingError(node, L"A10: Expression \"{}\" cannot implicitly convert to \"" + toType->GetTypeFriendlyName() + L"\"."); } glr::ParsingError WfErrors::OrderedLambdaCannotImplicitlyConvertToType(WfExpression* node, reflection::description::ITypeInfo* toType) { return MakeParsingError(node, L"A10: Ordered lambda expression cannot implicitly convert to \"" + toType->GetTypeFriendlyName() + L"\"."); } glr::ParsingError WfErrors::ExpressionCannotImplicitlyConvertToType(WfExpression* node, reflection::description::ITypeInfo* fromType, reflection::description::ITypeInfo* toType) { return MakeParsingError(node, L"A10: Expression of type \"" + fromType->GetTypeFriendlyName() + L"\" cannot implicitly convert to \"" + toType->GetTypeFriendlyName() + L"\"."); } glr::ParsingError WfErrors::ExpressionCannotExplicitlyConvertToType(WfExpression* node, reflection::description::ITypeInfo* fromType, reflection::description::ITypeInfo* toType) { return MakeParsingError(node, L"A11: Expression of type \"" + fromType->GetTypeFriendlyName() + L"\" cannot explicitly convert to \"" + toType->GetTypeFriendlyName() + L"\"."); } glr::ParsingError WfErrors::CannotWeakCastToType(WfExpression* node, reflection::description::ITypeInfo* toType) { return MakeParsingError(node, L"A12: Expression cannot weakly cast to \"" + toType->GetTypeFriendlyName() + L"\" because it cannot be \"null\"."); } glr::ParsingError WfErrors::IntegerLiteralOutOfRange(WfIntegerExpression* node) { return MakeParsingError(node, L"A13: Integer literal \"" + node->value.value + L"\" out of range."); } glr::ParsingError WfErrors::FloatingLiteralOutOfRange(WfFloatingExpression* node) { return MakeParsingError(node, L"A13: Floating literal \"" + node->value.value + L"\" out of range."); } glr::ParsingError WfErrors::CannotMergeTwoType(WfExpression* node, reflection::description::ITypeInfo* firstType, reflection::description::ITypeInfo* secondType) { return MakeParsingError(node, L"A14: Failed to merge type \"" + firstType->GetTypeFriendlyName() + L"\" with type \"" + secondType->GetTypeFriendlyName() + L"\" together to calculate the result type."); } glr::ParsingError WfErrors::RangeShouldBeInteger(WfExpression* node, reflection::description::ITypeInfo* type) { return MakeParsingError(node, L"A15: Elements in a range expression should be integer, not \"" + type->GetTypeFriendlyName() + L"\"."); } glr::ParsingError WfErrors::UnaryOperatorOnWrongType(WfUnaryExpression* node, reflection::description::ITypeInfo* type) { return MakeParsingError(node, L"A16: Unary operator cannot apply on expression of type \"" + type->GetTypeFriendlyName() + L"\"."); } glr::ParsingError WfErrors::BinaryOperatorOnWrongType(WfBinaryExpression* node, reflection::description::ITypeInfo* type) { return MakeParsingError(node, L"A16: Binary operator cannot apply on expression of type \"" + type->GetTypeFriendlyName() + L"\"."); } glr::ParsingError WfErrors::IndexOperatorOnWrongType(WfBinaryExpression* node, reflection::description::ITypeInfo* containerType) { return MakeParsingError(node, L"A17: Container of type \"" + containerType->GetTypeFriendlyName() + L"\" cannot be accessed using index."); } glr::ParsingError WfErrors::ExpressionIsNotCollection(WfExpression* node, reflection::description::ITypeInfo* type) { return MakeParsingError(node, L"A18: Expression of type \"" + type->GetTypeFriendlyName() + L"\" is not an enumerable type."); } glr::ParsingError WfErrors::ExpressionIsNotFunction(WfExpression* node, reflection::description::ITypeInfo* type) { return MakeParsingError(node, L"A19: Expression of type \"" + type->GetTypeFriendlyName() + L"\" is not an invokable function type."); } glr::ParsingError WfErrors::FunctionArgumentCountMismatched(glr::ParsingAstBase* node, vint expectedCount, const ResolveExpressionResult& function) { return MakeParsingError(node, L"A20: Function " + function.GetFriendlyName() + L"\" is not allowed to call with " + itow(expectedCount) + L" arguments."); } glr::ParsingError WfErrors::FunctionArgumentTypeMismatched(glr::ParsingAstBase* node, const ResolveExpressionResult& function, vint index, reflection::description::ITypeInfo* fromType, reflection::description::ITypeInfo* toType) { return MakeParsingError(node, L"A21: The " + itow(index) + L"-th argument of function " + function.GetFriendlyName() + L" cannot implicitly convert from \"" + fromType->GetTypeFriendlyName() + L"\" to \"" + toType->GetTypeFriendlyName() + L"\"."); } glr::ParsingError WfErrors::CannotPickOverloadedFunctions(glr::ParsingAstBase* node, collections::List& results) { auto description = ListToErrorMessage(results, [](auto&& result) { return result.GetFriendlyName(); }); return MakeParsingError(node, L"A22: Cannot decide which function to call in multiple targets: " + description + L"."); } glr::ParsingError WfErrors::ClassContainsNoConstructor(WfExpression* node, reflection::description::ITypeInfo* type) { return MakeParsingError(node, L"A23: Class \"" + type->GetTypeFriendlyName() + L"\" does not contain any constructor."); } glr::ParsingError WfErrors::InterfaceContainsNoConstructor(WfExpression* node, reflection::description::ITypeInfo* type) { Ptr proxy = TypeInfoRetriver>::CreateTypeInfo(); return MakeParsingError(node, L"A23: Interface \"" + type->GetTypeFriendlyName() + L"\" does not contain any constructor receiving an \"" + proxy->GetTypeFriendlyName() + L"\"."); } glr::ParsingError WfErrors::ConstructorReturnTypeMismatched(WfExpression* node, const ResolveExpressionResult& function, reflection::description::ITypeInfo* fromType, reflection::description::ITypeInfo* toType) { return MakeParsingError(node, L"A24: The return type of " + function.GetFriendlyName() + L" cannot implicitly convert from \"" + fromType->GetTypeFriendlyName() + L"\" to \"" + toType->GetTypeFriendlyName() + L"\"."); } glr::ParsingError WfErrors::ExpressionIsNotLeftValue(WfExpression* node, const ResolveExpressionResult& result) { return MakeParsingError(node, L"A25: " + result.GetFriendlyName(true) + L" is not assignable."); } glr::ParsingError WfErrors::CannotCallMemberOutsideOfClass(WfExpression* node, const ResolveExpressionResult& result) { return MakeParsingError(node, L"A26: " + result.GetFriendlyName(true) + L" cannot be called as a static member."); } glr::ParsingError WfErrors::CannotCallMemberInStaticFunction(WfExpression* node, const ResolveExpressionResult& result) { return MakeParsingError(node, L"A27: " + result.GetFriendlyName(true) + L" cannot be called in static functions of its class or interface."); } glr::ParsingError WfErrors::FieldCannotInitializeUsingEachOther(WfExpression* node, const ResolveExpressionResult& result) { return MakeParsingError(node, L"A28: " + result.GetFriendlyName(true) + L" cannot be used to initialize other fields in the same type or new interface expression."); } glr::ParsingError WfErrors::WrongThisExpression(WfExpression* node) { return MakeParsingError(node, L"A29: The \"this\" expression can only be used in class methods or functions in new interface expressions"); } glr::ParsingError WfErrors::IncorrectTypeForUnion(WfExpression* node, reflection::description::ITypeInfo* type) { return MakeParsingError(node, L"A30: Expression of type \"" + type->GetTypeFriendlyName() + L"\" cannot be used in union (&) expression because it is not string or flag enum."); } glr::ParsingError WfErrors::IncorrectTypeForIntersect(WfExpression* node, reflection::description::ITypeInfo* type) { return MakeParsingError(node, L"A30: Expression of type \"" + type->GetTypeFriendlyName() + L"\" cannot be used in intersect (|) expression because it is not flag enum."); } glr::ParsingError WfErrors::ExpressionIsNotConstant(WfExpression* node) { return MakeParsingError(node, L"A31: Expression is not constant. A constant expression consists of:\r\n" L"\tconstant primitive values\r\n" L"\tenum items\r\n" L"\tconstant unary (+, -, not) expressions\r\n" L"\tconstant binary (|) expressions\r\n" L"\tconstant range expressions\r\n" L"\tconstant constructor expressions (to create values of structs, lists or dictionarys)\r\n" L"\ttype() or typeof() expressions."); } glr::ParsingError WfErrors::WrongMixinTargetType(WfExpression* node, reflection::description::ITypeInfo* fromType, reflection::description::ITypeInfo* toType) { return MakeParsingError(node, L"A32: Mixin cast cannot implicitly convert from \"" + fromType->GetTypeFriendlyName() + L"\" to \"" + toType->GetTypeFriendlyName() + L"\". It is only for converting from an interface to a derived interface."); } glr::ParsingError WfErrors::ExpectedTypeCastCannotResolveType(WfExpression* node) { return MakeParsingError(node, L"A33: Cannot resolve type \"*\". This expression should only appear on a place which has an explicit type, including variables and arguments."); } glr::ParsingError WfErrors::WrongVoidType(WfType* node) { return MakeParsingError(node, L"B0: Void is not a type for a value."); } glr::ParsingError WfErrors::WrongInterfaceType(WfType* node) { return MakeParsingError(node, L"B1: Interface is not a type for a value."); } glr::ParsingError WfErrors::RawPointerToNonReferenceType(WfType* node, reflection::description::ITypeInfo* typeInfo) { return MakeParsingError(node, L"B2: A raw pointer" + (typeInfo ? L" \"" + typeInfo->GetTypeFriendlyName() + L"\"" : L"") + L" should point to a class or interface."); } glr::ParsingError WfErrors::SharedPointerToNonReferenceType(WfType* node, reflection::description::ITypeInfo* typeInfo) { return MakeParsingError(node, L"B3: A shared pointer" + (typeInfo ? L" \"" + typeInfo->GetTypeFriendlyName() + L"\"" : L"") + L" should point to a class or interface."); } glr::ParsingError WfErrors::NullableToNonReferenceType(WfType* node, reflection::description::ITypeInfo* typeInfo) { return MakeParsingError(node, L"B4: A nullable value" + (typeInfo ? L" \"" + typeInfo->GetTypeFriendlyName() + L"\"" : L"") + L" should point to a struct."); } glr::ParsingError WfErrors::ChildOfNonReferenceType(WfType* node) { return MakeParsingError(node, L"B5: Only a reference type have child types."); } glr::ParsingError WfErrors::TypeNotExists(WfType* node, Ptr scopeName) { return MakeParsingError(node, L"B6: \"" + scopeName->GetFriendlyName() + L"\" is not a type."); } glr::ParsingError WfErrors::TypeNotExists(WfType* node, const ResolveExpressionResult& result) { return MakeParsingError(node, L"B6: \"" + result.GetFriendlyName() + L"\" is not a type."); } glr::ParsingError WfErrors::TypeNotForValue(WfType* node, reflection::description::ITypeInfo* typeInfo) { return MakeParsingError(node, L"B7: Type \"" + typeInfo->GetTypeFriendlyName() + L"\" is not a type for a value."); } glr::ParsingError WfErrors::BreakNotInLoop(WfStatement* node) { return MakeParsingError(node, L"C0: Break statement should appear in a loop."); } glr::ParsingError WfErrors::ContinueNotInLoop(WfStatement* node) { return MakeParsingError(node, L"C1: Continue statement should appear in a loop."); } glr::ParsingError WfErrors::RethrowNotInCatch(WfStatement* node) { return MakeParsingError(node, L"C2: Re-raise exception statement should appear in catch."); } glr::ParsingError WfErrors::TryMissCatchAndFinally(WfStatement* node) { return MakeParsingError(node, L"C3: Try statement should not appear without both catch and finally."); } glr::ParsingError WfErrors::ReturnMissExpression(WfStatement* node, reflection::description::ITypeInfo* type) { return MakeParsingError(node, L"C4: Return statement requires an expression of type \"" + type->GetTypeFriendlyName() + L"\"."); } glr::ParsingError WfErrors::DeleteNonRawPointer(WfStatement* node, reflection::description::ITypeInfo* type) { return MakeParsingError(node, L"C5: Delete statement cannot apply on an expression of type \"" + type->GetTypeFriendlyName() + L"\", which is expected to be a raw pointer."); } glr::ParsingError WfErrors::CannotReturnExpression(WfStatement* node) { return MakeParsingError(node, L"C6: Return statement cannot have a value inside void functions, constructors, destructors or $coroutine expressions."); } glr::ParsingError WfErrors::WrongCoPause(WfStatement* node) { return MakeParsingError(node, L"C7: $pause statement should appear inside a $coroutine expression, and it cannot be nested."); } glr::ParsingError WfErrors::WrongCoOperator(WfStatement* node) { return MakeParsingError(node, L"C8: $Operator statement should appear inside a coroutine function (which has a functiona body like ${} or $Provider{})."); } glr::ParsingError WfErrors::WrongCoOperator(WfExpression* node) { return MakeParsingError(node, L"C8: $.Operator expression should appear inside a coroutine function (which has a functiona body like ${} or $Provider{})."); } glr::ParsingError WfErrors::CoProviderNotExists(WfCoProviderStatement* node, collections::List& candidates) { auto description = ListToErrorMessage(candidates, [](auto&& candidate) { return candidate; }); if (node->name.value == L"") { return MakeParsingError(node, L"C9: Cannot find a coroutine provider based on the function return type, all of the following types do not exist: " + description + L"."); } else { return MakeParsingError(node, L"C9: Cannot find a coroutine provider based on the provider name \"" + node->name.value.Right(node->name.value.Length() - 1) + L"\", all of the following types do not exist: " + description + L"."); } } glr::ParsingError WfErrors::CoOperatorNotExists(WfReturnStatement* node, reflection::description::ITypeInfo* type) { return MakeParsingError(node, L"C10: Static function \"ReturnAndExit\" does not exist in coroutine provider \"" + type->GetTypeFriendlyName() + L"\"."); } glr::ParsingError WfErrors::CoOperatorNotExists(WfCoOperatorStatement* node, reflection::description::ITypeInfo* type) { auto operatorName = node->opName.value.Right(node->opName.value.Length() - 1); if (node->varName.value == L"") { return MakeParsingError(node, L"C10: Static functions \"" + operatorName + L"AndPause\" and \"" + operatorName + L"AndRead\" do not exist in coroutine provider \"" + type->GetTypeFriendlyName() + L"\"."); } else { return MakeParsingError(node, L"C10: Static function \"" + operatorName + L"AndRead\" does not exist in coroutine provider \"" + type->GetTypeFriendlyName() + L"\"."); } } glr::ParsingError WfErrors::CoOperatorNotExists(WfCoOperatorExpression* node, reflection::description::ITypeInfo* type) { return MakeParsingError(node, L"C10: Static function \"QueryContext\" does not exist in coroutine provider \"" + type->GetTypeFriendlyName() + L"\"."); } glr::ParsingError WfErrors::CoOperatorCannotResolveResultType(WfCoOperatorStatement* node, collections::List& types) { auto operatorName = node->opName.value.Right(node->opName.value.Length() - 1); if (node->arguments.Count() == 0) { return MakeParsingError(node, L"C11: Failed to resolve the result type of coroutine operator \"" + operatorName + L"\", since there is no argument."); } else { auto description = ListToErrorMessage(types, [](auto&& type) { return type->GetTypeFriendlyName(); }); return MakeParsingError(node, L"C11: Failed to resolve the result type of coroutine operator \"" + operatorName + L"\", no appropriate static function \"CastResult\" is found in the following types. It requires exactly one argument of type \"object\" with a return type which is not \"void\": " + description + L"."); } } glr::ParsingError WfErrors::CoProviderCreateNotExists(WfCoProviderStatement* node, reflection::description::ITypeInfo* type) { return MakeParsingError(node, L"C12: The required static function \"Create\" does not exist in coroutine provider \"" + type->GetTypeFriendlyName() + L"\". It is required to have exactly one argument of a function type, which consumes a pointer type and returns system::Coroutine^"); } glr::ParsingError WfErrors::CoProviderCreateAndRunNotExists(WfCoProviderStatement* node, reflection::description::ITypeInfo* type) { return MakeParsingError(node, L"C12: The required static function \"CreateAndRun\" does not exist in coroutine provider \"" + type->GetTypeFriendlyName() + L"\". It is required to have exactly one argument of a function type, which consumes a pointer type and returns system::Coroutine^"); } glr::ParsingError WfErrors::GotoLabelNotExists(WfGotoStatement* node) { return MakeParsingError(node, L"C13: Goto label \"" + node->label.value + L"\" does not exists. A goto label can only jump to the end of any block statement that contains this goto statement in the current function."); } glr::ParsingError WfErrors::TooManyGotoLabel(WfGotoStatement* node) { return MakeParsingError(node, L"C14: Too many goto targets \"" + node->label.value + L"\" found."); } glr::ParsingError WfErrors::WrongStateSwitchStatement(WfStateSwitchStatement* node) { return MakeParsingError(node, L"C15: $switch statement should appear inside a $state declaration."); } glr::ParsingError WfErrors::WrongStateInvokeStatement(WfStateInvokeStatement* node) { return MakeParsingError(node, L"C16: $goto_state or $push_state statement should appear inside a $state declaration."); } glr::ParsingError WfErrors::StateInputNotExists(WfStateSwitchCase* node) { return MakeParsingError(node, L"C17: State input \"" + node->name.value + L"\" does not exist."); } glr::ParsingError WfErrors::StateSwitchArgumentCountNotMatch(WfStateSwitchCase* node) { return MakeParsingError(node, L"C18: The number of arguments doesn not match the declaration of state input \"" + node->name.value + L"\"."); } glr::ParsingError WfErrors::StateNotExists(WfStateInvokeStatement* node) { return MakeParsingError(node, L"C19: State \"" + node->name.value + L"\" does not exist."); } glr::ParsingError WfErrors::StateArgumentCountNotMatch(WfStateInvokeStatement* node) { return MakeParsingError(node, L"C20: The number of arguments doesn not match the declaration of state \"" + node->name.value + L"\"."); } glr::ParsingError WfErrors::FunctionShouldHaveName(WfDeclaration* node) { return MakeParsingError(node, L"D0: Function should have a name."); } glr::ParsingError WfErrors::FunctionShouldHaveImplementation(WfDeclaration* node) { return MakeParsingError(node, L"D0: Function should be implemented."); } glr::ParsingError WfErrors::InterfaceMethodShouldNotHaveImplementation(WfDeclaration* node) { return MakeParsingError(node, L"D0: Interface method should not be implemented."); } glr::ParsingError WfErrors::DuplicatedDeclaration(WfDeclaration* node, const WString& firstDeclarationCategory) { return MakeParsingError(node, L"D1: Duplicated declaration \"" + node->name.value + L"\", it has already beed defined as a " + firstDeclarationCategory + L"."); } glr::ParsingError WfErrors::DuplicatedDeclaration(WfStateMachineDeclaration* node) { return MakeParsingError(node, L"D1: Duplicated $state_machine declaration."); } glr::ParsingError WfErrors::DuplicatedSymbol(WfDeclaration* node, Ptr symbol) { return MakeParsingError(node, L"D2: Duplicated symbol \"" + symbol->name + L"\"."); } glr::ParsingError WfErrors::DuplicatedSymbol(WfFunctionArgument* node, Ptr symbol) { return MakeParsingError(node, L"D2: Duplicated symbol \"" + symbol->name + L"\"."); } glr::ParsingError WfErrors::DuplicatedSymbol(WfStatement* node, Ptr symbol) { return MakeParsingError(node, L"D2: Duplicated symbol \"" + symbol->name + L"\"."); } glr::ParsingError WfErrors::DuplicatedSymbol(WfExpression* node, Ptr symbol) { return MakeParsingError(node, L"D2: Duplicated symbol \"" + symbol->name + L"\"."); } glr::ParsingError WfErrors::DuplicatedSymbol(WfStateInput* node, Ptr symbol) { return MakeParsingError(node, L"D2: Duplicated symbol \"" + symbol->name + L"\"."); } glr::ParsingError WfErrors::DuplicatedSymbol(WfStateDeclaration* node, Ptr symbol) { return MakeParsingError(node, L"D2: Duplicated symbol \"" + symbol->name + L"\"."); } glr::ParsingError WfErrors::DuplicatedSymbol(WfStateSwitchArgument* node, Ptr symbol) { return MakeParsingError(node, L"D2: Duplicated symbol \"" + symbol->name + L"\"."); } glr::ParsingError WfErrors::InterfaceMethodNotImplemented(WfNewInterfaceExpression* node, reflection::description::IMethodInfo* method) { auto result = ResolveExpressionResult::Method(method); return MakeParsingError(node, L"D3: Interface method not implemented: " + result.GetFriendlyName() + L"."); } glr::ParsingError WfErrors::InterfaceMethodNotFound(WfFunctionDeclaration* node, reflection::description::ITypeInfo* interfaceType, reflection::description::ITypeInfo* methodType) { return MakeParsingError(node, L"D4: Interface \"" + interfaceType->GetTypeFriendlyName() + L"\" does not contain method \"" + node->name.value + L"\" which is in type \"" + methodType->GetTypeFriendlyName() + L"\"."); } glr::ParsingError WfErrors::CannotPickOverloadedInterfaceMethods(WfExpression* node, collections::List& results) { auto description = ListToErrorMessage(results, [](auto&& result) { return result.GetFriendlyName(); }); return MakeParsingError(node, L"D5: Cannot decide which function to implement in multiple targets:" + description + L"."); } glr::ParsingError WfErrors::CannotPickOverloadedImplementMethods(WfFunctionDeclaration* node, reflection::description::ITypeInfo* type) { return MakeParsingError(node, L"D6: There are some other methods named \"" + node->name.value + L"\" whose types are also \"" + type->GetTypeFriendlyName() + L"\"."); } glr::ParsingError WfErrors::WrongDeclaration(WfEventDeclaration* node) { return MakeParsingError(node, L"D7: Event \"" + node->name.value + L"\" cannot be defined outside of classes or interfaces."); } glr::ParsingError WfErrors::WrongDeclaration(WfPropertyDeclaration* node) { return MakeParsingError(node, L"D7: Property \"" + node->name.value + L"\" cannot be defined outside of classes or interfaces."); } glr::ParsingError WfErrors::WrongDeclaration(WfConstructorDeclaration* node) { return MakeParsingError(node, L"D7: Constructor cannot be defined outside of classes."); } glr::ParsingError WfErrors::WrongDeclaration(WfDestructorDeclaration* node) { return MakeParsingError(node, L"D7: Destructor cannot be defined outside of classes."); } glr::ParsingError WfErrors::WrongDeclaration(WfAutoPropertyDeclaration* node) { return MakeParsingError(node, L"D7: Auto-property cannot be defined outside of classes."); } glr::ParsingError WfErrors::WrongDeclaration(WfStateMachineDeclaration* node) { return MakeParsingError(node, L"D7: State machine cannot be defined outside of classes."); } glr::ParsingError WfErrors::WrongDeclaration(WfStaticInitDeclaration* node) { return MakeParsingError(node, L"D7: Static initialization declaration cannot be defined inside classes or interfaces."); } glr::ParsingError WfErrors::WrongDeclarationInInterfaceConstructor(WfDeclaration* node) { return MakeParsingError(node, L"D8: \"" + node->name.value + L"\" cannot be defined in an new interface expression, only functions, variables and auto-properties are allowed."); } glr::ParsingError WfErrors::EnumValuesNotConsecutiveFromZero(WfEnumDeclaration* node) { return MakeParsingError(node, L"D9: Item values in enum \"" + node->name.value + L"\" should be consecutive and starts from zero, like 0, 1, 2, 3, 4, ..."); } glr::ParsingError WfErrors::FlagValuesNotConsecutiveFromZero(WfEnumDeclaration* node) { return MakeParsingError(node, L"D9: Item values in flag enum \"" + node->name.value + L"\" should be consecutive powers of 2 and starts from zero, like 0, 1, 2, 4, 8, ..."); } glr::ParsingError WfErrors::FlagValueNotExists(WfEnumItemIntersection* node, WfEnumDeclaration* owner) { return MakeParsingError(node, L"D10: Item \"" + node->name.value + L" does not exists in the current flag enum \"" + owner->name.value + L"\"."); } glr::ParsingError WfErrors::DuplicatedEnumValue(WfEnumItem* node, WfEnumDeclaration* owner) { return MakeParsingError(node, L"D11: Item \"" + node->name.value + L" already exists in the current enum \"" + owner->name.value + L"\"."); } glr::ParsingError WfErrors::StructContainsNonValueType(WfStructMember* node, WfStructDeclaration* owner) { return MakeParsingError(node, L"D12: Type of member \"" + node->name.value + L"\" of struct \"" + owner->name.value + L"\" is not value type."); } glr::ParsingError WfErrors::StructRecursivelyIncludeItself(WfStructDeclaration* node, collections::List& tds) { auto description = ListToErrorMessage(tds, [](auto&& td) { return td->GetTypeName(); }); return MakeParsingError(node, L"D13: Recursive references are found in these struct definitions:" + description + L"."); } glr::ParsingError WfErrors::DuplicatedStructMember(WfStructMember* node, WfStructDeclaration* owner) { return MakeParsingError(node, L"D14: Member \"" + node->name.value + L"\" already exists in struct \"" + owner->name.value + L"\"."); } glr::ParsingError WfErrors::AttributeNotExists(WfAttribute* node) { return MakeParsingError(node, L"D15: Attribute \"" + node->category.value + L":" + node->name.value + L"\" does not exist."); } glr::ParsingError WfErrors::AttributeMissValue(WfAttribute* node) { return MakeParsingError(node, L"D15: Value of attribute \"" + node->category.value + L":" + node->name.value + L"\" is missing."); } glr::ParsingError WfErrors::StateMachineClassNotInheritFromStateMachine(WfClassDeclaration* node) { return MakeParsingError(node, L"D16: State machine class \"" + node->name.value + L"\" should inherit from \"system::StateMachine\" directly."); } glr::ParsingError WfErrors::MissingDefaultState(WfStateMachineDeclaration* node) { return MakeParsingError(node, L"D17: Missing default state."); } glr::ParsingError WfErrors::WrongUsingPathWildCard(WfModuleUsingPath* node) { return MakeParsingError(node, L"E0: Wild card \"*\" should only appear in the last item of the using path and should appear once."); } glr::ParsingError WfErrors::TopQualifiedSymbolNotExists(glr::ParsingAstBase* node, const WString& name) { return MakeParsingError(node, L"F0: Top qualified symbol \"" + name + L"\" does not exist."); } glr::ParsingError WfErrors::ChildSymbolNotExists(glr::ParsingAstBase* node, Ptr scopeName, const WString& name) { return MakeParsingError(node, L"F1: Symbol \"" + name + L"\" does not exist in \"" + scopeName->GetFriendlyName() + L"\"."); } glr::ParsingError WfErrors::MemberNotExists(glr::ParsingAstBase* node, reflection::description::ITypeDescriptor* typeDescriptor, const WString& name) { return MakeParsingError(node, L"F1: Member \"" + name + L"\" does not exist in \"" + typeDescriptor->GetTypeName() + L"\"."); } glr::ParsingError WfErrors::ReferenceNotExists(glr::ParsingAstBase* node, const WString& name) { return MakeParsingError(node, L"F2: Symbol \"" + name + L"\" does not exist in the current scope."); } glr::ParsingError WfErrors::TooManyTargets(glr::ParsingAstBase* node, collections::List& results, const WString& name) { auto description = ListToErrorMessage(results, [](auto&& result) { return result.GetFriendlyName(); }); return MakeParsingError(node, L"F3: Symbol \"" + name + L"\" references to too many targets: " + description + L"."); } glr::ParsingError WfErrors::EnumItemNotExists(glr::ParsingAstBase* node, reflection::description::ITypeDescriptor* typeDescriptor, const WString& name) { return MakeParsingError(node, L"F2: Enum item \"" + name + L"\" does not exist in enum type \"" + typeDescriptor->GetTypeName() + L"\"."); } glr::ParsingError WfErrors::WrongClassMemberConfig(WfDeclaration* node) { return MakeParsingError(node, L"G1: Class member \"" + node->name.value + L"\" cannot be static or override because it is not a function or a auto-property."); } glr::ParsingError WfErrors::FunctionInNewTypeExpressionCannotBeStatic(WfDeclaration* node) { return MakeParsingError(node, L"G1: Class member \"" + node->name.value + L"\" cannot be static because it is in a new interface expression."); } glr::ParsingError WfErrors::AutoPropertyCannotBeNormalOutsideOfClass(WfDeclaration* node) { return MakeParsingError(node, L"G1: Auto property \"" + node->name.value + L"\" cannot be normal outside of classes or interfaces."); } glr::ParsingError WfErrors::AutoPropertyCannotBeStatic(WfDeclaration* node) { return MakeParsingError(node, L"G1: Auto property \"" + node->name.value + L"\" cannot be static ."); } glr::ParsingError WfErrors::WrongClassMember(WfNamespaceDeclaration* node) { return MakeParsingError(node, L"G2: Namespace \"" + node->name.value + L"\" cannot be a class member."); } glr::ParsingError WfErrors::PropertyGetterNotFound(WfPropertyDeclaration* node, WfClassDeclaration* classDecl) { return MakeParsingError(node, L"G3: Cannot find the getter \"" + node->getter.value + L"\" of property \"" + node->name.value + L"\" in type \"" + classDecl->name.value + L"\". A property getter should be a non-static method in the same type."); } glr::ParsingError WfErrors::PropertySetterNotFound(WfPropertyDeclaration* node, WfClassDeclaration* classDecl) { return MakeParsingError(node, L"G3: Cannot find the setter \"" + node->setter.value + L"\" of property \"" + node->name.value + L"\" in type \"" + classDecl->name.value + L"\". A property setter should be a non-static method in the same type."); } glr::ParsingError WfErrors::PropertyEventNotFound(WfPropertyDeclaration* node, WfClassDeclaration* classDecl) { return MakeParsingError(node, L"G3: Cannot find the event \"" + node->valueChangedEvent.value + L"\" of property \"" + node->name.value + L"\" in type \"" + classDecl->name.value + L"\"."); } glr::ParsingError WfErrors::TooManyPropertyGetter(WfPropertyDeclaration* node, WfClassDeclaration* classDecl) { return MakeParsingError(node, L"G4: Too many symbols found for the getter \"" + node->getter.value + L"\" of property \"" + node->name.value + L"\" in type \"" + classDecl->name.value + L"\"."); } glr::ParsingError WfErrors::TooManyPropertySetter(WfPropertyDeclaration* node, WfClassDeclaration* classDecl) { return MakeParsingError(node, L"G4: Too many symbols found for the setter \"" + node->setter.value + L"\" of property \"" + node->name.value + L"\" in type \"" + classDecl->name.value + L"\"."); } glr::ParsingError WfErrors::TooManyPropertyEvent(WfPropertyDeclaration* node, WfClassDeclaration* classDecl) { return MakeParsingError(node, L"G4: Too many symbols found for the event \"" + node->valueChangedEvent.value + L"\" of property \"" + node->name.value + L"\" in type \"" + classDecl->name.value + L"\"."); } glr::ParsingError WfErrors::PropertyGetterTypeMismatched(WfPropertyDeclaration* node, WfClassDeclaration* classDecl) { return MakeParsingError(node, L"G5: Cannot match the getter \"" + node->getter.value + L"\" of property \"" + node->name.value + L"\" in type \"" + classDecl->name.value + L"\". A property getter should have no argument, and its return type should be identical to the property type."); } glr::ParsingError WfErrors::PropertySetterTypeMismatched(WfPropertyDeclaration* node, WfClassDeclaration* classDecl) { return MakeParsingError(node, L"G5: Cannot match the setter \"" + node->getter.value + L"\" of property \"" + node->name.value + L"\" in type \"" + classDecl->name.value + L"\". A property setter should have no return value and have only one argument, and the argument type should be identical to the property type."); } glr::ParsingError WfErrors::WrongBaseType(WfClassDeclaration* node, WfType* type) { return MakeParsingError(node, L"G6: A base type of the type \"" + node->name.value + L"\" should be another custom type, it cannot be any predefined type, pointer type, shared pointer type, nullable type, collection type, or function type"); } glr::ParsingError WfErrors::WrongBaseTypeOfClass(WfClassDeclaration* node, reflection::description::ITypeDescriptor* type) { return MakeParsingError(node, L"G6: Base type \"" + type->GetTypeName() + L"\" of class \"" + node->name.value + L"\" is not a class, or it is a class but it is not aggregatable."); } glr::ParsingError WfErrors::WrongBaseTypeOfInterface(WfClassDeclaration* node, reflection::description::ITypeDescriptor* type) { return MakeParsingError(node, L"G6: Base type \"" + type->GetTypeName() + L"\" of interface \"" + node->name.value + L"\" is not an interface."); } glr::ParsingError WfErrors::WrongInterfaceBaseType(WfClassDeclaration* node, reflection::description::ITypeDescriptor* type) { Ptr proxy = TypeInfoRetriver>::CreateTypeInfo(); return MakeParsingError(node, L"G6: Interface \"" + type->GetTypeName() + L"\" should contain a constructor receiving an \"" + proxy->GetTypeFriendlyName() + L"\" to be the base type of \"" + node->name.value + L"\"."); } glr::ParsingError WfErrors::ClassWithInterfaceConstructor(WfClassDeclaration* node) { return MakeParsingError(node, L"G7: Cannot use interface constructor type on class \"" + node->name.value + L"\"."); } glr::ParsingError WfErrors::OverrideShouldImplementInterfaceMethod(WfFunctionDeclaration* node) { return MakeParsingError(node, L"G8: Function \"" + node->name.value + L"\" cannot be override because it doesn't implement any interface methods."); } glr::ParsingError WfErrors::OverrideShouldImplementInterfaceMethod(WfAutoPropertyDeclaration* node) { return MakeParsingError(node, L"G8: Auto-property \"" + node->name.value + L"\" cannot be override because it doesn't implement any interface methods."); } glr::ParsingError WfErrors::MissingFieldType(WfVariableDeclaration* node) { return MakeParsingError(node, L"G9: Type of field \"" + node->name.value + L"\" is missing."); } glr::ParsingError WfErrors::DuplicatedBaseClass(WfClassDeclaration* node, reflection::description::ITypeDescriptor* type) { return MakeParsingError(node, L"G10: Class \"" + node->name.value + L"\" inherits from another class \"" + type->GetTypeName() + L"\" for multiple times."); } glr::ParsingError WfErrors::ClassRecursiveInheritance(WfClassDeclaration* node, collections::List& tds) { auto description = ListToErrorMessage(tds, [](auto&& td) { return td->GetTypeName(); }); return MakeParsingError(node, L"G10: Recursive inheriting are found in these class definitions:" + description + L"."); } glr::ParsingError WfErrors::InterfaceRecursiveInheritance(WfClassDeclaration* node, collections::List& tds) { auto description = ListToErrorMessage(tds, [](auto&& td) { return td->GetTypeName(); }); return MakeParsingError(node, L"G10: Recursive inheriting are found in these interface definitions:" + description + L"."); } glr::ParsingError WfErrors::WrongBaseConstructorCall(WfBaseConstructorCall* node, reflection::description::ITypeDescriptor* type) { return MakeParsingError(node, L"G11: Type \"" + type->GetTypeName() + L"\" is not a base type of this class."); } glr::ParsingError WfErrors::DuplicatedBaseConstructorCall(WfBaseConstructorCall* node, reflection::description::ITypeDescriptor* type) { return MakeParsingError(node, L"G12: Base type \"" + type->GetTypeName() + L"\" has already been initialized."); } glr::ParsingError WfErrors::TooManyDestructor(WfDestructorDeclaration* node, WfClassDeclaration* classDecl) { return MakeParsingError(node, L"G13: Class \"" + classDecl->name.value + L"\" has too many destructors."); } glr::ParsingError WfErrors::AutoPropertyShouldBeInitialized(WfAutoPropertyDeclaration* node) { return MakeParsingError(node, L"G13: Auto property \"" + node->name.value + L"\" should be initialized."); } glr::ParsingError WfErrors::AutoPropertyCannotBeInitializedInInterface(WfAutoPropertyDeclaration* node, WfClassDeclaration* classDecl) { return MakeParsingError(node, L"G13: Auto property \"" + node->name.value + L"\" cannot be initialized in interface \"" + classDecl->name.value + L"\"."); } glr::ParsingError WfErrors::CppUnableToDecideClassOrder(WfClassDeclaration* node, collections::List& tds) { auto description = ListToErrorMessage(tds, [](auto&& td) { return td->GetTypeName(); }); return MakeParsingError(node, L"CPP1: (C++ Code Generation) Cannot decide order of the following classes. It is probably caused by inheritance relationships of internal classes inside these classes:" + description + L"."); } glr::ParsingError WfErrors::CppUnableToSeparateCustomFile(WfClassDeclaration* node, collections::List& tds) { auto description = ListToErrorMessage(tds, [](auto&& td) { return td->GetTypeName(); }); return MakeParsingError(node, L"CPP2: (C++ Code Generation) @cpp:File atrribute values for these classes are invalid. Generating classes to source files specified by these attribute values will create source files which do not compile. It is probably caused by inheritance relationships of internal classes inside these classes:" + description + L"."); } } } } /*********************************************************************** .\ANALYZER\WFANALYZER_EXPANDBINDEXPRESSION.CPP ***********************************************************************/ namespace vl { namespace workflow { namespace analyzer { using namespace collections; using namespace reflection; using namespace reflection::description; using namespace stream; /*********************************************************************** SearchUntilNonVirtualStatement ***********************************************************************/ class SearchUntilNonVirtualStatementVisitor : public empty_visitor::StatementVisitor { public: Ptr result; SearchUntilNonVirtualStatementVisitor(Ptr _result) :result(_result) { } void Dispatch(WfVirtualCseStatement* node)override { result = node->expandedStatement; result->Accept(this); } void Dispatch(WfCoroutineStatement* node)override { } void Dispatch(WfStateMachineStatement* node)override { } }; Ptr SearchUntilNonVirtualStatement(Ptr statement) { SearchUntilNonVirtualStatementVisitor visitor(statement); statement->Accept(&visitor); return visitor.result; } /*********************************************************************** Copy(Type|Expression|Statement|Declaration) ***********************************************************************/ class CopyDeclarationWithExpandVirtualVisitor : empty_visitor::DeclarationVisitor { public: bool expanded = false; List>& decls; CopyDeclarationWithExpandVirtualVisitor(List>& _decls) :decls(_decls) { } void Dispatch(WfVirtualCfeDeclaration* node)override { expanded = true; for (auto decl : node->expandedDeclarations) { Execute(decls, decl); } } void Dispatch(WfVirtualCseDeclaration* node)override { expanded = true; for (auto decl : node->expandedDeclarations) { Execute(decls, decl); } } static void Execute(List>& decls, Ptr decl) { CopyDeclarationWithExpandVirtualVisitor visitor(decls); decl->Accept(&visitor); if (!visitor.expanded) { decls.Add(decl); } } }; void CopyWithExpandVirtualVisitor::Expand(collections::List>& decls) { if (expandVirtualAst) { List> copied; CopyFrom(copied, decls); decls.Clear(); for (auto decl : copied) { CopyDeclarationWithExpandVirtualVisitor::Execute(decls, decl); } } } CopyWithExpandVirtualVisitor::CopyWithExpandVirtualVisitor(bool _expandVirtualAst) :expandVirtualAst(_expandVirtualAst) { } void CopyWithExpandVirtualVisitor::Visit(WfVirtualCfeExpression* node) { if (!expandVirtualAst || !node->expandedExpression) { return copy_visitor::AstVisitor::Visit(node); } node->expandedExpression->Accept(this); } void CopyWithExpandVirtualVisitor::Visit(WfVirtualCseExpression* node) { if (!expandVirtualAst || !node->expandedExpression) { return copy_visitor::AstVisitor::Visit(node); } node->expandedExpression->Accept(this); } void CopyWithExpandVirtualVisitor::Visit(WfVirtualCseStatement* node) { if (!expandVirtualAst || !node->expandedStatement) { return copy_visitor::AstVisitor::Visit(node); } node->expandedStatement->Accept(this); } void CopyWithExpandVirtualVisitor::Visit(WfNamespaceDeclaration* node) { copy_visitor::AstVisitor::Visit(node); Expand(result.Cast()->declarations); } void CopyWithExpandVirtualVisitor::Visit(WfClassDeclaration* node) { copy_visitor::AstVisitor::Visit(node); Expand(result.Cast()->declarations); } void CopyWithExpandVirtualVisitor::Visit(WfNewInterfaceExpression* node) { copy_visitor::AstVisitor::Visit(node); Expand(result.Cast()->declarations); } Ptr CopyType(Ptr type) { return CopyWithExpandVirtualVisitor(false).CopyNode(type.Obj()); } Ptr CopyExpression(Ptr expression, bool expandVirtualExprStat) { return CopyWithExpandVirtualVisitor(expandVirtualExprStat).CopyNode(expression.Obj()); } Ptr CopyStatement(Ptr statement, bool expandVirtualExprStat) { return CopyWithExpandVirtualVisitor(expandVirtualExprStat).CopyNode(statement.Obj()); } Ptr CopyDeclaration(Ptr declaration, bool expandVirtualExprStat) { return CopyWithExpandVirtualVisitor(expandVirtualExprStat).CopyNode(declaration.Obj()); } Ptr CopyModule(Ptr module, bool expandVirtualExprStat) { return CopyWithExpandVirtualVisitor(expandVirtualExprStat).CopyNode(module.Obj()); } Ptr CopyType(WfType* type) { return CopyWithExpandVirtualVisitor(false).CopyNode(type); } Ptr CopyExpression(WfExpression* expression, bool expandVirtualExprStat) { return CopyWithExpandVirtualVisitor(expandVirtualExprStat).CopyNode(expression); } Ptr CopyStatement(WfStatement* statement, bool expandVirtualExprStat) { return CopyWithExpandVirtualVisitor(expandVirtualExprStat).CopyNode(statement); } Ptr CopyDeclaration(WfDeclaration* declaration, bool expandVirtualExprStat) { return CopyWithExpandVirtualVisitor(expandVirtualExprStat).CopyNode(declaration); } Ptr CopyModule(WfModule* module, bool expandVirtualExprStat) { return CopyWithExpandVirtualVisitor(expandVirtualExprStat).CopyNode(module); } /*********************************************************************** observing expressions: WfObserveExpression WfMemberExpression that detects the event ***********************************************************************/ class BindContext : public Object { typedef collections::List ExprList; typedef collections::Dictionary ExprMap; typedef collections::Group ExprGroup; typedef collections::Group ExprEventGroup; public: ExprMap observeParents; ExprEventGroup observeEvents; ExprList orderedObserves; ExprList cachedExprs; // expression that need to cache its value ExprMap renames; // expression -> the expression being renamed ExprGroup exprAffects; // observe expression -> all expressions that it can cause to change ExprGroup exprCauses; // expression -> observe expressions that cause it to change ExprGroup observeAffects; // observe expression -> all observe expressions that it can cause to change ExprGroup observeCauses; // observe expression -> observe expressions that cause it to change WString GetCacheVariableName(vint index) { return L"" + itow(index); } vint GetCachedExpressionIndex(WfExpression* expression, bool ensureExists) { vint index = cachedExprs.IndexOf(expression); if (ensureExists) { CHECK_ERROR(index != -1, L"BindContext::GetCachedExpressionIndex(WfExpression*, bool)#Cached expression not exists."); } return index; } vint GetCachedExpressionIndexRecursively(WfExpression* expression, bool ensureExists) { WfExpression* cache = expression; while (true) { vint index = renames.Keys().IndexOf(cache); if (index == -1) { return GetCachedExpressionIndex(cache, ensureExists); } else { cache = renames.Values()[index]; } } } }; struct CallbackInfo { WfExpression* observe; IEventInfo* eventInfo; vint eventIndex; WString handlerName; WString callbackName; }; struct BindCallbackInfo { Dictionary> handlerVariables; Dictionary> callbackFunctions; Group observeCallbackInfos; }; /*********************************************************************** CreateBindContext ***********************************************************************/ class CreateBindContextVisitor : public Object, public WfExpression::IVisitor { public: WfLexicalScopeManager* manager; BindContext& context; CreateBindContextVisitor(WfLexicalScopeManager* _manager, BindContext& _context) :manager(_manager) , context(_context) { } void Call(WfExpression* node) { node->Accept(this); } void ObservableDepend(WfExpression* expr, WfExpression* parent) { if (context.observeParents.Keys().Contains(expr)) { CHECK_ERROR(context.observeParents[expr] == parent, L"CreateBindContextVisitor::ObservableDepend assigned different parents to the same expression."); return; } context.orderedObserves.Add(expr); context.observeParents.Add(expr, parent); DirectDepend(expr, parent, false); { auto cache = parent; while (true) { vint index = context.renames.Keys().IndexOf(cache); if (index == -1) { index = context.cachedExprs.IndexOf(cache); if (index == -1) { context.cachedExprs.Add(cache); } break; } else { cache = context.renames.Values()[index]; } } } vint index = context.exprCauses.Keys().IndexOf(parent); if (index != -1) { for (auto observe : context.exprCauses.GetByIndex(index)) { context.observeAffects.Add(observe, expr); context.observeCauses.Add(expr, observe); } } context.exprAffects.Add(expr, expr); context.exprCauses.Add(expr, expr); } void DirectDepend(WfExpression* expr, WfExpression* depended, bool processDepended = true) { if (processDepended) { Call(depended); } vint index = context.exprCauses.Keys().IndexOf(depended); if (index != -1) { for (auto observe : context.exprCauses.GetByIndex(index)) { context.exprCauses.Add(expr, observe); context.exprAffects.Add(observe, expr); } } } void Visit(WfThisExpression* node)override { // root expression, nothing to do } void Visit(WfTopQualifiedExpression* node)override { // root expression, nothing to do } void Visit(WfReferenceExpression* node)override { auto result = manager->expressionResolvings[node]; if (result.symbol) { auto scope = result.symbol->ownerScope; if (auto letExpr = dynamic_cast(scope->ownerNode.Obj())) { auto letVar = From(letExpr->variables) .Where([=](const Ptr& letVar) { return letVar->name.value == node->name.value; }) .First(); context.renames.Add(node, letVar->value.Obj()); DirectDepend(node, letVar->value.Obj(), false); } else if (auto observeExpr = dynamic_cast(scope->ownerNode.Obj())) { context.renames.Add(node, observeExpr->parent.Obj()); DirectDepend(node, observeExpr->parent.Obj()); } } } void Visit(WfOrderedNameExpression* node)override { // root expression, nothing to do } void Visit(WfOrderedLambdaExpression* node)override { // root expression, nothing to do } void Visit(WfMemberExpression* node)override { Call(node->parent.Obj()); auto scope = manager->nodeScopes[node].Obj(); while (scope) { if (scope->ownerNode.Cast()) { break; } scope = scope->parentScope.Obj(); } if (!scope) { auto memberResult = manager->expressionResolvings[node]; if (memberResult.propertyInfo) { auto td = memberResult.propertyInfo->GetOwnerTypeDescriptor(); auto ev = memberResult.propertyInfo->GetValueChangedEvent(); if (!ev) { ev = td->GetEventByName(memberResult.propertyInfo->GetName() + L"Changed", true); } if (ev) { ObservableDepend(node, node->parent.Obj()); context.observeEvents.Add(node, ev); return; } } } DirectDepend(node, node->parent.Obj(), false); } void Visit(WfChildExpression* node)override { DirectDepend(node, node->parent.Obj()); } void Visit(WfLiteralExpression* node)override { // root expression, nothing to do } void Visit(WfFloatingExpression* node)override { // root expression, nothing to do } void Visit(WfIntegerExpression* node)override { // root expression, nothing to do } void Visit(WfStringExpression* node)override { // root expression, nothing to do } void Visit(WfUnaryExpression* node)override { DirectDepend(node, node->operand.Obj()); } void Visit(WfBinaryExpression* node)override { DirectDepend(node, node->first.Obj()); DirectDepend(node, node->second.Obj()); } void Visit(WfLetExpression* node)override { for (auto var : node->variables) { DirectDepend(node, var->value.Obj()); } DirectDepend(node, node->expression.Obj()); } void Visit(WfIfExpression* node)override { DirectDepend(node, node->condition.Obj()); DirectDepend(node, node->trueBranch.Obj()); DirectDepend(node, node->falseBranch.Obj()); } void Visit(WfRangeExpression* node)override { DirectDepend(node, node->begin.Obj()); DirectDepend(node, node->end.Obj()); } void Visit(WfSetTestingExpression* node)override { DirectDepend(node, node->collection.Obj()); DirectDepend(node, node->element.Obj()); } void Visit(WfConstructorExpression* node)override { auto result = manager->expressionResolvings[node]; bool isStruct = (result.type->GetTypeDescriptor()->GetTypeDescriptorFlags() == TypeDescriptorFlags::Struct); for (auto argument : node->arguments) { if (!isStruct) { DirectDepend(node, argument->key.Obj()); } DirectDepend(node, argument->value.Obj()); } } void Visit(WfInferExpression* node)override { DirectDepend(node, node->expression.Obj()); } void Visit(WfTypeCastingExpression* node)override { DirectDepend(node, node->expression.Obj()); } void Visit(WfTypeTestingExpression* node)override { DirectDepend(node, node->expression.Obj()); } void Visit(WfTypeOfTypeExpression* node)override { // root expression, nothing to do } void Visit(WfTypeOfExpressionExpression* node)override { // root expression, nothing to do } void Visit(WfAttachEventExpression* node)override { DirectDepend(node, node->event.Obj()); DirectDepend(node, node->function.Obj()); } void Visit(WfDetachEventExpression* node)override { DirectDepend(node, node->event.Obj()); DirectDepend(node, node->handler.Obj()); } void Visit(WfObserveExpression* node)override { Call(node->parent.Obj()); ObservableDepend(node, node->parent.Obj()); Call(node->expression.Obj()); for (auto eventExpr : node->events) { auto result = manager->expressionResolvings[eventExpr.Obj()]; context.observeEvents.Add(node, result.eventInfo); Call(eventExpr.Obj()); } } void Visit(WfCallExpression* node)override { DirectDepend(node, node->function.Obj()); for (auto argument : node->arguments) { DirectDepend(node, argument.Obj()); } } void Visit(WfFunctionExpression* node)override { // root expression, nothing to do } void Visit(WfNewClassExpression* node)override { for (auto argument : node->arguments) { DirectDepend(node, argument.Obj()); } } void Visit(WfNewInterfaceExpression* node)override { // root expression, nothing to do } void Visit(WfVirtualCfeExpression* node)override { DirectDepend(node, node->expandedExpression.Obj()); } void Visit(WfVirtualCseExpression* node)override { DirectDepend(node, node->expandedExpression.Obj()); } }; /*********************************************************************** ExpandObserveExpression ***********************************************************************/ Ptr CreateReference(const WString& name) { auto ref = Ptr(new WfReferenceExpression); ref->name.value = name; return ref; } class ExpandObserveExpressionVisitor : public CopyWithExpandVirtualVisitor { public: BindContext& context; ExpandObserveExpressionVisitor(BindContext& _context) :CopyWithExpandVirtualVisitor(true) , context(_context) { } vl::Ptr CopyNode(WfExpression* node)override { return Execute(node, context); } static Ptr Execute(WfExpression* expression, BindContext& context, bool expandImmediately = true) { if (!expression) { return nullptr; } { vint index = context.GetCachedExpressionIndexRecursively(expression, false); if (index != -1) { if (expandImmediately) { return CreateReference(context.GetCacheVariableName(index)); } else { expression = context.cachedExprs[index]; } } } ExpandObserveExpressionVisitor visitor(context); expression->Accept(&visitor); return visitor.result.Cast(); } void Visit(WfLetExpression* node)override { auto letExpr = Ptr(new WfLetExpression); for (auto var : node->variables) { if (context.GetCachedExpressionIndexRecursively(var->value.Obj(), false) == -1) { auto letVar = Ptr(new WfLetVariable); letVar->name.value = var->name.value; letVar->value = Execute(var->value.Obj(), context); letExpr->variables.Add(letVar); } } if (letExpr->variables.Count() == 0) { result = Execute(node->expression.Obj(), context); } else { letExpr->expression = Execute(node->expression.Obj(), context); result = letExpr; } } void Visit(WfObserveExpression* node)override { if (node->observeType == WfObserveType::SimpleObserve) { auto expr = Ptr(new WfMemberExpression); expr->parent = CopyNode(node->parent.Obj()); expr->name.value = node->expression.Cast()->name.value; result = expr; } else { result = CopyNode(node->expression.Obj()); } } }; /*********************************************************************** CreateDefaultValue ***********************************************************************/ Ptr CreateDefaultValue(ITypeInfo* elementType) { auto valueType = elementType->GetTypeDescriptor()->GetValueType(); if (elementType->GetDecorator()==ITypeInfo::TypeDescriptor && valueType != nullptr) { switch (GetTypeFlag(elementType)) { case TypeFlag::Enum: { auto intExpr = Ptr(new WfIntegerExpression); intExpr->value.value = L"0"; auto inferExpr = Ptr(new WfTypeCastingExpression); inferExpr->strategy = WfTypeCastingStrategy::Strong; inferExpr->expression = intExpr; inferExpr->type = GetTypeFromTypeInfo(CreateTypeInfoFromTypeFlag(TypeFlag::U8).Obj()); auto castExpr = Ptr(new WfTypeCastingExpression); castExpr->strategy = WfTypeCastingStrategy::Strong; castExpr->expression = inferExpr; castExpr->type = GetTypeFromTypeInfo(elementType); return castExpr; } case TypeFlag::String: { auto stringExpr = Ptr(new WfStringExpression); return stringExpr; } break; case TypeFlag::Struct: if (elementType->GetTypeDescriptor()->GetSerializableType() == nullptr) { auto ctorExpr = Ptr(new WfConstructorExpression); auto castExpr = Ptr(new WfTypeCastingExpression); castExpr->strategy = WfTypeCastingStrategy::Strong; castExpr->expression = ctorExpr; castExpr->type = GetTypeFromTypeInfo(elementType); return castExpr; } default: { auto td = elementType->GetTypeDescriptor(); if (td == description::GetTypeDescriptor()) { auto expr = Ptr(new WfLiteralExpression); expr->value = WfLiteralValue::False; return expr; } if (td == description::GetTypeDescriptor()) { auto expr = Ptr(new WfStringExpression); return expr; } else if (td == description::GetTypeDescriptor() || td == description::GetTypeDescriptor()) { auto valueExpr = Ptr(new WfFloatingExpression); valueExpr->value.value = L"0"; auto inferExpr = Ptr(new WfInferExpression); inferExpr->expression = valueExpr; inferExpr->type = GetTypeFromTypeInfo(elementType); return inferExpr; } else if (td == description::GetTypeDescriptor() || td == description::GetTypeDescriptor() || td == description::GetTypeDescriptor() || td == description::GetTypeDescriptor() || td == description::GetTypeDescriptor() || td == description::GetTypeDescriptor() || td == description::GetTypeDescriptor() || td == description::GetTypeDescriptor()) { auto valueExpr = Ptr(new WfIntegerExpression); valueExpr->value.value = L"0"; auto inferExpr = Ptr(new WfInferExpression); inferExpr->expression = valueExpr; inferExpr->type = GetTypeFromTypeInfo(elementType); return inferExpr; } else { // Consider adding a \"default (type)\" expression if CreateDefault() cannot be liminated from the compiler. CHECK_FAIL(L"All serializable types should have been handled!"); /* auto stringExpr = Ptr(new WfStringExpression); elementType->GetTypeDescriptor()->GetSerializableType()->Serialize(valueType->CreateDefault(), stringExpr->value.value); auto castExpr = Ptr(new WfTypeCastingExpression); castExpr->strategy = WfTypeCastingStrategy::Strong; castExpr->expression = stringExpr; castExpr->type = GetTypeFromTypeInfo(elementType); return castExpr; */ } } } } else { auto nullExpr = Ptr(new WfLiteralExpression); nullExpr->value = WfLiteralValue::Null; auto inferExpr = Ptr(new WfInferExpression); inferExpr->expression = nullExpr; inferExpr->type = GetTypeFromTypeInfo(elementType); return inferExpr; } } /*********************************************************************** CreateBindWritableVariable ***********************************************************************/ Ptr CreateWritableVariable(const WString& name, ITypeInfo* type, Ptr value = nullptr) { auto decl = Ptr(new WfVariableDeclaration); decl->name.value = name; decl->type = GetTypeFromTypeInfo(type); decl->expression = value ? value : CreateDefaultValue(type); return decl; } Ptr CreateWritableVariableStatement(const WString& name, ITypeInfo* type, Ptr value = nullptr) { auto stat = Ptr(new WfVariableStatement); stat->variable = CreateWritableVariable(name, type, value); return stat; } /*********************************************************************** IValueSubscription::Subscribe ***********************************************************************/ Ptr AssignNormalMember(Ptr decl) { decl->functionKind = WfFunctionKind::Normal; return decl; } Ptr AssignOverrideMember(Ptr decl) { decl->functionKind = WfFunctionKind::Override; return decl; } /*********************************************************************** ExpandObserveEvent ***********************************************************************/ Ptr ExpandObserveEvent(WfLexicalScopeManager* manager, WfExpression* observe, vint eventIndex, BindContext& context) { auto cacheName = context.GetCacheVariableName(context.GetCachedExpressionIndexRecursively(context.observeParents[observe], true)); if (auto observeExpr = dynamic_cast(observe)) { if (observeExpr->observeType == WfObserveType::SimpleObserve) { auto expr = Ptr(new WfMemberExpression); expr->parent = CreateReference(cacheName); expr->name.value = observeExpr->events[eventIndex].Cast()->name.value; return expr; } else { return ExpandObserveExpressionVisitor::Execute(observeExpr->events[eventIndex].Obj(), context); } } else { auto eventName = context.observeEvents[observe][0]->GetName(); auto expr = Ptr(new WfMemberExpression); expr->parent = CreateReference(cacheName); expr->name.value = eventName; return expr; } } /*********************************************************************** CreateBindAttachStatement ***********************************************************************/ void CreateBindAttachStatement(Ptr block, WfLexicalScopeManager* manager, WfExpression* observe, BindContext& context, BindCallbackInfo& info) { for (auto callbackInfo : info.observeCallbackInfos[observe]) { auto attach = Ptr(new WfAttachEventExpression); attach->event = ExpandObserveEvent(manager, observe, callbackInfo.eventIndex, context); attach->function = CreateReference(callbackInfo.callbackName); auto nullExpr = Ptr(new WfLiteralExpression); nullExpr->value = WfLiteralValue::Null; auto protect = Ptr(new WfBinaryExpression); protect->first = attach; protect->second = nullExpr; protect->op = WfBinaryOperator::FailedThen; auto assign = Ptr(new WfBinaryExpression); assign->op = WfBinaryOperator::Assign; assign->first = CreateReference(callbackInfo.handlerName); assign->second = protect; auto stat = Ptr(new WfExpressionStatement); stat->expression = assign; block->statements.Add(stat); } } /*********************************************************************** CreateBindDetachStatement ***********************************************************************/ void CreateBindDetachStatement(Ptr block, WfLexicalScopeManager* manager, WfExpression* observe, BindContext& context, BindCallbackInfo& info) { for (auto callbackInfo : info.observeCallbackInfos[observe]) { auto testNull = Ptr(new WfTypeTestingExpression); testNull->expression = CreateReference(callbackInfo.handlerName); testNull->test = WfTypeTesting::IsNotNull; auto ifStat = Ptr(new WfIfStatement); ifStat->expression = testNull; auto trueBlock = Ptr(new WfBlockStatement); ifStat->trueBranch = trueBlock; block->statements.Add(ifStat); { auto detach = Ptr(new WfDetachEventExpression); detach->event = ExpandObserveEvent(manager, observe, callbackInfo.eventIndex, context); detach->handler = CreateReference(callbackInfo.handlerName); auto stat = Ptr(new WfExpressionStatement); stat->expression = detach; trueBlock->statements.Add(stat); } { auto nullExpr = Ptr(new WfLiteralExpression); nullExpr->value = WfLiteralValue::Null; auto assignExpr = Ptr(new WfBinaryExpression); assignExpr->first = CreateReference(callbackInfo.handlerName); assignExpr->second = nullExpr; assignExpr->op = WfBinaryOperator::Assign; auto stat = Ptr(new WfExpressionStatement); stat->expression = assignExpr; trueBlock->statements.Add(stat); } } } /*********************************************************************** CreateBindCacheAssignStatement ***********************************************************************/ void CreateBindCacheAssignStatement(WfLexicalScopeManager* manager, Ptr block, WfExpression* observe, BindContext& context) { auto parent = context.observeParents[observe]; auto cacheName = context.GetCacheVariableName(context.GetCachedExpressionIndexRecursively(parent, true)); auto protect = Ptr(new WfBinaryExpression); protect->first = ExpandObserveExpressionVisitor::Execute(parent, context, false); protect->second = CreateDefaultValue(manager->expressionResolvings[parent].type.Obj()); protect->op = WfBinaryOperator::FailedThen; auto assign = Ptr(new WfBinaryExpression); assign->op = WfBinaryOperator::Assign; assign->first = CreateReference(cacheName); assign->second = protect; auto stat = Ptr(new WfExpressionStatement); stat->expression = assign; block->statements.Add(stat); } /*********************************************************************** IValueSubscription::Open ***********************************************************************/ Ptr CreateBindOpenFunction(WfLexicalScopeManager* manager, BindContext& context, BindCallbackInfo& info) { auto func = Ptr(new WfFunctionDeclaration); func->name.value = L"Open"; func->functionKind = WfFunctionKind::Normal; func->anonymity = WfFunctionAnonymity::Named; { auto typeInfo = TypeInfoRetriver::CreateTypeInfo(); func->returnType = GetTypeFromTypeInfo(typeInfo.Obj()); } auto block = Ptr(new WfBlockStatement); func->statement = block; { auto ifStat = Ptr(new WfIfStatement); block->statements.Add(ifStat); { auto notExpr = Ptr(new WfUnaryExpression); notExpr->op = WfUnaryOperator::Not; notExpr->operand = CreateReference(L""); ifStat->expression = notExpr; } auto ifBlock = Ptr(new WfBlockStatement); ifStat->trueBranch = ifBlock; { auto literal = Ptr(new WfLiteralExpression); literal->value = WfLiteralValue::True; auto assign = Ptr(new WfBinaryExpression); assign->op = WfBinaryOperator::Assign; assign->first = CreateReference(L""); assign->second = literal; auto stat = Ptr(new WfExpressionStatement); stat->expression = assign; ifBlock->statements.Add(stat); } { SortedList assignedParents; SortedList observes; CopyFrom(observes, context.observeParents.Keys()); SortedList freeObserves; while (observes.Count() > 0) { CopyFrom( freeObserves, From(observes) .Where([&](WfExpression* observe) { return !context.observeCauses.Keys().Contains(observe) || From(context.observeCauses[observe]) .All([&](WfExpression* depended) { return !observes.Contains(depended); }); }) ); for (auto observe : context.orderedObserves) { if (freeObserves.Contains(observe)) { auto parent = context.GetCachedExpressionIndexRecursively(context.observeParents[observe], true); if (!assignedParents.Contains(parent)) { assignedParents.Add(parent); CreateBindCacheAssignStatement(manager, ifBlock, observe, context); } } } for (auto observe : freeObserves) { observes.Remove(observe); } freeObserves.Clear(); } } { for (auto observe : context.orderedObserves) { CreateBindAttachStatement(ifBlock, manager, observe, context, info); } } { auto literal = Ptr(new WfLiteralExpression); literal->value = WfLiteralValue::True; auto returnStat = Ptr(new WfReturnStatement); returnStat->expression = literal; ifBlock->statements.Add(returnStat); } } { auto literal = Ptr(new WfLiteralExpression); literal->value = WfLiteralValue::False; auto returnStat = Ptr(new WfReturnStatement); returnStat->expression = literal; block->statements.Add(returnStat); } return func; } /*********************************************************************** IValueSubscription::Update ***********************************************************************/ Ptr CreateBindUpdateFunction(BindCallbackInfo& info) { auto func = Ptr(new WfFunctionDeclaration); func->name.value = L"Update"; func->functionKind = WfFunctionKind::Normal; func->anonymity = WfFunctionAnonymity::Named; { auto typeInfo = TypeInfoRetriver::CreateTypeInfo(); func->returnType = GetTypeFromTypeInfo(typeInfo.Obj()); } auto block = Ptr(new WfBlockStatement); func->statement = block; { auto ifStat = Ptr(new WfIfStatement); block->statements.Add(ifStat); { auto notExpr = Ptr(new WfUnaryExpression); notExpr->op = WfUnaryOperator::Not; notExpr->operand = CreateReference(L""); auto andExpr = Ptr(new WfBinaryExpression); andExpr->op = WfBinaryOperator::And; andExpr->first = CreateReference(L""); andExpr->second = notExpr; ifStat->expression = andExpr; } auto ifBlock = Ptr(new WfBlockStatement); ifStat->trueBranch = ifBlock; { auto ref = CreateReference(L""); auto call = Ptr(new WfCallExpression); call->function = ref; auto stat = Ptr(new WfExpressionStatement); stat->expression = call; ifBlock->statements.Add(stat); } { auto literal = Ptr(new WfLiteralExpression); literal->value = WfLiteralValue::True; auto returnStat = Ptr(new WfReturnStatement); returnStat->expression = literal; ifBlock->statements.Add(returnStat); } } { auto literal = Ptr(new WfLiteralExpression); literal->value = WfLiteralValue::False; auto returnStat = Ptr(new WfReturnStatement); returnStat->expression = literal; block->statements.Add(returnStat); } return func; } /*********************************************************************** IValueSubscription::Close ***********************************************************************/ Ptr CreateBindCloseFunction(WfLexicalScopeManager* manager, BindContext& context, BindCallbackInfo& info) { auto func = Ptr(new WfFunctionDeclaration); func->name.value = L"Close"; func->functionKind = WfFunctionKind::Normal; func->anonymity = WfFunctionAnonymity::Named; { auto typeInfo = TypeInfoRetriver::CreateTypeInfo(); func->returnType = GetTypeFromTypeInfo(typeInfo.Obj()); } auto block = Ptr(new WfBlockStatement); func->statement = block; { auto ifStat = Ptr(new WfIfStatement); block->statements.Add(ifStat); { auto notExpr = Ptr(new WfUnaryExpression); notExpr->op = WfUnaryOperator::Not; notExpr->operand = CreateReference(L""); ifStat->expression = notExpr; } auto ifBlock = Ptr(new WfBlockStatement); ifStat->trueBranch = ifBlock; { auto literal = Ptr(new WfLiteralExpression); literal->value = WfLiteralValue::True; auto assign = Ptr(new WfBinaryExpression); assign->op = WfBinaryOperator::Assign; assign->first = CreateReference(L""); assign->second = literal; auto stat = Ptr(new WfExpressionStatement); stat->expression = assign; ifBlock->statements.Add(stat); } for (auto observe : context.orderedObserves) { CreateBindDetachStatement(ifBlock, manager, observe, context, info); } for (vint i = 0; i < context.cachedExprs.Count(); i++) { auto cacheName = context.GetCacheVariableName(i); auto type = manager->expressionResolvings[context.cachedExprs[i]].type; auto assign = Ptr(new WfBinaryExpression); assign->op = WfBinaryOperator::Assign; assign->first = CreateReference(cacheName); assign->second = CreateDefaultValue(type.Obj()); auto stat = Ptr(new WfExpressionStatement); stat->expression = assign; ifBlock->statements.Add(stat); } for (vint i = 0; i < info.handlerVariables.Count(); i++) { auto cacheName = info.handlerVariables.Keys()[i]; auto result = info.handlerVariables.Values()[i]; auto assign = Ptr(new WfBinaryExpression); assign->op = WfBinaryOperator::Assign; assign->first = CreateReference(cacheName); assign->second = CreateDefaultValue(result.Obj()); auto stat = Ptr(new WfExpressionStatement); stat->expression = assign; ifBlock->statements.Add(stat); } { auto literal = Ptr(new WfLiteralExpression); literal->value = WfLiteralValue::True; auto returnStat = Ptr(new WfReturnStatement); returnStat->expression = literal; ifBlock->statements.Add(returnStat); } } { auto literal = Ptr(new WfLiteralExpression); literal->value = WfLiteralValue::False; auto returnStat = Ptr(new WfReturnStatement); returnStat->expression = literal; block->statements.Add(returnStat); } return func; } /*********************************************************************** ExpandBindExpression ***********************************************************************/ void ExpandBindExpression(WfLexicalScopeManager* manager, WfBindExpression* node) { BindContext context; CreateBindContextVisitor(manager, context).Call(node->expression.Obj()); BindCallbackInfo bcInfo; auto newSubscription = Ptr(new WfNewInterfaceExpression); node->expandedExpression = newSubscription; { auto typeInfo = TypeInfoRetriver>::CreateTypeInfo(); newSubscription->type = GetTypeFromTypeInfo(typeInfo.Obj()); } { // stable symbol order by sorting them by code List orderedObserves; for (auto [parent, index] : indexed(context.cachedExprs)) { WString cacheName = context.GetCacheVariableName(index); { auto elementType = manager->expressionResolvings[parent].type; newSubscription->declarations.Add(CreateWritableVariable(cacheName, elementType.Obj())); } } for (auto [observe, observeIndex] : indexed(context.orderedObserves)) { const auto& events = context.observeEvents[observe]; for (auto [ev, eventIndex] : indexed(events)) { WString handlerName = L"" + itow(observeIndex) + L"_" + itow(eventIndex); { auto elementType = TypeInfoRetriver>::CreateTypeInfo(); bcInfo.handlerVariables.Add(handlerName, elementType); newSubscription->declarations.Add(CreateWritableVariable(handlerName, elementType.Obj())); } WString callbackName = L"" + itow(observeIndex) + L"_" + itow(eventIndex); { auto elementType = CopyTypeInfo(ev->GetHandlerType()); bcInfo.callbackFunctions.Add(callbackName, elementType); } CallbackInfo callbackInfo; callbackInfo.observe = observe; callbackInfo.eventInfo = ev; callbackInfo.eventIndex = eventIndex; callbackInfo.callbackName = callbackName; callbackInfo.handlerName = handlerName; bcInfo.observeCallbackInfos.Add(observe, callbackInfo); } } newSubscription->declarations.Add(CreateWritableVariable(L"", TypeInfoRetriver::CreateTypeInfo().Obj())); newSubscription->declarations.Add(CreateWritableVariable(L"", TypeInfoRetriver::CreateTypeInfo().Obj())); { auto func = Ptr(new WfFunctionDeclaration); func->name.value = L""; func->functionKind = WfFunctionKind::Normal; func->anonymity = WfFunctionAnonymity::Named; func->returnType = GetTypeFromTypeInfo(TypeInfoRetriver::CreateTypeInfo().Obj()); auto block = Ptr(new WfBlockStatement); func->statement = block; { auto var = Ptr(new WfVariableDeclaration); var->name.value = L""; var->expression = ExpandObserveExpressionVisitor::Execute(node->expression.Obj(), context); auto varStat = Ptr(new WfVariableStatement); varStat->variable = var; block->statements.Add(varStat); } { auto call = Ptr(new WfCallExpression); call->function = CreateReference(L"ValueChanged"); call->arguments.Add(CreateReference(L"")); auto stat = Ptr(new WfExpressionStatement); stat->expression = call; block->statements.Add(stat); } newSubscription->declarations.Add(AssignNormalMember(func)); } for (auto observe : context.orderedObserves) { for (auto callbackInfo : bcInfo.observeCallbackInfos[observe]) { auto func = Ptr(new WfFunctionDeclaration); func->name.value = callbackInfo.callbackName; func->functionKind = WfFunctionKind::Normal; func->anonymity = WfFunctionAnonymity::Named; { auto genericType = bcInfo.callbackFunctions[callbackInfo.callbackName]->GetElementType(); func->returnType = GetTypeFromTypeInfo(genericType->GetGenericArgument(0)); vint count = genericType->GetGenericArgumentCount(); for (vint i = 1; i < count; i++) { auto arg = Ptr(new WfFunctionArgument); arg->name.value = L"" + itow(i - 1); arg->type = GetTypeFromTypeInfo(genericType->GetGenericArgument(i)); func->arguments.Add(arg); } } auto block = Ptr(new WfBlockStatement); func->statement = block; { List affected; affected.Add(observe); for (vint i = 0; i < affected.Count(); i++) { auto current = affected[i]; vint dependencyIndex = context.observeAffects.Keys().IndexOf(current); if (dependencyIndex != -1) { for (auto affectedObserve : context.observeAffects.GetByIndex(dependencyIndex)) { if (affectedObserve && !affected.Contains(affectedObserve)) { affected.Add(affectedObserve); } } } } affected.Remove(observe); for (auto affectedObserve : From(affected).Reverse()) { CreateBindDetachStatement(block, manager, affectedObserve, context, bcInfo); } { SortedList assignedParents; for (auto affectedObserve : affected) { auto parent = context.GetCachedExpressionIndexRecursively(context.observeParents[affectedObserve], true); if (!assignedParents.Contains(parent)) { assignedParents.Add(parent); CreateBindCacheAssignStatement(manager, block, affectedObserve, context); } } } for (auto affectedObserve : affected) { CreateBindAttachStatement(block, manager, affectedObserve, context, bcInfo); } } { auto ref = CreateReference(L""); auto call = Ptr(new WfCallExpression); call->function = ref; auto stat = Ptr(new WfExpressionStatement); stat->expression = call; block->statements.Add(stat); } newSubscription->declarations.Add(AssignNormalMember(func)); } } } newSubscription->declarations.Add(AssignOverrideMember(CreateBindOpenFunction(manager, context, bcInfo))); newSubscription->declarations.Add(AssignOverrideMember(CreateBindUpdateFunction(bcInfo))); newSubscription->declarations.Add(AssignOverrideMember(CreateBindCloseFunction(manager, context, bcInfo))); } } } } /*********************************************************************** .\ANALYZER\WFANALYZER_EXPANDMIXINCASTEXPRESSION.CPP ***********************************************************************/ namespace vl { namespace workflow { namespace analyzer { using namespace collections; using namespace reflection; using namespace reflection::description; /*********************************************************************** ExpandNewCoroutineExpression ***********************************************************************/ void ExpandMixinCastExpression(WfLexicalScopeManager* manager, WfMixinCastExpression* node) { auto sourceType = manager->expressionResolvings[node->expression.Obj()].type; auto newExpr = Ptr(new WfNewInterfaceExpression); node->expandedExpression = newExpr; newExpr->type = CopyType(node->type); { auto varDecl = Ptr(new WfVariableDeclaration); newExpr->declarations.Add(varDecl); varDecl->name.value = L""; varDecl->expression = CopyExpression(node->expression, true); if (sourceType->GetDecorator() == ITypeInfo::RawPtr) { auto tdType = Ptr(new TypeDescriptorTypeInfo(sourceType->GetTypeDescriptor(), TypeInfoHint::Normal)); auto pointerType = Ptr(new SharedPtrTypeInfo(tdType)); auto castExpr = Ptr(new WfTypeCastingExpression); castExpr->strategy = WfTypeCastingStrategy::Strong; castExpr->expression = varDecl->expression; castExpr->type = GetTypeFromTypeInfo(pointerType.Obj()); varDecl->expression = castExpr; } } List unprocessed; unprocessed.Add(sourceType->GetTypeDescriptor()); for (vint i = 0; i < unprocessed.Count(); i++) { auto td = unprocessed[i]; vint groupCount = td->GetMethodGroupCount(); for (vint j = 0; j < groupCount; j++) { auto group = td->GetMethodGroup(j); vint methodCount = group->GetMethodCount(); for (vint k = 0; k < methodCount; k++) { auto method = group->GetMethod(k); if (!method->IsStatic()) { auto funcDecl = Ptr(new WfFunctionDeclaration); newExpr->declarations.Add(funcDecl); funcDecl->functionKind = WfFunctionKind::Override; funcDecl->anonymity = WfFunctionAnonymity::Named; funcDecl->name.value = method->GetName(); funcDecl->returnType = GetTypeFromTypeInfo(method->GetReturn()); vint parameterCount = method->GetParameterCount(); for (vint l = 0; l < parameterCount; l++) { auto parameter = method->GetParameter(l); auto argument = Ptr(new WfFunctionArgument); argument->name.value = L"" + parameter->GetName(); argument->type = GetTypeFromTypeInfo(parameter->GetType()); funcDecl->arguments.Add(argument); } auto implBlock = Ptr(new WfBlockStatement); funcDecl->statement = implBlock; { auto refSource = Ptr(new WfReferenceExpression); refSource->name.value = L""; auto memberExpr = Ptr(new WfMemberExpression); if (sourceType->GetTypeDescriptor() == method->GetOwnerTypeDescriptor()) { memberExpr->parent = refSource; } else if (sourceType->GetTypeDescriptor()->GetMethodGroupByName(method->GetName(), true) == method->GetOwnerMethodGroup()) { memberExpr->parent = refSource; } else { auto castExpr = Ptr(new WfTypeCastingExpression); castExpr->strategy = WfTypeCastingStrategy::Strong; castExpr->expression = refSource; { auto tdType = Ptr(new TypeDescriptorTypeInfo(sourceType->GetTypeDescriptor(), TypeInfoHint::Normal)); auto pointerType = Ptr(new RawPtrTypeInfo(tdType)); castExpr->type = GetTypeFromTypeInfo(pointerType.Obj()); } auto inferExpr = Ptr(new WfInferExpression); inferExpr->expression = castExpr; { auto tdType = Ptr(new TypeDescriptorTypeInfo(method->GetOwnerTypeDescriptor(), TypeInfoHint::Normal)); auto pointerType = Ptr(new RawPtrTypeInfo(tdType)); inferExpr->type = GetTypeFromTypeInfo(pointerType.Obj()); } memberExpr->parent = inferExpr; } memberExpr->name.value = method->GetName(); auto callExpr = Ptr(new WfCallExpression); callExpr->function = memberExpr; for (vint l = 0; l < parameterCount; l++) { auto parameter = method->GetParameter(l); auto argumentExpr = Ptr(new WfReferenceExpression); argumentExpr->name.value = L"" + parameter->GetName(); callExpr->arguments.Add(argumentExpr); } if (method->GetReturn()->GetTypeDescriptor() == description::GetTypeDescriptor()) { auto stat = Ptr(new WfExpressionStatement); stat->expression = callExpr; implBlock->statements.Add(stat); } else { auto stat = Ptr(new WfReturnStatement); stat->expression = callExpr; implBlock->statements.Add(stat); } } } } } vint count = td->GetBaseTypeDescriptorCount(); for (vint j = 0; j < count; j++) { auto baseTd = td->GetBaseTypeDescriptor(j); if (!unprocessed.Contains(baseTd)) { unprocessed.Add(baseTd); } } } } } } } /*********************************************************************** .\ANALYZER\WFANALYZER_EXPANDNEWCOROUTINEEXPRESSION.CPP ***********************************************************************/ namespace vl { namespace workflow { namespace analyzer { using namespace collections; using namespace reflection; using namespace reflection::description; Ptr GenerateCoroutineInvalidId() { auto refOne = Ptr(new WfIntegerExpression); refOne->value.value = L"1"; auto refInvalid = Ptr(new WfUnaryExpression); refInvalid->op = WfUnaryOperator::Negative; refInvalid->operand = refOne; return refInvalid; } /*********************************************************************** FindCoroutineAwaredStatements ***********************************************************************/ class FindCoroutineAwaredStatementVisitor : public empty_visitor::StatementVisitor { public: List& awaredStatements; bool awared = false; FindCoroutineAwaredStatementVisitor(List& _awaredStatements) :awaredStatements(_awaredStatements) { } bool Call(Ptr node) { if (!node) return false; awared = false; node->Accept(this); if (awared) { awaredStatements.Add(node.Obj()); } return awared; } void Dispatch(WfVirtualCseStatement* node)override { awared = Call(node->expandedStatement); } void Dispatch(WfCoroutineStatement* node)override { awared = true; } void Dispatch(WfStateMachineStatement* node)override { CHECK_FAIL(L"FindCoroutineAwaredStatementVisitor::Visit(WfStateMachineStatement*)#Internal error, state machine statement is not allowed in $coroutine expression."); } void Visit(WfBreakStatement* node)override { awared = true; } void Visit(WfContinueStatement* node)override { awared = true; } void Visit(WfReturnStatement* node)override { awared = true; } void Visit(WfIfStatement* node)override { bool a = Call(node->trueBranch); bool b = Call(node->falseBranch); awared = a || b; } void Visit(WfWhileStatement* node)override { awared = Call(node->statement); } void Visit(WfTryStatement* node)override { bool a = Call(node->protectedStatement); bool b = Call(node->catchStatement); bool c = Call(node->finallyStatement); awared = a || b || c; } void Visit(WfBlockStatement* node)override { bool result = false; for (auto stat : node->statements) { bool a = Call(stat); result |= a; } awared = result; } void Visit(WfGotoStatement* node)override { awared = true; } }; void FindCoroutineAwaredStatements(Ptr node, List& awaredStatements) { FindCoroutineAwaredStatementVisitor(awaredStatements).Call(node); } /*********************************************************************** FindCoroutineAwaredVariables ***********************************************************************/ class FindCoroutineAwaredVariableVisitor : public empty_visitor::StatementVisitor { public: List& awaredVariables; FindCoroutineAwaredVariableVisitor(List& _awaredVariables) :awaredVariables(_awaredVariables) { } void Dispatch(WfVirtualCseStatement* node)override { node->expandedStatement->Accept(this); } void Dispatch(WfCoroutineStatement* node)override { } void Dispatch(WfStateMachineStatement* node)override { CHECK_FAIL(L"FindCoroutineAwaredVariableVisitor::Visit(WfStateMachineStatement*)#Internal error, state machine statement is not allowed in $coroutine expression."); } void Visit(WfVariableStatement* node)override { awaredVariables.Add(node); } }; class FindCoroutineAwaredBlockVisitor : public empty_visitor::StatementVisitor { public: List& awaredVariables; FindCoroutineAwaredBlockVisitor(List& _awaredVariables) :awaredVariables(_awaredVariables) { } void Dispatch(WfVirtualCseStatement* node)override { // If an virtual node is coroutine awared // than its expandedStatement is also in the list // no need to find variables again } void Dispatch(WfCoroutineStatement* node)override { } void Dispatch(WfStateMachineStatement* node)override { CHECK_FAIL(L"FindCoroutineAwaredBlockVisitor::Visit(WfStateMachineStatement*)#Internal error, state machine statement is not allowed in $coroutine expression."); } void Visit(WfBlockStatement* node)override { FindCoroutineAwaredVariableVisitor visitor(awaredVariables); for (auto stat : node->statements) { stat->Accept(&visitor); } } }; void FindCoroutineAwaredVariables(WfStatement* node, List& awaredVariables) { FindCoroutineAwaredBlockVisitor visitor(awaredVariables); node->Accept(&visitor); } /*********************************************************************** FindCoroutineReferenceRenaming ***********************************************************************/ void FindCoroutineReferenceRenaming(WfLexicalScopeManager* manager, List& awaredStatements, List& awaredVariables, Dictionary& referenceRenaming) { vint renameCounter = 0; auto rename = [&](const WString& name) { if (name.Length() > 0 && name[0] == L'<') { vint index = INVLOC.FindFirst(name, L">", Locale::None).key; auto category = name.Sub(1, index - 1); auto local = name.Sub(index + 1, name.Length() - index - 1); return L"" + local; } else { return L"" + name; } }; for (auto stat : awaredVariables) { auto scope = manager->nodeScopes[stat]; auto symbol = scope->symbols[stat->variable->name.value][0]; auto name = rename(stat->variable->name.value); referenceRenaming.Add(symbol.Obj(), name); } for (auto stat : awaredStatements) { if (auto tryStat = dynamic_cast(stat)) { if (tryStat->catchStatement) { auto scope = manager->nodeScopes[tryStat->catchStatement.Obj()]->parentScope.Obj(); auto symbol = scope->symbols[tryStat->name.value][0]; auto name = rename(tryStat->name.value); referenceRenaming.Add(symbol.Obj(), name); } } else if (auto ifStat = dynamic_cast(stat)) { if (ifStat->name.value != L"") { auto scope = manager->nodeScopes[ifStat->trueBranch.Obj()]->parentScope.Obj(); auto symbol = scope->symbols[ifStat->name.value][0]; auto name = rename(ifStat->name.value); referenceRenaming.Add(symbol.Obj(), name); } } } } /*********************************************************************** FlowChart ***********************************************************************/ class FlowChartNode; class FlowChartBranch : public Object { public: Ptr condition; FlowChartNode* destination = nullptr; }; enum class FlowChartNodeAction { None, SetPause, }; class FlowChartNode : public Object { public: FlowChartNodeAction action = FlowChartNodeAction::None; bool embedInBranch = false; List> statements; List> branches; FlowChartNode* destination = nullptr; FlowChartNode* exceptionDestination = nullptr; FlowChartNode* pauseDestination = nullptr; WfLexicalSymbol* exceptionVariable = nullptr; }; class FlowChart : public Object { typedef Dictionary> TempExVarMap; public: List> nodes; FlowChartNode* headNode = nullptr; FlowChartNode* lastNode = nullptr; TempExVarMap tempExVars; FlowChartNode* CreateNode(FlowChartNode* catchNode) { auto node = Ptr(new FlowChartNode); node->exceptionDestination = catchNode; nodes.Add(node); return node.Obj(); } FlowChartNode* AppendNode(FlowChartNode* head, FlowChartNode* catchNode, FlowChartNodeAction action = FlowChartNodeAction::None) { auto node = CreateNode(catchNode); node->action = action; if (head) { CHECK_ERROR(head->destination == nullptr, L"FlowChart::AppendNode(FlowChartNode*, FlowChartNode*, FlowChartNodeAction)#Cannot append a new node to a flow chart node that already has a default destination."); head->destination = node; } return node; } FlowChartNode* EnsureAppendStatement(FlowChartNode* head, FlowChartNode* catchNode) { if (head == nullptr) { return CreateNode(catchNode); } else if(head->branches.Count() > 0 || head->exceptionDestination != catchNode) { CHECK_ERROR(head->destination == nullptr, L"FlowChart::EnsureAppendStatement(FlowChartNode*, FlowChartNode*)#Cannot append a statement to a flow chart node that already has a default destination."); auto node = CreateNode(catchNode); head->destination = node; return node; } else { return head; } } }; /*********************************************************************** GenerateFlowChart ***********************************************************************/ class GenerateFlowChartModuleVisitor : public CopyWithExpandVirtualVisitor { public: WfLexicalScopeManager* manager; Dictionary& referenceRenaming; GenerateFlowChartModuleVisitor(WfLexicalScopeManager* _manager, Dictionary& _referenceRenaming) :CopyWithExpandVirtualVisitor(true) , manager(_manager) , referenceRenaming(_referenceRenaming) { } void Visit(WfReferenceExpression* node)override { copy_visitor::AstVisitor::Visit(node); vint index = manager->expressionResolvings.Keys().IndexOf(node); if (index != -1) { auto resolvingResult = manager->expressionResolvings.Values()[index]; vint index = referenceRenaming.Keys().IndexOf(resolvingResult.symbol.Obj()); if (index != -1) { result.Cast()->name.value = referenceRenaming.Values()[index]; } } } }; class GenerateFlowChartStatementVisitor : public Object , public WfStatement::IVisitor , public WfCoroutineStatement::IVisitor { public: enum class ScopeType { Function, Loop, TryCatch, Block, }; struct ScopeContext { ScopeContext* parent = nullptr; ScopeType type = ScopeType::Function; WString name; FlowChartNode* enterNode = nullptr; FlowChartNode* leaveNode = nullptr; ScopeContext* exitStatementScope = nullptr; Ptr exitStatement; }; public: WfLexicalScopeManager* manager; SortedList& awaredStatements; Dictionary& referenceRenaming; Ptr flowChart; FlowChartNode* headNode; FlowChartNode* catchNode; ScopeContext* scopeContext; FlowChartNode* resultHead = nullptr; FlowChartNode* resultLast = nullptr; GenerateFlowChartStatementVisitor(WfLexicalScopeManager* _manager, SortedList& _awaredStatements, Dictionary& _referenceRenaming, Ptr _flowChart, FlowChartNode* _headNode, FlowChartNode* _catchNode, ScopeContext* _scopeContext) :manager(_manager) , awaredStatements(_awaredStatements) , referenceRenaming(_referenceRenaming) , flowChart(_flowChart) , headNode(_headNode) , catchNode(_catchNode) , scopeContext(_scopeContext) { } #define COPY_AST_RAW(STATEMENT) GenerateFlowChartModuleVisitor(manager, referenceRenaming).CopyNode(STATEMENT) #define COPY_AST_SHARED(STATEMENT) COPY_AST_RAW((STATEMENT).Obj()) void AppendAwaredStatement(FlowChartNode* catchNode, ScopeContext* scopeContext, Ptr statement) { if (!resultHead) { resultHead = flowChart->EnsureAppendStatement(headNode, catchNode); resultLast = resultHead; } resultLast = Execute(resultHead, catchNode, scopeContext, statement).value; } void AppendUnawaredCopiedStatement(FlowChartNode* catchNode, ScopeContext* scopeContext, Ptr statement) { if (!resultHead) { resultHead = flowChart->EnsureAppendStatement(headNode, catchNode); resultLast = resultHead; } resultHead->statements.Add(statement); } ScopeContext* InlineScopeExitCode(ScopeType untilScopeType, bool exclusive, const WString name = WString::Empty) { auto current = scopeContext; while (current) { bool found = false; if (current->type == untilScopeType) { if (name == L"" || current->name == name) { found = true; } } if (exclusive && found) break; if (current->exitStatement) { AppendAwaredStatement(catchNode, current->exitStatementScope, current->exitStatement); } if (!exclusive && found) break; current = current->parent; } return current; } static Pair Execute(WfLexicalScopeManager* manager, SortedList& awaredStatements, Dictionary& referenceRenaming, Ptr flowChart, FlowChartNode* headNode, FlowChartNode* catchNode, ScopeContext* scopeContext, Ptr statement) { GenerateFlowChartStatementVisitor visitor(manager, awaredStatements, referenceRenaming, flowChart, headNode, catchNode, scopeContext); if (awaredStatements.Contains(statement.Obj())) { statement->Accept(&visitor); } else { visitor.AppendUnawaredCopiedStatement(catchNode, scopeContext, COPY_AST_SHARED(statement)); } return{ visitor.resultHead,visitor.resultLast }; } Pair Execute(FlowChartNode* headNode, FlowChartNode* catchNode, ScopeContext* scopeContext, Ptr statement) { return Execute(manager, awaredStatements, referenceRenaming, flowChart, headNode, catchNode, scopeContext, statement); } void Visit(WfBreakStatement* node)override { auto targetContext = InlineScopeExitCode(ScopeType::Loop, false); resultHead = flowChart->EnsureAppendStatement(headNode, catchNode); resultLast = resultHead; auto branch = Ptr(new FlowChartBranch); branch->destination = targetContext->leaveNode; resultLast->branches.Add(branch); } void Visit(WfContinueStatement* node)override { auto targetContext = InlineScopeExitCode(ScopeType::Loop, true); resultHead = flowChart->EnsureAppendStatement(headNode, catchNode); resultLast = resultHead; auto branch = Ptr(new FlowChartBranch); branch->destination = targetContext->enterNode; resultLast->branches.Add(branch); } void Visit(WfReturnStatement* node)override { auto targetContext = InlineScopeExitCode(ScopeType::Function, false); AppendUnawaredCopiedStatement(catchNode, scopeContext, COPY_AST_RAW(node)); auto branch = Ptr(new FlowChartBranch); branch->destination = targetContext->leaveNode; resultLast->branches.Add(branch); } void Visit(WfDeleteStatement* node)override { AppendUnawaredCopiedStatement(catchNode, scopeContext, COPY_AST_RAW(node)); } void Visit(WfRaiseExceptionStatement* node)override { AppendUnawaredCopiedStatement(catchNode, scopeContext, COPY_AST_RAW(node)); } void GenerateIfWithVar(WfIfStatement* node) { resultHead = flowChart->EnsureAppendStatement(headNode, catchNode); { auto branch = Ptr(new FlowChartBranch); resultHead->branches.Add(branch); auto scope = manager->nodeScopes[node]; auto symbol = scope->symbols[node->name.value][0].Obj(); { auto refExpr = Ptr(new WfReferenceExpression); refExpr->name.value = referenceRenaming[symbol]; auto assignExpr = Ptr(new WfBinaryExpression); assignExpr->op = WfBinaryOperator::Assign; assignExpr->first = refExpr; assignExpr->second = COPY_AST_SHARED(node->expression); auto stat = Ptr(new WfExpressionStatement); stat->expression = assignExpr; SetCodeRange((Ptr)stat, node->expression->codeRange); resultHead->statements.Add(stat); } { auto refExpr = Ptr(new WfReferenceExpression); refExpr->name.value = referenceRenaming[symbol]; auto testExpr = Ptr(new WfTypeTestingExpression); testExpr->test = WfTypeTesting::IsNotNull; testExpr->expression = refExpr; SetCodeRange((Ptr)testExpr, node->expression->codeRange); branch->condition = testExpr; } } resultLast = flowChart->CreateNode(catchNode); { auto pair = Execute(nullptr, catchNode, scopeContext, node->trueBranch); pair.value->destination = resultLast; resultHead->branches[0]->destination = pair.key; } if (node->falseBranch) { auto pair = Execute(nullptr, catchNode, scopeContext, node->falseBranch); pair.value->destination = resultLast; resultHead->destination = pair.key; } else { resultHead->destination = resultLast; } } void GenerateIfWithoutVar(WfIfStatement* node) { resultHead = flowChart->EnsureAppendStatement(headNode, catchNode); resultLast = flowChart->CreateNode(catchNode); while (true) { auto branch = Ptr(new FlowChartBranch); resultHead->branches.Add(branch); branch->condition = COPY_AST_SHARED(node->expression); auto pair = Execute(nullptr, catchNode, scopeContext, node->trueBranch); pair.value->destination = resultLast; branch->destination = pair.key; auto next = dynamic_cast(node->falseBranch.Obj()); if (next && next->name.value == L"") { node = next; } else { break; } } if (node->falseBranch) { auto pair = Execute(nullptr, catchNode, scopeContext, node->falseBranch); pair.value->destination = resultLast; resultHead->destination = pair.key; } else { resultHead->destination = resultLast; } } void Visit(WfIfStatement* node)override { if (node->name.value == L"") { GenerateIfWithoutVar(node); } else { GenerateIfWithVar(node); } } void Visit(WfWhileStatement* node)override { resultHead = flowChart->EnsureAppendStatement(headNode, catchNode); { auto branch = Ptr(new FlowChartBranch); resultHead->branches.Add(branch); branch->condition = COPY_AST_SHARED(node->condition); } auto loopEnd = flowChart->CreateNode(catchNode); { auto branch = Ptr(new FlowChartBranch); loopEnd->branches.Add(branch); branch->condition = COPY_AST_SHARED(node->condition); } resultLast = flowChart->CreateNode(catchNode); ScopeContext loopContext; loopContext.parent = scopeContext; loopContext.type = ScopeType::Loop; loopContext.enterNode = loopEnd; loopContext.leaveNode = resultLast; auto pair = Execute(nullptr, catchNode, &loopContext, node->statement); pair.value->destination = loopEnd; resultHead->branches[0]->destination = pair.key; loopEnd->branches[0]->destination = pair.key; resultHead->destination = resultLast; loopEnd->destination = resultLast; } WfLexicalSymbol* GetExceptionVariableSymbol(WfTryStatement* node) { if (node->catchStatement) { auto scope = manager->nodeScopes[node->catchStatement.Obj()]->parentScope.Obj(); auto symbol = scope->symbols[node->name.value][0]; return symbol.Obj(); } else { vint index = flowChart->tempExVars.Keys().IndexOf(node); if (index == -1) { auto symbol = Ptr(new WfLexicalSymbol(nullptr)); symbol->name = L"ex"; symbol->typeInfo = TypeInfoRetriver>::CreateTypeInfo(); flowChart->tempExVars.Add(node, symbol); referenceRenaming.Add(symbol.Obj(), L"tempExVars.Count() - 1) + L">ex"); return symbol.Obj(); } return flowChart->tempExVars.Values()[index].Obj(); } } Pair GenerateCatch(WfTryStatement* node, FlowChartNode* catchNode) { auto pair = Execute(nullptr, catchNode, scopeContext, node->catchStatement); pair.key->exceptionVariable = GetExceptionVariableSymbol(node); return pair; } Pair GenerateFinally(WfTryStatement* node, FlowChartNode* catchNode) { return Execute(nullptr, catchNode, scopeContext, node->finallyStatement); } Pair GenerateFinallyAndRaise(WfTryStatement* node, FlowChartNode* catchNode) { auto pair = Execute(nullptr, catchNode, scopeContext, node->finallyStatement); auto raiseNode = flowChart->CreateNode(catchNode); { pair.key->exceptionVariable = GetExceptionVariableSymbol(node); auto refExpr = Ptr(new WfReferenceExpression); refExpr->name.value = referenceRenaming[pair.key->exceptionVariable]; auto memberExpr = Ptr(new WfMemberExpression); memberExpr->parent = refExpr; memberExpr->name.value = L"Message"; auto raiseStat = Ptr(new WfRaiseExceptionStatement); raiseStat->expression = memberExpr; SetCodeRange((Ptr)raiseStat, node->finallyStatement->codeRange); raiseNode->statements.Add(raiseStat); } pair.value->destination = raiseNode; return { pair.key,raiseNode }; } void Visit(WfTryStatement* node)override { ScopeContext tryContext; tryContext.parent = scopeContext; tryContext.type = ScopeType::TryCatch; if (node->finallyStatement) { tryContext.exitStatementScope = scopeContext; tryContext.exitStatement = node->finallyStatement; } if (node->catchStatement && !node->finallyStatement) { auto pairCatch = GenerateCatch(node, catchNode); AppendAwaredStatement(pairCatch.key, &tryContext, node->protectedStatement); auto endNode = flowChart->CreateNode(catchNode); pairCatch.value->destination = endNode; resultLast->destination = endNode; resultLast = endNode; } else if (!node->catchStatement && node->finallyStatement) { auto pairFinallyAndRaise = GenerateFinallyAndRaise(node, catchNode); AppendAwaredStatement(pairFinallyAndRaise.key, &tryContext, node->protectedStatement); auto pairFinally = GenerateFinally(node, catchNode); auto endNode = flowChart->CreateNode(catchNode); resultLast->destination = pairFinally.key; pairFinally.value->destination = endNode; pairFinallyAndRaise.value->destination = endNode; resultLast = endNode; } else { auto pairFinallyAndRaise = GenerateFinallyAndRaise(node, catchNode); auto pairCatch = GenerateCatch(node, pairFinallyAndRaise.key); AppendAwaredStatement(pairCatch.key, &tryContext, node->protectedStatement); auto pairFinally = GenerateFinally(node, catchNode); auto endNode = flowChart->CreateNode(catchNode); resultLast->destination = pairFinally.key; pairCatch.value->destination = pairFinally.key; pairFinally.value->destination = endNode; pairFinallyAndRaise.value->destination = endNode; resultLast = endNode; } } void Visit(WfBlockStatement* node)override { if (node->endLabel.value == L"") { resultHead = flowChart->EnsureAppendStatement(headNode, catchNode); resultLast = resultHead; for (auto [stat, index] : indexed(node->statements)) { auto pair = Execute(resultLast, catchNode, scopeContext, stat); resultLast = pair.value; } } else { resultHead = flowChart->EnsureAppendStatement(headNode, catchNode); auto blockEnd = flowChart->CreateNode(catchNode); resultLast = resultHead; ScopeContext blockContext; blockContext.parent = scopeContext; blockContext.type = ScopeType::Block; blockContext.name = node->endLabel.value; blockContext.enterNode = resultHead; blockContext.leaveNode = blockEnd; for (auto [stat, index] : indexed(node->statements)) { auto pair = Execute(resultLast, catchNode, &blockContext, stat); resultLast = pair.value; } resultLast->destination = blockEnd; resultLast = blockEnd; } } void Visit(WfGotoStatement* node)override { auto targetContext = InlineScopeExitCode(ScopeType::Block, false, node->label.value); resultHead = flowChart->EnsureAppendStatement(headNode, catchNode); resultLast = resultHead; auto branch = Ptr(new FlowChartBranch); branch->destination = targetContext->leaveNode; resultLast->branches.Add(branch); } void Visit(WfVariableStatement* node)override { resultHead = flowChart->EnsureAppendStatement(headNode, catchNode); resultLast = resultHead; auto scope = manager->nodeScopes[node]; auto symbol = scope->symbols[node->variable->name.value][0].Obj(); auto refExpr = Ptr(new WfReferenceExpression); refExpr->name.value = referenceRenaming[symbol]; auto assignExpr = Ptr(new WfBinaryExpression); assignExpr->op = WfBinaryOperator::Assign; assignExpr->first = refExpr; assignExpr->second = COPY_AST_SHARED(node->variable->expression); auto stat = Ptr(new WfExpressionStatement); stat->expression = assignExpr; SetCodeRange((Ptr)stat, node->codeRange); AppendUnawaredCopiedStatement(catchNode, scopeContext, stat); } void Visit(WfExpressionStatement* node)override { AppendUnawaredCopiedStatement(catchNode, scopeContext, COPY_AST_RAW(node)); } void Visit(WfVirtualCseStatement* node)override { node->expandedStatement->Accept(this); } void Visit(WfCoroutineStatement* node)override { node->Accept(static_cast(this)); } void Visit(WfCoPauseStatement* node)override { resultHead = flowChart->AppendNode(headNode, catchNode, FlowChartNodeAction::SetPause); resultLast = resultHead; if (node->statement) { AppendUnawaredCopiedStatement(catchNode, scopeContext, COPY_AST_SHARED(node->statement)); } resultLast = flowChart->AppendNode(resultLast, catchNode); { auto pauseStat = Ptr(new WfCoPauseStatement); SetCodeRange((Ptr)pauseStat, node->codeRange); resultLast->statements.Add(pauseStat); } resultLast = flowChart->AppendNode(resultLast, catchNode); resultHead->pauseDestination = resultLast; } void Visit(WfCoOperatorStatement* node)override { CHECK_FAIL(L"GenerateFlowChartStatementVisitor::Visit(WfCoOperatorStatement*)#Internal error, co-operator statement is not allowed in $coroutine expression."); } void Visit(WfStateMachineStatement* node)override { CHECK_FAIL(L"GenerateFlowChartStatementVisitor::Visit(WfStateMachineStatement*)#Internal error, state machine statement is not allowed in $coroutine expression."); } #undef COPY_STATEMENT }; Ptr GenerateFlowChart(WfLexicalScopeManager* manager, List& awaredStatements, List& awaredVariables, Dictionary& referenceRenaming, Ptr statement) { auto flowChart = Ptr(new FlowChart); SortedList sortedAwaredStatements; CopyFrom(sortedAwaredStatements, awaredStatements, true); CopyFrom(sortedAwaredStatements, awaredVariables, true); auto endNode = flowChart->CreateNode(nullptr); GenerateFlowChartStatementVisitor::ScopeContext context; context.leaveNode = endNode; auto pair = GenerateFlowChartStatementVisitor::Execute(manager, sortedAwaredStatements, referenceRenaming, flowChart, nullptr, nullptr, &context, statement); pair.value->destination = endNode; flowChart->headNode = pair.key; flowChart->lastNode = endNode; return flowChart; } /*********************************************************************** RemoveUnnecessaryNodes ***********************************************************************/ void CalculateEnterCounts(Ptr flowChart, Dictionary& enterCounts) { const auto& keys = enterCounts.Keys(); auto& values = const_cast::ValueContainer&>(enterCounts.Values()); for (auto node : flowChart->nodes) { enterCounts.Add(node.Obj(), 0); } enterCounts.Set(flowChart->headNode, 1); auto Inc = [&](FlowChartNode* node) { if (node) { vint index = keys.IndexOf(node); values[index]++; } }; for (auto node : flowChart->nodes) { Inc(node->destination); Inc(node->exceptionDestination); Inc(node->pauseDestination); for (auto branch : node->branches) { Inc(branch->destination); } } } void RemoveUnnecessaryNodesPass(Ptr flowChart) { Dictionary enterCounts; CalculateEnterCounts(flowChart, enterCounts); SortedList mergableNodes; List> keepingNodes; for (auto node : flowChart->nodes) { bool mergable = false; if (node->branches.Count() == 0 && node->destination) { if (node->statements.Count() == 0 && node->action == FlowChartNodeAction::None && !node->exceptionVariable) { mergable = true; } else if (node->destination->action == FlowChartNodeAction::None && !node->destination->exceptionVariable && enterCounts[node->destination] == 1) { mergable = true; } } if (mergable) { mergableNodes.Add(node.Obj()); } else { keepingNodes.Add(node); } } Dictionary merging; for (auto node : mergableNodes) { auto current = node; while (mergableNodes.Contains(current)) { auto target = current->destination; if (current->action == FlowChartNodeAction::SetPause) { target->action = current->action; target->pauseDestination = current->pauseDestination; } if (current->exceptionVariable) { target->exceptionVariable = current->exceptionVariable; } if (current->statements.Count() > 0) { CopyFrom(current->statements, target->statements, true); CopyFrom(target->statements, current->statements); current->statements.Clear(); } current = target; } merging.Add(node, current); } #define MERGE_FLOW_CHART_NODE(DESTINATION)\ {\ vint index = merging.Keys().IndexOf(DESTINATION);\ if (index != -1) DESTINATION = merging.Values()[index];\ }\ for (auto node : flowChart->nodes) { if (!mergableNodes.Contains(node.Obj())) { MERGE_FLOW_CHART_NODE(node->destination); MERGE_FLOW_CHART_NODE(node->exceptionDestination); MERGE_FLOW_CHART_NODE(node->pauseDestination); for (auto branch : node->branches) { MERGE_FLOW_CHART_NODE(branch->destination); } } } MERGE_FLOW_CHART_NODE(flowChart->headNode); MERGE_FLOW_CHART_NODE(flowChart->lastNode); #undef MERGE_FLOW_CHART_NODE vint headNodeIndex = keepingNodes.IndexOf(flowChart->headNode); if (headNodeIndex != 0) { auto headNode = keepingNodes[headNodeIndex]; keepingNodes.RemoveAt(headNodeIndex); keepingNodes.Insert(0, headNode); } CopyFrom(flowChart->nodes, keepingNodes); } void RemoveUnnecessaryNodes(Ptr flowChart) { RemoveUnnecessaryNodesPass(flowChart); for (auto node : flowChart->nodes) { if (node->pauseDestination && node->statements.Count() > 0 && node->statements[node->statements.Count() - 1].Cast()) { node->destination = nullptr; } } Dictionary enterCounts; CalculateEnterCounts(flowChart, enterCounts); for (auto node : flowChart->nodes) { for (auto branch : node->branches) { if (enterCounts[branch->destination] == 1) { branch->destination->embedInBranch = true; } } } } /*********************************************************************** GenerateSetStatus ***********************************************************************/ Ptr GenerateSetStatus(const WString& status) { auto refExpr = Ptr(new WfReferenceExpression); refExpr->name.value = status; auto funcExpr = Ptr(new WfReferenceExpression); funcExpr->name.value = L"SetStatus"; auto callExpr = Ptr(new WfCallExpression); callExpr->function = funcExpr; callExpr->arguments.Add(refExpr); auto stat = Ptr(new WfExpressionStatement); stat->expression = callExpr; return stat; }; /*********************************************************************** GenerateSetCoState ***********************************************************************/ Ptr GenerateSetCoStateBeforePause() { auto refBefore = Ptr(new WfReferenceExpression); refBefore->name.value = L""; auto refState = Ptr(new WfReferenceExpression); refState->name.value = L""; auto assignExpr = Ptr(new WfBinaryExpression); assignExpr->op = WfBinaryOperator::Assign; assignExpr->first = refBefore; assignExpr->second = refState; auto stat = Ptr(new WfExpressionStatement); stat->expression = assignExpr; return stat; } Ptr GenerateSetCoStateBeforePauseToInvalid() { auto refBefore = Ptr(new WfReferenceExpression); refBefore->name.value = L""; auto assignExpr = Ptr(new WfBinaryExpression); assignExpr->op = WfBinaryOperator::Assign; assignExpr->first = refBefore; assignExpr->second = GenerateCoroutineInvalidId(); auto stat = Ptr(new WfExpressionStatement); stat->expression = assignExpr; return stat; } Ptr GenerateSetCoState(List& nodeOrders, FlowChartNode* node) { auto refState = Ptr(new WfReferenceExpression); refState->name.value = L""; auto intState = Ptr(new WfIntegerExpression); intState->value.value = itow(nodeOrders.IndexOf(node)); auto assignExpr = Ptr(new WfBinaryExpression); assignExpr->op = WfBinaryOperator::Assign; assignExpr->first = refState; assignExpr->second = intState; auto stat = Ptr(new WfExpressionStatement); stat->expression = assignExpr; return stat; }; /*********************************************************************** ExpandExceptionDestination ***********************************************************************/ Ptr ExpandExceptionDestination(FlowChartNode* catchNode, Dictionary& referenceRenaming, List& nodeOrders, Ptr stateBlock) { ///////////////////////////////////////////////////////////////////////////// // try { ... } ///////////////////////////////////////////////////////////////////////////// auto nodeTryStat = Ptr(new WfTryStatement); auto nodeBlock = Ptr(new WfBlockStatement); nodeTryStat->protectedStatement = nodeBlock; ///////////////////////////////////////////////////////////////////////////// // catch() // { // THE_EXCEPTION_VARIABLE = ; // = THE_EXCEPTION_STATE; // continue; // } ///////////////////////////////////////////////////////////////////////////// nodeTryStat->name.value = L""; auto catchBlock = Ptr(new WfBlockStatement); nodeTryStat->catchStatement = catchBlock; { auto refTarget = Ptr(new WfReferenceExpression); refTarget->name.value = referenceRenaming[catchNode->exceptionVariable]; auto refEx = Ptr(new WfReferenceExpression); refEx->name.value = L""; auto assignExpr = Ptr(new WfBinaryExpression); assignExpr->op = WfBinaryOperator::Assign; assignExpr->first = refTarget; assignExpr->second = refEx; auto stat = Ptr(new WfExpressionStatement); stat->expression = assignExpr; catchBlock->statements.Add(stat); } catchBlock->statements.Add(GenerateSetCoState(nodeOrders, catchNode)); catchBlock->statements.Add(Ptr(new WfContinueStatement)); stateBlock->statements.Add(nodeTryStat); return nodeBlock; } /*********************************************************************** ExpandFlowChartNode ***********************************************************************/ void ExpandFlowChartNode(Ptr flowChart, FlowChartNode* flowChartNode, Dictionary& referenceRenaming, List& nodeOrders, FlowChartNode* parentCatchNode, Ptr stateBlock) { if (flowChartNode->action == FlowChartNodeAction::SetPause) { ///////////////////////////////////////////////////////////////////////////// // = THE_NEXT_STATE; // SetStatus(Waiting); ///////////////////////////////////////////////////////////////////////////// stateBlock->statements.Add(GenerateSetStatus(L"Waiting")); stateBlock->statements.Add(GenerateSetCoStateBeforePause()); stateBlock->statements.Add(GenerateSetCoState(nodeOrders, flowChartNode->pauseDestination)); } auto nodeBlock = stateBlock; if (flowChartNode->exceptionDestination && parentCatchNode != flowChartNode->exceptionDestination) { nodeBlock = ExpandExceptionDestination(flowChartNode->exceptionDestination, referenceRenaming, nodeOrders, stateBlock); } bool exited = false; for (auto stat : flowChartNode->statements) { if (stat.Cast()) { exited = true; ///////////////////////////////////////////////////////////////////////////// // return; ///////////////////////////////////////////////////////////////////////////// nodeBlock->statements.Add(Ptr(new WfReturnStatement)); } else if (stat.Cast()) { exited = true; ///////////////////////////////////////////////////////////////////////////// // SetStatus(Stopped); // return; ///////////////////////////////////////////////////////////////////////////// stateBlock->statements.Add(GenerateSetStatus(L"Stopped")); { auto returnStat = Ptr(new WfReturnStatement); stateBlock->statements.Add(returnStat); } } else { if (stat.Cast()) { exited = true; } nodeBlock->statements.Add(stat); } } for (auto branch : flowChartNode->branches) { Ptr trueBlock; if (branch->condition) { auto ifStat = Ptr(new WfIfStatement); ifStat->expression = branch->condition; trueBlock = Ptr(new WfBlockStatement); ifStat->trueBranch = trueBlock; nodeBlock->statements.Add(ifStat); } else { trueBlock = nodeBlock; } if (branch->destination->embedInBranch) { ExpandFlowChartNode(flowChart, branch->destination, referenceRenaming, nodeOrders, flowChartNode->exceptionDestination, trueBlock); } else { trueBlock->statements.Add(GenerateSetCoState(nodeOrders, branch->destination)); trueBlock->statements.Add(Ptr(new WfContinueStatement)); } } if (!exited) { if (flowChartNode == flowChart->lastNode) { ///////////////////////////////////////////////////////////////////////////// // SetStatus(Stopped); // return; ///////////////////////////////////////////////////////////////////////////// stateBlock->statements.Add(GenerateSetStatus(L"Stopped")); { auto returnStat = Ptr(new WfReturnStatement); stateBlock->statements.Add(returnStat); } } else { ///////////////////////////////////////////////////////////////////////////// // = THE_NEXT_STATE; // continue; ///////////////////////////////////////////////////////////////////////////// stateBlock->statements.Add(GenerateSetCoState(nodeOrders, flowChartNode->destination)); stateBlock->statements.Add(Ptr(new WfContinueStatement)); } } } /*********************************************************************** ExpandNewCoroutineExpression ***********************************************************************/ void ExpandNewCoroutineExpression(WfLexicalScopeManager* manager, WfNewCoroutineExpression* node) { List awaredStatements; List awaredVariables; Dictionary referenceRenaming; FindCoroutineAwaredStatements(node->statement, awaredStatements); for (auto stat : awaredStatements) { FindCoroutineAwaredVariables(stat, awaredVariables); } FindCoroutineReferenceRenaming(manager, awaredStatements, awaredVariables, referenceRenaming); auto flowChart = GenerateFlowChart(manager, awaredStatements, awaredVariables, referenceRenaming, node->statement); RemoveUnnecessaryNodes(flowChart); List nodeOrders; CopyFrom( nodeOrders, From(flowChart->nodes) .Select([](Ptr node) { return node.Obj(); }) .Where([](FlowChartNode* node) { return !node->embedInBranch; }) ); auto newExpr = Ptr(new WfNewInterfaceExpression); node->expandedExpression = newExpr; newExpr->type = GetTypeFromTypeInfo(TypeInfoRetriver>::CreateTypeInfo().Obj()); ///////////////////////////////////////////////////////////////////////////// // Coroutine Awared Variables ///////////////////////////////////////////////////////////////////////////// for (auto symbol : From(referenceRenaming.Keys()) .OrderByKey([&](WfLexicalSymbol* a) { return referenceRenaming[a]; })) { auto varDecl = Ptr(new WfVariableDeclaration); newExpr->declarations.Add(varDecl); varDecl->name.value = referenceRenaming[symbol]; varDecl->type = GetTypeFromTypeInfo(symbol->typeInfo.Obj()); varDecl->expression = CreateDefaultValue(symbol->typeInfo.Obj()); } ///////////////////////////////////////////////////////////////////////////// // ///////////////////////////////////////////////////////////////////////////// { auto varDecl = Ptr(new WfVariableDeclaration); newExpr->declarations.Add(varDecl); varDecl->name.value = L""; varDecl->type = GetTypeFromTypeInfo(manager->cputiSInt.Obj()); auto stateExpr = Ptr(new WfIntegerExpression); stateExpr->value.value = L"0"; varDecl->expression = stateExpr; } ///////////////////////////////////////////////////////////////////////////// // ///////////////////////////////////////////////////////////////////////////// { auto varDecl = Ptr(new WfVariableDeclaration); newExpr->declarations.Add(varDecl); varDecl->name.value = L""; varDecl->type = GetTypeFromTypeInfo(manager->cputiSInt.Obj()); varDecl->expression = GenerateCoroutineInvalidId(); } ///////////////////////////////////////////////////////////////////////////// // prop Failure : Exception^ {const, not observe} ///////////////////////////////////////////////////////////////////////////// { auto propDecl = Ptr(new WfAutoPropertyDeclaration); newExpr->declarations.Add(propDecl); propDecl->functionKind = WfFunctionKind::Override; propDecl->name.value = L"Failure"; propDecl->type = GetTypeFromTypeInfo(TypeInfoRetriver>::CreateTypeInfo().Obj()); propDecl->configConst = WfAPConst::Readonly; propDecl->configObserve = WfAPObserve::NotObservable; auto nullExpr = Ptr(new WfLiteralExpression); nullExpr->value = WfLiteralValue::Null; propDecl->expression = nullExpr; } ///////////////////////////////////////////////////////////////////////////// // prop Status : CoroutineStatus^ {const, not observe} ///////////////////////////////////////////////////////////////////////////// { auto propDecl = Ptr(new WfAutoPropertyDeclaration); newExpr->declarations.Add(propDecl); propDecl->functionKind = WfFunctionKind::Override; propDecl->name.value = L"Status"; propDecl->type = GetTypeFromTypeInfo(TypeInfoRetriver::CreateTypeInfo().Obj()); propDecl->configConst = WfAPConst::Readonly; propDecl->configObserve = WfAPObserve::NotObservable; auto refExpr = Ptr(new WfReferenceExpression); refExpr->name.value = L"Waiting"; propDecl->expression = refExpr; } ///////////////////////////////////////////////////////////////////////////// // func Resume( : bool, : CoroutineResult^) : void ///////////////////////////////////////////////////////////////////////////// WString coResultName = node->name.value == L"" ? L"" : node->name.value; { auto funcDecl = Ptr(new WfFunctionDeclaration); newExpr->declarations.Add(funcDecl); funcDecl->functionKind = WfFunctionKind::Override; funcDecl->anonymity = WfFunctionAnonymity::Named; funcDecl->name.value = L"Resume"; funcDecl->returnType = GetTypeFromTypeInfo(TypeInfoRetriver::CreateTypeInfo().Obj()); { auto argument = Ptr(new WfFunctionArgument); funcDecl->arguments.Add(argument); argument->name.value = L""; argument->type = GetTypeFromTypeInfo(TypeInfoRetriver::CreateTypeInfo().Obj()); } { auto argument = Ptr(new WfFunctionArgument); funcDecl->arguments.Add(argument); argument->name.value = coResultName; argument->type = GetTypeFromTypeInfo(TypeInfoRetriver>::CreateTypeInfo().Obj()); } auto block = Ptr(new WfBlockStatement); funcDecl->statement = block; ///////////////////////////////////////////////////////////////////////////// // if (Status != Waiting) raise "..."; ///////////////////////////////////////////////////////////////////////////// { auto ifStat = Ptr(new WfIfStatement); { auto refStatus = Ptr(new WfReferenceExpression); refStatus->name.value = L"Status"; auto waitingStatus = Ptr(new WfChildExpression); waitingStatus->parent = GetExpressionFromTypeDescriptor(description::GetTypeDescriptor()); waitingStatus->name.value = L"Waiting"; auto compExpr = Ptr(new WfBinaryExpression); compExpr->op = WfBinaryOperator::NE; compExpr->first = refStatus; compExpr->second = waitingStatus; ifStat->expression = compExpr; } auto trueBlock = Ptr(new WfBlockStatement); ifStat->trueBranch = trueBlock; { auto exExpr = Ptr(new WfStringExpression); exExpr->value.value = L"Resume should be called only when the coroutine is in the waiting status."; auto raiseStat = Ptr(new WfRaiseExceptionStatement); raiseStat->expression = exExpr; trueBlock->statements.Add(raiseStat); } block->statements.Add(ifStat); } ///////////////////////////////////////////////////////////////////////////// // SetStatus(Executing); ///////////////////////////////////////////////////////////////////////////// block->statements.Add(GenerateSetStatus(L"Executing")); { ///////////////////////////////////////////////////////////////////////////// // try { ... } ///////////////////////////////////////////////////////////////////////////// auto tryStat = Ptr(new WfTryStatement); auto tryBlock = Ptr(new WfBlockStatement); tryStat->protectedStatement = tryBlock; { ///////////////////////////////////////////////////////////////////////////// // if (name.value = L""; auto compareInput = Ptr(new WfBinaryExpression); compareInput->op = WfBinaryOperator::NE; compareInput->first = refBefore; compareInput->second = GenerateCoroutineInvalidId(); auto ifStat = Ptr(new WfIfStatement); tryBlock->statements.Add(ifStat); ifStat->expression = compareInput; ifStat->trueBranch = trueBlock; } ///////////////////////////////////////////////////////////////////////////// // if ( is null) { = -1; } // else if (.Failure is null) { = -1; } // else { ... } ///////////////////////////////////////////////////////////////////////////// { auto nullTrueBlock = Ptr(new WfBlockStatement); Ptr* nullFalseBlock = nullptr; auto exTrueBlock = Ptr(new WfBlockStatement); auto exFalseBlock = Ptr(new WfBlockStatement); { auto refOutput = Ptr(new WfReferenceExpression); refOutput->name.value = coResultName; auto testNullExpr = Ptr(new WfTypeTestingExpression); testNullExpr->test = WfTypeTesting::IsNull; testNullExpr->expression = refOutput; auto ifStat = Ptr(new WfIfStatement); trueBlock->statements.Add(ifStat); ifStat->expression = testNullExpr; ifStat->trueBranch = nullTrueBlock; nullTrueBlock->statements.Add(GenerateSetCoStateBeforePauseToInvalid()); nullFalseBlock = &ifStat->falseBranch; } { auto refOutput = Ptr(new WfReferenceExpression); refOutput->name.value = coResultName; auto refFailure = Ptr(new WfMemberExpression); refFailure->parent = refOutput; refFailure->name.value = L"Failure"; auto testNullExpr = Ptr(new WfTypeTestingExpression); testNullExpr->test = WfTypeTesting::IsNull; testNullExpr->expression = refFailure; auto ifStat = Ptr(new WfIfStatement); *nullFalseBlock = ifStat; ifStat->expression = testNullExpr; ifStat->trueBranch = exTrueBlock; exTrueBlock->statements.Add(GenerateSetCoStateBeforePauseToInvalid()); ifStat->falseBranch = exFalseBlock; } { ///////////////////////////////////////////////////////////////////////////// // Handle exception from ///////////////////////////////////////////////////////////////////////////// Ptr firstIfStatement; Ptr* currentIfVar = &firstIfStatement; using GroupPair = Pair>; auto nodeByCatches = From(nodeOrders) .GroupBy([](FlowChartNode* node) { return node->exceptionDestination; }) .OrderByKey([&](const GroupPair& p) { return nodeOrders.IndexOf(p.key); }); for (auto group : nodeByCatches) { auto catchNode = group.key; if (!catchNode) continue; Ptr condition; { List> conditionRanges; for (auto flowChartNode : group.value) { vint state = nodeOrders.IndexOf(flowChartNode); if (conditionRanges.Count() == 0) { conditionRanges.Add({ state,state }); } else if (conditionRanges[conditionRanges.Count() - 1].get<1>() == state - 1) { conditionRanges[conditionRanges.Count() - 1].get<1>() = state; } else { conditionRanges.Add({ state,state }); } } for (vint i = 0; i < conditionRanges.Count(); i++) { auto range = conditionRanges[i]; Ptr singleCondition; if (range.get<0>() == range.get<1>()) { auto refState = Ptr(new WfReferenceExpression); refState->name.value = L""; auto intState = Ptr(new WfIntegerExpression); intState->value.value = itow(range.get<0>()); auto compExpr = Ptr(new WfBinaryExpression); compExpr->op = WfBinaryOperator::EQ; compExpr->first = refState; compExpr->second = intState; singleCondition = compExpr; } else { auto refState = Ptr(new WfReferenceExpression); refState->name.value = L""; auto intState1 = Ptr(new WfIntegerExpression); intState1->value.value = itow(range.get<0>()); auto intState2 = Ptr(new WfIntegerExpression); intState2->value.value = itow(range.get<1>()); auto rangeExpr = Ptr(new WfRangeExpression); rangeExpr->begin = intState1; rangeExpr->beginBoundary = WfRangeBoundary::Inclusive; rangeExpr->end = intState2; rangeExpr->endBoundary = WfRangeBoundary::Inclusive; auto compExpr = Ptr(new WfSetTestingExpression); compExpr->test = WfSetTesting::In; compExpr->element = refState; compExpr->collection = rangeExpr; singleCondition = compExpr; } if (condition) { auto orExpr = Ptr(new WfBinaryExpression); orExpr->op = WfBinaryOperator::Or; orExpr->first = condition; orExpr->second = singleCondition; condition = orExpr; } else { condition = singleCondition; } } } auto ifStat = Ptr(new WfIfStatement); *currentIfVar = ifStat; currentIfVar = &ifStat->falseBranch; ifStat->expression = condition; auto catchBlock = Ptr(new WfBlockStatement); ifStat->trueBranch = catchBlock; catchBlock->statements.Add(GenerateSetCoStateBeforePauseToInvalid()); { auto refTarget = Ptr(new WfReferenceExpression); refTarget->name.value = referenceRenaming[catchNode->exceptionVariable]; auto refOutput = Ptr(new WfReferenceExpression); refOutput->name.value = coResultName; auto refFailure = Ptr(new WfMemberExpression); refFailure->parent = refOutput; refFailure->name.value = L"Failure"; auto assignExpr = Ptr(new WfBinaryExpression); assignExpr->op = WfBinaryOperator::Assign; assignExpr->first = refTarget; assignExpr->second = refFailure; auto stat = Ptr(new WfExpressionStatement); stat->expression = assignExpr; catchBlock->statements.Add(stat); } catchBlock->statements.Add(GenerateSetCoState(nodeOrders, catchNode)); } { auto block = Ptr(new WfBlockStatement); *currentIfVar = block; block->statements.Add(GenerateSetCoStateBeforePauseToInvalid()); { auto refOutput = Ptr(new WfReferenceExpression); refOutput->name.value = coResultName; auto refFailure = Ptr(new WfMemberExpression); refFailure->parent = refOutput; refFailure->name.value = L"Failure"; auto raiseStat = Ptr(new WfRaiseExceptionStatement); raiseStat->expression = refFailure; block->statements.Add(raiseStat); } } exFalseBlock->statements.Add(firstIfStatement); } } } { ///////////////////////////////////////////////////////////////////////////// // while (true) { ... } ///////////////////////////////////////////////////////////////////////////// auto whileStat = Ptr(new WfWhileStatement); { auto trueExpr = Ptr(new WfLiteralExpression); trueExpr->value = WfLiteralValue::True; whileStat->condition = trueExpr; } auto whileBlock = Ptr(new WfBlockStatement); whileStat->statement = whileBlock; using GroupPair = Pair>; auto nodeByCatches = From(nodeOrders) .GroupBy([](FlowChartNode* node) { return node->exceptionDestination; }) .OrderByKey([&](const GroupPair& p) { return nodeOrders.IndexOf(p.key); }); for (auto group : nodeByCatches) { auto catchNode = group.key; auto groupBlock = whileBlock; if (catchNode) { groupBlock = ExpandExceptionDestination(catchNode, referenceRenaming, nodeOrders, whileBlock); } for (auto flowChartNode : group.value) { ///////////////////////////////////////////////////////////////////////////// // if ( == THE_CURRENT_STATE) { ... } ///////////////////////////////////////////////////////////////////////////// auto ifStat = Ptr(new WfIfStatement); groupBlock->statements.Add(ifStat); { auto refState = Ptr(new WfReferenceExpression); refState->name.value = L""; auto intState = Ptr(new WfIntegerExpression); intState->value.value = itow(nodeOrders.IndexOf(flowChartNode)); auto compExpr = Ptr(new WfBinaryExpression); compExpr->op = WfBinaryOperator::EQ; compExpr->first = refState; compExpr->second = intState; ifStat->expression = compExpr; } auto stateBlock = Ptr(new WfBlockStatement); ifStat->trueBranch = stateBlock; { ExpandFlowChartNode(flowChart, flowChartNode, referenceRenaming, nodeOrders, catchNode, stateBlock); } } } tryBlock->statements.Add(whileStat); } ///////////////////////////////////////////////////////////////////////////// // catch() // { // SetFailure(); // SetStatus(Stopped); // if () raise ; // } ///////////////////////////////////////////////////////////////////////////// tryStat->name.value = L""; auto catchBlock = Ptr(new WfBlockStatement); tryStat->catchStatement = catchBlock; { auto refExpr = Ptr(new WfReferenceExpression); refExpr->name.value = L""; auto funcExpr = Ptr(new WfReferenceExpression); funcExpr->name.value = L"SetFailure"; auto callExpr = Ptr(new WfCallExpression); callExpr->function = funcExpr; callExpr->arguments.Add(refExpr); auto stat = Ptr(new WfExpressionStatement); stat->expression = callExpr; catchBlock->statements.Add(stat); } catchBlock->statements.Add(GenerateSetStatus(L"Stopped")); { auto refExpr = Ptr(new WfReferenceExpression); refExpr->name.value = L""; auto ifStat = Ptr(new WfIfStatement); ifStat->expression = refExpr; auto trueBlock = Ptr(new WfBlockStatement); ifStat->trueBranch = trueBlock; { auto raiseStat = Ptr(new WfRaiseExceptionStatement); trueBlock->statements.Add(raiseStat); } catchBlock->statements.Add(ifStat); } block->statements.Add(tryStat); } } } /*********************************************************************** ExpandNewCoroutineExpression ***********************************************************************/ void ExpandCoOperatorExpression(WfLexicalScopeManager* manager, WfCoOperatorExpression* node) { auto scope = manager->nodeScopes[node].Obj(); auto functionScope = scope->FindFunctionScope(); auto newCoExpr = functionScope->ownerNode.Cast(); auto providerType = manager->coNewCoroutineResolvings[newCoExpr.Obj()].type; auto refProvider = GetExpressionFromTypeDescriptor(providerType->GetTypeDescriptor()); auto refQueryContext = Ptr(new WfChildExpression); refQueryContext->parent = refProvider; refQueryContext->name.value = L"QueryContext"; auto refImpl = Ptr(new WfReferenceExpression); refImpl->name.value = L""; auto refCall = Ptr(new WfCallExpression); refCall->function = refQueryContext; refCall->arguments.Add(refImpl); auto refOperator = Ptr(new WfMemberExpression); refOperator->parent = refCall; refOperator->name.value = node->name.value; node->expandedExpression = refOperator; } } } } /*********************************************************************** .\ANALYZER\WFANALYZER_EXPANDSTATEMACHINE.CPP ***********************************************************************/ namespace vl { namespace workflow { namespace analyzer { using namespace collections; using namespace reflection; using namespace reflection::description; /*********************************************************************** ExpandStateMachineStatementVisitor ***********************************************************************/ Ptr GenerateStateMachineInvalidId() { auto refOne = Ptr(new WfIntegerExpression); refOne->value.value = L"1"; auto refInvalid = Ptr(new WfUnaryExpression); refInvalid->op = WfUnaryOperator::Negative; refInvalid->operand = refOne; return refInvalid; } class ExpandStateMachineStatementVisitor : public copy_visitor::AstVisitor { protected: WfLexicalScopeManager* manager; WfStateMachineInfo* smInfo; public: ExpandStateMachineStatementVisitor(WfLexicalScopeManager* _manager, WfStateMachineInfo* _smInfo) :manager(_manager) , smInfo(_smInfo) { } using copy_visitor::AstVisitor::CopyNode; vl::Ptr CopyNode(WfExpression* node)override { return CopyExpression(node, true); } void Visit(WfCoroutineStatement* node)override { CHECK_FAIL(L"ExpandStateMachineStatementVisitor::Dispatch(WfCoroutineStatement*)#ValidateStatementStructure should check coroutine statement's location."); } Ptr GenerateIngoreInputStatement() { auto refThis = Ptr(new WfReferenceExpression); refThis->name.value = L"stateMachineObject"; auto refInput = Ptr(new WfMemberExpression); refInput->parent = refThis; refInput->name.value = L"stateMachineInput"; auto assignExpr = Ptr(new WfBinaryExpression); assignExpr->op = WfBinaryOperator::Assign; assignExpr->first = refInput; assignExpr->second = GenerateStateMachineInvalidId(); auto exprStat = Ptr(new WfExpressionStatement); exprStat->expression = assignExpr; return exprStat; } void GenerateStateSwitchCase(const WString& inputName, WfLexicalScope* smcScope, Ptr switchStat, Ptr& input, Ptr& caseBlock) { input = From(smcScope->symbols[inputName]) .Select([=](Ptr symbol) { return symbol->creatorNode.Cast(); }) .Where([=](Ptr decl) { return decl != nullptr; }) .First(); auto switchCase = Ptr(new WfSwitchCase); switchStat->caseBranches.Add(switchCase); { auto refInputId = Ptr(new WfIntegerExpression); refInputId->value.value = itow(smInfo->inputIds[inputName]); switchCase->expression = refInputId; } caseBlock = Ptr(new WfBlockStatement); switchCase->statement = caseBlock; caseBlock->statements.Add(GenerateIngoreInputStatement()); } void Visit(WfStateSwitchStatement* node)override { auto smcScope = manager->nodeScopes[node]->FindFunctionScope()->parentScope.Obj(); auto block = Ptr(new WfBlockStatement); { auto refThis = Ptr(new WfReferenceExpression); refThis->name.value = L"stateMachineObject"; auto refInput = Ptr(new WfMemberExpression); refInput->parent = refThis; refInput->name.value = L"stateMachineInput"; auto compareInput = Ptr(new WfBinaryExpression); compareInput->op = WfBinaryOperator::EQ; compareInput->first = refInput; compareInput->second = GenerateStateMachineInvalidId(); auto ifStat = Ptr(new WfIfStatement); block->statements.Add(ifStat); ifStat->expression = compareInput; auto trueBlock = Ptr(new WfBlockStatement); ifStat->trueBranch = trueBlock; trueBlock->statements.Add(Ptr(new WfCoPauseStatement)); } auto switchStat = Ptr(new WfSwitchStatement); { auto refThis = Ptr(new WfReferenceExpression); refThis->name.value = L"stateMachineObject"; auto refInput = Ptr(new WfMemberExpression); refInput->parent = refThis; refInput->name.value = L"stateMachineInput"; switchStat->expression = refInput; } block->statements.Add(switchStat); for (auto stateSwitchCase : node->caseBranches) { Ptr input; Ptr caseBlock; GenerateStateSwitchCase(stateSwitchCase->name.value, smcScope, switchStat, input, caseBlock); for (auto [argument, index] : indexed(stateSwitchCase->arguments)) { auto refThis = Ptr(new WfReferenceExpression); refThis->name.value = L"stateMachineObject"; auto refArgument = Ptr(new WfMemberExpression); refArgument->parent = refThis; refArgument->name.value = manager->stateInputArguments[input->arguments[index].Obj()]->GetName(); auto varDecl = Ptr(new WfVariableDeclaration); varDecl->name.value = argument->name.value; varDecl->expression = refArgument; auto varStat = Ptr(new WfVariableStatement); varStat->variable = varDecl; caseBlock->statements.Add(varStat); } caseBlock->statements.Add(CopyNode(stateSwitchCase->statement.Obj())); SetCodeRange(Ptr(caseBlock), stateSwitchCase->codeRange); } if (node->type == WfStateSwitchType::Default) { auto invalidInputs= From(smInfo->inputIds.Keys()) .Except( From(node->caseBranches) .Select([](Ptr switchCase) {return switchCase->name.value; }) ); for (auto inputName : invalidInputs) { Ptr input; Ptr caseBlock; GenerateStateSwitchCase(inputName, smcScope, switchStat, input, caseBlock); { auto refException = Ptr(new WfStringExpression); refException->value.value = L"Method \"" + inputName + L"\" of class \"" + manager->stateInputMethods[input.Obj()]->GetOwnerTypeDescriptor()->GetTypeName() + L"\" cannot be called at this moment."; auto raiseStat = Ptr(new WfRaiseExceptionStatement); raiseStat->expression = refException; caseBlock->statements.Add(raiseStat); } } } auto defaultBlock = Ptr(new WfBlockStatement); switch (node->type) { case WfStateSwitchType::Default: case WfStateSwitchType::Pass: break; case WfStateSwitchType::PassAndReturn: { auto gotoStat = Ptr(new WfGotoStatement); gotoStat->label.value = L"OUT_OF_STATE_MACHINE"; defaultBlock->statements.Add(gotoStat); } break; case WfStateSwitchType::Ignore: { defaultBlock->statements.Add(GenerateIngoreInputStatement()); } break; case WfStateSwitchType::IgnoreAndReturn: { defaultBlock->statements.Add(GenerateIngoreInputStatement()); auto gotoStat = Ptr(new WfGotoStatement); gotoStat->label.value = L"OUT_OF_STATE_MACHINE"; defaultBlock->statements.Add(gotoStat); } break; default:; } if (defaultBlock->statements.Count() > 0) { switchStat->defaultBranch = defaultBlock; } SetCodeRange(Ptr(block), node->codeRange); result = block; } void Visit(WfStateInvokeStatement* node)override { auto smcScope = manager->nodeScopes[node]->FindFunctionScope()->parentScope.Obj(); auto stateDecl = From(smcScope->symbols[node->name.value]) .Select([=](Ptr symbol) { return symbol->creatorNode.Cast(); }) .Where([=](Ptr decl) { return decl != nullptr; }) .First(); auto block = Ptr(new WfBlockStatement); for (auto [argument, index] : indexed(stateDecl->arguments)) { auto refThis = Ptr(new WfReferenceExpression); refThis->name.value = L"stateMachineObject"; auto refArgument = Ptr(new WfMemberExpression); refArgument->parent = refThis; refArgument->name.value = manager->stateDeclArguments[argument.Obj()]->GetName(); auto assignExpr = Ptr(new WfBinaryExpression); assignExpr->op = WfBinaryOperator::Assign; assignExpr->first = refArgument; assignExpr->second = CopyNode(node->arguments[index].Obj()); auto exprStat = Ptr(new WfExpressionStatement); exprStat->expression = assignExpr; block->statements.Add(exprStat); } switch (node->type) { case WfStateInvokeType::Goto: { { auto refState = Ptr(new WfReferenceExpression); refState->name.value = L"state"; auto refStateId = Ptr(new WfIntegerExpression); refStateId->value.value = itow(smInfo->stateIds[node->name.value]); auto assignExpr = Ptr(new WfBinaryExpression); assignExpr->op = WfBinaryOperator::Assign; assignExpr->first = refState; assignExpr->second = refStateId; auto exprStat = Ptr(new WfExpressionStatement); exprStat->expression = assignExpr; block->statements.Add(exprStat); } { auto gotoStat = Ptr(new WfGotoStatement); gotoStat->label.value = L"OUT_OF_CURRENT_STATE"; block->statements.Add(gotoStat); } } break; case WfStateInvokeType::Push: { { auto refThis = Ptr(new WfReferenceExpression); refThis->name.value = L"stateMachineObject"; auto refCoroutine = Ptr(new WfMemberExpression); refCoroutine->parent = refThis; refCoroutine->name.value = L"CreateCoroutine"; auto refStateId = Ptr(new WfIntegerExpression); refStateId->value.value = itow(smInfo->stateIds[node->name.value]); auto callExpr = Ptr(new WfCallExpression); callExpr->function = refCoroutine; callExpr->arguments.Add(refStateId); auto exprStat = Ptr(new WfExpressionStatement); exprStat->expression = callExpr; block->statements.Add(exprStat); } { block->statements.Add(Ptr(new WfCoPauseStatement)); } } break; default:; } SetCodeRange(Ptr(block), node->codeRange); result = block; } }; /*********************************************************************** ExpandStateMachine ***********************************************************************/ void ExpandStateMachine(WfLexicalScopeManager* manager, WfStateMachineDeclaration* node) { auto& smInfo = manager->stateMachineInfos[node]; for (auto input : node->inputs) { smInfo->inputIds.Add(input->name.value, smInfo->inputIds.Count()); for (auto argument : input->arguments) { // var NAME = ; auto fieldInfo = manager->stateInputArguments[argument.Obj()]; auto varDecl = Ptr(new WfVariableDeclaration); varDecl->name.value = fieldInfo->GetName(); varDecl->type = GetTypeFromTypeInfo(fieldInfo->GetReturn()); varDecl->expression = CreateDefaultValue(fieldInfo->GetReturn()); auto att = Ptr(new WfAttribute); att->category.value = L"cpp"; att->name.value = L"Private"; varDecl->attributes.Add(att); node->expandedDeclarations.Add(varDecl); manager->declarationMemberInfos.Add(varDecl, fieldInfo); } } smInfo->stateIds.Add(L"", 0); for (auto state : node->states) { if (state->name.value != L"") { smInfo->stateIds.Add(state->name.value, smInfo->stateIds.Count()); } for (auto argument : state->arguments) { // var NAME = ; auto fieldInfo = manager->stateDeclArguments[argument.Obj()]; auto varDecl = Ptr(new WfVariableDeclaration); varDecl->name.value = fieldInfo->GetName(); varDecl->type = GetTypeFromTypeInfo(fieldInfo->GetReturn()); varDecl->expression = CreateDefaultValue(fieldInfo->GetReturn()); auto att = Ptr(new WfAttribute); att->category.value = L"cpp"; att->name.value = L"Private"; varDecl->attributes.Add(att); node->expandedDeclarations.Add(varDecl); manager->declarationMemberInfos.Add(varDecl, fieldInfo); } } for (auto input : node->inputs) { auto methodInfo = manager->stateInputMethods[input.Obj()]; // func INPUT(ARGUMENTS ...): void auto funcDecl = Ptr(new WfFunctionDeclaration); funcDecl->functionKind = WfFunctionKind::Normal; funcDecl->anonymity = WfFunctionAnonymity::Named; funcDecl->name.value = methodInfo->GetName(); funcDecl->returnType = GetTypeFromTypeInfo(methodInfo->GetReturn()); for (auto [argument, index] : indexed(input->arguments)) { auto funcArgument = Ptr(new WfFunctionArgument); funcArgument->name.value = argument->name.value; funcArgument->type = GetTypeFromTypeInfo(methodInfo->GetParameter(index)->GetType()); funcDecl->arguments.Add(funcArgument); } node->expandedDeclarations.Add(funcDecl); manager->declarationMemberInfos.Add(funcDecl, methodInfo); auto block = Ptr(new WfBlockStatement); funcDecl->statement = block; { // if (not this.stateMachineInitialized) auto trueBlock = Ptr(new WfBlockStatement); { auto refInit = Ptr(new WfMemberExpression); refInit->parent = Ptr(new WfThisExpression); refInit->name.value = L"stateMachineInitialized"; auto notExpr = Ptr(new WfUnaryExpression); notExpr->op = WfUnaryOperator::Not; notExpr->operand = refInit; auto ifStat = Ptr(new WfIfStatement); ifStat->expression = notExpr; ifStat->trueBranch = trueBlock; block->statements.Add(ifStat); } { // this.stateMachineInitialized = true; auto refInit = Ptr(new WfMemberExpression); refInit->parent = Ptr(new WfThisExpression); refInit->name.value = L"stateMachineInitialized"; auto refTrue = Ptr(new WfLiteralExpression); refTrue->value = WfLiteralValue::True; auto assignExpr = Ptr(new WfBinaryExpression); assignExpr->op = WfBinaryOperator::Assign; assignExpr->first = refInit; assignExpr->second = refTrue; auto exprStat = Ptr(new WfExpressionStatement); exprStat->expression = assignExpr; trueBlock->statements.Add(exprStat); } { // this.CreateCoroutine(0); auto refCC = Ptr(new WfMemberExpression); refCC->parent = Ptr(new WfThisExpression); refCC->name.value = smInfo->createCoroutineMethod->GetName(); auto refZero = Ptr(new WfIntegerExpression); refZero->value.value = L"0"; auto callExpr = Ptr(new WfCallExpression); callExpr->function = refCC; callExpr->arguments.Add(refZero); auto exprStat = Ptr(new WfExpressionStatement); exprStat->expression = callExpr; trueBlock->statements.Add(exprStat); } { // this.ResumeStateMachine(); auto refResume = Ptr(new WfMemberExpression); refResume->parent = Ptr(new WfThisExpression); refResume->name.value = L"ResumeStateMachine"; auto callExpr = Ptr(new WfCallExpression); callExpr->function = refResume; auto exprStat = Ptr(new WfExpressionStatement); exprStat->expression = callExpr; trueBlock->statements.Add(exprStat); } } { // this.stateMachineInput = auto refInput = Ptr(new WfMemberExpression); refInput->parent = Ptr(new WfThisExpression); refInput->name.value = L"stateMachineInput"; auto refInputId = Ptr(new WfIntegerExpression); refInputId->value.value = itow(smInfo->inputIds[input->name.value]); auto assignExpr = Ptr(new WfBinaryExpression); assignExpr->op = WfBinaryOperator::Assign; assignExpr->first = refInput; assignExpr->second = refInputId; auto exprStat = Ptr(new WfExpressionStatement); exprStat->expression = assignExpr; block->statements.Add(exprStat); } for (auto [argument, index] : indexed(input->arguments)) { // this.NAME = NAME; auto refField = Ptr(new WfMemberExpression); refField->parent = Ptr(new WfThisExpression); refField->name.value = manager->stateInputArguments[argument.Obj()]->GetName(); auto refArgument = Ptr(new WfReferenceExpression); refArgument->name.value = methodInfo->GetParameter(index)->GetName(); auto assignExpr = Ptr(new WfBinaryExpression); assignExpr->op = WfBinaryOperator::Assign; assignExpr->first = refField; assignExpr->second = refArgument; auto exprStat = Ptr(new WfExpressionStatement); exprStat->expression = assignExpr; block->statements.Add(exprStat); } { // this.ResumeStateMachine(); auto refResume = Ptr(new WfMemberExpression); refResume->parent = Ptr(new WfThisExpression); refResume->name.value = L"ResumeStateMachine"; auto callExpr = Ptr(new WfCallExpression); callExpr->function = refResume; auto exprStat = Ptr(new WfExpressionStatement); exprStat->expression = callExpr; block->statements.Add(exprStat); } } { // func CreateCoroutine(startState: int): void auto funcDecl = Ptr(new WfFunctionDeclaration); funcDecl->functionKind = WfFunctionKind::Normal; funcDecl->anonymity = WfFunctionAnonymity::Named; funcDecl->name.value = smInfo->createCoroutineMethod->GetName(); funcDecl->returnType = GetTypeFromTypeInfo(TypeInfoRetriver::CreateTypeInfo().Obj()); { auto parameterInfo = smInfo->createCoroutineMethod->GetParameter(0); auto funcArgument = Ptr(new WfFunctionArgument); funcArgument->name.value = parameterInfo->GetName(); funcArgument->type = GetTypeFromTypeInfo(parameterInfo->GetType()); funcDecl->arguments.Add(funcArgument); } auto att = Ptr(new WfAttribute); att->category.value = L"cpp"; att->name.value = L"Private"; funcDecl->attributes.Add(att); node->expandedDeclarations.Add(funcDecl); manager->declarationMemberInfos.Add(funcDecl, smInfo->createCoroutineMethod); auto block = Ptr(new WfBlockStatement); funcDecl->statement = block; { // stateMachineObject = this; auto varDecl = Ptr(new WfVariableDeclaration); varDecl->name.value = L"stateMachineObject"; varDecl->expression = Ptr(new WfThisExpression); auto stat = Ptr(new WfVariableStatement); stat->variable = varDecl; block->statements.Add(stat); } { // previousCoroutine = stateMachineCoroutine; auto refThis = Ptr(new WfReferenceExpression); refThis->name.value = L"stateMachineObject"; auto refCoroutine = Ptr(new WfMemberExpression); refCoroutine->parent = refThis; refCoroutine->name.value = L"stateMachineCoroutine"; auto varDecl = Ptr(new WfVariableDeclaration); varDecl->name.value = L"previousCoroutine"; varDecl->expression = refCoroutine; auto stat = Ptr(new WfVariableStatement); stat->variable = varDecl; block->statements.Add(stat); } { // stateMachineCoroutine = $coroutine{ ... } auto refThis = Ptr(new WfReferenceExpression); refThis->name.value = L"stateMachineObject"; auto refCoroutine = Ptr(new WfMemberExpression); refCoroutine->parent = refThis; refCoroutine->name.value = L"stateMachineCoroutine"; auto coroutine = Ptr(new WfNewCoroutineExpression); auto coroutineBlock = Ptr(new WfBlockStatement); coroutine->statement = coroutineBlock; auto assignExpr = Ptr(new WfBinaryExpression); assignExpr->op = WfBinaryOperator::Assign; assignExpr->first = refCoroutine; assignExpr->second = coroutine; auto exprStat = Ptr(new WfExpressionStatement); exprStat->expression = assignExpr; block->statements.Add(exprStat); { auto tryStat = Ptr(new WfTryStatement); coroutineBlock->statements.Add(tryStat); auto tryBlock = Ptr(new WfBlockStatement); tryBlock->endLabel.value = L"OUT_OF_STATE_MACHINE"; tryStat->protectedStatement = tryBlock; auto finallyBlock = Ptr(new WfBlockStatement); tryStat->finallyStatement = finallyBlock; // try {... OUT_OF_STATE_MACHINE:;} { // var State = startState; auto refStartState = Ptr(new WfReferenceExpression); refStartState->name.value = L"startState"; auto varDecl = Ptr(new WfVariableDeclaration); varDecl->name.value = L"state"; varDecl->expression = refStartState; auto stat = Ptr(new WfVariableStatement); stat->variable = varDecl; tryBlock->statements.Add(stat); } { // while(true){... OUT_OF_CURRENT_STATE:;} auto whileBlock = Ptr(new WfBlockStatement); whileBlock->endLabel.value = L"OUT_OF_CURRENT_STATE"; { auto refTrue = Ptr(new WfLiteralExpression); refTrue->value = WfLiteralValue::True; auto whileStat = Ptr(new WfWhileStatement); whileStat->condition = refTrue; whileStat->statement = whileBlock; tryBlock->statements.Add(whileStat); } { // var currentState = state; auto refStartState = Ptr(new WfReferenceExpression); refStartState->name.value = L"state"; auto varDecl = Ptr(new WfVariableDeclaration); varDecl->name.value = L"currentState"; varDecl->expression = refStartState; auto stat = Ptr(new WfVariableStatement); stat->variable = varDecl; whileBlock->statements.Add(stat); } { // state = -1; auto refState = Ptr(new WfReferenceExpression); refState->name.value = L"state"; auto assignExpr = Ptr(new WfBinaryExpression); assignExpr->op = WfBinaryOperator::Assign; assignExpr->first = refState; assignExpr->second = GenerateStateMachineInvalidId(); auto exprStat = Ptr(new WfExpressionStatement); exprStat->expression = assignExpr; whileBlock->statements.Add(exprStat); } { // switch(currentState) { case STATE:{... goto OUT_OF_STATE_MACHINE;} ... } auto refCurrentState = Ptr(new WfReferenceExpression); refCurrentState->name.value = L"currentState"; auto switchStat = Ptr(new WfSwitchStatement); switchStat->expression = refCurrentState; whileBlock->statements.Add(switchStat); for (auto state : node->states) { auto switchCase = Ptr(new WfSwitchCase); switchStat->caseBranches.Add(switchCase); auto refStateId = Ptr(new WfIntegerExpression); refStateId->value.value = itow(smInfo->stateIds[state->name.value]); switchCase->expression = refStateId; auto caseBlock = Ptr(new WfBlockStatement); switchCase->statement = caseBlock; for (auto argument : state->arguments) { auto refThis = Ptr(new WfReferenceExpression); refThis->name.value = L"stateMachineObject"; auto refArgument = Ptr(new WfMemberExpression); refArgument->parent = refThis; refArgument->name.value = manager->stateDeclArguments[argument.Obj()]->GetName(); auto varDecl = Ptr(new WfVariableDeclaration); varDecl->name.value = argument->name.value; varDecl->expression = refArgument; auto varStat = Ptr(new WfVariableStatement); varStat->variable = varDecl; caseBlock->statements.Add(varStat); } caseBlock->statements.Add(ExpandStateMachineStatementVisitor(manager, smInfo.Obj()).CopyNode(state->statement.Obj())); { auto gotoStat = Ptr(new WfGotoStatement); gotoStat->label.value = L"OUT_OF_STATE_MACHINE"; caseBlock->statements.Add(gotoStat); } SetCodeRange(Ptr(caseBlock), state->codeRange); } } } // finally {stateMachineCoroutine = previousCoroutine;} { auto refThis = Ptr(new WfReferenceExpression); refThis->name.value = L"stateMachineObject"; auto refCoroutine = Ptr(new WfMemberExpression); refCoroutine->parent = refThis; refCoroutine->name.value = L"stateMachineCoroutine"; auto refPrevious = Ptr(new WfReferenceExpression); refPrevious->name.value = L"previousCoroutine"; auto assignExpr = Ptr(new WfBinaryExpression); assignExpr->op = WfBinaryOperator::Assign; assignExpr->first = refCoroutine; assignExpr->second = refPrevious; auto exprStat = Ptr(new WfExpressionStatement); exprStat->expression = assignExpr; finallyBlock->statements.Add(exprStat); } } } } } } } } /*********************************************************************** .\ANALYZER\WFANALYZER_EXPANDSTATEMENT.CPP ***********************************************************************/ namespace vl { namespace workflow { namespace analyzer { using namespace collections; using namespace reflection; using namespace reflection::description; /*********************************************************************** ExpandSwitchStatement ***********************************************************************/ void ExpandSwitchStatement(WfLexicalScopeManager* manager, WfSwitchStatement* node) { auto block = Ptr(new WfBlockStatement); node->expandedStatement = block; auto varName = L"" + itow(manager->usedTempVars++); { auto result = manager->expressionResolvings[node->expression.Obj()]; auto decl = Ptr(new WfVariableDeclaration); decl->name.value = varName; decl->type = GetTypeFromTypeInfo(result.type.Obj()); decl->expression = CopyExpression(node->expression, true); auto stat = Ptr(new WfVariableStatement); stat->variable = decl; block->statements.Add(stat); } Ptr rootIfStat; auto tailIfStat = &rootIfStat; for (auto switchCase : node->caseBranches) { auto ifStat = Ptr(new WfIfStatement); *tailIfStat = ifStat; tailIfStat = &ifStat->falseBranch; { auto refExpr = Ptr(new WfReferenceExpression); refExpr->name.value = varName; auto inferExpr = Ptr(new WfInferExpression); inferExpr->expression= CopyExpression(switchCase->expression, true); { auto result = manager->expressionResolvings[switchCase->expression.Obj()]; inferExpr->type = GetTypeFromTypeInfo(result.type.Obj()); } auto compare = Ptr(new WfBinaryExpression); compare->first = refExpr; compare->second = inferExpr; compare->op = WfBinaryOperator::EQ; ifStat->expression = compare; } ifStat->trueBranch = CopyStatement(switchCase->statement, true); } if (node->defaultBranch) { *tailIfStat = CopyStatement(node->defaultBranch, true); } if (rootIfStat) { block->statements.Add(rootIfStat); } } /*********************************************************************** ExpandForEachStatement ***********************************************************************/ Ptr GenerateForEachStepStatement(WfForEachStatement* node) { auto refVar1 = Ptr(new WfReferenceExpression); refVar1->name.value = node->name.value; auto refVar2 = Ptr(new WfReferenceExpression); refVar2->name.value = node->name.value; auto one = Ptr(new WfIntegerExpression); one->value.value = L"1"; auto stepExpr = Ptr(new WfBinaryExpression); stepExpr->first = refVar2; stepExpr->second = one; stepExpr->op = node->direction == WfForEachDirection::Normal ? WfBinaryOperator::Add : WfBinaryOperator::Sub; auto assignExpr = Ptr(new WfBinaryExpression); assignExpr->first = refVar1; assignExpr->second = stepExpr; assignExpr->op = WfBinaryOperator::Assign; auto stat = Ptr(new WfExpressionStatement); stat->expression = assignExpr; return stat; } class CopyForEachRangeBodyVisitor : public CopyWithExpandVirtualVisitor { public: WfLexicalScopeManager* manager; WfForEachStatement* forEach; CopyForEachRangeBodyVisitor(WfLexicalScopeManager* _manager, WfForEachStatement* _forEach) :CopyWithExpandVirtualVisitor(true) , manager(_manager) , forEach(_forEach) { } void Visit(WfContinueStatement* node) { auto scope = manager->nodeScopes[node]; while (scope) { if (scope->ownerNode.Cast()) { break; } else if (scope->ownerNode.Cast()) { if (scope->ownerNode != forEach) { break; } else { auto block = Ptr(new WfBlockStatement); block->statements.Add(GenerateForEachStepStatement(forEach)); block->statements.Add(Ptr(new WfContinueStatement)); SetCodeRange((Ptr)block, node->codeRange); result = block; return; } } scope = scope->parentScope; } copy_visitor::AstVisitor::Visit(node); } }; void ExpandForEachStatement(WfLexicalScopeManager* manager, WfForEachStatement* node) { auto block = Ptr(new WfBlockStatement); node->expandedStatement = block; if (auto range = node->collection.Cast()) { auto varBegin = L"" + node->name.value; auto varEnd = L"" + node->name.value; { auto result = manager->expressionResolvings[range->begin.Obj()]; auto decl = Ptr(new WfVariableDeclaration); decl->name.value = varBegin; decl->type = GetTypeFromTypeInfo(result.type.Obj()); decl->expression = CopyExpression(range->begin, true); if (range->beginBoundary == WfRangeBoundary::Exclusive) { auto one = Ptr(new WfIntegerExpression); one->value.value = L"1"; auto addExpr = Ptr(new WfBinaryExpression); addExpr->first = decl->expression; addExpr->second = one; addExpr->op = WfBinaryOperator::Add; decl->expression = addExpr; } auto stat = Ptr(new WfVariableStatement); stat->variable = decl; block->statements.Add(stat); } { auto result = manager->expressionResolvings[range->end.Obj()]; auto decl = Ptr(new WfVariableDeclaration); decl->name.value = varEnd; decl->type = GetTypeFromTypeInfo(result.type.Obj()); decl->expression = CopyExpression(range->end, true); if (range->endBoundary == WfRangeBoundary::Exclusive) { auto one = Ptr(new WfIntegerExpression); one->value.value = L"1"; auto subExpr = Ptr(new WfBinaryExpression); subExpr->first = decl->expression; subExpr->second = one; subExpr->op = WfBinaryOperator::Sub; decl->expression = subExpr; } auto stat = Ptr(new WfVariableStatement); stat->variable = decl; block->statements.Add(stat); } { auto refBegin = Ptr(new WfReferenceExpression); refBegin->name.value = node->direction == WfForEachDirection::Normal ? varBegin : varEnd; auto decl = Ptr(new WfVariableDeclaration); decl->name.value = node->name.value; decl->expression = refBegin; auto stat = Ptr(new WfVariableStatement); stat->variable = decl; block->statements.Add(stat); } { auto whileStat = Ptr(new WfWhileStatement); { auto refVar = Ptr(new WfReferenceExpression); refVar->name.value = node->name.value; auto refBegin = Ptr(new WfReferenceExpression); refBegin->name.value = node->direction == WfForEachDirection::Normal ? varEnd : varBegin; auto compare = Ptr(new WfBinaryExpression); compare->first = refVar; compare->second = refBegin; compare->op = node->direction == WfForEachDirection::Normal ? WfBinaryOperator::LE : WfBinaryOperator::GE; whileStat->condition = compare; } { auto whileBlock = Ptr(new WfBlockStatement); whileStat->statement = whileBlock; { CopyForEachRangeBodyVisitor visitor(manager, node); whileBlock->statements.Add(visitor.CopyNode(node->statement.Obj())); } whileBlock->statements.Add(GenerateForEachStepStatement(node)); } block->statements.Add(whileStat); } } else { auto varEnum = L"" + node->name.value; auto varIter = L"" + node->name.value; { auto decl = Ptr(new WfVariableDeclaration); decl->name.value = varEnum; if (node->direction == WfForEachDirection::Normal) { auto inferExpr = Ptr(new WfInferExpression); inferExpr->expression = CopyExpression(node->collection, true); inferExpr->type = GetTypeFromTypeInfo(TypeInfoRetriver>::CreateTypeInfo().Obj()); decl->expression = inferExpr; } else { auto refMethod = Ptr(new WfChildExpression); refMethod->parent = GetExpressionFromTypeDescriptor(description::GetTypeDescriptor()); refMethod->name.value = L"ReverseEnumerable"; auto refCall = Ptr(new WfCallExpression); refCall->function = refMethod; refCall->arguments.Add(CopyExpression(node->collection, true)); decl->expression = refCall; } auto stat = Ptr(new WfVariableStatement); stat->variable = decl; block->statements.Add(stat); } { auto refEnum = Ptr(new WfReferenceExpression); refEnum->name.value = varEnum; auto refMethod = Ptr(new WfMemberExpression); refMethod->parent = refEnum; refMethod->name.value = L"CreateEnumerator"; auto callExpr = Ptr(new WfCallExpression); callExpr->function = refMethod; auto decl = Ptr(new WfVariableDeclaration); decl->name.value = varIter; decl->expression = callExpr; auto stat = Ptr(new WfVariableStatement); stat->variable = decl; block->statements.Add(stat); } { auto whileStat = Ptr(new WfWhileStatement); { auto refIter = Ptr(new WfReferenceExpression); refIter->name.value = varIter; auto refMethod = Ptr(new WfMemberExpression); refMethod->parent = refIter; refMethod->name.value = L"Next"; auto callExpr = Ptr(new WfCallExpression); callExpr->function = refMethod; whileStat->condition = callExpr; } { auto whileBlock = Ptr(new WfBlockStatement); whileStat->statement = whileBlock; { auto refIter = Ptr(new WfReferenceExpression); refIter->name.value = varIter; auto refMethod = Ptr(new WfMemberExpression); refMethod->parent = refIter; refMethod->name.value = L"GetCurrent"; auto callExpr = Ptr(new WfCallExpression); callExpr->function = refMethod; auto castExpr = Ptr(new WfTypeCastingExpression); castExpr->expression = callExpr; castExpr->strategy = WfTypeCastingStrategy::Strong; { auto parentScope = manager->nodeScopes[node]; auto symbol = parentScope->symbols[node->name.value][0]; castExpr->type = GetTypeFromTypeInfo(symbol->typeInfo.Obj()); } auto decl = Ptr(new WfVariableDeclaration); decl->name.value = node->name.value; decl->expression = castExpr; auto stat = Ptr(new WfVariableStatement); stat->variable = decl; whileBlock->statements.Add(stat); } whileBlock->statements.Add(CopyStatement(node->statement, true)); } block->statements.Add(whileStat); } } } /*********************************************************************** ExpandCoProviderStatement ***********************************************************************/ class ExpandCoProviderStatementVisitor : public CopyWithExpandVirtualVisitor { public: WfLexicalScopeManager* manager; ExpandCoProviderStatementVisitor(WfLexicalScopeManager* _manager) :CopyWithExpandVirtualVisitor(true) , manager(_manager) { } void Visit(WfReturnStatement* node)override { auto opInfo = manager->coOperatorResolvings[node].methodInfo; auto block = Ptr(new WfBlockStatement); { auto refImpl = Ptr(new WfReferenceExpression); refImpl->name.value = L""; auto funcExpr = Ptr(new WfChildExpression); funcExpr->parent = GetExpressionFromTypeDescriptor(opInfo->GetOwnerTypeDescriptor()); funcExpr->name.value = opInfo->GetName(); auto callExpr = Ptr(new WfCallExpression); callExpr->function = funcExpr; callExpr->arguments.Add(refImpl); if (node->expression) { auto returnValue = CopyNode(node->expression.Obj()); { auto scope = manager->nodeScopes[node].Obj(); auto functionScope = scope->FindFunctionScope(); if (auto funcDecl = functionScope->ownerNode.Cast()) { auto returnType = CreateTypeInfoFromType(scope, funcDecl->returnType); if (auto group = returnType->GetTypeDescriptor()->GetMethodGroupByName(L"StoreResult", true)) { vint count = group->GetMethodCount(); for (vint i = 0; i < count; i++) { auto method = group->GetMethod(i); if (method->IsStatic() && method->GetParameterCount() == 1) { auto refType = GetExpressionFromTypeDescriptor(returnType->GetTypeDescriptor()); auto refStoreResult = Ptr(new WfChildExpression); refStoreResult->parent = refType; refStoreResult->name.value = L"StoreResult"; auto callExpr = Ptr(new WfCallExpression); callExpr->function = refStoreResult; callExpr->arguments.Add(returnValue); returnValue = callExpr; break; } } } } } callExpr->arguments.Add(returnValue); } auto stat = Ptr(new WfExpressionStatement); stat->expression = callExpr; block->statements.Add(stat); } block->statements.Add(Ptr(new WfReturnStatement)); SetCodeRange(Ptr(block), node->codeRange); result = block; } void Visit(WfCoOperatorStatement* node)override { auto opInfo = manager->coOperatorResolvings[node].methodInfo; auto block = Ptr(new WfBlockStatement); { auto refImpl = Ptr(new WfReferenceExpression); refImpl->name.value = L""; auto funcExpr = Ptr(new WfChildExpression); funcExpr->parent = GetExpressionFromTypeDescriptor(opInfo->GetOwnerTypeDescriptor()); funcExpr->name.value = opInfo->GetName(); auto callExpr = Ptr(new WfCallExpression); callExpr->function = funcExpr; callExpr->arguments.Add(refImpl); for (auto argument : node->arguments) { callExpr->arguments.Add(CopyNode(argument.Obj())); } auto stat = Ptr(new WfExpressionStatement); stat->expression = callExpr; auto pauseBlock = Ptr(new WfBlockStatement); pauseBlock->statements.Add(stat); auto pauseStat = Ptr(new WfCoPauseStatement); pauseStat->statement = pauseBlock; block->statements.Add(pauseStat); } { Ptr ifHasResultStat; if (node->varName.value == L"") { ifHasResultStat = Ptr(new WfIfStatement); { auto refCoResult = Ptr(new WfReferenceExpression); refCoResult->name.value = L""; auto testExpr = Ptr(new WfTypeTestingExpression); testExpr->expression = refCoResult; testExpr->test = WfTypeTesting::IsNotNull; ifHasResultStat->expression = testExpr; } } auto ifStat = Ptr(new WfIfStatement); { auto refCoResult = Ptr(new WfReferenceExpression); refCoResult->name.value = L""; auto refFailure = Ptr(new WfMemberExpression); refFailure->parent = refCoResult; refFailure->name.value = L"Failure"; auto testExpr = Ptr(new WfTypeTestingExpression); testExpr->expression = refFailure; testExpr->test = WfTypeTesting::IsNotNull; ifStat->expression = testExpr; } { auto refCoResult = Ptr(new WfReferenceExpression); refCoResult->name.value = L""; auto refFailure = Ptr(new WfMemberExpression); refFailure->parent = refCoResult; refFailure->name.value = L"Failure"; auto raiseStat = Ptr(new WfRaiseExceptionStatement); raiseStat->expression = refFailure; auto ifBlock = Ptr(new WfBlockStatement); ifBlock->statements.Add(raiseStat); ifStat->trueBranch = ifBlock; } if (ifHasResultStat) { auto ifBlock = Ptr(new WfBlockStatement); ifHasResultStat->trueBranch = ifBlock; ifBlock->statements.Add(ifStat); block->statements.Add(ifHasResultStat); } else { block->statements.Add(ifStat); } } if (node->varName.value != L"") { auto refCoResult = Ptr(new WfReferenceExpression); refCoResult->name.value = L""; auto refResult = Ptr(new WfMemberExpression); refResult->parent = refCoResult; refResult->name.value = L"Result"; auto castResultInfo = manager->coCastResultResolvings[node].methodInfo; auto refCastResult = Ptr(new WfChildExpression); refCastResult->parent = GetExpressionFromTypeDescriptor(castResultInfo->GetOwnerTypeDescriptor()); refCastResult->name.value = L"CastResult"; auto callExpr = Ptr(new WfCallExpression); callExpr->function = refCastResult; callExpr->arguments.Add(refResult); auto varDecl = Ptr(new WfVariableDeclaration); varDecl->name.value = node->varName.value; varDecl->expression = callExpr; auto stat = Ptr(new WfVariableStatement); stat->variable = varDecl; block->statements.Add(stat); } SetCodeRange(Ptr(block), node->codeRange); result = block; } void Visit(WfBlockStatement* node)override { auto block = Ptr(new WfBlockStatement); for (auto statement : node->statements) { statement = SearchUntilNonVirtualStatement(statement); if (auto coOperatorStat = statement.Cast()) { coOperatorStat->Accept(this); CopyFrom(block->statements, result.Cast()->statements, true); } else { block->statements.Add(CopyNode(statement.Obj())); } } SetCodeRange(Ptr(block), node->codeRange); result = block; } }; void ExpandCoProviderStatement(WfLexicalScopeManager* manager, WfCoProviderStatement* node) { auto scope = manager->nodeScopes[node].Obj(); auto functionScope = scope->FindFunctionScope(); auto funcDecl = functionScope->ownerNode.Cast(); auto providerScope = manager->nodeScopes[funcDecl->statement.Obj()]; auto providerType = providerScope->symbols[L"$PROVIDER"][0]->typeInfo; auto implType = providerScope->symbols[L"$IMPL"][0]->typeInfo; auto coroutineExpr = Ptr(new WfNewCoroutineExpression); { coroutineExpr->name.value = L""; coroutineExpr->statement = ExpandCoProviderStatementVisitor(manager).CopyNode(node->statement.Obj()); } manager->coNewCoroutineResolvings.Add(coroutineExpr, ResolveExpressionResult::ReadonlyType(providerType)); auto creatorExpr = Ptr(new WfFunctionExpression); { auto creatorDecl = Ptr(new WfFunctionDeclaration); creatorExpr->function = creatorDecl; creatorDecl->functionKind = WfFunctionKind::Normal; creatorDecl->anonymity = WfFunctionAnonymity::Anonymous; creatorDecl->returnType = GetTypeFromTypeInfo(TypeInfoRetriver>::CreateTypeInfo().Obj()); { auto argument = Ptr(new WfFunctionArgument); creatorDecl->arguments.Add(argument); argument->name.value = L""; argument->type = GetTypeFromTypeInfo(implType.Obj()); } auto block = Ptr(new WfBlockStatement); creatorDecl->statement = block; auto returnStat = Ptr(new WfReturnStatement); returnStat->expression = coroutineExpr; block->statements.Add(returnStat); } auto providerBlock = Ptr(new WfBlockStatement); { auto funcReturnType = CreateTypeInfoFromType(functionScope, funcDecl->returnType); auto creatorInfo = manager->coProviderResolvings[node].methodInfo; auto funcExpr = Ptr(new WfChildExpression); funcExpr->parent = GetExpressionFromTypeDescriptor(creatorInfo->GetOwnerTypeDescriptor()); funcExpr->name.value = creatorInfo->GetName(); auto callExpr = Ptr(new WfCallExpression); callExpr->function = funcExpr; callExpr->arguments.Add(creatorExpr); if (funcReturnType->GetTypeDescriptor() == description::GetTypeDescriptor()) { auto stat = Ptr(new WfExpressionStatement); stat->expression = callExpr; providerBlock->statements.Add(stat); } else { if (IsSameType(funcReturnType.Obj(), creatorInfo->GetReturn())) { auto stat = Ptr(new WfReturnStatement); stat->expression = callExpr; providerBlock->statements.Add(stat); } else if (funcReturnType->GetTypeDescriptor() == creatorInfo->GetReturn()->GetTypeDescriptor()) { auto castExpr = Ptr(new WfTypeCastingExpression); castExpr->strategy = WfTypeCastingStrategy::Strong; castExpr->type = GetTypeFromTypeInfo(funcReturnType.Obj()); castExpr->expression = callExpr; auto stat = Ptr(new WfReturnStatement); stat->expression = castExpr; providerBlock->statements.Add(stat); } else { { auto varDecl = Ptr(new WfVariableDeclaration); varDecl->name.value = L""; varDecl->expression = callExpr; auto stat = Ptr(new WfVariableStatement); stat->variable = varDecl; providerBlock->statements.Add(stat); } { auto refExpr = Ptr(new WfReferenceExpression); refExpr->name.value = L""; auto castExpr = Ptr(new WfMixinCastExpression); castExpr->type = GetTypeFromTypeInfo(funcReturnType.Obj()); castExpr->expression = refExpr; auto stat = Ptr(new WfReturnStatement); stat->expression = castExpr; providerBlock->statements.Add(stat); } } } } node->expandedStatement = providerBlock; } } } } /*********************************************************************** .\ANALYZER\WFANALYZER_MISC.CPP ***********************************************************************/ namespace vl { namespace workflow { namespace analyzer { using namespace collections; using namespace reflection; using namespace reflection::description; /*********************************************************************** IsExpressionDependOnExpectedType(Expression) ***********************************************************************/ class IsExpressionDependOnExpectedTypeVisitor : public empty_visitor::ExpressionVisitor , public empty_visitor::VirtualCseExpressionVisitor { public: WfLexicalScopeManager* manager; bool hasExpectedType; bool result = false; IsExpressionDependOnExpectedTypeVisitor(WfLexicalScopeManager* _manager, bool _hasExpectedType) :manager(_manager) , hasExpectedType(_hasExpectedType) { } void Dispatch(WfVirtualCfeExpression* node)override { node->expandedExpression->Accept(this); } void Dispatch(WfVirtualCseExpression* node)override { node->Accept((WfVirtualCseExpression::IVisitor*)this); } bool Execute(Ptr expression) { result = false; expression->Accept(this); return result; } void Visit(WfReferenceExpression* node)override { auto scope = manager->nodeScopes[node].Obj(); List testResults; manager->ResolveName(scope, node->name.value, testResults); if (testResults.Count() == 0) { result = true; } } void Visit(WfOrderedLambdaExpression* node)override { auto scope = manager->nodeScopes[node].Obj(); result = scope->symbols.Count() > 0; } void Visit(WfLiteralExpression* node)override { if (node->value == WfLiteralValue::Null) { result = true; } } void Visit(WfBinaryExpression* node)override { if (node->op == WfBinaryOperator::FlagOr) { result = Execute(node->first) && Execute(node->second); } } void Visit(WfIfExpression* node)override { result = Execute(node->trueBranch) && Execute(node->falseBranch); } void Visit(WfConstructorExpression* node)override { if (hasExpectedType || node->arguments.Count() == 0) { result = true; } else { vint possibleFieldCount = 0; bool unresolvableField = false; auto scope = manager->nodeScopes[node].Obj(); for (auto argument : node->arguments) { if (argument->value) { if (auto refExpr = argument->key.Cast()) { possibleFieldCount++; List testResults; manager->ResolveName(scope, refExpr->name.value, testResults); if (testResults.Count() == 0) { unresolvableField = true; } } } } result = unresolvableField&&possibleFieldCount == node->arguments.Count(); } } void Visit(WfExpectedTypeCastExpression* node)override { result = true; } }; bool IsExpressionDependOnExpectedType(WfLexicalScopeManager* manager, Ptr expression, bool hasExpectedType) { IsExpressionDependOnExpectedTypeVisitor visitor(manager, hasExpectedType); expression->Accept(&visitor); return visitor.result; } /*********************************************************************** GetExpressionName(Expression) ***********************************************************************/ class GetExpressionNameVisitor : public empty_visitor::ExpressionVisitor , public empty_visitor::VirtualCseExpressionVisitor { public: WString result; void Dispatch(WfVirtualCfeExpression* node)override { node->expandedExpression->Accept(this); } void Dispatch(WfVirtualCseExpression* node)override { node->Accept((WfVirtualCseExpression::IVisitor*)this); } void Visit(WfTopQualifiedExpression* node)override { result = node->name.value; } void Visit(WfReferenceExpression* node)override { result = node->name.value; } void Visit(WfOrderedNameExpression* node)override { result = node->name.value; } void Visit(WfMemberExpression* node)override { result = node->name.value; } void Visit(WfChildExpression* node)override { result = node->name.value; } }; WString GetExpressionName(WfExpression* expression) { GetExpressionNameVisitor visitor; expression->Accept(&visitor); return visitor.result; } WString GetExpressionName(Ptr expression) { return GetExpressionName(expression.Obj()); } } } } /*********************************************************************** .\ANALYZER\WFANALYZER_SEARCHORDEREDNAME.CPP ***********************************************************************/ namespace vl { namespace workflow { namespace analyzer { using namespace collections; /*********************************************************************** SearchOrderedName ***********************************************************************/ class SearchOrderedNameVisitor : public traverse_visitor::AstVisitor { public: WfLexicalScope* scope; SortedList& names; SearchOrderedNameVisitor(WfLexicalScope* _scope, SortedList& _names) :scope(_scope) , names(_names) { } void Traverse(WfOrderedNameExpression* node)override { vint name = wtoi(node->name.value.Sub(1, node->name.value.Length() - 1)); if (!names.Contains(name)) { WfLexicalScope* currentScope = scope; while (currentScope) { if (currentScope->symbols.Keys().Contains(node->name.value)) { return; } currentScope = currentScope->parentScope.Obj(); } names.Add(name); } } void Visit(WfOrderedLambdaExpression* node)override { // names in nested ordered lambda expression is not counted } static void Execute(WfLexicalScope* scope, WfExpression* expression, SortedList& names) { SearchOrderedNameVisitor visitor(scope, names); expression->Accept(&visitor); } }; void SearchOrderedName(WfLexicalScope* scope, WfExpression* expression, collections::SortedList& names) { SearchOrderedNameVisitor::Execute(scope, expression, names); } void SearchOrderedName(WfLexicalScope* scope, Ptr expression, collections::SortedList& names) { SearchOrderedNameVisitor::Execute(scope, expression.Obj(), names); } } } } /*********************************************************************** .\ANALYZER\WFANALYZER_TYPEINFO.CPP ***********************************************************************/ namespace vl { namespace workflow { namespace analyzer { using namespace collections; using namespace reflection; using namespace reflection::description; /*********************************************************************** GetTypeFlag ***********************************************************************/ TypeFlag GetTypeFlag(reflection::description::ITypeDescriptor* typeDescriptor) { if (typeDescriptor == GetTypeDescriptor()) return TypeFlag::Bool; if (typeDescriptor == GetTypeDescriptor()) return TypeFlag::I1; if (typeDescriptor == GetTypeDescriptor()) return TypeFlag::I2; if (typeDescriptor == GetTypeDescriptor()) return TypeFlag::I4; if (typeDescriptor == GetTypeDescriptor()) return TypeFlag::I8; if (typeDescriptor == GetTypeDescriptor()) return TypeFlag::U1; if (typeDescriptor == GetTypeDescriptor()) return TypeFlag::U2; if (typeDescriptor == GetTypeDescriptor()) return TypeFlag::U4; if (typeDescriptor == GetTypeDescriptor()) return TypeFlag::U8; if (typeDescriptor == GetTypeDescriptor()) return TypeFlag::F4; if (typeDescriptor == GetTypeDescriptor()) return TypeFlag::F8; if (typeDescriptor == GetTypeDescriptor()) return TypeFlag::String; switch (typeDescriptor->GetTypeDescriptorFlags()) { case TypeDescriptorFlags::FlagEnum: case TypeDescriptorFlags::NormalEnum: return TypeFlag::Enum; case TypeDescriptorFlags::Struct: return TypeFlag::Struct; default: return TypeFlag::Others; } } TypeFlag GetTypeFlag(reflection::description::ITypeInfo* typeInfo) { ITypeDescriptor* td = typeInfo->GetTypeDescriptor(); return GetTypeFlag(td); } /*********************************************************************** CreateTypeInfoFromTypeFlag ***********************************************************************/ Ptr CreateTypeInfoFromTypeFlag(TypeFlag flag) { switch (flag) { case TypeFlag::Bool: return TypeInfoRetriver::CreateTypeInfo(); case TypeFlag::I1: return TypeInfoRetriver::CreateTypeInfo(); case TypeFlag::I2: return TypeInfoRetriver::CreateTypeInfo(); case TypeFlag::I4: return TypeInfoRetriver::CreateTypeInfo(); case TypeFlag::I8: return TypeInfoRetriver::CreateTypeInfo(); case TypeFlag::U1: return TypeInfoRetriver::CreateTypeInfo(); case TypeFlag::U2: return TypeInfoRetriver::CreateTypeInfo(); case TypeFlag::U4: return TypeInfoRetriver::CreateTypeInfo(); case TypeFlag::U8: return TypeInfoRetriver::CreateTypeInfo(); case TypeFlag::F4: return TypeInfoRetriver::CreateTypeInfo(); case TypeFlag::F8: return TypeInfoRetriver::CreateTypeInfo(); case TypeFlag::String: return TypeInfoRetriver::CreateTypeInfo(); default: return nullptr; } } /*********************************************************************** GetTypeFragments ***********************************************************************/ void GetTypeFragments(reflection::description::ITypeDescriptor* typeDescriptor, collections::List& fragments) { WString name = typeDescriptor->GetTypeName(); const wchar_t* reading = name.Buffer(); while (reading) { const wchar_t* delimiter = wcsstr(reading, L"::"); if (delimiter) { fragments.Add(WString::CopyFrom(reading, vint(delimiter - reading))); reading = delimiter + 2; } else { fragments.Add(reading); break; } } } /*********************************************************************** GetExpressionFromTypeDescriptor ***********************************************************************/ Ptr GetExpressionFromTypeDescriptor(reflection::description::ITypeDescriptor* typeDescriptor) { List fragments; GetTypeFragments(typeDescriptor, fragments); Ptr parentExpr; for (auto fragment : fragments) { if (!parentExpr) { auto expr = Ptr(new WfTopQualifiedExpression); expr->name.value = fragment; parentExpr = expr; } else { auto expr = Ptr(new WfChildExpression); expr->parent = parentExpr; expr->name.value = fragment; parentExpr = expr; } } return parentExpr; } /*********************************************************************** GetTypeFromTypeInfo ***********************************************************************/ Ptr GetTypeFromTypeInfo(reflection::description::ITypeInfo* typeInfo) { switch (typeInfo->GetDecorator()) { case ITypeInfo::RawPtr: { Ptr element = GetTypeFromTypeInfo(typeInfo->GetElementType()); if (element) { auto type = Ptr(new WfRawPointerType); type->element = element; return type; } return 0; } case ITypeInfo::SharedPtr: { if (typeInfo->GetElementType()->GetDecorator() == ITypeInfo::Generic) { return GetTypeFromTypeInfo(typeInfo->GetElementType()); } else { Ptr element = GetTypeFromTypeInfo(typeInfo->GetElementType()); if (element) { auto type = Ptr(new WfSharedPointerType); type->element = element; return type; } return 0; } } case ITypeInfo::Nullable: { Ptr element = GetTypeFromTypeInfo(typeInfo->GetElementType()); if (element) { auto type = Ptr(new WfNullableType); type->element = element; return type; } return 0; } case ITypeInfo::TypeDescriptor: { List fragments; GetTypeFragments(typeInfo->GetTypeDescriptor(), fragments); Ptr parentType; for (auto fragment : fragments) { if (!parentType) { auto type = Ptr(new WfTopQualifiedType); type->name.value = fragment; parentType = type; } else { auto type = Ptr(new WfChildType); type->parent = parentType; type->name.value = fragment; parentType = type; } } return parentType; } case ITypeInfo::Generic: { if (typeInfo->GetElementType()->GetDecorator() == ITypeInfo::TypeDescriptor) { if (typeInfo->GetTypeDescriptor() == GetTypeDescriptor()) { if (typeInfo->GetGenericArgumentCount() == 1) { if (Ptr elementType = GetTypeFromTypeInfo(typeInfo->GetGenericArgument(0))) { auto type = Ptr(new WfEnumerableType); type->element = elementType; return type; } } } else if (typeInfo->GetTypeDescriptor() == GetTypeDescriptor()) { if (typeInfo->GetGenericArgumentCount() == 1) { if (Ptr valueType = GetTypeFromTypeInfo(typeInfo->GetGenericArgument(0))) { auto type = Ptr(new WfMapType); type->writability = WfMapWritability::Readonly; type->value = valueType; return type; } } } else if (typeInfo->GetTypeDescriptor() == GetTypeDescriptor()) { if (typeInfo->GetGenericArgumentCount() == 1) { if (Ptr valueType = GetTypeFromTypeInfo(typeInfo->GetGenericArgument(0))) { auto type = Ptr(new WfMapType); type->writability = WfMapWritability::Writable; type->value = valueType; return type; } } } else if (typeInfo->GetTypeDescriptor() == GetTypeDescriptor()) { if (typeInfo->GetGenericArgumentCount() == 1) { if (Ptr elementType = GetTypeFromTypeInfo(typeInfo->GetGenericArgument(0))) { auto type = Ptr(new WfObservableListType); type->element = elementType; return type; } } } else if (typeInfo->GetTypeDescriptor() == GetTypeDescriptor()) { if (typeInfo->GetGenericArgumentCount() == 2) { if (Ptr keyType = GetTypeFromTypeInfo(typeInfo->GetGenericArgument(0))) if (Ptr valueType = GetTypeFromTypeInfo(typeInfo->GetGenericArgument(1))) { auto type = Ptr(new WfMapType); type->writability = WfMapWritability::Readonly; type->key = keyType; type->value = valueType; return type; } } } else if (typeInfo->GetTypeDescriptor() == GetTypeDescriptor()) { if (typeInfo->GetGenericArgumentCount() == 2) { if (Ptr keyType = GetTypeFromTypeInfo(typeInfo->GetGenericArgument(0))) if (Ptr valueType = GetTypeFromTypeInfo(typeInfo->GetGenericArgument(1))) { auto type = Ptr(new WfMapType); type->writability = WfMapWritability::Writable; type->key = keyType; type->value = valueType; return type; } } } else if (typeInfo->GetTypeDescriptor() == GetTypeDescriptor()) { if (typeInfo->GetGenericArgumentCount() >= 1) { if (Ptr returnType = GetTypeFromTypeInfo(typeInfo->GetGenericArgument(0))) { auto type = Ptr(new WfFunctionType); type->result = GetTypeFromTypeInfo(typeInfo->GetGenericArgument(0)); for (vint i = 1; i < typeInfo->GetGenericArgumentCount(); i++) { if (Ptr argumentType = GetTypeFromTypeInfo(typeInfo->GetGenericArgument(i))) { type->arguments.Add(argumentType); } else { return 0; } } return type; } } } } return 0; } default: return 0; } } /*********************************************************************** GetScopeNameFromReferenceType ***********************************************************************/ class GetScopeNameFromReferenceTypeVisitor : public Object, public WfType::IVisitor { public: WfLexicalScope* scope; Ptr result; GetScopeNameFromReferenceTypeVisitor(WfLexicalScope* _scope) :scope(_scope) { } Ptr Call(WfType* node) { node->Accept(this); Ptr scopeName = result; result = 0; return scopeName; } void Visit(WfPredefinedType* node)override { WString name; switch (node->name) { case WfPredefinedTypeName::Void: name = L"Void"; break; case WfPredefinedTypeName::Object: name = L"Object"; break; case WfPredefinedTypeName::Interface: name = L"Interface"; break; case WfPredefinedTypeName::Int: #if defined VCZH_64 name = L"Int64"; #else name = L"Int32"; #endif break; case WfPredefinedTypeName::UInt: #if defined VCZH_64 name = L"UInt64"; #else name = L"UInt32"; #endif break; case WfPredefinedTypeName::Float: name = L"Single"; break; case WfPredefinedTypeName::Double: name = L"Double"; break; case WfPredefinedTypeName::String: name = L"String"; break; case WfPredefinedTypeName::Char: name = L"Char"; break; case WfPredefinedTypeName::Bool: name = L"Boolean"; break; default: CHECK_FAIL(L"GetScopeNameFromReferenceTypeVisitor::Visit(WfPredefinedType*)#Internal error, ValidateTypeStructure function should check correctly."); } auto ns = Ptr(new WfTopQualifiedType); ns->name.value = L"system"; auto type = Ptr(new WfChildType); type->parent = ns; type->name.value = name; type->Accept(this); } void Visit(WfTopQualifiedType* node)override { auto manager = scope->FindManager(); if (manager->globalName) { vint index = manager->globalName->children.Keys().IndexOf(node->name.value); if (index != -1) { result = manager->globalName->children.Values()[index]; return; } } manager->errors.Add(WfErrors::TopQualifiedSymbolNotExists(node, node->name.value)); } void Visit(WfReferenceType* node)override { auto manager = scope->FindManager(); List results; manager->ResolveName(scope, node->name.value, results); if (results.Count() > 1) { manager->errors.Add(WfErrors::TooManyTargets(node, results, node->name.value)); } else if (results.Count() == 1) { if (auto scopeName = results[0].scopeName) { result = scopeName; } else { manager->errors.Add(WfErrors::TypeNotExists(node, results[0])); } } else { manager->errors.Add(WfErrors::ReferenceNotExists(node, node->name.value)); } } void Visit(WfRawPointerType* node)override { CHECK_FAIL(L"GetScopeNameFromReferenceTypeVisitor::Visit(WfRawPointerType*)#Internal error, ValidateTypeStructure function should check correctly."); } void Visit(WfSharedPointerType* node)override { CHECK_FAIL(L"GetScopeNameFromReferenceTypeVisitor::Visit(WfSharedPointerType*)#Internal error, ValidateTypeStructure function should check correctly."); } void Visit(WfNullableType* node)override { CHECK_FAIL(L"GetScopeNameFromReferenceTypeVisitor::Visit(WfNullableType*)#Internal error, ValidateTypeStructure function should check correctly."); } void Visit(WfEnumerableType* node)override { CHECK_FAIL(L"GetScopeNameFromReferenceTypeVisitor::Visit(WfEnumerableType*)#Internal error, ValidateTypeStructure function should check correctly."); } void Visit(WfMapType* node)override { CHECK_FAIL(L"GetScopeNameFromReferenceTypeVisitor::Visit(WfMapType*)#Internal error, ValidateTypeStructure function should check correctly."); } void Visit(WfObservableListType* node)override { CHECK_FAIL(L"GetScopeNameFromReferenceTypeVisitor::Visit(WfObservableListType*)#Internal error, ValidateTypeStructure function should check correctly."); } void Visit(WfFunctionType* node)override { CHECK_FAIL(L"GetScopeNameFromReferenceTypeVisitor::Visit(WfFunctionType*)#Internal error, ValidateTypeStructure function should check correctly."); } void Visit(WfChildType* node)override { if (Ptr scopeName = Call(node->parent.Obj())) { vint index = scopeName->children.Keys().IndexOf(node->name.value); if (index != -1) { result = scopeName->children.Values()[index]; return; } scope->FindManager()->errors.Add(WfErrors::ChildSymbolNotExists(node, scopeName, node->name.value)); } } static Ptr Execute(WfLexicalScope* scope, WfType* type) { return GetScopeNameFromReferenceTypeVisitor(scope).Call(type); } }; Ptr GetScopeNameFromReferenceType(WfLexicalScope* scope, Ptr type) { return GetScopeNameFromReferenceTypeVisitor::Execute(scope, type.Obj()); } /*********************************************************************** CreateTypeInfoFromType ***********************************************************************/ class CreateTypeInfoFromTypeVisitor : public Object, public WfType::IVisitor { public: WfLexicalScope* scope; Ptr result; CreateTypeInfoFromTypeVisitor(WfLexicalScope* _scope) :scope(_scope) { } Ptr Call(WfType* node, bool checkTypeForValue) { node->Accept(this); Ptr typeInfo = result; result = 0; if (typeInfo) { auto manager = scope->FindManager(); switch (typeInfo->GetDecorator()) { case ITypeInfo::RawPtr: case ITypeInfo::SharedPtr: switch (typeInfo->GetTypeDescriptor()->GetTypeDescriptorFlags()) { case TypeDescriptorFlags::IDescriptable: case TypeDescriptorFlags::Class: case TypeDescriptorFlags::Interface: break; default: if (typeInfo->GetDecorator() == ITypeInfo::RawPtr) { manager->errors.Add(WfErrors::RawPointerToNonReferenceType(node, typeInfo.Obj())); } else { manager->errors.Add(WfErrors::SharedPointerToNonReferenceType(node, typeInfo.Obj())); } } break; case ITypeInfo::Nullable: switch (typeInfo->GetTypeDescriptor()->GetTypeDescriptorFlags()) { case TypeDescriptorFlags::Primitive: case TypeDescriptorFlags::Struct: case TypeDescriptorFlags::FlagEnum: case TypeDescriptorFlags::NormalEnum: break; default: manager->errors.Add(WfErrors::NullableToNonReferenceType(node, typeInfo.Obj())); } break; case ITypeInfo::TypeDescriptor: if (checkTypeForValue) { switch (typeInfo->GetTypeDescriptor()->GetTypeDescriptorFlags()) { case TypeDescriptorFlags::Object: case TypeDescriptorFlags::Primitive: case TypeDescriptorFlags::Struct: case TypeDescriptorFlags::FlagEnum: case TypeDescriptorFlags::NormalEnum: break; default: manager->errors.Add(WfErrors::TypeNotForValue(node, typeInfo.Obj())); } } break; case ITypeInfo::Generic: if (checkTypeForValue) { manager->errors.Add(WfErrors::TypeNotForValue(node, typeInfo.Obj())); } break; } } return typeInfo; } void VisitReferenceType(WfType* node) { if (auto scopeName = GetScopeNameFromReferenceTypeVisitor::Execute(scope, node)) { if (scopeName->typeDescriptor) { result = Ptr(new TypeDescriptorTypeInfo(scopeName->typeDescriptor, TypeInfoHint::Normal)); } else { scope->FindManager()->errors.Add(WfErrors::TypeNotExists(node, scopeName)); } } } void Visit(WfPredefinedType* node)override { ITypeDescriptor* typeDescriptor = 0; switch (node->name) { case WfPredefinedTypeName::Void: typeDescriptor = description::GetTypeDescriptor(); break; case WfPredefinedTypeName::Object: typeDescriptor = description::GetTypeDescriptor(); break; case WfPredefinedTypeName::Interface: typeDescriptor = description::GetTypeDescriptor(); break; case WfPredefinedTypeName::Int: typeDescriptor = scope->FindManager()->cputdSInt; break; case WfPredefinedTypeName::UInt: typeDescriptor = scope->FindManager()->cputdUInt; break; case WfPredefinedTypeName::Float: typeDescriptor = description::GetTypeDescriptor(); break; case WfPredefinedTypeName::Double: typeDescriptor = description::GetTypeDescriptor(); break; case WfPredefinedTypeName::String: typeDescriptor = description::GetTypeDescriptor(); break; case WfPredefinedTypeName::Char: typeDescriptor = description::GetTypeDescriptor(); break; case WfPredefinedTypeName::Bool: typeDescriptor = description::GetTypeDescriptor(); break; default: CHECK_FAIL(L"CreateTypeInfoFromTypeVisitor::Visit(WfPredefinedType*)#Internal error, ValidateTypeStructure function should check correctly."); } if (typeDescriptor) { result = Ptr(new TypeDescriptorTypeInfo(typeDescriptor, TypeInfoHint::Normal)); } } void Visit(WfTopQualifiedType* node)override { VisitReferenceType(node); } void Visit(WfReferenceType* node)override { VisitReferenceType(node); } void Visit(WfRawPointerType* node)override { if (Ptr element = Call(node->element.Obj(), false)) { result = Ptr(new RawPtrTypeInfo(element)); } } void Visit(WfSharedPointerType* node)override { if (Ptr element = Call(node->element.Obj(), false)) { result = Ptr(new SharedPtrTypeInfo(element)); } } void Visit(WfNullableType* node)override { if (Ptr element = Call(node->element.Obj(), false)) { result = Ptr(new NullableTypeInfo(element)); } } void Visit(WfEnumerableType* node)override { if (Ptr element = Call(node->element.Obj(), true)) { auto enumerableTypeInfo = Ptr(new TypeDescriptorTypeInfo(description::GetTypeDescriptor(), TypeInfoHint::Normal)); auto genericTypeInfo = Ptr(new GenericTypeInfo(enumerableTypeInfo)); genericTypeInfo->AddGenericArgument(element); result = Ptr(new SharedPtrTypeInfo(genericTypeInfo)); } } void Visit(WfMapType* node)override { Ptr key, value; if (!(value = Call(node->value.Obj(), true))) return; if (node->key) { if (!(key = Call(node->key.Obj(), true))) return; } ITypeDescriptor* typeDescriptor = nullptr; if (node->writability == WfMapWritability::Writable) { if (node->key) { typeDescriptor = description::GetTypeDescriptor(); } else { typeDescriptor = description::GetTypeDescriptor(); } } else { if (node->key) { typeDescriptor = description::GetTypeDescriptor(); } else { typeDescriptor = description::GetTypeDescriptor(); } } auto mapTypeInfo = Ptr(new TypeDescriptorTypeInfo(typeDescriptor, TypeInfoHint::Normal)); auto genericTypeInfo = Ptr(new GenericTypeInfo(mapTypeInfo)); if (key) genericTypeInfo->AddGenericArgument(key); genericTypeInfo->AddGenericArgument(value); result = Ptr(new SharedPtrTypeInfo(genericTypeInfo)); } void Visit(WfObservableListType* node)override { Ptr element; if (!(element = Call(node->element.Obj(), true))) return; auto typeDescriptor = description::GetTypeDescriptor(); auto mapTypeInfo = Ptr(new TypeDescriptorTypeInfo(typeDescriptor, TypeInfoHint::Normal)); auto genericTypeInfo = Ptr(new GenericTypeInfo(mapTypeInfo)); genericTypeInfo->AddGenericArgument(element); result = Ptr(new SharedPtrTypeInfo(genericTypeInfo)); } void Visit(WfFunctionType* node)override { if (Ptr returnType = Call(node->result.Obj(), true)) { auto enumerableTypeInfo = Ptr(new TypeDescriptorTypeInfo(description::GetTypeDescriptor(), TypeInfoHint::Normal)); auto genericTypeInfo = Ptr(new GenericTypeInfo(enumerableTypeInfo)); genericTypeInfo->AddGenericArgument(returnType); for (auto argument : node->arguments) { if (Ptr argumentType = Call(argument.Obj(), true)) { genericTypeInfo->AddGenericArgument(argumentType); } else { return; } } result = Ptr(new SharedPtrTypeInfo(genericTypeInfo)); } } void Visit(WfChildType* node)override { VisitReferenceType(node); } static Ptr Execute(WfLexicalScope* scope, WfType* type, bool checkTypeForValue) { return CreateTypeInfoFromTypeVisitor(scope).Call(type, checkTypeForValue); } }; Ptr CreateTypeInfoFromType(WfLexicalScope* scope, Ptr type, bool checkTypeForValue) { return CreateTypeInfoFromTypeVisitor::Execute(scope, type.Obj(), checkTypeForValue); } /*********************************************************************** CreateTypeInfoFromType ***********************************************************************/ Ptr CopyTypeInfoInternal(reflection::description::ITypeInfo* typeInfo) { switch (typeInfo->GetDecorator()) { case ITypeInfo::RawPtr: return Ptr(new RawPtrTypeInfo(CopyTypeInfo(typeInfo->GetElementType()))); case ITypeInfo::SharedPtr: return Ptr(new SharedPtrTypeInfo(CopyTypeInfo(typeInfo->GetElementType()))); case ITypeInfo::Nullable: return Ptr(new NullableTypeInfo(CopyTypeInfo(typeInfo->GetElementType()))); case ITypeInfo::TypeDescriptor: return Ptr(new TypeDescriptorTypeInfo(typeInfo->GetTypeDescriptor(), typeInfo->GetHint())); case ITypeInfo::Generic: { auto impl = Ptr(new GenericTypeInfo(Ptr(typeInfo->GetElementType()))); vint count = typeInfo->GetGenericArgumentCount(); for (vint i = 0; i < count; i++) { impl->AddGenericArgument(CopyTypeInfo(typeInfo->GetGenericArgument(i))); } return impl; } default:; return nullptr; } } Ptr CopyTypeInfo(reflection::description::ITypeInfo* typeInfo) { if (!typeInfo) return nullptr; return CopyTypeInfoInternal(typeInfo); } /*********************************************************************** CanConvertToType ***********************************************************************/ bool CanConvertToType(reflection::description::ITypeInfo* fromType, reflection::description::ITypeInfo* toType, bool explicitly) { ITypeDescriptor* objectType = GetTypeDescriptor(); bool fromObject = fromType->GetDecorator() == ITypeInfo::TypeDescriptor && fromType->GetTypeDescriptor() == objectType; bool toObject = toType->GetDecorator() == ITypeInfo::TypeDescriptor && toType->GetTypeDescriptor() == objectType; if (fromObject && toObject) { return true; } else if (fromObject) { return explicitly; } else if (toObject) { return true; } switch (fromType->GetDecorator()) { case ITypeInfo::RawPtr: switch (toType->GetDecorator()) { case ITypeInfo::RawPtr: return CanConvertToType(fromType->GetElementType(), toType->GetElementType(), explicitly); case ITypeInfo::SharedPtr: return explicitly && CanConvertToType(fromType->GetElementType(), toType->GetElementType(), explicitly); case ITypeInfo::Nullable: case ITypeInfo::TypeDescriptor: case ITypeInfo::Generic: return false; } break; case ITypeInfo::SharedPtr: switch (toType->GetDecorator()) { case ITypeInfo::RawPtr: return explicitly && CanConvertToType(fromType->GetElementType(), toType->GetElementType(), explicitly); case ITypeInfo::SharedPtr: return CanConvertToType(fromType->GetElementType(), toType->GetElementType(), explicitly); case ITypeInfo::Nullable: case ITypeInfo::TypeDescriptor: case ITypeInfo::Generic: return false; } break; case ITypeInfo::Nullable: switch (toType->GetDecorator()) { case ITypeInfo::RawPtr: case ITypeInfo::SharedPtr: return false; case ITypeInfo::Nullable: return CanConvertToType(fromType->GetElementType(), toType->GetElementType(), explicitly); case ITypeInfo::TypeDescriptor: return explicitly && CanConvertToType(fromType->GetElementType(), toType, explicitly); case ITypeInfo::Generic: return false; } break; case ITypeInfo::TypeDescriptor: switch (toType->GetDecorator()) { case ITypeInfo::RawPtr: case ITypeInfo::SharedPtr: return false; case ITypeInfo::Nullable: return CanConvertToType(fromType, toType->GetElementType(), explicitly); case ITypeInfo::TypeDescriptor: { ITypeDescriptor* fromTd = fromType->GetTypeDescriptor(); ITypeDescriptor* toTd = toType->GetTypeDescriptor(); bool fromValue = (fromTd->GetTypeDescriptorFlags() & TypeDescriptorFlags::ReferenceType) == TypeDescriptorFlags::Undefined; bool toValue = (toTd->GetTypeDescriptorFlags() & TypeDescriptorFlags::ReferenceType) == TypeDescriptorFlags::Undefined; if (fromValue != toValue) { return false; } if (fromValue) { if (fromTd == toTd) { return true; } else if (fromTd == GetTypeDescriptor()) { return explicitly && toTd->GetSerializableType() != nullptr; } else if (toTd == GetTypeDescriptor()) { return fromTd->GetSerializableType() != nullptr; } TypeFlag fromFlag = GetTypeFlag(fromTd); TypeFlag toFlag = GetTypeFlag(toTd); static vint conversionTable[(vint)TypeFlag::Count][(vint)TypeFlag::Count] = { /*Bool */{1, /**/ 0, 0, 0, 0, /**/ 0, 0, 0, 0, /**/ 0, 0, /**/ 1, 0, 0, 0}, //------------------------------------------------------------------------------- /*I1 */{0, /**/ 1, 1, 1, 1, /**/ 2, 2, 2, 2, /**/ 1, 1, /**/ 1, 0, 0, 0}, /*I2 */{0, /**/ 2, 1, 1, 1, /**/ 2, 2, 2, 2, /**/ 1, 1, /**/ 1, 0, 0, 0}, /*I4 */{0, /**/ 2, 2, 1, 1, /**/ 2, 2, 2, 2, /**/ 2, 1, /**/ 1, 0, 0, 0}, /*I8 */{0, /**/ 2, 2, 2, 1, /**/ 2, 2, 2, 2, /**/ 2, 1, /**/ 1, 0, 0, 0}, //------------------------------------------------------------------------------- /*U1 */{0, /**/ 2, 2, 2, 2, /**/ 1, 1, 1, 1, /**/ 1, 1, /**/ 1, 0, 0, 0}, /*U2 */{0, /**/ 2, 2, 2, 2, /**/ 2, 1, 1, 1, /**/ 1, 1, /**/ 1, 0, 0, 0}, /*U4 */{0, /**/ 2, 2, 2, 2, /**/ 2, 2, 1, 1, /**/ 2, 1, /**/ 1, 0, 0, 0}, /*U8 */{0, /**/ 2, 2, 2, 2, /**/ 2, 2, 2, 1, /**/ 2, 1, /**/ 1, 2, 0, 0}, //------------------------------------------------------------------------------- /*F4 */{0, /**/ 2, 2, 2, 2, /**/ 2, 2, 2, 2, /**/ 1, 1, /**/ 1, 0, 0, 0}, /*F8 */{0, /**/ 2, 2, 2, 2, /**/ 2, 2, 2, 2, /**/ 2, 1, /**/ 1, 0, 0, 0}, //------------------------------------------------------------------------------- /*String */{2, /**/ 2, 2, 2, 2, /**/ 2, 2, 2, 2, /**/ 2, 2, /**/ 1, 0, 0, 0}, /*Enum */{0, /**/ 0, 0, 0, 0, /**/ 0, 0, 0, 2, /**/ 0, 0, /**/ 0, 0, 0, 0}, /*Struct */{0, /**/ 0, 0, 0, 0, /**/ 0, 0, 0, 0, /**/ 0, 0, /**/ 0, 0, 0, 0}, /*Others */{0, /**/ 0, 0, 0, 0, /**/ 0, 0, 0, 0, /**/ 0, 0, /**/ 0, 0, 0, 0}, }; vint conversion = conversionTable[(vint)fromFlag][(vint)toFlag]; return conversion == 1 || (explicitly && conversion == 2); } else { if (fromTd->CanConvertTo(toTd)) { return true; } if (explicitly && toTd->CanConvertTo(fromTd)) { return true; } } } break; case ITypeInfo::Generic: return explicitly && CanConvertToType(fromType, toType->GetElementType(), explicitly); } break; case ITypeInfo::Generic: switch (toType->GetDecorator()) { case ITypeInfo::RawPtr: case ITypeInfo::SharedPtr: case ITypeInfo::Nullable: return false; case ITypeInfo::TypeDescriptor: return CanConvertToType(fromType->GetElementType(), toType, explicitly); case ITypeInfo::Generic: if (explicitly) return true; if (fromType->GetGenericArgumentCount() != toType->GetGenericArgumentCount()) { return false; } if (!CanConvertToType(fromType->GetElementType(), toType->GetElementType(), explicitly)) return false; for (vint i = 0; i < fromType->GetGenericArgumentCount(); i++) { if (!IsSameType(fromType->GetGenericArgument(i), toType->GetGenericArgument(i))) { return false; } } return true; } break; } return false; } /*********************************************************************** IsSameType ***********************************************************************/ bool IsSameType(reflection::description::ITypeInfo* fromType, reflection::description::ITypeInfo* toType) { if (fromType->GetDecorator() != toType->GetDecorator()) { return false; } switch (fromType->GetDecorator()) { case ITypeInfo::RawPtr: case ITypeInfo::SharedPtr: case ITypeInfo::Nullable: return IsSameType(fromType->GetElementType(), toType->GetElementType()); case ITypeInfo::TypeDescriptor: return fromType->GetTypeDescriptor() == toType->GetTypeDescriptor(); case ITypeInfo::Generic: if (fromType->GetGenericArgumentCount() != toType->GetGenericArgumentCount()) { return false; } if (!IsSameType(fromType->GetElementType(), toType->GetElementType())) return false; for (vint i = 0; i < fromType->GetGenericArgumentCount(); i++) { if (!IsSameType(fromType->GetGenericArgument(i), toType->GetGenericArgument(i))) { return false; } } return true; } return false; } /*********************************************************************** GetMergedType ***********************************************************************/ Ptr GetMergedType(Ptr firstType, Ptr secondType) { if (CanConvertToType(secondType.Obj(), firstType.Obj(), false)) { return firstType; } else if (CanConvertToType(firstType.Obj(), secondType.Obj(), false)) { return secondType; } else { return 0; } } /*********************************************************************** IsNullAcceptableType ***********************************************************************/ bool IsNullAcceptableType(reflection::description::ITypeInfo* type) { switch (type->GetDecorator()) { case ITypeInfo::RawPtr: case ITypeInfo::SharedPtr: case ITypeInfo::Nullable: return true; case ITypeInfo::TypeDescriptor: return type->GetTypeDescriptor() == description::GetTypeDescriptor(); case ITypeInfo::Generic: return false; } return false; } /*********************************************************************** CreateTypeInfoFromMethodInfo ***********************************************************************/ Ptr CreateTypeInfoFromMethodInfo(reflection::description::IMethodInfo* info) { auto elementType = Ptr(new TypeDescriptorTypeInfo(description::GetTypeDescriptor(), TypeInfoHint::Normal)); auto genericType = Ptr(new GenericTypeInfo(elementType)); genericType->AddGenericArgument(CopyTypeInfo(info->GetReturn())); vint parameterCount = info->GetParameterCount(); for (vint j = 0; j < parameterCount; j++) { genericType->AddGenericArgument(CopyTypeInfo(info->GetParameter(j)->GetType())); } return Ptr(new SharedPtrTypeInfo(genericType)); } } } } /*********************************************************************** .\ANALYZER\WFANALYZER_VALIDATESCOPENAME.CPP ***********************************************************************/ namespace vl { namespace workflow { namespace analyzer { /*********************************************************************** ValidateScopeName ***********************************************************************/ class ValidateScopeNameDeclarationVisitor : public Object , public WfDeclaration::IVisitor , public WfVirtualCseDeclaration::IVisitor { public: enum Category { None, Type, Variable, Function, Namespace, }; WfLexicalScopeManager* manager; Ptr name; Category category; ValidateScopeNameDeclarationVisitor(WfLexicalScopeManager* _manager, Ptr _name) :manager(_manager) , name(_name) , category(name->typeDescriptor && name->imported ? Type : None) { } void AddError(WfDeclaration* node) { WString categoryName; switch (category) { case Type: categoryName = L"type"; break; case Variable: categoryName = L"variable"; break; case Function: categoryName = L"function"; break; case Namespace: categoryName = L"namespace"; break; default: CHECK_FAIL(L"ValidateScopeNameDeclarationVisitor::AddError(WfDeclaration*)#Internal error."); } manager->errors.Add(WfErrors::DuplicatedDeclaration(node, categoryName)); } void Visit(WfNamespaceDeclaration* node)override { if (category == None) { category = Namespace; } else if (category != Namespace) { AddError(node); } } void Visit(WfFunctionDeclaration* node)override { if (category == None) { category = Function; } else if (category != Function) { AddError(node); } } void Visit(WfVariableDeclaration* node)override { if (category == None) { category = Variable; } else { AddError(node); } } void Visit(WfEventDeclaration* node)override { CHECK_FAIL(L"ValidateScopeNameDeclarationVisitor::Visit(WfEventDeclaration*)#Internal error, ValidateDeclarationStructure function should check correctly."); } void Visit(WfPropertyDeclaration* node)override { CHECK_FAIL(L"ValidateScopeNameDeclarationVisitor::Visit(WfPropertyDeclaration*)#Internal error, ValidateDeclarationStructure function should check correctly."); } void Visit(WfStaticInitDeclaration* node)override { } void Visit(WfConstructorDeclaration* node)override { CHECK_FAIL(L"ValidateScopeNameDeclarationVisitor::Visit(WfConstructorDeclaration*)#Internal error, ValidateDeclarationStructure function should check correctly."); } void Visit(WfDestructorDeclaration* node)override { CHECK_FAIL(L"ValidateScopeNameDeclarationVisitor::Visit(WfDestructorDeclaration*)#Internal error, ValidateDeclarationStructure function should check correctly."); } void Visit(WfClassDeclaration* node)override { if (category == None) { category = Type; } else { AddError(node); } } void Visit(WfEnumDeclaration* node)override { if (category == None) { category = Type; } else { AddError(node); } } void Visit(WfStructDeclaration* node)override { if (category == None) { category = Type; } else { AddError(node); } } void Visit(WfVirtualCfeDeclaration* node)override { for (auto decl : node->expandedDeclarations) { decl->Accept(this); } } void Visit(WfVirtualCseDeclaration* node)override { node->Accept((WfVirtualCseDeclaration::IVisitor*)this); } void Visit(WfStateMachineDeclaration* node)override { CHECK_FAIL(L"ValidateScopeNameDeclarationVisitor::Visit(WfStateMachineDeclaration*)#Internal error, ValidateDeclarationStructure function should check correctly."); } }; void ValidateScopeName(WfLexicalScopeManager* manager, Ptr name) { ValidateScopeNameDeclarationVisitor visitor(manager, name); for (auto declaration : name->declarations) { declaration->Accept(&visitor); } for (auto child : name->children.Values()) { ValidateScopeName(manager, child); } } } } } /*********************************************************************** .\ANALYZER\WFANALYZER_VALIDATESEMANTIC.CPP ***********************************************************************/ namespace vl { namespace workflow { namespace analyzer { using namespace collections; using namespace reflection; using namespace reflection::description; using namespace typeimpl; /*********************************************************************** Helper Functions ***********************************************************************/ IMethodInfo* FindInterfaceConstructor(ITypeDescriptor* type) { if (auto ctors = type->GetConstructorGroup()) { auto proxyTd = description::GetTypeDescriptor(); for (vint i = 0; i < ctors->GetMethodCount(); i++) { IMethodInfo* info = ctors->GetMethod(i); if (info->GetParameterCount() == 1) { ITypeInfo* parameterType = info->GetParameter(0)->GetType(); if (parameterType->GetDecorator() == ITypeInfo::SharedPtr) { parameterType = parameterType->GetElementType(); if (parameterType->GetDecorator() == ITypeInfo::TypeDescriptor && parameterType->GetTypeDescriptor() == proxyTd) { return info; } } } } } return nullptr; } ITypeInfo* GetFunctionType(const ResolveExpressionResult& result) { if (result.eventInfo) { return result.eventInfo->GetHandlerType(); } else if (result.type) { return result.type.Obj(); } else { return nullptr; } } Ptr SelectFunction(WfLexicalScopeManager* manager, glr::ParsingAstBase* node, Ptr functionExpression, List& functions, List>& arguments, vint& selectedFunctionIndex) { selectedFunctionIndex = -1; List resolvables; List> types; for (auto argument : arguments) { if (!argument || IsExpressionDependOnExpectedType(manager, argument, true)) { resolvables.Add(false); types.Add(nullptr); } else { resolvables.Add(true); types.Add(GetExpressionType(manager, argument, nullptr)); } } List functionErrors, nonFunctionErrors; List> selectedFunctionIndices; ITypeDescriptor* functionFd = description::GetTypeDescriptor(); for (vint i = 0; i < functions.Count(); i++) { bool failed = false; vint convertCount = 0; auto result = functions[i]; ITypeInfo* expressionType = GetFunctionType(result); if (expressionType->GetDecorator() == ITypeInfo::SharedPtr) { ITypeInfo* genericType = expressionType->GetElementType(); if (genericType->GetDecorator() != ITypeInfo::Generic) goto FUNCTION_TYPE_FAILED; ITypeInfo* functionType = genericType->GetElementType(); if (functionType->GetDecorator() != ITypeInfo::TypeDescriptor || functionType->GetTypeDescriptor() != functionFd) goto FUNCTION_TYPE_FAILED; if (genericType->GetGenericArgumentCount() != types.Count() + 1) { functionErrors.Add(WfErrors::FunctionArgumentCountMismatched(node, arguments.Count(), result)); failed = true; } else { for (vint j = 0; j < types.Count(); j++) { if (resolvables[j] && types[j]) { ITypeInfo* argumentType = genericType->GetGenericArgument(j + 1); if (CanConvertToType(types[j].Obj(), argumentType, false)) { if (!IsSameType(types[j].Obj(), argumentType)) { convertCount++; } } else { functionErrors.Add(WfErrors::FunctionArgumentTypeMismatched(node, result, j + 1, types[j].Obj(), argumentType)); failed = true; } } } } } else { goto FUNCTION_TYPE_FAILED; } goto FUNCTION_TYPE_FINISHED; FUNCTION_TYPE_FAILED: nonFunctionErrors.Add(WfErrors::ExpressionIsNotFunction(functionExpression.Obj(), result.type.Obj())); failed = true; FUNCTION_TYPE_FINISHED: if (!failed) { selectedFunctionIndices.Add({ i,convertCount }); } } if (selectedFunctionIndices.Count() > 1) { vint minScore = From(selectedFunctionIndices) .Select([](Pair p) { return p.value; }) .Min(); for (vint i = selectedFunctionIndices.Count() - 1; i >= 0; i--) { if (selectedFunctionIndices[i].value != minScore) { selectedFunctionIndices.RemoveAt(i); } } } if (selectedFunctionIndices.Count() == 1) { selectedFunctionIndex = selectedFunctionIndices[0].key; ITypeInfo* genericType = GetFunctionType(functions[selectedFunctionIndex])->GetElementType(); for (vint i = 0; i < types.Count(); i++) { ITypeInfo* argumentType = genericType->GetGenericArgument(i + 1); if (resolvables[i]) { vint index = manager->expressionResolvings.Keys().IndexOf(arguments[i].Obj()); if (index != -1) { auto resolvingResult = manager->expressionResolvings.Values()[index]; CHECK_ERROR(resolvingResult.expectedType == nullptr, L"GetExpressionType should not set expectedType if it is null"); resolvingResult.expectedType = CopyTypeInfo(argumentType); manager->expressionResolvings.Set(arguments[i], resolvingResult); } } else { if (arguments[i]) { GetExpressionType(manager, arguments[i], CopyTypeInfo(argumentType)); } } } return CopyTypeInfo(genericType->GetGenericArgument(0)); } else { if (selectedFunctionIndices.Count() > 1) { List overloadedFunctions; CopyFrom( overloadedFunctions, From(selectedFunctionIndices) .Select([&functions](Pair p) { return functions[p.key]; })); manager->errors.Add(WfErrors::CannotPickOverloadedFunctions(node, overloadedFunctions)); } if (functionErrors.Count() > 0) { CopyFrom(manager->errors, functionErrors, true); } else { CopyFrom(manager->errors, nonFunctionErrors, true); } return nullptr; } } /*********************************************************************** ValidateSemantic ***********************************************************************/ void ValidateModuleSemantic(WfLexicalScopeManager* manager, Ptr module) { for (auto declaration : module->declarations) { ValidateDeclarationSemantic(manager, declaration); } } /*********************************************************************** GetExpressionScopeName ***********************************************************************/ Ptr GetExpressionScopeName(WfLexicalScopeManager* manager, WfExpression* expression) { List results; ValidateExpressionSemantic(manager, expression, 0, results); if (results.Count() == 0) return 0; for (vint i = results.Count() - 1; i >= 0; i--) { auto& result = results[i]; if (!result.scopeName) { results.RemoveAt(i); } } if (results.Count() == 0) { manager->errors.Add(WfErrors::ExpressionIsNotScopeName(expression)); return 0; } else if (results.Count() > 1) { manager->errors.Add(WfErrors::TooManyTargets(expression, results, GetExpressionName(expression))); return 0; } auto result = results[0]; manager->expressionResolvings.Add(Ptr(expression), result); return result.scopeName; } Ptr GetExpressionScopeName(WfLexicalScopeManager* manager, Ptr expression) { return GetExpressionScopeName(manager, expression.Obj()); } /*********************************************************************** GetExpressionEventInfo ***********************************************************************/ reflection::description::IEventInfo* GetExpressionEventInfo(WfLexicalScopeManager* manager, WfExpression* expression) { List results; ValidateExpressionSemantic(manager, expression, 0, results); if (results.Count() == 0) return 0; for (vint i = results.Count() - 1; i >= 0; i--) { auto& result = results[i]; if (!result.eventInfo) { results.RemoveAt(i); } } if (results.Count() == 0) { manager->errors.Add(WfErrors::ExpressionIsNotEvent(expression)); return 0; } else if (results.Count() > 1) { manager->errors.Add(WfErrors::TooManyTargets(expression, results, GetExpressionName(expression))); return 0; } auto result = results[0]; manager->expressionResolvings.Add(Ptr(expression), result); return result.eventInfo; } reflection::description::IEventInfo* GetExpressionEventInfo(WfLexicalScopeManager* manager, Ptr expression) { return GetExpressionEventInfo(manager, expression.Obj()); } /*********************************************************************** GetExpressionTypes ***********************************************************************/ void GetExpressionTypes(WfLexicalScopeManager* manager, WfExpression* expression, Ptr expectedType, bool allowEvent, collections::List& results) { ValidateExpressionSemantic(manager, expression, expectedType, results); if (results.Count() == 0) return; Ptr scopeName; IEventInfo* eventInfo = 0; for (vint i = results.Count() - 1; i >= 0; i--) { auto& result = results[i]; if (result.scopeName && !scopeName) { scopeName = result.scopeName; } if (result.eventInfo && !eventInfo) { eventInfo = result.eventInfo; } if (!result.type && !(allowEvent && eventInfo)) { results.RemoveAt(i); } } if (results.Count() == 0) { if (scopeName) { manager->errors.Add(WfErrors::ScopeNameIsNotExpression(expression, scopeName)); } if (eventInfo) { manager->errors.Add(WfErrors::EventIsNotExpression(expression, eventInfo)); } } if (expectedType) { List> failedTypes; for (vint i = results.Count() - 1; i >= 0; i--) { auto& result = results[i]; if (!CanConvertToType(result.type.Obj(), expectedType.Obj(), false)) { failedTypes.Add(result.type); results.RemoveAt(i); } } if (results.Count() == 0) { for (auto type : failedTypes) { manager->errors.Add(WfErrors::ExpressionCannotImplicitlyConvertToType(expression, type.Obj(), expectedType.Obj())); } } } } void GetExpressionTypes(WfLexicalScopeManager* manager, Ptr expression, Ptr expectedType, bool allowEvent, collections::List& results) { return GetExpressionTypes(manager, expression.Obj(), expectedType, allowEvent, results); } /*********************************************************************** GetExpressionType ***********************************************************************/ Ptr GetExpressionType(WfLexicalScopeManager* manager, WfExpression* expression, Ptr expectedType) { List results; GetExpressionTypes(manager, expression, expectedType, false, results); if (results.Count() > 1) { manager->errors.Add(WfErrors::TooManyTargets(expression, results, GetExpressionName(expression))); return expectedType; } else if (results.Count() == 1) { auto result = results[0]; result.expectedType = expectedType; manager->expressionResolvings.Add(Ptr(expression), result); return expectedType ? expectedType : result.type; } else { return expectedType; } } Ptr GetExpressionType(WfLexicalScopeManager* manager, Ptr expression, Ptr expectedType) { return GetExpressionType(manager, expression.Obj(), expectedType); } /*********************************************************************** GetLeftValueExpressionType ***********************************************************************/ Ptr GetLeftValueExpressionType(WfLexicalScopeManager* manager, WfExpression* expression) { List results; GetExpressionTypes(manager, expression, nullptr, false, results); if (results.Count() > 1) { manager->errors.Add(WfErrors::TooManyTargets(expression, results, GetExpressionName(expression))); } else if (results.Count() == 1) { if (results[0].writableType) { auto result = results[0]; manager->expressionResolvings.Add(Ptr(expression), result); return result.writableType; } else { manager->errors.Add(WfErrors::ExpressionIsNotLeftValue(expression, results[0])); } } return nullptr; } Ptr GetLeftValueExpressionType(WfLexicalScopeManager* manager, Ptr expression) { return GetLeftValueExpressionType(manager, expression.Obj()); } /*********************************************************************** GetEnumerableExpressionItemType ***********************************************************************/ Ptr GetEnumerableExpressionItemType(WfLexicalScopeManager* manager, WfExpression* expression, Ptr expectedType) { Ptr collectionType = GetExpressionType(manager, expression, expectedType); if (collectionType) { if (collectionType->GetTypeDescriptor()->CanConvertTo(description::GetTypeDescriptor())) { if (collectionType->GetDecorator() == ITypeInfo::SharedPtr) { ITypeInfo* genericType = collectionType->GetElementType(); if (genericType->GetDecorator() == ITypeInfo::Generic && genericType->GetGenericArgumentCount() == 1) { return CopyTypeInfo(genericType->GetGenericArgument(0)); } } return TypeInfoRetriver::CreateTypeInfo(); } manager->errors.Add(WfErrors::ExpressionIsNotCollection(expression, collectionType.Obj())); } return nullptr; } Ptr GetEnumerableExpressionItemType(WfLexicalScopeManager* manager, Ptr expression, Ptr expectedType) { return GetEnumerableExpressionItemType(manager, expression.Obj(), expectedType); } } } } /*********************************************************************** .\ANALYZER\WFANALYZER_VALIDATESEMANTIC_DECLARATION.CPP ***********************************************************************/ namespace vl { namespace workflow { namespace analyzer { using namespace collections; using namespace reflection; using namespace reflection::description; using namespace typeimpl; /*********************************************************************** ValidateSemantic(ClassMember) ***********************************************************************/ class ValidateSemanticClassMemberVisitor : public Object , public WfDeclaration::IVisitor { public: WfLexicalScopeManager* manager; Ptr td; WfClassDeclaration* classDecl; ValidateSemanticClassMemberVisitor(Ptr _td, WfClassDeclaration* _classDecl, WfLexicalScopeManager* _manager) :td(_td) , classDecl(_classDecl) , manager(_manager) { } void Visit(WfNamespaceDeclaration* node)override { } void Visit(WfFunctionDeclaration* node)override { ValidateDeclarationSemantic(manager, node); } void Visit(WfVariableDeclaration* node)override { ValidateDeclarationSemantic(manager, node); } void Visit(WfEventDeclaration* node)override { ValidateDeclarationSemantic(manager, node); } void Visit(WfPropertyDeclaration* node)override { ValidateDeclarationSemantic(manager, node); auto scope = manager->nodeScopes[node]; if (auto typeInfo = CreateTypeInfoFromType(scope.Obj(), node->type)) { if (node->getter.value != L"") { auto getter = td->GetMethodGroupByName(node->getter.value, false)->GetMethod(0); if (!IsSameType(typeInfo.Obj(), getter->GetReturn()) || getter->GetParameterCount() != 0) { manager->errors.Add(WfErrors::PropertyGetterTypeMismatched(node, classDecl)); } } if (node->setter.value != L"") { auto setter = td->GetMethodGroupByName(node->setter.value, false)->GetMethod(0); if (setter->GetReturn()->GetTypeDescriptor() != description::GetTypeDescriptor() || setter->GetParameterCount() != 1 || !IsSameType(typeInfo.Obj(), setter->GetParameter(0)->GetType())) { manager->errors.Add(WfErrors::PropertySetterTypeMismatched(node, classDecl)); } } } } void Visit(WfStaticInitDeclaration* node)override { } static void SelectConstructor(WfLexicalScopeManager* manager, WfConstructorDeclaration* ctorDecl, glr::ParsingAstBase* node, ITypeDescriptor* td, List>& arguments) { List functions; if (auto ctors = td->GetConstructorGroup()) { vint count = ctors->GetMethodCount(); for (vint i = 0; i < count; i++) { auto ctor = ctors->GetMethod(i); functions.Add(ResolveExpressionResult::Method(ctor)); } } vint selectedFunctionIndex = -1; SelectFunction(manager, node, nullptr, functions, arguments, selectedFunctionIndex); if (selectedFunctionIndex != -1) { auto ctor = functions[selectedFunctionIndex].methodInfo; auto call = dynamic_cast(node); manager->baseConstructorCallResolvings.Add({ctorDecl, td}, {call, ctor}); } } void Visit(WfConstructorDeclaration* node)override { ValidateDeclarationSemantic(manager, node); auto scope = manager->nodeScopes[node].Obj(); auto classScope = scope->parentScope.Obj(); SortedList baseTypes, initTypes; { auto td = classScope->typeOfThisExpr; vint count = td->GetBaseTypeDescriptorCount(); for (vint i = 0; i < count; i++) { auto baseTd = td->GetBaseTypeDescriptor(i); if (!baseTypes.Contains(baseTd)) { baseTypes.Add(baseTd); } } } for (auto call : node->baseConstructorCalls) { if (auto scopeName = GetScopeNameFromReferenceType(classScope, call->type)) { if (auto td = scopeName->typeDescriptor) { if (initTypes.Contains(td)) { manager->errors.Add(WfErrors::DuplicatedBaseConstructorCall(call.Obj(), td)); } else if (baseTypes.Contains(td)) { initTypes.Add(td); SelectConstructor(manager, node, call.Obj(), td, call->arguments); } else { manager->errors.Add(WfErrors::WrongBaseConstructorCall(call.Obj(), td)); } } } } { vint index = -1; for (vint i = 0; i < initTypes.Count(); i++) { while (baseTypes[++index] != initTypes[i]) { auto td = baseTypes[index]; List> arguments; SelectConstructor(manager, node, node, td, arguments); } } while (++index < baseTypes.Count()) { auto td = baseTypes[index]; List> arguments; SelectConstructor(manager, node, node, td, arguments); } } ValidateStatementSemantic(manager, node->statement); } void Visit(WfDestructorDeclaration* node)override { ValidateDeclarationSemantic(manager, node); ValidateStatementSemantic(manager, node->statement); } void Visit(WfClassDeclaration* node)override { ValidateDeclarationSemantic(manager, node); } void Visit(WfEnumDeclaration* node)override { ValidateDeclarationSemantic(manager, node); } void Visit(WfStructDeclaration* node)override { ValidateDeclarationSemantic(manager, node); } void Visit(WfVirtualCfeDeclaration* node)override { ValidateDeclarationSemantic(manager, node); } void Visit(WfVirtualCseDeclaration* node)override { ValidateDeclarationSemantic(manager, node); } static void Execute(Ptr td, WfClassDeclaration* classDecl, Ptr memberDecl, WfLexicalScopeManager* manager) { ValidateSemanticClassMemberVisitor visitor(td, classDecl, manager); memberDecl->Accept(&visitor); } }; /*********************************************************************** ValidateSemantic(Declaration) ***********************************************************************/ class ExpandVirtualDeclarationVisitor : public Object, public WfVirtualCseDeclaration::IVisitor { public: WfLexicalScopeManager* manager; ExpandVirtualDeclarationVisitor(WfLexicalScopeManager* _manager) :manager(_manager) { } void Visit(WfStateMachineDeclaration* node)override { ExpandStateMachine(manager, node); } }; class ValidateSemanticDeclarationVisitor : public Object , public WfDeclaration::IVisitor , public WfVirtualCseDeclaration::IVisitor { public: WfLexicalScopeManager* manager; ValidateSemanticDeclarationVisitor(WfLexicalScopeManager* _manager) :manager(_manager) { } void Visit(List>& attributes) { for (auto attribute : attributes) { auto key = Pair(attribute->category.value, attribute->name.value); vint index = manager->attributes.Keys().IndexOf(key); if (index == -1) { manager->errors.Add(WfErrors::AttributeNotExists(attribute.Obj())); } else { auto expectedType = manager->attributes.Values()[index]; if (attribute->value) { ValidateConstantExpression(manager, attribute->value, expectedType); } else if (expectedType->GetTypeDescriptor() != description::GetTypeDescriptor()) { manager->errors.Add(WfErrors::AttributeMissValue(attribute.Obj())); } } } } void Visit(WfNamespaceDeclaration* node)override { for (auto declaration : node->declarations) { ValidateDeclarationSemantic(manager, declaration); } } void Visit(WfFunctionDeclaration* node)override { if (node->statement) { ValidateStatementSemantic(manager, node->statement); } for (auto argument : node->arguments) { Visit(argument->attributes); } } void Visit(WfVariableDeclaration* node)override { auto scope = manager->nodeScopes[node]; auto symbol = scope->symbols[node->name.value][0]; symbol->typeInfo = GetExpressionType(manager, node->expression, symbol->typeInfo); if (symbol->typeInfo && !symbol->type) { symbol->type = GetTypeFromTypeInfo(symbol->typeInfo.Obj()); } } void Visit(WfEventDeclaration* node)override { } void Visit(WfPropertyDeclaration* node)override { } void Visit(WfStaticInitDeclaration* node)override { ValidateStatementSemantic(manager, node->statement); } void Visit(WfConstructorDeclaration* node)override { } void Visit(WfDestructorDeclaration* node)override { } void Visit(WfClassDeclaration* node)override { auto scope = manager->nodeScopes[node]; auto td = manager->declarationTypes[node].Cast(); if (node->kind == WfClassKind::Interface) { for (auto baseType : node->baseTypes) { auto scopeName = GetScopeNameFromReferenceType(scope->parentScope.Obj(), baseType); auto baseTd = scopeName->typeDescriptor; auto ctor = FindInterfaceConstructor(baseTd); if (ctor == nullptr) { manager->errors.Add(WfErrors::WrongInterfaceBaseType(node, baseTd)); } } } if (auto sm = From(node->declarations) .FindType() .First(nullptr) ) { auto smtd = description::GetTypeDescriptor(); vint count = td->GetBaseTypeDescriptorCount(); auto smbc = Range(0, count) .Select([=](vint index) {return td->GetBaseTypeDescriptor(index); }) .Where([=](ITypeDescriptor* td) {return td == smtd; }) .First(nullptr); if (!smbc) { manager->errors.Add(WfErrors::StateMachineClassNotInheritFromStateMachine(node)); } } for (auto memberDecl : node->declarations) { ValidateClassMemberSemantic(manager, td, node, memberDecl); } } void Visit(WfEnumDeclaration* node)override { for (auto item : node->items) { Visit(item->attributes); } } void Visit(WfStructDeclaration* node)override { auto scope = manager->nodeScopes[node]; auto td = manager->declarationTypes[node].Cast(); for (auto member : node->members) { auto memberTd = td->GetPropertyByName(member->name.value, false)->GetReturn()->GetTypeDescriptor(); if ((memberTd->GetTypeDescriptorFlags() & TypeDescriptorFlags::ReferenceType) != TypeDescriptorFlags::Undefined) { manager->errors.Add(WfErrors::StructContainsNonValueType(member.Obj(), node)); } } for (auto member : node->members) { Visit(member->attributes); } } void Visit(WfVirtualCfeDeclaration* node)override { for (auto decl : node->expandedDeclarations) { ValidateDeclarationSemantic(manager, decl); } } void Visit(WfVirtualCseDeclaration* node)override { bool expanded = node->expandedDeclarations.Count() > 0; vint errorCount = manager->errors.Count(); node->Accept((WfVirtualCseDeclaration::IVisitor*)this); if (!expanded && manager->errors.Count() == errorCount) { ExpandVirtualDeclarationVisitor visitor(manager); node->Accept(&visitor); for (auto decl : node->expandedDeclarations) { SetCodeRange(decl, node->codeRange); } auto parentScope = manager->nodeScopes[node]; if (parentScope->ownerNode == node) { parentScope = parentScope->parentScope; } for (auto decl : node->expandedDeclarations) { ContextFreeDeclarationDesugar(manager, decl); } for (auto decl : node->expandedDeclarations) { BuildScopeForDeclaration(manager, parentScope, decl, manager->declaractionScopeSources[node]); } manager->checkedScopes_DuplicatedSymbol.Remove(parentScope.Obj()); manager->checkedScopes_SymbolType.Remove(parentScope.Obj()); if (!CheckScopes_DuplicatedSymbol(manager) || !CheckScopes_SymbolType(manager)) { return; } } for (auto decl : node->expandedDeclarations) { ValidateDeclarationSemantic(manager, decl); } } void Visit(WfStateMachineDeclaration* node)override { bool foundDefaultState = false; for (auto state : node->states) { if (state->name.value == L"") { foundDefaultState = true; } ValidateStatementSemantic(manager, state->statement); } if (!foundDefaultState) { manager->errors.Add(WfErrors::MissingDefaultState(node)); } } static void Execute(WfDeclaration* declaration, WfLexicalScopeManager* manager) { ValidateSemanticDeclarationVisitor visitor(manager); declaration->Accept(&visitor); visitor.Visit(declaration->attributes); } }; /*********************************************************************** ValidateSemantic ***********************************************************************/ void ValidateClassMemberSemantic(WfLexicalScopeManager* manager, Ptr td, WfClassDeclaration* classDecl, Ptr memberDecl) { return ValidateSemanticClassMemberVisitor::Execute(td, classDecl, memberDecl, manager); } void ValidateDeclarationSemantic(WfLexicalScopeManager* manager, WfDeclaration* declaration) { return ValidateSemanticDeclarationVisitor::Execute(declaration, manager); } void ValidateDeclarationSemantic(WfLexicalScopeManager* manager, Ptr declaration) { return ValidateSemanticDeclarationVisitor::Execute(declaration.Obj(), manager); } } } } /*********************************************************************** .\ANALYZER\WFANALYZER_VALIDATESEMANTIC_EXPRESSION.CPP ***********************************************************************/ namespace vl { namespace workflow { namespace analyzer { using namespace collections; using namespace reflection; using namespace reflection::description; using namespace typeimpl; /*********************************************************************** ValidateSemantic(Expression) ***********************************************************************/ class ExpandVirtualExpressionVisitor : public Object, public WfVirtualCseExpression::IVisitor { public: WfLexicalScopeManager* manager; Ptr expectedType; ExpandVirtualExpressionVisitor(WfLexicalScopeManager* _manager, Ptr _expectedType) :manager(_manager) , expectedType(_expectedType) { } void Visit(WfBindExpression* node)override { ExpandBindExpression(manager, node); } void Visit(WfNewCoroutineExpression* node)override { ExpandNewCoroutineExpression(manager, node); } void Visit(WfMixinCastExpression* node)override { ExpandMixinCastExpression(manager, node); } void Visit(WfExpectedTypeCastExpression* node)override { auto castExpr = Ptr(new WfTypeCastingExpression); castExpr->strategy = node->strategy; castExpr->expression = CopyExpression(node->expression, true); castExpr->type = GetTypeFromTypeInfo(expectedType.Obj()); node->expandedExpression = castExpr; } void Visit(WfCoOperatorExpression* node)override { auto scope = manager->nodeScopes[node].Obj(); auto functionScope = scope->FindFunctionScope(); if (functionScope->ownerNode.Cast()) { // variable is created after $coroutine{} is generated // so the expanding is delayed until $coroutine{} is ready ExpandCoOperatorExpression(manager, node); } } }; class ValidateSemanticExpressionVisitor : public Object , public WfExpression::IVisitor , public WfVirtualCseExpression::IVisitor { public: WfLexicalScopeManager* manager; Ptr expectedType; List& results; ValidateSemanticExpressionVisitor(WfLexicalScopeManager* _manager, Ptr _expectedType, List& _results) :manager(_manager) , expectedType(_expectedType) , results(_results) { } void Visit(WfThisExpression* node)override { auto scope = manager->nodeScopes[node].Obj(); Ptr lastConfig; while (scope) { if (auto config = scope->functionConfig) { lastConfig = config; if (!lastConfig->thisAccessable) { break; } } if (scope->typeOfThisExpr) { if (!lastConfig) { break; } if (lastConfig->thisAccessable) { auto elementType = Ptr(new TypeDescriptorTypeInfo(scope->typeOfThisExpr, TypeInfoHint::Normal)); auto pointerType = Ptr(new RawPtrTypeInfo(elementType)); results.Add(ResolveExpressionResult::ReadonlyType(pointerType)); return; } } scope = scope->parentScope.Obj(); } manager->errors.Add(WfErrors::WrongThisExpression(node)); } void Visit(WfTopQualifiedExpression* node)override { if (manager->globalName) { vint index = manager->globalName->children.Keys().IndexOf(node->name.value); if (index != -1) { results.Add(ResolveExpressionResult::ScopeName(manager->globalName->children.Values()[index])); return; } } manager->errors.Add(WfErrors::TopQualifiedSymbolNotExists(node, node->name.value)); } void ResolveName(WfExpression* node, const WString& name) { auto scope = manager->nodeScopes[node].Obj(); List nameResults; manager->ResolveName(scope, name, nameResults); for (vint i = 0; i < nameResults.Count(); i++) { auto& result = nameResults[i]; if (result.symbol) { if (!result.type) { manager->errors.Add(WfErrors::ExpressionCannotResolveType(node, result.symbol)); } else if (!result.symbol->creatorNode.Cast() || result.symbol->creatorNode.Cast()) { bool readonlyCaptured = false; if (!result.symbol->ownerScope->ownerNode.Cast() && !result.symbol->ownerScope->ownerNode.Cast()) { auto currentScope = scope; WfLexicalScope* firstConfigScope = nullptr; WfLexicalScope* lastConfigScope = nullptr; while (currentScope) { if (currentScope->functionConfig) { if (!firstConfigScope) { firstConfigScope = currentScope; } lastConfigScope = currentScope; } if (result.symbol->ownerScope == currentScope) { if (firstConfigScope && firstConfigScope->functionConfig->lambda) { readonlyCaptured = true; } if (currentScope->ownerNode.Cast()) { if (firstConfigScope) { readonlyCaptured = firstConfigScope != lastConfigScope; if ( lastConfigScope->parentScope != currentScope || !lastConfigScope->ownerNode.Cast() || (lastConfigScope->ownerNodeSource && lastConfigScope->ownerNodeSource != currentScope->ownerNode) ) { manager->errors.Add(WfErrors::FieldCannotInitializeUsingEachOther(node, result)); } } else { manager->errors.Add(WfErrors::FieldCannotInitializeUsingEachOther(node, result)); } } break; } if (currentScope->ownerNode.Cast()) { auto capture = manager->lambdaCaptures[currentScope->ownerNode.Obj()]; if (!capture->ctorArgumentSymbols.Contains(result.symbol.Obj())) { if (lastConfigScope == nullptr) { capture->ctorArgumentSymbols.Add(result.symbol); } else { auto functionCapture = manager->lambdaCaptures[lastConfigScope->ownerNode.Obj()]; if (capture != functionCapture) { capture->ctorArgumentSymbols.Add(result.symbol); } } } } if (currentScope->functionConfig) { if (currentScope->functionConfig->lambda) { auto capture = manager->lambdaCaptures[currentScope->ownerNode.Obj()]; if (!capture->symbols.Contains(result.symbol.Obj())) { capture->symbols.Add(result.symbol); } } } currentScope = currentScope->parentScope.Obj(); } } if (readonlyCaptured) { results.Add(ResolveExpressionResult::ReadonlySymbol(result.symbol)); } else { results.Add(ResolveExpressionResult::Symbol(result.symbol)); } } else { results.Add(result); } } else { if (result.propertyInfo && dynamic_cast(node)) { auto currentScope = scope; WfLexicalScope* firstConfigScope = nullptr; WfLexicalScope* lastConfigScope = nullptr; while (currentScope) { if (currentScope->functionConfig) { if (!firstConfigScope) { firstConfigScope = currentScope; } lastConfigScope = currentScope; } if (currentScope->ownerNode.Cast() && currentScope->typeOfThisExpr == result.propertyInfo->GetOwnerTypeDescriptor()) { if (firstConfigScope) { bool inMethodBody = lastConfigScope->parentScope == currentScope && lastConfigScope->ownerNodeSource == currentScope->ownerNode && lastConfigScope->ownerNode.Cast(); bool inDtorBody = lastConfigScope->ownerNode.Cast(); bool inCtorBody = lastConfigScope->parentScope->ownerNode.Cast(); bool inStateBody = lastConfigScope->ownerNode.Cast(); if (!inMethodBody && !inDtorBody && !inCtorBody && !inStateBody) { manager->errors.Add(WfErrors::FieldCannotInitializeUsingEachOther(node, result)); } } else if (!scope->ownerNode.Cast()) { manager->errors.Add(WfErrors::FieldCannotInitializeUsingEachOther(node, result)); } } currentScope = currentScope->parentScope.Obj(); } } results.Add(result); } } if (results.Count() == 0) { if (nameResults.Count() > 0) { for (auto result : nameResults) { manager->errors.Add(WfErrors::ExpressionCannotResolveType(node, result.symbol)); } } else { manager->errors.Add(WfErrors::ReferenceNotExists(node, name)); } } } void Visit(WfReferenceExpression* node)override { if (expectedType && (expectedType->GetTypeDescriptor()->GetTypeDescriptorFlags() & TypeDescriptorFlags::EnumType) != TypeDescriptorFlags::Undefined) { auto scope = manager->nodeScopes[node].Obj(); List testResults; manager->ResolveName(scope, node->name.value, testResults); if (testResults.Count() == 0) { auto enumType = expectedType->GetTypeDescriptor()->GetEnumType(); if (enumType->IndexOfItem(node->name.value) == -1) { manager->errors.Add(WfErrors::EnumItemNotExists(node, expectedType->GetTypeDescriptor(), node->name.value)); } else { results.Add(ResolveExpressionResult::ReadonlyType(expectedType)); } return; } } ResolveName(node, node->name.value); for (auto result : results) { ITypeDescriptor* td = nullptr; if (result.methodInfo) { td = result.methodInfo->GetOwnerTypeDescriptor(); } else if (result.propertyInfo) { td = result.propertyInfo->GetOwnerTypeDescriptor(); } else if (result.eventInfo) { td = result.eventInfo->GetOwnerTypeDescriptor(); } if (td) { auto scope = manager->nodeScopes[node].Obj(); bool visibleToNonStatic = false; while (scope) { if (scope->functionConfig) { visibleToNonStatic = scope->functionConfig->thisAccessable || scope->functionConfig->parentThisAccessable; } if (scope->typeOfThisExpr && scope->typeOfThisExpr->CanConvertTo(td)) { if (!visibleToNonStatic) { if (result.methodInfo) { if (!result.methodInfo->IsStatic()) { manager->errors.Add(WfErrors::CannotCallMemberInStaticFunction(node, result)); } } else if (result.propertyInfo) { manager->errors.Add(WfErrors::CannotCallMemberInStaticFunction(node, result)); } else if (result.eventInfo) { manager->errors.Add(WfErrors::CannotCallMemberInStaticFunction(node, result)); } break; } } scope = scope->parentScope.Obj(); } } } } void Visit(WfOrderedNameExpression* node)override { ResolveName(node, node->name.value); } void Visit(WfOrderedLambdaExpression* node)override { auto scope = manager->nodeScopes[node].Obj(); List> parameterSymbols; CopyFrom( parameterSymbols, Range(0, scope->symbols.Count()) .Select([scope](vint index)->Ptr{return scope->symbols.GetByIndex(index)[0];}) .OrderBy([](Ptr a, Ptr b) { vint aId = wtoi(a->name.Sub(1, a->name.Length() - 1)); vint bId = wtoi(b->name.Sub(1, a->name.Length() - 1)); return aId <=> bId; }) ); Ptr resultType = expectedType; if (!expectedType && parameterSymbols.Count() > 0) { manager->errors.Add(WfErrors::OrderedLambdaCannotResolveType(node)); return; } else if (expectedType) { ITypeInfo* type = expectedType.Obj(); if (type->GetDecorator() != ITypeInfo::SharedPtr) { goto ORDERED_FAILED; } type = type->GetElementType(); if (type->GetDecorator() != ITypeInfo::Generic) { goto ORDERED_FAILED; } { ITypeInfo* functionType = type->GetElementType(); if (functionType->GetDecorator() != ITypeInfo::TypeDescriptor) { goto ORDERED_FAILED; } if (functionType->GetTypeDescriptor() != description::GetTypeDescriptor()) { goto ORDERED_FAILED; } } if (type->GetGenericArgumentCount() != parameterSymbols.Count() + 1) { goto ORDERED_FAILED; } auto resultType = Ptr(type->GetGenericArgument(0)); for (auto [symbol, index] : indexed(parameterSymbols)) { symbol->typeInfo = Ptr(type->GetGenericArgument(index + 1)); symbol->type = GetTypeFromTypeInfo(symbol->typeInfo.Obj()); } GetExpressionType(manager, node->body, resultType); } else { auto bodyType = GetExpressionType(manager, node->body, 0); if (bodyType) { auto funcType = Ptr(new TypeDescriptorTypeInfo(description::GetTypeDescriptor(), TypeInfoHint::Normal)); auto genericType = Ptr(new GenericTypeInfo(funcType)); genericType->AddGenericArgument(bodyType); resultType = Ptr(new SharedPtrTypeInfo(genericType)); } } goto ORDERED_FINISHED; ORDERED_FAILED: manager->errors.Add(WfErrors::OrderedLambdaCannotImplicitlyConvertToType(node, expectedType.Obj())); ORDERED_FINISHED: if (resultType) { results.Add(ResolveExpressionResult::ReadonlyType(resultType)); } } void Visit(WfMemberExpression* node)override { Ptr type = GetExpressionType(manager, node->parent, 0); if (type) { SortedList searchedTypes; manager->ResolveMember(type->GetTypeDescriptor(), node->name.value, false, searchedTypes, results); if (results.Count() == 0) { manager->errors.Add(WfErrors::MemberNotExists(node, type->GetTypeDescriptor(), node->name.value)); } } } void Visit(WfChildExpression* node)override { if (Ptr scopeName = GetExpressionScopeName(manager, node->parent)) { vint index = scopeName->children.Keys().IndexOf(node->name.value); if (index != -1) { results.Add(ResolveExpressionResult::ScopeName(scopeName->children.Values()[index])); return; } if (scopeName->typeDescriptor) { SortedList searchedTypes; manager->ResolveMember(scopeName->typeDescriptor, node->name.value, true, searchedTypes, results); if (results.Count() > 0) { for (auto result : results) { if (result.methodInfo) { if (!result.methodInfo->IsStatic()) { manager->errors.Add(WfErrors::CannotCallMemberOutsideOfClass(node, result)); } } else if (result.propertyInfo) { manager->errors.Add(WfErrors::CannotCallMemberOutsideOfClass(node, result)); } else if (result.eventInfo) { manager->errors.Add(WfErrors::CannotCallMemberOutsideOfClass(node, result)); } } return; } } if (scopeName->typeDescriptor != nullptr && (scopeName->typeDescriptor->GetTypeDescriptorFlags() & TypeDescriptorFlags::EnumType) != TypeDescriptorFlags::Undefined) { manager->errors.Add(WfErrors::EnumItemNotExists(node, scopeName->typeDescriptor, node->name.value)); } else { manager->errors.Add(WfErrors::ChildSymbolNotExists(node, scopeName, node->name.value)); } } } void Visit(WfLiteralExpression* node)override { if (node->value == WfLiteralValue::Null) { if (!expectedType) { manager->errors.Add(WfErrors::NullCannotResolveType(node)); } else if (!IsNullAcceptableType(expectedType.Obj())) { manager->errors.Add(WfErrors::NullCannotImplicitlyConvertToType(node, expectedType.Obj())); } results.Add(ResolveExpressionResult::ReadonlyType(expectedType)); } else { results.Add(ResolveExpressionResult::ReadonlyType(TypeInfoRetriver::CreateTypeInfo())); } } void Visit(WfFloatingExpression* node)override { auto typeDescriptor = expectedType ? expectedType->GetTypeDescriptor() : nullptr; if (!typeDescriptor || typeDescriptor->GetTypeDescriptorFlags() == TypeDescriptorFlags::Object || typeDescriptor == description::GetTypeDescriptor()) { typeDescriptor = description::GetTypeDescriptor(); } if (auto serializableType = typeDescriptor->GetSerializableType()) { Value output; if (serializableType->Deserialize(node->value.value, output)) { results.Add(ResolveExpressionResult::ReadonlyType(Ptr(new TypeDescriptorTypeInfo(typeDescriptor, TypeInfoHint::Normal)))); return; } } manager->errors.Add(WfErrors::FloatingLiteralOutOfRange(node)); } void Visit(WfIntegerExpression* node)override { auto typeDescriptor = expectedType ? expectedType->GetTypeDescriptor() : nullptr; if (!typeDescriptor || typeDescriptor->GetTypeDescriptorFlags() == TypeDescriptorFlags::Object || typeDescriptor==description::GetTypeDescriptor()) { typeDescriptor = manager->cputdSInt; } if (auto serializableType = typeDescriptor->GetSerializableType()) { Value output; if (serializableType->Deserialize(node->value.value, output)) { results.Add(ResolveExpressionResult::ReadonlyType(Ptr(new TypeDescriptorTypeInfo(typeDescriptor, TypeInfoHint::Normal)))); return; } } manager->errors.Add(WfErrors::IntegerLiteralOutOfRange(node)); } void Visit(WfStringExpression* node)override { results.Add(ResolveExpressionResult::ReadonlyType(TypeInfoRetriver::CreateTypeInfo())); } void Visit(WfUnaryExpression* node)override { Ptr typeInfo = GetExpressionType(manager, node->operand, 0); if (typeInfo) { TypeFlag flag = GetTypeFlag(typeInfo.Obj()); switch (node->op) { case WfUnaryOperator::Not: switch (flag) { case TypeFlag::F4: case TypeFlag::F8: case TypeFlag::String: case TypeFlag::Enum: case TypeFlag::Struct: case TypeFlag::Others: manager->errors.Add(WfErrors::UnaryOperatorOnWrongType(node, typeInfo.Obj())); break; default:; } break; case WfUnaryOperator::Positive: switch (flag) { case TypeFlag::Bool: case TypeFlag::String: case TypeFlag::Enum: case TypeFlag::Struct: case TypeFlag::Others: manager->errors.Add(WfErrors::UnaryOperatorOnWrongType(node, typeInfo.Obj())); break; default:; } break; case WfUnaryOperator::Negative: switch (flag) { case TypeFlag::Bool: case TypeFlag::U1: case TypeFlag::U2: case TypeFlag::U4: case TypeFlag::U8: case TypeFlag::String: case TypeFlag::Enum: case TypeFlag::Struct: case TypeFlag::Others: manager->errors.Add(WfErrors::UnaryOperatorOnWrongType(node, typeInfo.Obj())); break; default:; } break; default:; } results.Add(ResolveExpressionResult::ReadonlyType(typeInfo)); } } void Visit(WfBinaryExpression* node)override { if (node->op == WfBinaryOperator::Assign) { Ptr variableType = GetLeftValueExpressionType(manager, node->first); GetExpressionType(manager, node->second, variableType); if (variableType) { results.Add(ResolveExpressionResult::ReadonlyType(variableType)); } } else if (node->op == WfBinaryOperator::Index) { Ptr containerType = GetExpressionType(manager, node->first, 0); if (containerType) { if (containerType->GetDecorator() == ITypeInfo::SharedPtr) { ITypeInfo* genericType = containerType->GetElementType(); Ptr indexType; Ptr resultType; bool leftValue = false; if (genericType->GetDecorator() == ITypeInfo::Generic) { ITypeInfo* classType = genericType->GetElementType(); if (classType->GetTypeDescriptor() == description::GetTypeDescriptor()) { indexType = manager->cputiSInt; resultType = CopyTypeInfo(genericType->GetGenericArgument(0)); } else if (classType->GetTypeDescriptor() == description::GetTypeDescriptor()) { indexType = manager->cputiSInt; resultType = CopyTypeInfo(genericType->GetGenericArgument(0)); leftValue = true; } else if (classType->GetTypeDescriptor() == description::GetTypeDescriptor()) { indexType = manager->cputiSInt; resultType = CopyTypeInfo(genericType->GetGenericArgument(0)); leftValue = true; } else if (classType->GetTypeDescriptor() == description::GetTypeDescriptor()) { indexType = manager->cputiSInt; resultType = CopyTypeInfo(genericType->GetGenericArgument(0)); leftValue = true; } else if (classType->GetTypeDescriptor() == description::GetTypeDescriptor()) { indexType = CopyTypeInfo(genericType->GetGenericArgument(0)); resultType = CopyTypeInfo(genericType->GetGenericArgument(1)); } else if (classType->GetTypeDescriptor() == description::GetTypeDescriptor()) { indexType = CopyTypeInfo(genericType->GetGenericArgument(0)); resultType = CopyTypeInfo(genericType->GetGenericArgument(1)); leftValue = true; } else { manager->errors.Add(WfErrors::IndexOperatorOnWrongType(node, containerType.Obj())); } } else { if (genericType->GetTypeDescriptor() == description::GetTypeDescriptor()) { indexType = manager->cputiSInt; resultType = TypeInfoRetriver::CreateTypeInfo(); } else if (genericType->GetTypeDescriptor() == description::GetTypeDescriptor()) { indexType = manager->cputiSInt; resultType = TypeInfoRetriver::CreateTypeInfo(); leftValue = true; } else if (genericType->GetTypeDescriptor() == description::GetTypeDescriptor()) { indexType = manager->cputiSInt; resultType = TypeInfoRetriver::CreateTypeInfo(); leftValue = true; } else if (genericType->GetTypeDescriptor() == description::GetTypeDescriptor()) { indexType = manager->cputiSInt; resultType = TypeInfoRetriver::CreateTypeInfo(); leftValue = true; } else if (genericType->GetTypeDescriptor() == description::GetTypeDescriptor()) { indexType = TypeInfoRetriver::CreateTypeInfo(); resultType = TypeInfoRetriver::CreateTypeInfo(); } else if (genericType->GetTypeDescriptor() == description::GetTypeDescriptor()) { indexType = TypeInfoRetriver::CreateTypeInfo(); resultType = TypeInfoRetriver::CreateTypeInfo(); leftValue = true; } else { manager->errors.Add(WfErrors::IndexOperatorOnWrongType(node, containerType.Obj())); } } GetExpressionType(manager, node->second, indexType); if (resultType) { if (leftValue) { results.Add(ResolveExpressionResult::WritableType(resultType)); } else { results.Add(ResolveExpressionResult::ReadonlyType(resultType)); } } } else { manager->errors.Add(WfErrors::IndexOperatorOnWrongType(node, containerType.Obj())); } } } else if (node->op == WfBinaryOperator::FlagAnd) { auto typeA = GetExpressionType(manager, node->first, expectedType); auto typeB = GetExpressionType(manager, node->second, expectedType); if (typeA && typeB) { if (typeA->GetDecorator() == ITypeInfo::TypeDescriptor && typeB->GetDecorator() == ITypeInfo::TypeDescriptor) { auto stringType = TypeInfoRetriver::CreateTypeInfo(); if (CanConvertToType(typeA.Obj(), stringType.Obj(), false) && CanConvertToType(typeB.Obj(), stringType.Obj(), false)) { results.Add(ResolveExpressionResult::ReadonlyType(stringType)); return; } else if (auto type = GetMergedType(typeA, typeB)) { if (type->GetTypeDescriptor()->GetTypeDescriptorFlags() != TypeDescriptorFlags::FlagEnum) { manager->errors.Add(WfErrors::IncorrectTypeForUnion(node->first.Obj(), type.Obj())); } results.Add(ResolveExpressionResult::ReadonlyType(type)); return; } } manager->errors.Add(WfErrors::CannotMergeTwoType(node, typeA.Obj(), typeB.Obj())); } } else if (node->op == WfBinaryOperator::FlagOr) { auto typeA = GetExpressionType(manager, node->first, expectedType); auto typeB = GetExpressionType(manager, node->second, expectedType); if (typeA && typeB) { if (typeA->GetDecorator() == ITypeInfo::TypeDescriptor && typeB->GetDecorator() == ITypeInfo::TypeDescriptor) { if (auto type = GetMergedType(typeA, typeB)) { if (type->GetTypeDescriptor()->GetTypeDescriptorFlags() != TypeDescriptorFlags::FlagEnum) { manager->errors.Add(WfErrors::IncorrectTypeForIntersect(node->first.Obj(), type.Obj())); } results.Add(ResolveExpressionResult::ReadonlyType(type)); return; } } manager->errors.Add(WfErrors::CannotMergeTwoType(node, typeA.Obj(), typeB.Obj())); } } else if (node->op == WfBinaryOperator::FailedThen) { Ptr firstType = GetExpressionType(manager, node->first, 0); bool depend = IsExpressionDependOnExpectedType(manager, node->second, firstType); Ptr secondType = GetExpressionType(manager, node->second, (depend ? firstType : nullptr)); if (firstType && secondType) { if (auto mergedType = GetMergedType(firstType, secondType)) { results.Add(ResolveExpressionResult::ReadonlyType(mergedType)); } else { manager->errors.Add(WfErrors::CannotMergeTwoType(node, firstType.Obj(), secondType.Obj())); } } } else { Ptr firstType = GetExpressionType(manager, node->first, 0); Ptr secondType = GetExpressionType(manager, node->second, 0); Ptr elementType; if (firstType && secondType) { if (!(elementType = GetMergedType(firstType, secondType))) { manager->errors.Add(WfErrors::CannotMergeTwoType(node, firstType.Obj(), secondType.Obj())); } } if (elementType) { TypeFlag flag = GetTypeFlag(elementType.Obj()); TypeFlag* selectedTable = 0; switch (node->op) { case WfBinaryOperator::Exp: { static TypeFlag conversionTable[(vint)TypeFlag::Count] = { /*Bool */TypeFlag::Unknown, /*I1 */TypeFlag::F4, /*I2 */TypeFlag::F4, /*I4 */TypeFlag::F8, /*I8 */TypeFlag::F8, /*U1 */TypeFlag::F4, /*U2 */TypeFlag::F4, /*U4 */TypeFlag::F8, /*U8 */TypeFlag::F8, /*F4 */TypeFlag::F4, /*F8 */TypeFlag::F8, /*String */TypeFlag::Unknown, /*Enum */TypeFlag::Unknown, /*Struct */TypeFlag::Unknown, /*Others */TypeFlag::Unknown, }; selectedTable = conversionTable; } break; case WfBinaryOperator::Add: case WfBinaryOperator::Sub: case WfBinaryOperator::Mul: case WfBinaryOperator::Div: { static TypeFlag conversionTable[(vint)TypeFlag::Count] = { /*Bool */TypeFlag::Unknown, /*I1 */TypeFlag::I4, /*I2 */TypeFlag::I4, /*I4 */TypeFlag::I4, /*I8 */TypeFlag::I8, /*U1 */TypeFlag::U4, /*U2 */TypeFlag::U4, /*U4 */TypeFlag::U4, /*U8 */TypeFlag::U8, /*F4 */TypeFlag::F4, /*F8 */TypeFlag::F8, /*String */TypeFlag::Unknown, /*Enum */TypeFlag::Unknown, /*Struct */TypeFlag::Unknown, /*Others */TypeFlag::Unknown, }; selectedTable = conversionTable; } break; case WfBinaryOperator::Mod: case WfBinaryOperator::Shl: case WfBinaryOperator::Shr: { static TypeFlag conversionTable[(vint)TypeFlag::Count] = { /*Bool */TypeFlag::Unknown, /*I1 */TypeFlag::I4, /*I2 */TypeFlag::I4, /*I4 */TypeFlag::I4, /*I8 */TypeFlag::I8, /*U1 */TypeFlag::U4, /*U2 */TypeFlag::U4, /*U4 */TypeFlag::U4, /*U8 */TypeFlag::U8, /*F4 */TypeFlag::Unknown, /*F8 */TypeFlag::Unknown, /*String */TypeFlag::Unknown, /*Enum */TypeFlag::Unknown, /*Struct */TypeFlag::Unknown, /*Others */TypeFlag::Unknown, }; selectedTable = conversionTable; } break; case WfBinaryOperator::LT: case WfBinaryOperator::GT: case WfBinaryOperator::LE: case WfBinaryOperator::GE: { static TypeFlag conversionTable[(vint)TypeFlag::Count] = { /*Bool */TypeFlag::Unknown, /*I1 */TypeFlag::Bool, /*I2 */TypeFlag::Bool, /*I4 */TypeFlag::Bool, /*I8 */TypeFlag::Bool, /*U1 */TypeFlag::Bool, /*U2 */TypeFlag::Bool, /*U4 */TypeFlag::Bool, /*U8 */TypeFlag::Bool, /*F4 */TypeFlag::Bool, /*F8 */TypeFlag::Bool, /*String */TypeFlag::Bool, /*Enum */TypeFlag::Unknown, /*Struct */TypeFlag::Unknown, /*Others */TypeFlag::Unknown, }; selectedTable = conversionTable; } break; case WfBinaryOperator::EQ: case WfBinaryOperator::NE: { results.Add(ResolveExpressionResult::ReadonlyType(TypeInfoRetriver::CreateTypeInfo())); return; } break; case WfBinaryOperator::Xor: case WfBinaryOperator::And: case WfBinaryOperator::Or: { static TypeFlag conversionTable[(vint)TypeFlag::Count] = { /*Bool */TypeFlag::Bool, /*I1 */TypeFlag::I1, /*I2 */TypeFlag::I2, /*I4 */TypeFlag::I4, /*I8 */TypeFlag::I8, /*U1 */TypeFlag::U1, /*U2 */TypeFlag::U2, /*U4 */TypeFlag::U4, /*U8 */TypeFlag::U8, /*F4 */TypeFlag::Unknown, /*F8 */TypeFlag::Unknown, /*String */TypeFlag::Unknown, /*Enum */TypeFlag::Unknown, /*Struct */TypeFlag::Unknown, /*Others */TypeFlag::Unknown, }; selectedTable = conversionTable; } break; default:; } TypeFlag resultFlag = selectedTable[(vint)flag]; if (resultFlag == TypeFlag::Unknown) { manager->errors.Add(WfErrors::BinaryOperatorOnWrongType(node, elementType.Obj())); } else { results.Add(ResolveExpressionResult::ReadonlyType(CreateTypeInfoFromTypeFlag(resultFlag))); } } } } void Visit(WfLetExpression* node)override { auto scope = manager->nodeScopes[node].Obj(); for (auto variable : node->variables) { auto symbol = scope->symbols[variable->name.value][0]; symbol->typeInfo = GetExpressionType(manager, variable->value, 0); if (symbol->typeInfo) { symbol->type = GetTypeFromTypeInfo(symbol->typeInfo.Obj()); } } Ptr type = GetExpressionType(manager, node->expression, expectedType); if (type) { results.Add(ResolveExpressionResult::ReadonlyType(type)); } } void Visit(WfIfExpression* node)override { Ptr boolType = TypeInfoRetriver::CreateTypeInfo(); GetExpressionType(manager, node->condition, boolType); Ptr firstType, secondType; if (expectedType) { firstType = GetExpressionType(manager, node->trueBranch, expectedType); secondType = GetExpressionType(manager, node->falseBranch, expectedType); } else { bool resolveFirst = !IsExpressionDependOnExpectedType(manager, node->trueBranch, false); bool resolveSecond = !IsExpressionDependOnExpectedType(manager, node->falseBranch, false); if (resolveFirst == resolveSecond) { firstType = GetExpressionType(manager, node->trueBranch, 0); secondType = GetExpressionType(manager, node->falseBranch, 0); } else if (resolveFirst) { firstType = GetExpressionType(manager, node->trueBranch, 0); secondType = GetExpressionType(manager, node->falseBranch, firstType); } else if (resolveSecond) { secondType = GetExpressionType(manager, node->falseBranch, 0); firstType = GetExpressionType(manager, node->trueBranch, secondType); } } if (firstType && !secondType) { results.Add(ResolveExpressionResult::ReadonlyType(firstType)); } else if (!firstType && secondType) { results.Add(ResolveExpressionResult::ReadonlyType(secondType)); } else if (firstType && secondType) { if (auto mergedType = GetMergedType(firstType, secondType)) { results.Add(ResolveExpressionResult::ReadonlyType(mergedType)); } else { manager->errors.Add(WfErrors::CannotMergeTwoType(node, firstType.Obj(), secondType.Obj())); } } } void Visit(WfRangeExpression* node)override { Ptr firstType = GetExpressionType(manager, node->begin, 0); Ptr secondType = GetExpressionType(manager, node->end, 0); Ptr elementType; if (firstType && !secondType) { elementType = firstType; } else if (!firstType && secondType) { elementType = secondType; } else if (firstType && secondType) { if (!(elementType = GetMergedType(firstType, secondType))) { manager->errors.Add(WfErrors::CannotMergeTwoType(node, firstType.Obj(), secondType.Obj())); } } if (elementType) { TypeFlag flag = GetTypeFlag(elementType.Obj()); switch (flag) { case TypeFlag::I1: case TypeFlag::I2: case TypeFlag::I4: case TypeFlag::I8: case TypeFlag::U1: case TypeFlag::U2: case TypeFlag::U4: case TypeFlag::U8: break; default: manager->errors.Add(WfErrors::RangeShouldBeInteger(node, elementType.Obj())); } auto enumerableType = Ptr(new TypeDescriptorTypeInfo(description::GetTypeDescriptor(), TypeInfoHint::Normal)); auto genericType = Ptr(new GenericTypeInfo(enumerableType)); genericType->AddGenericArgument(elementType); auto pointerType = Ptr(new SharedPtrTypeInfo(genericType)); results.Add(ResolveExpressionResult::ReadonlyType(pointerType)); } } void Visit(WfSetTestingExpression* node)override { Ptr elementType = GetExpressionType(manager, node->element, 0); if (auto range = node->collection.Cast()) { Ptr beginType = GetExpressionType(manager, range->begin, 0); Ptr endType = GetExpressionType(manager, range->end, 0); if (elementType && beginType) { if (!GetMergedType(elementType, beginType)) { manager->errors.Add(WfErrors::CannotMergeTwoType(node, elementType.Obj(), beginType.Obj())); } } if (elementType && endType) { if (!GetMergedType(elementType, endType)) { manager->errors.Add(WfErrors::CannotMergeTwoType(node, elementType.Obj(), endType.Obj())); } } } else { Ptr itemType = GetEnumerableExpressionItemType(manager, node->collection, 0); if (elementType && itemType) { if (!GetMergedType(elementType, itemType)) { manager->errors.Add(WfErrors::CannotMergeTwoType(node, elementType.Obj(), itemType.Obj())); } } } results.Add(ResolveExpressionResult::ReadonlyType(TypeInfoRetriver::CreateTypeInfo())); } void Visit(WfConstructorExpression* node)override { if (expectedType && expectedType->GetTypeDescriptor()->GetTypeDescriptorFlags() == TypeDescriptorFlags::Struct) { SortedList fields; for (auto argument : node->arguments) { if (!argument->value) { manager->errors.Add(WfErrors::ConstructorMixStructAndList(node)); return; } else if (auto field = argument->key.Cast()) { if (auto prop = expectedType->GetTypeDescriptor()->GetPropertyByName(field->name.value, true)) { if (fields.Contains(field->name.value)) { manager->errors.Add(WfErrors::DuplicatedConstructorField(field.Obj())); } else { fields.Add(field->name.value); } GetExpressionType(manager, argument->value, CopyTypeInfo(prop->GetReturn())); } else { manager->errors.Add(WfErrors::MemberNotExists(field.Obj(), expectedType->GetTypeDescriptor(), field->name.value)); } } else { manager->errors.Add(WfErrors::ConstructorMixStructAndList(argument->value.Obj())); } } results.Add(ResolveExpressionResult::ReadonlyType(expectedType)); } else if (node->arguments.Count() == 0) { if (expectedType) { ITypeDescriptor* td = expectedType->GetTypeDescriptor(); if (!td->CanConvertTo(description::GetTypeDescriptor()) && !td->CanConvertTo(description::GetTypeDescriptor())) { manager->errors.Add(WfErrors::ConstructorCannotImplicitlyConvertToType(node, expectedType.Obj())); } results.Add(ResolveExpressionResult::ReadonlyType(expectedType)); } else { manager->errors.Add(WfErrors::ConstructorCannotResolveType(node)); } } else { Ptr expectedKeyType; Ptr expectedValueType; if (expectedType) { if (expectedType->GetDecorator() == ITypeInfo::SharedPtr) { auto genericType = expectedType->GetElementType(); if (genericType->GetDecorator() == ITypeInfo::Generic) { if (genericType->GetTypeDescriptor() == description::GetTypeDescriptor() || genericType->GetTypeDescriptor() == description::GetTypeDescriptor()) { if (genericType->GetGenericArgumentCount() == 2) { expectedKeyType = Ptr(genericType->GetGenericArgument(0)); expectedValueType = Ptr(genericType->GetGenericArgument(1)); } } else if (genericType->GetTypeDescriptor() == description::GetTypeDescriptor() || genericType->GetTypeDescriptor() == description::GetTypeDescriptor() || genericType->GetTypeDescriptor() == description::GetTypeDescriptor() || genericType->GetTypeDescriptor() == description::GetTypeDescriptor() || genericType->GetTypeDescriptor() == description::GetTypeDescriptor()) { if (genericType->GetGenericArgumentCount() == 1) { expectedKeyType = Ptr(genericType->GetGenericArgument(0)); } } } } } bool map = node->arguments[0]->value; Ptr keyType, valueType; for (auto argument : node->arguments) { { Ptr newKeyType = GetExpressionType(manager, argument->key, expectedKeyType); if (!keyType) { keyType = newKeyType; } else if (auto mergedType = GetMergedType(keyType, newKeyType)) { keyType = mergedType; } else { manager->errors.Add(WfErrors::CannotMergeTwoType(node, keyType.Obj(), newKeyType.Obj())); } } if (map) { Ptr newValueType = GetExpressionType(manager, argument->value, expectedValueType); if (!valueType) { valueType = newValueType; } else if (auto mergedType = GetMergedType(valueType, newValueType)) { valueType = mergedType; } else { manager->errors.Add(WfErrors::CannotMergeTwoType(node, valueType.Obj(), newValueType.Obj())); } } } if (map) { if (keyType && valueType) { auto classType = Ptr(new TypeDescriptorTypeInfo(description::GetTypeDescriptor(), TypeInfoHint::Normal)); auto genericType = Ptr(new GenericTypeInfo(classType)); genericType->AddGenericArgument(keyType); genericType->AddGenericArgument(valueType); auto pointerType = Ptr(new SharedPtrTypeInfo(genericType)); results.Add(ResolveExpressionResult::ReadonlyType(pointerType)); } } else { if (keyType) { Ptr classType; if (expectedType) { switch (expectedType->GetHint()) { case TypeInfoHint::ObservableList: classType = Ptr(new TypeDescriptorTypeInfo(description::GetTypeDescriptor(), expectedType->GetHint())); break; case TypeInfoHint::Array: classType = Ptr(new TypeDescriptorTypeInfo(description::GetTypeDescriptor(), expectedType->GetHint())); break; case TypeInfoHint::Normal: if (expectedType->GetTypeDescriptor() == description::GetTypeDescriptor()) { classType = Ptr(new TypeDescriptorTypeInfo(description::GetTypeDescriptor(), expectedType->GetHint())); } else { classType = Ptr(new TypeDescriptorTypeInfo(description::GetTypeDescriptor(), expectedType->GetHint())); } break; default: classType = Ptr(new TypeDescriptorTypeInfo(description::GetTypeDescriptor(), expectedType->GetHint())); } } else { classType = Ptr(new TypeDescriptorTypeInfo(description::GetTypeDescriptor(), TypeInfoHint::Normal)); } auto genericType = Ptr(new GenericTypeInfo(classType)); genericType->AddGenericArgument(keyType); auto pointerType = Ptr(new SharedPtrTypeInfo(genericType)); results.Add(ResolveExpressionResult::ReadonlyType(pointerType)); } } } } void Visit(WfInferExpression* node)override { auto scope = manager->nodeScopes[node].Obj(); Ptr type = CreateTypeInfoFromType(scope, node->type); Ptr expressionType = GetExpressionType(manager, node->expression, type); if (expressionType) { results.Add(ResolveExpressionResult::ReadonlyType(type)); } } void Visit(WfTypeCastingExpression* node)override { auto scope = manager->nodeScopes[node].Obj(); if (auto type = CreateTypeInfoFromType(scope, node->type)) { if (auto expressionType = GetExpressionType(manager, node->expression, 0)) { if (!CanConvertToType(expressionType.Obj(), type.Obj(), true)) { manager->errors.Add(WfErrors::ExpressionCannotExplicitlyConvertToType(node->expression.Obj(), expressionType.Obj(), type.Obj())); } } if (node->strategy == WfTypeCastingStrategy::Weak) { switch (type->GetDecorator()) { case ITypeInfo::RawPtr: case ITypeInfo::SharedPtr: case ITypeInfo::Nullable: break; default: manager->errors.Add(WfErrors::CannotWeakCastToType(node->expression.Obj(), type.Obj())); } } results.Add(ResolveExpressionResult::ReadonlyType(type)); } } void Visit(WfTypeTestingExpression* node)override { Ptr type = GetExpressionType(manager, node->expression, 0); if (type) { switch (node->test) { case WfTypeTesting::IsNull: case WfTypeTesting::IsNotNull: if (!IsNullAcceptableType(type.Obj())) { manager->errors.Add(WfErrors::NullCannotImplicitlyConvertToType(node->expression.Obj(), type.Obj())); } break; default:; } } results.Add(ResolveExpressionResult::ReadonlyType(TypeInfoRetriver::CreateTypeInfo())); } void Visit(WfTypeOfTypeExpression* node)override { results.Add(ResolveExpressionResult::ReadonlyType(TypeInfoRetriver::CreateTypeInfo())); } void Visit(WfTypeOfExpressionExpression* node)override { GetExpressionType(manager, node->expression, 0); results.Add(ResolveExpressionResult::ReadonlyType(TypeInfoRetriver::CreateTypeInfo())); } void Visit(WfAttachEventExpression* node)override { IEventInfo* eventInfo = GetExpressionEventInfo(manager, node->event); Ptr functionType; if (eventInfo) { functionType = CopyTypeInfo(eventInfo->GetHandlerType()); } GetExpressionType(manager, node->function, functionType); results.Add(ResolveExpressionResult::ReadonlyType(TypeInfoRetriver>::CreateTypeInfo())); } void Visit(WfDetachEventExpression* node)override { GetExpressionEventInfo(manager, node->event); Ptr pointerType = TypeInfoRetriver>::CreateTypeInfo(); GetExpressionType(manager, node->handler, pointerType); results.Add(ResolveExpressionResult::ReadonlyType(TypeInfoRetriver::CreateTypeInfo())); } void Visit(WfObserveExpression* node)override { Ptr parentType = GetExpressionType(manager, node->parent, 0); Ptr observeeType; if (parentType) { if (node->observeType == WfObserveType::SimpleObserve) { ITypeDescriptor* td = parentType->GetTypeDescriptor(); IPropertyInfo* propertyInfo = 0; { auto ref = node->expression.Cast(); propertyInfo = td->GetPropertyByName(ref->name.value, true); if (propertyInfo) { observeeType = CopyTypeInfo(propertyInfo->GetReturn()); manager->expressionResolvings.Add(node->expression, ResolveExpressionResult::Property(propertyInfo)); } else { manager->errors.Add(WfErrors::MemberNotExists(ref.Obj(), td, ref->name.value)); } } if (node->events.Count() == 0) { if (propertyInfo) { IEventInfo* eventInfo = propertyInfo->GetValueChangedEvent(); if (!eventInfo) { eventInfo = td->GetEventByName(propertyInfo->GetName() + L"Changed", true); } if (!eventInfo) { manager->errors.Add(WfErrors::MemberNotExists(node->expression.Obj(), td, propertyInfo->GetName() + L"Changed")); } } } else { for (auto eventExpr : node->events) { auto ref = eventExpr.Cast(); IEventInfo* info = td->GetEventByName(ref->name.value, true); if (info) { manager->expressionResolvings.Add(eventExpr, ResolveExpressionResult::Event(info)); } else if (!info) { manager->errors.Add(WfErrors::MemberNotExists(ref.Obj(), td, ref->name.value)); } } } } else { auto scope = manager->nodeScopes[node].Obj(); auto symbol = scope->symbols[node->name.value][0]; symbol->typeInfo = parentType; symbol->type = GetTypeFromTypeInfo(parentType.Obj()); observeeType = GetExpressionType(manager, node->expression, 0); for (auto eventExpr : node->events) { GetExpressionEventInfo(manager, eventExpr); } } } if (observeeType) { results.Add(ResolveExpressionResult::ReadonlyType(observeeType)); } } void Visit(WfCallExpression* node)override { List functions; GetExpressionTypes(manager, node->function, nullptr, true, functions); vint selectedFunctionIndex = -1; Ptr resultType = SelectFunction(manager, node, node->function, functions, node->arguments, selectedFunctionIndex); if (resultType) { manager->expressionResolvings.Add(node->function, functions[selectedFunctionIndex]); results.Add(ResolveExpressionResult::ReadonlyType(resultType)); } } void Visit(WfFunctionExpression* node)override { ValidateDeclarationSemantic(manager, node->function); auto scope = manager->nodeScopes[node->function.Obj()].Obj(); auto classType = Ptr(new TypeDescriptorTypeInfo(description::GetTypeDescriptor(), TypeInfoHint::Normal)); auto genericType = Ptr(new GenericTypeInfo(classType)); genericType->AddGenericArgument(CreateTypeInfoFromType(scope, node->function->returnType)); for (auto argument : node->function->arguments) { genericType->AddGenericArgument(scope->symbols[argument->name.value][0]->typeInfo); } auto pointerType = Ptr(new SharedPtrTypeInfo(genericType)); results.Add(ResolveExpressionResult::ReadonlyType(pointerType)); } Ptr GetFunctionDeclarationType(WfLexicalScope* scope, Ptr decl) { Ptr symbol = From(manager->nodeScopes[decl.Obj()]->parentScope->symbols[decl->name.value]) .Where([decl](Ptr symbol) { return symbol->creatorNode == decl; }) .First(); return symbol->typeInfo; } class NewInterfaceExpressionVisitor : public empty_visitor::DeclarationVisitor { public: WfLexicalScopeManager* manager; List> overrideFunctions; List> variableSymbols; WfFunctionDeclaration* lastFunction = nullptr; NewInterfaceExpressionVisitor(WfLexicalScopeManager* _manager) :manager(_manager) { } void Dispatch(WfVirtualCfeDeclaration* node)override { for (auto decl : node->expandedDeclarations) { decl->Accept(this); } } void Dispatch(WfVirtualCseDeclaration* node)override { CHECK_FAIL(L"NewInterfaceExpressionVisitor::Visit(WfVirtualCseDeclaration*)#Internal error, Temporary not supported."); } void Visit(WfFunctionDeclaration* node)override { lastFunction = node; if (node->functionKind == WfFunctionKind::Override) { overrideFunctions.Add(Ptr(node)); } } void Visit(WfVariableDeclaration* node)override { variableSymbols.Add( From(manager->nodeScopes[node]->symbols[node->name.value]) .Where([=](Ptr symbol) { return symbol->creatorNode == node; }) .First() ); } void Execute(WfNewInterfaceExpression* node) { for (auto memberDecl : node->declarations) { memberDecl->Accept(this); ValidateDeclarationSemantic(manager, memberDecl); } } }; void Visit(WfNewClassExpression* node)override { auto scope = manager->nodeScopes[node].Obj(); Ptr type = CreateTypeInfoFromType(scope, node->type); if (type) { ITypeDescriptor* td = type->GetTypeDescriptor(); IMethodGroupInfo* ctors = td->GetConstructorGroup(); Ptr selectedType; IMethodInfo* selectedConstructor = nullptr; if (!ctors || ctors->GetMethodCount() == 0) { manager->errors.Add(WfErrors::ClassContainsNoConstructor(node, type.Obj())); } else { if ((td->GetTypeDescriptorFlags() & TypeDescriptorFlags::ClassType) != TypeDescriptorFlags::Undefined) { List functions; for (vint i = 0; i < ctors->GetMethodCount(); i++) { IMethodInfo* info = ctors->GetMethod(i); functions.Add(ResolveExpressionResult::Method(info)); } vint selectedFunctionIndex = -1; selectedType = SelectFunction(manager, node, nullptr, functions, node->arguments, selectedFunctionIndex); if (selectedType) { selectedConstructor = functions[selectedFunctionIndex].methodInfo; } } else if ((td->GetTypeDescriptorFlags() & TypeDescriptorFlags::InterfaceType) != TypeDescriptorFlags::Undefined) { manager->errors.Add(WfErrors::ConstructorMixClassAndInterface(node)); } else { manager->errors.Add(WfErrors::ClassContainsNoConstructor(node, type.Obj())); } } if (selectedType) { auto result = ResolveExpressionResult::Constructor(selectedConstructor); if (!IsSameType(selectedType.Obj(), type.Obj())) { manager->errors.Add(WfErrors::ConstructorReturnTypeMismatched(node, result, selectedType.Obj(), type.Obj())); } results.Add(result); } } } void Visit(WfNewInterfaceExpression* node)override { auto scope = manager->nodeScopes[node].Obj(); Ptr type = CreateTypeInfoFromType(scope, node->type); if (type) { ITypeDescriptor* td = type->GetTypeDescriptor(); IMethodGroupInfo* ctors = td->GetConstructorGroup(); Ptr selectedType; IMethodInfo* selectedConstructor = nullptr; scope->typeOfThisExpr = td; if (!ctors || ctors->GetMethodCount() == 0) { manager->errors.Add(WfErrors::ClassContainsNoConstructor(node, type.Obj())); } else { if ((td->GetTypeDescriptorFlags() & TypeDescriptorFlags::ClassType) != TypeDescriptorFlags::Undefined) { manager->errors.Add(WfErrors::ConstructorMixClassAndInterface(node)); } else if ((td->GetTypeDescriptorFlags() & TypeDescriptorFlags::InterfaceType) != TypeDescriptorFlags::Undefined) { if (auto info = FindInterfaceConstructor(td)) { selectedType = CopyTypeInfo(info->GetReturn()); selectedConstructor = info; } else { manager->errors.Add(WfErrors::InterfaceContainsNoConstructor(node, type.Obj())); } Group interfaceMethods; Group> implementMethods; { NewInterfaceExpressionVisitor declVisitor(manager); declVisitor.Execute(node); if (declVisitor.lastFunction) { for (auto func : declVisitor.overrideFunctions) { implementMethods.Add(func->name.value, func); } auto capture = manager->lambdaCaptures[declVisitor.lastFunction]; List> readonlySymbols; CopyFrom(readonlySymbols, From(capture->symbols).Except(declVisitor.variableSymbols)); CopyFrom(capture->symbols, declVisitor.variableSymbols); CopyFrom(capture->symbols, readonlySymbols, true); } } { SortedList searchedTypes; List types; types.Add(td); vint begin = 0; while (begin < types.Count()) { ITypeDescriptor* currentType = types[begin++]; if (searchedTypes.Contains(currentType)) { continue; } searchedTypes.Add(currentType); vint count = currentType->GetBaseTypeDescriptorCount(); for (vint i = 0; i < count; i++) { types.Add(currentType->GetBaseTypeDescriptor(i)); } count = currentType->GetMethodGroupCount(); for (vint i = 0; i < count; i++) { IMethodGroupInfo* group = currentType->GetMethodGroup(i); vint methodCount = group->GetMethodCount(); for (vint j = 0; j < methodCount; j++) { auto method = group->GetMethod(j); if (!method->IsStatic()) { interfaceMethods.Add(group->GetName(), method); } } } } } auto discardFirst = [=, this](const WString& key, const List& methods) { for (auto method : methods) { manager->errors.Add(WfErrors::InterfaceMethodNotImplemented(node, method)); } }; auto discardSecond = [=, this](const WString& key, const List>& methods) { for (auto decl : methods) { Ptr declType = GetFunctionDeclarationType(scope, decl); manager->errors.Add(WfErrors::InterfaceMethodNotFound(decl.Obj(), type.Obj(), declType.Obj())); } }; GroupInnerJoin( interfaceMethods, implementMethods, discardFirst, discardSecond, [=, this](const WString& key, const List& interfaces, const List>& implements) { Group typedInterfaceMethods; Group> typedImplementMethods; for (auto method : interfaces) { Ptr methodType = CreateTypeInfoFromMethodInfo(method); typedInterfaceMethods.Add(methodType->GetTypeFriendlyName(), method); } for (auto decl : implements) { Ptr methodType = GetFunctionDeclarationType(scope, decl); typedImplementMethods.Add(methodType->GetTypeFriendlyName(), decl); } GroupInnerJoin( typedInterfaceMethods, typedImplementMethods, discardFirst, discardSecond, [=, this](const WString& key, const List& interfaces, const List>& implements) { if (interfaces.Count() > 1) { List functions; for (auto method : interfaces) { functions.Add(ResolveExpressionResult::Constructor(method)); manager->errors.Add(WfErrors::CannotPickOverloadedInterfaceMethods(node, functions)); } } if (implements.Count() > 1) { auto decl = implements[0]; Ptr methodType = GetFunctionDeclarationType(scope, decl); manager->errors.Add(WfErrors::CannotPickOverloadedImplementMethods(decl.Obj(), methodType.Obj())); } if (interfaces.Count() == 1 && implements.Count() == 1) { manager->interfaceMethodImpls.Add(implements[0].Obj(), interfaces[0]); } }); }); } else { manager->errors.Add(WfErrors::ClassContainsNoConstructor(node, type.Obj())); } } if (selectedType) { auto result = ResolveExpressionResult::Constructor(selectedConstructor); if (!IsSameType(selectedType.Obj(), type.Obj())) { manager->errors.Add(WfErrors::ConstructorReturnTypeMismatched(node, result, selectedType.Obj(), type.Obj())); } results.Add(result); } } } void Visit(WfVirtualCfeExpression* node)override { if (GetExpressionType(manager, node->expandedExpression, expectedType)) { results.Add(manager->expressionResolvings[node->expandedExpression.Obj()]); } } void Visit(WfVirtualCseExpression* node)override { bool expanded = node->expandedExpression; vint errorCount = manager->errors.Count(); node->Accept((WfVirtualCseExpression::IVisitor*)this); if (!expanded && manager->errors.Count() == errorCount) { ExpandVirtualExpressionVisitor visitor(manager, expectedType); node->Accept(&visitor); if (!node->expandedExpression) { return; } SetCodeRange(node->expandedExpression, node->codeRange); auto parentScope = manager->nodeScopes[node]; if (parentScope->ownerNode == node) { parentScope = parentScope->parentScope; } ContextFreeExpressionDesugar(manager, node->expandedExpression); BuildScopeForExpression(manager, parentScope, node->expandedExpression); manager->checkedScopes_DuplicatedSymbol.Remove(parentScope.Obj()); manager->checkedScopes_SymbolType.Remove(parentScope.Obj()); if (!CheckScopes_DuplicatedSymbol(manager) || !CheckScopes_SymbolType(manager)) { return; } } if (node->expandedExpression) { if (results.Count() == 1) { GetExpressionType(manager, node->expandedExpression, results[0].type); } else { GetExpressionType(manager, node->expandedExpression, nullptr); } } } void Visit(WfBindExpression* node)override { GetExpressionType(manager, node->expression, 0); results.Add(ResolveExpressionResult::ReadonlyType(TypeInfoRetriver>::CreateTypeInfo())); } void Visit(WfNewCoroutineExpression* node)override { Ptr typeInfo = TypeInfoRetriver>::CreateTypeInfo(); results.Add(ResolveExpressionResult::ReadonlyType(typeInfo)); ValidateStatementSemantic(manager, node->statement); } void Visit(WfMixinCastExpression* node)override { auto scope = manager->nodeScopes[node].Obj(); auto type = CreateTypeInfoFromType(scope, node->type); auto expressionType = GetExpressionType(manager, node->expression, 0); if (type && expressionType) { results.Add(ResolveExpressionResult::ReadonlyType(type)); if (expressionType) { auto fromTd = expressionType->GetTypeDescriptor(); auto toTd = type->GetTypeDescriptor(); if ((fromTd->GetTypeDescriptorFlags() & TypeDescriptorFlags::InterfaceType) != TypeDescriptorFlags::Undefined) { if ((toTd->GetTypeDescriptorFlags() & TypeDescriptorFlags::InterfaceType) != TypeDescriptorFlags::Undefined) { if (fromTd != toTd && toTd->CanConvertTo(fromTd)) { goto PASS_VALIDATION; } } } manager->errors.Add(WfErrors::WrongMixinTargetType(node, type.Obj(), expressionType.Obj())); PASS_VALIDATION:; } } } void Visit(WfExpectedTypeCastExpression* node)override { GetExpressionType(manager, node->expression, nullptr); if (expectedType) { results.Add(ResolveExpressionResult::ReadonlyType(expectedType)); } else { manager->errors.Add(WfErrors::ExpectedTypeCastCannotResolveType(node)); } } void Visit(WfCoOperatorExpression* node)override { auto scope = manager->nodeScopes[node].Obj(); auto functionScope = scope->FindFunctionScope(); if (auto funcDecl = functionScope->ownerNode.Cast()) { if (funcDecl->statement.Cast()) { auto providerScope = manager->nodeScopes[funcDecl->statement.Obj()]; auto providerSymbol = providerScope->symbols[L"$PROVIDER"][0]; auto implSymbol = providerScope->symbols[L"$IMPL"][0]; if (providerSymbol->typeInfo && implSymbol->typeInfo) { List methods; if (auto group = providerSymbol->typeInfo->GetTypeDescriptor()->GetMethodGroupByName(L"QueryContext", true)) { vint count = group->GetMethodCount(); for (vint i = 0; i < count; i++) { auto method = group->GetMethod(i); if (method->IsStatic()) { if (method->GetParameterCount() == 1 && IsSameType(implSymbol->typeInfo.Obj(), method->GetParameter(0)->GetType())) { methods.Add(ResolveExpressionResult::Method(method)); } } } } if (methods.Count() > 1) { manager->errors.Add(WfErrors::CannotPickOverloadedFunctions(node, methods)); } else if (methods.Count() == 1) { auto contextType = methods[0].methodInfo->GetReturn(); SortedList searchedTypes; manager->ResolveMember(contextType->GetTypeDescriptor(), node->name.value, false, searchedTypes, results); if (results.Count() == 0) { manager->errors.Add(WfErrors::MemberNotExists(node, contextType->GetTypeDescriptor(), node->name.value)); } } else { manager->errors.Add(WfErrors::CoOperatorNotExists(node, providerSymbol->typeInfo.Obj())); } } } } } static void Execute(WfExpression* expression, WfLexicalScopeManager* manager, Ptr expectedType, List& results) { ValidateSemanticExpressionVisitor visitor(manager, expectedType, results); expression->Accept(&visitor); } }; /*********************************************************************** IsConstantExpression ***********************************************************************/ class ValidateConstantExpressionVisitor : public empty_visitor::ExpressionVisitor , public empty_visitor::VirtualCseExpressionVisitor { public: WfLexicalScopeManager* manager; bool isConstant = false; ValidateConstantExpressionVisitor(WfLexicalScopeManager* _manager) :manager(_manager) { } bool Call(Ptr node) { bool cache = isConstant; isConstant = false; node->Accept(this); bool result = isConstant; isConstant = cache; return result; } void VisitReferenceExpression(WfExpression* node, const WString& name) { auto result = manager->expressionResolvings[node]; if (auto enumType = result.type->GetTypeDescriptor()->GetEnumType()) { vint index = enumType->IndexOfItem(name); if (index != -1) { isConstant = true; } } } void Dispatch(WfVirtualCfeExpression* node)override { node->expandedExpression->Accept(this); } void Dispatch(WfVirtualCseExpression* node)override { node->Accept((WfVirtualCseExpression::IVisitor*)this); } void Visit(WfReferenceExpression* node)override { VisitReferenceExpression(node, node->name.value); } void Visit(WfChildExpression* node)override { VisitReferenceExpression(node, node->name.value); } void Visit(WfLiteralExpression* node)override { isConstant = true; } void Visit(WfFloatingExpression* node)override { isConstant = true; } void Visit(WfIntegerExpression* node)override { isConstant = true; } void Visit(WfStringExpression* node)override { isConstant = true; } /* void Visit(WfUnaryExpression* node)override { isConstant = Call(node->operand); } void Visit(WfBinaryExpression* node)override { if (node->op == WfBinaryOperator::FlagAnd || node->op == WfBinaryOperator::FlagOr) { isConstant = Call(node->first) && Call(node->second); } } void Visit(WfRangeExpression* node)override { isConstant = Call(node->begin) && Call(node->end); } void Visit(WfConstructorExpression* node)override { auto result = manager->expressionResolvings[node]; bool isStruct = (result.type->GetTypeDescriptor()->GetTypeDescriptorFlags() == TypeDescriptorFlags::Struct); for (auto argument : node->arguments) { if (argument->key && !isStruct) { if (!Call(argument->key)) return; } if (argument->value) { if (!Call(argument->value)) return; } } isConstant = true; } */ void Visit(WfTypeOfTypeExpression* node)override { isConstant = true; } void Visit(WfTypeOfExpressionExpression* node)override { isConstant = true; } static void Execute(WfExpression* expression, WfLexicalScopeManager* manager, Ptr expectedType) { if (GetExpressionType(manager, expression, expectedType)) { ValidateConstantExpressionVisitor visitor(manager); expression->Accept(&visitor); if (!visitor.isConstant) { manager->errors.Add(WfErrors::ExpressionIsNotConstant(expression)); } } } }; /*********************************************************************** ValidateSemantic ***********************************************************************/ void ValidateExpressionSemantic(WfLexicalScopeManager* manager, WfExpression* expression, Ptr expectedType, collections::List& results) { ValidateSemanticExpressionVisitor::Execute(expression, manager, expectedType, results); for (vint i = results.Count() - 1; i >= 0; i--) { auto result = results[i]; if (result.scopeName && result.scopeName->declarations.Count() > 0) { List replaces; for (auto decl : result.scopeName->declarations) { vint index = manager->nodeScopes.Keys().IndexOf(decl.Obj()); if (index == -1) continue; auto scope = manager->nodeScopes.Values()[index]; if (scope->ownerNode == decl) { scope = scope->parentScope; } index = scope->symbols.Keys().IndexOf(decl->name.value); if (index == -1) continue; for (auto symbol : scope->symbols.GetByIndex(index)) { if (symbol->creatorNode == decl && symbol->typeInfo) { replaces.Add(ResolveExpressionResult::Symbol(symbol)); } } } if (replaces.Count() > 0) { results.RemoveAt(i); for (auto [replaceResult, index] : indexed(replaces)) { results.Insert(i + index, replaceResult); } } } } } void ValidateExpressionSemantic(WfLexicalScopeManager* manager, Ptr expression, Ptr expectedType, collections::List& results) { ValidateExpressionSemantic(manager, expression.Obj(), expectedType, results); } void ValidateConstantExpression(WfLexicalScopeManager* manager, WfExpression* expression, Ptr expectedType) { ValidateConstantExpressionVisitor::Execute(expression, manager, expectedType); } void ValidateConstantExpression(WfLexicalScopeManager* manager, Ptr expression, Ptr expectedType) { ValidateConstantExpressionVisitor::Execute(expression.Obj(), manager, expectedType); } } } } /*********************************************************************** .\ANALYZER\WFANALYZER_VALIDATESEMANTIC_STATEMENT.CPP ***********************************************************************/ namespace vl { namespace workflow { namespace analyzer { using namespace collections; using namespace reflection; using namespace reflection::description; using namespace typeimpl; /*********************************************************************** ValidateSemantic(Statement) ***********************************************************************/ class ExpandVirtualStatementVisitor : public Object, public WfVirtualCseStatement::IVisitor { public: WfLexicalScopeManager* manager; ExpandVirtualStatementVisitor(WfLexicalScopeManager* _manager) :manager(_manager) { } void Visit(WfSwitchStatement* node)override { ExpandSwitchStatement(manager, node); } void Visit(WfForEachStatement* node)override { ExpandForEachStatement(manager, node); } void Visit(WfCoProviderStatement* node)override { ExpandCoProviderStatement(manager, node); } }; class ValidateSemanticStatementVisitor : public Object , public WfStatement::IVisitor , public WfVirtualCseStatement::IVisitor , public WfCoroutineStatement::IVisitor , public WfStateMachineStatement::IVisitor { public: WfLexicalScopeManager* manager; ValidateSemanticStatementVisitor(WfLexicalScopeManager* _manager) :manager(_manager) { } void Visit(WfBreakStatement* node)override { } void Visit(WfContinueStatement* node)override { } void Visit(WfReturnStatement* node)override { auto scope = manager->nodeScopes[node].Obj(); auto functionScope = scope->FindFunctionScope(); if (auto funcDecl = functionScope->ownerNode.Cast()) { auto providerStat = funcDecl->statement.Cast(); if (providerStat && !providerStat->expandedStatement) { auto providerScope = manager->nodeScopes[funcDecl->statement.Obj()]; auto providerSymbol = providerScope->symbols[L"$PROVIDER"][0]; auto implSymbol = providerScope->symbols[L"$IMPL"][0]; if (providerSymbol->typeInfo && implSymbol->typeInfo) { if (auto group = providerSymbol->typeInfo->GetTypeDescriptor()->GetMethodGroupByName(L"ReturnAndExit", true)) { List functions; vint count = group->GetMethodCount(); for (vint i = 0; i < count; i++) { auto method = group->GetMethod(i); if (method->IsStatic()) { if (method->GetParameterCount() > 0 && IsSameType(implSymbol->typeInfo.Obj(), method->GetParameter(0)->GetType())) { functions.Add(ResolveExpressionResult::Method(method)); } } } if (functions.Count() != 0) { vint selectedFunctionIndex = -1; List> arguments; arguments.Add(nullptr); if (node->expression) { arguments.Add(node->expression); } SelectFunction(manager, node, nullptr, functions, arguments, selectedFunctionIndex); if (selectedFunctionIndex != -1) { manager->coOperatorResolvings.Add(Ptr(node), functions[selectedFunctionIndex]); } } else { manager->errors.Add(WfErrors::CoOperatorNotExists(node, providerSymbol->typeInfo.Obj())); } } else { manager->errors.Add(WfErrors::CoOperatorNotExists(node, providerSymbol->typeInfo.Obj())); } } } else { auto returnType = CreateTypeInfoFromType(scope, funcDecl->returnType); if (node->expression) { if (returnType->GetTypeDescriptor() == description::GetTypeDescriptor()) { manager->errors.Add(WfErrors::CannotReturnExpression(node)); } else { GetExpressionType(manager, node->expression, returnType); } } else if (returnType->GetDecorator() != ITypeInfo::TypeDescriptor || returnType->GetTypeDescriptor() != description::GetTypeDescriptor()) { manager->errors.Add(WfErrors::ReturnMissExpression(node, returnType.Obj())); } } } else { if (node->expression) { manager->errors.Add(WfErrors::CannotReturnExpression(node)); } } } void Visit(WfDeleteStatement* node)override { Ptr type = GetExpressionType(manager, node->expression, 0); if (type) { if (type->GetDecorator() != ITypeInfo::RawPtr) { manager->errors.Add(WfErrors::DeleteNonRawPointer(node, type.Obj())); } } } void Visit(WfRaiseExceptionStatement* node)override { if (node->expression) { if (auto type = GetExpressionType(manager, node->expression, nullptr)) { auto stringType = TypeInfoRetriver::CreateTypeInfo(); auto exceptionType = TypeInfoRetriver>::CreateTypeInfo(); if (!CanConvertToType(type.Obj(), stringType.Obj(), false) && !CanConvertToType(type.Obj(), exceptionType.Obj(), false)) { manager->errors.Add(WfErrors::ExpressionCannotImplicitlyConvertToType(node->expression.Obj(), type.Obj(), stringType.Obj())); } } } } void Visit(WfIfStatement* node)override { if (node->type) { auto scope = manager->nodeScopes[node].Obj(); auto symbol = scope->symbols[node->name.value][0]; if (!IsNullAcceptableType(symbol->typeInfo.Obj())) { manager->errors.Add(WfErrors::NullCannotImplicitlyConvertToType(node->expression.Obj(), symbol->typeInfo.Obj())); } GetExpressionType(manager, node->expression, nullptr); } else { Ptr boolType = TypeInfoRetriver::CreateTypeInfo(); GetExpressionType(manager, node->expression, boolType); } ValidateStatementSemantic(manager, node->trueBranch); if (node->falseBranch) { ValidateStatementSemantic(manager, node->falseBranch); } } void Visit(WfWhileStatement* node)override { Ptr boolType = TypeInfoRetriver::CreateTypeInfo(); GetExpressionType(manager, node->condition, boolType); ValidateStatementSemantic(manager, node->statement); } void Visit(WfTryStatement* node)override { ValidateStatementSemantic(manager, node->protectedStatement); if (node->catchStatement) { ValidateStatementSemantic(manager, node->catchStatement); } if (node->finallyStatement) { ValidateStatementSemantic(manager, node->finallyStatement); } } void Visit(WfBlockStatement* node)override { for (auto statement : node->statements) { ValidateStatementSemantic(manager, statement); } } void Visit(WfGotoStatement* node)override { auto scope = manager->nodeScopes[node].Obj(); vint counter = 0; while (scope && !scope->functionConfig) { if (auto block = scope->ownerNode.Cast()) { if (block->endLabel.value == node->label.value) { counter++; } } scope = scope->parentScope.Obj(); } if (counter == 0) { manager->errors.Add(WfErrors::GotoLabelNotExists(node)); } else if (counter > 1) { manager->errors.Add(WfErrors::TooManyGotoLabel(node)); } } void Visit(WfExpressionStatement* node)override { GetExpressionType(manager, node->expression, 0); } void Visit(WfVariableStatement* node)override { ValidateDeclarationSemantic(manager, node->variable); } void Visit(WfVirtualCseStatement* node)override { bool expanded = node->expandedStatement; vint errorCount = manager->errors.Count(); node->Accept((WfVirtualCseStatement::IVisitor*)this); if (!expanded && manager->errors.Count() == errorCount) { ExpandVirtualStatementVisitor visitor(manager); node->Accept(&visitor); SetCodeRange(node->expandedStatement, node->codeRange); auto parentScope = manager->nodeScopes[node]; if (parentScope->ownerNode == node) { parentScope = parentScope->parentScope; } ContextFreeStatementDesugar(manager, node->expandedStatement); BuildScopeForStatement(manager, parentScope, node->expandedStatement); manager->checkedScopes_DuplicatedSymbol.Remove(parentScope.Obj()); manager->checkedScopes_SymbolType.Remove(parentScope.Obj()); if (!CheckScopes_DuplicatedSymbol(manager) || !CheckScopes_SymbolType(manager)) { return; } } if (node->expandedStatement) { ValidateStatementSemantic(manager, node->expandedStatement); } } void Visit(WfSwitchStatement* node)override { Ptr type = GetExpressionType(manager, node->expression, 0); for (auto switchCase : node->caseBranches) { Ptr caseType; if (IsExpressionDependOnExpectedType(manager, switchCase->expression, type)) { caseType = GetExpressionType(manager, switchCase->expression, type); } else { caseType = GetExpressionType(manager, switchCase->expression, 0); } if (type && caseType) { if (!GetMergedType(type, caseType)) { manager->errors.Add(WfErrors::CannotMergeTwoType(switchCase->expression.Obj(), type.Obj(), caseType.Obj())); } } ValidateStatementSemantic(manager, switchCase->statement); } if (node->defaultBranch) { ValidateStatementSemantic(manager, node->defaultBranch); } } void Visit(WfForEachStatement* node)override { Ptr elementType = GetEnumerableExpressionItemType(manager, node->collection, 0); if (elementType) { auto scope = manager->nodeScopes[node].Obj(); auto symbol = scope->symbols[node->name.value][0]; symbol->typeInfo = elementType; symbol->type = GetTypeFromTypeInfo(elementType.Obj()); } ValidateStatementSemantic(manager, node->statement); } void Visit(WfCoProviderStatement* node)override { auto scope = manager->nodeScopes[node].Obj(); auto providerSymbol = scope->symbols[L"$PROVIDER"][0]; auto implSymbol = scope->symbols[L"$IMPL"][0]; Ptr funcReturnType; { auto decl = scope->parentScope->ownerNode.Cast(); funcReturnType = CreateTypeInfoFromType(scope->parentScope.Obj(), decl->returnType); } ITypeDescriptor* selectedProviderTd = nullptr; List candidates; if (node->name.value == L"") { if (funcReturnType) { List unprocessed; unprocessed.Add(funcReturnType->GetTypeDescriptor()); for (vint i = 0; i < unprocessed.Count(); i++) { auto td = unprocessed[i]; auto candidate = td->GetTypeName() + L"Coroutine"; if ((selectedProviderTd = description::GetTypeDescriptor(candidate))) { break; } else { candidates.Add(candidate); } vint count = td->GetBaseTypeDescriptorCount(); for (vint i = 0; i < count; i++) { auto baseTd = td->GetBaseTypeDescriptor(i); if (!unprocessed.Contains(baseTd)) { unprocessed.Add(baseTd); } } } } } else { List results, resolveResults; auto providerName = node->name.value.Right(node->name.value.Length() - 1); if (manager->ResolveName(scope, providerName, resolveResults)) { CopyFrom(results, resolveResults); for (vint i = results.Count() - 1; i >= 0; i--) { auto& result = results[i]; ITypeDescriptor* providerTd = nullptr; if (result.scopeName && result.scopeName->typeDescriptor) { auto candidate = result.scopeName->typeDescriptor->GetTypeName() + L"Coroutine"; providerTd = description::GetTypeDescriptor(candidate); if (providerTd) { selectedProviderTd = providerTd; } else { candidates.Add(candidate); } } if (!providerTd) { results.RemoveAt(i); } } if (results.Count() == 1) { goto FINISH_SEARCHING; } else if (results.Count() > 1) { manager->errors.Add(WfErrors::TooManyTargets(node, resolveResults, providerName)); goto SKIP_SEARCHING; } } resolveResults.Clear(); if (manager->ResolveName(scope, providerName + L"Coroutine", resolveResults)) { CopyFrom(results, resolveResults); for (vint i = results.Count() - 1; i >= 0; i--) { auto& result = results[i]; if (result.scopeName && result.scopeName->typeDescriptor) { selectedProviderTd = result.scopeName->typeDescriptor; } else { results.RemoveAt(i); } } if (results.Count() == 1) { goto FINISH_SEARCHING; } else if (results.Count() > 1) { manager->errors.Add(WfErrors::TooManyTargets(node, resolveResults, providerName)); goto SKIP_SEARCHING; } } candidates.Add(providerName); candidates.Add(providerName + L"Coroutine"); } FINISH_SEARCHING: if (selectedProviderTd) { providerSymbol->typeInfo = Ptr(new TypeDescriptorTypeInfo(selectedProviderTd, TypeInfoHint::Normal)); if (funcReturnType) { WString creatorName; if (funcReturnType->GetTypeDescriptor() == description::GetTypeDescriptor()) { creatorName = L"CreateAndRun"; } else { creatorName = L"Create"; } if (auto group = selectedProviderTd->GetMethodGroupByName(creatorName, true)) { List results; ITypeInfo* selectedImplType = nullptr; IMethodInfo* selectedCreator = nullptr; vint count = group->GetMethodCount(); for (vint i = 0; i < count; i++) { auto method = group->GetMethod(i); if (method->IsStatic()) { if (method->GetParameterCount() == 1) { auto creatorType = method->GetParameter(0)->GetType(); if (creatorType->GetDecorator() == ITypeInfo::SharedPtr) { auto functionType = creatorType->GetElementType(); if (functionType->GetDecorator() == ITypeInfo::Generic && functionType->GetGenericArgumentCount() == 2 && functionType->GetTypeDescriptor() == description::GetTypeDescriptor() ) { auto returnType = functionType->GetGenericArgument(0); if (returnType->GetDecorator() == ITypeInfo::SharedPtr &&returnType->GetTypeDescriptor() == description::GetTypeDescriptor()) { selectedImplType = functionType->GetGenericArgument(1); selectedCreator = method; results.Add(ResolveExpressionResult::Method(method)); } } } } } } if (results.Count() == 1) { implSymbol->typeInfo = CopyTypeInfo(selectedImplType); manager->coProviderResolvings.Add(Ptr(node), ResolveExpressionResult::Method(selectedCreator)); } else if (results.Count() > 1) { manager->errors.Add(WfErrors::TooManyTargets(node, results, creatorName)); } } if (!implSymbol->typeInfo) { if (funcReturnType->GetTypeDescriptor() == description::GetTypeDescriptor()) { manager->errors.Add(WfErrors::CoProviderCreateAndRunNotExists(node, providerSymbol->typeInfo.Obj())); } else { manager->errors.Add(WfErrors::CoProviderCreateNotExists(node, providerSymbol->typeInfo.Obj())); } } } } else { manager->errors.Add(WfErrors::CoProviderNotExists(node, candidates)); } SKIP_SEARCHING: ValidateStatementSemantic(manager, node->statement); } void Visit(WfCoroutineStatement* node)override { node->Accept((WfCoroutineStatement::IVisitor*)this); } void Visit(WfCoPauseStatement* node)override { if (node->statement) { ValidateStatementSemantic(manager, node->statement); } } void Visit(WfCoOperatorStatement* node)override { auto scope = manager->nodeScopes[node].Obj(); auto functionScope = scope->FindFunctionScope(); if (auto funcDecl = functionScope->ownerNode.Cast()) { if (funcDecl->statement.Cast()) { auto providerScope = manager->nodeScopes[funcDecl->statement.Obj()]; auto providerSymbol = providerScope->symbols[L"$PROVIDER"][0]; auto implSymbol = providerScope->symbols[L"$IMPL"][0]; if (providerSymbol->typeInfo && implSymbol->typeInfo) { List groups; auto operatorName = node->opName.value.Right(node->opName.value.Length() - 1); if (auto group = providerSymbol->typeInfo->GetTypeDescriptor()->GetMethodGroupByName(operatorName + L"AndRead", true)) { groups.Add(group); } if (node->varName.value == L"") { if (auto group = providerSymbol->typeInfo->GetTypeDescriptor()->GetMethodGroupByName(operatorName + L"AndPause", true)) { groups.Add(group); } } List functions; for (auto group : groups) { vint count = group->GetMethodCount(); for (vint i = 0; i < count; i++) { auto method = group->GetMethod(i); if (method->IsStatic()) { if (method->GetParameterCount() > 0 && IsSameType(implSymbol->typeInfo.Obj(), method->GetParameter(0)->GetType())) { functions.Add(ResolveExpressionResult::Method(method)); } } } } if (functions.Count() == 0) { manager->errors.Add(WfErrors::CoOperatorNotExists(node, providerSymbol->typeInfo.Obj())); } else { vint selectedFunctionIndex = -1; vint oldErrorCount = manager->errors.Count(); List> arguments; arguments.Add(nullptr); CopyFrom(arguments, node->arguments, true); SelectFunction(manager, node, nullptr, functions, arguments, selectedFunctionIndex); if (selectedFunctionIndex != -1) { manager->coOperatorResolvings.Add(Ptr(node), functions[selectedFunctionIndex]); if (node->varName.value != L"" && manager->errors.Count() == oldErrorCount) { auto symbol = scope->symbols[node->varName.value][0]; List types; for (auto argument : node->arguments) { vint index = manager->expressionResolvings.Keys().IndexOf(argument.Obj()); if (index != -1) { auto type = manager->expressionResolvings.Values()[index].type; if (!types.Contains(type.Obj())) { types.Add(type.Obj()); if (auto group = type->GetTypeDescriptor()->GetMethodGroupByName(L"CastResult", true)) { vint count = group->GetMethodCount(); for (vint i = 0; i < count; i++) { auto method = group->GetMethod(i); if (method->IsStatic()) { if (method->GetParameterCount() == 1 && method->GetParameter(0)->GetType()->GetTypeDescriptor() == description::GetTypeDescriptor() && method->GetReturn()->GetTypeDescriptor() != description::GetTypeDescriptor() ) { manager->coCastResultResolvings.Add(Ptr(node), ResolveExpressionResult::Method(method)); symbol->typeInfo = CopyTypeInfo(method->GetReturn()); break; } } } } } } } if (!symbol->typeInfo) { manager->errors.Add(WfErrors::CoOperatorCannotResolveResultType(node, types)); } } } } } } } } void Visit(WfStateMachineStatement* node)override { node->Accept((WfStateMachineStatement::IVisitor*)this); } void Visit(WfStateSwitchStatement* node)override { auto smcScope = manager->nodeScopes[node]->FindFunctionScope()->parentScope.Obj(); CHECK_ERROR(smcScope->ownerNode.Cast(), L"ValidateSemanticStatementVisitor::Visit(WfStateSwitchStatement*)#ValidateStatementStructure should check state machine statements' location."); for (auto switchCase : node->caseBranches) { auto caseScope = manager->nodeScopes[switchCase.Obj()].Obj(); Ptr inputSymbol; { vint index = smcScope->symbols.Keys().IndexOf(switchCase->name.value); if (index != -1) { inputSymbol = smcScope->symbols.GetByIndex(index)[0]; } } if (!inputSymbol || !inputSymbol->creatorNode.Cast()) { manager->errors.Add(WfErrors::StateInputNotExists(switchCase.Obj())); } else { auto td = manager->declarationTypes[smcScope->ownerNode.Cast().Obj()].Obj(); auto inputMethod = td->GetMethodGroupByName(switchCase->name.value, false)->GetMethod(0); if (switchCase->arguments.Count() != inputMethod->GetParameterCount()) { manager->errors.Add(WfErrors::StateSwitchArgumentCountNotMatch(switchCase.Obj())); } else { for (auto [argument, index] : indexed(switchCase->arguments)) { auto argumentSymbol = caseScope->symbols[argument->name.value][0]; argumentSymbol->typeInfo = CopyTypeInfo(inputMethod->GetParameter(index)->GetType()); argumentSymbol->type = GetTypeFromTypeInfo(argumentSymbol->typeInfo.Obj()); } } } ValidateStatementSemantic(manager, switchCase->statement); } } void Visit(WfStateInvokeStatement* node)override { auto smcScope = manager->nodeScopes[node]->FindFunctionScope()->parentScope.Obj(); CHECK_ERROR(smcScope->ownerNode.Cast(), L"ValidateSemanticStatementVisitor::Visit(WfStateSwitchStatement*)#ValidateStatementStructure should check state machine statements' location."); Ptr stateSymbol; { vint index = smcScope->symbols.Keys().IndexOf(node->name.value); if (index != -1) { stateSymbol = smcScope->symbols.GetByIndex(index)[0]; } } if (!stateSymbol || !stateSymbol->creatorNode.Cast()) { manager->errors.Add(WfErrors::StateNotExists(node)); } else { auto stateDecl = stateSymbol->creatorNode.Cast(); if (stateDecl->arguments.Count() != node->arguments.Count()) { manager->errors.Add(WfErrors::StateArgumentCountNotMatch(node)); } else { auto stateScope = manager->nodeScopes[stateDecl.Obj()]; for (auto [argument, index] : indexed(node->arguments)) { auto typeInfo = stateScope->symbols[stateDecl->arguments[index]->name.value][0]->typeInfo; GetExpressionType(manager, argument, typeInfo); } } } } static void Execute(WfStatement* statement, WfLexicalScopeManager* manager) { ValidateSemanticStatementVisitor visitor(manager); statement->Accept(&visitor); } }; /*********************************************************************** ValidateSemantic ***********************************************************************/ void ValidateStatementSemantic(WfLexicalScopeManager* manager, WfStatement* statement) { return ValidateSemanticStatementVisitor::Execute(statement, manager); } void ValidateStatementSemantic(WfLexicalScopeManager* manager, Ptr statement) { return ValidateSemanticStatementVisitor::Execute(statement.Obj(), manager); } } } } /*********************************************************************** .\ANALYZER\WFANALYZER_VALIDATESTRUCTURE.CPP ***********************************************************************/ namespace vl { namespace workflow { namespace analyzer { using namespace collections; using namespace reflection::description; /*********************************************************************** ValidateStructureContext ***********************************************************************/ ValidateStructureContext::ValidateStructureContext() :currentBindExpression(0) , currentObserveExpression(0) , currentLoopStatement(0) , currentCatchStatement(0) { } /*********************************************************************** ValidateStructure ***********************************************************************/ void ValidateModuleStructure(WfLexicalScopeManager* manager, Ptr module) { for (auto path : module->paths) { for (auto [item, index] : indexed(path->items)) { vint counter = 0; for (auto fragment : item->fragments) { if (fragment.Cast()) { if (index == path->items.Count() - 1) { counter++; } else { goto USING_PATH_INCORRECT; } } } if (index == path->items.Count() - 1 && counter != 1) { goto USING_PATH_INCORRECT; } } continue; USING_PATH_INCORRECT: manager->errors.Add(WfErrors::WrongUsingPathWildCard(path.Obj())); } for (vint i = 0; i < module->declarations.Count(); i++) { ValidateDeclarationStructure(manager, module->declarations[i]); } } } } } /*********************************************************************** .\ANALYZER\WFANALYZER_VALIDATESTRUCTURE_DECLARATION.CPP ***********************************************************************/ namespace vl { namespace workflow { namespace analyzer { using namespace collections; using namespace reflection::description; /*********************************************************************** ValidateStructure(Declaration) ***********************************************************************/ class ValidateStructureDeclarationVisitor : public Object , public WfDeclaration::IVisitor , public WfVirtualCfeDeclaration::IVisitor , public WfVirtualCseDeclaration::IVisitor { public: WfLexicalScopeManager* manager; WfClassDeclaration* classDecl; WfExpression* surroundingLambda; ValidateStructureDeclarationVisitor(WfLexicalScopeManager* _manager, WfClassDeclaration* _classDecl, WfExpression* _surroundingLambda) :manager(_manager) , classDecl(_classDecl) , surroundingLambda(_surroundingLambda) { CHECK_ERROR(!(_classDecl && _surroundingLambda), L"vl::workflow::analyzer::ValidateStructureDeclarationVisitor(WfLexicalScopeManager*, WfClassDeclaration*, WfExpression*)#Both classDecl or surroundingLambda should not exist at the same time."); } void Visit(WfNamespaceDeclaration* node)override { if (classDecl) { manager->errors.Add(WfErrors::WrongClassMember(node)); } if (dynamic_cast(surroundingLambda)) { manager->errors.Add(WfErrors::WrongDeclarationInInterfaceConstructor(node)); } for (vint i = 0; i < node->declarations.Count(); i++) { ValidateDeclarationStructure(manager, node->declarations[i]); } } void Visit(WfFunctionDeclaration* node)override { if (classDecl) { switch (classDecl->kind) { case WfClassKind::Class: { switch (node->functionKind) { case WfFunctionKind::Normal: case WfFunctionKind::Static: if (!node->statement) { manager->errors.Add(WfErrors::FunctionShouldHaveImplementation(node)); } break; case WfFunctionKind::Override: manager->errors.Add(WfErrors::OverrideShouldImplementInterfaceMethod(node)); break; default:; } } break; case WfClassKind::Interface: { switch (node->functionKind) { case WfFunctionKind::Normal: if (node->statement) { manager->errors.Add(WfErrors::InterfaceMethodShouldNotHaveImplementation(node)); } break; case WfFunctionKind::Static: if (!node->statement) { manager->errors.Add(WfErrors::FunctionShouldHaveImplementation(node)); } break; case WfFunctionKind::Override: manager->errors.Add(WfErrors::OverrideShouldImplementInterfaceMethod(node)); break; default:; } } break; default:; } } else { if (dynamic_cast(surroundingLambda)) { switch (node->functionKind) { case WfFunctionKind::Normal: break; case WfFunctionKind::Static: manager->errors.Add(WfErrors::FunctionInNewTypeExpressionCannotBeStatic(node)); break; case WfFunctionKind::Override: break; default:; } } if (!node->statement) { manager->errors.Add(WfErrors::FunctionShouldHaveImplementation(node)); } } if (node->anonymity == WfFunctionAnonymity::Anonymous) { if (!dynamic_cast(surroundingLambda)) { manager->errors.Add(WfErrors::FunctionShouldHaveName(node)); } } ValidateTypeStructure(manager, node->returnType, ValidateTypeStragety::ReturnType); for (auto argument : node->arguments) { ValidateTypeStructure(manager, argument->type); } if (node->statement) { ValidateStructureContext context; ValidateStatementStructure(manager, &context, node->statement); } } void Visit(WfVariableDeclaration* node)override { if (node->type) { ValidateTypeStructure(manager, node->type); } else if (classDecl) { manager->errors.Add(WfErrors::MissingFieldType(node)); } ValidateStructureContext context; ValidateExpressionStructure(manager, &context, node->expression); } void Visit(WfEventDeclaration* node)override { if (classDecl) { for (auto argument : node->arguments) { ValidateTypeStructure(manager, argument); } } else if (dynamic_cast(surroundingLambda)) { manager->errors.Add(WfErrors::WrongDeclarationInInterfaceConstructor(node)); } else { manager->errors.Add(WfErrors::WrongDeclaration(node)); } } class FindPropertyRelatedDeclVisitor : public empty_visitor::DeclarationVisitor , public empty_visitor::VirtualCseDeclarationVisitor { public: WfLexicalScopeManager* manager; WfClassDeclaration* classDecl; WfPropertyDeclaration* propDecl; Ptr getter; Ptr setter; Ptr valueChangedEvent; bool duplicateGetter = false; bool duplicateSetter = false; bool duplicateEvent = false; FindPropertyRelatedDeclVisitor(WfLexicalScopeManager* _manager, WfClassDeclaration* _classDecl, WfPropertyDeclaration* _propDecl) :manager(_manager) , classDecl(_classDecl) , propDecl(_propDecl) { } void Dispatch(WfVirtualCfeDeclaration* node)override { for (auto decl : node->expandedDeclarations) { Execute(decl); } } void Dispatch(WfVirtualCseDeclaration* node)override { node->Accept((WfVirtualCseDeclaration::IVisitor*)this); } void Execute(Ptr memberDecl) { memberDecl->Accept(this); if (!duplicateGetter && memberDecl->name.value == propDecl->getter.value) { if (getter) { duplicateGetter = true; manager->errors.Add(WfErrors::TooManyPropertyGetter(propDecl, classDecl)); } else { getter = memberDecl; } } if (!duplicateSetter && propDecl->setter.value != L"" && memberDecl->name.value == propDecl->setter.value) { if (setter) { duplicateSetter = true; manager->errors.Add(WfErrors::TooManyPropertySetter(propDecl, classDecl)); } else { setter = memberDecl; } } if (!duplicateEvent && propDecl->valueChangedEvent.value != L"" && memberDecl->name.value == propDecl->valueChangedEvent.value) { if (valueChangedEvent) { duplicateEvent = true; manager->errors.Add(WfErrors::TooManyPropertyEvent(propDecl, classDecl)); } else { valueChangedEvent = memberDecl; } } } }; void Visit(WfPropertyDeclaration* node)override { if (classDecl) { ValidateTypeStructure(manager, node->type); FindPropertyRelatedDeclVisitor visitor(manager, classDecl, node); for (auto memberDecl : classDecl->declarations) { visitor.Execute(memberDecl); } if (auto getter = visitor.getter.Cast()) { if (getter->functionKind == WfFunctionKind::Static) { manager->errors.Add(WfErrors::PropertyGetterNotFound(node, classDecl)); } } else { manager->errors.Add(WfErrors::PropertyGetterNotFound(node, classDecl)); } if (node->setter.value != L"") { if (auto setter = visitor.setter.Cast()) { if (setter->functionKind == WfFunctionKind::Static) { manager->errors.Add(WfErrors::PropertyGetterNotFound(node, classDecl)); } } else { manager->errors.Add(WfErrors::PropertyGetterNotFound(node, classDecl)); } } if (node->valueChangedEvent.value != L"" && (!visitor.valueChangedEvent || !visitor.valueChangedEvent.Cast())) { manager->errors.Add(WfErrors::PropertyEventNotFound(node, classDecl)); } } else if (dynamic_cast(surroundingLambda)) { manager->errors.Add(WfErrors::WrongDeclarationInInterfaceConstructor(node)); } else { manager->errors.Add(WfErrors::WrongDeclaration(node)); } } void Visit(WfStaticInitDeclaration* node)override { if (classDecl) { manager->errors.Add(WfErrors::WrongDeclaration(node)); } } void Visit(WfConstructorDeclaration* node)override { if (classDecl) { if (classDecl->kind != WfClassKind::Class) { manager->errors.Add(WfErrors::WrongDeclaration(node)); } for (auto call : node->baseConstructorCalls) { ValidateTypeStructure(manager, call->type, ValidateTypeStragety::BaseType, classDecl); for (auto argument : call->arguments) { ValidateStructureContext context; ValidateExpressionStructure(manager, &context, argument); } } { ValidateStructureContext context; ValidateStatementStructure(manager, &context, node->statement); } } else { manager->errors.Add(WfErrors::WrongDeclaration(node)); } } void Visit(WfDestructorDeclaration* node)override { if (classDecl) { if (classDecl->kind != WfClassKind::Class) { manager->errors.Add(WfErrors::WrongDeclaration(node)); } ValidateStructureContext context; ValidateStatementStructure(manager, &context, node->statement); } else { manager->errors.Add(WfErrors::WrongDeclaration(node)); } } class FindCtorVisitor : public empty_visitor::DeclarationVisitor , public empty_visitor::VirtualCseDeclarationVisitor { public: WfConstructorDeclaration* ctor = nullptr; void Dispatch(WfVirtualCfeDeclaration* node)override { for (auto decl : node->expandedDeclarations) { decl->Accept(this); } } void Dispatch(WfVirtualCseDeclaration* node)override { node->Accept((WfVirtualCseDeclaration::IVisitor*)this); } void Visit(WfConstructorDeclaration* node)override { ctor = node; } }; class TooManyDtorVisitor : public empty_visitor::DeclarationVisitor , public empty_visitor::VirtualCseDeclarationVisitor { public: WfLexicalScopeManager* manager; WfClassDeclaration* classDecl; WfDestructorDeclaration* dtor = nullptr; TooManyDtorVisitor(WfLexicalScopeManager* _manager, WfClassDeclaration* _classDecl) :manager(_manager) , classDecl(_classDecl) { } void Dispatch(WfVirtualCfeDeclaration* node)override { for (auto decl : node->expandedDeclarations) { decl->Accept(this); } } void Dispatch(WfVirtualCseDeclaration* node)override { node->Accept((WfVirtualCseDeclaration::IVisitor*)this); } void Visit(WfDestructorDeclaration* node)override { if (!dtor) { dtor = node; } else { manager->errors.Add(WfErrors::TooManyDestructor(node, classDecl)); } } }; void Visit(WfClassDeclaration* node)override { if (dynamic_cast(surroundingLambda)) { manager->errors.Add(WfErrors::WrongDeclarationInInterfaceConstructor(node)); } switch (node->kind) { case WfClassKind::Class: { if (node->constructorType != WfConstructorType::Undefined) { manager->errors.Add(WfErrors::ClassWithInterfaceConstructor(node)); } { FindCtorVisitor visitor; for (auto memberDecl : node->declarations) { memberDecl->Accept(&visitor); } if (!visitor.ctor) { auto ctor = Ptr(new WfConstructorDeclaration); node->declarations.Add(ctor); ctor->codeRange = node->codeRange; ctor->constructorType = WfConstructorType::SharedPtr; auto stat = Ptr(new WfBlockStatement); ctor->statement = stat; stat->codeRange = node->codeRange; } } } break; default:; } for (auto type : node->baseTypes) { ValidateTypeStructure(manager, type, ValidateTypeStragety::BaseType, node); } { TooManyDtorVisitor visitor(manager, node); bool hasStateMachine = false; for (auto memberDecl : node->declarations) { if (auto smDecl = memberDecl.Cast()) { if (!hasStateMachine) { hasStateMachine = true; } else { manager->errors.Add(WfErrors::DuplicatedDeclaration(smDecl.Obj())); } } ValidateDeclarationStructure(manager, memberDecl, node); memberDecl->Accept(&visitor); } } } void Visit(WfEnumDeclaration* node)override { if (dynamic_cast(surroundingLambda)) { manager->errors.Add(WfErrors::WrongDeclarationInInterfaceConstructor(node)); } vuint64_t current = 0; bool reportedNotConsecutive = false; SortedList discoveredItems; for (auto item : node->items) { switch (item->kind) { case WfEnumItemKind::Constant: { vuint64_t value = -1; TypedValueSerializerProvider::Deserialize(item->number.value, value); if (!reportedNotConsecutive && value != current) { reportedNotConsecutive = true; switch (node->kind) { case WfEnumKind::Normal: manager->errors.Add(WfErrors::EnumValuesNotConsecutiveFromZero(node)); break; case WfEnumKind::Flag: manager->errors.Add(WfErrors::FlagValuesNotConsecutiveFromZero(node)); break; default:; } } switch (node->kind) { case WfEnumKind::Normal: current++; break; case WfEnumKind::Flag: current = current == 0 ? 1 : current * 2; break; default:; } } break; case WfEnumItemKind::Intersection: for (auto enumInt : item->intersections) { if (!discoveredItems.Contains(enumInt->name.value)) { manager->errors.Add(WfErrors::FlagValueNotExists(enumInt.Obj(), node)); } } break; default:; } if (discoveredItems.Contains(item->name.value)) { manager->errors.Add(WfErrors::DuplicatedEnumValue(item.Obj(), node)); } else { discoveredItems.Add(item->name.value); } } } void Visit(WfStructDeclaration* node)override { if (dynamic_cast(surroundingLambda)) { manager->errors.Add(WfErrors::WrongDeclarationInInterfaceConstructor(node)); } SortedList discoveredItems; for (auto member : node->members) { if (discoveredItems.Contains(member->name.value)) { manager->errors.Add(WfErrors::DuplicatedStructMember(member.Obj(), node)); } else { discoveredItems.Add(member->name.value); } } } void Visit(WfVirtualCfeDeclaration* node)override { node->Accept(static_cast(this)); for (auto decl : node->expandedDeclarations) { decl->Accept(this); } } void Visit(WfAutoPropertyDeclaration* node)override { switch (node->functionKind) { case WfFunctionKind::Normal: if (dynamic_cast(surroundingLambda)) { manager->errors.Add(WfErrors::AutoPropertyCannotBeNormalOutsideOfClass(node)); } break; case WfFunctionKind::Static: manager->errors.Add(WfErrors::AutoPropertyCannotBeStatic(node)); break; case WfFunctionKind::Override: if (!dynamic_cast(surroundingLambda)) { manager->errors.Add(WfErrors::OverrideShouldImplementInterfaceMethod(node)); } break; default:; } if (classDecl) { switch (classDecl->kind) { case WfClassKind::Class: if (!node->expression) { manager->errors.Add(WfErrors::AutoPropertyShouldBeInitialized(node)); } break; case WfClassKind::Interface: if (node->expression) { manager->errors.Add(WfErrors::AutoPropertyCannotBeInitializedInInterface(node, classDecl)); } break; default:; } } else if (dynamic_cast(surroundingLambda)) { if (!node->expression) { manager->errors.Add(WfErrors::AutoPropertyShouldBeInitialized(node)); } } else { manager->errors.Add(WfErrors::WrongDeclaration(node)); } ValidateTypeStructure(manager, node->type); if (node->expression) { ValidateStructureContext context; ValidateExpressionStructure(manager, &context, node->expression); } } void Visit(WfCastResultInterfaceDeclaration* node)override { } void Visit(WfVirtualCseDeclaration* node)override { node->Accept(static_cast(this)); } void Visit(WfStateMachineDeclaration* node)override { if (classDecl) { for (auto state : node->states) { ValidateStructureContext context; context.currentStateDeclaration = state.Obj(); ValidateStatementStructure(manager, &context, state->statement); } } else { manager->errors.Add(WfErrors::WrongDeclaration(node)); } } static void Execute(Ptr declaration, WfLexicalScopeManager* manager, WfClassDeclaration* classDecl, WfExpression* surroundingLambda) { ValidateStructureDeclarationVisitor visitor(manager, classDecl, surroundingLambda); declaration->Accept(&visitor); } }; /*********************************************************************** ValidateStructure ***********************************************************************/ void ValidateDeclarationStructure(WfLexicalScopeManager* manager, Ptr declaration, WfClassDeclaration* classDecl, WfExpression* surroundingLambda) { ValidateStructureDeclarationVisitor::Execute(declaration, manager, classDecl, surroundingLambda); } } } } /*********************************************************************** .\ANALYZER\WFANALYZER_VALIDATESTRUCTURE_EXPRESSION.CPP ***********************************************************************/ namespace vl { namespace workflow { namespace analyzer { using namespace collections; using namespace reflection::description; /*********************************************************************** ValidateStructure(Expression) ***********************************************************************/ class ValidateStructureExpressionVisitor : public Object , public WfExpression::IVisitor , public WfVirtualCseExpression::IVisitor { public: WfLexicalScopeManager* manager; ValidateStructureContext* context; Ptr result; ValidateStructureExpressionVisitor(WfLexicalScopeManager* _manager, ValidateStructureContext* _context) :manager(_manager) , context(_context) { } void Visit(WfThisExpression* node)override { if (context->currentBindExpression) { manager->errors.Add(WfErrors::WrongThisExpression(node)); } } void Visit(WfTopQualifiedExpression* node)override { } void Visit(WfReferenceExpression* node)override { } void Visit(WfOrderedNameExpression* node)override { } void Visit(WfOrderedLambdaExpression* node)override { ValidateStructureContext context; ValidateExpressionStructure(manager, &context, node->body); } void Visit(WfMemberExpression* node)override { ValidateExpressionStructure(manager, context, node->parent); } void Visit(WfChildExpression* node)override { ValidateExpressionStructure(manager, context, node->parent); } void Visit(WfLiteralExpression* node)override { } void Visit(WfFloatingExpression* node)override { } void Visit(WfIntegerExpression* node)override { } void Visit(WfStringExpression* node)override { } void Visit(WfUnaryExpression* node)override { ValidateExpressionStructure(manager, context, node->operand); } void Visit(WfBinaryExpression* node)override { ValidateExpressionStructure(manager, context, node->first); ValidateExpressionStructure(manager, context, node->second); } void Visit(WfLetExpression* node)override { for (auto variable : node->variables) { ValidateExpressionStructure(manager, context, variable->value); } ValidateExpressionStructure(manager, context, node->expression); } void Visit(WfIfExpression* node)override { ValidateExpressionStructure(manager, context, node->condition); ValidateExpressionStructure(manager, context, node->trueBranch); ValidateExpressionStructure(manager, context, node->falseBranch); } void Visit(WfRangeExpression* node)override { ValidateExpressionStructure(manager, context, node->begin); ValidateExpressionStructure(manager, context, node->end); } void Visit(WfSetTestingExpression* node)override { ValidateExpressionStructure(manager, context, node->element); ValidateExpressionStructure(manager, context, node->collection); } void Visit(WfConstructorExpression* node)override { vint listElementCount = 0; vint mapElementCount = 0; for (auto argument : node->arguments) { ValidateExpressionStructure(manager, context, argument->key); if (argument->value) { ValidateExpressionStructure(manager, context, argument->value); mapElementCount++; } else { listElementCount++; } } if (listElementCount*mapElementCount != 0) { manager->errors.Add(WfErrors::ConstructorMixMapAndList(node)); } } void Visit(WfInferExpression* node)override { ValidateTypeStructure(manager, node->type); ValidateExpressionStructure(manager, context, node->expression); } void Visit(WfTypeCastingExpression* node)override { ValidateTypeStructure(manager, node->type); ValidateExpressionStructure(manager, context, node->expression); } void Visit(WfTypeTestingExpression* node)override { if (node->type) { ValidateTypeStructure(manager, node->type); } ValidateExpressionStructure(manager, context, node->expression); } void Visit(WfTypeOfTypeExpression* node)override { ValidateTypeStructure(manager, node->type); } void Visit(WfTypeOfExpressionExpression* node)override { ValidateExpressionStructure(manager, context, node->expression); } void Visit(WfAttachEventExpression* node)override { if (context->currentBindExpression) { manager->errors.Add(WfErrors::AttachInBind(node)); } ValidateExpressionStructure(manager, context, node->event); ValidateExpressionStructure(manager, context, node->function); } void Visit(WfDetachEventExpression* node)override { if (context->currentBindExpression) { manager->errors.Add(WfErrors::DetachInBind(node)); } ValidateExpressionStructure(manager, context, node->event); ValidateExpressionStructure(manager, context, node->handler); } void Visit(WfObserveExpression* node)override { if (!context->currentBindExpression) { manager->errors.Add(WfErrors::ObserveNotInBind(node)); } if (context->currentObserveExpression) { manager->errors.Add(WfErrors::ObserveInObserveEvent(node)); } if (node->observeType == WfObserveType::SimpleObserve) { if (!node->expression.Cast()) { manager->errors.Add(WfErrors::WrongSimpleObserveExpression(node->expression.Obj())); } for (auto event : node->events) { if (!event.Cast()) { manager->errors.Add(WfErrors::WrongSimpleObserveEvent(event.Obj())); } } } else if (node->events.Count() == 0) { manager->errors.Add(WfErrors::EmptyObserveEvent(node)); } ValidateExpressionStructure(manager, context, node->parent); ValidateExpressionStructure(manager, context, node->expression); context->currentObserveExpression = node; for (vint i = 0; i < node->events.Count(); i++) { ValidateExpressionStructure(manager, context, node->events[i]); } context->currentObserveExpression = 0; } void Visit(WfCallExpression* node)override { ValidateExpressionStructure(manager, context, node->function); for (vint i = 0; i < node->arguments.Count(); i++) { ValidateExpressionStructure(manager, context, node->arguments[i]); } } void Visit(WfFunctionExpression* node)override { ValidateDeclarationStructure(manager, node->function, nullptr, node); } void Visit(WfNewClassExpression* node)override { ValidateTypeStructure(manager, node->type); for (vint i = 0; i < node->arguments.Count(); i++) { ValidateExpressionStructure(manager, context, node->arguments[i]); } } void Visit(WfNewInterfaceExpression* node)override { ValidateTypeStructure(manager, node->type); for (auto memberDecl : node->declarations) { ValidateDeclarationStructure(manager, memberDecl, nullptr, node); } } void Visit(WfVirtualCfeExpression* node)override { if (node->expandedExpression) { ValidateExpressionStructure(manager, context, node->expandedExpression); } } void Visit(WfVirtualCseExpression* node)override { node->Accept((WfVirtualCseExpression::IVisitor*)this); } void Visit(WfBindExpression* node)override { if (context->currentBindExpression) { manager->errors.Add(WfErrors::BindInBind(node)); } auto bind = context->currentBindExpression; context->currentBindExpression = node; ValidateExpressionStructure(manager, context, node->expression); context->currentBindExpression = bind; } void Visit(WfNewCoroutineExpression* node)override { ValidateStructureContext context; context.currentNewCoroutineExpression = node; ValidateStatementStructure(manager, &context, node->statement); } void Visit(WfMixinCastExpression* node)override { ValidateTypeStructure(manager, node->type); ValidateExpressionStructure(manager, context, node->expression); } void Visit(WfExpectedTypeCastExpression* node)override { ValidateExpressionStructure(manager, context, node->expression); } void Visit(WfCoOperatorExpression* node)override { if (!context->currentCoProviderStatement) { manager->errors.Add(WfErrors::WrongCoOperator(node)); } } static void Execute(Ptr& expression, WfLexicalScopeManager* manager, ValidateStructureContext* context) { ValidateStructureExpressionVisitor visitor(manager, context); expression->Accept(&visitor); if (visitor.result) { expression = visitor.result; } } }; /*********************************************************************** ValidateStructure ***********************************************************************/ void ValidateExpressionStructure(WfLexicalScopeManager* manager, ValidateStructureContext* context, Ptr& expression) { ValidateStructureExpressionVisitor::Execute(expression, manager, context); } } } } /*********************************************************************** .\ANALYZER\WFANALYZER_VALIDATESTRUCTURE_STATEMENT.CPP ***********************************************************************/ namespace vl { namespace workflow { namespace analyzer { using namespace collections; using namespace reflection::description; /*********************************************************************** ValidateStructure(Statement) ***********************************************************************/ class ValidateStructureStatementVisitor : public Object , public WfStatement::IVisitor , public WfVirtualCseStatement::IVisitor , public WfCoroutineStatement::IVisitor , public WfStateMachineStatement::IVisitor { public: WfLexicalScopeManager* manager; ValidateStructureContext* context; Ptr result; ValidateStructureStatementVisitor(WfLexicalScopeManager* _manager, ValidateStructureContext* _context) :manager(_manager) , context(_context) { } void Visit(WfBreakStatement* node)override { if (!context->currentLoopStatement) { manager->errors.Add(WfErrors::BreakNotInLoop(node)); } } void Visit(WfContinueStatement* node)override { if (!context->currentLoopStatement) { manager->errors.Add(WfErrors::ContinueNotInLoop(node)); } } void Visit(WfReturnStatement* node)override { if (node->expression) { ValidateExpressionStructure(manager, context, node->expression); } } void Visit(WfDeleteStatement* node)override { ValidateExpressionStructure(manager, context, node->expression); } void Visit(WfRaiseExceptionStatement* node)override { if (node->expression) { ValidateExpressionStructure(manager, context, node->expression); } else if (!context->currentCatchStatement) { manager->errors.Add(WfErrors::RethrowNotInCatch(node)); } } void Visit(WfIfStatement* node)override { if (node->type) { ValidateTypeStructure(manager, node->type); } ValidateExpressionStructure(manager, context, node->expression); ValidateStatementStructure(manager, context, node->trueBranch); if (node->falseBranch) { ValidateStatementStructure(manager, context, node->falseBranch); } } void Visit(WfWhileStatement* node)override { auto oldLoop = context->currentLoopStatement; context->currentLoopStatement = node; ValidateExpressionStructure(manager, context, node->condition); ValidateStatementStructure(manager, context, node->statement); context->currentLoopStatement = oldLoop; } void Visit(WfTryStatement* node)override { ValidateStatementStructure(manager, context, node->protectedStatement); if (node->catchStatement) { auto oldCatch = context->currentCatchStatement; context->currentCatchStatement = node->catchStatement.Obj(); ValidateStatementStructure(manager, context, node->catchStatement); context->currentCatchStatement = oldCatch; } if (node->finallyStatement) { ValidateStatementStructure(manager, context, node->finallyStatement); } if (!node->catchStatement && !node->finallyStatement) { manager->errors.Add(WfErrors::TryMissCatchAndFinally(node)); } } void Visit(WfBlockStatement* node)override { for (vint i = 0; i < node->statements.Count(); i++) { ValidateStatementStructure(manager, context, node->statements[i]); } } void Visit(WfGotoStatement* node)override { } void Visit(WfExpressionStatement* node)override { ValidateExpressionStructure(manager, context, node->expression); } void Visit(WfVariableStatement* node)override { ValidateDeclarationStructure(manager, node->variable); } void Visit(WfVirtualCseStatement* node)override { node->Accept((WfVirtualCseStatement::IVisitor*)this); } void Visit(WfSwitchStatement* node)override { ValidateExpressionStructure(manager, context, node->expression); for (auto switchCase : node->caseBranches) { ValidateExpressionStructure(manager, context, switchCase->expression); ValidateStatementStructure(manager, context, switchCase->statement); } if (node->defaultBranch) { ValidateStatementStructure(manager, context, node->defaultBranch); } } void Visit(WfForEachStatement* node)override { auto oldLoop = context->currentLoopStatement; context->currentLoopStatement = node; ValidateExpressionStructure(manager, context, node->collection); ValidateStatementStructure(manager, context, node->statement); context->currentLoopStatement = oldLoop; } void Visit(WfCoProviderStatement* node)override { auto oldProvider = context->currentCoProviderStatement; context->currentCoProviderStatement = node; ValidateStatementStructure(manager, context, node->statement); context->currentCoProviderStatement = oldProvider; } void Visit(WfCoroutineStatement* node)override { node->Accept((WfCoroutineStatement::IVisitor*)this); } void Visit(WfCoPauseStatement* node)override { if (!context->currentNewCoroutineExpression || context->currentCoPauseStatement) { manager->errors.Add(WfErrors::WrongCoPause(node)); } if (node->statement) { auto oldCpPause = context->currentCoPauseStatement; context->currentCoPauseStatement = node; ValidateStatementStructure(manager, context, node->statement); context->currentCoPauseStatement = oldCpPause; } } void Visit(WfCoOperatorStatement* node)override { if (!context->currentCoProviderStatement) { manager->errors.Add(WfErrors::WrongCoOperator(node)); } } void Visit(WfStateMachineStatement* node)override { node->Accept((WfStateMachineStatement::IVisitor*)this); } void Visit(WfStateSwitchStatement* node)override { if (!context->currentStateDeclaration) { manager->errors.Add(WfErrors::WrongStateSwitchStatement(node)); } for (auto switchCase : node->caseBranches) { ValidateStatementStructure(manager, context, switchCase->statement); } } void Visit(WfStateInvokeStatement* node)override { if (!context->currentStateDeclaration) { manager->errors.Add(WfErrors::WrongStateInvokeStatement(node)); } for (auto argument : node->arguments) { ValidateExpressionStructure(manager, context, argument); } } static void Execute(Ptr& statement, WfLexicalScopeManager* manager, ValidateStructureContext* context) { ValidateStructureStatementVisitor visitor(manager, context); statement->Accept(&visitor); if (visitor.result) { statement = visitor.result; } } }; /*********************************************************************** ValidateStructure ***********************************************************************/ void ValidateStatementStructure(WfLexicalScopeManager* manager, ValidateStructureContext* context, Ptr& statement) { ValidateStructureStatementVisitor::Execute(statement, manager, context); } } } } /*********************************************************************** .\ANALYZER\WFANALYZER_VALIDATESTRUCTURE_TYPE.CPP ***********************************************************************/ namespace vl { namespace workflow { namespace analyzer { using namespace collections; using namespace reflection::description; /*********************************************************************** ValidateStructure(Type) ***********************************************************************/ class ValidateReferenceTypeVisitor : public Object, public WfType::IVisitor { public: WfLexicalScopeManager* manager; bool result; ValidateReferenceTypeVisitor(WfLexicalScopeManager* _manager) :manager(_manager) , result(true) { } void Visit(WfPredefinedType* node)override { } void Visit(WfTopQualifiedType* node)override { } void Visit(WfReferenceType* node)override { } void Visit(WfRawPointerType* node)override { result = false; } void Visit(WfSharedPointerType* node)override { result = false; } void Visit(WfNullableType* node)override { result = false; } void Visit(WfEnumerableType* node)override { result = false; } void Visit(WfMapType* node)override { result = false; } void Visit(WfObservableListType* node)override { result = false; } void Visit(WfFunctionType* node)override { result = false; } void Visit(WfChildType* node)override { node->parent->Accept(this); } static bool Execute(Ptr type, WfLexicalScopeManager* manager) { ValidateReferenceTypeVisitor visitor(manager); type->Accept(&visitor); return visitor.result; } }; class ValidateStructureTypeVisitor : public Object, public WfType::IVisitor { public: WfLexicalScopeManager* manager; ValidateTypeStragety strategy; WfClassDeclaration* classDecl; ValidateStructureTypeVisitor(WfLexicalScopeManager* _manager, ValidateTypeStragety _strategy, WfClassDeclaration* _classDecl) :manager(_manager) , strategy(_strategy) , classDecl(_classDecl) { } void Visit(WfPredefinedType* node)override { switch (node->name) { case WfPredefinedTypeName::Void: switch (strategy) { case ValidateTypeStragety::Value: manager->errors.Add(WfErrors::WrongVoidType(node)); break; case ValidateTypeStragety::BaseType: manager->errors.Add(WfErrors::WrongBaseType(classDecl, node)); default:; } break; case WfPredefinedTypeName::Interface: switch (strategy) { case ValidateTypeStragety::ReturnType: case ValidateTypeStragety::Value: manager->errors.Add(WfErrors::WrongInterfaceType(node)); break; default:; } default:; } } void Visit(WfTopQualifiedType* node)override { } void Visit(WfReferenceType* node)override { } void Visit(WfRawPointerType* node)override { if (strategy == ValidateTypeStragety::BaseType) { manager->errors.Add(WfErrors::WrongBaseType(classDecl, node)); } if (!ValidateReferenceTypeVisitor::Execute(node->element, manager)) { manager->errors.Add(WfErrors::RawPointerToNonReferenceType(node)); } else if (auto predefinedType = node->element.Cast()) { if (predefinedType->name != WfPredefinedTypeName::Interface) { manager->errors.Add(WfErrors::RawPointerToNonReferenceType(node)); } } } void Visit(WfSharedPointerType* node)override { if (strategy == ValidateTypeStragety::BaseType) { manager->errors.Add(WfErrors::WrongBaseType(classDecl, node)); } if (!ValidateReferenceTypeVisitor::Execute(node->element, manager)) { manager->errors.Add(WfErrors::SharedPointerToNonReferenceType(node)); } else if (auto predefinedType = node->element.Cast()) { if (predefinedType->name != WfPredefinedTypeName::Interface) { manager->errors.Add(WfErrors::SharedPointerToNonReferenceType(node)); } } } void Visit(WfNullableType* node)override { if (strategy == ValidateTypeStragety::BaseType) { manager->errors.Add(WfErrors::WrongBaseType(classDecl, node)); } if (!ValidateReferenceTypeVisitor::Execute(node->element, manager)) { manager->errors.Add(WfErrors::NullableToNonReferenceType(node)); } else if (auto predefinedType = node->element.Cast()) { switch (predefinedType->name) { case WfPredefinedTypeName::Void: case WfPredefinedTypeName::Object: case WfPredefinedTypeName::Interface: manager->errors.Add(WfErrors::NullableToNonReferenceType(node)); break; default:; } } } void Visit(WfEnumerableType* node)override { if (strategy == ValidateTypeStragety::BaseType) { manager->errors.Add(WfErrors::WrongBaseType(classDecl, node)); } ValidateTypeStructure(manager, node->element); } void Visit(WfMapType* node)override { if (strategy == ValidateTypeStragety::BaseType) { manager->errors.Add(WfErrors::WrongBaseType(classDecl, node)); } if (node->key) { ValidateTypeStructure(manager, node->key); } ValidateTypeStructure(manager, node->value); } void Visit(WfObservableListType* node)override { if (strategy == ValidateTypeStragety::BaseType) { manager->errors.Add(WfErrors::WrongBaseType(classDecl, node)); } ValidateTypeStructure(manager, node->element); } void Visit(WfFunctionType* node)override { if (strategy == ValidateTypeStragety::BaseType) { manager->errors.Add(WfErrors::WrongBaseType(classDecl, node)); } ValidateTypeStructure(manager, node->result, ValidateTypeStragety::ReturnType); for (auto argument : node->arguments) { ValidateTypeStructure(manager, argument); } } void Visit(WfChildType* node)override { if (!ValidateReferenceTypeVisitor::Execute(node->parent, manager)) { manager->errors.Add(WfErrors::ChildOfNonReferenceType(node)); } } static void Execute(Ptr type, WfLexicalScopeManager* manager, ValidateTypeStragety strategy, WfClassDeclaration* classDecl) { ValidateStructureTypeVisitor visitor(manager, strategy, classDecl); type->Accept(&visitor); } }; /*********************************************************************** ValidateStructure ***********************************************************************/ void ValidateTypeStructure(WfLexicalScopeManager* manager, Ptr type, ValidateTypeStragety strategy, WfClassDeclaration* classDecl) { ValidateStructureTypeVisitor::Execute(type, manager, strategy, classDecl); } } } } /*********************************************************************** .\CPP\WFCPP.CPP ***********************************************************************/ namespace vl { namespace workflow { namespace cppcodegen { using namespace collections; using namespace regex; using namespace reflection; using namespace reflection::description; using namespace stream; using namespace emitter; /*********************************************************************** WfCppConfig ***********************************************************************/ WfCppConfig::WfCppConfig(analyzer::WfLexicalScopeManager* _manager, const WString& _assemblyName, const WString& _assemblyNamespace) :manager(_manager) , regexSplitName(L"::") , regexSpecialName(L"/<(/w+)(-(/w+))*/>(/w*)") , regexTemplate(L", /$Arguments|/$Arguments, |/$/l+") , specialName_category(regexSpecialName.CaptureNames().IndexOf(L"category")) , specialName_name(regexSpecialName.CaptureNames().IndexOf(L"name")) , assemblyName(_assemblyName) , assemblyNamespace(_assemblyNamespace) { attributeEvaluator = Ptr(new WfAttributeEvaluator(manager)); Collect(); for (vint i = 0; i < enumDecls.Count(); i++) { const auto& values = enumDecls.GetByIndex(i); SortDeclsByName(const_cast>&>(values)); } for (vint i = 0; i < structDecls.Count(); i++) { const auto& values = structDecls.GetByIndex(i); SortDeclsByName(const_cast>&>(values)); } for (vint i = 0; i < classDecls.Count(); i++) { const auto& values = classDecls.GetByIndex(i); SortDeclsByName(const_cast>&>(values)); } AssignClassDeclsToFiles(); } WfCppConfig::~WfCppConfig() { } void WfCppConfig::WriteFunctionBody(stream::StreamWriter& writer, Ptr expr, const WString& prefix, ITypeInfo* expectedType) { writer.WriteString(prefix); writer.WriteString(L"return "); GenerateExpression(this, writer, expr, expectedType); writer.WriteLine(L";"); } void WfCppConfig::WriteFunctionBody(stream::StreamWriter& writer, Ptr stat, const WString& prefix, ITypeInfo* expectedType) { GenerateStatement(this, Ptr(new FunctionRecord), writer, stat, prefix, WString::Unmanaged(L"\t"), expectedType); } WString WfCppConfig::CppNameToHeaderEnumStructName(const WString& fullName, const WString& type) { return L"__vwsn_" + type + L"s::" + ConvertFullName(fullName, L"_"); } WString WfCppConfig::ConvertNameInternal(const WString& name, const WString& specialNameCategory, bool alwaysUseCategory) { if (name.Length() > 0 && name[0] == L'$') { return L"__vwsno_" + name.Sub(1, name.Length() - 1); } auto match = regexSpecialName.Match(name); if (match) { return specialNameCategory + From(match->Groups()[specialName_category]) .Select([](const RegexString& rs) { return rs.Value(); }) .Aggregate([](const WString& a, const WString& b) { return a + L"_" + b; }) + L"_" + match->Groups()[specialName_name][0].Value(); } else if (alwaysUseCategory) { return specialNameCategory + name; } { return name; } } WString WfCppConfig::ConvertName(const WString& name) { return ConvertNameInternal(name, WString::Unmanaged(L"__vwsn_"), false); } WString WfCppConfig::ConvertName(const WString& name, const WString& specialNameCategory) { return ConvertNameInternal(name, specialNameCategory, true); } WString WfCppConfig::ConvertFullName(const WString& fullName, WString delimiter) { List> matches; regexSplitName.Split(fullName, false, matches); return (fullName[0] == L':' ? delimiter : WString::Empty) + From(matches) .Select([this](Ptr match) { return ConvertName(match->Result().Value()); }) .Aggregate([&](const WString& a, const WString& b) { return a + delimiter + b; }); } WString WfCppConfig::ConvertFunctionType(IMethodInfo* methodInfo, WString name) { WString type = ConvertType(methodInfo->GetReturn()) + name + L"("; vint count = methodInfo->GetParameterCount(); for (vint i = 0; i < count; i++) { if (i > 0) { type += L", "; } type += ConvertArgumentType(methodInfo->GetParameter(i)->GetType()); } type += L")"; return type; } WString WfCppConfig::ConvertFunctionType(ITypeInfo* typeInfo) { if (typeInfo->GetDecorator() == ITypeInfo::SharedPtr) { return ConvertFunctionType(typeInfo->GetElementType()); } CHECK_ERROR(typeInfo->GetDecorator() == ITypeInfo::Generic, L"WfCppConfig::ConvertFunctionType(ITypeInfo*)#Internal error: Wrong function type."); CHECK_ERROR(typeInfo->GetTypeDescriptor() == description::GetTypeDescriptor(), L"WfCppConfig::ConvertFunctionType(ITypeInfo*)#Internal error: Wrong function type."); WString type = ConvertType(typeInfo->GetGenericArgument(0)) + L"("; vint count = typeInfo->GetGenericArgumentCount(); for (vint i = 1; i < count; i++) { if (i > 1) type += L", "; type += ConvertArgumentType(typeInfo->GetGenericArgument(i)); } type += L")"; return type; } bool WfCppConfig::IsSpecialGenericType(ITypeInfo* typeInfo) { switch (typeInfo->GetDecorator()) { case ITypeInfo::SharedPtr: if (typeInfo->GetTypeDescriptor() == description::GetTypeDescriptor()) { return true; } else if (typeInfo->GetTypeDescriptor() == description::GetTypeDescriptor()) { return true; } else { return false; } default: return false; } } WString WfCppConfig::ConvertType(ITypeDescriptor* typeInfo, WString delimiter) { return ConvertFullName(CppGetFullName(typeInfo), delimiter); } WString WfCppConfig::ConvertType(ITypeInfo* typeInfo, bool useHeaderEnumStructName) { switch (typeInfo->GetDecorator()) { case ITypeInfo::RawPtr: return ConvertType(typeInfo->GetElementType(), useHeaderEnumStructName) + L"*"; case ITypeInfo::SharedPtr: if (typeInfo->GetElementType()->GetDecorator() == ITypeInfo::Generic) { if (typeInfo->GetTypeDescriptor() == description::GetTypeDescriptor()) { return ConvertType(typeInfo->GetElementType(), useHeaderEnumStructName); } else if (typeInfo->GetTypeDescriptor() == description::GetTypeDescriptor()) { return ConvertType(typeInfo->GetElementType(), useHeaderEnumStructName); } } return L"::vl::Ptr<" + ConvertType(typeInfo->GetElementType(), useHeaderEnumStructName) + L">"; case ITypeInfo::Nullable: return L"::vl::Nullable<" + ConvertType(typeInfo->GetElementType(), useHeaderEnumStructName) + L">"; case ITypeInfo::Generic: if (typeInfo->GetTypeDescriptor() == description::GetTypeDescriptor()) { return L"::vl::Func<" + ConvertFunctionType(typeInfo) + L">"; } else if(typeInfo->GetTypeDescriptor() == description::GetTypeDescriptor()) { return L"::vl::collections::LazyList<" + ConvertType(typeInfo->GetGenericArgument(0), useHeaderEnumStructName) + L">"; } else { return ConvertType(typeInfo->GetElementType(), useHeaderEnumStructName); } default:; } if (useHeaderEnumStructName) { switch (typeInfo->GetTypeDescriptor()->GetTypeDescriptorFlags()) { case TypeDescriptorFlags::EnumType: if (tdDecls.Keys().Contains(typeInfo->GetTypeDescriptor())) { return L"::" + CppNameToHeaderEnumStructName(CppGetFullName(typeInfo->GetTypeDescriptor()), L"enum"); } break; case TypeDescriptorFlags::Struct: if (tdDecls.Keys().Contains(typeInfo->GetTypeDescriptor())) { return L"::" + CppNameToHeaderEnumStructName(CppGetFullName(typeInfo->GetTypeDescriptor()), L"struct"); } break; default:; } return ConvertType(typeInfo->GetTypeDescriptor()); } else { return ConvertType(typeInfo->GetTypeDescriptor()); } } WString WfCppConfig::ConvertArgumentType(ITypeInfo* typeInfo) { auto td = typeInfo->GetTypeDescriptor(); bool constRef = td == description::GetTypeDescriptor() || td == description::GetTypeDescriptor() || ( typeInfo->GetDecorator() == ITypeInfo::SharedPtr && typeInfo->GetElementType()->GetDecorator() == ITypeInfo::Generic && ( td == description::GetTypeDescriptor() || td == description::GetTypeDescriptor() ) ); if (constRef) { return L"const " + ConvertType(typeInfo) + L"&"; } else { return ConvertType(typeInfo); } } WString WfCppConfig::DefaultValue(ITypeInfo* typeInfo) { switch (typeInfo->GetDecorator()) { case ITypeInfo::RawPtr: return L"nullptr"; case ITypeInfo::SharedPtr: return L""; case ITypeInfo::Nullable: return L""; case ITypeInfo::Generic: return L""; default:; } auto td = typeInfo->GetTypeDescriptor(); if ((td->GetTypeDescriptorFlags()&TypeDescriptorFlags::EnumType) != TypeDescriptorFlags::Undefined) { return L"static_cast<" + ConvertType(typeInfo) + L">(0)"; } if (td == description::GetTypeDescriptor()) return L"0"; if (td == description::GetTypeDescriptor()) return L"0"; if (td == description::GetTypeDescriptor()) return L"0"; if (td == description::GetTypeDescriptor()) return L"0"; if (td == description::GetTypeDescriptor()) return L"0"; if (td == description::GetTypeDescriptor()) return L"0"; if (td == description::GetTypeDescriptor()) return L"0"; if (td == description::GetTypeDescriptor()) return L"0"; if (td == description::GetTypeDescriptor()) return L"false"; if (td == description::GetTypeDescriptor()) return L"0.0f"; if (td == description::GetTypeDescriptor()) return L"0.0"; return L""; } bool WfCppConfig::IsClassHasUserImplMethods(Ptr decl, bool searchInternalClasses) { List> unprocessed; CopyFrom(unprocessed, decl->declarations); for (vint i = 0; i < unprocessed.Count(); i++) { auto memberDecl = unprocessed[i]; if (auto cfe = memberDecl.Cast()) { CopyFrom(unprocessed, cfe->expandedDeclarations, true); } else if (auto cse = memberDecl.Cast()) { CopyFrom(unprocessed, cse->expandedDeclarations, true); } else if (auto classDecl = memberDecl.Cast()) { if (searchInternalClasses) { CopyFrom(unprocessed, classDecl->declarations, true); } } else if (attributeEvaluator->GetAttribute(memberDecl->attributes, L"cpp", L"UserImpl")) { return true; } } return false; } vint WfCppConfig::CountClassNamespace(Ptr decl) { vint result = 0; auto scope = manager->nodeScopes[decl.Obj()].Obj(); while (scope) { if (scope->ownerNode.Cast()) { result++; } scope = scope->parentScope.Obj(); } return result; } void WfCppConfig::GetClassNamespace(Ptr decl, collections::List& nss) { auto td = manager->declarationTypes[decl.Obj()].Obj(); auto name = ConvertType(td); vint count = CountClassNamespace(decl); List> matches; regexSplitName.Split(name, false, matches); CopyFrom( nss, From(matches) .Take(count) .Select([this](Ptr match) { return ConvertName(match->Result().Value()); }) ); } WString WfCppConfig::GetClassBaseName(Ptr decl) { auto td = manager->declarationTypes[decl.Obj()].Obj(); auto name = ConvertType(td); vint count = CountClassNamespace(decl); List> matches; regexSplitName.Split(name, false, matches); return From(matches) .Skip(count) .Select([this](Ptr match) { return ConvertName(match->Result().Value()); }) .Aggregate([](const WString& a, const WString& b) { return a + L"::" + b; }); } WString WfCppConfig::WriteNamespace(stream::StreamWriter& writer, collections::List& nss, collections::List& nss2) { vint commonPrefix = 0; for (vint i = 0; i < nss.Count() && i < nss2.Count(); i++) { if (nss[i] == nss2[i]) { commonPrefix++; } else { break; } } while (nss.Count() > commonPrefix) { for (vint i = 1; i < nss.Count(); i++) { writer.WriteChar(L'\t'); } writer.WriteLine(L"}"); nss.RemoveAt(nss.Count() - 1); } WString prefix; for (vint i = 0; i < nss.Count(); i++) { prefix += WString::FromChar(L'\t'); } for (vint i = commonPrefix; i < nss2.Count(); i++) { writer.WriteString(prefix); writer.WriteString(L"namespace "); writer.WriteLine(nss2[i]); writer.WriteString(prefix); writer.WriteLine(L"{"); nss.Add(nss2[i]); prefix += WString::FromChar(L'\t'); } return prefix; } WString WfCppConfig::WriteNamespace(stream::StreamWriter& writer, const WString& fullName, collections::List& nss, WString& name) { List> matches; regexSplitName.Split(fullName, false, matches); List nss2; CopyFrom( nss2, From(matches) .Select([this](Ptr match) { return ConvertName(match->Result().Value()); }) ); name = nss2[nss2.Count() - 1]; nss2.RemoveAt(nss2.Count() - 1); return WriteNamespace(writer, nss, nss2); } void WfCppConfig::WriteNamespaceEnd(stream::StreamWriter& writer, collections::List& nss) { while (nss.Count() > 0) { for (vint i = 1; i < nss.Count(); i++) { writer.WriteChar(L'\t'); } writer.WriteLine(L"}"); nss.RemoveAt(0); } } } } } /*********************************************************************** .\CPP\WFCPP_ASSIGNCLASSDECLSTOFILES.CPP ***********************************************************************/ namespace vl { namespace workflow { namespace cppcodegen { using namespace analyzer; using namespace collections; #define ASSIGN_INDEX_KEY(INDEX_DECL, INDEX_KEY, STRING_KEY) \ INDEX_DECL INDEX_KEY = globalDep.allTds.Keys().IndexOf(STRING_KEY); \ CHECK_ERROR(INDEX_KEY != -1, L"WfCppConfig::AssignClassDeclsToFiles()#Internal error.") \ /*********************************************************************** WfCppConfig::GenerateGlobalDep ***********************************************************************/ void WfCppConfig::ExpandClassDeclGroup(Ptr parent, GlobalDep& globalDep) { vint index = classDecls.Keys().IndexOf(parent.Obj()); if (index == -1) return; for (auto subDecl : classDecls.GetByIndex(index)) { ExpandClassDeclGroup(subDecl, globalDep); } auto directChildren = From(classDecls.GetByIndex(index)) .Select([&](Ptr decl) { auto stringKey = manager->declarationTypes[decl.Obj()]->GetTypeName(); ASSIGN_INDEX_KEY(auto, indexKey, stringKey); return indexKey; }); auto indirectChildren = From(classDecls.GetByIndex(index)) .Select([&](Ptr subDecl) { auto stringKey = manager->declarationTypes[subDecl.Obj()]->GetTypeName(); ASSIGN_INDEX_KEY(auto, indexKey, stringKey); return globalDep.expandedClassDecls.Keys().IndexOf(indexKey); }) .Where([](vint index) { return index != -1; }) .SelectMany([&](vint index) { return From(globalDep.expandedClassDecls.GetByIndex(index)); }); vint indexKey = -1; if (parent) { auto stringKey = manager->declarationTypes[parent.Obj()]->GetTypeName(); ASSIGN_INDEX_KEY(, indexKey, stringKey); } for (auto subDecl : directChildren.Concat(indirectChildren)) { globalDep.expandedClassDecls.Add(indexKey, subDecl); } } void WfCppConfig::GenerateClassDependencies(GlobalDep& globalDep) { for (auto [td, tdIndex] : indexed(globalDep.allTds.Values())) { vint count = td->GetBaseTypeDescriptorCount(); for (vint i = 0; i < count; i++) { auto baseTd = td->GetBaseTypeDescriptor(i); vint baseTdIndex = globalDep.allTds.Keys().IndexOf(baseTd->GetTypeName()); if (baseTdIndex != -1) { globalDep.dependencies.Add(tdIndex, baseTdIndex); } } } } void WfCppConfig::GenerateGlobalDep(GlobalDep& globalDep) { for (auto [td, index] : indexed(tdDecls.Keys())) { if (tdDecls.Values()[index].Cast()) { globalDep.allTds.Add(td->GetTypeName(), td); } } ExpandClassDeclGroup(nullptr, globalDep); GenerateClassDependencies(globalDep); } /*********************************************************************** WfCppConfig::GenerateClassLevelDep ***********************************************************************/ void WfCppConfig::CollectExpandedDepGroup(vint parentIndexKey, GlobalDep& globalDep, ClassLevelDep& classLevelDep) { const auto& items = globalDep.expandedClassDecls[parentIndexKey]; for (auto subDecl : items) { vint index = globalDep.dependencies.Keys().IndexOf(subDecl); if (index != -1) { for (auto dep : globalDep.dependencies.GetByIndex(index)) { if (items.Contains(dep)) { classLevelDep.depGroup.Add(subDecl, dep); } } } } } void WfCppConfig::CollectExpandedSubClass(vint subDeclIndexKey, GlobalDep& globalDep, ClassLevelDep& classLevelDep) { classLevelDep.subClass.Add(subDeclIndexKey, subDeclIndexKey); vint index = globalDep.expandedClassDecls.Keys().IndexOf(subDeclIndexKey); if (index != -1) { for (auto expandDecl : globalDep.expandedClassDecls.GetByIndex(index)) { classLevelDep.subClass.Add(expandDecl, subDeclIndexKey); } } } void WfCppConfig::GenerateClassLevelDep(Ptr parent, GlobalDep& globalDep, ClassLevelDep& classLevelDep) { classLevelDep.parentClass = parent; if (parent) { auto parentStringKey = manager->declarationTypes[parent.Obj()]->GetTypeName(); ASSIGN_INDEX_KEY(, classLevelDep.parentIndexKey, parentStringKey); } const auto& items = globalDep.expandedClassDecls[classLevelDep.parentIndexKey]; // for any specified class (or top level if nullptr) // find all direct and indirect internal classes // copy their dependencies, and generate sub classes by grouping them using the second level of classes CollectExpandedDepGroup(classLevelDep.parentIndexKey, globalDep, classLevelDep); for (auto subDecl : classDecls.Get(parent.Obj())) { auto subDeclStringKey = manager->declarationTypes[subDecl.Obj()]->GetTypeName(); ASSIGN_INDEX_KEY(auto, subDeclIndexKey, subDeclStringKey); CollectExpandedSubClass(subDeclIndexKey, globalDep, classLevelDep); } } /*********************************************************************** WfCppConfig::Collect ***********************************************************************/ void WfCppConfig::SortClassDecls(GlobalDep& globalDep) { // sort top level classes and all internal classes inside any classes for (vint i = classDecls.Count() - 1; i >= 0; i--) { // for any specified class (or top level if nullptr) // find all direct and indirect internal classes // copy their dependencies, and generate sub classes by grouping them using the second level of classes auto parent = classDecls.Keys()[i]; ClassLevelDep classLevelDep; GenerateClassLevelDep(parent, globalDep, classLevelDep); // sort them PartialOrderingProcessor pop; const auto& items = globalDep.expandedClassDecls[classLevelDep.parentIndexKey]; pop.InitWithSubClass(items, classLevelDep.depGroup, classLevelDep.subClass); pop.Sort(); // using the partial ordering result to sort the corresponding value list in classDecls { auto& values = const_cast>&>(classDecls.GetByIndex(i)); for (vint j = 0; j < pop.components.Count(); j++) { auto& component = pop.components[j]; // check error if (component.nodeCount > 1) { List tds; for (vint k = 0; k < component.nodeCount; k++) { auto& node = pop.nodes[component.firstNode[k]]; auto indexKey = classLevelDep.subClass[items[node.firstSubClassItem[0]]]; tds.Add(globalDep.allTds.Values()[indexKey]); } SortLambda(&tds[0], tds.Count(), [](ITypeDescriptor* a, ITypeDescriptor* b) { return a->GetTypeName() <=> b->GetTypeName(); }); manager->errors.Add(WfErrors::CppUnableToDecideClassOrder(tdDecls[tds[0]].Cast().Obj(), tds)); } auto& node = pop.nodes[component.firstNode[0]]; auto subDeclIndexKey = classLevelDep.subClass[items[node.firstSubClassItem[0]]]; auto subDecl = tdDecls[globalDep.allTds.Values()[subDeclIndexKey]].Cast(); values[j] = subDecl; } } if (!parent && manager->errors.Count() == 0) { for (vint i = 0; i < classLevelDep.subClass.Count(); i++) { vint index = classLevelDep.subClass.Values()[i]; if (!globalDep.topLevelClasses.Contains(index)) { globalDep.topLevelClasses.Add(index); } } for (vint i = 0; i < pop.nodes.Count(); i++) { auto& keyNode = pop.nodes[i]; vint keyIndex = classLevelDep.subClass[items[keyNode.firstSubClassItem[0]]]; for (vint j = 0; j < keyNode.ins->Count(); j++) { auto& valueNode = pop.nodes[keyNode.ins->Get(j)]; vint valueIndex = classLevelDep.subClass[items[valueNode.firstSubClassItem[0]]]; if (!globalDep.topLevelClassDep.Contains(keyIndex, valueIndex)) { globalDep.topLevelClassDep.Add(keyIndex, valueIndex); } } } } } } void WfCppConfig::GenerateFileClassMaps(GlobalDep& globalDep) { if (classDecls.Keys().Contains(nullptr)) { PartialOrderingProcessor popSubClass; Array customFirstItems; // popSubClass.nodes's index Array nonCustomFirstItems; // popSubClass.nodes's index Array isCustomItems; // popSubClass.nodes's index to boolean (true means custom item) Group subClassDepGroup; // popSubClass.nodes's index to index { // generate sub class using @cpp:File // globalDep.allTds.Keys()'s index to file name Dictionary subClass; for (vint i = 0; i < customFilesClasses.Count(); i++) { WString key = customFilesClasses.Keys()[i]; if (key != L"") { for (auto decl : customFilesClasses.GetByIndex(i)) { auto stringKey = manager->declarationTypes[decl.Obj()]->GetTypeName(); ASSIGN_INDEX_KEY(auto, indexKey, stringKey); subClass.Add(indexKey, key); } } } // check if all components contains either all classes of the same @cpp:File or a single non-@cpp:File class popSubClass.InitWithSubClass(globalDep.topLevelClasses, globalDep.topLevelClassDep, subClass); popSubClass.Sort(); for (vint i = 0; i < popSubClass.components.Count(); i++) { auto& component = popSubClass.components[i]; // check error if (component.nodeCount > 1) { List tds; for (vint j = 0; j < component.nodeCount; j++) { auto& node = popSubClass.nodes[component.firstNode[j]]; for (vint k = 0; k < node.subClassItemCount; k++) { auto indexKey = globalDep.topLevelClasses[node.firstSubClassItem[k]]; tds.Add(globalDep.allTds.Values()[indexKey]); } } SortLambda(&tds[0], tds.Count(), [](ITypeDescriptor* a, ITypeDescriptor* b) { return a->GetTypeName() <=> b->GetTypeName(); }); manager->errors.Add(WfErrors::CppUnableToSeparateCustomFile(tdDecls[tds[0]].Cast().Obj(), tds)); } } if (manager->errors.Count() != 0) { return; } // generate two item list, one have all @cpp:File classes put in front, one have all non-@cpp:File classes put in front // popSubClass.nodes's index { List customItems; List nonCustomItems; // categorize popSubClass.nodes's index to customItems and nonCustomItems for (vint i = 0; i < popSubClass.nodes.Count(); i++) { auto& node = popSubClass.nodes[i]; if (subClass.Keys().Contains(globalDep.topLevelClasses[node.firstSubClassItem[0]])) { customItems.Add(i); } else { nonCustomItems.Add(i); } } // sort items using allTds.Keys()'s index auto SortNodes = [&](List& items) { if (items.Count() > 0) { Sort(&items[0], items.Count(), [&](vint a, vint b) { auto& nodeA = popSubClass.nodes[a]; auto& nodeB = popSubClass.nodes[b]; vint indexA = From(nodeA.firstSubClassItem, nodeA.firstSubClassItem + nodeA.subClassItemCount) .Select([&](vint index) {return globalDep.topLevelClasses[index]; }) .Min(); vint indexB = From(nodeB.firstSubClassItem, nodeB.firstSubClassItem + nodeB.subClassItemCount) .Select([&](vint index) {return globalDep.topLevelClasses[index]; }) .Min(); return indexA <=> indexB; }); } }; SortNodes(customItems); SortNodes(nonCustomItems); // prepare customFirstItems, nonCustomFirstItems and isCustomItems isCustomItems.Resize(customItems.Count() + nonCustomItems.Count()); for (vint i = 0; i < customItems.Count(); i++) { isCustomItems[customItems[i]] = true; } for (vint i = 0; i < nonCustomItems.Count(); i++) { isCustomItems[nonCustomItems[i]] = false; } CopyFrom(customFirstItems, customItems); CopyFrom(nonCustomFirstItems, nonCustomItems); CopyFrom(nonCustomFirstItems, customItems, true); CopyFrom(customFirstItems, nonCustomItems, true); } } // copy popSubClass's sub class dependencies to subClassDepGroup for (vint i = 0; i < popSubClass.nodes.Count(); i++) { auto& node = popSubClass.nodes[i]; for (vint j = 0; j < node.ins->Count(); j++) { subClassDepGroup.Add(i, node.ins->Get(j)); } } // sort using inputs of two orders PartialOrderingProcessor popCustomFirst; popCustomFirst.InitWithGroup(customFirstItems, subClassDepGroup); popCustomFirst.Sort(); PartialOrderingProcessor popNonCustomFirst; popNonCustomFirst.InitWithGroup(nonCustomFirstItems, subClassDepGroup); popNonCustomFirst.Sort(); CHECK_ERROR(popCustomFirst.components.Count() == customFirstItems.Count(), L"WfCppConfig::AssignClassDeclsToFiles()#Internal error: Unexpected circle dependency found, this should have been caught by code above."); CHECK_ERROR(popNonCustomFirst.components.Count() == nonCustomFirstItems.Count(), L"WfCppConfig::AssignClassDeclsToFiles()#Future error: Unexpected circle dependency found, this should have been caught by code above."); CHECK_ERROR(popCustomFirst.components.Count() == popNonCustomFirst.components.Count(), L"WfCppConfig::AssignClassDeclsToFiles()#Future error: Unexpected circle dependency found, this should have been caught by code above."); // translate popCustomFirst's sorting result // popSubClass.nodes's index Array customFirstOrder(popCustomFirst.components.Count()); for (vint i = 0; i < popCustomFirst.components.Count(); i++) { auto& component = popCustomFirst.components[i]; customFirstOrder[i] = customFirstItems[component.firstNode[0]]; } // translate popNonCustomFirst's sorting result // popSubClass.nodes's index Array nonCustomFirstOrder(popNonCustomFirst.components.Count()); for (vint i = 0; i < popNonCustomFirst.components.Count(); i++) { auto& component = popNonCustomFirst.components[i]; nonCustomFirstOrder[i] = nonCustomFirstItems[component.firstNode[0]]; } // dispatch non-@cpp:File classes to non-@cpp:File headers vint currentHeaderIndex = 0; vint nonCustomFirstOrderPicked = 0; vint customFirstOrderPicked = 0; Array visited(customFirstOrder.Count()); for (vint i = 0; i < visited.Count(); i++) { visited[i] = false; } auto pickItems = [&](Array& order, vint& picked, bool customItem) { while (picked < order.Count()) { vint item = order[picked]; if (visited[item]) { picked++; } else if (isCustomItems[item] == customItem) { visited[item] = true; picked++; if(!customItem) { auto& node = popSubClass.nodes[item]; for (vint i = 0; i < node.subClassItemCount; i++) { auto indexKey = globalDep.topLevelClasses[node.firstSubClassItem[i]]; auto td = globalDep.allTds.Values()[indexKey]; headerFilesClasses.Add(currentHeaderIndex, tdDecls[td].Cast()); } } } else { break; } } }; while (nonCustomFirstOrderPicked < nonCustomFirstOrder.Count() || customFirstOrderPicked < customFirstOrder.Count()) { pickItems(nonCustomFirstOrder, nonCustomFirstOrderPicked, false); pickItems(customFirstOrder, customFirstOrderPicked, false); pickItems(nonCustomFirstOrder, nonCustomFirstOrderPicked, true); pickItems(customFirstOrder, customFirstOrderPicked, true); currentHeaderIndex++; } // calculate header includes // globalDep.allTds.keys()'s index to header index Dictionary headers; auto addToHeaders = [&](const List>& decls, vint headerIndex) { for (auto decl : decls) { auto stringKey = manager->declarationTypes[decl.Obj()]->GetTypeName(); ASSIGN_INDEX_KEY(auto, indexKey, stringKey); headers.Add(indexKey, headerIndex); } }; auto calculateIncludes = [&](const List>& decls, SortedList& includes) { for (auto decl : decls) { auto stringKey = manager->declarationTypes[decl.Obj()]->GetTypeName(); ASSIGN_INDEX_KEY(auto, indexKey, stringKey); vint index = globalDep.topLevelClassDep.Keys().IndexOf(indexKey); if (index != -1) { const auto& values = globalDep.topLevelClassDep.GetByIndex(index); for (vint i = 0; i < values.Count(); i++) { vint header = headers[values[i]]; if (header != 0 && !includes.Contains(header)) { includes.Add(header); } } } } }; for (vint i = 0; i < customFilesClasses.Count(); i++) { if (customFilesClasses.Keys()[i] != L"") { addToHeaders(customFilesClasses.GetByIndex(i), i); } } for (vint i = 0; i < headerFilesClasses.Count(); i++) { addToHeaders(headerFilesClasses.GetByIndex(i), -headerFilesClasses.Keys()[i]); } for (vint i = 0; i < customFilesClasses.Count(); i++) { if (customFilesClasses.Keys()[i] != L"") { SortedList includes; calculateIncludes(customFilesClasses.GetByIndex(i), includes); for (vint j = 0; j < includes.Count(); j++) { headerIncludes.Add(i, includes[j]); } } } for (vint i = 0; i < headerFilesClasses.Count(); i++) { if (headerFilesClasses.Keys()[i] != 0) { SortedList includes; calculateIncludes(headerFilesClasses.GetByIndex(i), includes); for (vint j = 0; j < includes.Count(); j++) { headerIncludes.Add(-headerFilesClasses.Keys()[i], includes[j]); } } } } } void WfCppConfig::SortFileClassMaps(GlobalDep& globalDep) { // sort customFilesClasses and headerFilesClasses according to classDecls[nullptr] if (classDecls.Keys().Contains(nullptr)) { List> ordered; CopyFrom(ordered, classDecls[nullptr]); for (vint i = 0; i < customFilesClasses.Count(); i++) { auto& values = const_cast>&>(customFilesClasses.GetByIndex(i)); Sort>(&values[0], values.Count(), [&](Ptr a, Ptr b) { vint aIndex = ordered.IndexOf(a.Obj()); vint bIndex = ordered.IndexOf(b.Obj()); return aIndex <=> bIndex; }); } for (vint i = 0; i < headerFilesClasses.Count(); i++) { auto& values = const_cast>&>(headerFilesClasses.GetByIndex(i)); Sort>(&values[0], values.Count(), [&](Ptr a, Ptr b) { vint aIndex = ordered.IndexOf(a.Obj()); vint bIndex = ordered.IndexOf(b.Obj()); return aIndex <=> bIndex; }); } } } void WfCppConfig::AssignClassDeclsToFiles() { GlobalDep globalDep; GenerateGlobalDep(globalDep); if (manager->errors.Count() == 0) SortClassDecls(globalDep); if (manager->errors.Count() == 0) GenerateFileClassMaps(globalDep); if (manager->errors.Count() == 0) SortFileClassMaps(globalDep); } #undef ASSIGN_INDEX_KEY } } } /*********************************************************************** .\CPP\WFCPP_CLASS.CPP ***********************************************************************/ namespace vl { namespace workflow { namespace cppcodegen { using namespace collections; using namespace reflection; using namespace reflection::description; using namespace analyzer; bool IsVirtual(WfCppConfig* config, WfFunctionDeclaration* node) { vint index = config->manager->declarationMemberInfos.Keys().IndexOf(node); if (index != -1) { auto methodInfo = dynamic_cast(config->manager->declarationMemberInfos.Values()[index].Obj()); if (methodInfo->IsStatic()) { return false; } auto td = methodInfo->GetOwnerTypeDescriptor(); return td->GetTypeDescriptorFlags() == TypeDescriptorFlags::Interface; } return false; } /*********************************************************************** WfGenerateClassMemberDeclVisitor ***********************************************************************/ class WfGenerateClassMemberDeclVisitor : public Object, public WfDeclaration::IVisitor { public: WfCppConfig* config; stream::StreamWriter& writer; WString className; WString prefix; bool forClassExpr; WfGenerateClassMemberDeclVisitor(WfCppConfig* _config, stream::StreamWriter& _writer, const WString& _className, const WString& _prefix, bool _forClassExpr) :config(_config) , writer(_writer) , className(_className) , prefix(_prefix) , forClassExpr(_forClassExpr) { } void Visit(WfNamespaceDeclaration* node)override { } void Visit(WfFunctionDeclaration* node)override { bool isVirtual = IsVirtual(config, node); writer.WriteString(prefix); if (isVirtual) { writer.WriteString(L"virtual "); } else if (node->functionKind == WfFunctionKind::Static) { writer.WriteString(L"static "); } config->WriteFunctionHeader(writer, Ptr(node), config->ConvertName(node->name.value), true); if (isVirtual) { writer.WriteString(L" = 0"); } else if (node->functionKind == WfFunctionKind::Override) { writer.WriteString(L" override"); } writer.WriteLine(L";"); } void Visit(WfVariableDeclaration* node)override { auto scope = config->manager->nodeScopes[node].Obj(); auto symbol = scope->symbols[node->name.value][0]; auto typeInfo = symbol->typeInfo; writer.WriteString(prefix + config->ConvertType(typeInfo.Obj()) + L" " + config->ConvertName(node->name.value)); if (forClassExpr) { auto defaultValue = config->DefaultValue(typeInfo.Obj()); if (defaultValue != L"") { writer.WriteString(L" = "); writer.WriteString(defaultValue); } } writer.WriteLine(L";"); } void Visit(WfEventDeclaration* node)override { auto eventInfo = dynamic_cast(config->manager->declarationMemberInfos[node].Obj()); auto typeInfo = eventInfo->GetHandlerType()->GetElementType(); writer.WriteString(prefix); writer.WriteString(L"::vl::EventGetGenericArgumentCount(); for (vint i = 1; i < count; i++) { if (i > 1) writer.WriteString(L", "); writer.WriteString(config->ConvertType(typeInfo->GetGenericArgument(i))); } writer.WriteLine(L")> " + config->ConvertName(node->name.value) + L";"); } void Visit(WfPropertyDeclaration* node)override { } void Visit(WfStaticInitDeclaration* node)override { } void Visit(WfConstructorDeclaration* node)override { auto methodInfo = dynamic_cast(config->manager->declarationMemberInfos[node].Obj()); writer.WriteString(prefix); config->WriteFunctionHeader(writer, methodInfo, className, false); writer.WriteLine(L";"); } void Visit(WfDestructorDeclaration* node)override { writer.WriteLine(prefix + L"~" + className + L"();"); } void Visit(WfClassDeclaration* node)override { } void Visit(WfEnumDeclaration* node)override { } void Visit(WfStructDeclaration* node)override { } void Visit(WfVirtualCfeDeclaration* node)override { for (auto decl : node->expandedDeclarations) { decl->Accept(this); } } void Visit(WfVirtualCseDeclaration* node)override { for (auto decl : node->expandedDeclarations) { decl->Accept(this); } } }; class WfGenerateClassMemberInitVisitor : public empty_visitor::DeclarationVisitor { public: WfCppConfig * config; stream::StreamWriter& writer; WString prefix; vint& callIndex; WfGenerateClassMemberInitVisitor(WfCppConfig* _config, stream::StreamWriter& _writer, const WString& _prefix, vint& _callIndex) :config(_config) , writer(_writer) , prefix(_prefix) , callIndex(_callIndex) { } void WriteVariableHeader(WfVariableDeclaration* node) { writer.WriteString(prefix); if (callIndex++ == 0) { writer.WriteString(L"\t: "); } else { writer.WriteString(L"\t, "); } writer.WriteString(config->ConvertName(node->name.value)); } void Visit(WfVariableDeclaration* node)override { auto scope = config->manager->nodeScopes[node].Obj(); auto symbol = scope->symbols[node->name.value][0]; auto typeInfo = symbol->typeInfo; if (node->expression) { WriteVariableHeader(node); writer.WriteString(L"("); GenerateExpression(config, writer, node->expression, typeInfo.Obj()); writer.WriteLine(L")"); } else { auto defaultValue = config->DefaultValue(typeInfo.Obj()); if (defaultValue != L"") { WriteVariableHeader(node); writer.WriteString(L"("); writer.WriteString(defaultValue); writer.WriteLine(L")"); } } } void Dispatch(WfVirtualCfeDeclaration* node)override { for (auto decl : node->expandedDeclarations) { decl->Accept(this); } } void Dispatch(WfVirtualCseDeclaration* node)override { for (auto decl : node->expandedDeclarations) { decl->Accept(this); } } }; void GenerateClassMemberDecl(WfCppConfig* config, stream::StreamWriter& writer, const WString& className, Ptr memberDecl, const WString& prefix, bool forClassExpr) { WfGenerateClassMemberDeclVisitor visitor(config, writer, className, prefix, forClassExpr); memberDecl->Accept(&visitor); } /*********************************************************************** WfGenerateClassMemberImplVisitor ***********************************************************************/ class WfGenerateClassMemberImplVisitor : public Object, public WfDeclaration::IVisitor { public: WfCppConfig* config; stream::StreamWriter& writer; WfClassDeclaration* classDef; WString classBaseName; WString className; WString classFullName; WString prefix; bool printableMember = false; WfGenerateClassMemberImplVisitor(WfCppConfig* _config, stream::StreamWriter& _writer, WfClassDeclaration* _classDef, const WString& _classBaseName, const WString& _className, const WString& _classFullName, const WString& _prefix) :config(_config) , writer(_writer) , classDef(_classDef) , classBaseName(_classBaseName) , className(_className) , classFullName(_classFullName) , prefix(_prefix) { } void WriteNotImplemented(const WString& classFullName) { writer.WriteString(prefix); writer.WriteLine(L"{/* USER_CONTENT_BEGIN(" + classFullName + L") */"); writer.WriteString(prefix); writer.WriteLine(L"\tthrow ::vl::Exception(L\"You should implement this function.\");"); writer.WriteString(prefix); writer.WriteLine(L"}/* USER_CONTENT_END() */"); } void Visit(WfNamespaceDeclaration* node)override { } void Visit(WfFunctionDeclaration* node)override { if (!IsVirtual(config, node)) { printableMember = true; writer.WriteString(prefix); auto returnType = config->WriteFunctionHeader(writer, Ptr(node), classBaseName + L"::" + config->ConvertName(node->name.value), true); writer.WriteLine(L""); bool userImpl = config->attributeEvaluator->GetAttribute(node->attributes, L"cpp", L"UserImpl"); if (userImpl) { WriteNotImplemented(classFullName); } else { config->WriteFunctionBody(writer, node->statement, prefix, returnType); } } } void Visit(WfVariableDeclaration* node)override { } void Visit(WfEventDeclaration* node)override { } void Visit(WfPropertyDeclaration* node)override { } void Visit(WfStaticInitDeclaration* node)override { } void Visit(WfConstructorDeclaration* node)override { auto scope = config->manager->nodeScopes[node].Obj(); printableMember = true; auto methodInfo = dynamic_cast(config->manager->declarationMemberInfos[node].Obj()); List arguments; for (auto argument : node->arguments) { arguments.Add(config->ConvertName(argument->name.value)); } writer.WriteString(prefix); config->WriteFunctionHeader(writer, methodInfo, arguments, classBaseName + L"::" + className, false); writer.WriteLine(L""); vint callIndex = 0; for (auto call : node->baseConstructorCalls) { auto callType = CreateTypeInfoFromType(scope, call->type, false); auto callCtor = config->manager->baseConstructorCallResolvings[{node, callType->GetTypeDescriptor()}].value; writer.WriteString(prefix); if (callIndex++ == 0) { writer.WriteString(L"\t: "); } else { writer.WriteString(L"\t, "); } writer.WriteString(config->ConvertType(callType->GetTypeDescriptor())); writer.WriteString(L"("); for (auto [argument, argumentIndex] : indexed(call->arguments)) { if (argumentIndex) writer.WriteString(L", "); GenerateExpression(config, writer, argument, callCtor->GetParameter(argumentIndex)->GetType()); } writer.WriteLine(L")"); } if (classDef) { WfGenerateClassMemberInitVisitor visitor(config, writer, prefix, callIndex); for (auto member : classDef->declarations) { member->Accept(&visitor); } } bool userImpl = config->attributeEvaluator->GetAttribute(node->attributes, L"cpp", L"UserImpl"); if (userImpl) { WriteNotImplemented(classFullName); } else { config->WriteFunctionBody(writer, node->statement, prefix, nullptr); } } void Visit(WfDestructorDeclaration* node)override { printableMember = true; writer.WriteLine(prefix + classBaseName + L"::~" + className + L"()"); bool userImpl = config->attributeEvaluator->GetAttribute(node->attributes, L"cpp", L"UserImpl"); if (userImpl) { WriteNotImplemented(classFullName); } else { config->WriteFunctionBody(writer, node->statement, prefix, nullptr); } } void Visit(WfClassDeclaration* node)override { } void Visit(WfEnumDeclaration* node)override { } void Visit(WfStructDeclaration* node)override { } void Visit(WfVirtualCfeDeclaration* node)override { for (auto decl : node->expandedDeclarations) { decl->Accept(this); } } void Visit(WfVirtualCseDeclaration* node)override { for (auto decl : node->expandedDeclarations) { decl->Accept(this); } } }; bool GenerateClassMemberImpl(WfCppConfig* config, stream::StreamWriter& writer, WfClassDeclaration* classDef, const WString& classBaseName, const WString& className, const WString& classFullName, Ptr memberDecl, const WString& prefix) { WfGenerateClassMemberImplVisitor visitor(config, writer, classDef, classBaseName, className, classFullName, prefix); memberDecl->Accept(&visitor); return visitor.printableMember; } } } } /*********************************************************************** .\CPP\WFCPP_COLLECT.CPP ***********************************************************************/ namespace vl { namespace workflow { namespace cppcodegen { using namespace collections; using namespace regex; using namespace reflection::description; using namespace analyzer; /*********************************************************************** CollectModule ***********************************************************************/ class WfCollectModuleVisitor : public traverse_visitor::AstVisitor { public: WfCppConfig* config; Ptr surroundingClassDecl = nullptr; vint skipCounter = 0; WfCollectModuleVisitor(WfCppConfig* _config) :config(_config) { } WString GetScopePostfix(WfLexicalScope* scope) { WString name; while (scope) { if (auto decl = scope->ownerNode.Cast()) { name = config->ConvertName(decl->name.value) + L"_" + name; } scope = scope->parentScope.Obj(); } return name; } void Traverse(WfOrderedLambdaExpression* node)override { WString prefix = L"__vwsno" + itow(config->lambdaExprs.Count() + 1) + L"_" + config->assemblyName + L"_"; WString postfix = GetScopePostfix(config->manager->nodeScopes[node].Obj()); WString name = prefix + postfix; config->lambdaExprs.Add(Ptr(node), name); config->classClosures.Add(surroundingClassDecl, Ptr(node)); } void Traverse(WfFunctionExpression* node)override { WString prefix = L"__vwsnf" + itow(config->lambdaExprs.Count() + 1) + L"_" + config->assemblyName + L"_"; WString postfix = GetScopePostfix(config->manager->nodeScopes[node].Obj()); WString name = prefix + postfix; config->lambdaExprs.Add(Ptr(node), name); config->classClosures.Add(surroundingClassDecl, Ptr(node)); } void Traverse(WfNewInterfaceExpression* node)override { WString prefix = L"__vwsnc" + itow(config->classExprs.Count() + 1) + L"_" + config->assemblyName + L"_"; WString postfix = GetScopePostfix(config->manager->nodeScopes[node].Obj()); auto result = config->manager->expressionResolvings[node]; auto td = result.constructorInfo->GetOwnerTypeDescriptor(); WString name = prefix + postfix + config->ConvertType(td, L"_"); config->classExprs.Add(Ptr(node), name); config->classClosures.Add(surroundingClassDecl, Ptr(node)); } void Traverse(WfFunctionDeclaration* node)override { if (skipCounter == 1) { config->funcDecls.Add(Ptr(node)); } } void Traverse(WfVariableDeclaration* node)override { if (skipCounter == 1) { config->varDecls.Add(Ptr(node)); } } void Traverse(WfStaticInitDeclaration* node)override { config->staticInitDecls.Add(Ptr(node)); } void Visit(WfClassDeclaration* node)override { config->classDecls.Add(surroundingClassDecl, Ptr(node)); config->tdDecls.Add(config->manager->declarationTypes[node].Obj(), Ptr(node)); if (!surroundingClassDecl) { WString file; if (auto att = config->attributeEvaluator->GetAttribute(node->attributes, L"cpp", L"File")) { auto attValue = config->attributeEvaluator->GetAttributeValue(att); CHECK_ERROR(attValue.type == runtime::WfInsType::String, L"Unexpected value in attribute: @cpp.File."); file = attValue.stringValue; } config->customFilesClasses.Add(file, Ptr(node)); } auto oldSurroundingClassDecl = surroundingClassDecl; surroundingClassDecl = Ptr(node); skipCounter++; traverse_visitor::AstVisitor::Visit(node); skipCounter--; surroundingClassDecl = oldSurroundingClassDecl; } void Traverse(WfEnumDeclaration* node)override { config->enumDecls.Add(surroundingClassDecl, Ptr(node)); config->tdDecls.Add(config->manager->declarationTypes[node].Obj(), Ptr(node)); } void Traverse(WfStructDeclaration* node)override { config->structDecls.Add(surroundingClassDecl, Ptr(node)); config->tdDecls.Add(config->manager->declarationTypes[node].Obj(), Ptr(node)); } void Visit(WfFunctionDeclaration* node)override { skipCounter++; traverse_visitor::AstVisitor::Visit(node); skipCounter--; } void Visit(WfVariableDeclaration* node)override { skipCounter++; traverse_visitor::AstVisitor::Visit(node); skipCounter--; } }; void CollectModule(WfCppConfig* config, Ptr module) { WfCollectModuleVisitor(config).InspectInto(module.Obj()); } /*********************************************************************** WfCppConfig::CollectClosureInfo ***********************************************************************/ class WfCppCollectClassExprInfoVisitor : public empty_visitor::DeclarationVisitor { public: WfCppConfig* config; vint variableCount = 0; Ptr capture; WfCppCollectClassExprInfoVisitor(WfCppConfig* _config) :config(_config) { } void Visit(WfVariableDeclaration* node)override { variableCount++; } void Dispatch(WfVirtualCfeDeclaration* node)override { for (auto decl : node->expandedDeclarations) { decl->Accept(this); } } void Dispatch(WfVirtualCseDeclaration* node)override { for (auto decl : node->expandedDeclarations) { decl->Accept(this); } } void Execute(WfNewInterfaceExpression* node) { capture = config->manager->lambdaCaptures[node]; for (auto memberDecl : node->declarations) { memberDecl->Accept(this); } } }; Ptr WfCppConfig::CollectClosureInfo(Ptr closure) { using SymbolPair = Pair>; auto info = Ptr(new ClosureInfo); WfLexicalScope* scope = nullptr; if (auto ordered = closure.Cast()) { // stable symbol order by sorting them by name CopyFrom( info->symbols, From(manager->lambdaCaptures[ordered.Obj()]->symbols) .Select([](Ptr symbol) { return SymbolPair(symbol->name, symbol); }) ); scope = manager->nodeScopes[ordered.Obj()].Obj(); } else if (auto funcExpr = closure.Cast()) { // stable symbol order by sorting them by name CopyFrom( info->symbols, From(manager->lambdaCaptures[funcExpr->function.Obj()]->symbols) .Select([](Ptr symbol) { return SymbolPair(symbol->name, symbol); }) ); scope = manager->nodeScopes[funcExpr->function.Obj()].Obj(); } else if (auto classExpr = closure.Cast()) { WfCppCollectClassExprInfoVisitor visitor(this); visitor.Execute(classExpr.Obj()); if (visitor.capture) { // stable symbol order by sorting them by name CopyFrom( info->symbols, From(visitor.capture->symbols) .Skip(visitor.variableCount) .Select([](Ptr symbol) { return SymbolPair(symbol->name, symbol); }) ); CopyFrom( info->ctorArgumentSymbols, From(visitor.capture->ctorArgumentSymbols) .Select([](Ptr symbol) { return SymbolPair(symbol->name, symbol); }) ); } scope = manager->nodeScopes[classExpr.Obj()].Obj(); } Ptr methodConfig; while (scope) { if (scope->typeOfThisExpr) { if (methodConfig) { info->thisTypes.Add(scope->typeOfThisExpr); if (!methodConfig->parentThisAccessable) { break; } methodConfig = nullptr; } } if (scope->functionConfig) { if (scope->functionConfig->thisAccessable) { methodConfig = scope->functionConfig; } } scope = scope->parentScope.Obj(); } return info; } /*********************************************************************** WfCppConfig::Collect ***********************************************************************/ void WfCppConfig::Collect() { for (auto module : manager->GetModules()) { CollectModule(this, module); } for (auto lambda : lambdaExprs.Keys()) { auto closureInfo = CollectClosureInfo(lambda); closureInfo->lambdaClassName = lambdaExprs[lambda.Obj()]; closureInfos.Add(lambda, closureInfo); } for (auto classExpr : classExprs.Keys()) { auto closureInfo = CollectClosureInfo(classExpr); closureInfo->lambdaClassName = classExprs[classExpr.Obj()]; closureInfos.Add(classExpr, closureInfo); } } } } } /*********************************************************************** .\CPP\WFCPP_EXPRESSION.CPP ***********************************************************************/ namespace vl { namespace workflow { namespace cppcodegen { using namespace collections; using namespace regex; using namespace stream; using namespace reflection; using namespace reflection::description; using namespace analyzer; /*********************************************************************** Expression Helpers ***********************************************************************/ template void WriteBoxValue(WfCppConfig* config, stream::StreamWriter& writer, ITypeInfo* type, const T& writeExpression) { writer.WriteString(L"::vl::__vwsn::Box("); writeExpression(); writer.WriteString(L")"); } template void WriteUnboxValue(WfCppConfig* config, stream::StreamWriter& writer, ITypeInfo* type, const T& writeExpression) { writer.WriteString(L"::vl::__vwsn::Unbox<"); writer.WriteString(config->ConvertType(type)); writer.WriteString(L">("); writeExpression(); writer.WriteString(L")"); } template void WriteUnboxWeakValue(WfCppConfig* config, stream::StreamWriter& writer, ITypeInfo* type, const T& writeExpression) { writer.WriteString(L"::vl::__vwsn::UnboxWeak<"); writer.WriteString(config->ConvertType(type)); writer.WriteString(L">("); writeExpression(); writer.WriteString(L")"); } template void ConvertValueType(WfCppConfig* config, stream::StreamWriter& writer, ITypeDescriptor* fromTd, ITypeDescriptor* toTd, const T& writeExpression) { if (fromTd == toTd) { writeExpression(); } else if (fromTd == description::GetTypeDescriptor()) { writer.WriteString(L"::vl::__vwsn::Parse<"); writer.WriteString(config->ConvertType(toTd)); writer.WriteString(L">("); writeExpression(); writer.WriteString(L")"); } else if (toTd == description::GetTypeDescriptor()) { writer.WriteString(L"::vl::__vwsn::ToString("); writeExpression(); writer.WriteString(L")"); } else { writer.WriteString(L"static_cast<"); writer.WriteString(config->ConvertType(toTd)); writer.WriteString(L">("); writeExpression(); writer.WriteString(L")"); } } void ConvertType(WfCppConfig* config, stream::StreamWriter& writer, ITypeInfo* fromType, ITypeInfo* toType, const Func& writeExpression, bool strongCast) { if (fromType->GetTypeDescriptor()->GetTypeDescriptorFlags() == TypeDescriptorFlags::Object) { if (strongCast) { WriteUnboxValue(config, writer, toType, writeExpression); } else { WriteUnboxWeakValue(config, writer, toType, writeExpression); } return; } else if (toType->GetTypeDescriptor()->GetTypeDescriptorFlags() == TypeDescriptorFlags::Object) { WriteBoxValue(config, writer, fromType, writeExpression); return; } else { auto tdVe = description::GetTypeDescriptor(); if (toType->GetTypeDescriptor() == tdVe) { if (toType->GetElementType()->GetDecorator() == ITypeInfo::Generic) { if ((fromType->GetTypeDescriptor() == tdVe && fromType->GetElementType()->GetDecorator() != ITypeInfo::Generic) || fromType->GetTypeDescriptor()->CanConvertTo(description::GetTypeDescriptor()) || fromType->GetTypeDescriptor()->CanConvertTo(description::GetTypeDescriptor()) ) { writer.WriteString(L"::vl::reflection::description::GetLazyList<"); writer.WriteString(config->ConvertType(toType->GetElementType()->GetGenericArgument(0))); writer.WriteString(L">("); writeExpression(); writer.WriteString(L")"); return; } } else { if ((fromType->GetTypeDescriptor() == tdVe && fromType->GetElementType()->GetDecorator() == ITypeInfo::Generic) || fromType->GetHint() == TypeInfoHint::NativeCollectionReference ) { writer.WriteString(L"::vl::__vwsn::UnboxCollection<"); writer.WriteString(config->ConvertType(tdVe)); writer.WriteString(L">("); writeExpression(); writer.WriteString(L")"); return; } } } switch (fromType->GetDecorator()) { case ITypeInfo::RawPtr: { switch (toType->GetDecorator()) { case ITypeInfo::RawPtr: if (strongCast) writer.WriteString(L"::vl::__vwsn::Ensure("); if (fromType->GetTypeDescriptor()->CanConvertTo(toType->GetTypeDescriptor())) { writer.WriteString(L"static_cast<"); writer.WriteString(config->ConvertType(toType->GetTypeDescriptor())); writer.WriteString(L"*>("); writeExpression(); writer.WriteString(L")"); } else { writer.WriteString(L"::vl::__vwsn::RawPtrCast<"); writer.WriteString(config->ConvertType(toType->GetTypeDescriptor())); writer.WriteString(L">("); writeExpression(); writer.WriteString(L")"); } if (strongCast) writer.WriteString(L")"); return; case ITypeInfo::SharedPtr: if (strongCast) writer.WriteString(L"::vl::__vwsn::Ensure("); if (fromType->GetTypeDescriptor()->CanConvertTo(toType->GetTypeDescriptor())) { writer.WriteString(L"::vl::Ptr<"); writer.WriteString(config->ConvertType(toType->GetTypeDescriptor())); writer.WriteString(L">("); writeExpression(); writer.WriteString(L")"); } else { writer.WriteString(L"::vl::__vwsn::SharedPtrCast<"); writer.WriteString(config->ConvertType(toType->GetTypeDescriptor())); writer.WriteString(L">("); writeExpression(); writer.WriteString(L")"); } if (strongCast) writer.WriteString(L")"); return; default:; } } break; case ITypeInfo::SharedPtr: { switch (toType->GetDecorator()) { case ITypeInfo::RawPtr: if (strongCast) writer.WriteString(L"::vl::__vwsn::Ensure("); if (fromType->GetTypeDescriptor()->CanConvertTo(toType->GetTypeDescriptor())) { writer.WriteString(L"static_cast<"); writer.WriteString(config->ConvertType(toType->GetTypeDescriptor())); writer.WriteString(L"*>("); writeExpression(); writer.WriteString(L".Obj())"); } else { writer.WriteString(L"::vl::__vwsn::RawPtrCast<"); writer.WriteString(config->ConvertType(toType->GetTypeDescriptor())); writer.WriteString(L">("); writeExpression(); writer.WriteString(L".Obj())"); } if (strongCast) writer.WriteString(L")"); return; case ITypeInfo::SharedPtr: if (strongCast) writer.WriteString(L"::vl::__vwsn::Ensure("); if (fromType->GetTypeDescriptor()->CanConvertTo(toType->GetTypeDescriptor())) { writer.WriteString(L"::vl::Ptr<"); writer.WriteString(config->ConvertType(toType->GetTypeDescriptor())); writer.WriteString(L">("); writeExpression(); writer.WriteString(L")"); } else { writer.WriteString(L"::vl::__vwsn::SharedPtrCast<"); writer.WriteString(config->ConvertType(toType->GetTypeDescriptor())); writer.WriteString(L">("); writeExpression(); writer.WriteString(L".Obj())"); } if (strongCast) writer.WriteString(L")"); return; default:; } } break; case ITypeInfo::Nullable: { switch (toType->GetDecorator()) { case ITypeInfo::Nullable: if (strongCast) writer.WriteString(L"::vl::__vwsn::Ensure("); writer.WriteString(L"::vl::__vwsn::NullableCast<"); writer.WriteString(config->ConvertType(toType->GetTypeDescriptor())); writer.WriteString(L">("); writeExpression(); writer.WriteString(L")"); if (strongCast) writer.WriteString(L")"); return; case ITypeInfo::TypeDescriptor: ConvertValueType(config, writer, fromType->GetTypeDescriptor(), toType->GetTypeDescriptor(), [&]() { writeExpression(); writer.WriteString(L".Value()"); }); return; default:; } } break; case ITypeInfo::TypeDescriptor: { switch (toType->GetDecorator()) { case ITypeInfo::Nullable: writer.WriteString(config->ConvertType(toType)); writer.WriteString(L"("); ConvertValueType(config, writer, fromType->GetTypeDescriptor(), toType->GetTypeDescriptor(), writeExpression); writer.WriteString(L")"); return; case ITypeInfo::TypeDescriptor: ConvertValueType(config, writer, fromType->GetTypeDescriptor(), toType->GetTypeDescriptor(), writeExpression); return; default:; } } break; default:; } } writer.WriteString(L"/* NOT EXISTS: convert ("); writer.WriteString(config->ConvertType(fromType)); writer.WriteString(L") to ("); writer.WriteString(config->ConvertType(toType)); writer.WriteString(L") */ __vwsn_not_exists__("); writeExpression(); writer.WriteString(L")"); } /*********************************************************************** WfGenerateExpressionVisitor ***********************************************************************/ class WfGenerateExpressionVisitor : public Object , public WfExpression::IVisitor { public: WfCppConfig* config; stream::StreamWriter& writer; bool useReturnValue; WfGenerateExpressionVisitor(WfCppConfig* _config, stream::StreamWriter& _writer, bool _useReturnValue) :config(_config) , writer(_writer) , useReturnValue(_useReturnValue) { } bool NeedConvertType(ITypeInfo* fromType, ITypeInfo*& toType) { if (toType == nullptr) { toType = fromType; return false; } if (IsSameType(fromType, toType)) { return false; } else { return true; } } template void WriteBoxValue(ITypeInfo* type, const T& writeExpression) { cppcodegen::WriteBoxValue(config, writer, type, writeExpression); } template void WriteUnboxValue(ITypeInfo* type, const T& writeExpression) { cppcodegen::WriteUnboxValue(config, writer, type, writeExpression); } template void WriteUnboxWeakValue(ITypeInfo* type, const T& writeExpression) { cppcodegen::WriteUnboxWeakValue(config, writer, type, writeExpression); } void ConvertMultipleTypes(ITypeInfo** types, vint typesLength, Func writeExpression) { if (typesLength == 1) { writeExpression(); } else if (NeedConvertType(types[0], types[1])) { ConvertMultipleTypes(types + 1, typesLength - 1, [&]() { auto fromType = types[0]; auto toType = types[1]; ConvertType(config, writer, fromType, toType, writeExpression, false); }); } else { return ConvertMultipleTypes(types + 1, typesLength - 1, writeExpression); } } void Call(Ptr node, ITypeInfo* expectedType = nullptr, bool useReturnValue = true) { GenerateExpression(config, writer, node, expectedType, useReturnValue); } Ptr GetClosureInfo(WfExpression* node, Ptr testCtorArgumentSymbol = nullptr) { Ptr closureInfo; auto scope = config->manager->nodeScopes[node].Obj(); if (dynamic_cast(node)) { scope = scope->parentScope.Obj(); } while (scope) { if (scope->functionConfig && scope->functionConfig->lambda) { auto source = scope->ownerNodeSource ? scope->ownerNodeSource : scope->ownerNode.Obj(); if (auto ordered = dynamic_cast(source)) { closureInfo = config->closureInfos[ordered]; break; } else if (auto funcExpr = dynamic_cast(source)) { closureInfo = config->closureInfos[funcExpr]; break; } else if (auto classExpr = dynamic_cast(source)) { closureInfo = config->closureInfos[classExpr]; break; } } else if (auto classExpr = scope->ownerNode.Cast()) { auto info = config->closureInfos[classExpr.Obj()]; if (info->ctorArgumentSymbols.Values().Contains(testCtorArgumentSymbol.Obj())) { closureInfo = info; break; } } scope = scope->parentScope.Obj(); } return closureInfo; } void WriteNotExists(ITypeDescriptor* typeDescriptor) { writer.WriteString(L"/* NOT EXISTS: type("); writer.WriteString(typeDescriptor->GetTypeName()); writer.WriteString(L") */ __vwsn_not_exists__"); } void WriteNotExists(IMethodInfo* methodInfo) { writer.WriteString(L"/* NOT EXISTS: method("); writer.WriteString(methodInfo->GetName()); writer.WriteString(L") of type ("); writer.WriteString(methodInfo->GetOwnerTypeDescriptor()->GetTypeName()); writer.WriteString(L") */ __vwsn_not_exists__"); } void WriteNotExists(IPropertyInfo* propertyInfo) { writer.WriteString(L"/* NOT EXISTS: property("); writer.WriteString(propertyInfo->GetName()); writer.WriteString(L") of type ("); writer.WriteString(propertyInfo->GetOwnerTypeDescriptor()->GetTypeName()); writer.WriteString(L") */ __vwsn_not_exists__"); } void WriteNotExists(IEventInfo* eventInfo) { writer.WriteString(L"/* NOT EXISTS: event("); writer.WriteString(eventInfo->GetName()); writer.WriteString(L") of type ("); writer.WriteString(eventInfo->GetOwnerTypeDescriptor()->GetTypeName()); writer.WriteString(L") */ __vwsn_not_exists__"); } template void WriteTemplate(const WString& templateValue, const T& callback) { List> matches; config->regexTemplate.Cut(templateValue, false, matches); for (auto match : matches) { WString item = match->Result().Value(); if (match->Success()) { if (!callback(item)) { writer.WriteString(L"/* NOT EXISTS: "); writer.WriteString(item); writer.WriteString(L" */ __vwsn_not_exists__"); } } else { writer.WriteString(item); } } } void VisitThisExpression(WfExpression* node, ITypeDescriptor* td) { if (auto closureInfo = GetClosureInfo(node)) { for (auto [thisType, index] : indexed(closureInfo->thisTypes)) { if (thisType->CanConvertTo(td)) { writer.WriteString(L"__vwsnthis_"); writer.WriteString(itow(index)); return; } } } writer.WriteString(L"this"); } void VisitSymbol(WfExpression* node, Ptr symbol, bool forLambdaArgument) { if (auto varDecl = symbol->creatorNode.Cast()) { auto ownerNode = symbol->ownerScope->ownerNode; if (ownerNode.Cast() || ownerNode.Cast()) { writer.WriteString(L"GLOBAL_NAME "); writer.WriteString(config->ConvertName(symbol->name)); return; } else if(auto closureInfo = GetClosureInfo(node, (forLambdaArgument ? nullptr : symbol))) { if (closureInfo->symbols.Values().Contains(symbol.Obj())) { writer.WriteString(L"this->"); writer.WriteString(config->ConvertName(symbol->name)); return; } else if (closureInfo->ctorArgumentSymbols.Values().Contains(symbol.Obj())) { writer.WriteString(L"__vwsnctor_"); writer.WriteString(config->ConvertName(symbol->name)); return; } } writer.WriteString(config->ConvertName(symbol->name)); return; } else if (auto funcDecl = symbol->creatorNode.Cast()) { auto ownerNode = symbol->ownerScope->ownerNode; if (ownerNode.Cast() || ownerNode.Cast()) { writer.WriteString(config->ConvertType(symbol->typeInfo.Obj())); writer.WriteString(L"(GLOBAL_OBJ, &GLOBAL_SYMBOL "); writer.WriteString(config->ConvertName(symbol->name)); writer.WriteString(L")"); return; } else if (auto classExpr = ownerNode.Cast()) { writer.WriteString(config->ConvertType(symbol->typeInfo.Obj())); writer.WriteString(L"(this, &"); writer.WriteString(config->classExprs[classExpr.Obj()]); writer.WriteString(L"::"); writer.WriteString(config->ConvertName(symbol->name)); writer.WriteString(L")"); return; } else if (symbol->ownerScope->functionConfig && symbol->ownerScope->functionConfig->lambda && symbol->name == funcDecl->name.value) { auto scope = config->manager->nodeScopes[funcDecl.Obj()]; auto closureInfo = config->closureInfos[dynamic_cast(scope->ownerNodeSource)]; writer.WriteString(L"vl::Func(::"); writer.WriteString(config->assemblyNamespace); writer.WriteString(L"::"); writer.WriteString(closureInfo->lambdaClassName); writer.WriteString(L"("); for (auto [symbolName, index] : indexed(closureInfo->symbols.Keys())) { if (index > 0) { writer.WriteString(L", "); } writer.WriteString(config->ConvertName(symbol->name)); } for (auto [thisType, index] : indexed(closureInfo->thisTypes)) { if (index > 0 || closureInfo->symbols.Count() > 0) { writer.WriteString(L", "); } writer.WriteString(L" __vwsnctorthis_" + itow(index)); } writer.WriteString(L"))"); return; } } writer.WriteString(config->ConvertName(symbol->name)); } enum class CommaPosition { Left, Right, No, }; bool IsCppRefGenericType(ITypeInfo* type) { switch (type->GetHint()) { case TypeInfoHint::Array: case TypeInfoHint::List: case TypeInfoHint::SortedList: case TypeInfoHint::ObservableList: case TypeInfoHint::Dictionary: return true; default: return false; } } template void WriteReturnValue(ITypeInfo* type, const TReturnValue& returnValueCallback, bool castReturnValue) { if (castReturnValue) { if (IsCppRefGenericType(type) || type->GetHint() == TypeInfoHint::NativeCollectionReference) { writer.WriteString(L"::vl::__vwsn::UnboxCollection<"); writer.WriteString(config->ConvertType(type->GetTypeDescriptor())); writer.WriteString(L">("); returnValueCallback(); writer.WriteString(L")"); return; } } returnValueCallback(); } template void WriteInvokeTemplate(vint count, ITypeInfo* returnType, const TType& typeCallback, const TInvoke& invokeCallback, const TArgument& argumentCallback, TInfo* info, bool castReturnValue) { auto unboxedArgumentCallback = [&](vint index) { auto type = typeCallback(index); if (IsCppRefGenericType(type)) { writer.WriteString(L"::vl::reflection::description::UnboxParameter<"); { switch (type->GetHint()) { case TypeInfoHint::Array: writer.WriteString(L"::vl::collections::Array<"); break; case TypeInfoHint::List: writer.WriteString(L"::vl::collections::List<"); break; case TypeInfoHint::SortedList: writer.WriteString(L"::vl::collections::SortedList<"); break; case TypeInfoHint::ObservableList: writer.WriteString(L"::vl::collections::ObservableList<"); break; case TypeInfoHint::Dictionary: writer.WriteString(L"::vl::collections::Dictionary<"); break; default:; } vint count = type->GetElementType()->GetGenericArgumentCount(); for (vint i = 0; i < count; i++) { if (i > 0) writer.WriteString(L", "); writer.WriteString(config->ConvertType(type->GetElementType()->GetGenericArgument(i))); } } writer.WriteString(L">>(::vl::__vwsn::Box("); argumentCallback(info, index); writer.WriteString(L")).Ref()"); } else { argumentCallback(info, index); } }; WriteReturnValue(returnType, [&]() { invokeCallback(unboxedArgumentCallback); }, castReturnValue); } template void WriteMethodTemplate(const WString& templateValue, IMethodInfo* methodInfo, const TThis& thisCallback, const TArgument& argumentCallback, bool castReturnValue) { WriteInvokeTemplate(methodInfo->GetParameterCount(), methodInfo->GetReturn(), [&](vint index) { return methodInfo->GetParameter(index)->GetType(); }, [&](auto&& unboxedArgumentCallback) { WriteTemplate(templateValue, [&](const WString& item) { auto cp = CommaPosition::No; vint count = methodInfo->GetParameterCount(); if (item == L"$Type") { writer.WriteString(config->ConvertType(methodInfo->GetOwnerTypeDescriptor())); return true; } else if (item == L"$Func") { writer.WriteString(config->ConvertFunctionType(methodInfo)); return true; } else if (item == L"$Name") { writer.WriteString(config->ConvertName(methodInfo->GetName())); return true; } else if (item == L"$This") { if (!methodInfo->IsStatic()) { return thisCallback(methodInfo); } } else if (item == L"$Arguments") { if (count == 0) { return true; } } else if (item == L", $Arguments") { if (count == 0) { return true; } cp = CommaPosition::Left; } else if (item == L"$Arguments, ") { if (count == 0) { return true; } cp = CommaPosition::Right; } else { return false; } if (count > 0) { if (cp == CommaPosition::Left) writer.WriteString(L", "); for (vint i = 0; i < count; i++) { if (i > 0) writer.WriteString(L", "); unboxedArgumentCallback(i); } if (cp == CommaPosition::Right) writer.WriteString(L", "); } return true; }); }, argumentCallback, methodInfo, castReturnValue); } template void WritePropertyTemplate(const WString& templateValue, IPropertyInfo* propertyInfo, const TThis& thisCallback, bool castReturnValue) { WriteReturnValue(propertyInfo->GetReturn(), [&]() { WriteTemplate(templateValue, [&](const WString& item) { if (item == L"$Type") { writer.WriteString(config->ConvertType(propertyInfo->GetOwnerTypeDescriptor())); return true; } else if (item == L"$Name") { writer.WriteString(config->ConvertName(propertyInfo->GetName())); return true; } else if (item == L"$This") { return thisCallback(propertyInfo); } return false; }); }, castReturnValue); } template void WriteEventTemplate(const WString& templateValue, IEventInfo* eventInfo, const TThis& thisCallback, const THandler& handlerCallback, const TArgument& argumentCallback) { auto handlerType = eventInfo->GetHandlerType()->GetElementType(); WriteInvokeTemplate(handlerType->GetGenericArgumentCount() - 1, handlerType->GetGenericArgument(0), [&](vint index) { return handlerType->GetGenericArgument(index + 1); }, [&](auto&& unboxedArgumentCallback) { WriteTemplate(templateValue, [&](const WString& item) { auto cp = CommaPosition::No; vint count = eventInfo->GetHandlerType()->GetElementType()->GetGenericArgumentCount() - 1; if (item == L"$Name") { writer.WriteString(config->ConvertName(eventInfo->GetName())); return true; } else if (item == L"$This") { return thisCallback(eventInfo); } else if (item == L"$Handler") { return handlerCallback(eventInfo); } else if (item == L"$Arguments") { if (count == 0) { return true; } } else if (item == L", $Arguments") { if (count == 0) { return true; } cp = CommaPosition::Left; } else if (item == L"$Arguments, ") { if (count == 0) { return true; } cp = CommaPosition::Right; } else { return false; } if (count > 0) { if (cp == CommaPosition::Left) writer.WriteString(L", "); for (vint i = 0; i < count; i++) { if (i > 0) writer.WriteString(L", "); unboxedArgumentCallback(i); } if (cp == CommaPosition::Right) writer.WriteString(L", "); } return true; }); }, argumentCallback, eventInfo, false); } template bool WriteReferenceTemplate(ResolveExpressionResult& result, const TMethodThis& methodThis, const TPropertyThis& propertyThis, bool castReturnValue) { if (result.methodInfo) { if (CppExists(result.methodInfo)) { auto methodInfo = result.methodInfo; WriteMethodTemplate(CppGetClosureTemplate(methodInfo), methodInfo, methodThis, [&](IMethodInfo*, vint){}, castReturnValue); } else { WriteNotExists(result.methodInfo); } return true; } else if (result.propertyInfo) { if (CppExists(result.propertyInfo)) { if (result.propertyInfo->GetCpp() == nullptr && result.propertyInfo->GetGetter() != nullptr) { auto methodInfo = result.propertyInfo->GetGetter(); WriteMethodTemplate(CppGetInvokeTemplate(methodInfo), methodInfo, methodThis, [&](IMethodInfo*, vint){}, castReturnValue); } else { auto templateValue = CppGetReferenceTemplate(result.propertyInfo); auto propertyInfo = result.propertyInfo; WritePropertyTemplate(CppGetReferenceTemplate(propertyInfo), propertyInfo, propertyThis, castReturnValue); } } else { WriteNotExists(result.propertyInfo); } return true; } else { return false; } } void VisitReferenceExpression(WfExpression* node, const WString& name) { auto result = config->manager->expressionResolvings[node]; bool success = WriteReferenceTemplate(result, [&](IMethodInfo* methodInfo) { VisitThisExpression(node, methodInfo->GetOwnerTypeDescriptor()); return true; }, [&](IPropertyInfo* propertyInfo) { auto isRef = (propertyInfo->GetOwnerTypeDescriptor()->GetTypeDescriptorFlags() & TypeDescriptorFlags::ReferenceType) != TypeDescriptorFlags::Undefined; VisitThisExpression(node, propertyInfo->GetOwnerTypeDescriptor()); return true; }, useReturnValue); if (!success) { if (result.symbol) { VisitSymbol(node, result.symbol, false); } else { if ((result.type->GetTypeDescriptor()->GetTypeDescriptorFlags() & TypeDescriptorFlags::EnumType) != TypeDescriptorFlags::Undefined) { auto enumType = result.type->GetTypeDescriptor()->GetEnumType(); Ptr enumValueType; if (result.type->GetDecorator() == ITypeInfo::TypeDescriptor) { enumValueType = result.type; } else { enumValueType = Ptr(new TypeDescriptorTypeInfo(result.type->GetTypeDescriptor(), TypeInfoHint::Normal)); } vint index = enumType->IndexOfItem(name); if (index != -1) { ITypeInfo* types[] = { enumValueType.Obj(),result.type.Obj() }; ConvertMultipleTypes(types, (sizeof(types) / sizeof(*types)), [=, this]() { writer.WriteString(config->ConvertType(result.type->GetTypeDescriptor())); writer.WriteString(L"::"); writer.WriteString(name); }); return; } } CHECK_FAIL(L"WfGenerateExpressionVisitor::VisitReferenceExpression(WfExpression*, const WString&)#Internal error, cannot find any record of this expression."); } } } void WriteClosureArguments(Ptr closureInfo, WfExpression* node) { vint index = 0; for (auto symbol : From(closureInfo->symbols.Values()).Union(closureInfo->ctorArgumentSymbols.Values())) { if (index++ > 0) { writer.WriteString(L", "); } VisitSymbol(node, symbol, true); } for (auto thisType : closureInfo->thisTypes) { if (index++ > 0) { writer.WriteString(L", "); } VisitThisExpression(node, thisType); } } void Visit(WfThisExpression* node)override { auto result = config->manager->expressionResolvings[node]; VisitThisExpression(node, result.type->GetTypeDescriptor()); } void Visit(WfTopQualifiedExpression* node)override { VisitReferenceExpression(node, node->name.value); } void Visit(WfReferenceExpression* node)override { VisitReferenceExpression(node, node->name.value); } void Visit(WfOrderedNameExpression* node)override { VisitReferenceExpression(node, node->name.value); } void Visit(WfOrderedLambdaExpression* node)override { writer.WriteString(L"vl::Func(::"); writer.WriteString(config->assemblyNamespace); writer.WriteString(L"::"); writer.WriteString(config->lambdaExprs[node]); writer.WriteString(L"("); auto closureInfo = config->closureInfos[node]; WriteClosureArguments(closureInfo, node); writer.WriteString(L"))"); } void Visit(WfMemberExpression* node)override { auto result = config->manager->expressionResolvings[node]; auto parentResult = config->manager->expressionResolvings[node->parent.Obj()]; WriteReferenceTemplate(result, [&](IMethodInfo* methodInfo) { writer.WriteString(L"::vl::__vwsn::This("); Call(node->parent); if (parentResult.type->GetDecorator() == ITypeInfo::SharedPtr) { writer.WriteString(L".Obj()"); } writer.WriteString(L")"); return true; }, [&](IPropertyInfo* propertyInfo) { auto isRef = (propertyInfo->GetOwnerTypeDescriptor()->GetTypeDescriptorFlags() & TypeDescriptorFlags::ReferenceType) != TypeDescriptorFlags::Undefined; if (isRef) writer.WriteString(L"::vl::__vwsn::This("); Call(node->parent); if (parentResult.type->GetDecorator() == ITypeInfo::SharedPtr) { writer.WriteString(L".Obj()"); } else if (parentResult.type->GetDecorator() == ITypeInfo::Nullable) { writer.WriteString(L".Value()"); } if (isRef) writer.WriteString(L")"); return true; }, useReturnValue); } void Visit(WfChildExpression* node)override { VisitReferenceExpression(node, node->name.value); } void Visit(WfLiteralExpression* node)override { switch (node->value) { case WfLiteralValue::Null: { auto result = config->manager->expressionResolvings[node]; switch (result.type->GetDecorator()) { case ITypeInfo::Nullable: case ITypeInfo::SharedPtr: writer.WriteString(config->ConvertType(result.type.Obj())); writer.WriteString(L"()"); break; case ITypeInfo::TypeDescriptor: writer.WriteString(L"::vl::reflection::description::Value()"); break; default: writer.WriteString(L"static_cast<"); writer.WriteString(config->ConvertType(result.type.Obj())); writer.WriteString(L">(nullptr)"); } } break; case WfLiteralValue::True: writer.WriteString(L"true"); break; case WfLiteralValue::False: writer.WriteString(L"false"); break; default:; } } void Visit(WfFloatingExpression* node)override { auto result = config->manager->expressionResolvings[node]; auto td = result.type->GetTypeDescriptor(); writer.WriteString(L"static_cast<"); writer.WriteString(config->ConvertType(td)); writer.WriteString(L">("); if (td == description::GetTypeDescriptor()) { writer.WriteString(node->value.value + L"f"); } else { writer.WriteString(node->value.value); } writer.WriteString(L")"); } void Visit(WfIntegerExpression* node)override { auto result = config->manager->expressionResolvings[node]; auto td = result.type->GetTypeDescriptor(); writer.WriteString(L"static_cast<"); writer.WriteString(config->ConvertType(td)); writer.WriteString(L">("); if (td == description::GetTypeDescriptor()) { writer.WriteString(node->value.value + L"U"); } else if (td == description::GetTypeDescriptor()) { writer.WriteString(node->value.value + L"L"); } else if (td == description::GetTypeDescriptor()) { writer.WriteString(node->value.value + L"UL"); } else { writer.WriteString(node->value.value); } writer.WriteString(L")"); } void Visit(WfStringExpression* node)override { writer.WriteString(L"::vl::WString::Unmanaged(L\""); for (vint i = 0; i < node->value.value.Length(); i++) { auto c = node->value.value[i]; switch (c) { case L'\\': writer.WriteString(L"\\\\"); break; case L'\'': writer.WriteString(L"\\\'"); break; case L'\"': writer.WriteString(L"\\\""); break; case L'\r': writer.WriteString(L"\\r"); break; case L'\n': writer.WriteString(L"\\n"); break; case L'\t': writer.WriteString(L"\\t"); break; default: writer.WriteChar(c); } } writer.WriteString(L"\")"); } void Visit(WfUnaryExpression* node)override { auto result = config->manager->expressionResolvings[node]; switch (node->op) { case WfUnaryOperator::Positive: writer.WriteString(L"(+ "); Call(node->operand, result.type.Obj()); writer.WriteString(L")"); break; case WfUnaryOperator::Negative: writer.WriteString(L"(- "); Call(node->operand, result.type.Obj()); writer.WriteString(L")"); break; case WfUnaryOperator::Not: { if (result.type->GetTypeDescriptor() == description::GetTypeDescriptor()) { writer.WriteString(L"(! "); } else { if (BinaryNeedConvert(result.type->GetTypeDescriptor())) { writer.WriteString(L"static_cast<"); writer.WriteString(config->ConvertType(result.type->GetTypeDescriptor())); writer.WriteString(L">"); } writer.WriteString(L"(~ "); } Call(node->operand, result.type.Obj()); writer.WriteString(L")"); } break; default:; } } void VisitBinaryExpression(WfBinaryExpression* node, const wchar_t* op, ITypeDescriptor* resultType, ITypeInfo* operandType) { if (resultType) { writer.WriteString(L"static_cast<"); writer.WriteString(config->ConvertType(resultType)); writer.WriteString(L">"); } writer.WriteString(L"("); Call(node->first, operandType); writer.WriteString(L" "); writer.WriteString(op); writer.WriteString(L" "); Call(node->second, operandType); writer.WriteString(L")"); } bool BinaryNeedConvert(ITypeDescriptor* type) { return type == description::GetTypeDescriptor() || type == description::GetTypeDescriptor() || type == description::GetTypeDescriptor() || type == description::GetTypeDescriptor() ; } void Visit(WfBinaryExpression* node)override { if (node->op == WfBinaryOperator::Assign) { auto result = config->manager->expressionResolvings[node->first.Obj()]; if (result.propertyInfo) { auto propInfo = result.propertyInfo; auto member = node->first.Cast(); if (CppExists(propInfo)) { if (propInfo->GetCpp() == nullptr && propInfo->GetSetter() != nullptr) { WriteMethodTemplate(CppGetInvokeTemplate(propInfo->GetSetter()), propInfo->GetSetter(), [&](IMethodInfo*) { if (member) { writer.WriteString(L"::vl::__vwsn::This("); Call(member->parent); auto parentResult = config->manager->expressionResolvings[member->parent.Obj()]; if (parentResult.type->GetDecorator() == ITypeInfo::SharedPtr) { writer.WriteString(L".Obj()"); } writer.WriteString(L")"); } else { VisitThisExpression(node->first.Obj(), propInfo->GetOwnerTypeDescriptor()); } return true; }, [&](IMethodInfo*, vint index) { Call(node->second); }, useReturnValue); } else { writer.WriteString(L"("); WritePropertyTemplate(CppGetReferenceTemplate(propInfo), propInfo, [&](IPropertyInfo*) { if (member) { writer.WriteString(L"::vl::__vwsn::This("); Call(member->parent); auto parentResult = config->manager->expressionResolvings[member->parent.Obj()]; if (parentResult.type->GetDecorator() == ITypeInfo::SharedPtr) { writer.WriteString(L".Obj()"); } writer.WriteString(L")"); } else { VisitThisExpression(node->first.Obj(), propInfo->GetOwnerTypeDescriptor()); } return true; }, true); writer.WriteString(L" = "); Call(node->second, propInfo->GetReturn()); writer.WriteString(L")"); } } else { WriteNotExists(propInfo); } } else if (auto binary = node->first.Cast()) { auto containerType = config->manager->expressionResolvings[binary->first.Obj()].type.Obj(); if (IsCppRefGenericType(containerType)) { Call(binary->first, nullptr, false); writer.WriteString(L".Set("); Call(binary->second); writer.WriteString(L", "); Call(node->second); writer.WriteString(L")"); } else { auto keyType = config->manager->expressionResolvings[binary->second.Obj()].type.Obj(); auto valueType = config->manager->expressionResolvings[node->second.Obj()].type.Obj(); writer.WriteString(L"::vl::__vwsn::This("); Call(binary->first); writer.WriteString(L".Obj())->Set("); if (containerType->GetTypeDescriptor() == description::GetTypeDescriptor()) { WriteBoxValue(keyType, [&]() {Call(binary->second); }); } else { Call(binary->second); } writer.WriteString(L", "); WriteBoxValue(valueType, [&]() {Call(node->second); }); writer.WriteString(L")"); } } else { VisitBinaryExpression(node, L"=", nullptr, nullptr); } } else if (node->op == WfBinaryOperator::Index) { auto containerType = config->manager->expressionResolvings[node->first.Obj()].type.Obj(); if (IsCppRefGenericType(containerType)) { Call(node->first, nullptr, false); writer.WriteString(L"["); Call(node->second); writer.WriteString(L"]"); } else { auto keyType = config->manager->expressionResolvings[node->second.Obj()].type.Obj(); auto valueType = config->manager->expressionResolvings[node].type.Obj(); WriteUnboxValue(valueType, [&]() { writer.WriteString(L"::vl::__vwsn::This("); Call(node->first); writer.WriteString(L".Obj())->Get("); if (containerType->GetTypeDescriptor()->CanConvertTo(description::GetTypeDescriptor())) { WriteBoxValue(keyType, [&]() {Call(node->second); }); } else { Call(node->second); } writer.WriteString(L")"); }); } } else if (node->op == WfBinaryOperator::FlagAnd) { auto type = config->manager->expressionResolvings[node].type; if (type->GetTypeDescriptor() == description::GetTypeDescriptor()) { VisitBinaryExpression(node, L"+", nullptr, type.Obj()); } else { VisitBinaryExpression(node, L"&", nullptr, nullptr); } } else if (node->op == WfBinaryOperator::FlagOr) { VisitBinaryExpression(node, L"|", nullptr, nullptr); } else if (node->op == WfBinaryOperator::FailedThen) { auto firstResult = config->manager->expressionResolvings[node->first.Obj()]; auto secondResult = config->manager->expressionResolvings[node->second.Obj()]; auto mergedType = GetMergedType(firstResult.type, secondResult.type); writer.WriteString(L"[&](){ try{ return "); Call(node->first, mergedType.Obj()); writer.WriteString(L"; } catch(...){ return "); Call(node->second, mergedType.Obj()); writer.WriteString(L"; } }()"); } else { auto result = config->manager->expressionResolvings[node]; auto firstResult = config->manager->expressionResolvings[node->first.Obj()]; auto secondResult = config->manager->expressionResolvings[node->second.Obj()]; auto mergedType = GetMergedType(firstResult.type, secondResult.type); switch (node->op) { case WfBinaryOperator::Exp: writer.WriteString(L"static_cast<"); writer.WriteString(config->ConvertType(result.type->GetTypeDescriptor())); writer.WriteString(L">(pow(static_cast("); Call(node->first); writer.WriteString(L"), static_cast("); Call(node->second); writer.WriteString(L")))"); return; case WfBinaryOperator::Add: case WfBinaryOperator::Sub: case WfBinaryOperator::Mul: case WfBinaryOperator::Div: case WfBinaryOperator::Mod: case WfBinaryOperator::Shl: case WfBinaryOperator::Shr: { const wchar_t* op = nullptr; switch (node->op) { case WfBinaryOperator::Add: op = L"+"; break; case WfBinaryOperator::Sub: op = L"-"; break; case WfBinaryOperator::Mul: op = L"*"; break; case WfBinaryOperator::Div: op = L"/"; break; case WfBinaryOperator::Mod: op = L"%"; break; case WfBinaryOperator::Shl: op = L"<<"; break; case WfBinaryOperator::Shr: op = L">>"; break; default:; } VisitBinaryExpression(node, op, (BinaryNeedConvert(result.type->GetTypeDescriptor()) ? result.type->GetTypeDescriptor() : nullptr), result.type.Obj()); } return; case WfBinaryOperator::EQ: case WfBinaryOperator::NE: { if (firstResult.type->GetDecorator() == ITypeInfo::RawPtr || firstResult.type->GetDecorator() == ITypeInfo::SharedPtr) { auto td = mergedType->GetTypeDescriptor(); auto tdFirst = firstResult.type->GetTypeDescriptor(); auto tdSecond = secondResult.type->GetTypeDescriptor(); auto dFirst = firstResult.type->GetDecorator(); auto dSecond = secondResult.type->GetDecorator(); writer.WriteString(L"("); if (td != tdFirst) { writer.WriteString(L"static_cast<"); writer.WriteString(config->ConvertType(tdFirst)); writer.WriteString(L"*>("); } Call(node->first); if (dFirst == ITypeInfo::SharedPtr) { writer.WriteString(L".Obj()"); } if (td != tdFirst) { writer.WriteString(L")"); } if (node->op == WfBinaryOperator::EQ) { writer.WriteString(L" == "); } else { writer.WriteString(L" != "); } if (td != tdSecond) { writer.WriteString(L"static_cast<"); writer.WriteString(config->ConvertType(tdSecond)); writer.WriteString(L"*>("); } Call(node->second); if (dSecond == ITypeInfo::SharedPtr) { writer.WriteString(L".Obj()"); } if (td != tdSecond) { writer.WriteString(L")"); } writer.WriteString(L")"); return; } } case WfBinaryOperator::LT: case WfBinaryOperator::GT: case WfBinaryOperator::LE: case WfBinaryOperator::GE: { const wchar_t* op = nullptr; switch (node->op) { case WfBinaryOperator::LT: op = L"<"; break; case WfBinaryOperator::GT: op = L">"; break; case WfBinaryOperator::LE: op = L"<="; break; case WfBinaryOperator::GE: op = L">="; break; case WfBinaryOperator::EQ: op = L"=="; break; case WfBinaryOperator::NE: op = L"!="; break; default:; } VisitBinaryExpression(node, op, nullptr, mergedType.Obj()); } return; case WfBinaryOperator::Xor: case WfBinaryOperator::And: case WfBinaryOperator::Or: { auto td = result.type->GetTypeDescriptor(); const wchar_t* op = nullptr; if (td == description::GetTypeDescriptor()) { switch (node->op) { case WfBinaryOperator::Xor: op = L"^"; break; case WfBinaryOperator::And: op = L"&&"; break; case WfBinaryOperator::Or: op = L"||"; break; default:; } if (node->op != WfBinaryOperator::Xor) { td = nullptr; } } else { switch (node->op) { case WfBinaryOperator::Xor: op = L"^"; break; case WfBinaryOperator::And: op = L"&"; break; case WfBinaryOperator::Or: op = L"|"; break; default:; } if (!BinaryNeedConvert(td)) { td = nullptr; } } VisitBinaryExpression(node, op, td, result.type.Obj()); } return; default:; } } } void Visit(WfLetExpression* node)override { auto scope = config->manager->nodeScopes[node]; writer.WriteString(L"[&]("); for (auto [letVar, index] : indexed(node->variables)) { if (index > 0) { writer.WriteString(L", "); } writer.WriteString(L"auto "); writer.WriteString(config->ConvertName(letVar->name.value)); } writer.WriteString(L"){ return "); Call(node->expression); writer.WriteString(L"; }("); for (auto [letVar, index] : indexed(node->variables)) { if (index > 0) { writer.WriteString(L", "); } auto symbol = scope->symbols[letVar->name.value][0]; Call(letVar->value, symbol->typeInfo.Obj()); } writer.WriteString(L")"); } void Visit(WfIfExpression* node)override { auto firstResult = config->manager->expressionResolvings[node->trueBranch.Obj()]; auto secondResult = config->manager->expressionResolvings[node->falseBranch.Obj()]; auto mergedType = GetMergedType(firstResult.type, secondResult.type); writer.WriteString(L"("); Call(node->condition); writer.WriteString(L" ? "); Call(node->trueBranch, mergedType.Obj()); writer.WriteString(L" : "); Call(node->falseBranch, mergedType.Obj()); writer.WriteString(L")"); } void Visit(WfRangeExpression* node)override { auto result = config->manager->expressionResolvings[node]; auto elementType = result.type->GetElementType()->GetGenericArgument(0); writer.WriteString(L"::vl::__vwsn::Range("); Call(node->begin, elementType); if (node->beginBoundary == WfRangeBoundary::Exclusive) { writer.WriteString(L" + 1"); } writer.WriteString(L", "); Call(node->end, elementType); if (node->endBoundary == WfRangeBoundary::Inclusive) { writer.WriteString(L" + 1"); } writer.WriteString(L")"); } void Visit(WfSetTestingExpression* node)override { if (auto range = node->collection.Cast()) { auto resultElement = config->manager->expressionResolvings[node->element.Obj()]; auto resultBegin = config->manager->expressionResolvings[range->begin.Obj()]; auto resultEnd = config->manager->expressionResolvings[range->end.Obj()]; writer.WriteString(L"[&](auto __vwsn_1){ return "); if (node->test == WfSetTesting::NotIn) { writer.WriteString(L"!"); } writer.WriteString(L"("); Call(range->begin); writer.WriteString(range->beginBoundary == WfRangeBoundary::Inclusive ? L" <= " : L" < "); writer.WriteString(L" __vwsn_1 && __vwsn_1"); writer.WriteString(range->endBoundary == WfRangeBoundary::Inclusive ? L" <= " : L" < "); Call(range->end); writer.WriteString(L"); }("); Call(node->element, resultElement.type.Obj()); writer.WriteString(L")"); } else { auto result = config->manager->expressionResolvings[node->collection.Obj()]; auto elementType = result.type->GetElementType()->GetGenericArgument(0); if (node->test == WfSetTesting::NotIn) { writer.WriteString(L"(! "); } writer.WriteString(L"::vl::__vwsn::InSet("); Call(node->element, elementType); writer.WriteString(L", "); Call(node->collection); writer.WriteString(L")"); if (node->test == WfSetTesting::NotIn) { writer.WriteString(L")"); } } } void Visit(WfConstructorExpression* node)override { auto result = config->manager->expressionResolvings[node]; auto td = result.type->GetTypeDescriptor(); if (node->arguments.Count() == 0) { if ((td->GetTypeDescriptorFlags() & TypeDescriptorFlags::StructType) != TypeDescriptorFlags::Undefined) { writer.WriteString(config->ConvertType(result.type.Obj()) + L"{}"); } else { writer.WriteString(config->ConvertType(td) + L"::Create()"); } } else { if (result.type->GetTypeDescriptor() == description::GetTypeDescriptor()) { auto elementType = result.type->GetElementType()->GetGenericArgument(0); writer.WriteString(L"(::vl::__vwsn::CreateArray().Resize("); writer.WriteString(itow(node->arguments.Count())); writer.WriteString(L")"); for (auto&& [argument, index] : indexed(node->arguments)) { writer.WriteString(L".Set("); writer.WriteString(itow(index)); writer.WriteString(L", "); Call(argument->key); writer.WriteString(L")"); } writer.WriteString(L").list"); } else if (result.type->GetTypeDescriptor() == description::GetTypeDescriptor()) { auto elementType = result.type->GetElementType()->GetGenericArgument(0); writer.WriteString(L"(::vl::__vwsn::CreateList()"); for (auto argument : node->arguments) { writer.WriteString(L".Add("); Call(argument->key); writer.WriteString(L")"); } writer.WriteString(L").list"); } else if (result.type->GetTypeDescriptor() == description::GetTypeDescriptor()) { auto elementType = result.type->GetElementType()->GetGenericArgument(0); writer.WriteString(L"(::vl::__vwsn::CreateObservableList()"); for (auto argument : node->arguments) { writer.WriteString(L".Add("); Call(argument->key); writer.WriteString(L")"); } writer.WriteString(L").list"); } else if (result.type->GetTypeDescriptor() == description::GetTypeDescriptor()) { auto keyType = result.type->GetElementType()->GetGenericArgument(0); auto valueType = result.type->GetElementType()->GetGenericArgument(1); writer.WriteString(L"(::vl::__vwsn::CreateDictionary()"); for (auto argument : node->arguments) { writer.WriteString(L".Add("); Call(argument->key); writer.WriteString(L", "); Call(argument->value); writer.WriteString(L")"); } writer.WriteString(L").dictionary"); } else { writer.WriteString(L"[&](){ "); writer.WriteString(config->ConvertType(td)); writer.WriteString(L" __vwsn_temp__;"); for (auto argument : node->arguments) { writer.WriteString(L" __vwsn_temp__."); writer.WriteString(argument->key.Cast()->name.value); writer.WriteString(L" = "); Call(argument->value); writer.WriteString(L";"); } writer.WriteString(L" return __vwsn_temp__; }()"); } } } void Visit(WfInferExpression* node)override { Call(node->expression); } void Visit(WfTypeCastingExpression* node)override { auto scope = config->manager->nodeScopes[node].Obj(); auto typeInfo = CreateTypeInfoFromType(scope, node->type); bool strongCast = node->strategy == WfTypeCastingStrategy::Strong; auto result = config->manager->expressionResolvings[node->expression.Obj()]; ConvertType(config, writer, result.type.Obj(), typeInfo.Obj(), [&]() {Call(node->expression); }, strongCast); } void Visit(WfTypeTestingExpression* node)override { auto result = config->manager->expressionResolvings[node->expression.Obj()]; Ptr type; if (node->type) { auto scope = config->manager->nodeScopes[node].Obj(); type = CreateTypeInfoFromType(scope, node->type); } switch (result.type->GetDecorator()) { case ITypeInfo::RawPtr: { switch (node->test) { case WfTypeTesting::IsNull: writer.WriteString(L"("); Call(node->expression); writer.WriteString(L" == nullptr)"); break; case WfTypeTesting::IsNotNull: writer.WriteString(L"("); Call(node->expression); writer.WriteString(L" != nullptr)"); break; case WfTypeTesting::IsType: case WfTypeTesting::IsNotType: if (type->GetDecorator() != ITypeInfo::RawPtr) { writer.WriteString(node->test == WfTypeTesting::IsType ? L"false" : L"true"); } else { writer.WriteString(L"(::vl::__vwsn::RawPtrCast<"); writer.WriteString(config->ConvertType(type->GetTypeDescriptor())); writer.WriteString(L">("); Call(node->expression); writer.WriteString(L") "); writer.WriteString(node->test == WfTypeTesting::IsType ? L"!=" : L"=="); writer.WriteString(L" nullptr)"); } break; default:; } } break; case ITypeInfo::SharedPtr: { if (result.type->GetElementType()->GetDecorator() == ITypeInfo::Generic) { auto toCode = [&]() { return GenerateToStream([&](StreamWriter& writer) { WfPrint(Ptr(node), WString::Empty, writer); }); }; if (config->IsSpecialGenericType(result.type.Obj())) { writer.WriteString(L"/* NOT SUPPORTS: testing against non-reference generic type: "); writer.WriteString(toCode()); writer.WriteString(L" */ __vwsn_not_exists__"); return; } } switch (node->test) { case WfTypeTesting::IsNull: writer.WriteString(L"(! static_cast("); Call(node->expression); writer.WriteString(L"))"); break; case WfTypeTesting::IsNotNull: writer.WriteString(L"static_cast("); Call(node->expression); writer.WriteString(L")"); break; case WfTypeTesting::IsType: case WfTypeTesting::IsNotType: if (type->GetDecorator() != ITypeInfo::SharedPtr) { writer.WriteString(node->test == WfTypeTesting::IsType ? L"false" : L"true"); } else { writer.WriteString(L"(::vl::__vwsn::RawPtrCast<"); writer.WriteString(config->ConvertType(type->GetTypeDescriptor())); writer.WriteString(L">("); Call(node->expression); writer.WriteString(L".Obj()) "); writer.WriteString(node->test == WfTypeTesting::IsType ? L"!=" : L"=="); writer.WriteString(L" nullptr)"); } break; default:; } } break; case ITypeInfo::Nullable: { switch (node->test) { case WfTypeTesting::IsNull: writer.WriteString(L"(! static_cast("); Call(node->expression); writer.WriteString(L"))"); break; case WfTypeTesting::IsNotNull: writer.WriteString(L"static_cast("); Call(node->expression); writer.WriteString(L")"); break; case WfTypeTesting::IsType: if (type->GetTypeDescriptor() == result.type->GetTypeDescriptor()) { writer.WriteString(L"static_cast("); Call(node->expression); writer.WriteString(L")"); } else { writer.WriteString(L"false"); } break; case WfTypeTesting::IsNotType: if (type->GetTypeDescriptor() == result.type->GetTypeDescriptor()) { writer.WriteString(L"false"); } else { writer.WriteString(L"true"); } break; default:; } } break; case ITypeInfo::TypeDescriptor: { if (result.type->GetTypeDescriptor()->GetTypeDescriptorFlags() == TypeDescriptorFlags::Object) { switch (node->test) { case WfTypeTesting::IsNull: Call(node->expression); writer.WriteString(L".IsNull()"); break; case WfTypeTesting::IsNotNull: writer.WriteString(L"(! "); Call(node->expression); writer.WriteString(L".IsNull())"); break; case WfTypeTesting::IsType: case WfTypeTesting::IsNotType: if ((type->GetTypeDescriptor()->GetTypeDescriptorFlags() & TypeDescriptorFlags::ReferenceType) != TypeDescriptorFlags::Undefined) { writer.WriteString(L"[&](){ auto __vwsn_temp__ = "); Call(node->expression); writer.WriteString(L"; return "); if ((type->GetDecorator() == ITypeInfo::RawPtr) == (node->test == WfTypeTesting::IsType)) { writer.WriteString(L"!"); } writer.WriteString(L"__vwsn_temp__.GetSharedPtr() "); writer.WriteString(node->test == WfTypeTesting::IsType ? L"&&" : L"||"); writer.WriteString(L" ::vl::__vwsn::RawPtrCast<"); writer.WriteString(config->ConvertType(type->GetTypeDescriptor())); writer.WriteString(L">(__vwsn_temp__.GetRawPtr()) "); writer.WriteString(node->test == WfTypeTesting::IsType ? L"!=" : L"=="); writer.WriteString(L" nullptr; }()"); } else { writer.WriteString(L"(dynamic_cast<::vl::reflection::description::IValueType::TypedBox<"); writer.WriteString(config->ConvertType(type->GetTypeDescriptor())); writer.WriteString(L">*>("); Call(node->expression); writer.WriteString(L".GetBoxedValue().Obj()) "); writer.WriteString(node->test == WfTypeTesting::IsType ? L"!=" : L"=="); writer.WriteString(L" nullptr)"); } break; default:; } } else if ((type->GetTypeDescriptor() == result.type->GetTypeDescriptor()) == (node->test == WfTypeTesting::IsType)) { writer.WriteString(L"true"); } else { writer.WriteString(L"false"); } } break; default:; } } void Visit(WfTypeOfTypeExpression* node)override { writer.WriteString(L"/* NOT SUPPORTS: typeof() */ __vwsn_not_exists__"); } void Visit(WfTypeOfExpressionExpression* node)override { writer.WriteString(L"/* NOT SUPPORTS: type() */ __vwsn_not_exists__"); } void Visit(WfAttachEventExpression* node)override { auto result = config->manager->expressionResolvings[node->event.Obj()]; if (CppExists(result.eventInfo)) { WriteEventTemplate(CppGetAttachTemplate(result.eventInfo), result.eventInfo, [&](IEventInfo*) { writer.WriteString(L"::vl::__vwsn::This("); if (auto member = node->event.Cast()) { Call(member->parent); auto parentResult = config->manager->expressionResolvings[member->parent.Obj()]; if (parentResult.type->GetDecorator() == ITypeInfo::SharedPtr) { writer.WriteString(L".Obj()"); } } else { VisitThisExpression(node, result.eventInfo->GetOwnerTypeDescriptor()); } writer.WriteString(L")"); return true; }, [&](IEventInfo*) { Call(node->function); return true; }, [&](IEventInfo*, vint) {}); } else { WriteNotExists(result.eventInfo); } } void Visit(WfDetachEventExpression* node)override { auto result = config->manager->expressionResolvings[node->event.Obj()]; if (CppExists(result.eventInfo)) { WriteEventTemplate(CppGetDetachTemplate(result.eventInfo), result.eventInfo, [&](IEventInfo* eventInfo) { writer.WriteString(L"::vl::__vwsn::This("); if (auto member = node->event.Cast()) { Call(member->parent); auto parentResult = config->manager->expressionResolvings[member->parent.Obj()]; if (parentResult.type->GetDecorator() == ITypeInfo::SharedPtr) { writer.WriteString(L".Obj()"); } } else { VisitThisExpression(node, eventInfo->GetOwnerTypeDescriptor()); } writer.WriteString(L")"); return true; }, [&](IEventInfo*) { Call(node->handler); return true; }, [&](IEventInfo*, vint) {}); } else { WriteNotExists(result.eventInfo); } } void Visit(WfObserveExpression* node)override { } void Visit(WfCallExpression* node)override { auto thisCallback = [&](ITypeDescriptor* td) { if (auto member = node->function.Cast()) { writer.WriteString(L"::vl::__vwsn::This("); Call(member->parent); auto parentResult = config->manager->expressionResolvings[member->parent.Obj()]; if (parentResult.type->GetDecorator() == ITypeInfo::SharedPtr) { writer.WriteString(L".Obj()"); } writer.WriteString(L")"); } else { VisitThisExpression(node, td); } return true; }; auto argumentCallback = [&](IMethodInfo* methodInfo, ITypeInfo* typeInfo, vint index) { auto type = methodInfo ? methodInfo->GetParameter(index)->GetType() : typeInfo->GetElementType()->GetGenericArgument(index + 1) ; Call(node->arguments[index], type); }; auto result = config->manager->expressionResolvings[node->function.Obj()]; if (result.methodInfo) { WriteMethodTemplate(CppGetInvokeTemplate(result.methodInfo), result.methodInfo, [&](IMethodInfo* methodInfo) { return thisCallback(methodInfo->GetOwnerTypeDescriptor()); }, [&](IMethodInfo* methodInfo, vint index) { return argumentCallback(methodInfo, nullptr, index); }, useReturnValue); return; } else if (result.eventInfo) { WriteEventTemplate(CppGetInvokeTemplate(result.eventInfo), result.eventInfo, [&](IEventInfo* eventInfo) { return thisCallback(eventInfo->GetOwnerTypeDescriptor()); }, [&](IEventInfo*) { return false; }, [&](IEventInfo* eventInfo, vint index) { return argumentCallback(nullptr, eventInfo->GetHandlerType(), index); } ); return; } else if (result.symbol) { if (auto funcDecl = result.symbol->creatorNode.Cast()) { if (result.symbol->ownerScope->ownerNode.Cast()) { writer.WriteString(L"this->"); writer.WriteString(config->ConvertName(result.symbol->name)); } else if (result.symbol->ownerScope->functionConfig && result.symbol->ownerScope->functionConfig->lambda && result.symbol->name == funcDecl->name.value) { writer.WriteString(L"(*this)"); } else { writer.WriteString(L"GLOBAL_NAME "); writer.WriteString(config->ConvertName(result.symbol->name)); } writer.WriteString(L"("); for (vint i = 0; i < node->arguments.Count(); i++) { if (i > 0) writer.WriteString(L", "); argumentCallback(nullptr, result.symbol->typeInfo.Obj(), i); } writer.WriteString(L")"); return; } } Call(node->function); writer.WriteString(L"("); for (vint i = 0; i < node->arguments.Count(); i++) { if (i > 0) writer.WriteString(L", "); argumentCallback(nullptr, result.type.Obj(), i); } writer.WriteString(L")"); } void Visit(WfFunctionExpression* node)override { writer.WriteString(L"vl::Func(::"); writer.WriteString(config->assemblyNamespace); writer.WriteString(L"::"); writer.WriteString(config->lambdaExprs[node]); writer.WriteString(L"("); auto closureInfo = config->closureInfos[node]; WriteClosureArguments(closureInfo, node); writer.WriteString(L"))"); } void Visit(WfNewClassExpression* node)override { auto result = config->manager->expressionResolvings[node]; auto ctor = result.constructorInfo; if (ctor->GetReturn()->GetDecorator() == ITypeInfo::SharedPtr) { writer.WriteString(L"::vl::Ptr<"); writer.WriteString(config->ConvertType(ctor->GetReturn()->GetTypeDescriptor())); writer.WriteString(L">("); } WriteMethodTemplate(CppGetInvokeTemplate(ctor), ctor, [&](IMethodInfo*) { return false; }, [&](IMethodInfo*, vint index) { Call(node->arguments[index]); }, useReturnValue); if (ctor->GetReturn()->GetDecorator() == ITypeInfo::SharedPtr) { writer.WriteString(L")"); } } void Visit(WfNewInterfaceExpression* node)override { auto result = config->manager->expressionResolvings[node]; auto ctor = result.constructorInfo; if (ctor->GetReturn()->GetDecorator() == ITypeInfo::SharedPtr) { writer.WriteString(L"::vl::Ptr<"); writer.WriteString(config->ConvertType(ctor->GetReturn()->GetTypeDescriptor())); writer.WriteString(L">("); } else { writer.WriteString(L"static_cast<"); writer.WriteString(config->ConvertType(ctor->GetReturn()->GetTypeDescriptor())); writer.WriteString(L"*>("); } writer.WriteString(L"new ::"); writer.WriteString(config->assemblyNamespace); writer.WriteString(L"::"); writer.WriteString(config->classExprs[node]); writer.WriteString(L"("); auto closureInfo = config->closureInfos[node]; WriteClosureArguments(closureInfo, node); writer.WriteString(L"))"); } void Visit(WfVirtualCfeExpression* node)override { Call(node->expandedExpression); } void Visit(WfVirtualCseExpression* node)override { Call(node->expandedExpression); } }; void GenerateExpression(WfCppConfig* config, stream::StreamWriter& writer, Ptr node, reflection::description::ITypeInfo* expectedType, bool useReturnValue) { WfGenerateExpressionVisitor visitor(config, writer, useReturnValue); if (useReturnValue) { auto result = config->manager->expressionResolvings[node.Obj()]; ITypeInfo* types[] = { result.type.Obj(), result.expectedType.Obj(), expectedType }; visitor.ConvertMultipleTypes(types, sizeof(types) / sizeof(*types), [&]() { node->Accept(&visitor); }); } else { node->Accept(&visitor); } } } } } /*********************************************************************** .\CPP\WFCPP_FILE.CPP ***********************************************************************/ namespace vl { namespace workflow { namespace cppcodegen { using namespace collections; void WfCppConfig::WritePushCompileOptions(stream::StreamWriter& writer) { writer.WriteLine(L"#if defined( _MSC_VER)"); writer.WriteLine(L"#pragma warning(push)"); writer.WriteLine(L"#pragma warning(disable:4250)"); writer.WriteLine(L"#elif defined(__clang__)"); writer.WriteLine(L"#pragma clang diagnostic push"); writer.WriteLine(L"#pragma clang diagnostic ignored \"-Wparentheses-equality\""); writer.WriteLine(L"#elif defined(__GNUC__)"); writer.WriteLine(L"#pragma GCC diagnostic push"); writer.WriteLine(L"#endif"); } void WfCppConfig::WritePopCompileOptions(stream::StreamWriter& writer) { writer.WriteLine(L"#if defined( _MSC_VER)"); writer.WriteLine(L"#pragma warning(pop)"); writer.WriteLine(L"#elif defined(__clang__)"); writer.WriteLine(L"#pragma clang diagnostic pop"); writer.WriteLine(L"#elif defined(__GNUC__)"); writer.WriteLine(L"#pragma GCC diagnostic pop"); writer.WriteLine(L"#endif"); } void WfCppConfig::WriteCpp_PushMacros(stream::StreamWriter& writer) { writer.WriteString(L"#define GLOBAL_SYMBOL "); writer.WriteString(L"::"); writer.WriteString(assemblyNamespace); writer.WriteString(L"::"); writer.WriteString(assemblyName); writer.WriteLine(L"::"); writer.WriteString(L"#define GLOBAL_NAME "); writer.WriteString(L"::"); writer.WriteString(assemblyNamespace); writer.WriteString(L"::"); writer.WriteString(assemblyName); writer.WriteLine(L"::Instance()."); writer.WriteString(L"#define GLOBAL_OBJ "); writer.WriteString(L"&::"); writer.WriteString(assemblyNamespace); writer.WriteString(L"::"); writer.WriteString(assemblyName); writer.WriteLine(L"::Instance()"); } void WfCppConfig::WriteCpp_PopMacros(stream::StreamWriter& writer) { writer.WriteLine(L"#undef GLOBAL_SYMBOL"); writer.WriteLine(L"#undef GLOBAL_NAME"); writer.WriteLine(L"#undef GLOBAL_OBJ"); } void WfCppConfig::WriteHeader(stream::StreamWriter& writer, bool multiFile) { WritePushCompileOptions(writer); writer.WriteLine(L""); { Dictionary> reversedLambdaExprs; Dictionary> reversedClassExprs; SortClosure(reversedLambdaExprs, reversedClassExprs); if (reversedLambdaExprs.Count() + reversedClassExprs.Count() > 0) { writer.WriteString(L"namespace "); writer.WriteLine(assemblyNamespace); writer.WriteLine(L"{"); for (auto expr : reversedLambdaExprs.Values()) { WriteHeader_ClosurePreDecl(writer, expr); } for (auto expr : reversedClassExprs.Values()) { WriteHeader_ClosurePreDecl(writer, expr); } writer.WriteLine(L"}"); writer.WriteLine(L""); } } List nss; if (enumDecls.Count() > 0) { WriteHeader_MainHeaderEnums(writer, nss); if (enumDecls.Keys().Contains(nullptr)) { for (auto decl : enumDecls[nullptr]) { WriteHeader_Enum(writer, decl, nss, false); } writer.WriteLine(L""); } } if (structDecls.Count() > 0) { WriteHeader_MainHeaderStructs(writer, nss); if (structDecls.Keys().Contains(nullptr)) { for (auto decl : structDecls[nullptr]) { WriteHeader_Struct(writer, decl, nss, false); } writer.WriteLine(L""); } } if (classDecls.Keys().Contains(nullptr)) { for (auto decl : classDecls[nullptr]) { WriteHeader_ClassPreDecl(writer, decl, nss); } writer.WriteLine(L""); if (multiFile) { vint index = headerFilesClasses.Keys().IndexOf(0); if (index != -1) { for (auto decl : headerFilesClasses.GetByIndex(index)) { WriteHeader_Class(writer, decl, nss); writer.WriteLine(L""); } } } else { for (auto decl : classDecls[nullptr]) { WriteHeader_Class(writer, decl, nss); writer.WriteLine(L""); } } } WriteNamespaceEnd(writer, nss); WriteHeader_Global(writer); writer.WriteLine(L""); WritePopCompileOptions(writer); } void WfCppConfig::WriteNonCustomSubHeader(stream::StreamWriter& writer, vint fileIndex) { WritePushCompileOptions(writer); writer.WriteLine(L""); List nss; if (classDecls.Keys().Contains(nullptr)) { vint index = headerFilesClasses.Keys().IndexOf(fileIndex); if (index != -1) { for (auto decl : headerFilesClasses.GetByIndex(index)) { WriteHeader_Class(writer, decl, nss); writer.WriteLine(L""); } } } WriteNamespaceEnd(writer, nss); writer.WriteLine(L""); WritePopCompileOptions(writer); } void WfCppConfig::WriteCpp(stream::StreamWriter& writer, bool multiFile) { WritePushCompileOptions(writer); writer.WriteLine(L""); WriteCpp_PushMacros(writer); writer.WriteLine(L""); WriteCpp_Global(writer); writer.WriteLine(L""); if (classDecls.Keys().Contains(nullptr)) { List nss; if (multiFile) { vint index = customFilesClasses.Keys().IndexOf(L""); if (index != -1) { for (auto decl : customFilesClasses.GetByIndex(index)) { WriteCpp_Class(writer, decl, nss); } } } else { for (auto decl : classDecls[nullptr]) { WriteCpp_Class(writer, decl, nss); } } WriteNamespaceEnd(writer, nss); } WriteCpp_PopMacros(writer); writer.WriteLine(L""); WritePopCompileOptions(writer); } void WfCppConfig::WriteSubHeader(stream::StreamWriter& writer, const WString& fileName) { WritePushCompileOptions(writer); writer.WriteLine(L""); List nss; for (auto decl : customFilesClasses.Get(fileName)) { WriteHeader_Class(writer, decl, nss); writer.WriteLine(L""); } WriteNamespaceEnd(writer, nss); WritePopCompileOptions(writer); } void WfCppConfig::WriteSubCpp(stream::StreamWriter& writer, const WString& fileName) { WritePushCompileOptions(writer); writer.WriteLine(L""); WriteCpp_PushMacros(writer); writer.WriteLine(L""); if (From(customFilesClasses.Get(fileName)) .Any([=, this](Ptr decl) { return IsClassHasUserImplMethods(decl, true); })) { writer.WriteLine(L"/* USER_CONTENT_BEGIN(custom global declarations) */"); writer.WriteLine(L"/* USER_CONTENT_END() */"); writer.WriteLine(L""); } List nss; for (auto decl : customFilesClasses.Get(fileName)) { WriteCpp_Class(writer, decl, nss); } WriteNamespaceEnd(writer, nss); WriteCpp_PopMacros(writer); writer.WriteLine(L""); WritePopCompileOptions(writer); } void WfCppConfig::WriteReflectionHeader(stream::StreamWriter& writer, bool multiFile) { WritePushCompileOptions(writer); if (manager->declarationTypes.Count() > 0) { writer.WriteLine(L""); WriteHeader_Reflection(writer); writer.WriteLine(L""); } WritePopCompileOptions(writer); } void WfCppConfig::WriteReflectionCpp(stream::StreamWriter& writer, bool multiFile) { WritePushCompileOptions(writer); if (manager->declarationTypes.Count() > 0) { writer.WriteLine(L""); WriteCpp_Reflection(writer); writer.WriteLine(L""); } WritePopCompileOptions(writer); } } } } /*********************************************************************** .\CPP\WFCPP_GENERATECPPFILES.CPP ***********************************************************************/ namespace vl { namespace workflow { namespace cppcodegen { using namespace stream; /*********************************************************************** WfCppInput ***********************************************************************/ WfCppInput::WfCppInput(const WString& _assemblyName) { headerGuardPrefix = L"VCZH_WORKFLOW_COMPILER_GENERATED_"; assemblyName = _assemblyName; assemblyNamespace = L"vl_workflow_global"; includeFileName = _assemblyName + L"Includes"; reflectionFileName = assemblyName + L"Reflection"; defaultFileName = _assemblyName; } /*********************************************************************** GenerateCppFiles ***********************************************************************/ void GenerateCppComment(StreamWriter& writer, const WString& comment) { writer.WriteLine(L"/***********************************************************************"); writer.WriteLine(L"!!!!!! DO NOT MODIFY !!!!!!"); writer.WriteLine(L""); writer.WriteLine(comment); writer.WriteLine(L""); writer.WriteLine(L"This file is generated by Workflow compiler"); writer.WriteLine(L"https://github.com/vczh-libraries"); writer.WriteLine(L"***********************************************************************/"); } void WriteReflectionInclude(bool reflection, Ptr input, stream::StreamWriter& writer) { if (reflection || input->reflectionIncludes.Count() > 0) { writer.WriteLine(L"/* CodePack:BeginIgnore() */"); writer.WriteLine(L"#ifndef VCZH_DEBUG_NO_REFLECTION"); if (reflection) { writer.WriteLine(L"/* CodePack:ConditionOff(VCZH_DEBUG_NO_REFLECTION, " + input->reflectionFileName + L".h) */"); writer.WriteLine(L"#include \"" + input->reflectionFileName + L".h\""); } else { for (auto include : input->reflectionIncludes) { writer.WriteLine(L"/* CodePack:ConditionOff(VCZH_DEBUG_NO_REFLECTION, " + include + L") */"); writer.WriteLine(L"#include \"" + include + L"\""); } } writer.WriteLine(L"#endif"); writer.WriteLine(L"/* CodePack:EndIgnore() */"); } } void WriteDependedInclude(Ptr input, WfCppConfig& config, vint headerIndex, stream::StreamWriter& writer) { vint index = config.headerIncludes.Keys().IndexOf(headerIndex); if (index != -1) { const auto& headers = config.headerIncludes.GetByIndex(index); for (auto header : headers) { if (header == 0) { writer.WriteLine(L"#include \"" + input->defaultFileName + L".h\""); } else if (header > 0) { writer.WriteLine(L"#include \"" + config.customFilesClasses.Keys()[header] + L".h\""); } else { writer.WriteLine(L"#include \"" + input->defaultFileName + itow(-header) + L".h\""); } } } } void WriteHeader(Ptr input, Ptr output, WfCppConfig& config, bool multiFile, bool reflection, stream::StreamWriter& writer) { GenerateCppComment(writer, input->comment); writer.WriteLine(L""); writer.WriteLine(L"#ifndef " + input->headerGuardPrefix + wupper(input->defaultFileName)); writer.WriteLine(L"#define " + input->headerGuardPrefix + wupper(input->defaultFileName)); writer.WriteLine(L""); for (auto include : input->normalIncludes) { writer.WriteLine(L"#include \"" + include + L"\""); } writer.WriteLine(L""); config.WriteHeader(writer, multiFile); writer.WriteLine(L""); writer.WriteLine(L"#endif"); } void WriteNonCustomSubHeader(Ptr input, Ptr output, WfCppConfig& config, bool multiFile, bool reflection, vint fileIndex, stream::StreamWriter& writer) { GenerateCppComment(writer, input->comment); writer.WriteLine(L""); writer.WriteLine(L"#ifndef " + input->headerGuardPrefix + wupper(input->defaultFileName) + L"_DP" + itow(fileIndex)); writer.WriteLine(L"#define " + input->headerGuardPrefix + wupper(input->defaultFileName) + L"_DP" + itow(fileIndex)); writer.WriteLine(L""); writer.WriteLine(L"#include \"" + input->defaultFileName + L".h\""); WriteDependedInclude(input, config, -fileIndex, writer); writer.WriteLine(L""); config.WriteNonCustomSubHeader(writer, fileIndex); writer.WriteLine(L""); writer.WriteLine(L"#endif"); } void WriteCpp(Ptr input, Ptr output, WfCppConfig& config, bool multiFile, bool reflection, stream::StreamWriter& writer) { GenerateCppComment(writer, input->comment); writer.WriteLine(L""); writer.WriteLine(L"#include \"" + output->entryFileName + L".h\""); WriteReflectionInclude(reflection, input, writer); writer.WriteLine(L""); config.WriteCpp(writer, multiFile); } void WriteReflectionHeader(Ptr input, Ptr output, WfCppConfig& config, bool multiFile, bool reflection, stream::StreamWriter& writer) { GenerateCppComment(writer, input->comment); writer.WriteLine(L""); writer.WriteLine(L"#ifndef " + input->headerGuardPrefix + wupper(input->reflectionFileName)); writer.WriteLine(L"#define " + input->headerGuardPrefix + wupper(input->reflectionFileName)); writer.WriteLine(L""); writer.WriteLine(L"#include \"" + output->entryFileName + L".h\""); if (input->reflectionIncludes.Count() > 0) { writer.WriteLine(L"#ifndef VCZH_DEBUG_NO_REFLECTION"); for (auto include : input->reflectionIncludes) { writer.WriteLine(L"#include \"" + include + L"\""); } writer.WriteLine(L"#endif"); } writer.WriteLine(L""); config.WriteReflectionHeader(writer, multiFile); writer.WriteLine(L""); writer.WriteLine(L"#endif"); } void WriteReflectionCpp(Ptr input, Ptr output, WfCppConfig& config, bool multiFile, bool reflection, stream::StreamWriter& writer) { GenerateCppComment(writer, input->comment); writer.WriteLine(L""); writer.WriteLine(L"#include \"" + input->reflectionFileName + L".h\""); writer.WriteLine(L""); config.WriteReflectionCpp(writer, multiFile); } void WriteIncludesHeader(Ptr input, Ptr output, WfCppConfig& config, bool multiFile, bool reflection, stream::StreamWriter& writer) { GenerateCppComment(writer, input->comment); writer.WriteLine(L""); writer.WriteLine(L"#ifndef " + input->headerGuardPrefix + wupper(input->includeFileName)); writer.WriteLine(L"#define " + input->headerGuardPrefix + wupper(input->includeFileName)); writer.WriteLine(L""); writer.WriteLine(L"#include \"" + input->defaultFileName + L".h\""); for (auto fileName : config.customFilesClasses.Keys()) { if (fileName != L"") { writer.WriteLine(L"#include \"" + fileName + L".h\""); } } for (auto fileIndex : config.headerFilesClasses.Keys()) { if (fileIndex != 0) { writer.WriteLine(L"#include \"" + input->defaultFileName + itow(fileIndex) + L".h\""); } } writer.WriteLine(L""); writer.WriteLine(L"#endif"); } void WriteSubHeader(Ptr input, Ptr output, WfCppConfig& config, bool multiFile, bool reflection, const WString& fileName, stream::StreamWriter& writer) { GenerateCppComment(writer, input->comment); writer.WriteLine(L""); writer.WriteLine(L"#ifndef " + input->headerGuardPrefix + wupper(fileName)); writer.WriteLine(L"#define " + input->headerGuardPrefix + wupper(fileName)); writer.WriteLine(L""); writer.WriteLine(L"#include \"" + input->defaultFileName + L".h\""); WriteDependedInclude(input, config, config.customFilesClasses.Keys().IndexOf(fileName), writer); writer.WriteLine(L""); config.WriteSubHeader(writer, fileName); writer.WriteLine(L""); writer.WriteLine(L"#endif"); } void WriteSubCpp(Ptr input, Ptr output, WfCppConfig& config, bool multiFile, bool reflection, const WString& fileName, stream::StreamWriter& writer) { GenerateCppComment(writer, input->comment); writer.WriteLine(L""); writer.WriteLine(L"#include \"" + input->includeFileName + L".h\""); WriteReflectionInclude(reflection, input, writer); writer.WriteLine(L""); config.WriteSubCpp(writer, fileName); } Ptr GenerateCppFiles(Ptr input, analyzer::WfLexicalScopeManager* manager) { WfCppConfig config(manager, input->assemblyName, input->assemblyNamespace); if (manager->errors.Count() > 0) { return nullptr; } auto output = Ptr(new WfCppOutput); if (config.manager->declarationTypes.Count() > 0) { output->containsReflectionInfo = true; } bool multiFile = false; switch (input->multiFile) { case WfCppFileSwitch::Enabled: multiFile = true; break; case WfCppFileSwitch::Disabled: multiFile = false; break; default: multiFile = config.customFilesClasses.Count() > 1; } bool reflection = false; switch (input->reflection) { case WfCppFileSwitch::Enabled: reflection = true; break; case WfCppFileSwitch::Disabled: reflection = false; break; default: reflection = config.manager->declarationTypes.Count() > 0; } output->multiFile = multiFile; output->reflection = reflection; if (multiFile) { output->entryFileName = input->includeFileName; } else { output->entryFileName = input->defaultFileName; } output->cppFiles.Add(input->defaultFileName + L".h", GenerateToStream([&](StreamWriter& writer) { WriteHeader(input, output, config, multiFile, reflection, writer); })); for (auto fileIndex : config.headerFilesClasses.Keys()) { if (fileIndex != 0) { output->cppFiles.Add(input->defaultFileName + itow(fileIndex) + L".h", GenerateToStream([&](StreamWriter& writer) { WriteNonCustomSubHeader(input, output, config, multiFile, reflection, fileIndex, writer); })); } } output->cppFiles.Add(input->defaultFileName + L".cpp", GenerateToStream([&](StreamWriter& writer) { WriteCpp(input, output, config, multiFile, reflection, writer); })); if (reflection) { output->cppFiles.Add(input->reflectionFileName + L".h", GenerateToStream([&](StreamWriter& writer) { WriteReflectionHeader(input, output, config, multiFile, reflection, writer); })); output->cppFiles.Add(input->reflectionFileName + L".cpp", GenerateToStream([&](StreamWriter& writer) { WriteReflectionCpp(input, output, config, multiFile, reflection, writer); })); } if (multiFile) { output->cppFiles.Add(input->includeFileName + L".h", GenerateToStream([&](StreamWriter& writer) { WriteIncludesHeader(input, output, config, multiFile, reflection, writer); })); for (auto fileName : config.customFilesClasses.Keys()) { if (fileName != L"") { output->cppFiles.Add(fileName + L".h", GenerateToStream([&](StreamWriter& writer) { WriteSubHeader(input, output, config, multiFile, reflection, fileName, writer); })); output->cppFiles.Add(fileName + L".cpp", GenerateToStream([&](StreamWriter& writer) { WriteSubCpp(input, output, config, multiFile, reflection, fileName, writer); })); } } } return output; } } } } /*********************************************************************** .\CPP\WFCPP_STATEMENT.CPP ***********************************************************************/ namespace vl { namespace workflow { namespace cppcodegen { using namespace collections; using namespace reflection; using namespace reflection::description; using namespace analyzer; class WfGenerateStatementVisitor : public Object, public WfStatement::IVisitor { public: WfCppConfig* config; Ptr functionRecord; stream::StreamWriter& writer; WString prefixBlock; WString prefix; ITypeInfo* returnType; WfGenerateStatementVisitor(WfCppConfig* _config, Ptr _functionRecord, stream::StreamWriter& _writer, const WString& _prefixBlock, const WString& _prefix, ITypeInfo* _returnType) :config(_config) , functionRecord(_functionRecord) , writer(_writer) , prefixBlock(_prefixBlock) , prefix(_prefix) , returnType(_returnType) { } void Call(Ptr node, WString prefixDelta = WString::Unmanaged(L"\t")) { GenerateStatement(config, functionRecord, writer, node, prefix, prefixDelta, returnType); } void Visit(WfBreakStatement* node)override { writer.WriteString(prefix); writer.WriteLine(L"break;"); } void Visit(WfContinueStatement* node)override { writer.WriteString(prefix); writer.WriteLine(L"continue;"); } void Visit(WfReturnStatement* node)override { writer.WriteString(prefix); if (node->expression) { writer.WriteString(L"return "); GenerateExpression(config, writer, node->expression, returnType); writer.WriteLine(L";"); } else { writer.WriteLine(L"return;"); } } void Visit(WfDeleteStatement* node)override { writer.WriteString(prefix); writer.WriteString(L"::vl::__vwsn::This("); GenerateExpression(config, writer, node->expression, nullptr); writer.WriteLine(L")->Dispose(true);"); } void Visit(WfRaiseExceptionStatement* node)override { if (node->expression) { writer.WriteString(prefix); writer.WriteString(L"throw ::vl::Exception("); auto result = config->manager->expressionResolvings[node->expression.Obj()]; bool throwString = result.type->GetTypeDescriptor() == description::GetTypeDescriptor(); if (!throwString) { writer.WriteString(L"::vl::__vwsn::This("); } GenerateExpression(config, writer, node->expression, result.type.Obj()); if (!throwString) { writer.WriteString(L".Obj())->GetMessage()"); } writer.WriteLine(L");"); } else { writer.WriteString(prefix); writer.WriteLine(L"throw;"); } } void Visit(WfIfStatement* node)override { writer.WriteString(prefix); while (node) { writer.WriteString(L"if ("); if (node->type) { auto result = config->manager->expressionResolvings[node->expression.Obj()]; auto scope = config->manager->nodeScopes[node].Obj(); auto typeInfo = CreateTypeInfoFromType(scope, node->type); writer.WriteString(L"auto "); writer.WriteString(config->ConvertName(node->name.value)); writer.WriteString(L" = "); ConvertType(config, writer, result.type.Obj(), typeInfo.Obj(), [&]() {GenerateExpression(config, writer, node->expression, nullptr); }, false); } else { GenerateExpression(config, writer, node->expression, TypeInfoRetriver::CreateTypeInfo().Obj()); } writer.WriteLine(L")"); Call(node->trueBranch); if (node->falseBranch) { writer.WriteString(prefix); if (auto ifStat = node->falseBranch.Cast()) { writer.WriteString(L"else "); node = ifStat.Obj(); continue; } else { writer.WriteLine(L"else"); Call(node->falseBranch); } } break; } } void Visit(WfWhileStatement* node)override { writer.WriteString(prefix); writer.WriteString(L"while ("); GenerateExpression(config, writer, node->condition, TypeInfoRetriver::CreateTypeInfo().Obj()); writer.WriteLine(L")"); Call(node->statement); } void Visit(WfTryStatement* node)override { auto exName = L"__vwsne_" + itow(functionRecord->exprCounter++); WString tryPrefix = prefix; if (node->finallyStatement) { auto blockName = L"__vwsnb_" + itow(functionRecord->blockCounter++); tryPrefix += L"\t"; writer.WriteString(prefix); writer.WriteLine(L"{"); writer.WriteString(tryPrefix); writer.WriteString(L"auto "); writer.WriteString(blockName); writer.WriteLine(L" = [&]()"); GenerateStatement(config, functionRecord, writer, node->finallyStatement, tryPrefix, WString::Unmanaged(L"\t"), returnType); writer.WriteString(tryPrefix); writer.WriteLine(L";"); writer.WriteString(tryPrefix); writer.WriteString(L"::vl::__vwsn::RunOnExit<::std::remove_cvref_t> "); writer.WriteString(blockName); writer.WriteString(L"_dtor(&"); writer.WriteString(blockName); writer.WriteLine(L");"); } WString bodyPrefix = tryPrefix + L"\t"; writer.WriteString(tryPrefix); writer.WriteLine(L"try"); writer.WriteString(tryPrefix); writer.WriteLine(L"{"); GenerateStatement(config, functionRecord, writer, node->protectedStatement, bodyPrefix, WString::Unmanaged(L"\t"), returnType); writer.WriteString(tryPrefix); writer.WriteLine(L"}"); writer.WriteString(tryPrefix); writer.WriteString(L"catch(const ::vl::Exception&"); if (node->catchStatement) { writer.WriteString(L" "); writer.WriteString(exName); } writer.WriteLine(L")"); writer.WriteString(tryPrefix); writer.WriteLine(L"{"); if (node->catchStatement) { writer.WriteString(bodyPrefix); writer.WriteString(L"auto "); writer.WriteString(config->ConvertName(node->name.value)); writer.WriteString(L" = ::vl::reflection::description::IValueException::Create("); writer.WriteString(exName); writer.WriteLine(L".Message());"); GenerateStatement(config, functionRecord, writer, node->catchStatement, bodyPrefix, WString::Unmanaged(L"\t"), returnType); } writer.WriteString(tryPrefix); writer.WriteLine(L"}"); if (node->finallyStatement) { writer.WriteString(prefix); writer.WriteLine(L"}"); } } void Visit(WfBlockStatement* node)override { writer.WriteString(prefixBlock); writer.WriteLine(L"{"); auto oldPrefix = prefix; if (node->endLabel.value != L"") { auto name = config->ConvertName(node->endLabel.value, L"__vwsnl_" + itow(functionRecord->labelCounter++) + L"_"); functionRecord->labelNames.Add(node->endLabel.value, name); writer.WriteString(prefixBlock); writer.WriteLine(L"\t{"); prefix += L"\t"; } for (auto statement : node->statements) { statement = SearchUntilNonVirtualStatement(statement); if (statement.Cast()) { Call(statement); } else { Call(statement, WString::Empty); } } if (node->endLabel.value != L"") { prefix = oldPrefix; writer.WriteString(prefixBlock); writer.WriteLine(L"\t}"); writer.WriteString(prefixBlock); writer.WriteString(L"\t"); writer.WriteString(functionRecord->labelNames[node->endLabel.value]); writer.WriteLine(L":;"); functionRecord->labelNames.Remove(node->endLabel.value); } writer.WriteString(prefixBlock); writer.WriteLine(L"}"); } void Visit(WfGotoStatement* node)override { writer.WriteString(prefix); writer.WriteString(L"goto "); writer.WriteString(functionRecord->labelNames[node->label.value]); writer.WriteLine(L";"); } void Visit(WfExpressionStatement* node)override { writer.WriteString(prefix); GenerateExpression(config, writer, node->expression, nullptr, false); writer.WriteLine(L";"); } void Visit(WfVariableStatement* node)override { auto scope = config->manager->nodeScopes[node->variable.Obj()]; auto symbol = scope->symbols[node->variable->name.value][0].Obj(); writer.WriteString(prefix); if (node->variable->expression) { writer.WriteString(L"auto"); } else { writer.WriteString(config->ConvertType(symbol->typeInfo.Obj())); } writer.WriteString(L" "); writer.WriteString(config->ConvertName(node->variable->name.value)); if (node->variable->expression) { writer.WriteString(L" = "); GenerateExpression(config, writer, node->variable->expression, symbol->typeInfo.Obj()); } writer.WriteLine(L";"); } void Visit(WfVirtualCseStatement* node)override { node->expandedStatement->Accept(this); } void Visit(WfCoroutineStatement* node)override { CHECK_FAIL(L"WfGenerateStatementVisitor::Visit(WfCoroutineStatement*)#Internal error, All coroutine statements do not generate C++ code."); } void Visit(WfStateMachineStatement* node)override { CHECK_FAIL(L"WfGenerateStatementVisitor::Visit(WfStateMachineStatement*)#Internal error, All state machine statements do not generate C++ code."); } }; void GenerateStatement(WfCppConfig* config, Ptr functionRecord, stream::StreamWriter& writer, Ptr node, const WString& prefix, const WString& prefixDelta, reflection::description::ITypeInfo* returnType) { WfGenerateStatementVisitor visitor(config, functionRecord, writer, prefix, prefix + prefixDelta, returnType); node->Accept(&visitor); } } } } /*********************************************************************** .\CPP\WFCPP_WRITECLASS.CPP ***********************************************************************/ namespace vl { namespace workflow { namespace cppcodegen { using namespace collections; using namespace reflection; using namespace reflection::description; void WfCppConfig::WriteHeader_ClassPreDecl(stream::StreamWriter& writer, Ptr decl, const WString& name, const WString& prefix) { writer.WriteLine(prefix + L"class " + name + L";"); } void WfCppConfig::WriteHeader_ClassPreDecl(stream::StreamWriter& writer, Ptr decl, collections::List& nss) { auto td = manager->declarationTypes[decl.Obj()].Obj(); WString name; auto prefix = WriteNamespace(writer, CppGetFullName(td), nss, name); WriteHeader_ClassPreDecl(writer, decl, name, prefix); } class WriteHeader_Class_FindClassDeclVisitor : public empty_visitor::DeclarationVisitor { public: List>& unprocessed; WriteHeader_Class_FindClassDeclVisitor(List>& _unprocessed) :unprocessed(_unprocessed) { } void Dispatch(WfVirtualCseDeclaration* node)override { for (auto decl : node->expandedDeclarations) { decl->Accept(this); } } void Dispatch(WfVirtualCfeDeclaration* node)override { for (auto decl : node->expandedDeclarations) { decl->Accept(this); } } void Visit(WfClassDeclaration* node)override { unprocessed.Add(Ptr(node)); } }; void WfCppConfig::WriteHeader_Class(stream::StreamWriter& writer, Ptr decl, const WString& name, const WString& prefix) { auto td = manager->declarationTypes[decl.Obj()].Obj(); writer.WriteString(prefix + L"class " + name + L" : "); switch (decl->kind) { case WfClassKind::Class: { vint count = td->GetBaseTypeDescriptorCount(); bool hasClassBase = Range(0, count) .Any([=](vint index) { auto baseTd = td->GetBaseTypeDescriptor(index); return baseTd->GetTypeDescriptorFlags() == TypeDescriptorFlags::Class && baseTd != description::GetTypeDescriptor(); }); if (!hasClassBase) { writer.WriteString(L"public ::vl::Object, "); } for (vint i = 0; i < count; i++) { auto baseTd = td->GetBaseTypeDescriptor(i); switch (baseTd->GetTypeDescriptorFlags()) { case TypeDescriptorFlags::Class: if (baseTd != description::GetTypeDescriptor()) { writer.WriteString(L"public " + ConvertType(baseTd) + L", "); } break; case TypeDescriptorFlags::Interface: writer.WriteString(L"public virtual " + ConvertType(baseTd) + L", "); break; default:; } } } break; case WfClassKind::Interface: { vint count = td->GetBaseTypeDescriptorCount(); for (vint i = 0; i < count; i++) { writer.WriteString(L"public virtual " + ConvertType(td->GetBaseTypeDescriptor(i)) + L", "); } } break; default:; } writer.WriteLine(L"public ::vl::reflection::Description<" + name + L">"); writer.WriteLine(prefix + L"{"); { List> unprocessed; unprocessed.Add(decl); for (auto attribute : attributeEvaluator->GetAttributes(decl->attributes, L"cpp", L"Friend")) { auto attValue = attributeEvaluator->GetAttributeValue(attribute); CHECK_ERROR(attValue.type == runtime::WfInsType::Unknown && attValue.typeDescriptor != nullptr, L"Unexpected value in attribute: @cpp.Friend."); auto td = attValue.typeDescriptor; auto scopeName = manager->typeNames[td]; if (scopeName->declarations.Count() == 0) { writer.WriteLine(prefix + L"\tfriend class " + ConvertType(td) + L";"); } else { auto friendDecl = scopeName->declarations[0].Cast(); unprocessed.Add(friendDecl); } } auto declTypeName = ConvertType(manager->declarationTypes[decl.Obj()].Obj()); for (vint i = 0; i < unprocessed.Count(); i++) { auto current = unprocessed[i]; if (current != decl) { auto currentTypeName = ConvertType(manager->declarationTypes[current.Obj()].Obj()); bool isInternalClass = false; if (currentTypeName.Length() > declTypeName.Length() + 2) { if (currentTypeName.Left(declTypeName.Length() + 2) == declTypeName + L"::") { isInternalClass = true; } } if (!isInternalClass) { writer.WriteLine(prefix + L"\tfriend class " + currentTypeName + L";"); } } vint index = classClosures.Keys().IndexOf(current.Obj()); if (index != -1) { SortedList closureNames; CopyFrom( closureNames, From(classClosures.GetByIndex(index)) .Select([&](Ptr closure) { return (closure.Cast() ? L"class ::" : L"struct ::") + assemblyNamespace + L"::" + closureInfos[closure.Obj()]->lambdaClassName; }) ); for (auto closureName : closureNames) { writer.WriteLine(prefix + L"\tfriend " + closureName + L";"); } } WriteHeader_Class_FindClassDeclVisitor visitor(unprocessed); for (auto memberDecl : current->declarations) { memberDecl->Accept(&visitor); } } } writer.WriteLine(L"#ifdef VCZH_DESCRIPTABLEOBJECT_WITH_METADATA"); writer.WriteLine(prefix + L"\tfriend struct ::vl::reflection::description::CustomTypeDescriptorSelector<" + name + L">;"); writer.WriteLine(L"#endif"); const vint PRIVATE = 0; const vint PROTECTED = 1; const vint PUBLIC = 2; vint accessor = -1; { vint index = enumDecls.Keys().IndexOf(decl.Obj()); if (index != -1) { if (accessor != PUBLIC) { accessor = PUBLIC; writer.WriteLine(prefix + L"public:"); } for (auto decl : enumDecls.GetByIndex(index)) { WriteHeader_Enum(writer, decl, ConvertName(decl->name.value), prefix + L"\t", false); writer.WriteLine(L""); } } } { vint index = structDecls.Keys().IndexOf(decl.Obj()); if (index != -1) { if (accessor != PUBLIC) { accessor = PUBLIC; writer.WriteLine(prefix + L"public:"); } for (auto decl : structDecls.GetByIndex(index)) { WriteHeader_Struct(writer, decl, ConvertName(decl->name.value), prefix + L"\t", false); writer.WriteLine(L""); } } } { vint index = classDecls.Keys().IndexOf(decl.Obj()); if (index != -1) { if (accessor != PUBLIC) { accessor = PUBLIC; writer.WriteLine(prefix + L"public:"); } for (auto decl : classDecls.GetByIndex(index)) { WriteHeader_ClassPreDecl(writer, decl, ConvertName(decl->name.value), prefix + L"\t"); } writer.WriteLine(L""); for (auto decl : classDecls.GetByIndex(index)) { WriteHeader_Class(writer, decl, ConvertName(decl->name.value), prefix + L"\t"); } } } for (auto memberDecl : decl->declarations) { vint memberAccessor = PUBLIC; if (attributeEvaluator->GetAttribute(memberDecl->attributes, L"cpp", L"Private")) { memberAccessor = PRIVATE; } else if (attributeEvaluator->GetAttribute(memberDecl->attributes, L"cpp", L"Protected")) { memberAccessor = PROTECTED; } if (accessor != memberAccessor) { accessor = memberAccessor; switch (accessor) { case PRIVATE: writer.WriteLine(prefix + L"private:"); break; case PROTECTED: writer.WriteLine(prefix + L"protected:"); break; case PUBLIC: writer.WriteLine(prefix + L"public:"); break; } } GenerateClassMemberDecl(this, writer, ConvertName(decl->name.value), memberDecl, prefix + L"\t", false); } if (IsClassHasUserImplMethods(decl, false)) { auto td = manager->declarationTypes[decl.Obj()].Obj(); auto classFullName = CppGetFullName(td); writer.WriteLine(L""); writer.WriteLine(prefix + L"/* USER_CONTENT_BEGIN(custom members of " + classFullName + L") */"); writer.WriteLine(prefix + L"/* USER_CONTENT_END() */"); } writer.WriteLine(prefix + L"};"); } WString WfCppConfig::WriteHeader_Class(stream::StreamWriter& writer, Ptr decl, collections::List& nss) { auto td = manager->declarationTypes[decl.Obj()].Obj(); WString name; auto prefix = WriteNamespace(writer, CppGetFullName(td), nss, name); WriteHeader_Class(writer, decl, name, prefix); return prefix; } bool WfCppConfig::WriteCpp_ClassMember(stream::StreamWriter& writer, Ptr decl, Ptr memberDecl, collections::List& nss) { List nss2; GetClassNamespace(decl, nss2); auto prefix = WriteNamespace(writer, nss, nss2); auto td = manager->declarationTypes[decl.Obj()].Obj(); auto classFullName = CppGetFullName(td); return GenerateClassMemberImpl(this, writer, decl.Obj(), GetClassBaseName(decl), ConvertName(decl->name.value), classFullName, memberDecl, prefix); } void WfCppConfig::WriteCpp_Class(stream::StreamWriter& writer, Ptr decl, collections::List& nss) { List> classes; classes.Add(decl); vint processed = 0; while (processed < classes.Count()) { auto current = classes[processed++]; writer.WriteLine(L"/***********************************************************************"); writer.WriteLine(L"Class (" + CppGetFullName(manager->declarationTypes[current.Obj()].Obj()) + L")"); writer.WriteLine(L"***********************************************************************/"); writer.WriteLine(L""); for (auto memberDecl : current->declarations) { if (WriteCpp_ClassMember(writer, current, memberDecl, nss)) { writer.WriteLine(L""); } } vint index = classDecls.Keys().IndexOf(current.Obj()); if (index != -1) { CopyFrom(classes, classDecls.GetByIndex(index), true); } } } } } } /*********************************************************************** .\CPP\WFCPP_WRITEENUM.CPP ***********************************************************************/ namespace vl { namespace workflow { namespace cppcodegen { using namespace collections; void WfCppConfig::WriteHeader_Enum(stream::StreamWriter& writer, Ptr decl, const WString& name, const WString& prefix, bool mainHeaderDefinition) { if (mainHeaderDefinition) { writer.WriteLine(prefix + L"enum class " + name + L" : vl::vuint64_t"); writer.WriteLine(prefix + L"{"); for (auto item : decl->items) { switch (item->kind) { case WfEnumItemKind::Constant: writer.WriteLine(prefix + L"\t" + ConvertName(item->name.value) + L" = " + item->number.value + L"UL,"); break; case WfEnumItemKind::Intersection: writer.WriteString(prefix + L"\t" + ConvertName(item->name.value) + L" = "); for (auto [enumInt, index] : indexed(item->intersections)) { if (index > 0) { writer.WriteString(L" | "); } writer.WriteString(ConvertName(enumInt->name.value)); } writer.WriteLine(L","); break; default:; } } writer.WriteLine(prefix + L"};"); } else { auto td = manager->declarationTypes[decl.Obj()].Obj(); writer.WriteString(prefix); writer.WriteString(L"using "); writer.WriteString(name); writer.WriteString(L" = ::"); writer.WriteString(CppNameToHeaderEnumStructName(CppGetFullName(td), L"enum")); writer.WriteLine(L";"); } } void WfCppConfig::WriteHeader_EnumOp(stream::StreamWriter& writer, Ptr decl, const WString& name, const WString& prefix) { const wchar_t* ops[] = { L"&", L"|" }; for (auto op : ops) { writer.WriteString(prefix); writer.WriteString(L"inline "); writer.WriteString(name); writer.WriteString(L" operator"); writer.WriteString(op); writer.WriteString(L" ("); writer.WriteString(name); writer.WriteString(L" a, "); writer.WriteString(name); writer.WriteString(L" b) { return static_cast<"); writer.WriteString(name); writer.WriteString(L">(static_cast<::vl::vuint64_t>(a) "); writer.WriteString(op); writer.WriteLine(L" static_cast<::vl::vuint64_t>(b)); }"); } } void WfCppConfig::WriteHeader_Enum(stream::StreamWriter& writer, Ptr decl, collections::List& nss, bool mainHeaderDefinition) { auto td = manager->declarationTypes[decl.Obj()].Obj(); if (mainHeaderDefinition) { WString name; auto prefix = WriteNamespace(writer, CppNameToHeaderEnumStructName(CppGetFullName(td), L"enum"), nss, name); WriteHeader_Enum(writer, decl, name, prefix, true); WriteHeader_EnumOp(writer, decl, name, prefix); } else { WString name; auto prefix = WriteNamespace(writer, CppGetFullName(td), nss, name); writer.WriteString(prefix); writer.WriteString(L"using "); writer.WriteString(name); writer.WriteString(L" = ::"); writer.WriteString(CppNameToHeaderEnumStructName(CppGetFullName(td), L"enum")); writer.WriteLine(L";"); } } void WfCppConfig::WriteHeader_MainHeaderEnums(stream::StreamWriter& writer, collections::List& nss) { List> allEnums; CopyFrom(allEnums, Range(0, enumDecls.Count()).SelectMany([&](vint index) {return From(enumDecls.GetByIndex(index)); })); SortDeclsByName(allEnums); for (auto decl : allEnums) { WriteHeader_Enum(writer, decl, nss, true); writer.WriteLine(L""); } } } } } /*********************************************************************** .\CPP\WFCPP_WRITEFUNCTIONHEADER.CPP ***********************************************************************/ namespace vl { namespace workflow { namespace cppcodegen { using namespace collections; using namespace reflection::description; ITypeInfo* WfCppConfig::WriteFunctionHeader(stream::StreamWriter& writer, ITypeInfo* typeInfo, collections::List& arguments, const WString& name, bool writeReturnType) { ITypeInfo* returnType = nullptr; if (writeReturnType) { returnType = typeInfo->GetElementType()->GetGenericArgument(0); writer.WriteString(ConvertType(returnType)); writer.WriteChar(L' '); } writer.WriteString(name); writer.WriteString(L"("); for (vint i = 0; i < arguments.Count(); i++) { if (i > 0) { writer.WriteString(L", "); } writer.WriteString(ConvertArgumentType(typeInfo->GetElementType()->GetGenericArgument(i + 1))); writer.WriteChar(L' '); writer.WriteString(ConvertName(arguments[i])); } writer.WriteString(L")"); return returnType; } ITypeInfo* WfCppConfig::WriteFunctionHeader(stream::StreamWriter& writer, Ptr ordered, const WString& name, bool writeReturnType) { auto result = manager->expressionResolvings[ordered.Obj()]; auto typeInfo = result.type.Obj(); auto scope = manager->nodeScopes[ordered.Obj()].Obj(); List arguments; CopyFrom( arguments, Range(0, scope->symbols.Count()) .Select([scope](vint index) { return scope->symbols.GetByIndex(index)[0]->name; }) .OrderBySelf() ); return WriteFunctionHeader(writer, typeInfo, arguments, name, writeReturnType); } ITypeInfo* WfCppConfig::WriteFunctionHeader(stream::StreamWriter& writer, Ptr funcExpr, const WString& name, bool writeReturnType) { auto result = manager->expressionResolvings[funcExpr.Obj()]; auto typeInfo = result.type.Obj(); List arguments; CopyFrom( arguments, From(funcExpr->function->arguments) .Select([](Ptr argument) { return argument->name.value; }) ); return WriteFunctionHeader(writer, typeInfo, arguments, name, writeReturnType); } ITypeInfo* WfCppConfig::WriteFunctionHeader(stream::StreamWriter& writer, Ptr decl, const WString& name, bool writeReturnType) { vint index1 = manager->declarationMemberInfos.Keys().IndexOf(decl.Obj()); vint index2 = manager->interfaceMethodImpls.Keys().IndexOf(decl.Obj()); auto methodInfo = index1 != -1 ? dynamic_cast(manager->declarationMemberInfos.Values()[index1].Obj()) : index2 != -1 ? manager->interfaceMethodImpls.Values()[index2] : nullptr; List arguments; CopyFrom( arguments, From(decl->arguments) .Select([](Ptr argument) { return argument->name.value; }) ); if (methodInfo) { return WriteFunctionHeader(writer, methodInfo, arguments, name, writeReturnType); } else { auto scope = manager->nodeScopes[decl.Obj()].Obj(); auto symbol = manager->GetDeclarationSymbol(scope, decl.Obj()); auto typeInfo = symbol->typeInfo.Obj(); return WriteFunctionHeader(writer, typeInfo, arguments, name, writeReturnType); } } ITypeInfo* WfCppConfig::WriteFunctionHeader(stream::StreamWriter& writer, IMethodInfo* methodInfo, collections::List& arguments, const WString& name, bool writeReturnType) { ITypeInfo* returnType = nullptr; if (writeReturnType) { returnType = methodInfo->GetReturn(); writer.WriteString(ConvertType(returnType)); writer.WriteChar(L' '); } writer.WriteString(name); writer.WriteString(L"("); vint count = methodInfo->GetParameterCount(); for (vint i = 0; i < count; i++) { if (i > 0) { writer.WriteString(L", "); } writer.WriteString(ConvertArgumentType(methodInfo->GetParameter(i)->GetType())); writer.WriteChar(L' '); if (arguments.Count() == 0) { writer.WriteString(ConvertName(methodInfo->GetParameter(i)->GetName())); } else { writer.WriteString(ConvertName(arguments[i])); } } writer.WriteString(L")"); return returnType; } ITypeInfo* WfCppConfig::WriteFunctionHeader(stream::StreamWriter& writer, IMethodInfo* methodInfo, const WString& name, bool writeReturnType) { List arguments; return WriteFunctionHeader(writer, methodInfo, arguments, name, writeReturnType); } } } } /*********************************************************************** .\CPP\WFCPP_WRITEGLOBAL.CPP ***********************************************************************/ namespace vl { namespace workflow { namespace cppcodegen { using namespace collections; using namespace reflection; using namespace reflection::description; void WfCppConfig::SortClosure(Dictionary>& reversedLambdaExprs, Dictionary>& reversedClassExprs) { CopyFrom( reversedLambdaExprs, From(lambdaExprs) .Select([](Pair, WString> pair) { return Pair>(pair.value, pair.key); }) ); CopyFrom( reversedClassExprs, From(classExprs) .Select([](Pair, WString> pair) { return Pair>(pair.value, pair.key); }) ); } void WfCppConfig::WriteHeader_Global(stream::StreamWriter& writer) { Dictionary> reversedLambdaExprs; Dictionary> reversedClassExprs; SortClosure(reversedLambdaExprs, reversedClassExprs); writer.WriteLine(L"/***********************************************************************"); writer.WriteLine(L"Global Variables and Functions"); writer.WriteLine(L"***********************************************************************/"); writer.WriteLine(L""); writer.WriteLine(L"namespace " + assemblyNamespace); writer.WriteLine(L"{"); writer.WriteLine(L"\tclass " + assemblyName); writer.WriteLine(L"\t{"); writer.WriteLine(L"\tpublic:"); if (varDecls.Count() > 0) { writer.WriteLine(L""); for (auto decl : varDecls) { auto scope = manager->nodeScopes[decl.Obj()].Obj(); auto symbol = scope->symbols[decl->name.value][0]; auto typeInfo = symbol->typeInfo; writer.WriteString(L"\t\t" + ConvertType(typeInfo.Obj()) + L" " + ConvertName(decl->name.value)); auto defaultValue = DefaultValue(typeInfo.Obj()); if (defaultValue != L"") { writer.WriteString(L" = "); writer.WriteString(defaultValue); } writer.WriteLine(L";"); } } if (funcDecls.Count() > 0) { writer.WriteLine(L""); for (auto decl : funcDecls) { writer.WriteString(L"\t\t"); WriteFunctionHeader(writer, decl, ConvertName(decl->name.value), true); writer.WriteLine(L";"); } } writer.WriteLine(L""); writer.WriteLine(L"\t\tstatic " + assemblyName + L"& Instance();"); writer.WriteLine(L"\t};"); if (reversedLambdaExprs.Count() + reversedClassExprs.Count() > 0) { writer.WriteLine(L""); writer.WriteLine(L"/***********************************************************************"); writer.WriteLine(L"Closures"); writer.WriteLine(L"***********************************************************************/"); for (auto expr : reversedLambdaExprs.Values()) { writer.WriteLine(L""); WriteHeader_LambdaExprDecl(writer, expr); } for (auto expr : reversedClassExprs.Values()) { writer.WriteLine(L""); WriteHeader_ClassExprDecl(writer, expr); } } writer.WriteLine(L"}"); } void WfCppConfig::WriteCpp_Global(stream::StreamWriter& writer) { Dictionary> reversedLambdaExprs; Dictionary> reversedClassExprs; SortClosure(reversedLambdaExprs, reversedClassExprs); writer.WriteLine(L"/***********************************************************************"); writer.WriteLine(L"Global Variables"); writer.WriteLine(L"***********************************************************************/"); writer.WriteLine(L""); WString storageName = assemblyNamespace + L"_" + assemblyName; writer.WriteLine(L"BEGIN_GLOBAL_STORAGE_CLASS(" + storageName + L")"); writer.WriteLine(L"\t" + assemblyNamespace + L"::" + assemblyName + L" instance;"); writer.WriteLine(L"\tINITIALIZE_GLOBAL_STORAGE_CLASS"); if (varDecls.Count() > 0) { writer.WriteLine(L""); for (auto decl : varDecls) { auto scope = manager->nodeScopes[decl.Obj()].Obj(); auto symbol = scope->symbols[decl->name.value][0]; auto typeInfo = symbol->typeInfo; if (decl->expression) { writer.WriteString(L"\t\tinstance." + ConvertName(decl->name.value) + L" = "); GenerateExpression(this, writer, decl->expression, typeInfo.Obj()); writer.WriteLine(L";"); } } } if (staticInitDecls.Count() > 0) { auto voidType = description::TypeInfoRetriver::CreateTypeInfo(); for (auto staticInitDecl : staticInitDecls) { writer.WriteLine(L""); writer.WriteLine(L"\t\t([]()"); GenerateStatement(this, Ptr(new FunctionRecord), writer, staticInitDecl->statement, L"\t\t", WString::Unmanaged(L"\t"), voidType.Obj()); writer.WriteLine(L"\t\t)();"); } } writer.WriteLine(L"\tFINALIZE_GLOBAL_STORAGE_CLASS"); if (varDecls.Count() > 0) { writer.WriteLine(L""); for (auto decl : varDecls) { auto scope = manager->nodeScopes[decl.Obj()].Obj(); auto symbol = scope->symbols[decl->name.value][0]; auto typeInfo = symbol->typeInfo; switch (typeInfo->GetDecorator()) { case ITypeInfo::RawPtr: case ITypeInfo::SharedPtr: writer.WriteLine(L"\t\tinstance." + ConvertName(decl->name.value) + L" = nullptr;"); break; case ITypeInfo::Nullable: writer.WriteString(L"\t\tinstance." + ConvertName(decl->name.value) + L" = "); ConvertType(typeInfo.Obj()); writer.WriteLine(L"();"); break; default: if (typeInfo->GetTypeDescriptor() == description::GetTypeDescriptor()) { writer.WriteLine(L"\t\tinstance." + ConvertName(decl->name.value) + L" = ::vl::WString::Empty;"); } else if (typeInfo->GetTypeDescriptor() == description::GetTypeDescriptor()) { writer.WriteLine(L"\t\tinstance." + ConvertName(decl->name.value) + L" = ::vl::reflection::description::Value();"); } } } } writer.WriteLine(L"END_GLOBAL_STORAGE_CLASS(" + storageName + L")"); writer.WriteLine(L""); writer.WriteString(L"namespace "); writer.WriteLine(assemblyNamespace); writer.WriteLine(L"{"); writer.WriteLine(L"/***********************************************************************"); writer.WriteLine(L"Global Functions"); writer.WriteLine(L"***********************************************************************/"); for (auto decl : funcDecls) { writer.WriteLine(L""); writer.WriteString(L"\t"); auto returnType = WriteFunctionHeader(writer, decl, assemblyName + L"::" + ConvertName(decl->name.value), true); writer.WriteLine(L""); WriteFunctionBody(writer, decl->statement, L"\t", returnType); } writer.WriteLine(L""); writer.WriteLine(L"\t" + assemblyName + L"& " + assemblyName + L"::Instance()"); writer.WriteLine(L"\t{"); writer.WriteLine(L"\t\treturn Get" + storageName + L"().instance;"); writer.WriteLine(L"\t}"); if (reversedLambdaExprs.Count() + reversedClassExprs.Count() > 0) { writer.WriteLine(L""); writer.WriteLine(L"/***********************************************************************"); writer.WriteLine(L"Closures"); writer.WriteLine(L"***********************************************************************/"); for (auto expr : reversedLambdaExprs.Values()) { writer.WriteLine(L""); writer.WriteLine(L"\t//-------------------------------------------------------------------"); writer.WriteLine(L""); WriteCpp_LambdaExprImpl(writer, expr); } if (reversedClassExprs.Count() > 0) { writer.WriteLine(L""); for (auto expr : reversedClassExprs.Values()) { writer.WriteLine(L"\t//-------------------------------------------------------------------"); writer.WriteLine(L""); WriteCpp_ClassExprImpl(writer, expr); } } } writer.WriteLine(L"}"); } } } } /*********************************************************************** .\CPP\WFCPP_WRITELAMBDA.CPP ***********************************************************************/ namespace vl { namespace workflow { namespace cppcodegen { using namespace collections; using namespace analyzer; using namespace reflection; using namespace reflection::description; /*********************************************************************** WfCppConfig::WriteCpp ***********************************************************************/ void WfCppConfig::WriteHeader_ClosurePreDecl(stream::StreamWriter& writer, Ptr closure) { auto info = closureInfos[closure.Obj()]; writer.WriteString(L"\t"); if (closure.Cast()) { writer.WriteString(L"class "); } else { writer.WriteString(L"struct "); } writer.WriteString(info->lambdaClassName); writer.WriteLine(L";"); } void WfCppConfig::WriteHeader_LambdaExprDecl(stream::StreamWriter& writer, Ptr lambda) { if (auto ordered = lambda.Cast()) { auto name = lambdaExprs[lambda.Obj()]; writer.WriteLine(L"\tstruct " + name); writer.WriteLine(L"\t{"); if (WriteCpp_ClosureMembers(writer, lambda)) { writer.WriteLine(L""); } writer.WriteString(L"\t\t"); WriteCpp_ClosureCtor(writer, lambda, name); writer.WriteLine(L";"); writer.WriteLine(L""); writer.WriteString(L"\t\t"); WriteFunctionHeader(writer, ordered, L"operator()", true); writer.WriteLine(L" const;"); writer.WriteLine(L"\t};"); } else if (auto funcExpr = lambda.Cast()) { auto name = lambdaExprs[lambda.Obj()]; writer.WriteLine(L"\tstruct " + name); writer.WriteLine(L"\t{"); if (WriteCpp_ClosureMembers(writer, lambda)) { writer.WriteLine(L""); } writer.WriteString(L"\t\t"); WriteCpp_ClosureCtor(writer, lambda, name); writer.WriteLine(L";"); writer.WriteLine(L""); writer.WriteString(L"\t\t"); WriteFunctionHeader(writer, funcExpr, L"operator()", true); writer.WriteLine(L" const;"); writer.WriteLine(L"\t};"); } } void WfCppConfig::WriteHeader_ClassExprDecl(stream::StreamWriter& writer, Ptr lambda) { auto result = manager->expressionResolvings[lambda.Obj()]; auto td = result.constructorInfo->GetOwnerTypeDescriptor(); auto name = classExprs[lambda.Obj()]; writer.WriteLine(L"\tclass " + name + L" : public ::vl::Object, public virtual " + ConvertType(td)); writer.WriteLine(L"\t{"); writer.WriteLine(L"\tpublic:"); if (WriteCpp_ClosureMembers(writer, lambda)) { writer.WriteLine(L""); } writer.WriteString(L"\t\t"); WriteCpp_ClosureCtor(writer, lambda, name); writer.WriteLine(L";"); writer.WriteLine(L""); for (auto memberDecl : lambda->declarations) { GenerateClassMemberDecl(this, writer, name, memberDecl, L"\t\t", true); } writer.WriteLine(L"\t};"); } bool WfCppConfig::WriteCpp_ClosureMembers(stream::StreamWriter& writer, Ptr closure) { auto info = closureInfos[closure.Obj()]; for (auto symbol : info->symbols.Values()) { writer.WriteString(L"\t\t"); writer.WriteString(ConvertType(symbol->typeInfo.Obj())); writer.WriteString(L" "); writer.WriteString(ConvertName(symbol->name)); writer.WriteLine(L";"); } for (auto [thisType, index] : indexed(info->thisTypes)) { auto typeInfo = Ptr(new RawPtrTypeInfo(Ptr(new TypeDescriptorTypeInfo(thisType, TypeInfoHint::Normal)))); writer.WriteString(L"\t\t"); writer.WriteString(ConvertType(typeInfo.Obj())); writer.WriteString(L" "); writer.WriteString(L"__vwsnthis_" + itow(index)); writer.WriteLine(L";"); } return info->symbols.Count() + info->thisTypes.Count() > 0; } void WfCppConfig::WriteCpp_ClosureCtor(stream::StreamWriter& writer, Ptr closure, const WString& name) { auto info = closureInfos[closure.Obj()]; writer.WriteString(name); writer.WriteString(L"("); vint argumentIndex = 0; for (auto [symbol, index] : indexed(From(info->symbols.Values()).Concat(info->ctorArgumentSymbols.Values()))) { if (argumentIndex++ > 0) { writer.WriteString(L", "); } writer.WriteString(ConvertType(symbol->typeInfo.Obj())); writer.WriteString(L" __vwsnctor_"); writer.WriteString(ConvertName(symbol->name)); } for (auto [thisType, index] : indexed(info->thisTypes)) { auto typeInfo = Ptr(new RawPtrTypeInfo(Ptr(new TypeDescriptorTypeInfo(thisType, TypeInfoHint::Normal)))); if (argumentIndex++ > 0) { writer.WriteString(L", "); } writer.WriteString(ConvertType(typeInfo.Obj())); writer.WriteString(L" __vwsnctorthis_" + itow(index)); } writer.WriteString(L")"); } void WfCppConfig::WriteCpp_ClosureCtorInitList(stream::StreamWriter& writer, Ptr closure) { auto info = closureInfos[closure.Obj()]; for (auto [symbol, index] : indexed(info->symbols.Values())) { if (index > 0) { writer.WriteString(L"\t\t, "); } else { writer.WriteString(L"\t\t:"); } writer.WriteString(ConvertName(symbol->name)); writer.WriteString(L"(__vwsnctor_"); writer.WriteString(ConvertName(symbol->name)); writer.WriteLine(L")"); } for (auto [thisType, index] : indexed(info->thisTypes)) { if (index > 0 || info->symbols.Count() > 0) { writer.WriteString(L"\t\t, "); } else { writer.WriteString(L"\t\t:"); } writer.WriteString(L"__vwsnthis_" + itow(index)); writer.WriteString(L"(::vl::__vwsn::This(__vwsnctorthis_" + itow(index)); writer.WriteLine(L"))"); } } void WfCppConfig::WriteCpp_LambdaExprImpl(stream::StreamWriter& writer, Ptr lambda) { if (auto ordered = lambda.Cast()) { auto name = lambdaExprs[lambda.Obj()]; writer.WriteString(L"\t"); WriteCpp_ClosureCtor(writer, lambda, name + L"::" + name); writer.WriteLine(L""); WriteCpp_ClosureCtorInitList(writer, lambda); writer.WriteLine(L"\t{"); writer.WriteLine(L"\t}"); writer.WriteLine(L""); writer.WriteString(L"\t"); auto returnType = WriteFunctionHeader(writer, ordered, name + L"::operator()", true); writer.WriteLine(L" const"); writer.WriteLine(L"\t{"); WriteFunctionBody(writer, ordered->body, L"\t\t", returnType); writer.WriteLine(L"\t}"); } else if (auto funcExpr = lambda.Cast()) { auto name = lambdaExprs[lambda.Obj()]; writer.WriteString(L"\t"); WriteCpp_ClosureCtor(writer, lambda, name + L"::" + name); writer.WriteLine(L""); WriteCpp_ClosureCtorInitList(writer, lambda); writer.WriteLine(L"\t{"); writer.WriteLine(L"\t}"); writer.WriteLine(L""); writer.WriteString(L"\t"); auto returnType = WriteFunctionHeader(writer, funcExpr, name + L"::operator()", true); writer.WriteLine(L" const"); WriteFunctionBody(writer, funcExpr->function->statement, L"\t", returnType); } } class WriteCpp_ClassExprImpl_InitFieldVisitor : public empty_visitor::DeclarationVisitor { public: WfCppConfig* config; stream::StreamWriter& writer; WriteCpp_ClassExprImpl_InitFieldVisitor(WfCppConfig* _config, stream::StreamWriter& _writer) :config(_config) , writer(_writer) { } void Dispatch(WfVirtualCfeDeclaration* node)override { for (auto decl : node->expandedDeclarations) { decl->Accept(this); } } void Dispatch(WfVirtualCseDeclaration* node)override { for (auto decl : node->expandedDeclarations) { decl->Accept(this); } } void Visit(WfVariableDeclaration* node)override { if (node->expression) { auto scope = config->manager->nodeScopes[node].Obj(); auto symbol = scope->symbols[node->name.value][0]; auto typeInfo = symbol->typeInfo; writer.WriteString(L"\t\tthis->"); writer.WriteString(config->ConvertName(node->name.value)); writer.WriteString(L" = "); GenerateExpression(config, writer, node->expression, typeInfo.Obj()); writer.WriteLine(L";"); } } }; void WfCppConfig::WriteCpp_ClassExprImpl(stream::StreamWriter& writer, Ptr lambda) { auto name = classExprs[lambda.Obj()]; writer.WriteString(L"\t"); WriteCpp_ClosureCtor(writer, lambda, name + L"::" + name); writer.WriteLine(L""); WriteCpp_ClosureCtorInitList(writer, lambda); writer.WriteLine(L"\t{"); { WriteCpp_ClassExprImpl_InitFieldVisitor visitor(this, writer); for (auto memberDecl : lambda->declarations) { memberDecl->Accept(&visitor); } } writer.WriteLine(L"\t}"); writer.WriteLine(L""); WString classFullName = L"::" + assemblyNamespace + L"::" + name; for (auto memberDecl : lambda->declarations) { if (GenerateClassMemberImpl(this, writer, nullptr, name, name, classFullName, memberDecl, L"\t")) { writer.WriteLine(L""); } } } } } } /*********************************************************************** .\CPP\WFCPP_WRITEREFLECTION.CPP ***********************************************************************/ namespace vl { namespace workflow { namespace cppcodegen { using namespace collections; using namespace reflection; using namespace reflection::description; void LoadTypes(WfCppConfig* config, List& tds) { CopyFrom( tds, From(config->manager->declarationTypes.Values()) .OrderByKey([](auto&& a) { return a->GetTypeName(); }) .Select([](Ptr td) { return td.Obj(); }) ); } void WfCppConfig::WriteHeader_Reflection(stream::StreamWriter& writer) { writer.WriteLine(L"/***********************************************************************"); writer.WriteLine(L"Reflection"); writer.WriteLine(L"***********************************************************************/"); writer.WriteLine(L""); List tds; LoadTypes(this, tds); writer.WriteLine(L"namespace vl"); writer.WriteLine(L"{"); writer.WriteLine(L"\tnamespace reflection"); writer.WriteLine(L"\t{"); writer.WriteLine(L"\t\tnamespace description"); writer.WriteLine(L"\t\t{"); writer.WriteLine(L"#ifndef VCZH_DEBUG_NO_REFLECTION"); for (auto td : tds) { writer.WriteString(L"\t\t\tDECL_TYPE_INFO("); writer.WriteString(ConvertType(td)); writer.WriteLine(L")"); } List tdInterfaces; CopyFrom( tdInterfaces, From(tds) .Where([](ITypeDescriptor* td) { return td->GetTypeDescriptorFlags() == TypeDescriptorFlags::Interface; }) ); { vint processed = 0; while (processed < tdInterfaces.Count()) { vint count = tdInterfaces.Count(); for (vint i = processed; i < count; i++) { auto td = tdInterfaces[i]; if (Range(0, td->GetBaseTypeDescriptorCount()) .All([&](vint baseIndex) { return tdInterfaces.IndexOf(td->GetBaseTypeDescriptor(baseIndex)) < processed; })) { tdInterfaces.RemoveAt(i); tdInterfaces.Insert(processed++, td); } } } } if (tdInterfaces.Count() > 0) { writer.WriteLine(L""); writer.WriteLine(L"#ifdef VCZH_DESCRIPTABLEOBJECT_WITH_METADATA"); for (auto td : tdInterfaces) { List baseTds; CopyFrom( baseTds, Range(0, td->GetBaseTypeDescriptorCount()) .Select([&](vint index) { return td->GetBaseTypeDescriptor(index); }) .Where([&](ITypeDescriptor* baseTd) { return baseTd->GetTypeDescriptorFlags() != TypeDescriptorFlags::IDescriptable; }) ); writer.WriteLine(L""); if (baseTds.Count() > 0) { writer.WriteString(L"\t\t\tBEGIN_INTERFACE_PROXY_SHAREDPTR("); writer.WriteString(ConvertType(td)); for (auto baseTd : baseTds) { writer.WriteString(L", "); writer.WriteString(ConvertType(baseTd)); } writer.WriteLine(L")"); } else { writer.WriteString(L"\t\t\tBEGIN_INTERFACE_PROXY_NOPARENT_SHAREDPTR("); writer.WriteString(ConvertType(td)); writer.WriteLine(L")"); } vint methodGroupCount = td->GetMethodGroupCount(); for (vint i = 0; i < methodGroupCount; i++) { auto methodGroup = td->GetMethodGroup(i); vint methodCount = methodGroup->GetMethodCount(); for (vint j = 0; j < methodCount; j++) { auto methodInfo = methodGroup->GetMethod(j); if (!methodInfo->IsStatic()) { writer.WriteString(L"\t\t\t\t"); WriteFunctionHeader(writer, methodInfo, ConvertName(methodInfo->GetName()), true); writer.WriteLine(L" override"); writer.WriteLine(L"\t\t\t\t{"); if (methodInfo->GetReturn()->GetTypeDescriptor() == description::GetTypeDescriptor()) { writer.WriteString(L"\t\t\t\t\tINVOKE_INTERFACE_PROXY"); } else { writer.WriteString(L"\t\t\t\t\tINVOKEGET_INTERFACE_PROXY"); } if (methodInfo->GetParameterCount() > 0) { writer.WriteString(L"("); writer.WriteString(ConvertName(methodInfo->GetName())); vint parameterCount = methodInfo->GetParameterCount(); for (vint k = 0; k < parameterCount; k++) { writer.WriteString(L", "); writer.WriteString(ConvertName(methodInfo->GetParameter(k)->GetName())); } writer.WriteLine(L");"); } else { writer.WriteString(L"_NOPARAMS("); writer.WriteString(ConvertName(methodInfo->GetName())); writer.WriteLine(L");"); } writer.WriteLine(L"\t\t\t\t}"); } } } writer.WriteString(L"\t\t\tEND_INTERFACE_PROXY("); writer.WriteString(ConvertType(td)); writer.WriteLine(L")"); } writer.WriteLine(L"#endif"); } writer.WriteLine(L"#endif"); writer.WriteLine(L""); writer.WriteString(L"\t\t\textern bool Load"); writer.WriteString(assemblyName); writer.WriteLine(L"Types();"); writer.WriteLine(L"\t\t}"); writer.WriteLine(L"\t}"); writer.WriteLine(L"}"); } void WfCppConfig::WriteCpp_Reflection(stream::StreamWriter& writer) { writer.WriteLine(L"/***********************************************************************"); writer.WriteLine(L"Reflection"); writer.WriteLine(L"***********************************************************************/"); writer.WriteLine(L""); List tds; LoadTypes(this, tds); writer.WriteLine(L"namespace vl"); writer.WriteLine(L"{"); writer.WriteLine(L"\tnamespace reflection"); writer.WriteLine(L"\t{"); writer.WriteLine(L"\t\tnamespace description"); writer.WriteLine(L"\t\t{"); writer.WriteLine(L"#ifndef VCZH_DEBUG_NO_REFLECTION"); for (auto td : tds) { writer.WriteString(L"\t\t\tIMPL_CPP_TYPE_INFO("); WString type = ConvertType(td); if (type.Length() > 2 && type.Sub(0, 2) == L"::") { type = type.Sub(2, type.Length() - 2); } writer.WriteString(type); writer.WriteLine(L")"); } writer.WriteLine(L""); writer.WriteLine(L"#ifdef VCZH_DESCRIPTABLEOBJECT_WITH_METADATA"); writer.WriteLine(L"#define _ ,"); for (auto td : tds) { switch (td->GetTypeDescriptorFlags()) { case TypeDescriptorFlags::NormalEnum: case TypeDescriptorFlags::FlagEnum: { writer.WriteString(L"\t\t\tBEGIN_ENUM_ITEM"); if (td->GetTypeDescriptorFlags() == TypeDescriptorFlags::FlagEnum) { writer.WriteString(L"_MERGABLE"); } writer.WriteString(L"("); writer.WriteString(ConvertType(td)); writer.WriteLine(L")"); auto enumType = td->GetEnumType(); vint count = enumType->GetItemCount(); for (vint i = 0; i < count; i++) { writer.WriteString(L"\t\t\t\tENUM_CLASS_ITEM("); writer.WriteString(ConvertName(enumType->GetItemName(i))); writer.WriteLine(L")"); } writer.WriteString(L"\t\t\tEND_ENUM_ITEM("); writer.WriteString(ConvertType(td)); writer.WriteLine(L")"); } break; case TypeDescriptorFlags::Struct: { writer.WriteString(L"\t\t\tBEGIN_STRUCT_MEMBER("); writer.WriteString(ConvertType(td)); writer.WriteLine(L")"); vint count = td->GetPropertyCount(); for (vint i = 0; i < count; i++) { writer.WriteString(L"\t\t\t\tSTRUCT_MEMBER("); writer.WriteString(ConvertName(td->GetProperty(i)->GetName())); writer.WriteLine(L")"); } writer.WriteString(L"\t\t\tEND_STRUCT_MEMBER("); writer.WriteString(ConvertType(td)); writer.WriteLine(L")"); } break; case TypeDescriptorFlags::Interface: case TypeDescriptorFlags::Class: { if (td->GetTypeDescriptorFlags() == TypeDescriptorFlags::Interface) { writer.WriteString(L"\t\t\tBEGIN_INTERFACE_MEMBER("); } else { writer.WriteString(L"\t\t\tBEGIN_CLASS_MEMBER("); } writer.WriteString(ConvertType(td)); writer.WriteLine(L")"); vint baseCount = td->GetBaseTypeDescriptorCount(); for (vint i = 0; i < baseCount; i++) { writer.WriteString(L"\t\t\t\tCLASS_MEMBER_BASE("); writer.WriteString(ConvertType(td->GetBaseTypeDescriptor(i))); writer.WriteLine(L")"); } if (td->GetTypeDescriptorFlags() == TypeDescriptorFlags::Class) { auto methodGroup = td->GetConstructorGroup(); vint methodCount = methodGroup->GetMethodCount(); for (vint j = 0; j < methodCount; j++) { auto methodInfo = methodGroup->GetMethod(j); vint parameterCount = methodInfo->GetParameterCount(); writer.WriteString(L"\t\t\t\tCLASS_MEMBER_CONSTRUCTOR("); writer.WriteString(ConvertType(methodInfo->GetReturn())); writer.WriteString(L"("); for (vint k = 0; k < parameterCount; k++) { if (k > 0) { writer.WriteString(L", "); } writer.WriteString(ConvertArgumentType(methodInfo->GetParameter(k)->GetType())); } writer.WriteString(L")"); if (parameterCount > 0) { writer.WriteString(L", {"); for (vint k = 0; k < parameterCount; k++) { if (k > 0) { writer.WriteString(L" _"); } writer.WriteString(L" L\""); writer.WriteString(ConvertName(methodInfo->GetParameter(k)->GetName())); writer.WriteString(L"\""); } writer.WriteLine(L" })"); } else { writer.WriteLine(L", NO_PARAMETER)"); } } } vint methodGroupCount = td->GetMethodGroupCount(); for (vint i = 0; i < methodGroupCount; i++) { auto methodGroup = td->GetMethodGroup(i); vint methodCount = methodGroup->GetMethodCount(); for (vint j = 0; j < methodCount; j++) { auto methodInfo = methodGroup->GetMethod(j); if (methodInfo->IsStatic()) { writer.WriteString(L"\t\t\t\tCLASS_MEMBER_STATIC_METHOD"); } else { writer.WriteString(L"\t\t\t\tCLASS_MEMBER_METHOD"); } if (methodCount > 1) { writer.WriteString(L"_OVERLOAD"); } writer.WriteString(L"("); writer.WriteString(ConvertName(methodInfo->GetName())); vint parameterCount = methodInfo->GetParameterCount(); if (parameterCount > 0) { writer.WriteString(L", {"); for (vint k = 0; k < parameterCount; k++) { if (k > 0) { writer.WriteString(L" _"); } writer.WriteString(L" L\""); writer.WriteString(ConvertName(methodInfo->GetParameter(k)->GetName())); writer.WriteString(L"\""); } writer.WriteString(L" }"); } else { writer.WriteString(L", NO_PARAMETER"); } if (methodCount > 1) { writer.WriteString(L", "); auto typeDecorator = methodInfo->IsStatic() ? WString::Unmanaged(L"(*)") : L"(" + ConvertType(td) + L"::*)"; writer.WriteString(ConvertFunctionType(methodInfo, typeDecorator)); } writer.WriteLine(L")"); } } vint eventCount = td->GetEventCount(); for (vint i = 0; i < eventCount; i++) { auto eventInfo = td->GetEvent(i); writer.WriteString(L"\t\t\t\tCLASS_MEMBER_EVENT("); writer.WriteString(ConvertName(eventInfo->GetName())); writer.WriteLine(L")"); } vint propertyCount = td->GetPropertyCount(); for (vint i = 0; i < propertyCount; i++) { auto propertyInfo = td->GetProperty(i); if (auto getter = propertyInfo->GetGetter()) { if (auto eventInfo = propertyInfo->GetValueChangedEvent()) { if (auto setter = propertyInfo->GetSetter()) { writer.WriteString(L"\t\t\t\tCLASS_MEMBER_PROPERTY_EVENT("); writer.WriteString(ConvertName(propertyInfo->GetName())); writer.WriteString(L", "); writer.WriteString(ConvertName(getter->GetName())); writer.WriteString(L", "); writer.WriteString(ConvertName(setter->GetName())); writer.WriteString(L", "); writer.WriteString(ConvertName(eventInfo->GetName())); writer.WriteLine(L")"); } else { writer.WriteString(L"\t\t\t\tCLASS_MEMBER_PROPERTY_EVENT_READONLY("); writer.WriteString(ConvertName(propertyInfo->GetName())); writer.WriteString(L", "); writer.WriteString(ConvertName(getter->GetName())); writer.WriteString(L", "); writer.WriteString(ConvertName(eventInfo->GetName())); writer.WriteLine(L")"); } } else { if (auto setter = propertyInfo->GetSetter()) { writer.WriteString(L"\t\t\t\tCLASS_MEMBER_PROPERTY("); writer.WriteString(ConvertName(propertyInfo->GetName())); writer.WriteString(L", "); writer.WriteString(ConvertName(getter->GetName())); writer.WriteString(L", "); writer.WriteString(ConvertName(setter->GetName())); writer.WriteLine(L")"); } else { writer.WriteString(L"\t\t\t\tCLASS_MEMBER_PROPERTY_READONLY("); writer.WriteString(ConvertName(propertyInfo->GetName())); writer.WriteString(L", "); writer.WriteString(ConvertName(getter->GetName())); writer.WriteLine(L")"); } } } else { writer.WriteString(L"\t\t\t\tCLASS_MEMBER_FIELD("); writer.WriteString(ConvertName(propertyInfo->GetName())); writer.WriteLine(L")"); } } if (td->GetTypeDescriptorFlags() == TypeDescriptorFlags::Interface) { writer.WriteString(L"\t\t\tEND_INTERFACE_MEMBER("); } else { writer.WriteString(L"\t\t\tEND_CLASS_MEMBER("); } writer.WriteString(ConvertType(td)); writer.WriteLine(L")"); } break; default:; } writer.WriteLine(L""); } writer.WriteLine(L"#undef _"); writer.WriteString(L"\t\t\tclass "); writer.WriteString(assemblyName); writer.WriteLine(L"TypeLoader : public Object, public ITypeLoader"); writer.WriteLine(L"\t\t\t{"); writer.WriteLine(L"\t\t\tpublic:"); writer.WriteLine(L"\t\t\t\tvoid Load(ITypeManager* manager)"); writer.WriteLine(L"\t\t\t\t{"); for (auto td : tds) { writer.WriteString(L"\t\t\t\t\tADD_TYPE_INFO("); writer.WriteString(ConvertType(td)); writer.WriteLine(L")"); } writer.WriteLine(L"\t\t\t\t}"); writer.WriteLine(L""); writer.WriteLine(L"\t\t\t\tvoid Unload(ITypeManager* manager)"); writer.WriteLine(L"\t\t\t\t{"); writer.WriteLine(L"\t\t\t\t}"); writer.WriteLine(L"\t\t\t};"); writer.WriteLine(L"#endif"); writer.WriteLine(L"#endif"); writer.WriteLine(L""); writer.WriteString(L"\t\t\tbool Load"); writer.WriteString(assemblyName); writer.WriteLine(L"Types()"); writer.WriteLine(L"\t\t\t{"); writer.WriteLine(L"#ifdef VCZH_DESCRIPTABLEOBJECT_WITH_METADATA"); writer.WriteLine(L"\t\t\t\tif (auto manager = GetGlobalTypeManager())"); writer.WriteLine(L"\t\t\t\t{"); writer.WriteString(L"\t\t\t\t\treturn manager->AddTypeLoader(Ptr(new "); writer.WriteString(assemblyName); writer.WriteLine(L"TypeLoader));"); writer.WriteLine(L"\t\t\t\t}"); writer.WriteLine(L"#endif"); writer.WriteLine(L"\t\t\t\treturn false;"); writer.WriteLine(L"\t\t\t}"); writer.WriteLine(L"\t\t}"); writer.WriteLine(L"\t}"); writer.WriteLine(L"}"); } } } } /*********************************************************************** .\CPP\WFCPP_WRITESTRUCT.CPP ***********************************************************************/ namespace vl { namespace workflow { namespace cppcodegen { using namespace collections; void WfCppConfig::WriteHeader_Struct(stream::StreamWriter& writer, Ptr decl, const WString& name, const WString& prefix, bool mainHeaderDefinition) { if (mainHeaderDefinition) { auto td = manager->declarationTypes[decl.Obj()].Obj(); writer.WriteLine(prefix + L"struct " + name); writer.WriteLine(prefix + L"{"); for (auto member : decl->members) { auto prop = td->GetPropertyByName(member->name.value, false); auto defaultValue = DefaultValue(prop->GetReturn()); if (defaultValue != L"") { defaultValue = L" = " + defaultValue; } writer.WriteLine(prefix + L"\t" + ConvertType(prop->GetReturn(), true) + L" " + ConvertName(member->name.value) + defaultValue + L";"); } if (decl->members.Count() > 0) { writer.WriteLine(L""); } writer.WriteLine(prefix + L"\tauto operator<=>(const " + name + L"&) const = default;"); writer.WriteLine(prefix + L"};"); } else { auto td = manager->declarationTypes[decl.Obj()].Obj(); writer.WriteString(prefix); writer.WriteString(L"using "); writer.WriteString(name); writer.WriteString(L" = ::"); writer.WriteString(CppNameToHeaderEnumStructName(CppGetFullName(td), L"struct")); writer.WriteLine(L";"); } } void WfCppConfig::WriteHeader_Struct(stream::StreamWriter& writer, Ptr decl, collections::List& nss, bool mainHeaderDefinition) { auto td = manager->declarationTypes[decl.Obj()].Obj(); if (mainHeaderDefinition) { WString name; auto prefix = WriteNamespace(writer, CppNameToHeaderEnumStructName(CppGetFullName(td), L"struct"), nss, name); WriteHeader_Struct(writer, decl, name, prefix, true); } else { WString name; auto prefix = WriteNamespace(writer, CppGetFullName(td), nss, name); writer.WriteString(prefix); writer.WriteString(L"using "); writer.WriteString(name); writer.WriteString(L" = ::"); writer.WriteString(CppNameToHeaderEnumStructName(CppGetFullName(td), L"struct")); writer.WriteLine(L";"); } } void WfCppConfig::WriteHeader_MainHeaderStructs(stream::StreamWriter& writer, collections::List& nss) { List> allStructs; CopyFrom(allStructs, Range(0, structDecls.Count()).SelectMany([&](vint index) {return From(structDecls.GetByIndex(index)); })); SortDeclsByName(allStructs); Group, Ptr> depGroup; for (auto decl : allStructs) { auto td = manager->declarationTypes[decl.Obj()].Obj(); vint count = td->GetPropertyCount(); for (vint i = 0; i < count; i++) { auto propType = td->GetProperty(i)->GetReturn(); if (propType->GetDecorator() == ITypeInfo::TypeDescriptor) { auto propTd = propType->GetTypeDescriptor(); vint index = tdDecls.Keys().IndexOf(propTd); if (index != -1) { depGroup.Add(decl, tdDecls.Values()[index].Cast()); } } } } PartialOrderingProcessor pop; pop.InitWithGroup(allStructs, depGroup); pop.Sort(); for (vint i = 0; i < pop.components.Count(); i++) { auto& component = pop.components[i]; CHECK_ERROR(component.nodeCount == 1, L"WfCppConfig::WriteHeader_MainHeaderStructs(StreamWriter&, List&)#Internal error: Unexpected circle dependency found, which should be cought by the Workflow semantic analyzer."); auto decl = allStructs[component.firstNode[0]]; WriteHeader_Struct(writer, decl, nss, true); writer.WriteLine(L""); } } } } } /*********************************************************************** .\CPP\WFMERGECPP.CPP ***********************************************************************/ namespace vl { namespace workflow { namespace cppcodegen { using namespace collections; using namespace stream; using namespace regex; /*********************************************************************** MergeCpp ***********************************************************************/ WString RemoveSpacePrefix(const WString& s) { for (vint i = 0; i < s.Length(); i++) { if (s[i] != L' '&&s[i] != L'\t') { return s.Sub(i, s.Length() - i); } } return WString::Empty; } const vint NORMAL = 0; const vint WAIT_HEADER = 1; const vint WAIT_OPEN = 2; const vint WAIT_CLOSE = 3; const vint USER_CONTENT = 4; const vint UNUSED_USER_CONTENT = 5; template void ProcessCppContent(const WString& code, const TCallback& callback) { Regex regexUserContentBegin(L"/.*?(?/{)?///* USER_CONTENT_BEGIN/(([^)]*?)/) /*//"); vint _name = regexUserContentBegin.CaptureNames().IndexOf(L"name"); vint state = NORMAL; vint counter = 0; WString previousContent; StringReader reader(code); while (!reader.IsEnd()) { auto line = reader.ReadLine(); if (reader.IsEnd() && line == L"") { break; } if (line == L"// UNUSED_USER_CONTENT:") { state = UNUSED_USER_CONTENT; } if (state == UNUSED_USER_CONTENT) { callback(state, state, line, line); } else { auto content = RemoveSpacePrefix(line); auto previousState = state; switch (state) { case NORMAL: if (auto match = regexUserContentBegin.MatchHead(content)) { content = L"USERIMPL(/* " + match->Groups()[_name][0].Value() + L" */)"; if (match->Captures().Count() > 0) { content += previousContent; } state = USER_CONTENT; } else if (INVLOC.StartsWith(content, L"USERIMPL(",Locale::None)) { state = WAIT_HEADER; } break; case WAIT_HEADER: state = WAIT_OPEN; break; case WAIT_OPEN: if (INVLOC.StartsWith(content, L"{", Locale::None)) { state = WAIT_CLOSE; } break; case WAIT_CLOSE: if (INVLOC.StartsWith(content, L"{", Locale::None)) { counter++; } else if (INVLOC.StartsWith(content, L"}", Locale::None)) { if (counter == 0) { state = NORMAL; } else { counter--; } } break; case USER_CONTENT: if (INVLOC.EndsWith(content, L"/* USER_CONTENT_END() */", Locale::None)) { state = NORMAL; } break; } callback(previousState, state, line, content); } previousContent = RemoveSpacePrefix(line); } } template void SplitCppContent(const WString& code, Dictionary& userContents, Dictionary& userContentsFull, const TCallback& callback) { WString name; WString userImpl; WString userImplFull; ProcessCppContent(code, [&](vint previousState, vint state, const WString& line, const WString& content) { if (state == UNUSED_USER_CONTENT) { callback(line); } else { switch (previousState) { case NORMAL: switch (state) { case WAIT_HEADER: case USER_CONTENT: name = content; userImpl = L""; userImplFull = L""; break; } break; case WAIT_HEADER: name += content; break; case WAIT_CLOSE: case USER_CONTENT: switch (state) { case WAIT_CLOSE: case USER_CONTENT: userImpl += line + L"\r\n"; break; case NORMAL: userImplFull += L"//" + line + L"\r\n"; userContents.Add(name, userImpl); userContentsFull.Add(name, userImplFull); name = L""; break; } break; } if (name != L"") { userImplFull += L"//" + line + L"\r\n"; } } }); } MergeCppMultiPlatformException::MergeCppMultiPlatformException(vint _row32, vint _column32, vint _row64, vint _column64) :Exception(L"The difference at " L"x86 file(row:" + itow(_row32 + 1) + L", column:" + itow(_column32 + 1) + L") and " L"x64 file(row:" + itow(_row64 + 1) + L", column:" + itow(_column64 + 1) + L") are not " L"\"vint32_t\" and \"vint64_t\", " L"\"vuint32_t\" and \"vuint64_t\", " L"\"\" and \"L\", " L"\"\" and \"UL\".") , row32(_row32) , column32(_column32) , row64(_row64) , column64(_column64) { } void CountRowAndColumn(const wchar_t* start, const wchar_t* reading, vint& row, vint& column) { row = 0; column = 0; while (start < reading) { if (*start++ == L'\n') { row++; column = 0; } else { column++; } } } WString MergeCppMultiPlatform(const WString& code32, const WString& code64) { static wchar_t stringCast32[] = L"static_cast<::vl::vint32_t>("; const vint lengthCast32 = sizeof(stringCast32) / sizeof(*stringCast32) - 1; static wchar_t stringCast64[] = L"static_cast<::vl::vint64_t>("; const vint lengthCast64 = sizeof(stringCast64) / sizeof(*stringCast64) - 1; return GenerateToStream([&](StreamWriter& writer) { const wchar_t* reading32 = code32.Buffer(); const wchar_t* reading64 = code64.Buffer(); const wchar_t* start32 = reading32; const wchar_t* start64 = reading64; while (true) { vint length = 0; while (reading32[length] && reading64[length]) { if (reading32[length] == reading64[length]) { length++; } else { break; } } writer.WriteString(reading32, length); reading32 += length; reading64 += length; if (*reading32 == 0 && *reading64 == 0) { break; } #define IS_DIGIT(C) (L'0' <= C && C <= L'9') if (reading32[0] == L'3' && reading32[1] == L'2' && reading64[0] == L'6' && reading64[1] == L'4') { if (length >= 4) { if (wcsncmp(reading32 - 4, L"vint32_t", 8) == 0 && wcsncmp(reading64 - 4, L"vint64_t", 8) == 0) { reading32 += 4; reading64 += 4; goto NEXT_ROUND; } } if (length >= 5) { if (wcsncmp(reading32 - 5, L"vuint32_t", 9) == 0 && wcsncmp(reading64 - 5, L"vuint64_t", 9) == 0) { reading32 += 4; reading64 += 4; goto NEXT_ROUND; } } } else if (reading64[0] == L'L') { if (reading32[0] == reading64[1] && length >= 1) { if (IS_DIGIT(reading32[-1]) && !IS_DIGIT(reading32[0])) { if (IS_DIGIT(reading64[-1]) && !IS_DIGIT(reading64[1])) { reading64 += 1; goto NEXT_ROUND; } } } } else if (reading64[0] == L'U' && reading64[1] == L'L') { if (reading32[0] == reading64[2] && length >= 1) { if (IS_DIGIT(reading32[-1]) && !IS_DIGIT(reading32[0])) { if (IS_DIGIT(reading64[-1]) && !IS_DIGIT(reading64[2])) { reading64 += 2; goto NEXT_ROUND; } } } } else if (wcsncmp(reading32, stringCast32, lengthCast32) == 0 && IS_DIGIT(reading32[lengthCast32]) && IS_DIGIT(reading64[0])) { reading32 += lengthCast32; vint digitCount = 0; while (IS_DIGIT(reading32[digitCount])) digitCount++; if (wcsncmp(reading32, reading64, digitCount) == 0 && reading64[digitCount] == L'L' && reading32[digitCount] == L')') { writer.WriteString(L"static_cast<::vl::vint>("); writer.WriteString(WString::CopyFrom(reading32, digitCount)); writer.WriteChar(L')'); reading64 += digitCount + 1; reading32 += digitCount + 1; goto NEXT_ROUND; } } else if (wcsncmp(reading64, stringCast64, lengthCast64) == 0 && IS_DIGIT(reading64[lengthCast64]) && IS_DIGIT(reading32[0])) { reading64 += lengthCast64; vint digitCount = 0; while (IS_DIGIT(reading64[digitCount])) digitCount++; if (wcsncmp(reading64, reading32, digitCount) == 0 && reading64[digitCount] == L'L' && reading64[digitCount + 1] == L')') { writer.WriteString(L"static_cast<::vl::vint>("); writer.WriteString(WString::CopyFrom(reading64, digitCount)); writer.WriteChar(L')'); reading64 += digitCount + 2; reading32 += digitCount; goto NEXT_ROUND; } } { vint row32 = 0; vint column32 = 0; vint row64 = 0; vint column64 = 0; CountRowAndColumn(start32, reading32, row32, column32); CountRowAndColumn(start64, reading64, row64, column64); throw MergeCppMultiPlatformException(row32, column32, row64, column64); } NEXT_ROUND:; #undef IS_DIGIT } }); } WString MergeCppFileContent(const WString& dst, const WString& src) { Dictionary userContents, userContentsFull; WString unusedUserContent = GenerateToStream([&](StreamWriter& writer) { SplitCppContent(dst, userContents, userContentsFull, [&](const WString& line) { writer.WriteLine(line); }); }); WString processedUnusedUserContent = GenerateToStream([&](StreamWriter& writer) { StringReader reader(unusedUserContent); while (!reader.IsEnd()) { auto line = reader.ReadLine(); if (line != L"// UNUSED_USER_CONTENT:") { if (INVLOC.StartsWith(line, L"//", Locale::None)) { line = line.Right(line.Length() - 2); } writer.WriteLine(line); } } }); SplitCppContent(processedUnusedUserContent, userContents, userContentsFull, [&](const WString& line) {}); return GenerateToStream([&](StreamWriter& writer) { WString name; WString userImpl; ProcessCppContent(src, [&](vint previousState, vint state, const WString& line, const WString& content) { switch (previousState) { case NORMAL: switch (state) { case WAIT_HEADER: case USER_CONTENT: name = content; userImpl = L""; break; } break; case WAIT_HEADER: name += content; break; case WAIT_CLOSE: case USER_CONTENT: switch (state) { case WAIT_CLOSE: case USER_CONTENT: userImpl += line + L"\r\n"; return; case NORMAL: { vint index = userContents.Keys().IndexOf(name); if (index == -1) { writer.WriteString(userImpl); } else { writer.WriteString(userContents.Values()[index]); userContentsFull.Remove(name); } } break; } break; } writer.WriteLine(line); }); if (userContentsFull.Count() > 0) { writer.WriteLine(L"// UNUSED_USER_CONTENT:"); for (auto content : userContentsFull.Values()) { writer.WriteString(content); } } }); } } } } /*********************************************************************** .\EMITTER\WFEMITTER.CPP ***********************************************************************/ namespace vl { namespace workflow { namespace emitter { using namespace reflection::description; using namespace analyzer; using namespace runtime; /*********************************************************************** WfAttributeEvaluator ***********************************************************************/ WfAttributeEvaluator::WfAttributeEvaluator(analyzer::WfLexicalScopeManager* _manager) :manager(_manager) { } Ptr WfAttributeEvaluator::GetAttribute(collections::List>& atts, const WString& category, const WString& name) { return From(GetAttributes(atts, category, name)).First(nullptr); } collections::LazyList> WfAttributeEvaluator::GetAttributes(collections::List>& atts, const WString& category, const WString& name) { return From(atts) .Where([=](Ptr att) { return att->category.value == category && att->name.value == name; }); } runtime::WfRuntimeValue WfAttributeEvaluator::GetAttributeValue(Ptr att) { if (!att->value) { return {}; } { vint index = attributeValues.Keys().IndexOf(att.Obj()); if (index != -1) { return attributeValues.Values()[index]; } } auto attributeAssembly = Ptr(new WfAssembly); WfCodegenContext context(attributeAssembly, manager); auto typeInfo = manager->attributes[{att->category.value, att->name.value}]; GenerateExpressionInstructions(context, att->value, typeInfo); CHECK_ERROR(attributeAssembly->instructions.Count() == 1, L"WfAttributeEvaluator::GetAttributeValue(Ptr)#Internal error, attribute argument generates unexpected instructions."); auto& ins = attributeAssembly->instructions[0]; CHECK_ERROR(ins.code == WfInsCode::LoadValue, L"WfAttributeEvaluator::GetAttributeValue(Ptr)#Internal error, attribute argument generates unexpected instructions."); attributeValues.Add(att, ins.valueParameter); return ins.valueParameter; } /*********************************************************************** WfCodegenFunctionContext ***********************************************************************/ WfCodegenFunctionContext::WfCodegenFunctionContext() { scopeContextStack.Add(Ptr(new WfCodegenScopeContext)); } Ptr WfCodegenFunctionContext::GetCurrentScopeContext() { return scopeContextStack[scopeContextStack.Count() - 1]; } Ptr WfCodegenFunctionContext::GetCurrentScopeContext(WfCodegenScopeType type, const WString& name) { for (vint i = scopeContextStack.Count() - 1; i >= 0; i--) { auto context = scopeContextStack[i]; if (context->type == type) { if (name == L"" || context->name == name) { return context; } } } return 0; } Ptr WfCodegenFunctionContext::PushScopeContext(WfCodegenScopeType type, const WString& name) { auto context = Ptr(new WfCodegenScopeContext); context->type = type; context->name = name; scopeContextStack.Add(context); return context; } void WfCodegenFunctionContext::PopScopeContext() { scopeContextStack.RemoveAt(scopeContextStack.Count() - 1); } /*********************************************************************** WfCodegenContext ***********************************************************************/ WfCodegenContext::WfCodegenContext(Ptr _assembly, analyzer::WfLexicalScopeManager* _manager) :assembly(_assembly) , manager(_manager) { } vint WfCodegenContext::AddInstruction(glr::ParsingAstBase* node, const runtime::WfInstruction& ins) { auto index = assembly->instructions.Add(ins); if (assembly->insBeforeCodegen && assembly->insAfterCodegen) { if (node) { assembly->insBeforeCodegen->instructionCodeMapping.Add(nodePositionsBeforeCodegen[node]); assembly->insAfterCodegen->instructionCodeMapping.Add(nodePositionsAfterCodegen[node]); } else { glr::ParsingTextRange range; assembly->insBeforeCodegen->instructionCodeMapping.Add(range); assembly->insAfterCodegen->instructionCodeMapping.Add(range); } } return index; } void WfCodegenContext::AddExitInstruction(glr::ParsingAstBase* node, const runtime::WfInstruction& ins) { auto context = functionContext->GetCurrentScopeContext(); context->exitInstructions.Add(ins); context->instructionCodeMappingBeforeCodegen.Add(nodePositionsBeforeCodegen[node]); context->instructionCodeMappingAfterCodegen.Add(nodePositionsAfterCodegen[node]); } void WfCodegenContext::ApplyExitInstructions(Ptr scopeContext) { if (scopeContext->exitInstructions.Count() > 0) { CopyFrom(assembly->instructions, scopeContext->exitInstructions, true); CopyFrom(assembly->insBeforeCodegen->instructionCodeMapping, scopeContext->instructionCodeMappingBeforeCodegen, true); CopyFrom(assembly->insAfterCodegen->instructionCodeMapping, scopeContext->instructionCodeMappingAfterCodegen, true); } } vint WfCodegenContext::GetThisStackCount(analyzer::WfLexicalScope* scope) { vint count = 0; Ptr firstConfig, methodConfig; while (scope) { if (scope->typeOfThisExpr) { if (methodConfig) { count++; if (!methodConfig->parentThisAccessable) { break; } methodConfig = nullptr; } } if (scope->functionConfig) { if (!firstConfig) { vint index = thisStackCounts.Keys().IndexOf(scope->functionConfig.Obj()); if (index == -1) { firstConfig = scope->functionConfig; } else { return thisStackCounts.Values()[index]; } } if (scope->functionConfig->thisAccessable) { methodConfig = scope->functionConfig; } } scope = scope->parentScope.Obj(); } if (firstConfig) { thisStackCounts.Add(firstConfig, count); } return count; } } } } /*********************************************************************** .\EMITTER\WFEMITTER_ASSEMBLY.CPP ***********************************************************************/ namespace vl { namespace workflow { namespace emitter { using namespace glr; using namespace reflection::description; using namespace analyzer; using namespace runtime; using namespace typeimpl; typedef WfInstruction Ins; #define INSTRUCTION(X) context.AddInstruction(node, X) #define FILL_LABEL_TO_INS(LABEL, INS) context.assembly->instructions[LABEL].indexParameter = INS #define FILL_LABEL_TO_CURRENT(LABEL) FILL_LABEL_TO_INS(LABEL, context.assembly->instructions.Count()) /*********************************************************************** GenerateTypeCastInstructions ***********************************************************************/ void GenerateTypeCastInstructions(WfCodegenContext& context, Ptr expectedType, bool strongCast, WfExpression* node) { if (expectedType->GetTypeDescriptor() != GetTypeDescriptor()) { vint fillElseIndex = -1; vint fillEndIndex = -1; if (expectedType->GetDecorator() == ITypeInfo::Nullable) { INSTRUCTION(Ins::Duplicate(0)); INSTRUCTION(Ins::LoadValue({})); INSTRUCTION(Ins::CompareReference()); fillElseIndex = INSTRUCTION(Ins::JumpIf(-1)); } if (strongCast) { switch (expectedType->GetDecorator()) { case ITypeInfo::RawPtr: INSTRUCTION(Ins::ConvertToType(Value::RawPtr, expectedType->GetTypeDescriptor())); break; case ITypeInfo::SharedPtr: INSTRUCTION(Ins::ConvertToType(Value::SharedPtr, expectedType->GetTypeDescriptor())); break; case ITypeInfo::Nullable: case ITypeInfo::TypeDescriptor: case ITypeInfo::Generic: INSTRUCTION(Ins::ConvertToType(Value::BoxedValue, expectedType->GetTypeDescriptor())); break; } } else { switch (expectedType->GetDecorator()) { case ITypeInfo::RawPtr: INSTRUCTION(Ins::TryConvertToType(Value::RawPtr, expectedType->GetTypeDescriptor())); break; case ITypeInfo::SharedPtr: INSTRUCTION(Ins::TryConvertToType(Value::SharedPtr, expectedType->GetTypeDescriptor())); break; case ITypeInfo::Nullable: case ITypeInfo::TypeDescriptor: case ITypeInfo::Generic: INSTRUCTION(Ins::TryConvertToType(Value::BoxedValue, expectedType->GetTypeDescriptor())); break; } } if (fillElseIndex != -1) { fillEndIndex = INSTRUCTION(Ins::Jump(-1)); FILL_LABEL_TO_CURRENT(fillElseIndex); INSTRUCTION(Ins::LoadValue({})); FILL_LABEL_TO_CURRENT(fillEndIndex); } } } /*********************************************************************** GetInstructionTypeArgument ***********************************************************************/ void GenerateTypeTestingInstructions(WfCodegenContext& context, Ptr expectedType, WfExpression* node) { if (expectedType->GetTypeDescriptor() != GetTypeDescriptor()) { switch (expectedType->GetDecorator()) { case ITypeInfo::RawPtr: INSTRUCTION(Ins::TestType(Value::RawPtr, expectedType->GetTypeDescriptor())); break; case ITypeInfo::SharedPtr: INSTRUCTION(Ins::TestType(Value::SharedPtr, expectedType->GetTypeDescriptor())); break; case ITypeInfo::Nullable: case ITypeInfo::TypeDescriptor: case ITypeInfo::Generic: INSTRUCTION(Ins::TestType(Value::BoxedValue, expectedType->GetTypeDescriptor())); break; } } else { INSTRUCTION(Ins::Pop()); INSTRUCTION(Ins::LoadValue({ true })); } } /*********************************************************************** GetInstructionTypeArgument ***********************************************************************/ runtime::WfInsType GetInstructionTypeArgument(Ptr expectedType) { auto td = expectedType->GetTypeDescriptor(); if (td == GetTypeDescriptor()) return WfInsType::Bool; if (td == GetTypeDescriptor()) return WfInsType::I1; if (td == GetTypeDescriptor()) return WfInsType::I2; if (td == GetTypeDescriptor()) return WfInsType::I4; if (td == GetTypeDescriptor()) return WfInsType::I8; if (td == GetTypeDescriptor()) return WfInsType::U1; if (td == GetTypeDescriptor()) return WfInsType::U2; if (td == GetTypeDescriptor()) return WfInsType::U4; if (td == GetTypeDescriptor()) return WfInsType::U8; if (td == GetTypeDescriptor()) return WfInsType::F4; if (td == GetTypeDescriptor()) return WfInsType::F8; if (td == GetTypeDescriptor()) return WfInsType::String; return WfInsType::Unknown; } /*********************************************************************** GenerateAssembly ***********************************************************************/ #define EXECUTE_CALLBACK(EXPR) if (callback) callback->EXPR Ptr GenerateAssembly(analyzer::WfLexicalScopeManager* manager, IWfCompilerCallback* callback) { EXECUTE_CALLBACK(OnGenerateMetadata()); auto assembly = Ptr(new WfAssembly); assembly->insBeforeCodegen = Ptr(new WfInstructionDebugInfo); assembly->insAfterCodegen = Ptr(new WfInstructionDebugInfo); WfCodegenContext context(assembly, manager); for (auto [module, index] : indexed(manager->GetModules())) { auto codeBeforeCodegen = manager->GetModuleCodes()[index]; auto recorderBefore = Ptr(new ParsingGeneratedLocationRecorder(context.nodePositionsBeforeCodegen)); auto recorderAfter = Ptr(new ParsingGeneratedLocationRecorder(context.nodePositionsAfterCodegen)); auto recorderOriginal = Ptr(new ParsingOriginalLocationRecorder(recorderBefore)); auto recorderMultiple = Ptr(new ParsingMultiplePrintNodeRecorder); recorderMultiple->AddRecorder(recorderOriginal); recorderMultiple->AddRecorder(recorderAfter); stream::MemoryStream memoryStream; { stream::StreamWriter streamWriter(memoryStream); ParsingWriter parsingWriter(streamWriter, recorderMultiple, index); WfPrint(module, L"", parsingWriter); } memoryStream.SeekFromBegin(0); auto codeAfterCodegen = stream::StreamReader(memoryStream).ReadToEnd(); assembly->insBeforeCodegen->moduleCodes.Add(codeBeforeCodegen); assembly->insAfterCodegen->moduleCodes.Add(codeAfterCodegen); } if (manager->declarationTypes.Count() > 0) { assembly->typeImpl = Ptr(new WfTypeImpl); for (auto td : manager->declarationTypes.Values()) { if (auto tdClass = td.Cast()) { assembly->typeImpl->classes.Add(tdClass); } else if (auto tdInterface = td.Cast()) { assembly->typeImpl->interfaces.Add(tdInterface); } else if (auto tdStruct = td.Cast()) { assembly->typeImpl->structs.Add(tdStruct); } else if (auto tdEnum = td.Cast()) { assembly->typeImpl->enums.Add(tdEnum); } } } for (auto module : manager->GetModules()) { for (auto decl : module->declarations) { GenerateGlobalDeclarationMetadata(context, decl.Obj()); } } { auto meta = Ptr(new WfAssemblyFunction); meta->name = L""; vint functionIndex = assembly->functions.Add(meta); assembly->functionByName.Add(meta->name, functionIndex); auto functionContext = Ptr(new WfCodegenFunctionContext); functionContext->function = meta; context.functionContext = functionContext; meta->firstInstruction = assembly->instructions.Count(); for (auto module : manager->GetModules()) { for (auto decl : module->declarations) { GenerateInitializeInstructions(context, decl); } } // define node for INSTRUCTION glr::ParsingAstBase* node = nullptr; INSTRUCTION(Ins::LoadValue({})); INSTRUCTION(Ins::Return()); meta->lastInstruction = assembly->instructions.Count() - 1; context.functionContext = 0; GenerateClosureInstructions(context, functionContext); } for (auto module : manager->GetModules()) { EXECUTE_CALLBACK(OnGenerateCode(module)); for (auto decl : module->declarations) { GenerateDeclarationInstructions(context, decl.Obj()); } } EXECUTE_CALLBACK(OnGenerateDebugInfo()); assembly->Initialize(); return assembly; } #undef EXECUTE_CALLBACK #undef FILL_LABEL_TO_CURRENT #undef FILL_LABEL_TO_INS #undef INSTRUCTION /*********************************************************************** Compile ***********************************************************************/ Ptr Compile(analyzer::WfLexicalScopeManager* manager, collections::List& moduleCodes, collections::List& errors) { manager->Clear(true, true); for (auto code : moduleCodes) { manager->AddModule(code); } if (manager->errors.Count() > 0) { CopyFrom(errors, manager->errors); return 0; } manager->Rebuild(true); if (manager->errors.Count() > 0) { CopyFrom(errors, manager->errors); return 0; } return GenerateAssembly(manager); } Ptr Compile(workflow::Parser& workflowParser, analyzer::WfCpuArchitecture cpuArchitecture, collections::List& moduleCodes, collections::List& errors) { WfLexicalScopeManager manager(workflowParser, cpuArchitecture); return Compile(&manager, moduleCodes, errors); } } } } /*********************************************************************** .\EMITTER\WFEMITTER_DECLARATION.CPP ***********************************************************************/ namespace vl { namespace workflow { namespace emitter { using namespace collections; using namespace reflection::description; using namespace analyzer; using namespace runtime; using namespace typeimpl; typedef WfInstruction Ins; #define INSTRUCTION(X) context.AddInstruction(node, X) /*********************************************************************** GenerateInstructions(Initialize) ***********************************************************************/ class GenerateInitializeInstructionsVisitor : public Object, public WfDeclaration::IVisitor { public: WfCodegenContext& context; GenerateInitializeInstructionsVisitor(WfCodegenContext& _context) :context(_context) { } void Visit(WfNamespaceDeclaration* node)override { for (auto decl : node->declarations) { GenerateInitializeInstructions(context, decl); } } void Visit(WfFunctionDeclaration* node)override { } void Visit(WfVariableDeclaration* node)override { auto scope = context.manager->nodeScopes[node].Obj(); auto symbol = scope->symbols[node->name.value][0]; vint variableIndex = context.globalVariables[symbol.Obj()]; GenerateExpressionInstructions(context, node->expression); INSTRUCTION(Ins::StoreGlobalVar(variableIndex)); } void Visit(WfEventDeclaration* node)override { } void Visit(WfPropertyDeclaration* node)override { } void Visit(WfStaticInitDeclaration* node)override { GenerateStatementInstructions(context, node->statement); } void Visit(WfConstructorDeclaration* node)override { } void Visit(WfDestructorDeclaration* node)override { } void Visit(WfClassDeclaration* node)override { } void Visit(WfEnumDeclaration* node)override { } void Visit(WfStructDeclaration* node)override { } void Visit(WfVirtualCfeDeclaration* node)override { for (auto decl : node->expandedDeclarations) { decl->Accept(this); } } void Visit(WfVirtualCseDeclaration* node)override { for (auto decl : node->expandedDeclarations) { decl->Accept(this); } } }; void GenerateInitializeInstructions(WfCodegenContext& context, Ptr declaration) { GenerateInitializeInstructionsVisitor visitor(context); declaration->Accept(&visitor); } /*********************************************************************** GenerateInstructions(Declaration) ***********************************************************************/ Ptr GenerateFunctionInstructions_Prolog(WfCodegenContext& context, WfLexicalScope* scope, Ptr meta, Ptr returnType, Ptr recursiveLambdaSymbol, const List>& argumentSymbols, const List>& capturedSymbols, glr::ParsingAstBase* node) { auto functionContext = Ptr(new WfCodegenFunctionContext); functionContext->function = meta; context.functionContext = functionContext; { for (auto [argumentSymbol, index] : indexed(argumentSymbols)) { functionContext->arguments.Add(argumentSymbol.Obj(), index); } for (auto [capturedSymbol, index] : indexed(capturedSymbols)) { functionContext->capturedVariables.Add(capturedSymbol.Obj(), index); } } if (recursiveLambdaSymbol) { vint variableIndex = meta->argumentNames.Count() + meta->localVariableNames.Add(L"" + recursiveLambdaSymbol->name); functionContext->localVariables.Add(recursiveLambdaSymbol.Obj(), variableIndex); } meta->firstInstruction = context.assembly->instructions.Count(); if (recursiveLambdaSymbol) { INSTRUCTION(Ins::LoadClosureContext()); INSTRUCTION(Ins::LoadFunction(context.assembly->functions.IndexOf(meta.Obj()))); INSTRUCTION(Ins::CreateClosure()); INSTRUCTION(Ins::StoreLocalVar(functionContext->localVariables[recursiveLambdaSymbol.Obj()])); } return functionContext; } void GenerateFunctionInstructions_Epilog(WfCodegenContext& context, WfLexicalScope* scope, Ptr meta, Ptr returnType, Ptr recursiveLambdaSymbol, const List>& argumentSymbols, const List>& capturedSymbols, Ptr functionContext, glr::ParsingAstBase* node) { INSTRUCTION(Ins::LoadValue({})); INSTRUCTION(Ins::Return()); meta->lastInstruction = context.assembly->instructions.Count() - 1; context.functionContext = 0; GenerateClosureInstructions(context, functionContext); } void GenerateFunctionInstructions(WfCodegenContext& context, WfLexicalScope* scope, Ptr meta, Ptr returnType, Ptr recursiveLambdaSymbol, const List>& argumentSymbols, const List>& capturedSymbols, Ptr statementBody, glr::ParsingAstBase* node) { auto functionContext = GenerateFunctionInstructions_Prolog(context, scope, meta, returnType, recursiveLambdaSymbol, argumentSymbols, capturedSymbols, node); GenerateStatementInstructions(context, statementBody); GenerateFunctionInstructions_Epilog(context, scope, meta, returnType, recursiveLambdaSymbol, argumentSymbols, capturedSymbols, functionContext, node); } void GenerateFunctionInstructions(WfCodegenContext& context, WfLexicalScope* scope, Ptr meta, Ptr returnType, Ptr recursiveLambdaSymbol, const List>& argumentSymbols, const List>& capturedSymbols, Ptr expressionBody, glr::ParsingAstBase* node) { auto functionContext = GenerateFunctionInstructions_Prolog(context, scope, meta, returnType, recursiveLambdaSymbol, argumentSymbols, capturedSymbols, node); GenerateExpressionInstructions(context, expressionBody); INSTRUCTION(Ins::Return()); GenerateFunctionInstructions_Epilog(context, scope, meta, returnType, recursiveLambdaSymbol, argumentSymbols, capturedSymbols, functionContext, node); } void GenerateFunctionDeclarationInstructions(WfCodegenContext& context, WfFunctionDeclaration* node, WfLexicalScope* scope, Ptr meta, Ptr recursiveLambdaSymbol) { List> argumentSymbols, capturedSymbols; { for (auto argument : node->arguments) { auto symbol = scope->symbols[argument->name.value][0]; argumentSymbols.Add(symbol); } vint index = context.manager->lambdaCaptures.Keys().IndexOf(node); if (index != -1) { auto capture = context.manager->lambdaCaptures.Values()[index]; for (auto symbol : capture->symbols) { capturedSymbols.Add(symbol); } } } auto returnType = CreateTypeInfoFromType(scope, node->returnType); GenerateFunctionInstructions(context, scope, meta, returnType, recursiveLambdaSymbol, argumentSymbols, capturedSymbols, node->statement, node); } class GenerateClassMemberInstructionsVisitor : public Object, public WfDeclaration::IVisitor { public: WfCodegenContext& context; WfClassDeclaration* classDecl; GenerateClassMemberInstructionsVisitor(WfCodegenContext& _context, WfClassDeclaration* _classDecl) :context(_context) , classDecl(_classDecl) { } void Visit(WfNamespaceDeclaration* node)override { } void Visit(WfFunctionDeclaration* node)override { if (node->functionKind == WfFunctionKind::Static) { GenerateDeclarationInstructions(context, node); } else if (classDecl->kind == WfClassKind::Class) { GenerateDeclarationInstructions(context, node); } } void Visit(WfVariableDeclaration* node)override { } void Visit(WfEventDeclaration* node)override { } void Visit(WfPropertyDeclaration* node)override { } void Visit(WfStaticInitDeclaration* node)override { } class InitializeFieldVisitor : public empty_visitor::DeclarationVisitor { public: WfCodegenContext& context; InitializeFieldVisitor(WfCodegenContext& _context) :context(_context) { } void Dispatch(WfVirtualCfeDeclaration* node)override { for (auto decl : node->expandedDeclarations) { decl->Accept(this); } } void Dispatch(WfVirtualCseDeclaration* node)override { for (auto decl : node->expandedDeclarations) { decl->Accept(this); } } void Visit(WfVariableDeclaration* node)override { auto info = context.manager->declarationMemberInfos[node].Cast().Obj(); GenerateExpressionInstructions(context, node->expression); INSTRUCTION(Ins::LoadCapturedVar(0)); INSTRUCTION(Ins::SetProperty(info)); } }; void Visit(WfConstructorDeclaration* node)override { auto meta = context.assembly->functions[context.constructors[node]]; auto functionContext = Ptr(new WfCodegenFunctionContext); functionContext->function = meta; context.functionContext = functionContext; meta->firstInstruction = context.assembly->instructions.Count(); auto scope = context.manager->nodeScopes[node].Obj(); { for (auto [argument, index] : indexed(node->arguments)) { auto symbol = scope->symbols[argument->name.value][0]; functionContext->arguments.Add(symbol.Obj(), index); } } if (classDecl->baseTypes.Count() > 0) { auto td = scope->parentScope->typeOfThisExpr; vint count = td->GetBaseTypeDescriptorCount(); for (vint i = 0; i < count; i++) { auto baseTd = td->GetBaseTypeDescriptor(i); auto ctor = context.manager->baseConstructorCallResolvings[{node, baseTd}]; if (ctor.key) { for (auto argument : ctor.key->arguments) { GenerateExpressionInstructions(context, argument); } INSTRUCTION(Ins::LoadCapturedVar(0)); INSTRUCTION(Ins::InvokeBaseCtor(ctor.value, ctor.key->arguments.Count())); } else { INSTRUCTION(Ins::LoadCapturedVar(0)); INSTRUCTION(Ins::InvokeBaseCtor(ctor.value, 0)); } INSTRUCTION(Ins::Pop()); } } { InitializeFieldVisitor visitor(context); for (auto memberDecl : classDecl->declarations) { memberDecl->Accept(&visitor); } } GenerateStatementInstructions(context, node->statement); INSTRUCTION(Ins::LoadValue({})); INSTRUCTION(Ins::Return()); meta->lastInstruction = context.assembly->instructions.Count() - 1; context.functionContext = 0; GenerateClosureInstructions(context, functionContext); } void Visit(WfDestructorDeclaration* node)override { auto meta = context.assembly->functions[context.destructors[node]]; auto functionContext = Ptr(new WfCodegenFunctionContext); functionContext->function = meta; context.functionContext = functionContext; meta->firstInstruction = context.assembly->instructions.Count(); auto scope = context.manager->nodeScopes[node].Obj(); GenerateStatementInstructions(context, node->statement); INSTRUCTION(Ins::LoadValue({})); INSTRUCTION(Ins::Return()); meta->lastInstruction = context.assembly->instructions.Count() - 1; context.functionContext = 0; GenerateClosureInstructions(context, functionContext); } void Visit(WfClassDeclaration* node)override { GenerateDeclarationInstructions(context, node); } void Visit(WfEnumDeclaration* node)override { } void Visit(WfStructDeclaration* node)override { } void Visit(WfVirtualCfeDeclaration* node)override { for (auto decl : node->expandedDeclarations) { decl->Accept(this); } } void Visit(WfVirtualCseDeclaration* node)override { for (auto decl : node->expandedDeclarations) { decl->Accept(this); } } }; class GenerateDeclarationInstructionsVisitor : public Object, public WfDeclaration::IVisitor { public: WfCodegenContext& context; GenerateDeclarationInstructionsVisitor(WfCodegenContext& _context) :context(_context) { } void Visit(WfNamespaceDeclaration* node)override { for (auto decl : node->declarations) { GenerateDeclarationInstructions(context, decl.Obj()); } } void Visit(WfFunctionDeclaration* node)override { auto scope = context.manager->nodeScopes[node].Obj(); auto symbol = context.manager->GetDeclarationSymbol(scope, node); auto meta = context.assembly->functions[context.globalFunctions[symbol.Obj()]]; GenerateFunctionDeclarationInstructions(context, node, scope, meta, 0); } void Visit(WfVariableDeclaration* node)override { } void Visit(WfEventDeclaration* node)override { } void Visit(WfPropertyDeclaration* node)override { } void Visit(WfStaticInitDeclaration* node)override { } void Visit(WfConstructorDeclaration* node)override { } void Visit(WfDestructorDeclaration* node)override { } void Visit(WfClassDeclaration* node)override { for (auto memberDecl : node->declarations) { GenerateClassMemberInstructionsVisitor visitor(context, node); memberDecl->Accept(&visitor); } } void Visit(WfEnumDeclaration* node)override { } void Visit(WfStructDeclaration* node)override { } void Visit(WfVirtualCfeDeclaration* node)override { for (auto decl : node->expandedDeclarations) { decl->Accept(this); } } void Visit(WfVirtualCseDeclaration* node)override { for (auto decl : node->expandedDeclarations) { decl->Accept(this); } } }; void GenerateDeclarationInstructions(WfCodegenContext& context, WfDeclaration* declaration) { GenerateDeclarationInstructionsVisitor visitor(context); declaration->Accept(&visitor); } /*********************************************************************** GenerateInstructions(Closure) ***********************************************************************/ void GenerateClosureInstructions_Function(WfCodegenContext& context, vint functionIndex, WfFunctionDeclaration* node, bool createInterface) { auto scope = context.manager->nodeScopes[node].Obj(); auto meta = context.assembly->functions[functionIndex]; GenerateFunctionDeclarationMetadata(context, node, meta); Ptr recursiveLambdaSymbol; if (!createInterface && node->name.value != L"") { recursiveLambdaSymbol = scope->symbols[node->name.value][0]; } GenerateFunctionDeclarationInstructions(context, node, scope, meta, recursiveLambdaSymbol); } void GenerateClosureInstructions_Ordered(WfCodegenContext& context, vint functionIndex, WfOrderedLambdaExpression* node) { auto scope = context.manager->nodeScopes[node].Obj(); List> argumentSymbols, capturedSymbols; CopyFrom( argumentSymbols, Range(0, scope->symbols.Count()) .Select([scope](vint index)->Ptr{return scope->symbols.GetByIndex(index)[0];}) .OrderBy([](Ptr a, Ptr b) { vint aId = wtoi(a->name.Sub(1, a->name.Length() - 1)); vint bId = wtoi(b->name.Sub(1, a->name.Length() - 1)); return aId <=> bId; }) ); auto meta = context.assembly->functions[functionIndex]; for (auto symbol : argumentSymbols) { meta->argumentNames.Add(symbol->name); } { auto capture = context.manager->lambdaCaptures.Get(node); for (auto symbol : capture->symbols) { meta->capturedVariableNames.Add(L"" + symbol->name); capturedSymbols.Add(symbol); } vint count = context.GetThisStackCount(scope); for (vint i = 0; i < count; i++) { meta->capturedVariableNames.Add(L"" + itow(i)); } } auto result = context.manager->expressionResolvings[node]; auto returnType = CopyTypeInfo(result.type->GetElementType()->GetGenericArgument(0)); GenerateFunctionInstructions(context, scope, meta, returnType, 0, argumentSymbols, capturedSymbols, node->body, node); } void GenerateClosureInstructions(WfCodegenContext& context, Ptr functionContext) { for (vint i = 0; i < functionContext->closuresToCodegen.Count(); i++) { vint functionIndex = functionContext->closuresToCodegen.Keys()[i]; auto closure = functionContext->closuresToCodegen.Values()[i]; if (closure.functionExpression) { GenerateClosureInstructions_Function(context, functionIndex, closure.functionExpression->function.Obj(), false); } else if (closure.orderedLambdaExpression) { GenerateClosureInstructions_Ordered(context, functionIndex, closure.orderedLambdaExpression); } else if (closure.functionDeclaration) { GenerateClosureInstructions_Function(context, functionIndex, closure.functionDeclaration, true); } } } #undef INSTRUCTION } } } /*********************************************************************** .\EMITTER\WFEMITTER_EXPRESSION.CPP ***********************************************************************/ namespace vl { namespace workflow { namespace emitter { using namespace collections; using namespace reflection; using namespace reflection::description; using namespace analyzer; using namespace runtime; typedef WfInstruction Ins; #define INSTRUCTION(X) context.AddInstruction(node, X) #define FILL_LABEL_TO_INS(LABEL, INS) context.assembly->instructions[LABEL].indexParameter = INS #define FILL_LABEL_TO_CURRENT(LABEL) FILL_LABEL_TO_INS(LABEL, context.assembly->instructions.Count()) /*********************************************************************** GenerateInstructions(Expression) ***********************************************************************/ class GenerateExpressionInstructionsVisitor : public Object , public WfExpression::IVisitor { public: WfCodegenContext& context; GenerateExpressionInstructionsVisitor(WfCodegenContext& _context) :context(_context) { } static void GenerateLoadSymbolInstructions(WfCodegenContext& context, WfLexicalSymbol* symbol, glr::ParsingAstBase* node) { vint index = -1; if ((index = context.globalFunctions.Keys().IndexOf(symbol)) != -1) { vint functionIndex = context.globalFunctions.Values()[index]; INSTRUCTION(Ins::CreateClosureContext(0)); INSTRUCTION(Ins::LoadFunction(functionIndex)); INSTRUCTION(Ins::CreateClosure()); } else if ((index = context.globalVariables.Keys().IndexOf(symbol)) != -1) { vint variableIndex = context.globalVariables.Values()[index]; INSTRUCTION(Ins::LoadGlobalVar(variableIndex)); } else if ((index = context.functionContext->capturedVariables.Keys().IndexOf(symbol)) != -1) { vint variableIndex = context.functionContext->capturedVariables.Values()[index]; INSTRUCTION(Ins::LoadCapturedVar(variableIndex)); } else if ((index = context.functionContext->localVariables.Keys().IndexOf(symbol)) != -1) { vint variableIndex = context.functionContext->localVariables.Values()[index]; INSTRUCTION(Ins::LoadLocalVar(variableIndex)); } else if ((index = context.functionContext->arguments.Keys().IndexOf(symbol)) != -1) { vint variableIndex = context.functionContext->arguments.Values()[index]; INSTRUCTION(Ins::LoadLocalVar(variableIndex)); } else if ((index = context.closureFunctions.Keys().IndexOf(symbol)) != -1) { vint functionIndex = context.closureFunctions.Values()[index]; INSTRUCTION(Ins::LoadClosureContext()); INSTRUCTION(Ins::LoadFunction(functionIndex)); INSTRUCTION(Ins::CreateClosure()); } else { CHECK_FAIL(L"GenerateExpressionInstructionsVisitor::GenerateLoadSymbolInstructions(WfCodegenContext&, WfLexicalSymbol*, ParsingTreeCustomBase*)#Internal error, cannot find any record of this symbol."); } } static vint PushCapturedThisValues(WfCodegenContext& context, WfLexicalScope* lambdaScopeParent, glr::ParsingAstBase* node) { auto scope = lambdaScopeParent; while (scope) { if (scope->functionConfig) { vint parentThisCount = context.GetThisStackCount(scope); if (scope->functionConfig->lambda) { auto capture = context.manager->lambdaCaptures[scope->ownerNode.Obj()]; vint captureCount = capture->symbols.Count(); for (vint i = 0; i < parentThisCount; i++) { INSTRUCTION(Ins::LoadCapturedVar(captureCount + i)); } } else if (parentThisCount > 0) { CHECK_ERROR(parentThisCount == 1, L"GenerateExpressionInstructionsVisitor::PushCapturedThisValues(WfCodegenContext&, WfLexicalScope*, ParsingTreeCustomBase*)#Internal error, wrong parentThisCount value."); INSTRUCTION(Ins::LoadCapturedVar(0)); } return parentThisCount; } scope = scope->parentScope.Obj(); } return 0; } static vint AddClosure(WfCodegenContext& context, WfCodegenLambdaContext lc, const Func& getName) { auto meta = Ptr(new WfAssemblyFunction); vint functionIndex = context.assembly->functions.Add(meta); meta->name = getName(functionIndex); context.assembly->functionByName.Add(meta->name, functionIndex); context.functionContext->closuresToCodegen.Add(functionIndex, lc); return functionIndex; } void VisitReferenceExpression(WfExpression* node, const WString& name) { auto result = context.manager->expressionResolvings[node]; if (result.symbol) { GenerateLoadSymbolInstructions(context, result.symbol.Obj(), node); } else if (result.methodInfo) { if (result.methodInfo->IsStatic()) { INSTRUCTION(Ins::LoadValue({})); } else { VisitThisExpression(node, result.methodInfo->GetOwnerTypeDescriptor()); } INSTRUCTION(Ins::LoadMethodClosure(result.methodInfo)); } else if (result.propertyInfo) { if (auto getter = result.propertyInfo->GetGetter()) { VisitThisExpression(node, getter->GetOwnerTypeDescriptor()); INSTRUCTION(Ins::InvokeMethod(getter, 0)); } else { VisitThisExpression(node, result.propertyInfo->GetOwnerTypeDescriptor()); INSTRUCTION(Ins::GetProperty(result.propertyInfo)); } } else { if ((result.type->GetTypeDescriptor()->GetTypeDescriptorFlags() & TypeDescriptorFlags::EnumType) != TypeDescriptorFlags::Undefined) { auto td = result.type->GetTypeDescriptor(); auto enumType = td->GetEnumType(); vint index = enumType->IndexOfItem(name); if (index != -1) { auto intValue = enumType->GetItemValue(index); INSTRUCTION(Ins::LoadValue({ intValue, td })); return; } } CHECK_FAIL(L"GenerateExpressionInstructionsVisitor::VisitReferenceExpression(WfExpression*, const WString&)#Internal error, cannot find any record of this expression."); } } void VisitThisExpression(WfExpression* node, ITypeDescriptor* td) { auto scope = context.manager->nodeScopes[node].Obj(); vint count = context.GetThisStackCount(scope); vint offset = 0; Ptr capture; Ptr lastConfig; while (scope) { if (scope->typeOfThisExpr) { if (scope->typeOfThisExpr->CanConvertTo(td)) { if (capture) { INSTRUCTION(Ins::LoadCapturedVar(capture->symbols.Count() + count - offset - 1)); } else { INSTRUCTION(Ins::LoadCapturedVar(0)); } return; } else { offset++; } if (lastConfig) { if (!lastConfig->parentThisAccessable) { break; } } } if (scope->functionConfig) { lastConfig = scope->functionConfig; if (!capture) { vint index = context.manager->lambdaCaptures.Keys().IndexOf(scope->ownerNode.Obj()); if (index != -1) { capture = context.manager->lambdaCaptures.Values()[index]; } } } scope = scope->parentScope.Obj(); } CHECK_FAIL(L"GenerateExpressionInstructionsVisitor::VisitThisExpression(WfExpression*, ITypeDescriptor*)#Internal error, cannot find any record of the this value."); } void Visit(WfThisExpression* node)override { auto scope = context.manager->nodeScopes[node].Obj(); while (scope) { if (scope->functionConfig) { if (scope->functionConfig->thisAccessable) { if (scope->functionConfig->lambda) { auto capture = context.manager->lambdaCaptures[scope->ownerNode.Obj()]; auto count = context.GetThisStackCount(scope); INSTRUCTION(Ins::LoadCapturedVar(capture->symbols.Count() + count - 1)); } else { INSTRUCTION(Ins::LoadCapturedVar(0)); } return; } CHECK_FAIL(L"GenerateExpressionInstructionsVisitor::Visit(WfThisExpression*)#Internal error, this expression is illegal here."); } scope = scope->parentScope.Obj(); } CHECK_FAIL(L"GenerateExpressionInstructionsVisitor::Visit(WfThisExpression*)#Internal error, this expression is illegal here."); } void Visit(WfTopQualifiedExpression* node)override { VisitReferenceExpression(node, node->name.value); } void Visit(WfReferenceExpression* node)override { VisitReferenceExpression(node, node->name.value); } void Visit(WfOrderedNameExpression* node)override { VisitReferenceExpression(node, node->name.value); } void Visit(WfOrderedLambdaExpression* node)override { auto scope = context.manager->nodeScopes[node].Obj(); WfCodegenLambdaContext lc; lc.orderedLambdaExpression = node; auto functionIndex = AddClosure(context, lc, [=, this](vint index) { return L" in " + context.functionContext->function->name; }); auto capture = context.manager->lambdaCaptures.Get(node); for (auto symbol : capture->symbols) { GenerateLoadSymbolInstructions(context, symbol.Obj(), node); } vint thisCount = PushCapturedThisValues(context, scope->parentScope.Obj(), node); INSTRUCTION(Ins::CreateClosureContext(capture->symbols.Count() + thisCount)); INSTRUCTION(Ins::LoadFunction(functionIndex)); INSTRUCTION(Ins::CreateClosure()); } void Visit(WfMemberExpression* node)override { auto result = context.manager->expressionResolvings[node]; if (result.propertyInfo) { GenerateExpressionInstructions(context, node->parent); if (result.propertyInfo->GetGetter()) { INSTRUCTION(Ins::InvokeMethod(result.propertyInfo->GetGetter(), 0)); } else { INSTRUCTION(Ins::GetProperty(result.propertyInfo)); } } else { GenerateExpressionInstructions(context, node->parent); INSTRUCTION(Ins::LoadMethodClosure(result.methodInfo)); } } void Visit(WfChildExpression* node)override { VisitReferenceExpression(node, node->name.value); } void Visit(WfLiteralExpression* node)override { switch (node->value) { case WfLiteralValue::Null: INSTRUCTION(Ins::LoadValue({})); break; case WfLiteralValue::True: INSTRUCTION(Ins::LoadValue({ true })); break; case WfLiteralValue::False: INSTRUCTION(Ins::LoadValue({ false })); break; default:; } } #define INSTRUCTION_LOAD_VALUE(TYPE) if (td == description::GetTypeDescriptor()) { INSTRUCTION(Ins::LoadValue({ UnboxValue(output) })); return; } void Visit(WfFloatingExpression* node)override { auto result = context.manager->expressionResolvings[node]; auto td = result.type->GetTypeDescriptor(); Value output; td->GetSerializableType()->Deserialize(node->value.value, output); INSTRUCTION_LOAD_VALUE(float); INSTRUCTION_LOAD_VALUE(double); CHECK_FAIL(L"Unrecognized value in WfFloatingExpression!"); } void Visit(WfIntegerExpression* node)override { auto result = context.manager->expressionResolvings[node]; auto td = result.type->GetTypeDescriptor(); Value output; td->GetSerializableType()->Deserialize(node->value.value, output); INSTRUCTION_LOAD_VALUE(vint8_t); INSTRUCTION_LOAD_VALUE(vint16_t); INSTRUCTION_LOAD_VALUE(vint32_t); INSTRUCTION_LOAD_VALUE(vint64_t); INSTRUCTION_LOAD_VALUE(vuint8_t); INSTRUCTION_LOAD_VALUE(vuint16_t); INSTRUCTION_LOAD_VALUE(vuint32_t); INSTRUCTION_LOAD_VALUE(vuint64_t); INSTRUCTION_LOAD_VALUE(float); INSTRUCTION_LOAD_VALUE(double); CHECK_FAIL(L"Unrecognized value in WfIntegerExpression!"); } #undef INSTRUCTION_LOAD_VALUE void Visit(WfStringExpression* node)override { INSTRUCTION(Ins::LoadValue({ node->value.value })); } void Visit(WfUnaryExpression* node)override { auto type = GenerateExpressionInstructions(context, node->operand); switch (node->op) { case WfUnaryOperator::Not: INSTRUCTION(Ins::OpNot(GetInstructionTypeArgument(type))); break; case WfUnaryOperator::Positive: INSTRUCTION(Ins::OpPositive(GetInstructionTypeArgument(type))); break; case WfUnaryOperator::Negative: INSTRUCTION(Ins::OpNegative(GetInstructionTypeArgument(type))); break; default:; } } void Visit(WfBinaryExpression* node)override { if (node->op == WfBinaryOperator::Assign) { if (auto binary = node->first.Cast()) { auto result = context.manager->expressionResolvings[binary->first.Obj()]; auto containerType = result.expectedType ? result.expectedType : result.type; auto methodInfo = containerType->GetTypeDescriptor()->GetMethodGroupByName(L"Set", true)->GetMethod(0); GenerateExpressionInstructions(context, binary->second); INSTRUCTION(Ins::Duplicate(0)); GenerateExpressionInstructions(context, node->second); GenerateExpressionInstructions(context, binary->first); INSTRUCTION(Ins::InvokeMethod(methodInfo, 2)); INSTRUCTION(Ins::Pop()); } else if (auto member = node->first.Cast()) { auto result = context.manager->expressionResolvings[member.Obj()]; if (auto methodInfo = result.propertyInfo->GetSetter()) { GenerateExpressionInstructions(context, node->second); INSTRUCTION(Ins::Duplicate(0)); GenerateExpressionInstructions(context, member->parent); INSTRUCTION(Ins::InvokeMethod(methodInfo, 1)); INSTRUCTION(Ins::Pop()); } else { GenerateExpressionInstructions(context, node->second); INSTRUCTION(Ins::Duplicate(0)); GenerateExpressionInstructions(context, member->parent); INSTRUCTION(Ins::SetProperty(result.propertyInfo)); } } else { GenerateExpressionInstructions(context, node->second); INSTRUCTION(Ins::Duplicate(0)); auto result = context.manager->expressionResolvings[node->first.Obj()]; vint index = -1; if ((index = context.globalVariables.Keys().IndexOf(result.symbol.Obj())) != -1) { vint variableIndex = context.globalVariables.Values()[index]; INSTRUCTION(Ins::StoreGlobalVar(variableIndex)); } else if ((index = context.functionContext->localVariables.Keys().IndexOf(result.symbol.Obj())) != -1) { vint variableIndex = context.functionContext->localVariables.Values()[index]; INSTRUCTION(Ins::StoreLocalVar(variableIndex)); } else if ((index = context.functionContext->capturedVariables.Keys().IndexOf(result.symbol.Obj())) != -1) { vint variableIndex = context.functionContext->capturedVariables.Values()[index]; INSTRUCTION(Ins::StoreCapturedVar(variableIndex)); } else if (result.propertyInfo) { if (auto setter = result.propertyInfo->GetSetter()) { VisitThisExpression(node, setter->GetOwnerTypeDescriptor()); INSTRUCTION(Ins::InvokeMethod(setter, 1)); INSTRUCTION(Ins::Pop()); } else { VisitThisExpression(node, result.propertyInfo->GetOwnerTypeDescriptor()); INSTRUCTION(Ins::SetProperty(result.propertyInfo)); } } else { CHECK_FAIL(L"GenerateExpressionInstructionsVisitor::Visit(WfBinaryExpression*)#Internal error, cannot find any record of this assignable symbol."); } } } else if (node->op == WfBinaryOperator::Index) { auto result = context.manager->expressionResolvings[node->first.Obj()]; auto containerType = result.expectedType ? result.expectedType : result.type; auto methodInfo = containerType->GetTypeDescriptor()->GetMethodGroupByName(L"Get", true)->GetMethod(0); GenerateExpressionInstructions(context, node->second); GenerateExpressionInstructions(context, node->first); INSTRUCTION(Ins::InvokeMethod(methodInfo, 1)); } else if (node->op == WfBinaryOperator::FlagAnd) { auto type = context.manager->expressionResolvings[node].type; if (type->GetTypeDescriptor() == description::GetTypeDescriptor()) { GenerateExpressionInstructions(context, node->first, type); GenerateExpressionInstructions(context, node->second, type); INSTRUCTION(Ins::OpConcat()); } else { GenerateExpressionInstructions(context, node->first, type); INSTRUCTION(Ins::ConvertToType(Value::BoxedValue, description::GetTypeDescriptor())); GenerateExpressionInstructions(context, node->second, type); INSTRUCTION(Ins::ConvertToType(Value::BoxedValue, description::GetTypeDescriptor())); INSTRUCTION(Ins::OpAnd(WfInsType::U8)); INSTRUCTION(Ins::ConvertToType(Value::BoxedValue, type->GetTypeDescriptor())); } } else if (node->op == WfBinaryOperator::FlagOr) { auto type = context.manager->expressionResolvings[node].type; GenerateExpressionInstructions(context, node->first, type); INSTRUCTION(Ins::ConvertToType(Value::BoxedValue, description::GetTypeDescriptor())); GenerateExpressionInstructions(context, node->second, type); INSTRUCTION(Ins::ConvertToType(Value::BoxedValue, description::GetTypeDescriptor())); INSTRUCTION(Ins::OpOr(WfInsType::U8)); INSTRUCTION(Ins::ConvertToType(Value::BoxedValue, type->GetTypeDescriptor())); } else if (node->op == WfBinaryOperator::FailedThen) { auto result = context.manager->expressionResolvings[node]; vint trapInstruction = INSTRUCTION(Ins::InstallTry(-1)); GenerateExpressionInstructions(context, node->first, result.type); INSTRUCTION(Ins::UninstallTry(1)); vint finishInstruction = INSTRUCTION(Ins::Jump(-1)); FILL_LABEL_TO_CURRENT(trapInstruction); GenerateExpressionInstructions(context, node->second, result.type); FILL_LABEL_TO_CURRENT(finishInstruction); } else { Ptr mergedType; switch (node->op) { case WfBinaryOperator::Exp: case WfBinaryOperator::Add: case WfBinaryOperator::Sub: case WfBinaryOperator::Mul: case WfBinaryOperator::Div: case WfBinaryOperator::Mod: case WfBinaryOperator::Shl: case WfBinaryOperator::Shr: { auto result = context.manager->expressionResolvings[node]; mergedType = result.type; } break; default: { auto firstResult = context.manager->expressionResolvings[node->first.Obj()]; auto secondResult = context.manager->expressionResolvings[node->second.Obj()]; auto firstType = firstResult.expectedType ? firstResult.expectedType : firstResult.type; auto secondType = secondResult.expectedType ? secondResult.expectedType : secondResult.type; mergedType = GetMergedType(firstType, secondType); if (node->op == WfBinaryOperator::EQ || node->op == WfBinaryOperator::NE) { if (mergedType->GetDecorator() == ITypeInfo::RawPtr || mergedType->GetDecorator() == ITypeInfo::SharedPtr) { GenerateExpressionInstructions(context, node->first); GenerateExpressionInstructions(context, node->second); INSTRUCTION(Ins::CompareReference()); if (node->op == WfBinaryOperator::NE) { INSTRUCTION(Ins::OpNot(WfInsType::Bool)); } } else { Ptr mergedToStringType; if (mergedType->GetDecorator() == ITypeInfo::TypeDescriptor && mergedType->GetTypeDescriptor() == description::GetTypeDescriptor()) { mergedToStringType = mergedType; } GenerateExpressionInstructions(context, node->first, mergedToStringType); GenerateExpressionInstructions(context, node->second, mergedToStringType); INSTRUCTION(Ins::CompareValue()); if (node->op == WfBinaryOperator::NE) { INSTRUCTION(Ins::OpNot(WfInsType::Bool)); } } return; } } } GenerateExpressionInstructions(context, node->first, mergedType); GenerateExpressionInstructions(context, node->second, mergedType); switch (node->op) { case WfBinaryOperator::Exp: INSTRUCTION(Ins::OpExp(GetInstructionTypeArgument(mergedType))); break; case WfBinaryOperator::Add: INSTRUCTION(Ins::OpAdd(GetInstructionTypeArgument(mergedType))); break; case WfBinaryOperator::Sub: INSTRUCTION(Ins::OpSub(GetInstructionTypeArgument(mergedType))); break; case WfBinaryOperator::Mul: INSTRUCTION(Ins::OpMul(GetInstructionTypeArgument(mergedType))); break; case WfBinaryOperator::Div: INSTRUCTION(Ins::OpDiv(GetInstructionTypeArgument(mergedType))); break; case WfBinaryOperator::Mod: INSTRUCTION(Ins::OpMod(GetInstructionTypeArgument(mergedType))); break; case WfBinaryOperator::Shl: INSTRUCTION(Ins::OpShl(GetInstructionTypeArgument(mergedType))); break; case WfBinaryOperator::Shr: INSTRUCTION(Ins::OpShr(GetInstructionTypeArgument(mergedType))); break; case WfBinaryOperator::LT: INSTRUCTION(Ins::CompareLiteral(GetInstructionTypeArgument(mergedType))); INSTRUCTION(Ins::OpLT()); break; case WfBinaryOperator::GT: INSTRUCTION(Ins::CompareLiteral(GetInstructionTypeArgument(mergedType))); INSTRUCTION(Ins::OpGT()); break; case WfBinaryOperator::LE: INSTRUCTION(Ins::CompareLiteral(GetInstructionTypeArgument(mergedType))); INSTRUCTION(Ins::OpLE()); break; case WfBinaryOperator::GE: INSTRUCTION(Ins::CompareLiteral(GetInstructionTypeArgument(mergedType))); INSTRUCTION(Ins::OpGE()); break; case WfBinaryOperator::EQ: INSTRUCTION(Ins::CompareLiteral(GetInstructionTypeArgument(mergedType))); INSTRUCTION(Ins::OpEQ()); break; case WfBinaryOperator::NE: INSTRUCTION(Ins::CompareLiteral(GetInstructionTypeArgument(mergedType))); INSTRUCTION(Ins::OpNE()); break; case WfBinaryOperator::Xor: INSTRUCTION(Ins::OpXor(GetInstructionTypeArgument(mergedType))); break; case WfBinaryOperator::And: INSTRUCTION(Ins::OpAnd(GetInstructionTypeArgument(mergedType))); break; case WfBinaryOperator::Or: INSTRUCTION(Ins::OpOr(GetInstructionTypeArgument(mergedType))); break; default:; } } } void Visit(WfLetExpression* node)override { auto scope = context.manager->nodeScopes[node].Obj(); Array variableIndices(node->variables.Count()); auto function = context.functionContext->function; for (auto [var, index] : indexed(node->variables)) { auto symbol = scope->symbols[var->name.value][0]; vint variableIndex = function->argumentNames.Count() + function->localVariableNames.Add(L"" + var->name.value); context.functionContext->localVariables.Add(symbol.Obj(), variableIndex); variableIndices[index] = variableIndex; GenerateExpressionInstructions(context, var->value); INSTRUCTION(Ins::StoreLocalVar(variableIndex)); } GenerateExpressionInstructions(context, node->expression); for (auto [var, index] : indexed(node->variables)) { INSTRUCTION(Ins::LoadValue({})); INSTRUCTION(Ins::StoreLocalVar(variableIndices[index])); } } void Visit(WfIfExpression* node)override { auto result = context.manager->expressionResolvings[node]; GenerateExpressionInstructions(context, node->condition); vint fillTrueIndex = INSTRUCTION(Ins::JumpIf(-1)); GenerateExpressionInstructions(context, node->falseBranch, result.type); vint fillEndIndex = INSTRUCTION(Ins::Jump(-1)); FILL_LABEL_TO_CURRENT(fillTrueIndex); GenerateExpressionInstructions(context, node->trueBranch, result.type); FILL_LABEL_TO_CURRENT(fillEndIndex); } void Visit(WfRangeExpression* node)override { auto result = context.manager->expressionResolvings[node]; auto elementType = Ptr(result.type->GetElementType()->GetGenericArgument(0)); auto type = GetInstructionTypeArgument(elementType); WfRuntimeValue one; switch (context.manager->cpuArchitecture) { case WfCpuArchitecture::x86: one = {(vint32_t)1}; break; case WfCpuArchitecture::x64: one = { (vint64_t)1 }; break; default: one = { (vint)1 }; break; } GenerateExpressionInstructions(context, node->begin, elementType); if (node->beginBoundary == WfRangeBoundary::Exclusive) { INSTRUCTION(Ins::LoadValue(one)); INSTRUCTION(Ins::OpAdd(type)); } GenerateExpressionInstructions(context, node->end, elementType); if (node->endBoundary == WfRangeBoundary::Exclusive) { INSTRUCTION(Ins::LoadValue(one)); INSTRUCTION(Ins::OpSub(type)); } INSTRUCTION(Ins::CreateRange(type)); } void Visit(WfSetTestingExpression* node)override { if (auto range = node->collection.Cast()) { auto resultElement = context.manager->expressionResolvings[node->element.Obj()]; auto resultBegin = context.manager->expressionResolvings[range->begin.Obj()]; auto resultEnd = context.manager->expressionResolvings[range->end.Obj()]; auto typeElement = resultElement.expectedType ? resultElement.expectedType : resultElement.type; auto typeBegin = resultBegin.expectedType ? resultBegin.expectedType : resultBegin.type; auto typeEnd = resultEnd.expectedType ? resultEnd.expectedType : resultEnd.type; auto typeLeft = GetMergedType(typeElement, typeBegin); auto typeRight = GetMergedType(typeElement, typeEnd); auto function = context.functionContext->function; vint index = function->argumentNames.Count() + function->localVariableNames.Add(L""); GenerateExpressionInstructions(context, node->element); INSTRUCTION(Ins::StoreLocalVar(index)); INSTRUCTION(Ins::LoadLocalVar(index)); if (!IsSameType(typeElement.Obj(), typeLeft.Obj())) { GenerateTypeCastInstructions(context, typeLeft, true, node); } GenerateExpressionInstructions(context, range->begin, typeLeft); INSTRUCTION(Ins::CompareLiteral(GetInstructionTypeArgument(typeLeft))); if (range->beginBoundary == WfRangeBoundary::Exclusive) { INSTRUCTION(Ins::OpGT()); } else { INSTRUCTION(Ins::OpGE()); } INSTRUCTION(Ins::LoadLocalVar(index)); if (!IsSameType(typeElement.Obj(), typeRight.Obj())) { GenerateTypeCastInstructions(context, typeRight, true, node); } GenerateExpressionInstructions(context, range->end, typeRight); INSTRUCTION(Ins::CompareLiteral(GetInstructionTypeArgument(typeRight))); if (range->endBoundary == WfRangeBoundary::Exclusive) { INSTRUCTION(Ins::OpLT()); } else { INSTRUCTION(Ins::OpLE()); } INSTRUCTION(Ins::OpAnd(WfInsType::Bool)); if (node->test == WfSetTesting::NotIn) { INSTRUCTION(Ins::OpNot(WfInsType::Bool)); } INSTRUCTION(Ins::LoadValue({})); INSTRUCTION(Ins::StoreLocalVar(index)); } else { auto result = context.manager->expressionResolvings[node->collection.Obj()]; auto type = result.expectedType ? result.expectedType : result.type; GenerateExpressionInstructions(context, node->element); GenerateExpressionInstructions(context, node->collection); auto tdList = description::GetTypeDescriptor(); if (result.type->GetTypeDescriptor()->CanConvertTo(tdList)) { auto method = tdList->GetMethodGroupByName(L"Contains", true)->GetMethod(0); INSTRUCTION(Ins::InvokeMethod(method, 1)); } else { INSTRUCTION(Ins::TestElementInSet()); } if (node->test == WfSetTesting::NotIn) { INSTRUCTION(Ins::OpNot(WfInsType::Bool)); } } } void Visit(WfConstructorExpression* node)override { auto result = context.manager->expressionResolvings[node]; if (result.type->GetTypeDescriptor()->GetTypeDescriptorFlags() == TypeDescriptorFlags::Struct) { auto td = result.type->GetTypeDescriptor(); INSTRUCTION(Ins::CreateStruct(Value::BoxedValue, td)); for (auto argument : node->arguments) { auto prop = td->GetPropertyByName(argument->key.Cast()->name.value, true); GenerateExpressionInstructions(context, argument->value, CopyTypeInfo(prop->GetReturn())); INSTRUCTION(Ins::UpdateProperty(prop)); } } else if (result.type->GetTypeDescriptor() == description::GetTypeDescriptor() || result.type->GetTypeDescriptor() == description::GetTypeDescriptor() || result.type->GetTypeDescriptor() == description::GetTypeDescriptor()) { Ptr keyType = CopyTypeInfo(result.type->GetElementType()->GetGenericArgument(0)); for (auto argument : From(node->arguments).Reverse()) { GenerateExpressionInstructions(context, argument->key, keyType); } INSTRUCTION(Ins::NewArray(node->arguments.Count())); } else if (result.type->GetTypeDescriptor() == description::GetTypeDescriptor()) { Ptr keyType = CopyTypeInfo(result.type->GetElementType()->GetGenericArgument(0)); for (auto argument : From(node->arguments).Reverse()) { GenerateExpressionInstructions(context, argument->key, keyType); } INSTRUCTION(Ins::NewList(node->arguments.Count())); } else if (result.type->GetTypeDescriptor() == description::GetTypeDescriptor()) { Ptr keyType = CopyTypeInfo(result.type->GetElementType()->GetGenericArgument(0)); for (auto argument : From(node->arguments).Reverse()) { GenerateExpressionInstructions(context, argument->key, keyType); } INSTRUCTION(Ins::NewObservableList(node->arguments.Count())); } else { Ptr keyType = CopyTypeInfo(result.type->GetElementType()->GetGenericArgument(0)); Ptr valueType = CopyTypeInfo(result.type->GetElementType()->GetGenericArgument(1)); for (auto argument : From(node->arguments).Reverse()) { GenerateExpressionInstructions(context, argument->key, keyType); GenerateExpressionInstructions(context, argument->value, valueType); } INSTRUCTION(Ins::NewDictionary(node->arguments.Count() * 2)); } } void Visit(WfInferExpression* node)override { GenerateExpressionInstructions(context, node->expression); } void Visit(WfTypeCastingExpression* node)override { if (node->strategy == WfTypeCastingStrategy::Strong) { auto result = context.manager->expressionResolvings[node]; GenerateExpressionInstructions(context, node->expression, result.type); } else { auto scope = context.manager->nodeScopes[node].Obj(); auto type = CreateTypeInfoFromType(scope, node->type); GenerateExpressionInstructions(context, node->expression); GenerateTypeCastInstructions(context, type, false, node); } } void Visit(WfTypeTestingExpression* node)override { switch (node->test) { case WfTypeTesting::IsNull: GenerateExpressionInstructions(context, node->expression); INSTRUCTION(Ins::LoadValue({})); INSTRUCTION(Ins::CompareReference()); break; case WfTypeTesting::IsNotNull: GenerateExpressionInstructions(context, node->expression); INSTRUCTION(Ins::LoadValue({})); INSTRUCTION(Ins::CompareReference()); INSTRUCTION(Ins::OpNot(WfInsType::Bool)); break; case WfTypeTesting::IsType: { auto scope = context.manager->nodeScopes[node].Obj(); auto type = CreateTypeInfoFromType(scope, node->type); GenerateExpressionInstructions(context, node->expression); GenerateTypeTestingInstructions(context, type, node); } break; case WfTypeTesting::IsNotType: { auto scope = context.manager->nodeScopes[node].Obj(); auto type = CreateTypeInfoFromType(scope, node->type); GenerateExpressionInstructions(context, node->expression); GenerateTypeTestingInstructions(context, type, node); INSTRUCTION(Ins::OpNot(WfInsType::Bool)); } break; default:; } } void Visit(WfTypeOfTypeExpression* node)override { auto scope = context.manager->nodeScopes[node].Obj(); auto type = CreateTypeInfoFromType(scope, node->type, false); INSTRUCTION(Ins::LoadValue({ type->GetTypeDescriptor() })); } void Visit(WfTypeOfExpressionExpression* node)override { GenerateExpressionInstructions(context, node->expression); INSTRUCTION(Ins::GetType()); } void Visit(WfAttachEventExpression* node)override { auto result = context.manager->expressionResolvings[node->event.Obj()]; if (auto member = node->event.Cast()) { GenerateExpressionInstructions(context, member->parent); } else { VisitThisExpression(node, result.eventInfo->GetOwnerTypeDescriptor()); } GenerateExpressionInstructions(context, node->function); INSTRUCTION(Ins::AttachEvent(result.eventInfo)); } void Visit(WfDetachEventExpression* node)override { auto result = context.manager->expressionResolvings[node->event.Obj()]; if (auto member = node->event.Cast()) { GenerateExpressionInstructions(context, member->parent); } else { VisitThisExpression(node, result.eventInfo->GetOwnerTypeDescriptor()); } GenerateExpressionInstructions(context, node->handler); INSTRUCTION(Ins::DetachEvent(result.eventInfo)); } void Visit(WfObserveExpression* node)override { } void Visit(WfCallExpression* node)override { for (auto argument : node->arguments) { GenerateExpressionInstructions(context, argument); } auto result = context.manager->expressionResolvings[node->function.Obj()]; if (result.methodInfo) { if (result.methodInfo->IsStatic()) { INSTRUCTION(Ins::LoadValue({})); } else if (auto member = node->function.Cast()) { GenerateExpressionInstructions(context, member->parent); } else { VisitThisExpression(node, result.methodInfo->GetOwnerTypeDescriptor()); } INSTRUCTION(Ins::InvokeMethod(result.methodInfo, node->arguments.Count())); return; } else if (result.eventInfo) { if(auto member = node->function.Cast()) { GenerateExpressionInstructions(context, member->parent); } else { VisitThisExpression(node, result.eventInfo->GetOwnerTypeDescriptor()); } INSTRUCTION(Ins::InvokeEvent(result.eventInfo, node->arguments.Count())); return; } else if (result.symbol) { if (result.symbol->creatorNode.Cast()) { if (result.symbol->ownerScope->ownerNode.Cast()) { vint functionIndex = context.closureFunctions[result.symbol.Obj()]; INSTRUCTION(Ins::InvokeWithContext(functionIndex, node->arguments.Count())); return; } else { vint index = context.globalFunctions.Keys().IndexOf(result.symbol.Obj()); if (index != -1) { vint functionIndex = context.globalFunctions.Values()[index]; INSTRUCTION(Ins::Invoke(functionIndex, node->arguments.Count())); return; } } } } GenerateExpressionInstructions(context, node->function); INSTRUCTION(Ins::InvokeProxy(node->arguments.Count())); } static void VisitFunction(WfCodegenContext& context, WfFunctionDeclaration* node, WfCodegenLambdaContext lc, const Func& getName) { auto scope = context.manager->nodeScopes[node].Obj(); bool inNewInterfaceExpr = scope->parentScope && scope->parentScope->ownerNode.Cast(); auto functionIndex = AddClosure(context, lc, getName); if (inNewInterfaceExpr) { INSTRUCTION(Ins::LoadFunction(functionIndex)); } else { auto capture = context.manager->lambdaCaptures.Get(node); for (auto symbol : capture->symbols) { GenerateLoadSymbolInstructions(context, symbol.Obj(), node); } vint thisCount = PushCapturedThisValues(context, scope->parentScope.Obj(), node); INSTRUCTION(Ins::CreateClosureContext(capture->symbols.Count() + thisCount)); INSTRUCTION(Ins::LoadFunction(functionIndex)); INSTRUCTION(Ins::CreateClosure()); } } void Visit(WfFunctionExpression* node)override { WfCodegenLambdaContext lc; lc.functionExpression = node; VisitFunction(context, node->function.Obj(), lc, [=, this](vint index) { return L"function->name.value + L"(" + itow(index) + L")> in " + context.functionContext->function->name; }); } class NewInterfaceExpressionVisitor : public empty_visitor::DeclarationVisitor { public: WfCodegenContext& context; vint variableCount = 0; List> variableSymbols; List> closureFunctions; List> overrideFunctions; WfFunctionDeclaration* firstFunction = nullptr; NewInterfaceExpressionVisitor(WfCodegenContext& _context) :context(_context) { } void Dispatch(WfVirtualCfeDeclaration* node)override { for (auto decl : node->expandedDeclarations) { decl->Accept(this); } } void Dispatch(WfVirtualCseDeclaration* node)override { CHECK_FAIL(L"NewInterfaceExpressionVisitor::Visit(WfVirtualCseDeclaration*)#Internal error, Temporary not supported."); } void Visit(WfFunctionDeclaration* node)override { if (!firstFunction) { firstFunction = node; } if (node->functionKind == WfFunctionKind::Normal) { closureFunctions.Add(Ptr(node)); } else { overrideFunctions.Add(Ptr(node)); } } void Visit(WfVariableDeclaration* node)override { variableCount++; } void Execute(WfNewInterfaceExpression* node) { for (auto memberDecl : node->declarations) { memberDecl->Accept(this); } if (firstFunction != nullptr && variableCount > 0) { auto capture = context.manager->lambdaCaptures.Get(firstFunction); CopyFrom(variableSymbols, From(capture->symbols).Take(variableCount)); } } }; void Visit(WfNewClassExpression* node)override { auto result = context.manager->expressionResolvings[node]; for (auto argument : node->arguments) { GenerateExpressionInstructions(context, argument); } INSTRUCTION(Ins::LoadValue({})); INSTRUCTION(Ins::InvokeMethod(result.constructorInfo, node->arguments.Count())); } void Visit(WfNewInterfaceExpression* node)override { auto result = context.manager->expressionResolvings[node]; NewInterfaceExpressionVisitor declVisitor(context); declVisitor.Execute(node); if (declVisitor.firstFunction != nullptr) { for (vint i = 0; i < declVisitor.variableCount; i++) { auto var = declVisitor.variableSymbols[i]->creatorNode.Cast(); GenerateExpressionInstructions(context, var->expression); } auto capture = context.manager->lambdaCaptures.Get(declVisitor.firstFunction); for (vint i = declVisitor.variableCount; i < capture->symbols.Count(); i++) { GenerateLoadSymbolInstructions(context, capture->symbols[i].Obj(), node); } auto scope = context.manager->nodeScopes[node].Obj(); vint thisCount = PushCapturedThisValues(context, scope, node); INSTRUCTION(Ins::LoadValue({})); INSTRUCTION(Ins::CreateClosureContext(capture->symbols.Count() + thisCount + 1)); for (auto func : declVisitor.closureFunctions) { WfCodegenLambdaContext lc; lc.functionDeclaration = func.Obj(); auto functionIndex = AddClosure(context, lc, [=, this](vint index) { return L"name.value + L"<" + result.type->GetTypeDescriptor()->GetTypeName() + L">(" + itow(index) + L")> in " + context.functionContext->function->name; }); auto scope = context.manager->nodeScopes[func.Obj()].Obj(); auto symbol = context.manager->GetDeclarationSymbol(scope, func.Obj()); context.closureFunctions.Add(symbol.Obj(), functionIndex); } for (auto func : declVisitor.overrideFunctions) { auto methodInfo = context.manager->interfaceMethodImpls[func.Obj()]; INSTRUCTION(Ins::LoadMethodInfo(methodInfo)); WfCodegenLambdaContext lc; lc.functionDeclaration = func.Obj(); VisitFunction(context, func.Obj(), lc, [=, this, &declVisitor](vint index) { return L"name.value + L"<" + result.type->GetTypeDescriptor()->GetTypeName() + L">(" + itow(index + declVisitor.closureFunctions.Count()) + L")> in " + context.functionContext->function->name; }); } } else { INSTRUCTION(Ins::LoadValue({})); INSTRUCTION(Ins::CreateClosureContext(1)); } INSTRUCTION(Ins::CreateInterface(result.constructorInfo, declVisitor.overrideFunctions.Count() * 2)); } void Visit(WfVirtualCfeExpression* node)override { GenerateExpressionInstructions(context, node->expandedExpression); } void Visit(WfVirtualCseExpression* node)override { GenerateExpressionInstructions(context, node->expandedExpression); } }; #undef FILL_LABEL_TO_CURRENT #undef FILL_LABEL_TO_INS #undef INSTRUCTION Ptr GenerateExpressionInstructions(WfCodegenContext& context, Ptr expression, Ptr expectedType) { GenerateExpressionInstructionsVisitor visitor(context); expression->Accept(&visitor); auto result = context.manager->expressionResolvings[expression.Obj()]; auto type = result.type; if (result.expectedType && !IsSameType(type.Obj(), result.expectedType.Obj())) { type = result.expectedType; GenerateTypeCastInstructions(context, type, true, expression.Obj()); } if (expectedType && !IsSameType(type.Obj(), expectedType.Obj())) { type = expectedType; GenerateTypeCastInstructions(context, type, true, expression.Obj()); } return type; } } } } /*********************************************************************** .\EMITTER\WFEMITTER_METADATA.CPP ***********************************************************************/ namespace vl { namespace workflow { namespace emitter { using namespace collections; using namespace reflection::description; using namespace analyzer; using namespace runtime; using namespace typeimpl; /*********************************************************************** GenerateGlobalDeclarationMetadata ***********************************************************************/ void GenerateFunctionDeclarationMetadata(WfCodegenContext& context, WfFunctionDeclaration* node, Ptr meta) { for (auto argument : node->arguments) { meta->argumentNames.Add(argument->name.value); } { vint index = context.manager->lambdaCaptures.Keys().IndexOf(node); if (index != -1) { auto capture = context.manager->lambdaCaptures.Values()[index]; for (auto symbol : capture->symbols) { meta->capturedVariableNames.Add(L"" + symbol->name); } } auto scope = context.manager->nodeScopes[node]; vint count = context.GetThisStackCount(scope.Obj()); for (vint i = 0; i < count; i++) { meta->capturedVariableNames.Add(L"" + itow(i)); } } } class GenerateGlobalClassMemberMetadataVisitor : public Object, public WfDeclaration::IVisitor { public: WfCodegenContext& context; WString namePrefix; WfClassDeclaration* classDecl; GenerateGlobalClassMemberMetadataVisitor(WfCodegenContext& _context, const WString& _namePrefix, WfClassDeclaration* _classDecl) :context(_context) , namePrefix(_namePrefix) , classDecl(_classDecl) { } void Visit(WfNamespaceDeclaration* node)override { } void Visit(WfFunctionDeclaration* node)override { if (node->functionKind == WfFunctionKind::Static) { GenerateGlobalDeclarationMetadata(context, node, namePrefix); auto scope = context.manager->nodeScopes[node].Obj(); auto symbol = context.manager->GetDeclarationSymbol(scope, node); auto index = context.globalFunctions[symbol.Obj()]; auto info = context.manager->declarationMemberInfos[node].Cast(); info->functionIndex = index; } else if (classDecl->kind == WfClassKind::Class) { GenerateGlobalDeclarationMetadata(context, node, namePrefix); auto scope = context.manager->nodeScopes[node].Obj(); auto symbol = context.manager->GetDeclarationSymbol(scope, node); auto index = context.globalFunctions[symbol.Obj()]; auto info = context.manager->declarationMemberInfos[node].Cast(); info->functionIndex = index; } } void Visit(WfVariableDeclaration* node)override { } void Visit(WfEventDeclaration* node)override { } void Visit(WfPropertyDeclaration* node)override { } void Visit(WfStaticInitDeclaration* node)override { } void Visit(WfConstructorDeclaration* node)override { auto meta = Ptr(new WfAssemblyFunction); meta->name = namePrefix + L"#ctor"; for (auto argument : node->arguments) { meta->argumentNames.Add(argument->name.value); } meta->capturedVariableNames.Add(L"0"); vint index = context.assembly->functions.Add(meta); context.assembly->functionByName.Add(meta->name, index); context.constructors.Add(node, index); auto info = context.manager->declarationMemberInfos[node].Cast(); info->functionIndex = index; } void Visit(WfDestructorDeclaration* node)override { auto meta = Ptr(new WfAssemblyFunction); meta->name = namePrefix + L"#dtor"; meta->capturedVariableNames.Add(L"0"); vint index = context.assembly->functions.Add(meta); context.assembly->functionByName.Add(meta->name, index); context.destructors.Add(node, index); auto info = context.manager->declarationTypes[classDecl].Cast(); info->destructorFunctionIndex = index; } void Visit(WfClassDeclaration* node)override { GenerateGlobalDeclarationMetadata(context, node, namePrefix); } void Visit(WfEnumDeclaration* node)override { } void Visit(WfStructDeclaration* node)override { } void Visit(WfVirtualCfeDeclaration* node)override { for (auto decl : node->expandedDeclarations) { decl->Accept(this); } } void Visit(WfVirtualCseDeclaration* node)override { for (auto decl : node->expandedDeclarations) { decl->Accept(this); } } }; class GenerateGlobalDeclarationMetadataVisitor : public Object, public WfDeclaration::IVisitor { public: WfCodegenContext& context; WString namePrefix; GenerateGlobalDeclarationMetadataVisitor(WfCodegenContext& _context, const WString& _namePrefix) :context(_context) , namePrefix(_namePrefix) { } void Visit(WfNamespaceDeclaration* node)override { for (auto decl : node->declarations) { GenerateGlobalDeclarationMetadata(context, decl.Obj(), namePrefix + node->name.value + L"::"); } } void Visit(WfFunctionDeclaration* node)override { auto meta = Ptr(new WfAssemblyFunction); meta->name = namePrefix + node->name.value; GenerateFunctionDeclarationMetadata(context, node, meta); vint index = context.assembly->functions.Add(meta); context.assembly->functionByName.Add(meta->name, index); auto scope = context.manager->nodeScopes[node].Obj(); auto symbol = context.manager->GetDeclarationSymbol(scope, node); context.globalFunctions.Add(symbol.Obj(), index); } void Visit(WfVariableDeclaration* node)override { vint index = context.assembly->variableNames.Add(namePrefix + node->name.value); auto scope = context.manager->nodeScopes[node].Obj(); auto symbol = scope->symbols[node->name.value][0]; context.globalVariables.Add(symbol.Obj(), index); } void Visit(WfEventDeclaration* node)override { } void Visit(WfPropertyDeclaration* node)override { } void Visit(WfStaticInitDeclaration* node)override { } void Visit(WfConstructorDeclaration* node)override { } void Visit(WfDestructorDeclaration* node)override { } void Visit(WfClassDeclaration* node)override { for (auto memberDecl : node->declarations) { GenerateGlobalClassMemberMetadataVisitor visitor(context, namePrefix + node->name.value + L"::", node); memberDecl->Accept(&visitor); } } void Visit(WfEnumDeclaration* node)override { } void Visit(WfStructDeclaration* node)override { } void Visit(WfVirtualCfeDeclaration* node)override { for (auto decl : node->expandedDeclarations) { decl->Accept(this); } } void Visit(WfVirtualCseDeclaration* node)override { for (auto decl : node->expandedDeclarations) { decl->Accept(this); } } }; void GenerateGlobalDeclarationMetadata(WfCodegenContext& context, WfDeclaration* declaration, const WString& namePrefix) { GenerateGlobalDeclarationMetadataVisitor visitor(context, namePrefix); declaration->Accept(&visitor); } } } } /*********************************************************************** .\EMITTER\WFEMITTER_STATEMENT.CPP ***********************************************************************/ namespace vl { namespace workflow { namespace emitter { using namespace collections; using namespace reflection; using namespace reflection::description; using namespace analyzer; using namespace runtime; typedef WfInstruction Ins; #define INSTRUCTION(X) context.AddInstruction(node, X) #define FILL_LABEL_TO_INS(LABEL, INS) context.assembly->instructions[LABEL].indexParameter = INS #define FILL_LABEL_TO_CURRENT(LABEL) FILL_LABEL_TO_INS(LABEL, context.assembly->instructions.Count()) #define EXIT_CODE(X) context.AddExitInstruction(node, X) /*********************************************************************** GenerateInstructions(Statement) ***********************************************************************/ class GenerateStatementInstructionsVisitor : public Object, public WfStatement::IVisitor { public: WfCodegenContext& context; GenerateStatementInstructionsVisitor(WfCodegenContext& _context) :context(_context) { } void ApplyExitCode(Ptr scopeContext) { context.ApplyExitInstructions(scopeContext); if (scopeContext->exitStatement) { GenerateStatementInstructions(context, scopeContext->exitStatement); } } void ApplyCurrentScopeExitCode() { auto scopeContext = context.functionContext->GetCurrentScopeContext(); ApplyExitCode(scopeContext); } void InlineScopeExitCode(WfCodegenScopeType untilScopeType, bool exclusive, const WString& name = WString::Empty) { vint index = context.functionContext->scopeContextStack.Count() - 1; while (index >= 0) { auto scopeContext = context.functionContext->scopeContextStack[index]; bool found = false; if (scopeContext->type == untilScopeType) { if (name == L"" || scopeContext->name == name) { found = true; } } if (exclusive && found) break; ApplyExitCode(scopeContext); if (!exclusive && found) break; index--; } } void Visit(WfBreakStatement* node)override { InlineScopeExitCode(WfCodegenScopeType::Loop, false); context.functionContext->GetCurrentScopeContext(WfCodegenScopeType::Loop)->breakInstructions.Add(INSTRUCTION(Ins::Jump(-1))); } void Visit(WfContinueStatement* node)override { InlineScopeExitCode(WfCodegenScopeType::Loop, true); context.functionContext->GetCurrentScopeContext(WfCodegenScopeType::Loop)->continueInstructions.Add(INSTRUCTION(Ins::Jump(-1))); } void Visit(WfReturnStatement* node)override { InlineScopeExitCode(WfCodegenScopeType::Function, false); if (node->expression) { GenerateExpressionInstructions(context, node->expression); } else { INSTRUCTION(Ins::LoadValue({})); } INSTRUCTION(Ins::Return()); } void Visit(WfDeleteStatement* node)override { GenerateExpressionInstructions(context, node->expression); INSTRUCTION(Ins::DeleteRawPtr()); } void Visit(WfRaiseExceptionStatement* node)override { if (node->expression) { GenerateExpressionInstructions(context, node->expression); } else { auto scope = context.manager->nodeScopes[node]; while (scope) { if (auto tryCatch = scope->ownerNode.Cast()) { if (tryCatch->name.value != L"") { auto symbol = scope->symbols[tryCatch->name.value][0].Obj(); vint index = context.functionContext->localVariables[symbol]; INSTRUCTION(Ins::LoadLocalVar(index)); break; } } scope = scope->parentScope; } } INSTRUCTION(Ins::RaiseException()); } void Visit(WfIfStatement* node)override { vint variableIndex = -1; GenerateExpressionInstructions(context, node->expression); if (node->name.value != L"") { auto scope = context.manager->nodeScopes[node]; auto symbol = scope->symbols[node->name.value][0]; auto function = context.functionContext->function; variableIndex = function->argumentNames.Count() + function->localVariableNames.Add(L"" + node->name.value); context.functionContext->localVariables.Add(symbol.Obj(), variableIndex); GenerateTypeCastInstructions(context, symbol->typeInfo, false, node->expression.Obj()); INSTRUCTION(Ins::StoreLocalVar(variableIndex)); INSTRUCTION(Ins::LoadLocalVar(variableIndex)); INSTRUCTION(Ins::LoadValue({})); INSTRUCTION(Ins::CompareReference()); } else { INSTRUCTION(Ins::OpNot(WfInsType::Bool)); } vint fillElseIndex = INSTRUCTION(Ins::JumpIf(-1)); GenerateStatementInstructions(context, node->trueBranch); if (variableIndex != -1) { INSTRUCTION(Ins::LoadValue({})); INSTRUCTION(Ins::StoreLocalVar(variableIndex)); } vint fillEndIndex = INSTRUCTION(Ins::Jump(-1)); FILL_LABEL_TO_CURRENT(fillElseIndex); if (node->falseBranch) { GenerateStatementInstructions(context, node->falseBranch); } FILL_LABEL_TO_CURRENT(fillEndIndex); } void Visit(WfWhileStatement* node)override { vint continueLabelIndex = -1; vint breakLabelIndex = -1; vint loopLabelIndex = -1; auto loopContext = context.functionContext->PushScopeContext(WfCodegenScopeType::Loop); loopLabelIndex = context.assembly->instructions.Count(); continueLabelIndex = context.assembly->instructions.Count(); GenerateExpressionInstructions(context, node->condition); INSTRUCTION(Ins::OpNot(WfInsType::Bool)); loopContext->breakInstructions.Add(INSTRUCTION(Ins::JumpIf(-1))); GenerateStatementInstructions(context, node->statement); INSTRUCTION(Ins::Jump(loopLabelIndex)); breakLabelIndex = context.assembly->instructions.Count(); for (auto index : loopContext->continueInstructions) { FILL_LABEL_TO_INS(index, continueLabelIndex); } for (auto index : loopContext->breakInstructions) { FILL_LABEL_TO_INS(index, breakLabelIndex); } context.functionContext->PopScopeContext(); } Pair GenerateTryProtected(WfStatement* node, Ptr protectedStatement, Ptr finallyStatement) { auto catchContext = context.functionContext->PushScopeContext(WfCodegenScopeType::TryCatch); EXIT_CODE(Ins::UninstallTry(0)); catchContext->exitStatement = finallyStatement; vint trap = INSTRUCTION(Ins::InstallTry(-1)); GenerateStatementInstructions(context, protectedStatement); context.functionContext->PopScopeContext(); INSTRUCTION(Ins::UninstallTry(0)); vint finish = INSTRUCTION(Ins::Jump(-1)); return{ trap,finish }; } vint GenerateExceptionVariable(WfTryStatement* node) { WfLexicalSymbol* exceptionSymbol = nullptr; WString exceptionName; if (node->catchStatement) { auto scope = context.manager->nodeScopes[node].Obj(); exceptionSymbol = scope->symbols[node->name.value][0].Obj(); exceptionName = L"" + node->name.value; } else { exceptionName = L""; } auto function = context.functionContext->function; vint variableIndex = function->argumentNames.Count() + function->localVariableNames.Add(L"" + node->name.value); if (exceptionSymbol) { context.functionContext->localVariables.Add(exceptionSymbol, variableIndex); } return variableIndex; } void GenerateTrap(WfTryStatement* node, vint variableIndex, Pair trap) { FILL_LABEL_TO_CURRENT(trap.key); INSTRUCTION(Ins::LoadException()); INSTRUCTION(Ins::StoreLocalVar(variableIndex)); } void GenerateFinallyAndRaise(WfTryStatement* node, vint variableIndex) { GenerateStatementInstructions(context, node->finallyStatement); INSTRUCTION(Ins::LoadLocalVar(variableIndex)); INSTRUCTION(Ins::RaiseException()); } void Visit(WfTryStatement* node)override { // try auto trap1 = GenerateTryProtected(node, node->protectedStatement, node->finallyStatement); Pair trap2 = { -1,-1 }; auto variableIndex = GenerateExceptionVariable(node); // catch { GenerateTrap(node, variableIndex, trap1); if (node->catchStatement) { if (node->finallyStatement) { trap2 = GenerateTryProtected(node, node->catchStatement, node->finallyStatement); GenerateTrap(node, variableIndex, trap2); GenerateFinallyAndRaise(node, variableIndex); } else { GenerateStatementInstructions(context, node->catchStatement); } } else { GenerateFinallyAndRaise(node, variableIndex); } } // finally FILL_LABEL_TO_CURRENT(trap1.value); if (trap2.value != -1) { FILL_LABEL_TO_CURRENT(trap2.value); } if (node->finallyStatement) { GenerateStatementInstructions(context, node->finallyStatement); } } void Visit(WfBlockStatement* node)override { Ptr blockContext; if (node->endLabel.value != L"") { blockContext = context.functionContext->PushScopeContext(WfCodegenScopeType::Block, node->endLabel.value); } for (auto statement : node->statements) { GenerateStatementInstructions(context, statement); } if (blockContext) { vint breakLabelIndex = context.assembly->instructions.Count(); for (auto index : blockContext->breakInstructions) { FILL_LABEL_TO_INS(index, breakLabelIndex); } context.functionContext->PopScopeContext(); } } void Visit(WfGotoStatement* node)override { InlineScopeExitCode(WfCodegenScopeType::Block, false, node->label.value); context.functionContext->GetCurrentScopeContext(WfCodegenScopeType::Block, node->label.value)->breakInstructions.Add(INSTRUCTION(Ins::Jump(-1))); } void Visit(WfExpressionStatement* node)override { GenerateExpressionInstructions(context, node->expression); INSTRUCTION(Ins::Pop()); } void Visit(WfVariableStatement* node)override { auto manager = context.manager; auto scope = manager->nodeScopes[node->variable.Obj()]; auto symbol = scope->symbols[node->variable->name.value][0].Obj(); auto function = context.functionContext->function; vint index = function->argumentNames.Count() + function->localVariableNames.Add(node->variable->name.value); context.functionContext->localVariables.Add(symbol, index); GenerateExpressionInstructions(context, node->variable->expression); INSTRUCTION(Ins::StoreLocalVar(index)); } void Visit(WfVirtualCseStatement* node)override { GenerateStatementInstructions(context, node->expandedStatement); } void Visit(WfCoroutineStatement* node)override { CHECK_FAIL(L"GenerateStatementInstructionsVisitor::Visit(WfCoroutineStatement*)#Internal error, All coroutine statements do not emit instructions."); } void Visit(WfStateMachineStatement* node)override { CHECK_FAIL(L"GenerateStatementInstructionsVisitor::Visit(WfStateMachineStatement*)#Internal error, All state machine statements do not emit instructions."); } }; #undef EXIT_CODE #undef FILL_LABEL_TO_CURRENT #undef FILL_LABEL_TO_INS #undef INSTRUCTION void GenerateStatementInstructions(WfCodegenContext& context, Ptr statement) { GenerateStatementInstructionsVisitor visitor(context); statement->Accept(&visitor); } } } } /*********************************************************************** .\PARSER\WFEXPRESSION.CPP ***********************************************************************/ namespace vl { namespace workflow { using namespace stream; using namespace collections; using namespace glr; /*********************************************************************** Unescaping Functions ***********************************************************************/ void UnescapeStringInternal(glr::ParsingToken& value, bool formatString) { value.value = GenerateToStream([&](StreamWriter& writer) { WString input = formatString ? value.value.Sub(2, value.value.Length() - 3) : value.value.Sub(1, value.value.Length() - 2); const wchar_t* reading = input.Buffer(); while (wchar_t c = *reading++) { if (c == L'\\') { switch (wchar_t e = *reading++) { case L'r': writer.WriteChar('\r'); break; case L'n': writer.WriteChar('\n'); break; case L't': writer.WriteChar('\t'); break; default: writer.WriteChar(e); } } else { writer.WriteChar(c); } } }); } void UnescapeFormatString(glr::ParsingToken& value, const vl::collections::List& tokens) { UnescapeStringInternal(value, true); } void UnescapeString(glr::ParsingToken& value, const vl::collections::List& tokens) { UnescapeStringInternal(value, false); } void EscapeString(const WString& text, ParsingWriter& writer) { writer.WriteChar(L'\"'); const wchar_t* reading = text.Buffer(); while (wchar_t c = *reading++) { switch (c) { case '\r': writer.WriteString(L"\\r"); break; case '\n': writer.WriteString(L"\\n"); break; case '\t': writer.WriteString(L"\\t"); break; case '\"': writer.WriteString(L"\\\""); break; case '\\': writer.WriteString(L"\\\\"); break; default: writer.WriteChar(c); } } writer.WriteChar(L'\"'); } /*********************************************************************** WorkflowUnescapeVisitor ***********************************************************************/ class WorkflowUnescapeVisitor : public traverse_visitor::AstVisitor { protected: List& tokens; void Traverse(WfStringExpression* node) override { UnescapeString(node->value, tokens); } void Traverse(WfFormatExpression* node) override { UnescapeFormatString(node->value, tokens); } public: WorkflowUnescapeVisitor(List& _tokens) :tokens(_tokens) { } }; /*********************************************************************** Parsing ***********************************************************************/ Ptr ParseType(const WString& input, const Parser& parser, vint codeIndex) { List tokens; parser.Tokenize(input, tokens, codeIndex); auto ast = parser.Parse_Type(tokens, codeIndex); WorkflowUnescapeVisitor(tokens).InspectInto(ast.Obj()); return ast; } Ptr ParseExpression(const WString& input, const Parser& parser, vint codeIndex) { List tokens; parser.Tokenize(input, tokens, codeIndex); auto ast = parser.Parse_Expression(tokens, codeIndex); WorkflowUnescapeVisitor(tokens).InspectInto(ast.Obj()); return ast; } Ptr ParseStatement(const WString& input, const Parser& parser, vint codeIndex) { List tokens; parser.Tokenize(input, tokens, codeIndex); auto ast = parser.Parse_Statement(tokens, codeIndex); WorkflowUnescapeVisitor(tokens).InspectInto(ast.Obj()); return ast; } Ptr ParseCoProviderStatement(const WString& input, const Parser& parser, vint codeIndex) { List tokens; parser.Tokenize(input, tokens, codeIndex); auto ast = parser.Parse_CoProvider(tokens, codeIndex); WorkflowUnescapeVisitor(tokens).InspectInto(ast.Obj()); return ast; } Ptr ParseDeclaration(const WString& input, const Parser& parser, vint codeIndex) { List tokens; parser.Tokenize(input, tokens, codeIndex); auto ast = parser.Parse_Declaration(tokens, codeIndex); WorkflowUnescapeVisitor(tokens).InspectInto(ast.Obj()); return ast; } Ptr ParseModule(const WString& input, const Parser& parser, vint codeIndex) { List tokens; parser.Tokenize(input, tokens, codeIndex); auto ast = parser.Parse_Module(tokens, codeIndex); WorkflowUnescapeVisitor(tokens).InspectInto(ast.Obj()); return ast; } /*********************************************************************** Print (Type) ***********************************************************************/ class PrintTypeVisitor : public Object, public WfType::IVisitor { public: WString indent; ParsingWriter& writer; PrintTypeVisitor(const WString& _indent, ParsingWriter& _writer) :indent(_indent), writer(_writer) { } void Visit(WfPredefinedType* node)override { writer.BeforePrint(node); switch (node->name) { case WfPredefinedTypeName::Void: writer.WriteString(L"void"); break; case WfPredefinedTypeName::Object: writer.WriteString(L"object"); break; case WfPredefinedTypeName::Interface: writer.WriteString(L"interface"); break; case WfPredefinedTypeName::Int: writer.WriteString(L"int"); break; case WfPredefinedTypeName::UInt: writer.WriteString(L"uint"); break; case WfPredefinedTypeName::Float: writer.WriteString(L"float"); break; case WfPredefinedTypeName::Double: writer.WriteString(L"double"); break; case WfPredefinedTypeName::String: writer.WriteString(L"string"); break; case WfPredefinedTypeName::Char: writer.WriteString(L"char"); break; case WfPredefinedTypeName::Bool: writer.WriteString(L"bool"); break; default: CHECK_FAIL(L"Internal error: Unknown value."); } writer.AfterPrint(node); } void Visit(WfTopQualifiedType* node)override { writer.BeforePrint(node); writer.WriteString(L"::" + node->name.value); writer.AfterPrint(node); } void Visit(WfReferenceType* node)override { writer.BeforePrint(node); writer.WriteString(node->name.value); writer.AfterPrint(node); } void Visit(WfRawPointerType* node)override { writer.BeforePrint(node); WfPrint(node->element, indent, writer); writer.WriteString(L"*"); writer.AfterPrint(node); } void Visit(WfSharedPointerType* node)override { writer.BeforePrint(node); WfPrint(node->element, indent, writer); writer.WriteString(L"^"); writer.AfterPrint(node); } void Visit(WfNullableType* node)override { writer.BeforePrint(node); WfPrint(node->element, indent, writer); writer.WriteString(L"?"); writer.AfterPrint(node); } void Visit(WfEnumerableType* node)override { writer.BeforePrint(node); WfPrint(node->element, indent, writer); writer.WriteString(L"{}"); writer.AfterPrint(node); } void Visit(WfMapType* node)override { writer.BeforePrint(node); switch (node->writability) { case WfMapWritability::Readonly: writer.WriteString(L"const "); break; case WfMapWritability::Writable: break; default: CHECK_FAIL(L"Internal error: Unknown value."); } WfPrint(node->value, indent, writer); writer.WriteString(L"["); if (node->key) { WfPrint(node->key, indent, writer); } writer.WriteString(L"]"); writer.AfterPrint(node); } void Visit(WfObservableListType* node)override { writer.BeforePrint(node); writer.WriteString(L"observe "); WfPrint(node->element, indent, writer); writer.WriteString(L"[]"); writer.AfterPrint(node); } void Visit(WfFunctionType* node)override { writer.BeforePrint(node); writer.WriteString(L"(func "); writer.WriteString(L"("); for (auto [type, index] : indexed(node->arguments)) { if (index > 0) { writer.WriteString(L", "); } WfPrint(type, indent, writer); } writer.WriteString(L")"); writer.WriteString(L" : ("); WfPrint(node->result, indent, writer); writer.WriteString(L"))"); writer.AfterPrint(node); } void Visit(WfChildType* node)override { writer.BeforePrint(node); WfPrint(node->parent, indent, writer); writer.WriteString(L"::"); writer.WriteString(node->name.value); writer.AfterPrint(node); } }; /*********************************************************************** Print (Expression) ***********************************************************************/ class PrintExpressionVisitor : public Object , public WfExpression::IVisitor , public WfVirtualCfeExpression::IVisitor , public WfVirtualCseExpression::IVisitor { public: WString indent; ParsingWriter& writer; PrintExpressionVisitor(const WString& _indent, ParsingWriter& _writer) :indent(_indent), writer(_writer) { } void Visit(WfThisExpression* node)override { writer.BeforePrint(node); writer.WriteString(L"this"); writer.AfterPrint(node); } void Visit(WfTopQualifiedExpression* node)override { writer.BeforePrint(node); writer.WriteString(L"::"); writer.WriteString(node->name.value); writer.AfterPrint(node); } void Visit(WfReferenceExpression* node)override { writer.BeforePrint(node); writer.WriteString(node->name.value); writer.AfterPrint(node); } void Visit(WfOrderedNameExpression* node)override { writer.BeforePrint(node); writer.WriteString(node->name.value); writer.AfterPrint(node); } void Visit(WfOrderedLambdaExpression* node)override { writer.BeforePrint(node); writer.WriteString(L"["); WfPrint(node->body, indent, writer); writer.WriteString(L"]"); writer.AfterPrint(node); } void Visit(WfMemberExpression* node)override { writer.BeforePrint(node); WfPrint(node->parent, indent, writer); writer.WriteString(L"."); writer.WriteString(node->name.value); writer.AfterPrint(node); } void Visit(WfChildExpression* node)override { writer.BeforePrint(node); WfPrint(node->parent, indent, writer); writer.WriteString(L"::"); writer.WriteString(node->name.value); writer.AfterPrint(node); } void Visit(WfLiteralExpression* node)override { writer.BeforePrint(node); switch (node->value) { case WfLiteralValue::Null: writer.WriteString(L"null"); break; case WfLiteralValue::True: writer.WriteString(L"true"); break; case WfLiteralValue::False: writer.WriteString(L"false"); break; default: CHECK_FAIL(L"Internal error: Unknown value."); } writer.AfterPrint(node); } void Visit(WfFloatingExpression* node)override { writer.BeforePrint(node); writer.WriteString(node->value.value); writer.AfterPrint(node); } void Visit(WfIntegerExpression* node)override { writer.BeforePrint(node); writer.WriteString(node->value.value); writer.AfterPrint(node); } void Visit(WfStringExpression* node)override { writer.BeforePrint(node); EscapeString(node->value.value, writer); writer.AfterPrint(node); } void Visit(WfUnaryExpression* node)override { writer.BeforePrint(node); writer.WriteString(L"("); switch (node->op) { case WfUnaryOperator::Positive: writer.WriteString(L"+"); break; case WfUnaryOperator::Negative: writer.WriteString(L"-"); break; case WfUnaryOperator::Not: writer.WriteString(L"!"); break; default: CHECK_FAIL(L"Internal error: Unknown value."); } WfPrint(node->operand, indent, writer); writer.WriteString(L")"); writer.AfterPrint(node); } void Visit(WfBinaryExpression* node)override { writer.BeforePrint(node); if (node->op == WfBinaryOperator::Index) { WfPrint(node->first, indent, writer); writer.WriteString(L"["); WfPrint(node->second, indent, writer); writer.WriteString(L"]"); } else { writer.WriteString(L"("); WfPrint(node->first, indent, writer); switch (node->op) { case WfBinaryOperator::Assign: writer.WriteString(L" = "); break; case WfBinaryOperator::FlagAnd: writer.WriteString(L" & "); break; case WfBinaryOperator::FlagOr: writer.WriteString(L" | "); break; case WfBinaryOperator::FailedThen: writer.WriteString(L" ?? "); break; case WfBinaryOperator::Exp: writer.WriteString(L" ^ "); break; case WfBinaryOperator::Add: writer.WriteString(L" + "); break; case WfBinaryOperator::Sub: writer.WriteString(L" - "); break; case WfBinaryOperator::Mul: writer.WriteString(L" * "); break; case WfBinaryOperator::Div: writer.WriteString(L" / "); break; case WfBinaryOperator::Mod: writer.WriteString(L" % "); break; case WfBinaryOperator::Shl: writer.WriteString(L" shl "); break; case WfBinaryOperator::Shr: writer.WriteString(L" shr "); break; case WfBinaryOperator::LT: writer.WriteString(L" < "); break; case WfBinaryOperator::GT: writer.WriteString(L" > "); break; case WfBinaryOperator::LE: writer.WriteString(L" <= "); break; case WfBinaryOperator::GE: writer.WriteString(L" >= "); break; case WfBinaryOperator::EQ: writer.WriteString(L" == "); break; case WfBinaryOperator::NE: writer.WriteString(L" != "); break; case WfBinaryOperator::Xor: writer.WriteString(L" xor "); break; case WfBinaryOperator::And: writer.WriteString(L" and "); break; case WfBinaryOperator::Or: writer.WriteString(L" or "); break; default: CHECK_FAIL(L"Internal error: Unknown value."); } WfPrint(node->second, indent, writer); writer.WriteString(L")"); } writer.AfterPrint(node); } void Visit(WfLetExpression* node)override { writer.BeforePrint(node); writer.WriteString(L"let "); for (auto [var, index] : indexed(node->variables)) { if (index > 0) { writer.WriteString(L", "); } writer.BeforePrint(var.Obj()); writer.WriteString(var->name.value); writer.WriteString(L" = "); WfPrint(var->value, indent, writer); writer.AfterPrint(var.Obj()); } writer.WriteString(L" in ("); WfPrint(node->expression, indent, writer); writer.WriteString(L")"); writer.AfterPrint(node); } void Visit(WfIfExpression* node)override { writer.BeforePrint(node); WfPrint(node->condition, indent, writer); writer.WriteString(L" ? "); WfPrint(node->trueBranch, indent, writer); writer.WriteString(L" : "); WfPrint(node->falseBranch, indent, writer); writer.AfterPrint(node); } void Visit(WfRangeExpression* node)override { writer.BeforePrint(node); writer.WriteString(L"range "); switch (node->beginBoundary) { case WfRangeBoundary::Exclusive: writer.WriteString(L"("); break; case WfRangeBoundary::Inclusive: writer.WriteString(L"["); break; default: CHECK_FAIL(L"Internal error: Unknown value."); } WfPrint(node->begin, indent, writer); writer.WriteString(L", "); WfPrint(node->end, indent, writer); switch (node->beginBoundary) { case WfRangeBoundary::Exclusive: writer.WriteString(L")"); break; case WfRangeBoundary::Inclusive: writer.WriteString(L"]"); break; default: CHECK_FAIL(L"Internal error: Unknown value."); } writer.AfterPrint(node); } void Visit(WfSetTestingExpression* node)override { writer.BeforePrint(node); WfPrint(node->element, indent, writer); switch (node->test) { case WfSetTesting::In: writer.WriteString(L" in "); break; case WfSetTesting::NotIn: writer.WriteString(L" not in "); break; default: CHECK_FAIL(L"Internal error: Unknown value."); } WfPrint(node->collection, indent, writer); writer.AfterPrint(node); } void Visit(WfConstructorExpression* node)override { writer.BeforePrint(node); writer.WriteString(L"{"); for (auto [argument, index] : indexed(node->arguments)) { if (index > 0) { writer.WriteString(L" "); } WfPrint(argument->key, indent, writer); if (argument->value) { writer.WriteString(L" : "); WfPrint(argument->value, indent, writer); } writer.WriteString(L";"); } writer.WriteString(L"}"); writer.AfterPrint(node); } void Visit(WfInferExpression* node)override { writer.BeforePrint(node); WfPrint(node->expression, indent, writer); writer.WriteString(L" of ("); WfPrint(node->type, indent, writer); writer.WriteString(L")"); writer.AfterPrint(node); } void Visit(WfTypeCastingExpression* node)override { writer.BeforePrint(node); switch (node->strategy) { case WfTypeCastingStrategy::Strong: writer.WriteString(L"(cast ("); WfPrint(node->type, indent, writer); writer.WriteString(L") "); WfPrint(node->expression, indent, writer); writer.WriteString(L")"); break; case WfTypeCastingStrategy::Weak: writer.WriteString(L"("); WfPrint(node->expression, indent, writer); writer.WriteString(L" as ("); WfPrint(node->type, indent, writer); writer.WriteString(L"))"); break; default: CHECK_FAIL(L"Internal error: Unknown value."); } writer.AfterPrint(node); } void Visit(WfTypeTestingExpression* node)override { writer.BeforePrint(node); WfPrint(node->expression, indent, writer); switch (node->test) { case WfTypeTesting::IsType: writer.WriteString(L" is ("); WfPrint(node->type, indent, writer); writer.WriteString(L")"); break; case WfTypeTesting::IsNotType: writer.WriteString(L" is not ("); WfPrint(node->type, indent, writer); writer.WriteString(L")"); break; case WfTypeTesting::IsNull: writer.WriteString(L" is null"); break; case WfTypeTesting::IsNotNull: writer.WriteString(L" is not null"); break; default: CHECK_FAIL(L"Internal error: Unknown value."); } writer.AfterPrint(node); } void Visit(WfTypeOfTypeExpression* node)override { writer.BeforePrint(node); writer.WriteString(L"typeof("); WfPrint(node->type, indent, writer); writer.WriteString(L")"); writer.AfterPrint(node); } void Visit(WfTypeOfExpressionExpression* node)override { writer.BeforePrint(node); writer.WriteString(L"type("); WfPrint(node->expression, indent, writer); writer.WriteString(L")"); writer.AfterPrint(node); } void Visit(WfAttachEventExpression* node)override { writer.BeforePrint(node); writer.WriteString(L"attach("); WfPrint(node->event, indent, writer); writer.WriteString(L", "); WfPrint(node->function, indent, writer); writer.WriteString(L")"); writer.AfterPrint(node); } void Visit(WfDetachEventExpression* node)override { writer.BeforePrint(node); writer.WriteString(L"detach("); WfPrint(node->event, indent, writer); writer.WriteString(L", "); WfPrint(node->handler, indent, writer); writer.WriteString(L")"); writer.AfterPrint(node); } void Visit(WfObserveExpression* node)override { writer.BeforePrint(node); WfPrint(node->parent, indent, writer); writer.WriteString(L".observe"); switch (node->observeType) { case WfObserveType::ExtendedObserve: writer.WriteString(L" as "); writer.WriteString(node->name.value); break; case WfObserveType::SimpleObserve: break; default: CHECK_FAIL(L"Internal error: Unknown value."); } writer.WriteString(L"("); WfPrint(node->expression, indent, writer); if (node->events.Count() > 0) { writer.WriteString(L" on "); for (auto [argument, index] : indexed(node->events)) { if (index > 0) { writer.WriteString(L", "); } WfPrint(argument, indent, writer); } } writer.WriteString(L")"); writer.AfterPrint(node); } void Visit(WfCallExpression* node)override { writer.BeforePrint(node); WfPrint(node->function, indent, writer); writer.WriteString(L"("); for (auto [argument, index] : indexed(node->arguments)) { if (index > 0) { writer.WriteString(L", "); } WfPrint(argument, indent, writer); } writer.WriteString(L")"); writer.AfterPrint(node); } void Visit(WfFunctionExpression* node)override { writer.BeforePrint(node); WfPrint(Ptr(node->function), indent, writer); writer.AfterPrint(node); } void Visit(WfNewClassExpression* node)override { writer.BeforePrint(node); writer.WriteString(L"new ("); WfPrint(node->type, indent, writer); writer.WriteString(L")"); writer.WriteString(L"("); for (auto [argument, index] : indexed(node->arguments)) { if (index > 0) { writer.WriteString(L", "); } WfPrint(argument, indent, writer); } writer.WriteString(L")"); writer.AfterPrint(node); } void Visit(WfNewInterfaceExpression* node)override { writer.BeforePrint(node); writer.WriteString(L"new ("); WfPrint(node->type, indent, writer); writer.WriteString(L")"); writer.WriteLine(L""); writer.WriteString(indent); writer.WriteLine(L"{"); for (auto [decl, index] : indexed(node->declarations)) { if (index > 0) { writer.WriteLine(L""); } writer.WriteString(indent + L" "); WfPrint(decl, indent + L" ", writer); writer.WriteLine(L""); } writer.WriteString(indent); writer.WriteString(L"}"); writer.AfterPrint(node); } void Visit(WfVirtualCfeExpression* node)override { if (node->expandedExpression) { writer.BeforePrint(node); WfPrint(node->expandedExpression, indent, writer); writer.AfterPrint(node); } else { node->Accept((WfVirtualCfeExpression::IVisitor*)this); } } void Visit(WfFormatExpression* node)override { writer.BeforePrint(node); writer.WriteString(L"$"); EscapeString(node->value.value, writer); writer.AfterPrint(node); } void Visit(WfVirtualCseExpression* node)override { if (node->expandedExpression) { writer.BeforePrint(node); WfPrint(node->expandedExpression, indent, writer); writer.AfterPrint(node); } else { node->Accept((WfVirtualCseExpression::IVisitor*)this); } } void Visit(WfBindExpression* node)override { writer.BeforePrint(node); writer.WriteString(L"bind("); WfPrint(node->expression, indent, writer); writer.WriteString(L")"); writer.AfterPrint(node); } void Visit(WfNewCoroutineExpression* node)override { writer.BeforePrint(node); if (node->name.value == L"") { writer.WriteLine(L"$coroutine"); } else { writer.WriteString(L"$coroutine("); writer.WriteString(node->name.value); writer.WriteLine(L")"); } writer.WriteString(indent); WfPrint(node->statement, indent, writer); writer.AfterPrint(node); } void Visit(WfMixinCastExpression* node)override { writer.BeforePrint(node); writer.WriteString(L"new ("); WfPrint(node->type, indent, writer); writer.WriteString(L")"); writer.WriteString(L"(using "); WfPrint(node->expression, indent, writer); writer.WriteString(L")"); writer.AfterPrint(node); } void Visit(WfExpectedTypeCastExpression* node)override { writer.BeforePrint(node); switch (node->strategy) { case WfTypeCastingStrategy::Strong: writer.WriteString(L"(cast * "); WfPrint(node->expression, indent, writer); writer.WriteString(L")"); break; case WfTypeCastingStrategy::Weak: writer.WriteString(L"("); WfPrint(node->expression, indent, writer); writer.WriteString(L" as *)"); break; default: CHECK_FAIL(L"Internal error: Unknown value."); } writer.AfterPrint(node); } void Visit(WfCoOperatorExpression* node)override { writer.BeforePrint(node); writer.WriteString(L"$."); writer.WriteString(node->name.value); writer.AfterPrint(node); } }; /*********************************************************************** Print (Statement) ***********************************************************************/ class PrintStatementVisitor : public Object , public WfStatement::IVisitor , public WfVirtualCseStatement::IVisitor , public WfCoroutineStatement::IVisitor , public WfStateMachineStatement::IVisitor { public: WString indent; ParsingWriter& writer; PrintStatementVisitor(const WString& _indent, ParsingWriter& _writer) :indent(_indent), writer(_writer) { } void Visit(WfBreakStatement* node)override { writer.BeforePrint(node); writer.WriteString(L"break;"); writer.AfterPrint(node); } void Visit(WfContinueStatement* node)override { writer.BeforePrint(node); writer.WriteString(L"continue;"); writer.AfterPrint(node); } void Visit(WfReturnStatement* node)override { writer.BeforePrint(node); if (node->expression) { writer.WriteString(L"return "); WfPrint(node->expression, indent, writer); writer.WriteString(L";"); } else { writer.WriteString(L"return;"); } writer.AfterPrint(node); } void Visit(WfDeleteStatement* node)override { writer.BeforePrint(node); writer.WriteString(L"delete "); WfPrint(node->expression, indent, writer); writer.WriteString(L";"); writer.AfterPrint(node); } void Visit(WfRaiseExceptionStatement* node)override { writer.BeforePrint(node); if (node->expression) { writer.WriteString(L"raise "); WfPrint(node->expression, indent, writer); writer.WriteString(L";"); } else { writer.WriteString(L"raise;"); } writer.AfterPrint(node); } void Visit(WfIfStatement* node)override { writer.BeforePrint(node); writer.WriteString(L"if ("); if (node->type) { writer.WriteString(L"var "); writer.WriteString(node->name.value); writer.WriteString(L" : "); WfPrint(node->type, indent, writer); writer.WriteString(L" = "); } WfPrint(node->expression, indent, writer); writer.WriteLine(L")"); writer.WriteString(indent); WfPrint(node->trueBranch, indent, writer); if (node->falseBranch) { writer.WriteLine(L""); writer.WriteString(indent); if (node->falseBranch.Cast()) { writer.WriteString(L"else "); WfPrint(node->falseBranch, indent, writer); } else { writer.WriteLine(L"else"); writer.WriteString(indent); WfPrint(node->falseBranch, indent, writer); } } writer.AfterPrint(node); } void Visit(WfWhileStatement* node)override { writer.BeforePrint(node); writer.WriteString(L"while ("); WfPrint(node->condition, indent, writer); writer.WriteLine(L")"); writer.WriteString(indent); WfPrint(node->statement, indent, writer); writer.AfterPrint(node); } void Visit(WfTryStatement* node)override { writer.BeforePrint(node); writer.WriteLine(L"try"); writer.WriteString(indent); WfPrint(node->protectedStatement, indent, writer); if (node->catchStatement) { writer.WriteLine(L""); writer.WriteString(indent); writer.WriteString(L"catch ("); writer.WriteString(node->name.value); writer.WriteLine(L")"); writer.WriteString(indent); WfPrint(node->catchStatement, indent, writer); } if (node->finallyStatement) { writer.WriteLine(L""); writer.WriteString(indent); writer.WriteLine(L"finally"); writer.WriteString(indent); WfPrint(node->finallyStatement, indent, writer); } writer.AfterPrint(node); } void Visit(WfBlockStatement* node)override { writer.BeforePrint(node); writer.WriteLine(L"{"); for (auto statement : node->statements) { writer.WriteString(indent + L" "); WfPrint(statement, indent + L" ", writer); writer.WriteLine(L""); } if (node->endLabel.value != L"") { writer.WriteString(indent + L" "); writer.WriteString(node->endLabel.value); writer.WriteLine(L":;"); } writer.WriteString(indent); writer.WriteString(L"}"); writer.AfterPrint(node); } void Visit(WfGotoStatement* node)override { writer.BeforePrint(node); writer.WriteString(L"goto "); writer.WriteString(node->label.value); writer.WriteString(L";"); writer.AfterPrint(node); } void Visit(WfExpressionStatement* node)override { writer.BeforePrint(node); WfPrint(node->expression, indent, writer); writer.WriteString(L";"); writer.AfterPrint(node); } void Visit(WfVariableStatement* node)override { writer.BeforePrint(node); WfPrint(Ptr(node->variable), indent, writer); writer.AfterPrint(node); } void Visit(WfVirtualCseStatement* node)override { if (node->expandedStatement) { writer.BeforePrint(node); WfPrint(node->expandedStatement, indent, writer); writer.AfterPrint(node); } else { node->Accept((WfVirtualCseStatement::IVisitor*)this); } } void Visit(WfSwitchStatement* node)override { writer.BeforePrint(node); writer.WriteString(L"switch ("); WfPrint(node->expression, indent, writer); writer.WriteLine(L")"); writer.WriteString(indent); writer.WriteLine(L"{"); for (auto switchCase : node->caseBranches) { writer.BeforePrint(switchCase.Obj()); writer.WriteString(indent); writer.WriteString(L" case "); WfPrint(switchCase->expression, indent, writer); writer.WriteLine(L":"); writer.WriteString(indent + L" "); WfPrint(switchCase->statement, indent + L" ", writer); writer.AfterPrint(switchCase.Obj()); writer.WriteLine(L""); } if (node->defaultBranch) { writer.WriteString(indent); writer.WriteLine(L" default:"); writer.WriteString(indent + L" "); WfPrint(node->defaultBranch, indent + L" ", writer); writer.WriteLine(L""); } writer.WriteString(indent); writer.WriteString(L"}"); writer.AfterPrint(node); } void Visit(WfForEachStatement* node)override { writer.BeforePrint(node); writer.WriteString(L"for ("); writer.WriteString(node->name.value); writer.WriteString(L" in "); switch (node->direction) { case WfForEachDirection::Reversed: writer.WriteString(L"reversed "); break; case WfForEachDirection::Normal: break; default: CHECK_FAIL(L"Internal error: Unknown value."); } WfPrint(node->collection, indent, writer); writer.WriteLine(L")"); writer.WriteString(indent); WfPrint(node->statement, indent, writer); writer.AfterPrint(node); } void Visit(WfCoProviderStatement* node)override { writer.BeforePrint(node); if (node->name.value == L"") { writer.WriteString(L"$"); } else { writer.WriteString(node->name.value); writer.WriteString(L" "); } WfPrint(node->statement, indent, writer); writer.AfterPrint(node); } void Visit(WfCoroutineStatement* node)override { node->Accept((WfCoroutineStatement::IVisitor*)this); } void Visit(WfCoPauseStatement* node)override { writer.BeforePrint(node); if (node->statement) { writer.WriteLine(L"$pause"); writer.WriteString(indent); WfPrint(node->statement, indent, writer); } else { writer.WriteString(L"$pause;"); } writer.AfterPrint(node); } void Visit(WfCoOperatorStatement* node)override { if (node->varName.value != L"") { writer.WriteString(L"var "); writer.WriteString(node->varName.value); writer.WriteString(L" = "); } writer.WriteString(node->opName.value); for (auto [argument, index] : indexed(node->arguments)) { writer.WriteString(index == 0 ? L" " : L", "); WfPrint(argument, indent, writer); } writer.WriteString(L";"); } void Visit(WfStateMachineStatement* node)override { node->Accept((WfStateMachineStatement::IVisitor*)this); } void Visit(WfStateSwitchStatement* node)override { writer.BeforePrint(node); writer.WriteString(L"switch ("); switch (node->type) { case WfStateSwitchType::Default: writer.WriteLine(L"raise)"); break; case WfStateSwitchType::Pass: writer.WriteLine(L"continue)"); break; case WfStateSwitchType::PassAndReturn: writer.WriteLine(L"continue, return)"); break; case WfStateSwitchType::Ignore: writer.WriteLine(L")"); break; case WfStateSwitchType::IgnoreAndReturn: writer.WriteLine(L"return)"); break; default: CHECK_FAIL(L"Internal error: Unknown value."); } writer.WriteString(indent); writer.WriteLine(L"{"); for (auto switchCase : node->caseBranches) { writer.BeforePrint(switchCase.Obj()); writer.WriteString(indent); writer.WriteString(L" case "); writer.WriteString(switchCase->name.value); writer.WriteString(L"("); for (auto [argument, index] : indexed(switchCase->arguments)) { if (index != 0) writer.WriteString(L", "); writer.BeforePrint(argument.Obj()); writer.WriteString(argument->name.value); writer.AfterPrint(argument.Obj()); } writer.WriteLine(L"):"); writer.WriteString(indent + L" "); WfPrint(switchCase->statement, indent + L" ", writer); writer.AfterPrint(switchCase.Obj()); writer.WriteLine(L""); } writer.WriteString(indent); writer.WriteString(L"}"); writer.AfterPrint(node); } void Visit(WfStateInvokeStatement* node)override { writer.BeforePrint(node); switch (node->type) { case WfStateInvokeType::Goto: writer.WriteString(L"$goto_state "); break; case WfStateInvokeType::Push: writer.WriteString(L"push_state "); break; default: CHECK_FAIL(L"Internal error: Unknown value."); } writer.WriteString(node->name.value); writer.WriteString(L"("); for (auto [argument, index] : indexed(node->arguments)) { if (index != 0) writer.WriteString(L", "); WfPrint(argument, indent, writer); } writer.WriteString(L");"); writer.AfterPrint(node); } }; /*********************************************************************** Print (Declaration) ***********************************************************************/ class PrintDeclarationVisitor : public Object , public WfDeclaration::IVisitor , public WfVirtualCfeDeclaration::IVisitor , public WfVirtualCseDeclaration::IVisitor { public: WString indent; ParsingWriter& writer; PrintDeclarationVisitor(const WString& _indent, ParsingWriter& _writer) :indent(_indent), writer(_writer) { } void Visit(WfNamespaceDeclaration* node)override { writer.BeforePrint(node); writer.WriteLine(L"namespace " + node->name.value); writer.WriteString(indent); writer.WriteLine(L"{"); for (auto [decl, index] : indexed(node->declarations)) { if (index != 0) { writer.WriteLine(L""); } writer.WriteString(indent + L" "); WfPrint(decl, indent + L" ", writer); writer.WriteLine(L""); } writer.WriteString(indent); writer.WriteString(L"}"); writer.AfterPrint(node); } void Visit(WfFunctionDeclaration* node)override { switch (node->functionKind) { case WfFunctionKind::Normal: break; case WfFunctionKind::Static: writer.WriteString(L"static "); break; case WfFunctionKind::Override: writer.WriteString(L"override "); break; default: CHECK_FAIL(L"Internal error: Unknown value."); } writer.BeforePrint(node); writer.WriteString(L"func "); switch (node->anonymity) { case WfFunctionAnonymity::Named: writer.WriteString(node->name.value); break; case WfFunctionAnonymity::Anonymous: break; default: CHECK_FAIL(L"Internal error: Unknown value."); } writer.WriteString(L"("); for (auto [argument, index] : indexed(node->arguments)) { if (index > 0) { writer.WriteString(L", "); } writer.BeforePrint(argument.Obj()); for (auto attribute : argument->attributes) { WfPrint(attribute, indent, writer); writer.WriteString(L" "); } writer.WriteString(argument->name.value); writer.WriteString(L" : "); WfPrint(argument->type, indent, writer); writer.AfterPrint(argument.Obj()); } writer.WriteString(L")"); writer.WriteString(L" : ("); WfPrint(node->returnType, indent, writer); writer.WriteString(L")"); if (node->statement) { writer.WriteLine(L""); writer.WriteString(indent); WfPrint(node->statement, indent, writer); } else { writer.WriteString(L";"); } writer.AfterPrint(node); } void Visit(WfVariableDeclaration* node)override { writer.BeforePrint(node); writer.WriteString(L"var "); writer.WriteString(node->name.value); if (node->type) { writer.WriteString(L" : "); WfPrint(node->type, indent, writer); } writer.WriteString(L" = "); WfPrint(node->expression, indent, writer); writer.WriteString(L";"); writer.AfterPrint(node); } void Visit(WfEventDeclaration* node)override { writer.BeforePrint(node); writer.WriteString(L"event "); writer.WriteString(node->name.value); writer.WriteString(L"("); for (auto [type, index] : indexed(node->arguments)) { if (index != 0) { writer.WriteString(L", "); } WfPrint(type, indent, writer); } writer.WriteString(L");"); writer.AfterPrint(node); } void Visit(WfPropertyDeclaration* node)override { writer.BeforePrint(node); writer.WriteString(L"prop "); writer.WriteString(node->name.value); writer.WriteString(L" : "); WfPrint(node->type, indent, writer); writer.WriteString(L"{"); writer.WriteString(node->getter.value); if (node->setter.value != L"") { writer.WriteString(L", "); writer.WriteString(node->setter.value); } if (node->valueChangedEvent.value != L"") { writer.WriteString(L" : "); writer.WriteString(node->valueChangedEvent.value); } writer.WriteString(L"}"); writer.AfterPrint(node); } void Visit(WfStaticInitDeclaration* node)override { writer.BeforePrint(node); writer.WriteLine(L"static"); writer.WriteString(indent); WfPrint(node->statement, indent, writer); writer.AfterPrint(node); } void Visit(WfConstructorDeclaration* node)override { writer.BeforePrint(node); switch (node->constructorType) { case WfConstructorType::RawPtr: writer.WriteString(L"new* "); break; case WfConstructorType::SharedPtr: writer.WriteString(L"new "); break; default: CHECK_FAIL(L"Internal error: Unknown value."); } writer.WriteString(L"("); for (auto [argument, index] : indexed(node->arguments)) { if (index > 0) { writer.WriteString(L", "); } writer.BeforePrint(argument.Obj()); writer.WriteString(argument->name.value); writer.WriteString(L" : "); WfPrint(argument->type, indent, writer); writer.AfterPrint(argument.Obj()); } writer.WriteString(L")"); for (auto [call, callIndex] : indexed(node->baseConstructorCalls)) { writer.WriteLine(L""); writer.WriteString(indent + L" "); if (callIndex == 0) { writer.WriteString(L":"); } else { writer.WriteString(L","); } writer.BeforePrint(call.Obj()); WfPrint(call->type, indent + L" ", writer); writer.WriteString(L"("); for (auto [argument, argumentIndex] : indexed(call->arguments)) { if (argumentIndex != 0) { writer.WriteString(L", "); } WfPrint(argument, indent + L" ", writer); } writer.WriteString(L")"); writer.AfterPrint(call.Obj()); } writer.WriteLine(L""); writer.WriteString(indent); WfPrint(node->statement, indent, writer); writer.AfterPrint(node); } void Visit(WfDestructorDeclaration* node)override { writer.BeforePrint(node); writer.WriteLine(L"delete"); writer.WriteString(indent); WfPrint(node->statement, indent, writer); writer.AfterPrint(node); } void Visit(WfClassDeclaration* node)override { writer.BeforePrint(node); switch (node->kind) { case WfClassKind::Class: writer.WriteString(L"class "); break; case WfClassKind::Interface: writer.WriteString(L"interface "); break; default: CHECK_FAIL(L"Internal error: Unknown value."); } writer.WriteString(node->name.value); switch (node->kind) { case WfClassKind::Class: switch (node->constructorType) { case WfConstructorType::Undefined: break; default: CHECK_FAIL(L"Internal error: Unknown value."); } break; case WfClassKind::Interface: switch (node->constructorType) { case WfConstructorType::RawPtr: writer.WriteString(L"*"); case WfConstructorType::SharedPtr: break; default: CHECK_FAIL(L"Internal error: Unknown value."); } break; default:; } for (auto [type, index] : indexed(node->baseTypes)) { if (index == 0) { writer.WriteString(L" : "); } else { writer.WriteString(L", "); } WfPrint(type, indent, writer); } writer.WriteLine(L""); writer.WriteLine(indent + L"{"); for (auto [decl, index] : indexed(node->declarations)) { if (index > 0) { writer.WriteLine(L""); } writer.WriteString(indent + L" "); WfPrint(decl, indent + L" ", writer); writer.WriteLine(L""); } writer.WriteString(indent + L"}"); writer.AfterPrint(node); } void Visit(WfEnumDeclaration* node)override { writer.BeforePrint(node); switch (node->kind) { case WfEnumKind::Normal: writer.WriteString(L"enum "); break; case WfEnumKind::Flag: writer.WriteString(L"flagenum "); break; default: CHECK_FAIL(L"Internal error: Unknown value."); } writer.WriteLine(node->name.value); writer.WriteLine(indent + L"{"); auto newIndent = indent + L" "; for (auto item : node->items) { writer.BeforePrint(item.Obj()); for (auto attribute : item->attributes) { writer.WriteString(newIndent); WfPrint(attribute, newIndent, writer); writer.WriteLine(L""); } writer.WriteString(newIndent); writer.WriteString(item->name.value); writer.WriteString(L" = "); switch (item->kind) { case WfEnumItemKind::Constant: writer.WriteString(item->number.value); break; case WfEnumItemKind::Intersection: for (auto [itemInt, index] : indexed(item->intersections)) { if (index != 0)writer.WriteString(L" | "); writer.WriteString(itemInt->name.value); } break; default: CHECK_FAIL(L"Internal error: Unknown value."); } writer.AfterPrint(item.Obj()); writer.WriteLine(L","); } writer.WriteString(indent + L"}"); writer.AfterPrint(node); } void Visit(WfStructDeclaration* node)override { writer.BeforePrint(node); writer.WriteString(L"struct "); writer.WriteLine(node->name.value); writer.WriteLine(indent + L"{"); auto newIndent = indent + L" "; for (auto member : node->members) { writer.BeforePrint(member.Obj()); for (auto attribute : member->attributes) { writer.WriteString(newIndent); WfPrint(attribute, newIndent, writer); writer.WriteLine(L""); } writer.WriteString(newIndent); writer.WriteString(member->name.value); writer.WriteString(L" : "); WfPrint(member->type, newIndent, writer); writer.WriteLine(L";"); writer.AfterPrint(member.Obj()); } writer.WriteString(indent + L"}"); writer.AfterPrint(node); } void PrintExpandedDeclarations(List>& decls) { for (auto [decl, index] : indexed(decls)) { if (index > 0) { writer.WriteLine(L""); writer.WriteString(indent); } WfPrint(decl, indent, writer); if (index < decls.Count() - 1) { writer.WriteLine(L""); } } } void Visit(WfVirtualCfeDeclaration* node)override { if (node->expandedDeclarations.Count() > 0) { writer.BeforePrint(node); PrintExpandedDeclarations(node->expandedDeclarations); writer.AfterPrint(node); } else { node->Accept(static_cast(this)); } } void Visit(WfAutoPropertyDeclaration* node)override { switch (node->functionKind) { case WfFunctionKind::Normal: break; case WfFunctionKind::Static: writer.WriteString(L"static "); break; case WfFunctionKind::Override: writer.WriteString(L"override "); break; default: CHECK_FAIL(L"Internal error: Unknown value."); } writer.BeforePrint(node); writer.WriteString(L"prop "); writer.WriteString(node->name.value); writer.WriteString(L" : "); WfPrint(node->type, indent, writer); if (node->expression) { writer.WriteString(L" = "); WfPrint(node->expression, indent, writer); } writer.WriteString(L" {"); switch (node->configConst) { case WfAPConst::Readonly: switch (node->configObserve) { case WfAPObserve::NotObservable: writer.WriteString(L"const, not observe"); break; case WfAPObserve::Observable: writer.WriteString(L"const"); break; default: CHECK_FAIL(L"Internal error: Unknown value."); } break; case WfAPConst::Writable: switch (node->configObserve) { case WfAPObserve::NotObservable: writer.WriteString(L"not observe"); break; case WfAPObserve::Observable: break; default: CHECK_FAIL(L"Internal error: Unknown value."); } break; default: CHECK_FAIL(L"Internal error: Unknown value."); } writer.WriteString(L"}"); writer.AfterPrint(node); } void Visit(WfCastResultInterfaceDeclaration* node)override { writer.BeforePrint(node); writer.WriteString(L"$interface "); writer.WriteString(node->name.value); writer.WriteString(L" : "); WfPrint(node->baseType, indent, writer); writer.WriteString(L"<"); WfPrint(node->elementType, indent, writer); writer.WriteString(L">;"); writer.AfterPrint(node); } void Visit(WfVirtualCseDeclaration* node)override { if (node->expandedDeclarations.Count() > 0) { writer.BeforePrint(node); PrintExpandedDeclarations(node->expandedDeclarations); writer.AfterPrint(node); } else { node->Accept(static_cast(this)); } } void Visit(WfStateMachineDeclaration* node)override { writer.BeforePrint(node); writer.WriteLine(L"$state_machine"); writer.WriteLine(indent + L"{"); for (auto [input, index] : indexed(node->inputs)) { if (index != 0) writer.WriteLine(L""); writer.BeforePrint(input.Obj()); writer.WriteString(indent + L" $state_input "); writer.WriteString(input->name.value); writer.WriteString(L"("); for (auto [argument, index] : indexed(input->arguments)) { if (index > 0) { writer.WriteString(L", "); } writer.BeforePrint(argument.Obj()); writer.WriteString(argument->name.value); writer.WriteString(L" : "); WfPrint(argument->type, indent, writer); writer.AfterPrint(argument.Obj()); } writer.WriteLine(L");"); writer.AfterPrint(input.Obj()); } for (auto [state, index] : indexed(node->states)) { if (index != 0 || node->inputs.Count() > 0) writer.WriteLine(L""); writer.BeforePrint(state.Obj()); writer.WriteString(indent + L" $state "); if (state->name.value == L"") { writer.WriteString(L"default"); } else { writer.WriteString(state->name.value); } writer.WriteString(L"("); for (auto [argument, index] : indexed(state->arguments)) { if (index > 0) { writer.WriteString(L", "); } writer.BeforePrint(argument.Obj()); writer.WriteString(argument->name.value); writer.WriteString(L" : "); WfPrint(argument->type, indent, writer); writer.AfterPrint(argument.Obj()); } writer.WriteLine(L")"); writer.WriteString(indent + L" "); WfPrint(state->statement, indent + L" ", writer); writer.AfterPrint(state.Obj()); writer.WriteLine(L""); } writer.WriteString(indent + L"}"); writer.AfterPrint(node); } }; /*********************************************************************** Print (Module) ***********************************************************************/ void WfPrint(Ptr node, const WString& indent, glr::ParsingWriter& writer) { writer.BeforePrint(node.Obj()); writer.WriteString(L"@"); writer.WriteString(node->category.value); writer.WriteString(L":"); writer.WriteString(node->name.value); if (node->value) { writer.WriteString(L"("); WfPrint(node->value, indent, writer); writer.WriteString(L")"); } writer.AfterPrint(node.Obj()); } void WfPrint(Ptr node, const WString& indent, glr::ParsingWriter& writer) { PrintTypeVisitor visitor(indent, writer); node->Accept(&visitor); } void WfPrint(Ptr node, const WString& indent, glr::ParsingWriter& writer) { PrintExpressionVisitor visitor(indent, writer); node->Accept(&visitor); } void WfPrint(Ptr node, const WString& indent, glr::ParsingWriter& writer) { PrintStatementVisitor visitor(indent, writer); node->Accept(&visitor); } void WfPrint(Ptr node, const WString& indent, glr::ParsingWriter& writer) { for (auto attribute : node->attributes) { WfPrint(attribute, indent, writer); writer.WriteLine(L""); writer.WriteString(indent); } PrintDeclarationVisitor visitor(indent, writer); node->Accept(&visitor); } void WfPrint(Ptr node, const WString& indent, glr::ParsingWriter& writer) { writer.WriteString(indent); switch (node->moduleType) { case WfModuleType::Module: writer.WriteLine(L"module " + node->name.value + L";"); break; case WfModuleType::Unit: writer.WriteLine(L"unit " + node->name.value + L";"); break; default: CHECK_FAIL(L"Internal error: Unknown value."); } for (auto path : node->paths) { writer.WriteString(indent); writer.WriteString(L"using "); for (auto [item, index] : indexed(path->items)) { if (index > 0) { writer.WriteString(L"::"); } for (auto fragment : item->fragments) { if (auto name = fragment.Cast()) { writer.WriteString(name->name.value); } else { writer.WriteString(L"*"); } } } writer.WriteLine(L";"); } for (auto decl : node->declarations) { writer.WriteLine(L""); writer.WriteString(indent); WfPrint(decl, indent, writer); writer.WriteLine(L""); } } /*********************************************************************** Print (Module) ***********************************************************************/ void WfPrint(Ptr node, const WString& indent, stream::TextWriter& writer) { ParsingWriter parsingWriter(writer); WfPrint(node, indent, parsingWriter); } void WfPrint(Ptr node, const WString& indent, stream::TextWriter& writer) { ParsingWriter parsingWriter(writer); WfPrint(node, indent, parsingWriter); } void WfPrint(Ptr node, const WString& indent, stream::TextWriter& writer) { ParsingWriter parsingWriter(writer); WfPrint(node, indent, parsingWriter); } void WfPrint(Ptr node, const WString& indent, stream::TextWriter& writer) { ParsingWriter parsingWriter(writer); WfPrint(node, indent, parsingWriter); } void WfPrint(Ptr node, const WString& indent, stream::TextWriter& writer) { ParsingWriter parsingWriter(writer); WfPrint(node, indent, parsingWriter); } void WfPrint(Ptr node, const WString& indent, stream::TextWriter& writer) { ParsingWriter parsingWriter(writer); WfPrint(node, indent, parsingWriter); } } } /*********************************************************************** .\PARSER\GENERATED\WORKFLOWAST.CPP ***********************************************************************/ /*********************************************************************** This file is generated by: Vczh Parser Generator From parser definition:Ast Licensed under https://github.com/vczh-libraries/License ***********************************************************************/ namespace vl::workflow { /*********************************************************************** Visitor Pattern Implementation ***********************************************************************/ void WfPredefinedType::Accept(WfType::IVisitor* visitor) { visitor->Visit(this); } void WfTopQualifiedType::Accept(WfType::IVisitor* visitor) { visitor->Visit(this); } void WfReferenceType::Accept(WfType::IVisitor* visitor) { visitor->Visit(this); } void WfRawPointerType::Accept(WfType::IVisitor* visitor) { visitor->Visit(this); } void WfSharedPointerType::Accept(WfType::IVisitor* visitor) { visitor->Visit(this); } void WfNullableType::Accept(WfType::IVisitor* visitor) { visitor->Visit(this); } void WfEnumerableType::Accept(WfType::IVisitor* visitor) { visitor->Visit(this); } void WfMapType::Accept(WfType::IVisitor* visitor) { visitor->Visit(this); } void WfObservableListType::Accept(WfType::IVisitor* visitor) { visitor->Visit(this); } void WfFunctionType::Accept(WfType::IVisitor* visitor) { visitor->Visit(this); } void WfChildType::Accept(WfType::IVisitor* visitor) { visitor->Visit(this); } void WfNamespaceDeclaration::Accept(WfDeclaration::IVisitor* visitor) { visitor->Visit(this); } void WfFunctionDeclaration::Accept(WfDeclaration::IVisitor* visitor) { visitor->Visit(this); } void WfVariableDeclaration::Accept(WfDeclaration::IVisitor* visitor) { visitor->Visit(this); } void WfEventDeclaration::Accept(WfDeclaration::IVisitor* visitor) { visitor->Visit(this); } void WfPropertyDeclaration::Accept(WfDeclaration::IVisitor* visitor) { visitor->Visit(this); } void WfStaticInitDeclaration::Accept(WfDeclaration::IVisitor* visitor) { visitor->Visit(this); } void WfConstructorDeclaration::Accept(WfDeclaration::IVisitor* visitor) { visitor->Visit(this); } void WfDestructorDeclaration::Accept(WfDeclaration::IVisitor* visitor) { visitor->Visit(this); } void WfClassDeclaration::Accept(WfDeclaration::IVisitor* visitor) { visitor->Visit(this); } void WfEnumDeclaration::Accept(WfDeclaration::IVisitor* visitor) { visitor->Visit(this); } void WfStructDeclaration::Accept(WfDeclaration::IVisitor* visitor) { visitor->Visit(this); } void WfVirtualCfeDeclaration::Accept(WfDeclaration::IVisitor* visitor) { visitor->Visit(this); } void WfAutoPropertyDeclaration::Accept(WfVirtualCfeDeclaration::IVisitor* visitor) { visitor->Visit(this); } void WfCastResultInterfaceDeclaration::Accept(WfVirtualCfeDeclaration::IVisitor* visitor) { visitor->Visit(this); } void WfVirtualCseDeclaration::Accept(WfDeclaration::IVisitor* visitor) { visitor->Visit(this); } void WfStateMachineDeclaration::Accept(WfVirtualCseDeclaration::IVisitor* visitor) { visitor->Visit(this); } void WfBreakStatement::Accept(WfStatement::IVisitor* visitor) { visitor->Visit(this); } void WfContinueStatement::Accept(WfStatement::IVisitor* visitor) { visitor->Visit(this); } void WfReturnStatement::Accept(WfStatement::IVisitor* visitor) { visitor->Visit(this); } void WfDeleteStatement::Accept(WfStatement::IVisitor* visitor) { visitor->Visit(this); } void WfRaiseExceptionStatement::Accept(WfStatement::IVisitor* visitor) { visitor->Visit(this); } void WfIfStatement::Accept(WfStatement::IVisitor* visitor) { visitor->Visit(this); } void WfWhileStatement::Accept(WfStatement::IVisitor* visitor) { visitor->Visit(this); } void WfTryStatement::Accept(WfStatement::IVisitor* visitor) { visitor->Visit(this); } void WfBlockStatement::Accept(WfStatement::IVisitor* visitor) { visitor->Visit(this); } void WfGotoStatement::Accept(WfStatement::IVisitor* visitor) { visitor->Visit(this); } void WfVariableStatement::Accept(WfStatement::IVisitor* visitor) { visitor->Visit(this); } void WfExpressionStatement::Accept(WfStatement::IVisitor* visitor) { visitor->Visit(this); } void WfVirtualCseStatement::Accept(WfStatement::IVisitor* visitor) { visitor->Visit(this); } void WfForEachStatement::Accept(WfVirtualCseStatement::IVisitor* visitor) { visitor->Visit(this); } void WfSwitchStatement::Accept(WfVirtualCseStatement::IVisitor* visitor) { visitor->Visit(this); } void WfCoProviderStatement::Accept(WfVirtualCseStatement::IVisitor* visitor) { visitor->Visit(this); } void WfCoroutineStatement::Accept(WfStatement::IVisitor* visitor) { visitor->Visit(this); } void WfCoPauseStatement::Accept(WfCoroutineStatement::IVisitor* visitor) { visitor->Visit(this); } void WfCoOperatorStatement::Accept(WfCoroutineStatement::IVisitor* visitor) { visitor->Visit(this); } void WfStateMachineStatement::Accept(WfStatement::IVisitor* visitor) { visitor->Visit(this); } void WfStateSwitchStatement::Accept(WfStateMachineStatement::IVisitor* visitor) { visitor->Visit(this); } void WfStateInvokeStatement::Accept(WfStateMachineStatement::IVisitor* visitor) { visitor->Visit(this); } void WfThisExpression::Accept(WfExpression::IVisitor* visitor) { visitor->Visit(this); } void WfTopQualifiedExpression::Accept(WfExpression::IVisitor* visitor) { visitor->Visit(this); } void WfReferenceExpression::Accept(WfExpression::IVisitor* visitor) { visitor->Visit(this); } void WfOrderedNameExpression::Accept(WfExpression::IVisitor* visitor) { visitor->Visit(this); } void WfOrderedLambdaExpression::Accept(WfExpression::IVisitor* visitor) { visitor->Visit(this); } void WfMemberExpression::Accept(WfExpression::IVisitor* visitor) { visitor->Visit(this); } void WfChildExpression::Accept(WfExpression::IVisitor* visitor) { visitor->Visit(this); } void WfLiteralExpression::Accept(WfExpression::IVisitor* visitor) { visitor->Visit(this); } void WfFloatingExpression::Accept(WfExpression::IVisitor* visitor) { visitor->Visit(this); } void WfIntegerExpression::Accept(WfExpression::IVisitor* visitor) { visitor->Visit(this); } void WfStringExpression::Accept(WfExpression::IVisitor* visitor) { visitor->Visit(this); } void WfUnaryExpression::Accept(WfExpression::IVisitor* visitor) { visitor->Visit(this); } void WfBinaryExpression::Accept(WfExpression::IVisitor* visitor) { visitor->Visit(this); } void WfLetExpression::Accept(WfExpression::IVisitor* visitor) { visitor->Visit(this); } void WfIfExpression::Accept(WfExpression::IVisitor* visitor) { visitor->Visit(this); } void WfRangeExpression::Accept(WfExpression::IVisitor* visitor) { visitor->Visit(this); } void WfSetTestingExpression::Accept(WfExpression::IVisitor* visitor) { visitor->Visit(this); } void WfConstructorExpression::Accept(WfExpression::IVisitor* visitor) { visitor->Visit(this); } void WfInferExpression::Accept(WfExpression::IVisitor* visitor) { visitor->Visit(this); } void WfTypeCastingExpression::Accept(WfExpression::IVisitor* visitor) { visitor->Visit(this); } void WfTypeTestingExpression::Accept(WfExpression::IVisitor* visitor) { visitor->Visit(this); } void WfTypeOfTypeExpression::Accept(WfExpression::IVisitor* visitor) { visitor->Visit(this); } void WfTypeOfExpressionExpression::Accept(WfExpression::IVisitor* visitor) { visitor->Visit(this); } void WfAttachEventExpression::Accept(WfExpression::IVisitor* visitor) { visitor->Visit(this); } void WfDetachEventExpression::Accept(WfExpression::IVisitor* visitor) { visitor->Visit(this); } void WfObserveExpression::Accept(WfExpression::IVisitor* visitor) { visitor->Visit(this); } void WfCallExpression::Accept(WfExpression::IVisitor* visitor) { visitor->Visit(this); } void WfFunctionExpression::Accept(WfExpression::IVisitor* visitor) { visitor->Visit(this); } void WfNewClassExpression::Accept(WfExpression::IVisitor* visitor) { visitor->Visit(this); } void WfNewInterfaceExpression::Accept(WfExpression::IVisitor* visitor) { visitor->Visit(this); } void WfVirtualCfeExpression::Accept(WfExpression::IVisitor* visitor) { visitor->Visit(this); } void WfFormatExpression::Accept(WfVirtualCfeExpression::IVisitor* visitor) { visitor->Visit(this); } void WfVirtualCseExpression::Accept(WfExpression::IVisitor* visitor) { visitor->Visit(this); } void WfBindExpression::Accept(WfVirtualCseExpression::IVisitor* visitor) { visitor->Visit(this); } void WfNewCoroutineExpression::Accept(WfVirtualCseExpression::IVisitor* visitor) { visitor->Visit(this); } void WfMixinCastExpression::Accept(WfVirtualCseExpression::IVisitor* visitor) { visitor->Visit(this); } void WfExpectedTypeCastExpression::Accept(WfVirtualCseExpression::IVisitor* visitor) { visitor->Visit(this); } void WfCoOperatorExpression::Accept(WfVirtualCseExpression::IVisitor* visitor) { visitor->Visit(this); } void WfModuleUsingNameFragment::Accept(WfModuleUsingFragment::IVisitor* visitor) { visitor->Visit(this); } void WfModuleUsingWildCardFragment::Accept(WfModuleUsingFragment::IVisitor* visitor) { visitor->Visit(this); } } namespace vl::reflection::description { #ifndef VCZH_DEBUG_NO_REFLECTION IMPL_TYPE_INFO_RENAME(vl::workflow::WfType, system::workflow::WfType) IMPL_TYPE_INFO_RENAME(vl::workflow::WfType::IVisitor, system::workflow::WfType::IVisitor) IMPL_TYPE_INFO_RENAME(vl::workflow::WfExpression, system::workflow::WfExpression) IMPL_TYPE_INFO_RENAME(vl::workflow::WfExpression::IVisitor, system::workflow::WfExpression::IVisitor) IMPL_TYPE_INFO_RENAME(vl::workflow::WfStatement, system::workflow::WfStatement) IMPL_TYPE_INFO_RENAME(vl::workflow::WfStatement::IVisitor, system::workflow::WfStatement::IVisitor) IMPL_TYPE_INFO_RENAME(vl::workflow::WfAttribute, system::workflow::WfAttribute) IMPL_TYPE_INFO_RENAME(vl::workflow::WfDeclaration, system::workflow::WfDeclaration) IMPL_TYPE_INFO_RENAME(vl::workflow::WfDeclaration::IVisitor, system::workflow::WfDeclaration::IVisitor) IMPL_TYPE_INFO_RENAME(vl::workflow::WfFunctionKind, system::workflow::WfFunctionKind) IMPL_TYPE_INFO_RENAME(vl::workflow::WfPredefinedTypeName, system::workflow::WfPredefinedTypeName) IMPL_TYPE_INFO_RENAME(vl::workflow::WfPredefinedType, system::workflow::WfPredefinedType) IMPL_TYPE_INFO_RENAME(vl::workflow::WfTopQualifiedType, system::workflow::WfTopQualifiedType) IMPL_TYPE_INFO_RENAME(vl::workflow::WfReferenceType, system::workflow::WfReferenceType) IMPL_TYPE_INFO_RENAME(vl::workflow::WfRawPointerType, system::workflow::WfRawPointerType) IMPL_TYPE_INFO_RENAME(vl::workflow::WfSharedPointerType, system::workflow::WfSharedPointerType) IMPL_TYPE_INFO_RENAME(vl::workflow::WfNullableType, system::workflow::WfNullableType) IMPL_TYPE_INFO_RENAME(vl::workflow::WfEnumerableType, system::workflow::WfEnumerableType) IMPL_TYPE_INFO_RENAME(vl::workflow::WfMapWritability, system::workflow::WfMapWritability) IMPL_TYPE_INFO_RENAME(vl::workflow::WfMapType, system::workflow::WfMapType) IMPL_TYPE_INFO_RENAME(vl::workflow::WfObservableListType, system::workflow::WfObservableListType) IMPL_TYPE_INFO_RENAME(vl::workflow::WfFunctionType, system::workflow::WfFunctionType) IMPL_TYPE_INFO_RENAME(vl::workflow::WfChildType, system::workflow::WfChildType) IMPL_TYPE_INFO_RENAME(vl::workflow::WfNamespaceDeclaration, system::workflow::WfNamespaceDeclaration) IMPL_TYPE_INFO_RENAME(vl::workflow::WfFunctionArgument, system::workflow::WfFunctionArgument) IMPL_TYPE_INFO_RENAME(vl::workflow::WfFunctionAnonymity, system::workflow::WfFunctionAnonymity) IMPL_TYPE_INFO_RENAME(vl::workflow::WfFunctionDeclaration, system::workflow::WfFunctionDeclaration) IMPL_TYPE_INFO_RENAME(vl::workflow::WfVariableDeclaration, system::workflow::WfVariableDeclaration) IMPL_TYPE_INFO_RENAME(vl::workflow::WfEventDeclaration, system::workflow::WfEventDeclaration) IMPL_TYPE_INFO_RENAME(vl::workflow::WfPropertyDeclaration, system::workflow::WfPropertyDeclaration) IMPL_TYPE_INFO_RENAME(vl::workflow::WfStaticInitDeclaration, system::workflow::WfStaticInitDeclaration) IMPL_TYPE_INFO_RENAME(vl::workflow::WfClassKind, system::workflow::WfClassKind) IMPL_TYPE_INFO_RENAME(vl::workflow::WfConstructorType, system::workflow::WfConstructorType) IMPL_TYPE_INFO_RENAME(vl::workflow::WfBaseConstructorCall, system::workflow::WfBaseConstructorCall) IMPL_TYPE_INFO_RENAME(vl::workflow::WfConstructorDeclaration, system::workflow::WfConstructorDeclaration) IMPL_TYPE_INFO_RENAME(vl::workflow::WfDestructorDeclaration, system::workflow::WfDestructorDeclaration) IMPL_TYPE_INFO_RENAME(vl::workflow::WfClassDeclaration, system::workflow::WfClassDeclaration) IMPL_TYPE_INFO_RENAME(vl::workflow::WfEnumKind, system::workflow::WfEnumKind) IMPL_TYPE_INFO_RENAME(vl::workflow::WfEnumItemKind, system::workflow::WfEnumItemKind) IMPL_TYPE_INFO_RENAME(vl::workflow::WfEnumItemIntersection, system::workflow::WfEnumItemIntersection) IMPL_TYPE_INFO_RENAME(vl::workflow::WfEnumItem, system::workflow::WfEnumItem) IMPL_TYPE_INFO_RENAME(vl::workflow::WfEnumDeclaration, system::workflow::WfEnumDeclaration) IMPL_TYPE_INFO_RENAME(vl::workflow::WfStructMember, system::workflow::WfStructMember) IMPL_TYPE_INFO_RENAME(vl::workflow::WfStructDeclaration, system::workflow::WfStructDeclaration) IMPL_TYPE_INFO_RENAME(vl::workflow::WfVirtualCfeDeclaration, system::workflow::WfVirtualCfeDeclaration) IMPL_TYPE_INFO_RENAME(vl::workflow::WfVirtualCfeDeclaration::IVisitor, system::workflow::WfVirtualCfeDeclaration::IVisitor) IMPL_TYPE_INFO_RENAME(vl::workflow::WfAPConst, system::workflow::WfAPConst) IMPL_TYPE_INFO_RENAME(vl::workflow::WfAPObserve, system::workflow::WfAPObserve) IMPL_TYPE_INFO_RENAME(vl::workflow::WfAutoPropertyDeclaration, system::workflow::WfAutoPropertyDeclaration) IMPL_TYPE_INFO_RENAME(vl::workflow::WfCastResultInterfaceDeclaration, system::workflow::WfCastResultInterfaceDeclaration) IMPL_TYPE_INFO_RENAME(vl::workflow::WfVirtualCseDeclaration, system::workflow::WfVirtualCseDeclaration) IMPL_TYPE_INFO_RENAME(vl::workflow::WfVirtualCseDeclaration::IVisitor, system::workflow::WfVirtualCseDeclaration::IVisitor) IMPL_TYPE_INFO_RENAME(vl::workflow::WfStateInput, system::workflow::WfStateInput) IMPL_TYPE_INFO_RENAME(vl::workflow::WfStateDeclaration, system::workflow::WfStateDeclaration) IMPL_TYPE_INFO_RENAME(vl::workflow::WfStateMachineDeclaration, system::workflow::WfStateMachineDeclaration) IMPL_TYPE_INFO_RENAME(vl::workflow::WfBreakStatement, system::workflow::WfBreakStatement) IMPL_TYPE_INFO_RENAME(vl::workflow::WfContinueStatement, system::workflow::WfContinueStatement) IMPL_TYPE_INFO_RENAME(vl::workflow::WfReturnStatement, system::workflow::WfReturnStatement) IMPL_TYPE_INFO_RENAME(vl::workflow::WfDeleteStatement, system::workflow::WfDeleteStatement) IMPL_TYPE_INFO_RENAME(vl::workflow::WfRaiseExceptionStatement, system::workflow::WfRaiseExceptionStatement) IMPL_TYPE_INFO_RENAME(vl::workflow::WfIfStatement, system::workflow::WfIfStatement) IMPL_TYPE_INFO_RENAME(vl::workflow::WfWhileStatement, system::workflow::WfWhileStatement) IMPL_TYPE_INFO_RENAME(vl::workflow::WfTryStatement, system::workflow::WfTryStatement) IMPL_TYPE_INFO_RENAME(vl::workflow::WfBlockStatement, system::workflow::WfBlockStatement) IMPL_TYPE_INFO_RENAME(vl::workflow::WfGotoStatement, system::workflow::WfGotoStatement) IMPL_TYPE_INFO_RENAME(vl::workflow::WfVariableStatement, system::workflow::WfVariableStatement) IMPL_TYPE_INFO_RENAME(vl::workflow::WfExpressionStatement, system::workflow::WfExpressionStatement) IMPL_TYPE_INFO_RENAME(vl::workflow::WfVirtualCseStatement, system::workflow::WfVirtualCseStatement) IMPL_TYPE_INFO_RENAME(vl::workflow::WfVirtualCseStatement::IVisitor, system::workflow::WfVirtualCseStatement::IVisitor) IMPL_TYPE_INFO_RENAME(vl::workflow::WfForEachDirection, system::workflow::WfForEachDirection) IMPL_TYPE_INFO_RENAME(vl::workflow::WfForEachStatement, system::workflow::WfForEachStatement) IMPL_TYPE_INFO_RENAME(vl::workflow::WfSwitchCase, system::workflow::WfSwitchCase) IMPL_TYPE_INFO_RENAME(vl::workflow::WfSwitchStatement, system::workflow::WfSwitchStatement) IMPL_TYPE_INFO_RENAME(vl::workflow::WfCoProviderStatement, system::workflow::WfCoProviderStatement) IMPL_TYPE_INFO_RENAME(vl::workflow::WfCoroutineStatement, system::workflow::WfCoroutineStatement) IMPL_TYPE_INFO_RENAME(vl::workflow::WfCoroutineStatement::IVisitor, system::workflow::WfCoroutineStatement::IVisitor) IMPL_TYPE_INFO_RENAME(vl::workflow::WfCoPauseStatement, system::workflow::WfCoPauseStatement) IMPL_TYPE_INFO_RENAME(vl::workflow::WfCoOperatorStatement, system::workflow::WfCoOperatorStatement) IMPL_TYPE_INFO_RENAME(vl::workflow::WfStateSwitchType, system::workflow::WfStateSwitchType) IMPL_TYPE_INFO_RENAME(vl::workflow::WfStateInvokeType, system::workflow::WfStateInvokeType) IMPL_TYPE_INFO_RENAME(vl::workflow::WfStateMachineStatement, system::workflow::WfStateMachineStatement) IMPL_TYPE_INFO_RENAME(vl::workflow::WfStateMachineStatement::IVisitor, system::workflow::WfStateMachineStatement::IVisitor) IMPL_TYPE_INFO_RENAME(vl::workflow::WfStateSwitchArgument, system::workflow::WfStateSwitchArgument) IMPL_TYPE_INFO_RENAME(vl::workflow::WfStateSwitchCase, system::workflow::WfStateSwitchCase) IMPL_TYPE_INFO_RENAME(vl::workflow::WfStateSwitchStatement, system::workflow::WfStateSwitchStatement) IMPL_TYPE_INFO_RENAME(vl::workflow::WfStateInvokeStatement, system::workflow::WfStateInvokeStatement) IMPL_TYPE_INFO_RENAME(vl::workflow::WfThisExpression, system::workflow::WfThisExpression) IMPL_TYPE_INFO_RENAME(vl::workflow::WfTopQualifiedExpression, system::workflow::WfTopQualifiedExpression) IMPL_TYPE_INFO_RENAME(vl::workflow::WfReferenceExpression, system::workflow::WfReferenceExpression) IMPL_TYPE_INFO_RENAME(vl::workflow::WfOrderedNameExpression, system::workflow::WfOrderedNameExpression) IMPL_TYPE_INFO_RENAME(vl::workflow::WfOrderedLambdaExpression, system::workflow::WfOrderedLambdaExpression) IMPL_TYPE_INFO_RENAME(vl::workflow::WfMemberExpression, system::workflow::WfMemberExpression) IMPL_TYPE_INFO_RENAME(vl::workflow::WfChildExpression, system::workflow::WfChildExpression) IMPL_TYPE_INFO_RENAME(vl::workflow::WfLiteralValue, system::workflow::WfLiteralValue) IMPL_TYPE_INFO_RENAME(vl::workflow::WfLiteralExpression, system::workflow::WfLiteralExpression) IMPL_TYPE_INFO_RENAME(vl::workflow::WfFloatingExpression, system::workflow::WfFloatingExpression) IMPL_TYPE_INFO_RENAME(vl::workflow::WfIntegerExpression, system::workflow::WfIntegerExpression) IMPL_TYPE_INFO_RENAME(vl::workflow::WfStringExpression, system::workflow::WfStringExpression) IMPL_TYPE_INFO_RENAME(vl::workflow::WfUnaryOperator, system::workflow::WfUnaryOperator) IMPL_TYPE_INFO_RENAME(vl::workflow::WfUnaryExpression, system::workflow::WfUnaryExpression) IMPL_TYPE_INFO_RENAME(vl::workflow::WfBinaryOperator, system::workflow::WfBinaryOperator) IMPL_TYPE_INFO_RENAME(vl::workflow::WfBinaryExpression, system::workflow::WfBinaryExpression) IMPL_TYPE_INFO_RENAME(vl::workflow::WfLetVariable, system::workflow::WfLetVariable) IMPL_TYPE_INFO_RENAME(vl::workflow::WfLetExpression, system::workflow::WfLetExpression) IMPL_TYPE_INFO_RENAME(vl::workflow::WfIfExpression, system::workflow::WfIfExpression) IMPL_TYPE_INFO_RENAME(vl::workflow::WfRangeBoundary, system::workflow::WfRangeBoundary) IMPL_TYPE_INFO_RENAME(vl::workflow::WfRangeExpression, system::workflow::WfRangeExpression) IMPL_TYPE_INFO_RENAME(vl::workflow::WfSetTesting, system::workflow::WfSetTesting) IMPL_TYPE_INFO_RENAME(vl::workflow::WfSetTestingExpression, system::workflow::WfSetTestingExpression) IMPL_TYPE_INFO_RENAME(vl::workflow::WfConstructorArgument, system::workflow::WfConstructorArgument) IMPL_TYPE_INFO_RENAME(vl::workflow::WfConstructorExpression, system::workflow::WfConstructorExpression) IMPL_TYPE_INFO_RENAME(vl::workflow::WfInferExpression, system::workflow::WfInferExpression) IMPL_TYPE_INFO_RENAME(vl::workflow::WfTypeCastingStrategy, system::workflow::WfTypeCastingStrategy) IMPL_TYPE_INFO_RENAME(vl::workflow::WfTypeCastingExpression, system::workflow::WfTypeCastingExpression) IMPL_TYPE_INFO_RENAME(vl::workflow::WfTypeTesting, system::workflow::WfTypeTesting) IMPL_TYPE_INFO_RENAME(vl::workflow::WfTypeTestingExpression, system::workflow::WfTypeTestingExpression) IMPL_TYPE_INFO_RENAME(vl::workflow::WfTypeOfTypeExpression, system::workflow::WfTypeOfTypeExpression) IMPL_TYPE_INFO_RENAME(vl::workflow::WfTypeOfExpressionExpression, system::workflow::WfTypeOfExpressionExpression) IMPL_TYPE_INFO_RENAME(vl::workflow::WfAttachEventExpression, system::workflow::WfAttachEventExpression) IMPL_TYPE_INFO_RENAME(vl::workflow::WfDetachEventExpression, system::workflow::WfDetachEventExpression) IMPL_TYPE_INFO_RENAME(vl::workflow::WfObserveType, system::workflow::WfObserveType) IMPL_TYPE_INFO_RENAME(vl::workflow::WfObserveExpression, system::workflow::WfObserveExpression) IMPL_TYPE_INFO_RENAME(vl::workflow::WfCallExpression, system::workflow::WfCallExpression) IMPL_TYPE_INFO_RENAME(vl::workflow::WfFunctionExpression, system::workflow::WfFunctionExpression) IMPL_TYPE_INFO_RENAME(vl::workflow::WfNewClassExpression, system::workflow::WfNewClassExpression) IMPL_TYPE_INFO_RENAME(vl::workflow::WfNewInterfaceExpression, system::workflow::WfNewInterfaceExpression) IMPL_TYPE_INFO_RENAME(vl::workflow::WfVirtualCfeExpression, system::workflow::WfVirtualCfeExpression) IMPL_TYPE_INFO_RENAME(vl::workflow::WfVirtualCfeExpression::IVisitor, system::workflow::WfVirtualCfeExpression::IVisitor) IMPL_TYPE_INFO_RENAME(vl::workflow::WfFormatExpression, system::workflow::WfFormatExpression) IMPL_TYPE_INFO_RENAME(vl::workflow::WfVirtualCseExpression, system::workflow::WfVirtualCseExpression) IMPL_TYPE_INFO_RENAME(vl::workflow::WfVirtualCseExpression::IVisitor, system::workflow::WfVirtualCseExpression::IVisitor) IMPL_TYPE_INFO_RENAME(vl::workflow::WfBindExpression, system::workflow::WfBindExpression) IMPL_TYPE_INFO_RENAME(vl::workflow::WfNewCoroutineExpression, system::workflow::WfNewCoroutineExpression) IMPL_TYPE_INFO_RENAME(vl::workflow::WfMixinCastExpression, system::workflow::WfMixinCastExpression) IMPL_TYPE_INFO_RENAME(vl::workflow::WfExpectedTypeCastExpression, system::workflow::WfExpectedTypeCastExpression) IMPL_TYPE_INFO_RENAME(vl::workflow::WfCoOperatorExpression, system::workflow::WfCoOperatorExpression) IMPL_TYPE_INFO_RENAME(vl::workflow::WfModuleUsingFragment, system::workflow::WfModuleUsingFragment) IMPL_TYPE_INFO_RENAME(vl::workflow::WfModuleUsingFragment::IVisitor, system::workflow::WfModuleUsingFragment::IVisitor) IMPL_TYPE_INFO_RENAME(vl::workflow::WfModuleUsingNameFragment, system::workflow::WfModuleUsingNameFragment) IMPL_TYPE_INFO_RENAME(vl::workflow::WfModuleUsingWildCardFragment, system::workflow::WfModuleUsingWildCardFragment) IMPL_TYPE_INFO_RENAME(vl::workflow::WfModuleUsingItem, system::workflow::WfModuleUsingItem) IMPL_TYPE_INFO_RENAME(vl::workflow::WfModuleUsingPath, system::workflow::WfModuleUsingPath) IMPL_TYPE_INFO_RENAME(vl::workflow::WfModuleType, system::workflow::WfModuleType) IMPL_TYPE_INFO_RENAME(vl::workflow::WfModule, system::workflow::WfModule) #ifdef VCZH_DESCRIPTABLEOBJECT_WITH_METADATA BEGIN_CLASS_MEMBER(vl::workflow::WfType) CLASS_MEMBER_BASE(vl::glr::ParsingAstBase) END_CLASS_MEMBER(vl::workflow::WfType) BEGIN_CLASS_MEMBER(vl::workflow::WfExpression) CLASS_MEMBER_BASE(vl::glr::ParsingAstBase) END_CLASS_MEMBER(vl::workflow::WfExpression) BEGIN_CLASS_MEMBER(vl::workflow::WfStatement) CLASS_MEMBER_BASE(vl::glr::ParsingAstBase) END_CLASS_MEMBER(vl::workflow::WfStatement) BEGIN_CLASS_MEMBER(vl::workflow::WfAttribute) CLASS_MEMBER_BASE(vl::glr::ParsingAstBase) CLASS_MEMBER_CONSTRUCTOR(vl::Ptr(), NO_PARAMETER) CLASS_MEMBER_FIELD(category) CLASS_MEMBER_FIELD(name) CLASS_MEMBER_FIELD(value) END_CLASS_MEMBER(vl::workflow::WfAttribute) BEGIN_CLASS_MEMBER(vl::workflow::WfDeclaration) CLASS_MEMBER_BASE(vl::glr::ParsingAstBase) CLASS_MEMBER_FIELD(attributes) CLASS_MEMBER_FIELD(name) END_CLASS_MEMBER(vl::workflow::WfDeclaration) BEGIN_ENUM_ITEM(vl::workflow::WfFunctionKind) ENUM_ITEM_NAMESPACE(vl::workflow::WfFunctionKind) ENUM_NAMESPACE_ITEM(Static) ENUM_NAMESPACE_ITEM(Override) ENUM_NAMESPACE_ITEM(Normal) END_ENUM_ITEM(vl::workflow::WfFunctionKind) BEGIN_ENUM_ITEM(vl::workflow::WfPredefinedTypeName) ENUM_ITEM_NAMESPACE(vl::workflow::WfPredefinedTypeName) ENUM_NAMESPACE_ITEM(Void) ENUM_NAMESPACE_ITEM(Object) ENUM_NAMESPACE_ITEM(Interface) ENUM_NAMESPACE_ITEM(Int) ENUM_NAMESPACE_ITEM(UInt) ENUM_NAMESPACE_ITEM(Float) ENUM_NAMESPACE_ITEM(Double) ENUM_NAMESPACE_ITEM(String) ENUM_NAMESPACE_ITEM(Char) ENUM_NAMESPACE_ITEM(Bool) END_ENUM_ITEM(vl::workflow::WfPredefinedTypeName) BEGIN_CLASS_MEMBER(vl::workflow::WfPredefinedType) CLASS_MEMBER_BASE(vl::workflow::WfType) CLASS_MEMBER_CONSTRUCTOR(vl::Ptr(), NO_PARAMETER) CLASS_MEMBER_FIELD(name) END_CLASS_MEMBER(vl::workflow::WfPredefinedType) BEGIN_CLASS_MEMBER(vl::workflow::WfTopQualifiedType) CLASS_MEMBER_BASE(vl::workflow::WfType) CLASS_MEMBER_CONSTRUCTOR(vl::Ptr(), NO_PARAMETER) CLASS_MEMBER_FIELD(name) END_CLASS_MEMBER(vl::workflow::WfTopQualifiedType) BEGIN_CLASS_MEMBER(vl::workflow::WfReferenceType) CLASS_MEMBER_BASE(vl::workflow::WfType) CLASS_MEMBER_CONSTRUCTOR(vl::Ptr(), NO_PARAMETER) CLASS_MEMBER_FIELD(name) END_CLASS_MEMBER(vl::workflow::WfReferenceType) BEGIN_CLASS_MEMBER(vl::workflow::WfRawPointerType) CLASS_MEMBER_BASE(vl::workflow::WfType) CLASS_MEMBER_CONSTRUCTOR(vl::Ptr(), NO_PARAMETER) CLASS_MEMBER_FIELD(element) END_CLASS_MEMBER(vl::workflow::WfRawPointerType) BEGIN_CLASS_MEMBER(vl::workflow::WfSharedPointerType) CLASS_MEMBER_BASE(vl::workflow::WfType) CLASS_MEMBER_CONSTRUCTOR(vl::Ptr(), NO_PARAMETER) CLASS_MEMBER_FIELD(element) END_CLASS_MEMBER(vl::workflow::WfSharedPointerType) BEGIN_CLASS_MEMBER(vl::workflow::WfNullableType) CLASS_MEMBER_BASE(vl::workflow::WfType) CLASS_MEMBER_CONSTRUCTOR(vl::Ptr(), NO_PARAMETER) CLASS_MEMBER_FIELD(element) END_CLASS_MEMBER(vl::workflow::WfNullableType) BEGIN_CLASS_MEMBER(vl::workflow::WfEnumerableType) CLASS_MEMBER_BASE(vl::workflow::WfType) CLASS_MEMBER_CONSTRUCTOR(vl::Ptr(), NO_PARAMETER) CLASS_MEMBER_FIELD(element) END_CLASS_MEMBER(vl::workflow::WfEnumerableType) BEGIN_ENUM_ITEM(vl::workflow::WfMapWritability) ENUM_ITEM_NAMESPACE(vl::workflow::WfMapWritability) ENUM_NAMESPACE_ITEM(Readonly) ENUM_NAMESPACE_ITEM(Writable) END_ENUM_ITEM(vl::workflow::WfMapWritability) BEGIN_CLASS_MEMBER(vl::workflow::WfMapType) CLASS_MEMBER_BASE(vl::workflow::WfType) CLASS_MEMBER_CONSTRUCTOR(vl::Ptr(), NO_PARAMETER) CLASS_MEMBER_FIELD(writability) CLASS_MEMBER_FIELD(key) CLASS_MEMBER_FIELD(value) END_CLASS_MEMBER(vl::workflow::WfMapType) BEGIN_CLASS_MEMBER(vl::workflow::WfObservableListType) CLASS_MEMBER_BASE(vl::workflow::WfType) CLASS_MEMBER_CONSTRUCTOR(vl::Ptr(), NO_PARAMETER) CLASS_MEMBER_FIELD(element) END_CLASS_MEMBER(vl::workflow::WfObservableListType) BEGIN_CLASS_MEMBER(vl::workflow::WfFunctionType) CLASS_MEMBER_BASE(vl::workflow::WfType) CLASS_MEMBER_CONSTRUCTOR(vl::Ptr(), NO_PARAMETER) CLASS_MEMBER_FIELD(result) CLASS_MEMBER_FIELD(arguments) END_CLASS_MEMBER(vl::workflow::WfFunctionType) BEGIN_CLASS_MEMBER(vl::workflow::WfChildType) CLASS_MEMBER_BASE(vl::workflow::WfType) CLASS_MEMBER_CONSTRUCTOR(vl::Ptr(), NO_PARAMETER) CLASS_MEMBER_FIELD(parent) CLASS_MEMBER_FIELD(name) END_CLASS_MEMBER(vl::workflow::WfChildType) BEGIN_CLASS_MEMBER(vl::workflow::WfNamespaceDeclaration) CLASS_MEMBER_BASE(vl::workflow::WfDeclaration) CLASS_MEMBER_CONSTRUCTOR(vl::Ptr(), NO_PARAMETER) CLASS_MEMBER_FIELD(declarations) END_CLASS_MEMBER(vl::workflow::WfNamespaceDeclaration) BEGIN_CLASS_MEMBER(vl::workflow::WfFunctionArgument) CLASS_MEMBER_BASE(vl::glr::ParsingAstBase) CLASS_MEMBER_CONSTRUCTOR(vl::Ptr(), NO_PARAMETER) CLASS_MEMBER_FIELD(attributes) CLASS_MEMBER_FIELD(name) CLASS_MEMBER_FIELD(type) END_CLASS_MEMBER(vl::workflow::WfFunctionArgument) BEGIN_ENUM_ITEM(vl::workflow::WfFunctionAnonymity) ENUM_ITEM_NAMESPACE(vl::workflow::WfFunctionAnonymity) ENUM_NAMESPACE_ITEM(Named) ENUM_NAMESPACE_ITEM(Anonymous) END_ENUM_ITEM(vl::workflow::WfFunctionAnonymity) BEGIN_CLASS_MEMBER(vl::workflow::WfFunctionDeclaration) CLASS_MEMBER_BASE(vl::workflow::WfDeclaration) CLASS_MEMBER_CONSTRUCTOR(vl::Ptr(), NO_PARAMETER) CLASS_MEMBER_FIELD(functionKind) CLASS_MEMBER_FIELD(anonymity) CLASS_MEMBER_FIELD(arguments) CLASS_MEMBER_FIELD(returnType) CLASS_MEMBER_FIELD(statement) END_CLASS_MEMBER(vl::workflow::WfFunctionDeclaration) BEGIN_CLASS_MEMBER(vl::workflow::WfVariableDeclaration) CLASS_MEMBER_BASE(vl::workflow::WfDeclaration) CLASS_MEMBER_CONSTRUCTOR(vl::Ptr(), NO_PARAMETER) CLASS_MEMBER_FIELD(type) CLASS_MEMBER_FIELD(expression) END_CLASS_MEMBER(vl::workflow::WfVariableDeclaration) BEGIN_CLASS_MEMBER(vl::workflow::WfEventDeclaration) CLASS_MEMBER_BASE(vl::workflow::WfDeclaration) CLASS_MEMBER_CONSTRUCTOR(vl::Ptr(), NO_PARAMETER) CLASS_MEMBER_FIELD(arguments) END_CLASS_MEMBER(vl::workflow::WfEventDeclaration) BEGIN_CLASS_MEMBER(vl::workflow::WfPropertyDeclaration) CLASS_MEMBER_BASE(vl::workflow::WfDeclaration) CLASS_MEMBER_CONSTRUCTOR(vl::Ptr(), NO_PARAMETER) CLASS_MEMBER_FIELD(type) CLASS_MEMBER_FIELD(getter) CLASS_MEMBER_FIELD(setter) CLASS_MEMBER_FIELD(valueChangedEvent) END_CLASS_MEMBER(vl::workflow::WfPropertyDeclaration) BEGIN_CLASS_MEMBER(vl::workflow::WfStaticInitDeclaration) CLASS_MEMBER_BASE(vl::workflow::WfDeclaration) CLASS_MEMBER_CONSTRUCTOR(vl::Ptr(), NO_PARAMETER) CLASS_MEMBER_FIELD(statement) END_CLASS_MEMBER(vl::workflow::WfStaticInitDeclaration) BEGIN_ENUM_ITEM(vl::workflow::WfClassKind) ENUM_ITEM_NAMESPACE(vl::workflow::WfClassKind) ENUM_NAMESPACE_ITEM(Class) ENUM_NAMESPACE_ITEM(Interface) END_ENUM_ITEM(vl::workflow::WfClassKind) BEGIN_ENUM_ITEM(vl::workflow::WfConstructorType) ENUM_ITEM_NAMESPACE(vl::workflow::WfConstructorType) ENUM_NAMESPACE_ITEM(Undefined) ENUM_NAMESPACE_ITEM(SharedPtr) ENUM_NAMESPACE_ITEM(RawPtr) END_ENUM_ITEM(vl::workflow::WfConstructorType) BEGIN_CLASS_MEMBER(vl::workflow::WfBaseConstructorCall) CLASS_MEMBER_BASE(vl::glr::ParsingAstBase) CLASS_MEMBER_CONSTRUCTOR(vl::Ptr(), NO_PARAMETER) CLASS_MEMBER_FIELD(type) CLASS_MEMBER_FIELD(arguments) END_CLASS_MEMBER(vl::workflow::WfBaseConstructorCall) BEGIN_CLASS_MEMBER(vl::workflow::WfConstructorDeclaration) CLASS_MEMBER_BASE(vl::workflow::WfDeclaration) CLASS_MEMBER_CONSTRUCTOR(vl::Ptr(), NO_PARAMETER) CLASS_MEMBER_FIELD(constructorType) CLASS_MEMBER_FIELD(baseConstructorCalls) CLASS_MEMBER_FIELD(arguments) CLASS_MEMBER_FIELD(statement) END_CLASS_MEMBER(vl::workflow::WfConstructorDeclaration) BEGIN_CLASS_MEMBER(vl::workflow::WfDestructorDeclaration) CLASS_MEMBER_BASE(vl::workflow::WfDeclaration) CLASS_MEMBER_CONSTRUCTOR(vl::Ptr(), NO_PARAMETER) CLASS_MEMBER_FIELD(statement) END_CLASS_MEMBER(vl::workflow::WfDestructorDeclaration) BEGIN_CLASS_MEMBER(vl::workflow::WfClassDeclaration) CLASS_MEMBER_BASE(vl::workflow::WfDeclaration) CLASS_MEMBER_CONSTRUCTOR(vl::Ptr(), NO_PARAMETER) CLASS_MEMBER_FIELD(kind) CLASS_MEMBER_FIELD(constructorType) CLASS_MEMBER_FIELD(baseTypes) CLASS_MEMBER_FIELD(declarations) END_CLASS_MEMBER(vl::workflow::WfClassDeclaration) BEGIN_ENUM_ITEM(vl::workflow::WfEnumKind) ENUM_ITEM_NAMESPACE(vl::workflow::WfEnumKind) ENUM_NAMESPACE_ITEM(Normal) ENUM_NAMESPACE_ITEM(Flag) END_ENUM_ITEM(vl::workflow::WfEnumKind) BEGIN_ENUM_ITEM(vl::workflow::WfEnumItemKind) ENUM_ITEM_NAMESPACE(vl::workflow::WfEnumItemKind) ENUM_NAMESPACE_ITEM(Constant) ENUM_NAMESPACE_ITEM(Intersection) END_ENUM_ITEM(vl::workflow::WfEnumItemKind) BEGIN_CLASS_MEMBER(vl::workflow::WfEnumItemIntersection) CLASS_MEMBER_BASE(vl::glr::ParsingAstBase) CLASS_MEMBER_CONSTRUCTOR(vl::Ptr(), NO_PARAMETER) CLASS_MEMBER_FIELD(name) END_CLASS_MEMBER(vl::workflow::WfEnumItemIntersection) BEGIN_CLASS_MEMBER(vl::workflow::WfEnumItem) CLASS_MEMBER_BASE(vl::glr::ParsingAstBase) CLASS_MEMBER_CONSTRUCTOR(vl::Ptr(), NO_PARAMETER) CLASS_MEMBER_FIELD(attributes) CLASS_MEMBER_FIELD(name) CLASS_MEMBER_FIELD(kind) CLASS_MEMBER_FIELD(number) CLASS_MEMBER_FIELD(intersections) END_CLASS_MEMBER(vl::workflow::WfEnumItem) BEGIN_CLASS_MEMBER(vl::workflow::WfEnumDeclaration) CLASS_MEMBER_BASE(vl::workflow::WfDeclaration) CLASS_MEMBER_CONSTRUCTOR(vl::Ptr(), NO_PARAMETER) CLASS_MEMBER_FIELD(kind) CLASS_MEMBER_FIELD(items) END_CLASS_MEMBER(vl::workflow::WfEnumDeclaration) BEGIN_CLASS_MEMBER(vl::workflow::WfStructMember) CLASS_MEMBER_BASE(vl::glr::ParsingAstBase) CLASS_MEMBER_CONSTRUCTOR(vl::Ptr(), NO_PARAMETER) CLASS_MEMBER_FIELD(attributes) CLASS_MEMBER_FIELD(name) CLASS_MEMBER_FIELD(type) END_CLASS_MEMBER(vl::workflow::WfStructMember) BEGIN_CLASS_MEMBER(vl::workflow::WfStructDeclaration) CLASS_MEMBER_BASE(vl::workflow::WfDeclaration) CLASS_MEMBER_CONSTRUCTOR(vl::Ptr(), NO_PARAMETER) CLASS_MEMBER_FIELD(members) END_CLASS_MEMBER(vl::workflow::WfStructDeclaration) BEGIN_CLASS_MEMBER(vl::workflow::WfVirtualCfeDeclaration) CLASS_MEMBER_BASE(vl::workflow::WfDeclaration) CLASS_MEMBER_FIELD(expandedDeclarations) END_CLASS_MEMBER(vl::workflow::WfVirtualCfeDeclaration) BEGIN_ENUM_ITEM(vl::workflow::WfAPConst) ENUM_ITEM_NAMESPACE(vl::workflow::WfAPConst) ENUM_NAMESPACE_ITEM(Readonly) ENUM_NAMESPACE_ITEM(Writable) END_ENUM_ITEM(vl::workflow::WfAPConst) BEGIN_ENUM_ITEM(vl::workflow::WfAPObserve) ENUM_ITEM_NAMESPACE(vl::workflow::WfAPObserve) ENUM_NAMESPACE_ITEM(Observable) ENUM_NAMESPACE_ITEM(NotObservable) END_ENUM_ITEM(vl::workflow::WfAPObserve) BEGIN_CLASS_MEMBER(vl::workflow::WfAutoPropertyDeclaration) CLASS_MEMBER_BASE(vl::workflow::WfVirtualCfeDeclaration) CLASS_MEMBER_CONSTRUCTOR(vl::Ptr(), NO_PARAMETER) CLASS_MEMBER_FIELD(functionKind) CLASS_MEMBER_FIELD(type) CLASS_MEMBER_FIELD(configConst) CLASS_MEMBER_FIELD(configObserve) CLASS_MEMBER_FIELD(expression) END_CLASS_MEMBER(vl::workflow::WfAutoPropertyDeclaration) BEGIN_CLASS_MEMBER(vl::workflow::WfCastResultInterfaceDeclaration) CLASS_MEMBER_BASE(vl::workflow::WfVirtualCfeDeclaration) CLASS_MEMBER_CONSTRUCTOR(vl::Ptr(), NO_PARAMETER) CLASS_MEMBER_FIELD(baseType) CLASS_MEMBER_FIELD(elementType) END_CLASS_MEMBER(vl::workflow::WfCastResultInterfaceDeclaration) BEGIN_CLASS_MEMBER(vl::workflow::WfVirtualCseDeclaration) CLASS_MEMBER_BASE(vl::workflow::WfDeclaration) CLASS_MEMBER_FIELD(expandedDeclarations) END_CLASS_MEMBER(vl::workflow::WfVirtualCseDeclaration) BEGIN_CLASS_MEMBER(vl::workflow::WfStateInput) CLASS_MEMBER_BASE(vl::glr::ParsingAstBase) CLASS_MEMBER_CONSTRUCTOR(vl::Ptr(), NO_PARAMETER) CLASS_MEMBER_FIELD(name) CLASS_MEMBER_FIELD(arguments) END_CLASS_MEMBER(vl::workflow::WfStateInput) BEGIN_CLASS_MEMBER(vl::workflow::WfStateDeclaration) CLASS_MEMBER_BASE(vl::glr::ParsingAstBase) CLASS_MEMBER_CONSTRUCTOR(vl::Ptr(), NO_PARAMETER) CLASS_MEMBER_FIELD(name) CLASS_MEMBER_FIELD(arguments) CLASS_MEMBER_FIELD(statement) END_CLASS_MEMBER(vl::workflow::WfStateDeclaration) BEGIN_CLASS_MEMBER(vl::workflow::WfStateMachineDeclaration) CLASS_MEMBER_BASE(vl::workflow::WfVirtualCseDeclaration) CLASS_MEMBER_CONSTRUCTOR(vl::Ptr(), NO_PARAMETER) CLASS_MEMBER_FIELD(inputs) CLASS_MEMBER_FIELD(states) END_CLASS_MEMBER(vl::workflow::WfStateMachineDeclaration) BEGIN_CLASS_MEMBER(vl::workflow::WfBreakStatement) CLASS_MEMBER_BASE(vl::workflow::WfStatement) CLASS_MEMBER_CONSTRUCTOR(vl::Ptr(), NO_PARAMETER) END_CLASS_MEMBER(vl::workflow::WfBreakStatement) BEGIN_CLASS_MEMBER(vl::workflow::WfContinueStatement) CLASS_MEMBER_BASE(vl::workflow::WfStatement) CLASS_MEMBER_CONSTRUCTOR(vl::Ptr(), NO_PARAMETER) END_CLASS_MEMBER(vl::workflow::WfContinueStatement) BEGIN_CLASS_MEMBER(vl::workflow::WfReturnStatement) CLASS_MEMBER_BASE(vl::workflow::WfStatement) CLASS_MEMBER_CONSTRUCTOR(vl::Ptr(), NO_PARAMETER) CLASS_MEMBER_FIELD(expression) END_CLASS_MEMBER(vl::workflow::WfReturnStatement) BEGIN_CLASS_MEMBER(vl::workflow::WfDeleteStatement) CLASS_MEMBER_BASE(vl::workflow::WfStatement) CLASS_MEMBER_CONSTRUCTOR(vl::Ptr(), NO_PARAMETER) CLASS_MEMBER_FIELD(expression) END_CLASS_MEMBER(vl::workflow::WfDeleteStatement) BEGIN_CLASS_MEMBER(vl::workflow::WfRaiseExceptionStatement) CLASS_MEMBER_BASE(vl::workflow::WfStatement) CLASS_MEMBER_CONSTRUCTOR(vl::Ptr(), NO_PARAMETER) CLASS_MEMBER_FIELD(expression) END_CLASS_MEMBER(vl::workflow::WfRaiseExceptionStatement) BEGIN_CLASS_MEMBER(vl::workflow::WfIfStatement) CLASS_MEMBER_BASE(vl::workflow::WfStatement) CLASS_MEMBER_CONSTRUCTOR(vl::Ptr(), NO_PARAMETER) CLASS_MEMBER_FIELD(type) CLASS_MEMBER_FIELD(name) CLASS_MEMBER_FIELD(expression) CLASS_MEMBER_FIELD(trueBranch) CLASS_MEMBER_FIELD(falseBranch) END_CLASS_MEMBER(vl::workflow::WfIfStatement) BEGIN_CLASS_MEMBER(vl::workflow::WfWhileStatement) CLASS_MEMBER_BASE(vl::workflow::WfStatement) CLASS_MEMBER_CONSTRUCTOR(vl::Ptr(), NO_PARAMETER) CLASS_MEMBER_FIELD(condition) CLASS_MEMBER_FIELD(statement) END_CLASS_MEMBER(vl::workflow::WfWhileStatement) BEGIN_CLASS_MEMBER(vl::workflow::WfTryStatement) CLASS_MEMBER_BASE(vl::workflow::WfStatement) CLASS_MEMBER_CONSTRUCTOR(vl::Ptr(), NO_PARAMETER) CLASS_MEMBER_FIELD(protectedStatement) CLASS_MEMBER_FIELD(name) CLASS_MEMBER_FIELD(catchStatement) CLASS_MEMBER_FIELD(finallyStatement) END_CLASS_MEMBER(vl::workflow::WfTryStatement) BEGIN_CLASS_MEMBER(vl::workflow::WfBlockStatement) CLASS_MEMBER_BASE(vl::workflow::WfStatement) CLASS_MEMBER_CONSTRUCTOR(vl::Ptr(), NO_PARAMETER) CLASS_MEMBER_FIELD(statements) CLASS_MEMBER_FIELD(endLabel) END_CLASS_MEMBER(vl::workflow::WfBlockStatement) BEGIN_CLASS_MEMBER(vl::workflow::WfGotoStatement) CLASS_MEMBER_BASE(vl::workflow::WfStatement) CLASS_MEMBER_CONSTRUCTOR(vl::Ptr(), NO_PARAMETER) CLASS_MEMBER_FIELD(label) END_CLASS_MEMBER(vl::workflow::WfGotoStatement) BEGIN_CLASS_MEMBER(vl::workflow::WfVariableStatement) CLASS_MEMBER_BASE(vl::workflow::WfStatement) CLASS_MEMBER_CONSTRUCTOR(vl::Ptr(), NO_PARAMETER) CLASS_MEMBER_FIELD(variable) END_CLASS_MEMBER(vl::workflow::WfVariableStatement) BEGIN_CLASS_MEMBER(vl::workflow::WfExpressionStatement) CLASS_MEMBER_BASE(vl::workflow::WfStatement) CLASS_MEMBER_CONSTRUCTOR(vl::Ptr(), NO_PARAMETER) CLASS_MEMBER_FIELD(expression) END_CLASS_MEMBER(vl::workflow::WfExpressionStatement) BEGIN_CLASS_MEMBER(vl::workflow::WfVirtualCseStatement) CLASS_MEMBER_BASE(vl::workflow::WfStatement) CLASS_MEMBER_FIELD(expandedStatement) END_CLASS_MEMBER(vl::workflow::WfVirtualCseStatement) BEGIN_ENUM_ITEM(vl::workflow::WfForEachDirection) ENUM_ITEM_NAMESPACE(vl::workflow::WfForEachDirection) ENUM_NAMESPACE_ITEM(Normal) ENUM_NAMESPACE_ITEM(Reversed) END_ENUM_ITEM(vl::workflow::WfForEachDirection) BEGIN_CLASS_MEMBER(vl::workflow::WfForEachStatement) CLASS_MEMBER_BASE(vl::workflow::WfVirtualCseStatement) CLASS_MEMBER_CONSTRUCTOR(vl::Ptr(), NO_PARAMETER) CLASS_MEMBER_FIELD(name) CLASS_MEMBER_FIELD(direction) CLASS_MEMBER_FIELD(collection) CLASS_MEMBER_FIELD(statement) END_CLASS_MEMBER(vl::workflow::WfForEachStatement) BEGIN_CLASS_MEMBER(vl::workflow::WfSwitchCase) CLASS_MEMBER_BASE(vl::glr::ParsingAstBase) CLASS_MEMBER_CONSTRUCTOR(vl::Ptr(), NO_PARAMETER) CLASS_MEMBER_FIELD(expression) CLASS_MEMBER_FIELD(statement) END_CLASS_MEMBER(vl::workflow::WfSwitchCase) BEGIN_CLASS_MEMBER(vl::workflow::WfSwitchStatement) CLASS_MEMBER_BASE(vl::workflow::WfVirtualCseStatement) CLASS_MEMBER_CONSTRUCTOR(vl::Ptr(), NO_PARAMETER) CLASS_MEMBER_FIELD(expression) CLASS_MEMBER_FIELD(caseBranches) CLASS_MEMBER_FIELD(defaultBranch) END_CLASS_MEMBER(vl::workflow::WfSwitchStatement) BEGIN_CLASS_MEMBER(vl::workflow::WfCoProviderStatement) CLASS_MEMBER_BASE(vl::workflow::WfVirtualCseStatement) CLASS_MEMBER_CONSTRUCTOR(vl::Ptr(), NO_PARAMETER) CLASS_MEMBER_FIELD(name) CLASS_MEMBER_FIELD(statement) END_CLASS_MEMBER(vl::workflow::WfCoProviderStatement) BEGIN_CLASS_MEMBER(vl::workflow::WfCoroutineStatement) CLASS_MEMBER_BASE(vl::workflow::WfStatement) END_CLASS_MEMBER(vl::workflow::WfCoroutineStatement) BEGIN_CLASS_MEMBER(vl::workflow::WfCoPauseStatement) CLASS_MEMBER_BASE(vl::workflow::WfCoroutineStatement) CLASS_MEMBER_CONSTRUCTOR(vl::Ptr(), NO_PARAMETER) CLASS_MEMBER_FIELD(statement) END_CLASS_MEMBER(vl::workflow::WfCoPauseStatement) BEGIN_CLASS_MEMBER(vl::workflow::WfCoOperatorStatement) CLASS_MEMBER_BASE(vl::workflow::WfCoroutineStatement) CLASS_MEMBER_CONSTRUCTOR(vl::Ptr(), NO_PARAMETER) CLASS_MEMBER_FIELD(varName) CLASS_MEMBER_FIELD(opName) CLASS_MEMBER_FIELD(arguments) END_CLASS_MEMBER(vl::workflow::WfCoOperatorStatement) BEGIN_ENUM_ITEM(vl::workflow::WfStateSwitchType) ENUM_ITEM_NAMESPACE(vl::workflow::WfStateSwitchType) ENUM_NAMESPACE_ITEM(Default) ENUM_NAMESPACE_ITEM(Pass) ENUM_NAMESPACE_ITEM(PassAndReturn) ENUM_NAMESPACE_ITEM(Ignore) ENUM_NAMESPACE_ITEM(IgnoreAndReturn) END_ENUM_ITEM(vl::workflow::WfStateSwitchType) BEGIN_ENUM_ITEM(vl::workflow::WfStateInvokeType) ENUM_ITEM_NAMESPACE(vl::workflow::WfStateInvokeType) ENUM_NAMESPACE_ITEM(Goto) ENUM_NAMESPACE_ITEM(Push) END_ENUM_ITEM(vl::workflow::WfStateInvokeType) BEGIN_CLASS_MEMBER(vl::workflow::WfStateMachineStatement) CLASS_MEMBER_BASE(vl::workflow::WfStatement) END_CLASS_MEMBER(vl::workflow::WfStateMachineStatement) BEGIN_CLASS_MEMBER(vl::workflow::WfStateSwitchArgument) CLASS_MEMBER_BASE(vl::glr::ParsingAstBase) CLASS_MEMBER_CONSTRUCTOR(vl::Ptr(), NO_PARAMETER) CLASS_MEMBER_FIELD(name) END_CLASS_MEMBER(vl::workflow::WfStateSwitchArgument) BEGIN_CLASS_MEMBER(vl::workflow::WfStateSwitchCase) CLASS_MEMBER_BASE(vl::glr::ParsingAstBase) CLASS_MEMBER_CONSTRUCTOR(vl::Ptr(), NO_PARAMETER) CLASS_MEMBER_FIELD(name) CLASS_MEMBER_FIELD(arguments) CLASS_MEMBER_FIELD(statement) END_CLASS_MEMBER(vl::workflow::WfStateSwitchCase) BEGIN_CLASS_MEMBER(vl::workflow::WfStateSwitchStatement) CLASS_MEMBER_BASE(vl::workflow::WfStateMachineStatement) CLASS_MEMBER_CONSTRUCTOR(vl::Ptr(), NO_PARAMETER) CLASS_MEMBER_FIELD(type) CLASS_MEMBER_FIELD(caseBranches) END_CLASS_MEMBER(vl::workflow::WfStateSwitchStatement) BEGIN_CLASS_MEMBER(vl::workflow::WfStateInvokeStatement) CLASS_MEMBER_BASE(vl::workflow::WfStateMachineStatement) CLASS_MEMBER_CONSTRUCTOR(vl::Ptr(), NO_PARAMETER) CLASS_MEMBER_FIELD(type) CLASS_MEMBER_FIELD(name) CLASS_MEMBER_FIELD(arguments) END_CLASS_MEMBER(vl::workflow::WfStateInvokeStatement) BEGIN_CLASS_MEMBER(vl::workflow::WfThisExpression) CLASS_MEMBER_BASE(vl::workflow::WfExpression) CLASS_MEMBER_CONSTRUCTOR(vl::Ptr(), NO_PARAMETER) END_CLASS_MEMBER(vl::workflow::WfThisExpression) BEGIN_CLASS_MEMBER(vl::workflow::WfTopQualifiedExpression) CLASS_MEMBER_BASE(vl::workflow::WfExpression) CLASS_MEMBER_CONSTRUCTOR(vl::Ptr(), NO_PARAMETER) CLASS_MEMBER_FIELD(name) END_CLASS_MEMBER(vl::workflow::WfTopQualifiedExpression) BEGIN_CLASS_MEMBER(vl::workflow::WfReferenceExpression) CLASS_MEMBER_BASE(vl::workflow::WfExpression) CLASS_MEMBER_CONSTRUCTOR(vl::Ptr(), NO_PARAMETER) CLASS_MEMBER_FIELD(name) END_CLASS_MEMBER(vl::workflow::WfReferenceExpression) BEGIN_CLASS_MEMBER(vl::workflow::WfOrderedNameExpression) CLASS_MEMBER_BASE(vl::workflow::WfExpression) CLASS_MEMBER_CONSTRUCTOR(vl::Ptr(), NO_PARAMETER) CLASS_MEMBER_FIELD(name) END_CLASS_MEMBER(vl::workflow::WfOrderedNameExpression) BEGIN_CLASS_MEMBER(vl::workflow::WfOrderedLambdaExpression) CLASS_MEMBER_BASE(vl::workflow::WfExpression) CLASS_MEMBER_CONSTRUCTOR(vl::Ptr(), NO_PARAMETER) CLASS_MEMBER_FIELD(body) END_CLASS_MEMBER(vl::workflow::WfOrderedLambdaExpression) BEGIN_CLASS_MEMBER(vl::workflow::WfMemberExpression) CLASS_MEMBER_BASE(vl::workflow::WfExpression) CLASS_MEMBER_CONSTRUCTOR(vl::Ptr(), NO_PARAMETER) CLASS_MEMBER_FIELD(parent) CLASS_MEMBER_FIELD(name) END_CLASS_MEMBER(vl::workflow::WfMemberExpression) BEGIN_CLASS_MEMBER(vl::workflow::WfChildExpression) CLASS_MEMBER_BASE(vl::workflow::WfExpression) CLASS_MEMBER_CONSTRUCTOR(vl::Ptr(), NO_PARAMETER) CLASS_MEMBER_FIELD(parent) CLASS_MEMBER_FIELD(name) END_CLASS_MEMBER(vl::workflow::WfChildExpression) BEGIN_ENUM_ITEM(vl::workflow::WfLiteralValue) ENUM_ITEM_NAMESPACE(vl::workflow::WfLiteralValue) ENUM_NAMESPACE_ITEM(Null) ENUM_NAMESPACE_ITEM(True) ENUM_NAMESPACE_ITEM(False) END_ENUM_ITEM(vl::workflow::WfLiteralValue) BEGIN_CLASS_MEMBER(vl::workflow::WfLiteralExpression) CLASS_MEMBER_BASE(vl::workflow::WfExpression) CLASS_MEMBER_CONSTRUCTOR(vl::Ptr(), NO_PARAMETER) CLASS_MEMBER_FIELD(value) END_CLASS_MEMBER(vl::workflow::WfLiteralExpression) BEGIN_CLASS_MEMBER(vl::workflow::WfFloatingExpression) CLASS_MEMBER_BASE(vl::workflow::WfExpression) CLASS_MEMBER_CONSTRUCTOR(vl::Ptr(), NO_PARAMETER) CLASS_MEMBER_FIELD(value) END_CLASS_MEMBER(vl::workflow::WfFloatingExpression) BEGIN_CLASS_MEMBER(vl::workflow::WfIntegerExpression) CLASS_MEMBER_BASE(vl::workflow::WfExpression) CLASS_MEMBER_CONSTRUCTOR(vl::Ptr(), NO_PARAMETER) CLASS_MEMBER_FIELD(value) END_CLASS_MEMBER(vl::workflow::WfIntegerExpression) BEGIN_CLASS_MEMBER(vl::workflow::WfStringExpression) CLASS_MEMBER_BASE(vl::workflow::WfExpression) CLASS_MEMBER_CONSTRUCTOR(vl::Ptr(), NO_PARAMETER) CLASS_MEMBER_FIELD(value) END_CLASS_MEMBER(vl::workflow::WfStringExpression) BEGIN_ENUM_ITEM(vl::workflow::WfUnaryOperator) ENUM_ITEM_NAMESPACE(vl::workflow::WfUnaryOperator) ENUM_NAMESPACE_ITEM(Positive) ENUM_NAMESPACE_ITEM(Negative) ENUM_NAMESPACE_ITEM(Not) END_ENUM_ITEM(vl::workflow::WfUnaryOperator) BEGIN_CLASS_MEMBER(vl::workflow::WfUnaryExpression) CLASS_MEMBER_BASE(vl::workflow::WfExpression) CLASS_MEMBER_CONSTRUCTOR(vl::Ptr(), NO_PARAMETER) CLASS_MEMBER_FIELD(op) CLASS_MEMBER_FIELD(operand) END_CLASS_MEMBER(vl::workflow::WfUnaryExpression) BEGIN_ENUM_ITEM(vl::workflow::WfBinaryOperator) ENUM_ITEM_NAMESPACE(vl::workflow::WfBinaryOperator) ENUM_NAMESPACE_ITEM(Assign) ENUM_NAMESPACE_ITEM(Index) ENUM_NAMESPACE_ITEM(FlagAnd) ENUM_NAMESPACE_ITEM(FlagOr) ENUM_NAMESPACE_ITEM(FailedThen) ENUM_NAMESPACE_ITEM(Exp) ENUM_NAMESPACE_ITEM(Add) ENUM_NAMESPACE_ITEM(Sub) ENUM_NAMESPACE_ITEM(Mul) ENUM_NAMESPACE_ITEM(Div) ENUM_NAMESPACE_ITEM(Mod) ENUM_NAMESPACE_ITEM(Shl) ENUM_NAMESPACE_ITEM(Shr) ENUM_NAMESPACE_ITEM(LT) ENUM_NAMESPACE_ITEM(GT) ENUM_NAMESPACE_ITEM(LE) ENUM_NAMESPACE_ITEM(GE) ENUM_NAMESPACE_ITEM(EQ) ENUM_NAMESPACE_ITEM(NE) ENUM_NAMESPACE_ITEM(Xor) ENUM_NAMESPACE_ITEM(And) ENUM_NAMESPACE_ITEM(Or) END_ENUM_ITEM(vl::workflow::WfBinaryOperator) BEGIN_CLASS_MEMBER(vl::workflow::WfBinaryExpression) CLASS_MEMBER_BASE(vl::workflow::WfExpression) CLASS_MEMBER_CONSTRUCTOR(vl::Ptr(), NO_PARAMETER) CLASS_MEMBER_FIELD(op) CLASS_MEMBER_FIELD(first) CLASS_MEMBER_FIELD(second) END_CLASS_MEMBER(vl::workflow::WfBinaryExpression) BEGIN_CLASS_MEMBER(vl::workflow::WfLetVariable) CLASS_MEMBER_BASE(vl::glr::ParsingAstBase) CLASS_MEMBER_CONSTRUCTOR(vl::Ptr(), NO_PARAMETER) CLASS_MEMBER_FIELD(name) CLASS_MEMBER_FIELD(value) END_CLASS_MEMBER(vl::workflow::WfLetVariable) BEGIN_CLASS_MEMBER(vl::workflow::WfLetExpression) CLASS_MEMBER_BASE(vl::workflow::WfExpression) CLASS_MEMBER_CONSTRUCTOR(vl::Ptr(), NO_PARAMETER) CLASS_MEMBER_FIELD(variables) CLASS_MEMBER_FIELD(expression) END_CLASS_MEMBER(vl::workflow::WfLetExpression) BEGIN_CLASS_MEMBER(vl::workflow::WfIfExpression) CLASS_MEMBER_BASE(vl::workflow::WfExpression) CLASS_MEMBER_CONSTRUCTOR(vl::Ptr(), NO_PARAMETER) CLASS_MEMBER_FIELD(condition) CLASS_MEMBER_FIELD(trueBranch) CLASS_MEMBER_FIELD(falseBranch) END_CLASS_MEMBER(vl::workflow::WfIfExpression) BEGIN_ENUM_ITEM(vl::workflow::WfRangeBoundary) ENUM_ITEM_NAMESPACE(vl::workflow::WfRangeBoundary) ENUM_NAMESPACE_ITEM(Inclusive) ENUM_NAMESPACE_ITEM(Exclusive) END_ENUM_ITEM(vl::workflow::WfRangeBoundary) BEGIN_CLASS_MEMBER(vl::workflow::WfRangeExpression) CLASS_MEMBER_BASE(vl::workflow::WfExpression) CLASS_MEMBER_CONSTRUCTOR(vl::Ptr(), NO_PARAMETER) CLASS_MEMBER_FIELD(begin) CLASS_MEMBER_FIELD(beginBoundary) CLASS_MEMBER_FIELD(end) CLASS_MEMBER_FIELD(endBoundary) END_CLASS_MEMBER(vl::workflow::WfRangeExpression) BEGIN_ENUM_ITEM(vl::workflow::WfSetTesting) ENUM_ITEM_NAMESPACE(vl::workflow::WfSetTesting) ENUM_NAMESPACE_ITEM(In) ENUM_NAMESPACE_ITEM(NotIn) END_ENUM_ITEM(vl::workflow::WfSetTesting) BEGIN_CLASS_MEMBER(vl::workflow::WfSetTestingExpression) CLASS_MEMBER_BASE(vl::workflow::WfExpression) CLASS_MEMBER_CONSTRUCTOR(vl::Ptr(), NO_PARAMETER) CLASS_MEMBER_FIELD(test) CLASS_MEMBER_FIELD(element) CLASS_MEMBER_FIELD(collection) END_CLASS_MEMBER(vl::workflow::WfSetTestingExpression) BEGIN_CLASS_MEMBER(vl::workflow::WfConstructorArgument) CLASS_MEMBER_BASE(vl::glr::ParsingAstBase) CLASS_MEMBER_CONSTRUCTOR(vl::Ptr(), NO_PARAMETER) CLASS_MEMBER_FIELD(key) CLASS_MEMBER_FIELD(value) END_CLASS_MEMBER(vl::workflow::WfConstructorArgument) BEGIN_CLASS_MEMBER(vl::workflow::WfConstructorExpression) CLASS_MEMBER_BASE(vl::workflow::WfExpression) CLASS_MEMBER_CONSTRUCTOR(vl::Ptr(), NO_PARAMETER) CLASS_MEMBER_FIELD(arguments) END_CLASS_MEMBER(vl::workflow::WfConstructorExpression) BEGIN_CLASS_MEMBER(vl::workflow::WfInferExpression) CLASS_MEMBER_BASE(vl::workflow::WfExpression) CLASS_MEMBER_CONSTRUCTOR(vl::Ptr(), NO_PARAMETER) CLASS_MEMBER_FIELD(expression) CLASS_MEMBER_FIELD(type) END_CLASS_MEMBER(vl::workflow::WfInferExpression) BEGIN_ENUM_ITEM(vl::workflow::WfTypeCastingStrategy) ENUM_ITEM_NAMESPACE(vl::workflow::WfTypeCastingStrategy) ENUM_NAMESPACE_ITEM(Strong) ENUM_NAMESPACE_ITEM(Weak) END_ENUM_ITEM(vl::workflow::WfTypeCastingStrategy) BEGIN_CLASS_MEMBER(vl::workflow::WfTypeCastingExpression) CLASS_MEMBER_BASE(vl::workflow::WfExpression) CLASS_MEMBER_CONSTRUCTOR(vl::Ptr(), NO_PARAMETER) CLASS_MEMBER_FIELD(strategy) CLASS_MEMBER_FIELD(expression) CLASS_MEMBER_FIELD(type) END_CLASS_MEMBER(vl::workflow::WfTypeCastingExpression) BEGIN_ENUM_ITEM(vl::workflow::WfTypeTesting) ENUM_ITEM_NAMESPACE(vl::workflow::WfTypeTesting) ENUM_NAMESPACE_ITEM(IsType) ENUM_NAMESPACE_ITEM(IsNotType) ENUM_NAMESPACE_ITEM(IsNull) ENUM_NAMESPACE_ITEM(IsNotNull) END_ENUM_ITEM(vl::workflow::WfTypeTesting) BEGIN_CLASS_MEMBER(vl::workflow::WfTypeTestingExpression) CLASS_MEMBER_BASE(vl::workflow::WfExpression) CLASS_MEMBER_CONSTRUCTOR(vl::Ptr(), NO_PARAMETER) CLASS_MEMBER_FIELD(test) CLASS_MEMBER_FIELD(expression) CLASS_MEMBER_FIELD(type) END_CLASS_MEMBER(vl::workflow::WfTypeTestingExpression) BEGIN_CLASS_MEMBER(vl::workflow::WfTypeOfTypeExpression) CLASS_MEMBER_BASE(vl::workflow::WfExpression) CLASS_MEMBER_CONSTRUCTOR(vl::Ptr(), NO_PARAMETER) CLASS_MEMBER_FIELD(type) END_CLASS_MEMBER(vl::workflow::WfTypeOfTypeExpression) BEGIN_CLASS_MEMBER(vl::workflow::WfTypeOfExpressionExpression) CLASS_MEMBER_BASE(vl::workflow::WfExpression) CLASS_MEMBER_CONSTRUCTOR(vl::Ptr(), NO_PARAMETER) CLASS_MEMBER_FIELD(expression) END_CLASS_MEMBER(vl::workflow::WfTypeOfExpressionExpression) BEGIN_CLASS_MEMBER(vl::workflow::WfAttachEventExpression) CLASS_MEMBER_BASE(vl::workflow::WfExpression) CLASS_MEMBER_CONSTRUCTOR(vl::Ptr(), NO_PARAMETER) CLASS_MEMBER_FIELD(event) CLASS_MEMBER_FIELD(function) END_CLASS_MEMBER(vl::workflow::WfAttachEventExpression) BEGIN_CLASS_MEMBER(vl::workflow::WfDetachEventExpression) CLASS_MEMBER_BASE(vl::workflow::WfExpression) CLASS_MEMBER_CONSTRUCTOR(vl::Ptr(), NO_PARAMETER) CLASS_MEMBER_FIELD(event) CLASS_MEMBER_FIELD(handler) END_CLASS_MEMBER(vl::workflow::WfDetachEventExpression) BEGIN_ENUM_ITEM(vl::workflow::WfObserveType) ENUM_ITEM_NAMESPACE(vl::workflow::WfObserveType) ENUM_NAMESPACE_ITEM(SimpleObserve) ENUM_NAMESPACE_ITEM(ExtendedObserve) END_ENUM_ITEM(vl::workflow::WfObserveType) BEGIN_CLASS_MEMBER(vl::workflow::WfObserveExpression) CLASS_MEMBER_BASE(vl::workflow::WfExpression) CLASS_MEMBER_CONSTRUCTOR(vl::Ptr(), NO_PARAMETER) CLASS_MEMBER_FIELD(parent) CLASS_MEMBER_FIELD(observeType) CLASS_MEMBER_FIELD(name) CLASS_MEMBER_FIELD(expression) CLASS_MEMBER_FIELD(events) END_CLASS_MEMBER(vl::workflow::WfObserveExpression) BEGIN_CLASS_MEMBER(vl::workflow::WfCallExpression) CLASS_MEMBER_BASE(vl::workflow::WfExpression) CLASS_MEMBER_CONSTRUCTOR(vl::Ptr(), NO_PARAMETER) CLASS_MEMBER_FIELD(function) CLASS_MEMBER_FIELD(arguments) END_CLASS_MEMBER(vl::workflow::WfCallExpression) BEGIN_CLASS_MEMBER(vl::workflow::WfFunctionExpression) CLASS_MEMBER_BASE(vl::workflow::WfExpression) CLASS_MEMBER_CONSTRUCTOR(vl::Ptr(), NO_PARAMETER) CLASS_MEMBER_FIELD(function) END_CLASS_MEMBER(vl::workflow::WfFunctionExpression) BEGIN_CLASS_MEMBER(vl::workflow::WfNewClassExpression) CLASS_MEMBER_BASE(vl::workflow::WfExpression) CLASS_MEMBER_CONSTRUCTOR(vl::Ptr(), NO_PARAMETER) CLASS_MEMBER_FIELD(type) CLASS_MEMBER_FIELD(arguments) END_CLASS_MEMBER(vl::workflow::WfNewClassExpression) BEGIN_CLASS_MEMBER(vl::workflow::WfNewInterfaceExpression) CLASS_MEMBER_BASE(vl::workflow::WfExpression) CLASS_MEMBER_CONSTRUCTOR(vl::Ptr(), NO_PARAMETER) CLASS_MEMBER_FIELD(type) CLASS_MEMBER_FIELD(declarations) END_CLASS_MEMBER(vl::workflow::WfNewInterfaceExpression) BEGIN_CLASS_MEMBER(vl::workflow::WfVirtualCfeExpression) CLASS_MEMBER_BASE(vl::workflow::WfExpression) CLASS_MEMBER_FIELD(expandedExpression) END_CLASS_MEMBER(vl::workflow::WfVirtualCfeExpression) BEGIN_CLASS_MEMBER(vl::workflow::WfFormatExpression) CLASS_MEMBER_BASE(vl::workflow::WfVirtualCfeExpression) CLASS_MEMBER_CONSTRUCTOR(vl::Ptr(), NO_PARAMETER) CLASS_MEMBER_FIELD(value) END_CLASS_MEMBER(vl::workflow::WfFormatExpression) BEGIN_CLASS_MEMBER(vl::workflow::WfVirtualCseExpression) CLASS_MEMBER_BASE(vl::workflow::WfExpression) CLASS_MEMBER_FIELD(expandedExpression) END_CLASS_MEMBER(vl::workflow::WfVirtualCseExpression) BEGIN_CLASS_MEMBER(vl::workflow::WfBindExpression) CLASS_MEMBER_BASE(vl::workflow::WfVirtualCseExpression) CLASS_MEMBER_CONSTRUCTOR(vl::Ptr(), NO_PARAMETER) CLASS_MEMBER_FIELD(expression) END_CLASS_MEMBER(vl::workflow::WfBindExpression) BEGIN_CLASS_MEMBER(vl::workflow::WfNewCoroutineExpression) CLASS_MEMBER_BASE(vl::workflow::WfVirtualCseExpression) CLASS_MEMBER_CONSTRUCTOR(vl::Ptr(), NO_PARAMETER) CLASS_MEMBER_FIELD(name) CLASS_MEMBER_FIELD(statement) END_CLASS_MEMBER(vl::workflow::WfNewCoroutineExpression) BEGIN_CLASS_MEMBER(vl::workflow::WfMixinCastExpression) CLASS_MEMBER_BASE(vl::workflow::WfVirtualCseExpression) CLASS_MEMBER_CONSTRUCTOR(vl::Ptr(), NO_PARAMETER) CLASS_MEMBER_FIELD(type) CLASS_MEMBER_FIELD(expression) END_CLASS_MEMBER(vl::workflow::WfMixinCastExpression) BEGIN_CLASS_MEMBER(vl::workflow::WfExpectedTypeCastExpression) CLASS_MEMBER_BASE(vl::workflow::WfVirtualCseExpression) CLASS_MEMBER_CONSTRUCTOR(vl::Ptr(), NO_PARAMETER) CLASS_MEMBER_FIELD(strategy) CLASS_MEMBER_FIELD(expression) END_CLASS_MEMBER(vl::workflow::WfExpectedTypeCastExpression) BEGIN_CLASS_MEMBER(vl::workflow::WfCoOperatorExpression) CLASS_MEMBER_BASE(vl::workflow::WfVirtualCseExpression) CLASS_MEMBER_CONSTRUCTOR(vl::Ptr(), NO_PARAMETER) CLASS_MEMBER_FIELD(name) END_CLASS_MEMBER(vl::workflow::WfCoOperatorExpression) BEGIN_CLASS_MEMBER(vl::workflow::WfModuleUsingFragment) CLASS_MEMBER_BASE(vl::glr::ParsingAstBase) END_CLASS_MEMBER(vl::workflow::WfModuleUsingFragment) BEGIN_CLASS_MEMBER(vl::workflow::WfModuleUsingNameFragment) CLASS_MEMBER_BASE(vl::workflow::WfModuleUsingFragment) CLASS_MEMBER_CONSTRUCTOR(vl::Ptr(), NO_PARAMETER) CLASS_MEMBER_FIELD(name) END_CLASS_MEMBER(vl::workflow::WfModuleUsingNameFragment) BEGIN_CLASS_MEMBER(vl::workflow::WfModuleUsingWildCardFragment) CLASS_MEMBER_BASE(vl::workflow::WfModuleUsingFragment) CLASS_MEMBER_CONSTRUCTOR(vl::Ptr(), NO_PARAMETER) END_CLASS_MEMBER(vl::workflow::WfModuleUsingWildCardFragment) BEGIN_CLASS_MEMBER(vl::workflow::WfModuleUsingItem) CLASS_MEMBER_BASE(vl::glr::ParsingAstBase) CLASS_MEMBER_CONSTRUCTOR(vl::Ptr(), NO_PARAMETER) CLASS_MEMBER_FIELD(fragments) END_CLASS_MEMBER(vl::workflow::WfModuleUsingItem) BEGIN_CLASS_MEMBER(vl::workflow::WfModuleUsingPath) CLASS_MEMBER_BASE(vl::glr::ParsingAstBase) CLASS_MEMBER_CONSTRUCTOR(vl::Ptr(), NO_PARAMETER) CLASS_MEMBER_FIELD(items) END_CLASS_MEMBER(vl::workflow::WfModuleUsingPath) BEGIN_ENUM_ITEM(vl::workflow::WfModuleType) ENUM_ITEM_NAMESPACE(vl::workflow::WfModuleType) ENUM_NAMESPACE_ITEM(Module) ENUM_NAMESPACE_ITEM(Unit) END_ENUM_ITEM(vl::workflow::WfModuleType) BEGIN_CLASS_MEMBER(vl::workflow::WfModule) CLASS_MEMBER_BASE(vl::glr::ParsingAstBase) CLASS_MEMBER_CONSTRUCTOR(vl::Ptr(), NO_PARAMETER) CLASS_MEMBER_FIELD(moduleType) CLASS_MEMBER_FIELD(name) CLASS_MEMBER_FIELD(paths) CLASS_MEMBER_FIELD(declarations) END_CLASS_MEMBER(vl::workflow::WfModule) BEGIN_INTERFACE_MEMBER(vl::workflow::WfType::IVisitor) CLASS_MEMBER_METHOD_OVERLOAD(Visit, {L"node"}, void(vl::workflow::WfType::IVisitor::*)(vl::workflow::WfPredefinedType* node)) CLASS_MEMBER_METHOD_OVERLOAD(Visit, {L"node"}, void(vl::workflow::WfType::IVisitor::*)(vl::workflow::WfTopQualifiedType* node)) CLASS_MEMBER_METHOD_OVERLOAD(Visit, {L"node"}, void(vl::workflow::WfType::IVisitor::*)(vl::workflow::WfReferenceType* node)) CLASS_MEMBER_METHOD_OVERLOAD(Visit, {L"node"}, void(vl::workflow::WfType::IVisitor::*)(vl::workflow::WfRawPointerType* node)) CLASS_MEMBER_METHOD_OVERLOAD(Visit, {L"node"}, void(vl::workflow::WfType::IVisitor::*)(vl::workflow::WfSharedPointerType* node)) CLASS_MEMBER_METHOD_OVERLOAD(Visit, {L"node"}, void(vl::workflow::WfType::IVisitor::*)(vl::workflow::WfNullableType* node)) CLASS_MEMBER_METHOD_OVERLOAD(Visit, {L"node"}, void(vl::workflow::WfType::IVisitor::*)(vl::workflow::WfEnumerableType* node)) CLASS_MEMBER_METHOD_OVERLOAD(Visit, {L"node"}, void(vl::workflow::WfType::IVisitor::*)(vl::workflow::WfMapType* node)) CLASS_MEMBER_METHOD_OVERLOAD(Visit, {L"node"}, void(vl::workflow::WfType::IVisitor::*)(vl::workflow::WfObservableListType* node)) CLASS_MEMBER_METHOD_OVERLOAD(Visit, {L"node"}, void(vl::workflow::WfType::IVisitor::*)(vl::workflow::WfFunctionType* node)) CLASS_MEMBER_METHOD_OVERLOAD(Visit, {L"node"}, void(vl::workflow::WfType::IVisitor::*)(vl::workflow::WfChildType* node)) END_INTERFACE_MEMBER(vl::workflow::WfType) BEGIN_INTERFACE_MEMBER(vl::workflow::WfExpression::IVisitor) CLASS_MEMBER_METHOD_OVERLOAD(Visit, {L"node"}, void(vl::workflow::WfExpression::IVisitor::*)(vl::workflow::WfThisExpression* node)) CLASS_MEMBER_METHOD_OVERLOAD(Visit, {L"node"}, void(vl::workflow::WfExpression::IVisitor::*)(vl::workflow::WfTopQualifiedExpression* node)) CLASS_MEMBER_METHOD_OVERLOAD(Visit, {L"node"}, void(vl::workflow::WfExpression::IVisitor::*)(vl::workflow::WfReferenceExpression* node)) CLASS_MEMBER_METHOD_OVERLOAD(Visit, {L"node"}, void(vl::workflow::WfExpression::IVisitor::*)(vl::workflow::WfOrderedNameExpression* node)) CLASS_MEMBER_METHOD_OVERLOAD(Visit, {L"node"}, void(vl::workflow::WfExpression::IVisitor::*)(vl::workflow::WfOrderedLambdaExpression* node)) CLASS_MEMBER_METHOD_OVERLOAD(Visit, {L"node"}, void(vl::workflow::WfExpression::IVisitor::*)(vl::workflow::WfMemberExpression* node)) CLASS_MEMBER_METHOD_OVERLOAD(Visit, {L"node"}, void(vl::workflow::WfExpression::IVisitor::*)(vl::workflow::WfChildExpression* node)) CLASS_MEMBER_METHOD_OVERLOAD(Visit, {L"node"}, void(vl::workflow::WfExpression::IVisitor::*)(vl::workflow::WfLiteralExpression* node)) CLASS_MEMBER_METHOD_OVERLOAD(Visit, {L"node"}, void(vl::workflow::WfExpression::IVisitor::*)(vl::workflow::WfFloatingExpression* node)) CLASS_MEMBER_METHOD_OVERLOAD(Visit, {L"node"}, void(vl::workflow::WfExpression::IVisitor::*)(vl::workflow::WfIntegerExpression* node)) CLASS_MEMBER_METHOD_OVERLOAD(Visit, {L"node"}, void(vl::workflow::WfExpression::IVisitor::*)(vl::workflow::WfStringExpression* node)) CLASS_MEMBER_METHOD_OVERLOAD(Visit, {L"node"}, void(vl::workflow::WfExpression::IVisitor::*)(vl::workflow::WfUnaryExpression* node)) CLASS_MEMBER_METHOD_OVERLOAD(Visit, {L"node"}, void(vl::workflow::WfExpression::IVisitor::*)(vl::workflow::WfBinaryExpression* node)) CLASS_MEMBER_METHOD_OVERLOAD(Visit, {L"node"}, void(vl::workflow::WfExpression::IVisitor::*)(vl::workflow::WfLetExpression* node)) CLASS_MEMBER_METHOD_OVERLOAD(Visit, {L"node"}, void(vl::workflow::WfExpression::IVisitor::*)(vl::workflow::WfIfExpression* node)) CLASS_MEMBER_METHOD_OVERLOAD(Visit, {L"node"}, void(vl::workflow::WfExpression::IVisitor::*)(vl::workflow::WfRangeExpression* node)) CLASS_MEMBER_METHOD_OVERLOAD(Visit, {L"node"}, void(vl::workflow::WfExpression::IVisitor::*)(vl::workflow::WfSetTestingExpression* node)) CLASS_MEMBER_METHOD_OVERLOAD(Visit, {L"node"}, void(vl::workflow::WfExpression::IVisitor::*)(vl::workflow::WfConstructorExpression* node)) CLASS_MEMBER_METHOD_OVERLOAD(Visit, {L"node"}, void(vl::workflow::WfExpression::IVisitor::*)(vl::workflow::WfInferExpression* node)) CLASS_MEMBER_METHOD_OVERLOAD(Visit, {L"node"}, void(vl::workflow::WfExpression::IVisitor::*)(vl::workflow::WfTypeCastingExpression* node)) CLASS_MEMBER_METHOD_OVERLOAD(Visit, {L"node"}, void(vl::workflow::WfExpression::IVisitor::*)(vl::workflow::WfTypeTestingExpression* node)) CLASS_MEMBER_METHOD_OVERLOAD(Visit, {L"node"}, void(vl::workflow::WfExpression::IVisitor::*)(vl::workflow::WfTypeOfTypeExpression* node)) CLASS_MEMBER_METHOD_OVERLOAD(Visit, {L"node"}, void(vl::workflow::WfExpression::IVisitor::*)(vl::workflow::WfTypeOfExpressionExpression* node)) CLASS_MEMBER_METHOD_OVERLOAD(Visit, {L"node"}, void(vl::workflow::WfExpression::IVisitor::*)(vl::workflow::WfAttachEventExpression* node)) CLASS_MEMBER_METHOD_OVERLOAD(Visit, {L"node"}, void(vl::workflow::WfExpression::IVisitor::*)(vl::workflow::WfDetachEventExpression* node)) CLASS_MEMBER_METHOD_OVERLOAD(Visit, {L"node"}, void(vl::workflow::WfExpression::IVisitor::*)(vl::workflow::WfObserveExpression* node)) CLASS_MEMBER_METHOD_OVERLOAD(Visit, {L"node"}, void(vl::workflow::WfExpression::IVisitor::*)(vl::workflow::WfCallExpression* node)) CLASS_MEMBER_METHOD_OVERLOAD(Visit, {L"node"}, void(vl::workflow::WfExpression::IVisitor::*)(vl::workflow::WfFunctionExpression* node)) CLASS_MEMBER_METHOD_OVERLOAD(Visit, {L"node"}, void(vl::workflow::WfExpression::IVisitor::*)(vl::workflow::WfNewClassExpression* node)) CLASS_MEMBER_METHOD_OVERLOAD(Visit, {L"node"}, void(vl::workflow::WfExpression::IVisitor::*)(vl::workflow::WfNewInterfaceExpression* node)) CLASS_MEMBER_METHOD_OVERLOAD(Visit, {L"node"}, void(vl::workflow::WfExpression::IVisitor::*)(vl::workflow::WfVirtualCfeExpression* node)) CLASS_MEMBER_METHOD_OVERLOAD(Visit, {L"node"}, void(vl::workflow::WfExpression::IVisitor::*)(vl::workflow::WfVirtualCseExpression* node)) END_INTERFACE_MEMBER(vl::workflow::WfExpression) BEGIN_INTERFACE_MEMBER(vl::workflow::WfStatement::IVisitor) CLASS_MEMBER_METHOD_OVERLOAD(Visit, {L"node"}, void(vl::workflow::WfStatement::IVisitor::*)(vl::workflow::WfBreakStatement* node)) CLASS_MEMBER_METHOD_OVERLOAD(Visit, {L"node"}, void(vl::workflow::WfStatement::IVisitor::*)(vl::workflow::WfContinueStatement* node)) CLASS_MEMBER_METHOD_OVERLOAD(Visit, {L"node"}, void(vl::workflow::WfStatement::IVisitor::*)(vl::workflow::WfReturnStatement* node)) CLASS_MEMBER_METHOD_OVERLOAD(Visit, {L"node"}, void(vl::workflow::WfStatement::IVisitor::*)(vl::workflow::WfDeleteStatement* node)) CLASS_MEMBER_METHOD_OVERLOAD(Visit, {L"node"}, void(vl::workflow::WfStatement::IVisitor::*)(vl::workflow::WfRaiseExceptionStatement* node)) CLASS_MEMBER_METHOD_OVERLOAD(Visit, {L"node"}, void(vl::workflow::WfStatement::IVisitor::*)(vl::workflow::WfIfStatement* node)) CLASS_MEMBER_METHOD_OVERLOAD(Visit, {L"node"}, void(vl::workflow::WfStatement::IVisitor::*)(vl::workflow::WfWhileStatement* node)) CLASS_MEMBER_METHOD_OVERLOAD(Visit, {L"node"}, void(vl::workflow::WfStatement::IVisitor::*)(vl::workflow::WfTryStatement* node)) CLASS_MEMBER_METHOD_OVERLOAD(Visit, {L"node"}, void(vl::workflow::WfStatement::IVisitor::*)(vl::workflow::WfBlockStatement* node)) CLASS_MEMBER_METHOD_OVERLOAD(Visit, {L"node"}, void(vl::workflow::WfStatement::IVisitor::*)(vl::workflow::WfGotoStatement* node)) CLASS_MEMBER_METHOD_OVERLOAD(Visit, {L"node"}, void(vl::workflow::WfStatement::IVisitor::*)(vl::workflow::WfVariableStatement* node)) CLASS_MEMBER_METHOD_OVERLOAD(Visit, {L"node"}, void(vl::workflow::WfStatement::IVisitor::*)(vl::workflow::WfExpressionStatement* node)) CLASS_MEMBER_METHOD_OVERLOAD(Visit, {L"node"}, void(vl::workflow::WfStatement::IVisitor::*)(vl::workflow::WfVirtualCseStatement* node)) CLASS_MEMBER_METHOD_OVERLOAD(Visit, {L"node"}, void(vl::workflow::WfStatement::IVisitor::*)(vl::workflow::WfCoroutineStatement* node)) CLASS_MEMBER_METHOD_OVERLOAD(Visit, {L"node"}, void(vl::workflow::WfStatement::IVisitor::*)(vl::workflow::WfStateMachineStatement* node)) END_INTERFACE_MEMBER(vl::workflow::WfStatement) BEGIN_INTERFACE_MEMBER(vl::workflow::WfDeclaration::IVisitor) CLASS_MEMBER_METHOD_OVERLOAD(Visit, {L"node"}, void(vl::workflow::WfDeclaration::IVisitor::*)(vl::workflow::WfNamespaceDeclaration* node)) CLASS_MEMBER_METHOD_OVERLOAD(Visit, {L"node"}, void(vl::workflow::WfDeclaration::IVisitor::*)(vl::workflow::WfFunctionDeclaration* node)) CLASS_MEMBER_METHOD_OVERLOAD(Visit, {L"node"}, void(vl::workflow::WfDeclaration::IVisitor::*)(vl::workflow::WfVariableDeclaration* node)) CLASS_MEMBER_METHOD_OVERLOAD(Visit, {L"node"}, void(vl::workflow::WfDeclaration::IVisitor::*)(vl::workflow::WfEventDeclaration* node)) CLASS_MEMBER_METHOD_OVERLOAD(Visit, {L"node"}, void(vl::workflow::WfDeclaration::IVisitor::*)(vl::workflow::WfPropertyDeclaration* node)) CLASS_MEMBER_METHOD_OVERLOAD(Visit, {L"node"}, void(vl::workflow::WfDeclaration::IVisitor::*)(vl::workflow::WfStaticInitDeclaration* node)) CLASS_MEMBER_METHOD_OVERLOAD(Visit, {L"node"}, void(vl::workflow::WfDeclaration::IVisitor::*)(vl::workflow::WfConstructorDeclaration* node)) CLASS_MEMBER_METHOD_OVERLOAD(Visit, {L"node"}, void(vl::workflow::WfDeclaration::IVisitor::*)(vl::workflow::WfDestructorDeclaration* node)) CLASS_MEMBER_METHOD_OVERLOAD(Visit, {L"node"}, void(vl::workflow::WfDeclaration::IVisitor::*)(vl::workflow::WfClassDeclaration* node)) CLASS_MEMBER_METHOD_OVERLOAD(Visit, {L"node"}, void(vl::workflow::WfDeclaration::IVisitor::*)(vl::workflow::WfEnumDeclaration* node)) CLASS_MEMBER_METHOD_OVERLOAD(Visit, {L"node"}, void(vl::workflow::WfDeclaration::IVisitor::*)(vl::workflow::WfStructDeclaration* node)) CLASS_MEMBER_METHOD_OVERLOAD(Visit, {L"node"}, void(vl::workflow::WfDeclaration::IVisitor::*)(vl::workflow::WfVirtualCfeDeclaration* node)) CLASS_MEMBER_METHOD_OVERLOAD(Visit, {L"node"}, void(vl::workflow::WfDeclaration::IVisitor::*)(vl::workflow::WfVirtualCseDeclaration* node)) END_INTERFACE_MEMBER(vl::workflow::WfDeclaration) BEGIN_INTERFACE_MEMBER(vl::workflow::WfVirtualCfeDeclaration::IVisitor) CLASS_MEMBER_METHOD_OVERLOAD(Visit, {L"node"}, void(vl::workflow::WfVirtualCfeDeclaration::IVisitor::*)(vl::workflow::WfAutoPropertyDeclaration* node)) CLASS_MEMBER_METHOD_OVERLOAD(Visit, {L"node"}, void(vl::workflow::WfVirtualCfeDeclaration::IVisitor::*)(vl::workflow::WfCastResultInterfaceDeclaration* node)) END_INTERFACE_MEMBER(vl::workflow::WfVirtualCfeDeclaration) BEGIN_INTERFACE_MEMBER(vl::workflow::WfVirtualCseDeclaration::IVisitor) CLASS_MEMBER_METHOD_OVERLOAD(Visit, {L"node"}, void(vl::workflow::WfVirtualCseDeclaration::IVisitor::*)(vl::workflow::WfStateMachineDeclaration* node)) END_INTERFACE_MEMBER(vl::workflow::WfVirtualCseDeclaration) BEGIN_INTERFACE_MEMBER(vl::workflow::WfVirtualCseStatement::IVisitor) CLASS_MEMBER_METHOD_OVERLOAD(Visit, {L"node"}, void(vl::workflow::WfVirtualCseStatement::IVisitor::*)(vl::workflow::WfForEachStatement* node)) CLASS_MEMBER_METHOD_OVERLOAD(Visit, {L"node"}, void(vl::workflow::WfVirtualCseStatement::IVisitor::*)(vl::workflow::WfSwitchStatement* node)) CLASS_MEMBER_METHOD_OVERLOAD(Visit, {L"node"}, void(vl::workflow::WfVirtualCseStatement::IVisitor::*)(vl::workflow::WfCoProviderStatement* node)) END_INTERFACE_MEMBER(vl::workflow::WfVirtualCseStatement) BEGIN_INTERFACE_MEMBER(vl::workflow::WfCoroutineStatement::IVisitor) CLASS_MEMBER_METHOD_OVERLOAD(Visit, {L"node"}, void(vl::workflow::WfCoroutineStatement::IVisitor::*)(vl::workflow::WfCoPauseStatement* node)) CLASS_MEMBER_METHOD_OVERLOAD(Visit, {L"node"}, void(vl::workflow::WfCoroutineStatement::IVisitor::*)(vl::workflow::WfCoOperatorStatement* node)) END_INTERFACE_MEMBER(vl::workflow::WfCoroutineStatement) BEGIN_INTERFACE_MEMBER(vl::workflow::WfStateMachineStatement::IVisitor) CLASS_MEMBER_METHOD_OVERLOAD(Visit, {L"node"}, void(vl::workflow::WfStateMachineStatement::IVisitor::*)(vl::workflow::WfStateSwitchStatement* node)) CLASS_MEMBER_METHOD_OVERLOAD(Visit, {L"node"}, void(vl::workflow::WfStateMachineStatement::IVisitor::*)(vl::workflow::WfStateInvokeStatement* node)) END_INTERFACE_MEMBER(vl::workflow::WfStateMachineStatement) BEGIN_INTERFACE_MEMBER(vl::workflow::WfVirtualCfeExpression::IVisitor) CLASS_MEMBER_METHOD_OVERLOAD(Visit, {L"node"}, void(vl::workflow::WfVirtualCfeExpression::IVisitor::*)(vl::workflow::WfFormatExpression* node)) END_INTERFACE_MEMBER(vl::workflow::WfVirtualCfeExpression) BEGIN_INTERFACE_MEMBER(vl::workflow::WfVirtualCseExpression::IVisitor) CLASS_MEMBER_METHOD_OVERLOAD(Visit, {L"node"}, void(vl::workflow::WfVirtualCseExpression::IVisitor::*)(vl::workflow::WfBindExpression* node)) CLASS_MEMBER_METHOD_OVERLOAD(Visit, {L"node"}, void(vl::workflow::WfVirtualCseExpression::IVisitor::*)(vl::workflow::WfNewCoroutineExpression* node)) CLASS_MEMBER_METHOD_OVERLOAD(Visit, {L"node"}, void(vl::workflow::WfVirtualCseExpression::IVisitor::*)(vl::workflow::WfMixinCastExpression* node)) CLASS_MEMBER_METHOD_OVERLOAD(Visit, {L"node"}, void(vl::workflow::WfVirtualCseExpression::IVisitor::*)(vl::workflow::WfExpectedTypeCastExpression* node)) CLASS_MEMBER_METHOD_OVERLOAD(Visit, {L"node"}, void(vl::workflow::WfVirtualCseExpression::IVisitor::*)(vl::workflow::WfCoOperatorExpression* node)) END_INTERFACE_MEMBER(vl::workflow::WfVirtualCseExpression) BEGIN_INTERFACE_MEMBER(vl::workflow::WfModuleUsingFragment::IVisitor) CLASS_MEMBER_METHOD_OVERLOAD(Visit, {L"node"}, void(vl::workflow::WfModuleUsingFragment::IVisitor::*)(vl::workflow::WfModuleUsingNameFragment* node)) CLASS_MEMBER_METHOD_OVERLOAD(Visit, {L"node"}, void(vl::workflow::WfModuleUsingFragment::IVisitor::*)(vl::workflow::WfModuleUsingWildCardFragment* node)) END_INTERFACE_MEMBER(vl::workflow::WfModuleUsingFragment) #endif #ifdef VCZH_DESCRIPTABLEOBJECT_WITH_METADATA class WorkflowAstTypeLoader : public vl::Object, public ITypeLoader { public: void Load(ITypeManager* manager) { ADD_TYPE_INFO(vl::workflow::WfType) ADD_TYPE_INFO(vl::workflow::WfType::IVisitor) ADD_TYPE_INFO(vl::workflow::WfExpression) ADD_TYPE_INFO(vl::workflow::WfExpression::IVisitor) ADD_TYPE_INFO(vl::workflow::WfStatement) ADD_TYPE_INFO(vl::workflow::WfStatement::IVisitor) ADD_TYPE_INFO(vl::workflow::WfAttribute) ADD_TYPE_INFO(vl::workflow::WfDeclaration) ADD_TYPE_INFO(vl::workflow::WfDeclaration::IVisitor) ADD_TYPE_INFO(vl::workflow::WfFunctionKind) ADD_TYPE_INFO(vl::workflow::WfPredefinedTypeName) ADD_TYPE_INFO(vl::workflow::WfPredefinedType) ADD_TYPE_INFO(vl::workflow::WfTopQualifiedType) ADD_TYPE_INFO(vl::workflow::WfReferenceType) ADD_TYPE_INFO(vl::workflow::WfRawPointerType) ADD_TYPE_INFO(vl::workflow::WfSharedPointerType) ADD_TYPE_INFO(vl::workflow::WfNullableType) ADD_TYPE_INFO(vl::workflow::WfEnumerableType) ADD_TYPE_INFO(vl::workflow::WfMapWritability) ADD_TYPE_INFO(vl::workflow::WfMapType) ADD_TYPE_INFO(vl::workflow::WfObservableListType) ADD_TYPE_INFO(vl::workflow::WfFunctionType) ADD_TYPE_INFO(vl::workflow::WfChildType) ADD_TYPE_INFO(vl::workflow::WfNamespaceDeclaration) ADD_TYPE_INFO(vl::workflow::WfFunctionArgument) ADD_TYPE_INFO(vl::workflow::WfFunctionAnonymity) ADD_TYPE_INFO(vl::workflow::WfFunctionDeclaration) ADD_TYPE_INFO(vl::workflow::WfVariableDeclaration) ADD_TYPE_INFO(vl::workflow::WfEventDeclaration) ADD_TYPE_INFO(vl::workflow::WfPropertyDeclaration) ADD_TYPE_INFO(vl::workflow::WfStaticInitDeclaration) ADD_TYPE_INFO(vl::workflow::WfClassKind) ADD_TYPE_INFO(vl::workflow::WfConstructorType) ADD_TYPE_INFO(vl::workflow::WfBaseConstructorCall) ADD_TYPE_INFO(vl::workflow::WfConstructorDeclaration) ADD_TYPE_INFO(vl::workflow::WfDestructorDeclaration) ADD_TYPE_INFO(vl::workflow::WfClassDeclaration) ADD_TYPE_INFO(vl::workflow::WfEnumKind) ADD_TYPE_INFO(vl::workflow::WfEnumItemKind) ADD_TYPE_INFO(vl::workflow::WfEnumItemIntersection) ADD_TYPE_INFO(vl::workflow::WfEnumItem) ADD_TYPE_INFO(vl::workflow::WfEnumDeclaration) ADD_TYPE_INFO(vl::workflow::WfStructMember) ADD_TYPE_INFO(vl::workflow::WfStructDeclaration) ADD_TYPE_INFO(vl::workflow::WfVirtualCfeDeclaration) ADD_TYPE_INFO(vl::workflow::WfVirtualCfeDeclaration::IVisitor) ADD_TYPE_INFO(vl::workflow::WfAPConst) ADD_TYPE_INFO(vl::workflow::WfAPObserve) ADD_TYPE_INFO(vl::workflow::WfAutoPropertyDeclaration) ADD_TYPE_INFO(vl::workflow::WfCastResultInterfaceDeclaration) ADD_TYPE_INFO(vl::workflow::WfVirtualCseDeclaration) ADD_TYPE_INFO(vl::workflow::WfVirtualCseDeclaration::IVisitor) ADD_TYPE_INFO(vl::workflow::WfStateInput) ADD_TYPE_INFO(vl::workflow::WfStateDeclaration) ADD_TYPE_INFO(vl::workflow::WfStateMachineDeclaration) ADD_TYPE_INFO(vl::workflow::WfBreakStatement) ADD_TYPE_INFO(vl::workflow::WfContinueStatement) ADD_TYPE_INFO(vl::workflow::WfReturnStatement) ADD_TYPE_INFO(vl::workflow::WfDeleteStatement) ADD_TYPE_INFO(vl::workflow::WfRaiseExceptionStatement) ADD_TYPE_INFO(vl::workflow::WfIfStatement) ADD_TYPE_INFO(vl::workflow::WfWhileStatement) ADD_TYPE_INFO(vl::workflow::WfTryStatement) ADD_TYPE_INFO(vl::workflow::WfBlockStatement) ADD_TYPE_INFO(vl::workflow::WfGotoStatement) ADD_TYPE_INFO(vl::workflow::WfVariableStatement) ADD_TYPE_INFO(vl::workflow::WfExpressionStatement) ADD_TYPE_INFO(vl::workflow::WfVirtualCseStatement) ADD_TYPE_INFO(vl::workflow::WfVirtualCseStatement::IVisitor) ADD_TYPE_INFO(vl::workflow::WfForEachDirection) ADD_TYPE_INFO(vl::workflow::WfForEachStatement) ADD_TYPE_INFO(vl::workflow::WfSwitchCase) ADD_TYPE_INFO(vl::workflow::WfSwitchStatement) ADD_TYPE_INFO(vl::workflow::WfCoProviderStatement) ADD_TYPE_INFO(vl::workflow::WfCoroutineStatement) ADD_TYPE_INFO(vl::workflow::WfCoroutineStatement::IVisitor) ADD_TYPE_INFO(vl::workflow::WfCoPauseStatement) ADD_TYPE_INFO(vl::workflow::WfCoOperatorStatement) ADD_TYPE_INFO(vl::workflow::WfStateSwitchType) ADD_TYPE_INFO(vl::workflow::WfStateInvokeType) ADD_TYPE_INFO(vl::workflow::WfStateMachineStatement) ADD_TYPE_INFO(vl::workflow::WfStateMachineStatement::IVisitor) ADD_TYPE_INFO(vl::workflow::WfStateSwitchArgument) ADD_TYPE_INFO(vl::workflow::WfStateSwitchCase) ADD_TYPE_INFO(vl::workflow::WfStateSwitchStatement) ADD_TYPE_INFO(vl::workflow::WfStateInvokeStatement) ADD_TYPE_INFO(vl::workflow::WfThisExpression) ADD_TYPE_INFO(vl::workflow::WfTopQualifiedExpression) ADD_TYPE_INFO(vl::workflow::WfReferenceExpression) ADD_TYPE_INFO(vl::workflow::WfOrderedNameExpression) ADD_TYPE_INFO(vl::workflow::WfOrderedLambdaExpression) ADD_TYPE_INFO(vl::workflow::WfMemberExpression) ADD_TYPE_INFO(vl::workflow::WfChildExpression) ADD_TYPE_INFO(vl::workflow::WfLiteralValue) ADD_TYPE_INFO(vl::workflow::WfLiteralExpression) ADD_TYPE_INFO(vl::workflow::WfFloatingExpression) ADD_TYPE_INFO(vl::workflow::WfIntegerExpression) ADD_TYPE_INFO(vl::workflow::WfStringExpression) ADD_TYPE_INFO(vl::workflow::WfUnaryOperator) ADD_TYPE_INFO(vl::workflow::WfUnaryExpression) ADD_TYPE_INFO(vl::workflow::WfBinaryOperator) ADD_TYPE_INFO(vl::workflow::WfBinaryExpression) ADD_TYPE_INFO(vl::workflow::WfLetVariable) ADD_TYPE_INFO(vl::workflow::WfLetExpression) ADD_TYPE_INFO(vl::workflow::WfIfExpression) ADD_TYPE_INFO(vl::workflow::WfRangeBoundary) ADD_TYPE_INFO(vl::workflow::WfRangeExpression) ADD_TYPE_INFO(vl::workflow::WfSetTesting) ADD_TYPE_INFO(vl::workflow::WfSetTestingExpression) ADD_TYPE_INFO(vl::workflow::WfConstructorArgument) ADD_TYPE_INFO(vl::workflow::WfConstructorExpression) ADD_TYPE_INFO(vl::workflow::WfInferExpression) ADD_TYPE_INFO(vl::workflow::WfTypeCastingStrategy) ADD_TYPE_INFO(vl::workflow::WfTypeCastingExpression) ADD_TYPE_INFO(vl::workflow::WfTypeTesting) ADD_TYPE_INFO(vl::workflow::WfTypeTestingExpression) ADD_TYPE_INFO(vl::workflow::WfTypeOfTypeExpression) ADD_TYPE_INFO(vl::workflow::WfTypeOfExpressionExpression) ADD_TYPE_INFO(vl::workflow::WfAttachEventExpression) ADD_TYPE_INFO(vl::workflow::WfDetachEventExpression) ADD_TYPE_INFO(vl::workflow::WfObserveType) ADD_TYPE_INFO(vl::workflow::WfObserveExpression) ADD_TYPE_INFO(vl::workflow::WfCallExpression) ADD_TYPE_INFO(vl::workflow::WfFunctionExpression) ADD_TYPE_INFO(vl::workflow::WfNewClassExpression) ADD_TYPE_INFO(vl::workflow::WfNewInterfaceExpression) ADD_TYPE_INFO(vl::workflow::WfVirtualCfeExpression) ADD_TYPE_INFO(vl::workflow::WfVirtualCfeExpression::IVisitor) ADD_TYPE_INFO(vl::workflow::WfFormatExpression) ADD_TYPE_INFO(vl::workflow::WfVirtualCseExpression) ADD_TYPE_INFO(vl::workflow::WfVirtualCseExpression::IVisitor) ADD_TYPE_INFO(vl::workflow::WfBindExpression) ADD_TYPE_INFO(vl::workflow::WfNewCoroutineExpression) ADD_TYPE_INFO(vl::workflow::WfMixinCastExpression) ADD_TYPE_INFO(vl::workflow::WfExpectedTypeCastExpression) ADD_TYPE_INFO(vl::workflow::WfCoOperatorExpression) ADD_TYPE_INFO(vl::workflow::WfModuleUsingFragment) ADD_TYPE_INFO(vl::workflow::WfModuleUsingFragment::IVisitor) ADD_TYPE_INFO(vl::workflow::WfModuleUsingNameFragment) ADD_TYPE_INFO(vl::workflow::WfModuleUsingWildCardFragment) ADD_TYPE_INFO(vl::workflow::WfModuleUsingItem) ADD_TYPE_INFO(vl::workflow::WfModuleUsingPath) ADD_TYPE_INFO(vl::workflow::WfModuleType) ADD_TYPE_INFO(vl::workflow::WfModule) } void Unload(ITypeManager* manager) { } }; #endif #endif bool WorkflowAstLoadTypes() { #ifdef VCZH_DESCRIPTABLEOBJECT_WITH_METADATA if (auto manager = GetGlobalTypeManager()) { auto loader = Ptr(new WorkflowAstTypeLoader); return manager->AddTypeLoader(loader); } #endif return false; } } /*********************************************************************** .\PARSER\GENERATED\WORKFLOWAST_BUILDER.CPP ***********************************************************************/ /*********************************************************************** This file is generated by: Vczh Parser Generator From parser definition:Ast Licensed under https://github.com/vczh-libraries/License ***********************************************************************/ namespace vl::workflow::builder { /*********************************************************************** MakeAttachEventExpression ***********************************************************************/ MakeAttachEventExpression& MakeAttachEventExpression::event(const vl::Ptr& value) { node->event = value; return *this; } MakeAttachEventExpression& MakeAttachEventExpression::function(const vl::Ptr& value) { node->function = value; return *this; } /*********************************************************************** MakeAttribute ***********************************************************************/ MakeAttribute& MakeAttribute::category(const vl::WString& value) { node->category.value = value; return *this; } MakeAttribute& MakeAttribute::name(const vl::WString& value) { node->name.value = value; return *this; } MakeAttribute& MakeAttribute::value(const vl::Ptr& value) { node->value = value; return *this; } /*********************************************************************** MakeAutoPropertyDeclaration ***********************************************************************/ MakeAutoPropertyDeclaration& MakeAutoPropertyDeclaration::configConst(WfAPConst value) { node->configConst = value; return *this; } MakeAutoPropertyDeclaration& MakeAutoPropertyDeclaration::configObserve(WfAPObserve value) { node->configObserve = value; return *this; } MakeAutoPropertyDeclaration& MakeAutoPropertyDeclaration::expression(const vl::Ptr& value) { node->expression = value; return *this; } MakeAutoPropertyDeclaration& MakeAutoPropertyDeclaration::functionKind(WfFunctionKind value) { node->functionKind = value; return *this; } MakeAutoPropertyDeclaration& MakeAutoPropertyDeclaration::type(const vl::Ptr& value) { node->type = value; return *this; } MakeAutoPropertyDeclaration& MakeAutoPropertyDeclaration::expandedDeclarations(const vl::Ptr& value) { node->expandedDeclarations.Add(value); return *this; } MakeAutoPropertyDeclaration& MakeAutoPropertyDeclaration::attributes(const vl::Ptr& value) { node->attributes.Add(value); return *this; } MakeAutoPropertyDeclaration& MakeAutoPropertyDeclaration::name(const vl::WString& value) { node->name.value = value; return *this; } /*********************************************************************** MakeBaseConstructorCall ***********************************************************************/ MakeBaseConstructorCall& MakeBaseConstructorCall::arguments(const vl::Ptr& value) { node->arguments.Add(value); return *this; } MakeBaseConstructorCall& MakeBaseConstructorCall::type(const vl::Ptr& value) { node->type = value; return *this; } /*********************************************************************** MakeBinaryExpression ***********************************************************************/ MakeBinaryExpression& MakeBinaryExpression::first(const vl::Ptr& value) { node->first = value; return *this; } MakeBinaryExpression& MakeBinaryExpression::op(WfBinaryOperator value) { node->op = value; return *this; } MakeBinaryExpression& MakeBinaryExpression::second(const vl::Ptr& value) { node->second = value; return *this; } /*********************************************************************** MakeBindExpression ***********************************************************************/ MakeBindExpression& MakeBindExpression::expression(const vl::Ptr& value) { node->expression = value; return *this; } MakeBindExpression& MakeBindExpression::expandedExpression(const vl::Ptr& value) { node->expandedExpression = value; return *this; } /*********************************************************************** MakeBlockStatement ***********************************************************************/ MakeBlockStatement& MakeBlockStatement::endLabel(const vl::WString& value) { node->endLabel.value = value; return *this; } MakeBlockStatement& MakeBlockStatement::statements(const vl::Ptr& value) { node->statements.Add(value); return *this; } /*********************************************************************** MakeCallExpression ***********************************************************************/ MakeCallExpression& MakeCallExpression::arguments(const vl::Ptr& value) { node->arguments.Add(value); return *this; } MakeCallExpression& MakeCallExpression::function(const vl::Ptr& value) { node->function = value; return *this; } /*********************************************************************** MakeCastResultInterfaceDeclaration ***********************************************************************/ MakeCastResultInterfaceDeclaration& MakeCastResultInterfaceDeclaration::baseType(const vl::Ptr& value) { node->baseType = value; return *this; } MakeCastResultInterfaceDeclaration& MakeCastResultInterfaceDeclaration::elementType(const vl::Ptr& value) { node->elementType = value; return *this; } MakeCastResultInterfaceDeclaration& MakeCastResultInterfaceDeclaration::expandedDeclarations(const vl::Ptr& value) { node->expandedDeclarations.Add(value); return *this; } MakeCastResultInterfaceDeclaration& MakeCastResultInterfaceDeclaration::attributes(const vl::Ptr& value) { node->attributes.Add(value); return *this; } MakeCastResultInterfaceDeclaration& MakeCastResultInterfaceDeclaration::name(const vl::WString& value) { node->name.value = value; return *this; } /*********************************************************************** MakeChildExpression ***********************************************************************/ MakeChildExpression& MakeChildExpression::name(const vl::WString& value) { node->name.value = value; return *this; } MakeChildExpression& MakeChildExpression::parent(const vl::Ptr& value) { node->parent = value; return *this; } /*********************************************************************** MakeChildType ***********************************************************************/ MakeChildType& MakeChildType::name(const vl::WString& value) { node->name.value = value; return *this; } MakeChildType& MakeChildType::parent(const vl::Ptr& value) { node->parent = value; return *this; } /*********************************************************************** MakeClassDeclaration ***********************************************************************/ MakeClassDeclaration& MakeClassDeclaration::baseTypes(const vl::Ptr& value) { node->baseTypes.Add(value); return *this; } MakeClassDeclaration& MakeClassDeclaration::constructorType(WfConstructorType value) { node->constructorType = value; return *this; } MakeClassDeclaration& MakeClassDeclaration::declarations(const vl::Ptr& value) { node->declarations.Add(value); return *this; } MakeClassDeclaration& MakeClassDeclaration::kind(WfClassKind value) { node->kind = value; return *this; } MakeClassDeclaration& MakeClassDeclaration::attributes(const vl::Ptr& value) { node->attributes.Add(value); return *this; } MakeClassDeclaration& MakeClassDeclaration::name(const vl::WString& value) { node->name.value = value; return *this; } /*********************************************************************** MakeCoOperatorExpression ***********************************************************************/ MakeCoOperatorExpression& MakeCoOperatorExpression::name(const vl::WString& value) { node->name.value = value; return *this; } MakeCoOperatorExpression& MakeCoOperatorExpression::expandedExpression(const vl::Ptr& value) { node->expandedExpression = value; return *this; } /*********************************************************************** MakeCoOperatorStatement ***********************************************************************/ MakeCoOperatorStatement& MakeCoOperatorStatement::arguments(const vl::Ptr& value) { node->arguments.Add(value); return *this; } MakeCoOperatorStatement& MakeCoOperatorStatement::opName(const vl::WString& value) { node->opName.value = value; return *this; } MakeCoOperatorStatement& MakeCoOperatorStatement::varName(const vl::WString& value) { node->varName.value = value; return *this; } /*********************************************************************** MakeCoPauseStatement ***********************************************************************/ MakeCoPauseStatement& MakeCoPauseStatement::statement(const vl::Ptr& value) { node->statement = value; return *this; } /*********************************************************************** MakeCoProviderStatement ***********************************************************************/ MakeCoProviderStatement& MakeCoProviderStatement::name(const vl::WString& value) { node->name.value = value; return *this; } MakeCoProviderStatement& MakeCoProviderStatement::statement(const vl::Ptr& value) { node->statement = value; return *this; } MakeCoProviderStatement& MakeCoProviderStatement::expandedStatement(const vl::Ptr& value) { node->expandedStatement = value; return *this; } /*********************************************************************** MakeConstructorArgument ***********************************************************************/ MakeConstructorArgument& MakeConstructorArgument::key(const vl::Ptr& value) { node->key = value; return *this; } MakeConstructorArgument& MakeConstructorArgument::value(const vl::Ptr& value) { node->value = value; return *this; } /*********************************************************************** MakeConstructorDeclaration ***********************************************************************/ MakeConstructorDeclaration& MakeConstructorDeclaration::arguments(const vl::Ptr& value) { node->arguments.Add(value); return *this; } MakeConstructorDeclaration& MakeConstructorDeclaration::baseConstructorCalls(const vl::Ptr& value) { node->baseConstructorCalls.Add(value); return *this; } MakeConstructorDeclaration& MakeConstructorDeclaration::constructorType(WfConstructorType value) { node->constructorType = value; return *this; } MakeConstructorDeclaration& MakeConstructorDeclaration::statement(const vl::Ptr& value) { node->statement = value; return *this; } MakeConstructorDeclaration& MakeConstructorDeclaration::attributes(const vl::Ptr& value) { node->attributes.Add(value); return *this; } MakeConstructorDeclaration& MakeConstructorDeclaration::name(const vl::WString& value) { node->name.value = value; return *this; } /*********************************************************************** MakeConstructorExpression ***********************************************************************/ MakeConstructorExpression& MakeConstructorExpression::arguments(const vl::Ptr& value) { node->arguments.Add(value); return *this; } /*********************************************************************** MakeDeclaration ***********************************************************************/ MakeDeclaration& MakeDeclaration::attributes(const vl::Ptr& value) { node->attributes.Add(value); return *this; } MakeDeclaration& MakeDeclaration::name(const vl::WString& value) { node->name.value = value; return *this; } /*********************************************************************** MakeDeleteStatement ***********************************************************************/ MakeDeleteStatement& MakeDeleteStatement::expression(const vl::Ptr& value) { node->expression = value; return *this; } /*********************************************************************** MakeDestructorDeclaration ***********************************************************************/ MakeDestructorDeclaration& MakeDestructorDeclaration::statement(const vl::Ptr& value) { node->statement = value; return *this; } MakeDestructorDeclaration& MakeDestructorDeclaration::attributes(const vl::Ptr& value) { node->attributes.Add(value); return *this; } MakeDestructorDeclaration& MakeDestructorDeclaration::name(const vl::WString& value) { node->name.value = value; return *this; } /*********************************************************************** MakeDetachEventExpression ***********************************************************************/ MakeDetachEventExpression& MakeDetachEventExpression::event(const vl::Ptr& value) { node->event = value; return *this; } MakeDetachEventExpression& MakeDetachEventExpression::handler(const vl::Ptr& value) { node->handler = value; return *this; } /*********************************************************************** MakeEnumDeclaration ***********************************************************************/ MakeEnumDeclaration& MakeEnumDeclaration::items(const vl::Ptr& value) { node->items.Add(value); return *this; } MakeEnumDeclaration& MakeEnumDeclaration::kind(WfEnumKind value) { node->kind = value; return *this; } MakeEnumDeclaration& MakeEnumDeclaration::attributes(const vl::Ptr& value) { node->attributes.Add(value); return *this; } MakeEnumDeclaration& MakeEnumDeclaration::name(const vl::WString& value) { node->name.value = value; return *this; } /*********************************************************************** MakeEnumItem ***********************************************************************/ MakeEnumItem& MakeEnumItem::attributes(const vl::Ptr& value) { node->attributes.Add(value); return *this; } MakeEnumItem& MakeEnumItem::intersections(const vl::Ptr& value) { node->intersections.Add(value); return *this; } MakeEnumItem& MakeEnumItem::kind(WfEnumItemKind value) { node->kind = value; return *this; } MakeEnumItem& MakeEnumItem::name(const vl::WString& value) { node->name.value = value; return *this; } MakeEnumItem& MakeEnumItem::number(const vl::WString& value) { node->number.value = value; return *this; } /*********************************************************************** MakeEnumItemIntersection ***********************************************************************/ MakeEnumItemIntersection& MakeEnumItemIntersection::name(const vl::WString& value) { node->name.value = value; return *this; } /*********************************************************************** MakeEnumerableType ***********************************************************************/ MakeEnumerableType& MakeEnumerableType::element(const vl::Ptr& value) { node->element = value; return *this; } /*********************************************************************** MakeEventDeclaration ***********************************************************************/ MakeEventDeclaration& MakeEventDeclaration::arguments(const vl::Ptr& value) { node->arguments.Add(value); return *this; } MakeEventDeclaration& MakeEventDeclaration::attributes(const vl::Ptr& value) { node->attributes.Add(value); return *this; } MakeEventDeclaration& MakeEventDeclaration::name(const vl::WString& value) { node->name.value = value; return *this; } /*********************************************************************** MakeExpectedTypeCastExpression ***********************************************************************/ MakeExpectedTypeCastExpression& MakeExpectedTypeCastExpression::expression(const vl::Ptr& value) { node->expression = value; return *this; } MakeExpectedTypeCastExpression& MakeExpectedTypeCastExpression::strategy(WfTypeCastingStrategy value) { node->strategy = value; return *this; } MakeExpectedTypeCastExpression& MakeExpectedTypeCastExpression::expandedExpression(const vl::Ptr& value) { node->expandedExpression = value; return *this; } /*********************************************************************** MakeExpressionStatement ***********************************************************************/ MakeExpressionStatement& MakeExpressionStatement::expression(const vl::Ptr& value) { node->expression = value; return *this; } /*********************************************************************** MakeFloatingExpression ***********************************************************************/ MakeFloatingExpression& MakeFloatingExpression::value(const vl::WString& value) { node->value.value = value; return *this; } /*********************************************************************** MakeForEachStatement ***********************************************************************/ MakeForEachStatement& MakeForEachStatement::collection(const vl::Ptr& value) { node->collection = value; return *this; } MakeForEachStatement& MakeForEachStatement::direction(WfForEachDirection value) { node->direction = value; return *this; } MakeForEachStatement& MakeForEachStatement::name(const vl::WString& value) { node->name.value = value; return *this; } MakeForEachStatement& MakeForEachStatement::statement(const vl::Ptr& value) { node->statement = value; return *this; } MakeForEachStatement& MakeForEachStatement::expandedStatement(const vl::Ptr& value) { node->expandedStatement = value; return *this; } /*********************************************************************** MakeFormatExpression ***********************************************************************/ MakeFormatExpression& MakeFormatExpression::value(const vl::WString& value) { node->value.value = value; return *this; } MakeFormatExpression& MakeFormatExpression::expandedExpression(const vl::Ptr& value) { node->expandedExpression = value; return *this; } /*********************************************************************** MakeFunctionArgument ***********************************************************************/ MakeFunctionArgument& MakeFunctionArgument::attributes(const vl::Ptr& value) { node->attributes.Add(value); return *this; } MakeFunctionArgument& MakeFunctionArgument::name(const vl::WString& value) { node->name.value = value; return *this; } MakeFunctionArgument& MakeFunctionArgument::type(const vl::Ptr& value) { node->type = value; return *this; } /*********************************************************************** MakeFunctionDeclaration ***********************************************************************/ MakeFunctionDeclaration& MakeFunctionDeclaration::anonymity(WfFunctionAnonymity value) { node->anonymity = value; return *this; } MakeFunctionDeclaration& MakeFunctionDeclaration::arguments(const vl::Ptr& value) { node->arguments.Add(value); return *this; } MakeFunctionDeclaration& MakeFunctionDeclaration::functionKind(WfFunctionKind value) { node->functionKind = value; return *this; } MakeFunctionDeclaration& MakeFunctionDeclaration::returnType(const vl::Ptr& value) { node->returnType = value; return *this; } MakeFunctionDeclaration& MakeFunctionDeclaration::statement(const vl::Ptr& value) { node->statement = value; return *this; } MakeFunctionDeclaration& MakeFunctionDeclaration::attributes(const vl::Ptr& value) { node->attributes.Add(value); return *this; } MakeFunctionDeclaration& MakeFunctionDeclaration::name(const vl::WString& value) { node->name.value = value; return *this; } /*********************************************************************** MakeFunctionExpression ***********************************************************************/ MakeFunctionExpression& MakeFunctionExpression::function(const vl::Ptr& value) { node->function = value; return *this; } /*********************************************************************** MakeFunctionType ***********************************************************************/ MakeFunctionType& MakeFunctionType::arguments(const vl::Ptr& value) { node->arguments.Add(value); return *this; } MakeFunctionType& MakeFunctionType::result(const vl::Ptr& value) { node->result = value; return *this; } /*********************************************************************** MakeGotoStatement ***********************************************************************/ MakeGotoStatement& MakeGotoStatement::label(const vl::WString& value) { node->label.value = value; return *this; } /*********************************************************************** MakeIfExpression ***********************************************************************/ MakeIfExpression& MakeIfExpression::condition(const vl::Ptr& value) { node->condition = value; return *this; } MakeIfExpression& MakeIfExpression::falseBranch(const vl::Ptr& value) { node->falseBranch = value; return *this; } MakeIfExpression& MakeIfExpression::trueBranch(const vl::Ptr& value) { node->trueBranch = value; return *this; } /*********************************************************************** MakeIfStatement ***********************************************************************/ MakeIfStatement& MakeIfStatement::expression(const vl::Ptr& value) { node->expression = value; return *this; } MakeIfStatement& MakeIfStatement::falseBranch(const vl::Ptr& value) { node->falseBranch = value; return *this; } MakeIfStatement& MakeIfStatement::name(const vl::WString& value) { node->name.value = value; return *this; } MakeIfStatement& MakeIfStatement::trueBranch(const vl::Ptr& value) { node->trueBranch = value; return *this; } MakeIfStatement& MakeIfStatement::type(const vl::Ptr& value) { node->type = value; return *this; } /*********************************************************************** MakeInferExpression ***********************************************************************/ MakeInferExpression& MakeInferExpression::expression(const vl::Ptr& value) { node->expression = value; return *this; } MakeInferExpression& MakeInferExpression::type(const vl::Ptr& value) { node->type = value; return *this; } /*********************************************************************** MakeIntegerExpression ***********************************************************************/ MakeIntegerExpression& MakeIntegerExpression::value(const vl::WString& value) { node->value.value = value; return *this; } /*********************************************************************** MakeLetExpression ***********************************************************************/ MakeLetExpression& MakeLetExpression::expression(const vl::Ptr& value) { node->expression = value; return *this; } MakeLetExpression& MakeLetExpression::variables(const vl::Ptr& value) { node->variables.Add(value); return *this; } /*********************************************************************** MakeLetVariable ***********************************************************************/ MakeLetVariable& MakeLetVariable::name(const vl::WString& value) { node->name.value = value; return *this; } MakeLetVariable& MakeLetVariable::value(const vl::Ptr& value) { node->value = value; return *this; } /*********************************************************************** MakeLiteralExpression ***********************************************************************/ MakeLiteralExpression& MakeLiteralExpression::value(WfLiteralValue value) { node->value = value; return *this; } /*********************************************************************** MakeMapType ***********************************************************************/ MakeMapType& MakeMapType::key(const vl::Ptr& value) { node->key = value; return *this; } MakeMapType& MakeMapType::value(const vl::Ptr& value) { node->value = value; return *this; } MakeMapType& MakeMapType::writability(WfMapWritability value) { node->writability = value; return *this; } /*********************************************************************** MakeMemberExpression ***********************************************************************/ MakeMemberExpression& MakeMemberExpression::name(const vl::WString& value) { node->name.value = value; return *this; } MakeMemberExpression& MakeMemberExpression::parent(const vl::Ptr& value) { node->parent = value; return *this; } /*********************************************************************** MakeMixinCastExpression ***********************************************************************/ MakeMixinCastExpression& MakeMixinCastExpression::expression(const vl::Ptr& value) { node->expression = value; return *this; } MakeMixinCastExpression& MakeMixinCastExpression::type(const vl::Ptr& value) { node->type = value; return *this; } MakeMixinCastExpression& MakeMixinCastExpression::expandedExpression(const vl::Ptr& value) { node->expandedExpression = value; return *this; } /*********************************************************************** MakeModule ***********************************************************************/ MakeModule& MakeModule::declarations(const vl::Ptr& value) { node->declarations.Add(value); return *this; } MakeModule& MakeModule::moduleType(WfModuleType value) { node->moduleType = value; return *this; } MakeModule& MakeModule::name(const vl::WString& value) { node->name.value = value; return *this; } MakeModule& MakeModule::paths(const vl::Ptr& value) { node->paths.Add(value); return *this; } /*********************************************************************** MakeModuleUsingItem ***********************************************************************/ MakeModuleUsingItem& MakeModuleUsingItem::fragments(const vl::Ptr& value) { node->fragments.Add(value); return *this; } /*********************************************************************** MakeModuleUsingNameFragment ***********************************************************************/ MakeModuleUsingNameFragment& MakeModuleUsingNameFragment::name(const vl::WString& value) { node->name.value = value; return *this; } /*********************************************************************** MakeModuleUsingPath ***********************************************************************/ MakeModuleUsingPath& MakeModuleUsingPath::items(const vl::Ptr& value) { node->items.Add(value); return *this; } /*********************************************************************** MakeNamespaceDeclaration ***********************************************************************/ MakeNamespaceDeclaration& MakeNamespaceDeclaration::declarations(const vl::Ptr& value) { node->declarations.Add(value); return *this; } MakeNamespaceDeclaration& MakeNamespaceDeclaration::attributes(const vl::Ptr& value) { node->attributes.Add(value); return *this; } MakeNamespaceDeclaration& MakeNamespaceDeclaration::name(const vl::WString& value) { node->name.value = value; return *this; } /*********************************************************************** MakeNewClassExpression ***********************************************************************/ MakeNewClassExpression& MakeNewClassExpression::arguments(const vl::Ptr& value) { node->arguments.Add(value); return *this; } MakeNewClassExpression& MakeNewClassExpression::type(const vl::Ptr& value) { node->type = value; return *this; } /*********************************************************************** MakeNewCoroutineExpression ***********************************************************************/ MakeNewCoroutineExpression& MakeNewCoroutineExpression::name(const vl::WString& value) { node->name.value = value; return *this; } MakeNewCoroutineExpression& MakeNewCoroutineExpression::statement(const vl::Ptr& value) { node->statement = value; return *this; } MakeNewCoroutineExpression& MakeNewCoroutineExpression::expandedExpression(const vl::Ptr& value) { node->expandedExpression = value; return *this; } /*********************************************************************** MakeNewInterfaceExpression ***********************************************************************/ MakeNewInterfaceExpression& MakeNewInterfaceExpression::declarations(const vl::Ptr& value) { node->declarations.Add(value); return *this; } MakeNewInterfaceExpression& MakeNewInterfaceExpression::type(const vl::Ptr& value) { node->type = value; return *this; } /*********************************************************************** MakeNullableType ***********************************************************************/ MakeNullableType& MakeNullableType::element(const vl::Ptr& value) { node->element = value; return *this; } /*********************************************************************** MakeObservableListType ***********************************************************************/ MakeObservableListType& MakeObservableListType::element(const vl::Ptr& value) { node->element = value; return *this; } /*********************************************************************** MakeObserveExpression ***********************************************************************/ MakeObserveExpression& MakeObserveExpression::events(const vl::Ptr& value) { node->events.Add(value); return *this; } MakeObserveExpression& MakeObserveExpression::expression(const vl::Ptr& value) { node->expression = value; return *this; } MakeObserveExpression& MakeObserveExpression::name(const vl::WString& value) { node->name.value = value; return *this; } MakeObserveExpression& MakeObserveExpression::observeType(WfObserveType value) { node->observeType = value; return *this; } MakeObserveExpression& MakeObserveExpression::parent(const vl::Ptr& value) { node->parent = value; return *this; } /*********************************************************************** MakeOrderedLambdaExpression ***********************************************************************/ MakeOrderedLambdaExpression& MakeOrderedLambdaExpression::body(const vl::Ptr& value) { node->body = value; return *this; } /*********************************************************************** MakeOrderedNameExpression ***********************************************************************/ MakeOrderedNameExpression& MakeOrderedNameExpression::name(const vl::WString& value) { node->name.value = value; return *this; } /*********************************************************************** MakePredefinedType ***********************************************************************/ MakePredefinedType& MakePredefinedType::name(WfPredefinedTypeName value) { node->name = value; return *this; } /*********************************************************************** MakePropertyDeclaration ***********************************************************************/ MakePropertyDeclaration& MakePropertyDeclaration::getter(const vl::WString& value) { node->getter.value = value; return *this; } MakePropertyDeclaration& MakePropertyDeclaration::setter(const vl::WString& value) { node->setter.value = value; return *this; } MakePropertyDeclaration& MakePropertyDeclaration::type(const vl::Ptr& value) { node->type = value; return *this; } MakePropertyDeclaration& MakePropertyDeclaration::valueChangedEvent(const vl::WString& value) { node->valueChangedEvent.value = value; return *this; } MakePropertyDeclaration& MakePropertyDeclaration::attributes(const vl::Ptr& value) { node->attributes.Add(value); return *this; } MakePropertyDeclaration& MakePropertyDeclaration::name(const vl::WString& value) { node->name.value = value; return *this; } /*********************************************************************** MakeRaiseExceptionStatement ***********************************************************************/ MakeRaiseExceptionStatement& MakeRaiseExceptionStatement::expression(const vl::Ptr& value) { node->expression = value; return *this; } /*********************************************************************** MakeRangeExpression ***********************************************************************/ MakeRangeExpression& MakeRangeExpression::begin(const vl::Ptr& value) { node->begin = value; return *this; } MakeRangeExpression& MakeRangeExpression::beginBoundary(WfRangeBoundary value) { node->beginBoundary = value; return *this; } MakeRangeExpression& MakeRangeExpression::end(const vl::Ptr& value) { node->end = value; return *this; } MakeRangeExpression& MakeRangeExpression::endBoundary(WfRangeBoundary value) { node->endBoundary = value; return *this; } /*********************************************************************** MakeRawPointerType ***********************************************************************/ MakeRawPointerType& MakeRawPointerType::element(const vl::Ptr& value) { node->element = value; return *this; } /*********************************************************************** MakeReferenceExpression ***********************************************************************/ MakeReferenceExpression& MakeReferenceExpression::name(const vl::WString& value) { node->name.value = value; return *this; } /*********************************************************************** MakeReferenceType ***********************************************************************/ MakeReferenceType& MakeReferenceType::name(const vl::WString& value) { node->name.value = value; return *this; } /*********************************************************************** MakeReturnStatement ***********************************************************************/ MakeReturnStatement& MakeReturnStatement::expression(const vl::Ptr& value) { node->expression = value; return *this; } /*********************************************************************** MakeSetTestingExpression ***********************************************************************/ MakeSetTestingExpression& MakeSetTestingExpression::collection(const vl::Ptr& value) { node->collection = value; return *this; } MakeSetTestingExpression& MakeSetTestingExpression::element(const vl::Ptr& value) { node->element = value; return *this; } MakeSetTestingExpression& MakeSetTestingExpression::test(WfSetTesting value) { node->test = value; return *this; } /*********************************************************************** MakeSharedPointerType ***********************************************************************/ MakeSharedPointerType& MakeSharedPointerType::element(const vl::Ptr& value) { node->element = value; return *this; } /*********************************************************************** MakeStateDeclaration ***********************************************************************/ MakeStateDeclaration& MakeStateDeclaration::arguments(const vl::Ptr& value) { node->arguments.Add(value); return *this; } MakeStateDeclaration& MakeStateDeclaration::name(const vl::WString& value) { node->name.value = value; return *this; } MakeStateDeclaration& MakeStateDeclaration::statement(const vl::Ptr& value) { node->statement = value; return *this; } /*********************************************************************** MakeStateInput ***********************************************************************/ MakeStateInput& MakeStateInput::arguments(const vl::Ptr& value) { node->arguments.Add(value); return *this; } MakeStateInput& MakeStateInput::name(const vl::WString& value) { node->name.value = value; return *this; } /*********************************************************************** MakeStateInvokeStatement ***********************************************************************/ MakeStateInvokeStatement& MakeStateInvokeStatement::arguments(const vl::Ptr& value) { node->arguments.Add(value); return *this; } MakeStateInvokeStatement& MakeStateInvokeStatement::name(const vl::WString& value) { node->name.value = value; return *this; } MakeStateInvokeStatement& MakeStateInvokeStatement::type(WfStateInvokeType value) { node->type = value; return *this; } /*********************************************************************** MakeStateMachineDeclaration ***********************************************************************/ MakeStateMachineDeclaration& MakeStateMachineDeclaration::inputs(const vl::Ptr& value) { node->inputs.Add(value); return *this; } MakeStateMachineDeclaration& MakeStateMachineDeclaration::states(const vl::Ptr& value) { node->states.Add(value); return *this; } MakeStateMachineDeclaration& MakeStateMachineDeclaration::expandedDeclarations(const vl::Ptr& value) { node->expandedDeclarations.Add(value); return *this; } MakeStateMachineDeclaration& MakeStateMachineDeclaration::attributes(const vl::Ptr& value) { node->attributes.Add(value); return *this; } MakeStateMachineDeclaration& MakeStateMachineDeclaration::name(const vl::WString& value) { node->name.value = value; return *this; } /*********************************************************************** MakeStateSwitchArgument ***********************************************************************/ MakeStateSwitchArgument& MakeStateSwitchArgument::name(const vl::WString& value) { node->name.value = value; return *this; } /*********************************************************************** MakeStateSwitchCase ***********************************************************************/ MakeStateSwitchCase& MakeStateSwitchCase::arguments(const vl::Ptr& value) { node->arguments.Add(value); return *this; } MakeStateSwitchCase& MakeStateSwitchCase::name(const vl::WString& value) { node->name.value = value; return *this; } MakeStateSwitchCase& MakeStateSwitchCase::statement(const vl::Ptr& value) { node->statement = value; return *this; } /*********************************************************************** MakeStateSwitchStatement ***********************************************************************/ MakeStateSwitchStatement& MakeStateSwitchStatement::caseBranches(const vl::Ptr& value) { node->caseBranches.Add(value); return *this; } MakeStateSwitchStatement& MakeStateSwitchStatement::type(WfStateSwitchType value) { node->type = value; return *this; } /*********************************************************************** MakeStaticInitDeclaration ***********************************************************************/ MakeStaticInitDeclaration& MakeStaticInitDeclaration::statement(const vl::Ptr& value) { node->statement = value; return *this; } MakeStaticInitDeclaration& MakeStaticInitDeclaration::attributes(const vl::Ptr& value) { node->attributes.Add(value); return *this; } MakeStaticInitDeclaration& MakeStaticInitDeclaration::name(const vl::WString& value) { node->name.value = value; return *this; } /*********************************************************************** MakeStringExpression ***********************************************************************/ MakeStringExpression& MakeStringExpression::value(const vl::WString& value) { node->value.value = value; return *this; } /*********************************************************************** MakeStructDeclaration ***********************************************************************/ MakeStructDeclaration& MakeStructDeclaration::members(const vl::Ptr& value) { node->members.Add(value); return *this; } MakeStructDeclaration& MakeStructDeclaration::attributes(const vl::Ptr& value) { node->attributes.Add(value); return *this; } MakeStructDeclaration& MakeStructDeclaration::name(const vl::WString& value) { node->name.value = value; return *this; } /*********************************************************************** MakeStructMember ***********************************************************************/ MakeStructMember& MakeStructMember::attributes(const vl::Ptr& value) { node->attributes.Add(value); return *this; } MakeStructMember& MakeStructMember::name(const vl::WString& value) { node->name.value = value; return *this; } MakeStructMember& MakeStructMember::type(const vl::Ptr& value) { node->type = value; return *this; } /*********************************************************************** MakeSwitchCase ***********************************************************************/ MakeSwitchCase& MakeSwitchCase::expression(const vl::Ptr& value) { node->expression = value; return *this; } MakeSwitchCase& MakeSwitchCase::statement(const vl::Ptr& value) { node->statement = value; return *this; } /*********************************************************************** MakeSwitchStatement ***********************************************************************/ MakeSwitchStatement& MakeSwitchStatement::caseBranches(const vl::Ptr& value) { node->caseBranches.Add(value); return *this; } MakeSwitchStatement& MakeSwitchStatement::defaultBranch(const vl::Ptr& value) { node->defaultBranch = value; return *this; } MakeSwitchStatement& MakeSwitchStatement::expression(const vl::Ptr& value) { node->expression = value; return *this; } MakeSwitchStatement& MakeSwitchStatement::expandedStatement(const vl::Ptr& value) { node->expandedStatement = value; return *this; } /*********************************************************************** MakeTopQualifiedExpression ***********************************************************************/ MakeTopQualifiedExpression& MakeTopQualifiedExpression::name(const vl::WString& value) { node->name.value = value; return *this; } /*********************************************************************** MakeTopQualifiedType ***********************************************************************/ MakeTopQualifiedType& MakeTopQualifiedType::name(const vl::WString& value) { node->name.value = value; return *this; } /*********************************************************************** MakeTryStatement ***********************************************************************/ MakeTryStatement& MakeTryStatement::catchStatement(const vl::Ptr& value) { node->catchStatement = value; return *this; } MakeTryStatement& MakeTryStatement::finallyStatement(const vl::Ptr& value) { node->finallyStatement = value; return *this; } MakeTryStatement& MakeTryStatement::name(const vl::WString& value) { node->name.value = value; return *this; } MakeTryStatement& MakeTryStatement::protectedStatement(const vl::Ptr& value) { node->protectedStatement = value; return *this; } /*********************************************************************** MakeTypeCastingExpression ***********************************************************************/ MakeTypeCastingExpression& MakeTypeCastingExpression::expression(const vl::Ptr& value) { node->expression = value; return *this; } MakeTypeCastingExpression& MakeTypeCastingExpression::strategy(WfTypeCastingStrategy value) { node->strategy = value; return *this; } MakeTypeCastingExpression& MakeTypeCastingExpression::type(const vl::Ptr& value) { node->type = value; return *this; } /*********************************************************************** MakeTypeOfExpressionExpression ***********************************************************************/ MakeTypeOfExpressionExpression& MakeTypeOfExpressionExpression::expression(const vl::Ptr& value) { node->expression = value; return *this; } /*********************************************************************** MakeTypeOfTypeExpression ***********************************************************************/ MakeTypeOfTypeExpression& MakeTypeOfTypeExpression::type(const vl::Ptr& value) { node->type = value; return *this; } /*********************************************************************** MakeTypeTestingExpression ***********************************************************************/ MakeTypeTestingExpression& MakeTypeTestingExpression::expression(const vl::Ptr& value) { node->expression = value; return *this; } MakeTypeTestingExpression& MakeTypeTestingExpression::test(WfTypeTesting value) { node->test = value; return *this; } MakeTypeTestingExpression& MakeTypeTestingExpression::type(const vl::Ptr& value) { node->type = value; return *this; } /*********************************************************************** MakeUnaryExpression ***********************************************************************/ MakeUnaryExpression& MakeUnaryExpression::op(WfUnaryOperator value) { node->op = value; return *this; } MakeUnaryExpression& MakeUnaryExpression::operand(const vl::Ptr& value) { node->operand = value; return *this; } /*********************************************************************** MakeVariableDeclaration ***********************************************************************/ MakeVariableDeclaration& MakeVariableDeclaration::expression(const vl::Ptr& value) { node->expression = value; return *this; } MakeVariableDeclaration& MakeVariableDeclaration::type(const vl::Ptr& value) { node->type = value; return *this; } MakeVariableDeclaration& MakeVariableDeclaration::attributes(const vl::Ptr& value) { node->attributes.Add(value); return *this; } MakeVariableDeclaration& MakeVariableDeclaration::name(const vl::WString& value) { node->name.value = value; return *this; } /*********************************************************************** MakeVariableStatement ***********************************************************************/ MakeVariableStatement& MakeVariableStatement::variable(const vl::Ptr& value) { node->variable = value; return *this; } /*********************************************************************** MakeVirtualCfeDeclaration ***********************************************************************/ MakeVirtualCfeDeclaration& MakeVirtualCfeDeclaration::expandedDeclarations(const vl::Ptr& value) { node->expandedDeclarations.Add(value); return *this; } MakeVirtualCfeDeclaration& MakeVirtualCfeDeclaration::attributes(const vl::Ptr& value) { node->attributes.Add(value); return *this; } MakeVirtualCfeDeclaration& MakeVirtualCfeDeclaration::name(const vl::WString& value) { node->name.value = value; return *this; } /*********************************************************************** MakeVirtualCfeExpression ***********************************************************************/ MakeVirtualCfeExpression& MakeVirtualCfeExpression::expandedExpression(const vl::Ptr& value) { node->expandedExpression = value; return *this; } /*********************************************************************** MakeVirtualCseDeclaration ***********************************************************************/ MakeVirtualCseDeclaration& MakeVirtualCseDeclaration::expandedDeclarations(const vl::Ptr& value) { node->expandedDeclarations.Add(value); return *this; } MakeVirtualCseDeclaration& MakeVirtualCseDeclaration::attributes(const vl::Ptr& value) { node->attributes.Add(value); return *this; } MakeVirtualCseDeclaration& MakeVirtualCseDeclaration::name(const vl::WString& value) { node->name.value = value; return *this; } /*********************************************************************** MakeVirtualCseExpression ***********************************************************************/ MakeVirtualCseExpression& MakeVirtualCseExpression::expandedExpression(const vl::Ptr& value) { node->expandedExpression = value; return *this; } /*********************************************************************** MakeVirtualCseStatement ***********************************************************************/ MakeVirtualCseStatement& MakeVirtualCseStatement::expandedStatement(const vl::Ptr& value) { node->expandedStatement = value; return *this; } /*********************************************************************** MakeWhileStatement ***********************************************************************/ MakeWhileStatement& MakeWhileStatement::condition(const vl::Ptr& value) { node->condition = value; return *this; } MakeWhileStatement& MakeWhileStatement::statement(const vl::Ptr& value) { node->statement = value; return *this; } } /*********************************************************************** .\PARSER\GENERATED\WORKFLOWAST_COPY.CPP ***********************************************************************/ /*********************************************************************** This file is generated by: Vczh Parser Generator From parser definition:Ast Licensed under https://github.com/vczh-libraries/License ***********************************************************************/ namespace vl::workflow::copy_visitor { void AstVisitor::CopyFields(WfAttachEventExpression* from, WfAttachEventExpression* to) { CopyFields(static_cast(from), static_cast(to)); to->event = CopyNode(from->event.Obj()); to->function = CopyNode(from->function.Obj()); } void AstVisitor::CopyFields(WfAttribute* from, WfAttribute* to) { to->category = from->category; to->name = from->name; to->value = CopyNode(from->value.Obj()); } void AstVisitor::CopyFields(WfAutoPropertyDeclaration* from, WfAutoPropertyDeclaration* to) { CopyFields(static_cast(from), static_cast(to)); to->configConst = from->configConst; to->configObserve = from->configObserve; to->expression = CopyNode(from->expression.Obj()); to->functionKind = from->functionKind; to->type = CopyNode(from->type.Obj()); } void AstVisitor::CopyFields(WfBaseConstructorCall* from, WfBaseConstructorCall* to) { for (auto&& listItem : from->arguments) { to->arguments.Add(CopyNode(listItem.Obj())); } to->type = CopyNode(from->type.Obj()); } void AstVisitor::CopyFields(WfBinaryExpression* from, WfBinaryExpression* to) { CopyFields(static_cast(from), static_cast(to)); to->first = CopyNode(from->first.Obj()); to->op = from->op; to->second = CopyNode(from->second.Obj()); } void AstVisitor::CopyFields(WfBindExpression* from, WfBindExpression* to) { CopyFields(static_cast(from), static_cast(to)); to->expression = CopyNode(from->expression.Obj()); } void AstVisitor::CopyFields(WfBlockStatement* from, WfBlockStatement* to) { CopyFields(static_cast(from), static_cast(to)); to->endLabel = from->endLabel; for (auto&& listItem : from->statements) { to->statements.Add(CopyNode(listItem.Obj())); } } void AstVisitor::CopyFields(WfBreakStatement* from, WfBreakStatement* to) { CopyFields(static_cast(from), static_cast(to)); } void AstVisitor::CopyFields(WfCallExpression* from, WfCallExpression* to) { CopyFields(static_cast(from), static_cast(to)); for (auto&& listItem : from->arguments) { to->arguments.Add(CopyNode(listItem.Obj())); } to->function = CopyNode(from->function.Obj()); } void AstVisitor::CopyFields(WfCastResultInterfaceDeclaration* from, WfCastResultInterfaceDeclaration* to) { CopyFields(static_cast(from), static_cast(to)); to->baseType = CopyNode(from->baseType.Obj()); to->elementType = CopyNode(from->elementType.Obj()); } void AstVisitor::CopyFields(WfChildExpression* from, WfChildExpression* to) { CopyFields(static_cast(from), static_cast(to)); to->name = from->name; to->parent = CopyNode(from->parent.Obj()); } void AstVisitor::CopyFields(WfChildType* from, WfChildType* to) { CopyFields(static_cast(from), static_cast(to)); to->name = from->name; to->parent = CopyNode(from->parent.Obj()); } void AstVisitor::CopyFields(WfClassDeclaration* from, WfClassDeclaration* to) { CopyFields(static_cast(from), static_cast(to)); for (auto&& listItem : from->baseTypes) { to->baseTypes.Add(CopyNode(listItem.Obj())); } to->constructorType = from->constructorType; for (auto&& listItem : from->declarations) { to->declarations.Add(CopyNode(listItem.Obj())); } to->kind = from->kind; } void AstVisitor::CopyFields(WfCoOperatorExpression* from, WfCoOperatorExpression* to) { CopyFields(static_cast(from), static_cast(to)); to->name = from->name; } void AstVisitor::CopyFields(WfCoOperatorStatement* from, WfCoOperatorStatement* to) { CopyFields(static_cast(from), static_cast(to)); for (auto&& listItem : from->arguments) { to->arguments.Add(CopyNode(listItem.Obj())); } to->opName = from->opName; to->varName = from->varName; } void AstVisitor::CopyFields(WfCoPauseStatement* from, WfCoPauseStatement* to) { CopyFields(static_cast(from), static_cast(to)); to->statement = CopyNode(from->statement.Obj()); } void AstVisitor::CopyFields(WfCoProviderStatement* from, WfCoProviderStatement* to) { CopyFields(static_cast(from), static_cast(to)); to->name = from->name; to->statement = CopyNode(from->statement.Obj()); } void AstVisitor::CopyFields(WfConstructorArgument* from, WfConstructorArgument* to) { to->key = CopyNode(from->key.Obj()); to->value = CopyNode(from->value.Obj()); } void AstVisitor::CopyFields(WfConstructorDeclaration* from, WfConstructorDeclaration* to) { CopyFields(static_cast(from), static_cast(to)); for (auto&& listItem : from->arguments) { to->arguments.Add(CopyNode(listItem.Obj())); } for (auto&& listItem : from->baseConstructorCalls) { to->baseConstructorCalls.Add(CopyNode(listItem.Obj())); } to->constructorType = from->constructorType; to->statement = CopyNode(from->statement.Obj()); } void AstVisitor::CopyFields(WfConstructorExpression* from, WfConstructorExpression* to) { CopyFields(static_cast(from), static_cast(to)); for (auto&& listItem : from->arguments) { to->arguments.Add(CopyNode(listItem.Obj())); } } void AstVisitor::CopyFields(WfContinueStatement* from, WfContinueStatement* to) { CopyFields(static_cast(from), static_cast(to)); } void AstVisitor::CopyFields(WfCoroutineStatement* from, WfCoroutineStatement* to) { CopyFields(static_cast(from), static_cast(to)); } void AstVisitor::CopyFields(WfDeclaration* from, WfDeclaration* to) { for (auto&& listItem : from->attributes) { to->attributes.Add(CopyNode(listItem.Obj())); } to->name = from->name; } void AstVisitor::CopyFields(WfDeleteStatement* from, WfDeleteStatement* to) { CopyFields(static_cast(from), static_cast(to)); to->expression = CopyNode(from->expression.Obj()); } void AstVisitor::CopyFields(WfDestructorDeclaration* from, WfDestructorDeclaration* to) { CopyFields(static_cast(from), static_cast(to)); to->statement = CopyNode(from->statement.Obj()); } void AstVisitor::CopyFields(WfDetachEventExpression* from, WfDetachEventExpression* to) { CopyFields(static_cast(from), static_cast(to)); to->event = CopyNode(from->event.Obj()); to->handler = CopyNode(from->handler.Obj()); } void AstVisitor::CopyFields(WfEnumDeclaration* from, WfEnumDeclaration* to) { CopyFields(static_cast(from), static_cast(to)); for (auto&& listItem : from->items) { to->items.Add(CopyNode(listItem.Obj())); } to->kind = from->kind; } void AstVisitor::CopyFields(WfEnumItem* from, WfEnumItem* to) { for (auto&& listItem : from->attributes) { to->attributes.Add(CopyNode(listItem.Obj())); } for (auto&& listItem : from->intersections) { to->intersections.Add(CopyNode(listItem.Obj())); } to->kind = from->kind; to->name = from->name; to->number = from->number; } void AstVisitor::CopyFields(WfEnumItemIntersection* from, WfEnumItemIntersection* to) { to->name = from->name; } void AstVisitor::CopyFields(WfEnumerableType* from, WfEnumerableType* to) { CopyFields(static_cast(from), static_cast(to)); to->element = CopyNode(from->element.Obj()); } void AstVisitor::CopyFields(WfEventDeclaration* from, WfEventDeclaration* to) { CopyFields(static_cast(from), static_cast(to)); for (auto&& listItem : from->arguments) { to->arguments.Add(CopyNode(listItem.Obj())); } } void AstVisitor::CopyFields(WfExpectedTypeCastExpression* from, WfExpectedTypeCastExpression* to) { CopyFields(static_cast(from), static_cast(to)); to->expression = CopyNode(from->expression.Obj()); to->strategy = from->strategy; } void AstVisitor::CopyFields(WfExpression* from, WfExpression* to) { } void AstVisitor::CopyFields(WfExpressionStatement* from, WfExpressionStatement* to) { CopyFields(static_cast(from), static_cast(to)); to->expression = CopyNode(from->expression.Obj()); } void AstVisitor::CopyFields(WfFloatingExpression* from, WfFloatingExpression* to) { CopyFields(static_cast(from), static_cast(to)); to->value = from->value; } void AstVisitor::CopyFields(WfForEachStatement* from, WfForEachStatement* to) { CopyFields(static_cast(from), static_cast(to)); to->collection = CopyNode(from->collection.Obj()); to->direction = from->direction; to->name = from->name; to->statement = CopyNode(from->statement.Obj()); } void AstVisitor::CopyFields(WfFormatExpression* from, WfFormatExpression* to) { CopyFields(static_cast(from), static_cast(to)); to->value = from->value; } void AstVisitor::CopyFields(WfFunctionArgument* from, WfFunctionArgument* to) { for (auto&& listItem : from->attributes) { to->attributes.Add(CopyNode(listItem.Obj())); } to->name = from->name; to->type = CopyNode(from->type.Obj()); } void AstVisitor::CopyFields(WfFunctionDeclaration* from, WfFunctionDeclaration* to) { CopyFields(static_cast(from), static_cast(to)); to->anonymity = from->anonymity; for (auto&& listItem : from->arguments) { to->arguments.Add(CopyNode(listItem.Obj())); } to->functionKind = from->functionKind; to->returnType = CopyNode(from->returnType.Obj()); to->statement = CopyNode(from->statement.Obj()); } void AstVisitor::CopyFields(WfFunctionExpression* from, WfFunctionExpression* to) { CopyFields(static_cast(from), static_cast(to)); to->function = CopyNode(from->function.Obj()); } void AstVisitor::CopyFields(WfFunctionType* from, WfFunctionType* to) { CopyFields(static_cast(from), static_cast(to)); for (auto&& listItem : from->arguments) { to->arguments.Add(CopyNode(listItem.Obj())); } to->result = CopyNode(from->result.Obj()); } void AstVisitor::CopyFields(WfGotoStatement* from, WfGotoStatement* to) { CopyFields(static_cast(from), static_cast(to)); to->label = from->label; } void AstVisitor::CopyFields(WfIfExpression* from, WfIfExpression* to) { CopyFields(static_cast(from), static_cast(to)); to->condition = CopyNode(from->condition.Obj()); to->falseBranch = CopyNode(from->falseBranch.Obj()); to->trueBranch = CopyNode(from->trueBranch.Obj()); } void AstVisitor::CopyFields(WfIfStatement* from, WfIfStatement* to) { CopyFields(static_cast(from), static_cast(to)); to->expression = CopyNode(from->expression.Obj()); to->falseBranch = CopyNode(from->falseBranch.Obj()); to->name = from->name; to->trueBranch = CopyNode(from->trueBranch.Obj()); to->type = CopyNode(from->type.Obj()); } void AstVisitor::CopyFields(WfInferExpression* from, WfInferExpression* to) { CopyFields(static_cast(from), static_cast(to)); to->expression = CopyNode(from->expression.Obj()); to->type = CopyNode(from->type.Obj()); } void AstVisitor::CopyFields(WfIntegerExpression* from, WfIntegerExpression* to) { CopyFields(static_cast(from), static_cast(to)); to->value = from->value; } void AstVisitor::CopyFields(WfLetExpression* from, WfLetExpression* to) { CopyFields(static_cast(from), static_cast(to)); to->expression = CopyNode(from->expression.Obj()); for (auto&& listItem : from->variables) { to->variables.Add(CopyNode(listItem.Obj())); } } void AstVisitor::CopyFields(WfLetVariable* from, WfLetVariable* to) { to->name = from->name; to->value = CopyNode(from->value.Obj()); } void AstVisitor::CopyFields(WfLiteralExpression* from, WfLiteralExpression* to) { CopyFields(static_cast(from), static_cast(to)); to->value = from->value; } void AstVisitor::CopyFields(WfMapType* from, WfMapType* to) { CopyFields(static_cast(from), static_cast(to)); to->key = CopyNode(from->key.Obj()); to->value = CopyNode(from->value.Obj()); to->writability = from->writability; } void AstVisitor::CopyFields(WfMemberExpression* from, WfMemberExpression* to) { CopyFields(static_cast(from), static_cast(to)); to->name = from->name; to->parent = CopyNode(from->parent.Obj()); } void AstVisitor::CopyFields(WfMixinCastExpression* from, WfMixinCastExpression* to) { CopyFields(static_cast(from), static_cast(to)); to->expression = CopyNode(from->expression.Obj()); to->type = CopyNode(from->type.Obj()); } void AstVisitor::CopyFields(WfModule* from, WfModule* to) { for (auto&& listItem : from->declarations) { to->declarations.Add(CopyNode(listItem.Obj())); } to->moduleType = from->moduleType; to->name = from->name; for (auto&& listItem : from->paths) { to->paths.Add(CopyNode(listItem.Obj())); } } void AstVisitor::CopyFields(WfModuleUsingFragment* from, WfModuleUsingFragment* to) { } void AstVisitor::CopyFields(WfModuleUsingItem* from, WfModuleUsingItem* to) { for (auto&& listItem : from->fragments) { to->fragments.Add(CopyNode(listItem.Obj())); } } void AstVisitor::CopyFields(WfModuleUsingNameFragment* from, WfModuleUsingNameFragment* to) { CopyFields(static_cast(from), static_cast(to)); to->name = from->name; } void AstVisitor::CopyFields(WfModuleUsingPath* from, WfModuleUsingPath* to) { for (auto&& listItem : from->items) { to->items.Add(CopyNode(listItem.Obj())); } } void AstVisitor::CopyFields(WfModuleUsingWildCardFragment* from, WfModuleUsingWildCardFragment* to) { CopyFields(static_cast(from), static_cast(to)); } void AstVisitor::CopyFields(WfNamespaceDeclaration* from, WfNamespaceDeclaration* to) { CopyFields(static_cast(from), static_cast(to)); for (auto&& listItem : from->declarations) { to->declarations.Add(CopyNode(listItem.Obj())); } } void AstVisitor::CopyFields(WfNewClassExpression* from, WfNewClassExpression* to) { CopyFields(static_cast(from), static_cast(to)); for (auto&& listItem : from->arguments) { to->arguments.Add(CopyNode(listItem.Obj())); } to->type = CopyNode(from->type.Obj()); } void AstVisitor::CopyFields(WfNewCoroutineExpression* from, WfNewCoroutineExpression* to) { CopyFields(static_cast(from), static_cast(to)); to->name = from->name; to->statement = CopyNode(from->statement.Obj()); } void AstVisitor::CopyFields(WfNewInterfaceExpression* from, WfNewInterfaceExpression* to) { CopyFields(static_cast(from), static_cast(to)); for (auto&& listItem : from->declarations) { to->declarations.Add(CopyNode(listItem.Obj())); } to->type = CopyNode(from->type.Obj()); } void AstVisitor::CopyFields(WfNullableType* from, WfNullableType* to) { CopyFields(static_cast(from), static_cast(to)); to->element = CopyNode(from->element.Obj()); } void AstVisitor::CopyFields(WfObservableListType* from, WfObservableListType* to) { CopyFields(static_cast(from), static_cast(to)); to->element = CopyNode(from->element.Obj()); } void AstVisitor::CopyFields(WfObserveExpression* from, WfObserveExpression* to) { CopyFields(static_cast(from), static_cast(to)); for (auto&& listItem : from->events) { to->events.Add(CopyNode(listItem.Obj())); } to->expression = CopyNode(from->expression.Obj()); to->name = from->name; to->observeType = from->observeType; to->parent = CopyNode(from->parent.Obj()); } void AstVisitor::CopyFields(WfOrderedLambdaExpression* from, WfOrderedLambdaExpression* to) { CopyFields(static_cast(from), static_cast(to)); to->body = CopyNode(from->body.Obj()); } void AstVisitor::CopyFields(WfOrderedNameExpression* from, WfOrderedNameExpression* to) { CopyFields(static_cast(from), static_cast(to)); to->name = from->name; } void AstVisitor::CopyFields(WfPredefinedType* from, WfPredefinedType* to) { CopyFields(static_cast(from), static_cast(to)); to->name = from->name; } void AstVisitor::CopyFields(WfPropertyDeclaration* from, WfPropertyDeclaration* to) { CopyFields(static_cast(from), static_cast(to)); to->getter = from->getter; to->setter = from->setter; to->type = CopyNode(from->type.Obj()); to->valueChangedEvent = from->valueChangedEvent; } void AstVisitor::CopyFields(WfRaiseExceptionStatement* from, WfRaiseExceptionStatement* to) { CopyFields(static_cast(from), static_cast(to)); to->expression = CopyNode(from->expression.Obj()); } void AstVisitor::CopyFields(WfRangeExpression* from, WfRangeExpression* to) { CopyFields(static_cast(from), static_cast(to)); to->begin = CopyNode(from->begin.Obj()); to->beginBoundary = from->beginBoundary; to->end = CopyNode(from->end.Obj()); to->endBoundary = from->endBoundary; } void AstVisitor::CopyFields(WfRawPointerType* from, WfRawPointerType* to) { CopyFields(static_cast(from), static_cast(to)); to->element = CopyNode(from->element.Obj()); } void AstVisitor::CopyFields(WfReferenceExpression* from, WfReferenceExpression* to) { CopyFields(static_cast(from), static_cast(to)); to->name = from->name; } void AstVisitor::CopyFields(WfReferenceType* from, WfReferenceType* to) { CopyFields(static_cast(from), static_cast(to)); to->name = from->name; } void AstVisitor::CopyFields(WfReturnStatement* from, WfReturnStatement* to) { CopyFields(static_cast(from), static_cast(to)); to->expression = CopyNode(from->expression.Obj()); } void AstVisitor::CopyFields(WfSetTestingExpression* from, WfSetTestingExpression* to) { CopyFields(static_cast(from), static_cast(to)); to->collection = CopyNode(from->collection.Obj()); to->element = CopyNode(from->element.Obj()); to->test = from->test; } void AstVisitor::CopyFields(WfSharedPointerType* from, WfSharedPointerType* to) { CopyFields(static_cast(from), static_cast(to)); to->element = CopyNode(from->element.Obj()); } void AstVisitor::CopyFields(WfStateDeclaration* from, WfStateDeclaration* to) { for (auto&& listItem : from->arguments) { to->arguments.Add(CopyNode(listItem.Obj())); } to->name = from->name; to->statement = CopyNode(from->statement.Obj()); } void AstVisitor::CopyFields(WfStateInput* from, WfStateInput* to) { for (auto&& listItem : from->arguments) { to->arguments.Add(CopyNode(listItem.Obj())); } to->name = from->name; } void AstVisitor::CopyFields(WfStateInvokeStatement* from, WfStateInvokeStatement* to) { CopyFields(static_cast(from), static_cast(to)); for (auto&& listItem : from->arguments) { to->arguments.Add(CopyNode(listItem.Obj())); } to->name = from->name; to->type = from->type; } void AstVisitor::CopyFields(WfStateMachineDeclaration* from, WfStateMachineDeclaration* to) { CopyFields(static_cast(from), static_cast(to)); for (auto&& listItem : from->inputs) { to->inputs.Add(CopyNode(listItem.Obj())); } for (auto&& listItem : from->states) { to->states.Add(CopyNode(listItem.Obj())); } } void AstVisitor::CopyFields(WfStateMachineStatement* from, WfStateMachineStatement* to) { CopyFields(static_cast(from), static_cast(to)); } void AstVisitor::CopyFields(WfStateSwitchArgument* from, WfStateSwitchArgument* to) { to->name = from->name; } void AstVisitor::CopyFields(WfStateSwitchCase* from, WfStateSwitchCase* to) { for (auto&& listItem : from->arguments) { to->arguments.Add(CopyNode(listItem.Obj())); } to->name = from->name; to->statement = CopyNode(from->statement.Obj()); } void AstVisitor::CopyFields(WfStateSwitchStatement* from, WfStateSwitchStatement* to) { CopyFields(static_cast(from), static_cast(to)); for (auto&& listItem : from->caseBranches) { to->caseBranches.Add(CopyNode(listItem.Obj())); } to->type = from->type; } void AstVisitor::CopyFields(WfStatement* from, WfStatement* to) { } void AstVisitor::CopyFields(WfStaticInitDeclaration* from, WfStaticInitDeclaration* to) { CopyFields(static_cast(from), static_cast(to)); to->statement = CopyNode(from->statement.Obj()); } void AstVisitor::CopyFields(WfStringExpression* from, WfStringExpression* to) { CopyFields(static_cast(from), static_cast(to)); to->value = from->value; } void AstVisitor::CopyFields(WfStructDeclaration* from, WfStructDeclaration* to) { CopyFields(static_cast(from), static_cast(to)); for (auto&& listItem : from->members) { to->members.Add(CopyNode(listItem.Obj())); } } void AstVisitor::CopyFields(WfStructMember* from, WfStructMember* to) { for (auto&& listItem : from->attributes) { to->attributes.Add(CopyNode(listItem.Obj())); } to->name = from->name; to->type = CopyNode(from->type.Obj()); } void AstVisitor::CopyFields(WfSwitchCase* from, WfSwitchCase* to) { to->expression = CopyNode(from->expression.Obj()); to->statement = CopyNode(from->statement.Obj()); } void AstVisitor::CopyFields(WfSwitchStatement* from, WfSwitchStatement* to) { CopyFields(static_cast(from), static_cast(to)); for (auto&& listItem : from->caseBranches) { to->caseBranches.Add(CopyNode(listItem.Obj())); } to->defaultBranch = CopyNode(from->defaultBranch.Obj()); to->expression = CopyNode(from->expression.Obj()); } void AstVisitor::CopyFields(WfThisExpression* from, WfThisExpression* to) { CopyFields(static_cast(from), static_cast(to)); } void AstVisitor::CopyFields(WfTopQualifiedExpression* from, WfTopQualifiedExpression* to) { CopyFields(static_cast(from), static_cast(to)); to->name = from->name; } void AstVisitor::CopyFields(WfTopQualifiedType* from, WfTopQualifiedType* to) { CopyFields(static_cast(from), static_cast(to)); to->name = from->name; } void AstVisitor::CopyFields(WfTryStatement* from, WfTryStatement* to) { CopyFields(static_cast(from), static_cast(to)); to->catchStatement = CopyNode(from->catchStatement.Obj()); to->finallyStatement = CopyNode(from->finallyStatement.Obj()); to->name = from->name; to->protectedStatement = CopyNode(from->protectedStatement.Obj()); } void AstVisitor::CopyFields(WfType* from, WfType* to) { } void AstVisitor::CopyFields(WfTypeCastingExpression* from, WfTypeCastingExpression* to) { CopyFields(static_cast(from), static_cast(to)); to->expression = CopyNode(from->expression.Obj()); to->strategy = from->strategy; to->type = CopyNode(from->type.Obj()); } void AstVisitor::CopyFields(WfTypeOfExpressionExpression* from, WfTypeOfExpressionExpression* to) { CopyFields(static_cast(from), static_cast(to)); to->expression = CopyNode(from->expression.Obj()); } void AstVisitor::CopyFields(WfTypeOfTypeExpression* from, WfTypeOfTypeExpression* to) { CopyFields(static_cast(from), static_cast(to)); to->type = CopyNode(from->type.Obj()); } void AstVisitor::CopyFields(WfTypeTestingExpression* from, WfTypeTestingExpression* to) { CopyFields(static_cast(from), static_cast(to)); to->expression = CopyNode(from->expression.Obj()); to->test = from->test; to->type = CopyNode(from->type.Obj()); } void AstVisitor::CopyFields(WfUnaryExpression* from, WfUnaryExpression* to) { CopyFields(static_cast(from), static_cast(to)); to->op = from->op; to->operand = CopyNode(from->operand.Obj()); } void AstVisitor::CopyFields(WfVariableDeclaration* from, WfVariableDeclaration* to) { CopyFields(static_cast(from), static_cast(to)); to->expression = CopyNode(from->expression.Obj()); to->type = CopyNode(from->type.Obj()); } void AstVisitor::CopyFields(WfVariableStatement* from, WfVariableStatement* to) { CopyFields(static_cast(from), static_cast(to)); to->variable = CopyNode(from->variable.Obj()); } void AstVisitor::CopyFields(WfVirtualCfeDeclaration* from, WfVirtualCfeDeclaration* to) { CopyFields(static_cast(from), static_cast(to)); for (auto&& listItem : from->expandedDeclarations) { to->expandedDeclarations.Add(CopyNode(listItem.Obj())); } } void AstVisitor::CopyFields(WfVirtualCfeExpression* from, WfVirtualCfeExpression* to) { CopyFields(static_cast(from), static_cast(to)); to->expandedExpression = CopyNode(from->expandedExpression.Obj()); } void AstVisitor::CopyFields(WfVirtualCseDeclaration* from, WfVirtualCseDeclaration* to) { CopyFields(static_cast(from), static_cast(to)); for (auto&& listItem : from->expandedDeclarations) { to->expandedDeclarations.Add(CopyNode(listItem.Obj())); } } void AstVisitor::CopyFields(WfVirtualCseExpression* from, WfVirtualCseExpression* to) { CopyFields(static_cast(from), static_cast(to)); to->expandedExpression = CopyNode(from->expandedExpression.Obj()); } void AstVisitor::CopyFields(WfVirtualCseStatement* from, WfVirtualCseStatement* to) { CopyFields(static_cast(from), static_cast(to)); to->expandedStatement = CopyNode(from->expandedStatement.Obj()); } void AstVisitor::CopyFields(WfWhileStatement* from, WfWhileStatement* to) { CopyFields(static_cast(from), static_cast(to)); to->condition = CopyNode(from->condition.Obj()); to->statement = CopyNode(from->statement.Obj()); } void AstVisitor::Visit(WfAttribute* node) { auto newNode = vl::Ptr(new WfAttribute); CopyFields(node, newNode.Obj()); this->result = newNode; } void AstVisitor::Visit(WfFunctionArgument* node) { auto newNode = vl::Ptr(new WfFunctionArgument); CopyFields(node, newNode.Obj()); this->result = newNode; } void AstVisitor::Visit(WfBaseConstructorCall* node) { auto newNode = vl::Ptr(new WfBaseConstructorCall); CopyFields(node, newNode.Obj()); this->result = newNode; } void AstVisitor::Visit(WfEnumItemIntersection* node) { auto newNode = vl::Ptr(new WfEnumItemIntersection); CopyFields(node, newNode.Obj()); this->result = newNode; } void AstVisitor::Visit(WfEnumItem* node) { auto newNode = vl::Ptr(new WfEnumItem); CopyFields(node, newNode.Obj()); this->result = newNode; } void AstVisitor::Visit(WfStructMember* node) { auto newNode = vl::Ptr(new WfStructMember); CopyFields(node, newNode.Obj()); this->result = newNode; } void AstVisitor::Visit(WfStateInput* node) { auto newNode = vl::Ptr(new WfStateInput); CopyFields(node, newNode.Obj()); this->result = newNode; } void AstVisitor::Visit(WfStateDeclaration* node) { auto newNode = vl::Ptr(new WfStateDeclaration); CopyFields(node, newNode.Obj()); this->result = newNode; } void AstVisitor::Visit(WfSwitchCase* node) { auto newNode = vl::Ptr(new WfSwitchCase); CopyFields(node, newNode.Obj()); this->result = newNode; } void AstVisitor::Visit(WfStateSwitchArgument* node) { auto newNode = vl::Ptr(new WfStateSwitchArgument); CopyFields(node, newNode.Obj()); this->result = newNode; } void AstVisitor::Visit(WfStateSwitchCase* node) { auto newNode = vl::Ptr(new WfStateSwitchCase); CopyFields(node, newNode.Obj()); this->result = newNode; } void AstVisitor::Visit(WfLetVariable* node) { auto newNode = vl::Ptr(new WfLetVariable); CopyFields(node, newNode.Obj()); this->result = newNode; } void AstVisitor::Visit(WfConstructorArgument* node) { auto newNode = vl::Ptr(new WfConstructorArgument); CopyFields(node, newNode.Obj()); this->result = newNode; } void AstVisitor::Visit(WfModuleUsingItem* node) { auto newNode = vl::Ptr(new WfModuleUsingItem); CopyFields(node, newNode.Obj()); this->result = newNode; } void AstVisitor::Visit(WfModuleUsingPath* node) { auto newNode = vl::Ptr(new WfModuleUsingPath); CopyFields(node, newNode.Obj()); this->result = newNode; } void AstVisitor::Visit(WfModule* node) { auto newNode = vl::Ptr(new WfModule); CopyFields(node, newNode.Obj()); this->result = newNode; } void AstVisitor::Visit(WfPredefinedType* node) { auto newNode = vl::Ptr(new WfPredefinedType); CopyFields(node, newNode.Obj()); this->result = newNode; } void AstVisitor::Visit(WfTopQualifiedType* node) { auto newNode = vl::Ptr(new WfTopQualifiedType); CopyFields(node, newNode.Obj()); this->result = newNode; } void AstVisitor::Visit(WfReferenceType* node) { auto newNode = vl::Ptr(new WfReferenceType); CopyFields(node, newNode.Obj()); this->result = newNode; } void AstVisitor::Visit(WfRawPointerType* node) { auto newNode = vl::Ptr(new WfRawPointerType); CopyFields(node, newNode.Obj()); this->result = newNode; } void AstVisitor::Visit(WfSharedPointerType* node) { auto newNode = vl::Ptr(new WfSharedPointerType); CopyFields(node, newNode.Obj()); this->result = newNode; } void AstVisitor::Visit(WfNullableType* node) { auto newNode = vl::Ptr(new WfNullableType); CopyFields(node, newNode.Obj()); this->result = newNode; } void AstVisitor::Visit(WfEnumerableType* node) { auto newNode = vl::Ptr(new WfEnumerableType); CopyFields(node, newNode.Obj()); this->result = newNode; } void AstVisitor::Visit(WfMapType* node) { auto newNode = vl::Ptr(new WfMapType); CopyFields(node, newNode.Obj()); this->result = newNode; } void AstVisitor::Visit(WfObservableListType* node) { auto newNode = vl::Ptr(new WfObservableListType); CopyFields(node, newNode.Obj()); this->result = newNode; } void AstVisitor::Visit(WfFunctionType* node) { auto newNode = vl::Ptr(new WfFunctionType); CopyFields(node, newNode.Obj()); this->result = newNode; } void AstVisitor::Visit(WfChildType* node) { auto newNode = vl::Ptr(new WfChildType); CopyFields(node, newNode.Obj()); this->result = newNode; } void AstVisitor::Visit(WfThisExpression* node) { auto newNode = vl::Ptr(new WfThisExpression); CopyFields(node, newNode.Obj()); this->result = newNode; } void AstVisitor::Visit(WfTopQualifiedExpression* node) { auto newNode = vl::Ptr(new WfTopQualifiedExpression); CopyFields(node, newNode.Obj()); this->result = newNode; } void AstVisitor::Visit(WfReferenceExpression* node) { auto newNode = vl::Ptr(new WfReferenceExpression); CopyFields(node, newNode.Obj()); this->result = newNode; } void AstVisitor::Visit(WfOrderedNameExpression* node) { auto newNode = vl::Ptr(new WfOrderedNameExpression); CopyFields(node, newNode.Obj()); this->result = newNode; } void AstVisitor::Visit(WfOrderedLambdaExpression* node) { auto newNode = vl::Ptr(new WfOrderedLambdaExpression); CopyFields(node, newNode.Obj()); this->result = newNode; } void AstVisitor::Visit(WfMemberExpression* node) { auto newNode = vl::Ptr(new WfMemberExpression); CopyFields(node, newNode.Obj()); this->result = newNode; } void AstVisitor::Visit(WfChildExpression* node) { auto newNode = vl::Ptr(new WfChildExpression); CopyFields(node, newNode.Obj()); this->result = newNode; } void AstVisitor::Visit(WfLiteralExpression* node) { auto newNode = vl::Ptr(new WfLiteralExpression); CopyFields(node, newNode.Obj()); this->result = newNode; } void AstVisitor::Visit(WfFloatingExpression* node) { auto newNode = vl::Ptr(new WfFloatingExpression); CopyFields(node, newNode.Obj()); this->result = newNode; } void AstVisitor::Visit(WfIntegerExpression* node) { auto newNode = vl::Ptr(new WfIntegerExpression); CopyFields(node, newNode.Obj()); this->result = newNode; } void AstVisitor::Visit(WfStringExpression* node) { auto newNode = vl::Ptr(new WfStringExpression); CopyFields(node, newNode.Obj()); this->result = newNode; } void AstVisitor::Visit(WfUnaryExpression* node) { auto newNode = vl::Ptr(new WfUnaryExpression); CopyFields(node, newNode.Obj()); this->result = newNode; } void AstVisitor::Visit(WfBinaryExpression* node) { auto newNode = vl::Ptr(new WfBinaryExpression); CopyFields(node, newNode.Obj()); this->result = newNode; } void AstVisitor::Visit(WfLetExpression* node) { auto newNode = vl::Ptr(new WfLetExpression); CopyFields(node, newNode.Obj()); this->result = newNode; } void AstVisitor::Visit(WfIfExpression* node) { auto newNode = vl::Ptr(new WfIfExpression); CopyFields(node, newNode.Obj()); this->result = newNode; } void AstVisitor::Visit(WfRangeExpression* node) { auto newNode = vl::Ptr(new WfRangeExpression); CopyFields(node, newNode.Obj()); this->result = newNode; } void AstVisitor::Visit(WfSetTestingExpression* node) { auto newNode = vl::Ptr(new WfSetTestingExpression); CopyFields(node, newNode.Obj()); this->result = newNode; } void AstVisitor::Visit(WfConstructorExpression* node) { auto newNode = vl::Ptr(new WfConstructorExpression); CopyFields(node, newNode.Obj()); this->result = newNode; } void AstVisitor::Visit(WfInferExpression* node) { auto newNode = vl::Ptr(new WfInferExpression); CopyFields(node, newNode.Obj()); this->result = newNode; } void AstVisitor::Visit(WfTypeCastingExpression* node) { auto newNode = vl::Ptr(new WfTypeCastingExpression); CopyFields(node, newNode.Obj()); this->result = newNode; } void AstVisitor::Visit(WfTypeTestingExpression* node) { auto newNode = vl::Ptr(new WfTypeTestingExpression); CopyFields(node, newNode.Obj()); this->result = newNode; } void AstVisitor::Visit(WfTypeOfTypeExpression* node) { auto newNode = vl::Ptr(new WfTypeOfTypeExpression); CopyFields(node, newNode.Obj()); this->result = newNode; } void AstVisitor::Visit(WfTypeOfExpressionExpression* node) { auto newNode = vl::Ptr(new WfTypeOfExpressionExpression); CopyFields(node, newNode.Obj()); this->result = newNode; } void AstVisitor::Visit(WfAttachEventExpression* node) { auto newNode = vl::Ptr(new WfAttachEventExpression); CopyFields(node, newNode.Obj()); this->result = newNode; } void AstVisitor::Visit(WfDetachEventExpression* node) { auto newNode = vl::Ptr(new WfDetachEventExpression); CopyFields(node, newNode.Obj()); this->result = newNode; } void AstVisitor::Visit(WfObserveExpression* node) { auto newNode = vl::Ptr(new WfObserveExpression); CopyFields(node, newNode.Obj()); this->result = newNode; } void AstVisitor::Visit(WfCallExpression* node) { auto newNode = vl::Ptr(new WfCallExpression); CopyFields(node, newNode.Obj()); this->result = newNode; } void AstVisitor::Visit(WfFunctionExpression* node) { auto newNode = vl::Ptr(new WfFunctionExpression); CopyFields(node, newNode.Obj()); this->result = newNode; } void AstVisitor::Visit(WfNewClassExpression* node) { auto newNode = vl::Ptr(new WfNewClassExpression); CopyFields(node, newNode.Obj()); this->result = newNode; } void AstVisitor::Visit(WfNewInterfaceExpression* node) { auto newNode = vl::Ptr(new WfNewInterfaceExpression); CopyFields(node, newNode.Obj()); this->result = newNode; } void AstVisitor::Visit(WfVirtualCfeExpression* node) { node->Accept(static_cast(this)); } void AstVisitor::Visit(WfVirtualCseExpression* node) { node->Accept(static_cast(this)); } void AstVisitor::Visit(WfBreakStatement* node) { auto newNode = vl::Ptr(new WfBreakStatement); CopyFields(node, newNode.Obj()); this->result = newNode; } void AstVisitor::Visit(WfContinueStatement* node) { auto newNode = vl::Ptr(new WfContinueStatement); CopyFields(node, newNode.Obj()); this->result = newNode; } void AstVisitor::Visit(WfReturnStatement* node) { auto newNode = vl::Ptr(new WfReturnStatement); CopyFields(node, newNode.Obj()); this->result = newNode; } void AstVisitor::Visit(WfDeleteStatement* node) { auto newNode = vl::Ptr(new WfDeleteStatement); CopyFields(node, newNode.Obj()); this->result = newNode; } void AstVisitor::Visit(WfRaiseExceptionStatement* node) { auto newNode = vl::Ptr(new WfRaiseExceptionStatement); CopyFields(node, newNode.Obj()); this->result = newNode; } void AstVisitor::Visit(WfIfStatement* node) { auto newNode = vl::Ptr(new WfIfStatement); CopyFields(node, newNode.Obj()); this->result = newNode; } void AstVisitor::Visit(WfWhileStatement* node) { auto newNode = vl::Ptr(new WfWhileStatement); CopyFields(node, newNode.Obj()); this->result = newNode; } void AstVisitor::Visit(WfTryStatement* node) { auto newNode = vl::Ptr(new WfTryStatement); CopyFields(node, newNode.Obj()); this->result = newNode; } void AstVisitor::Visit(WfBlockStatement* node) { auto newNode = vl::Ptr(new WfBlockStatement); CopyFields(node, newNode.Obj()); this->result = newNode; } void AstVisitor::Visit(WfGotoStatement* node) { auto newNode = vl::Ptr(new WfGotoStatement); CopyFields(node, newNode.Obj()); this->result = newNode; } void AstVisitor::Visit(WfVariableStatement* node) { auto newNode = vl::Ptr(new WfVariableStatement); CopyFields(node, newNode.Obj()); this->result = newNode; } void AstVisitor::Visit(WfExpressionStatement* node) { auto newNode = vl::Ptr(new WfExpressionStatement); CopyFields(node, newNode.Obj()); this->result = newNode; } void AstVisitor::Visit(WfVirtualCseStatement* node) { node->Accept(static_cast(this)); } void AstVisitor::Visit(WfCoroutineStatement* node) { node->Accept(static_cast(this)); } void AstVisitor::Visit(WfStateMachineStatement* node) { node->Accept(static_cast(this)); } void AstVisitor::Visit(WfNamespaceDeclaration* node) { auto newNode = vl::Ptr(new WfNamespaceDeclaration); CopyFields(node, newNode.Obj()); this->result = newNode; } void AstVisitor::Visit(WfFunctionDeclaration* node) { auto newNode = vl::Ptr(new WfFunctionDeclaration); CopyFields(node, newNode.Obj()); this->result = newNode; } void AstVisitor::Visit(WfVariableDeclaration* node) { auto newNode = vl::Ptr(new WfVariableDeclaration); CopyFields(node, newNode.Obj()); this->result = newNode; } void AstVisitor::Visit(WfEventDeclaration* node) { auto newNode = vl::Ptr(new WfEventDeclaration); CopyFields(node, newNode.Obj()); this->result = newNode; } void AstVisitor::Visit(WfPropertyDeclaration* node) { auto newNode = vl::Ptr(new WfPropertyDeclaration); CopyFields(node, newNode.Obj()); this->result = newNode; } void AstVisitor::Visit(WfStaticInitDeclaration* node) { auto newNode = vl::Ptr(new WfStaticInitDeclaration); CopyFields(node, newNode.Obj()); this->result = newNode; } void AstVisitor::Visit(WfConstructorDeclaration* node) { auto newNode = vl::Ptr(new WfConstructorDeclaration); CopyFields(node, newNode.Obj()); this->result = newNode; } void AstVisitor::Visit(WfDestructorDeclaration* node) { auto newNode = vl::Ptr(new WfDestructorDeclaration); CopyFields(node, newNode.Obj()); this->result = newNode; } void AstVisitor::Visit(WfClassDeclaration* node) { auto newNode = vl::Ptr(new WfClassDeclaration); CopyFields(node, newNode.Obj()); this->result = newNode; } void AstVisitor::Visit(WfEnumDeclaration* node) { auto newNode = vl::Ptr(new WfEnumDeclaration); CopyFields(node, newNode.Obj()); this->result = newNode; } void AstVisitor::Visit(WfStructDeclaration* node) { auto newNode = vl::Ptr(new WfStructDeclaration); CopyFields(node, newNode.Obj()); this->result = newNode; } void AstVisitor::Visit(WfVirtualCfeDeclaration* node) { node->Accept(static_cast(this)); } void AstVisitor::Visit(WfVirtualCseDeclaration* node) { node->Accept(static_cast(this)); } void AstVisitor::Visit(WfAutoPropertyDeclaration* node) { auto newNode = vl::Ptr(new WfAutoPropertyDeclaration); CopyFields(node, newNode.Obj()); this->result = newNode; } void AstVisitor::Visit(WfCastResultInterfaceDeclaration* node) { auto newNode = vl::Ptr(new WfCastResultInterfaceDeclaration); CopyFields(node, newNode.Obj()); this->result = newNode; } void AstVisitor::Visit(WfStateMachineDeclaration* node) { auto newNode = vl::Ptr(new WfStateMachineDeclaration); CopyFields(node, newNode.Obj()); this->result = newNode; } void AstVisitor::Visit(WfForEachStatement* node) { auto newNode = vl::Ptr(new WfForEachStatement); CopyFields(node, newNode.Obj()); this->result = newNode; } void AstVisitor::Visit(WfSwitchStatement* node) { auto newNode = vl::Ptr(new WfSwitchStatement); CopyFields(node, newNode.Obj()); this->result = newNode; } void AstVisitor::Visit(WfCoProviderStatement* node) { auto newNode = vl::Ptr(new WfCoProviderStatement); CopyFields(node, newNode.Obj()); this->result = newNode; } void AstVisitor::Visit(WfCoPauseStatement* node) { auto newNode = vl::Ptr(new WfCoPauseStatement); CopyFields(node, newNode.Obj()); this->result = newNode; } void AstVisitor::Visit(WfCoOperatorStatement* node) { auto newNode = vl::Ptr(new WfCoOperatorStatement); CopyFields(node, newNode.Obj()); this->result = newNode; } void AstVisitor::Visit(WfStateSwitchStatement* node) { auto newNode = vl::Ptr(new WfStateSwitchStatement); CopyFields(node, newNode.Obj()); this->result = newNode; } void AstVisitor::Visit(WfStateInvokeStatement* node) { auto newNode = vl::Ptr(new WfStateInvokeStatement); CopyFields(node, newNode.Obj()); this->result = newNode; } void AstVisitor::Visit(WfFormatExpression* node) { auto newNode = vl::Ptr(new WfFormatExpression); CopyFields(node, newNode.Obj()); this->result = newNode; } void AstVisitor::Visit(WfBindExpression* node) { auto newNode = vl::Ptr(new WfBindExpression); CopyFields(node, newNode.Obj()); this->result = newNode; } void AstVisitor::Visit(WfNewCoroutineExpression* node) { auto newNode = vl::Ptr(new WfNewCoroutineExpression); CopyFields(node, newNode.Obj()); this->result = newNode; } void AstVisitor::Visit(WfMixinCastExpression* node) { auto newNode = vl::Ptr(new WfMixinCastExpression); CopyFields(node, newNode.Obj()); this->result = newNode; } void AstVisitor::Visit(WfExpectedTypeCastExpression* node) { auto newNode = vl::Ptr(new WfExpectedTypeCastExpression); CopyFields(node, newNode.Obj()); this->result = newNode; } void AstVisitor::Visit(WfCoOperatorExpression* node) { auto newNode = vl::Ptr(new WfCoOperatorExpression); CopyFields(node, newNode.Obj()); this->result = newNode; } void AstVisitor::Visit(WfModuleUsingNameFragment* node) { auto newNode = vl::Ptr(new WfModuleUsingNameFragment); CopyFields(node, newNode.Obj()); this->result = newNode; } void AstVisitor::Visit(WfModuleUsingWildCardFragment* node) { auto newNode = vl::Ptr(new WfModuleUsingWildCardFragment); CopyFields(node, newNode.Obj()); this->result = newNode; } vl::Ptr AstVisitor::CopyNode(WfType* node) { if (!node) return nullptr; node->Accept(static_cast(this)); this->result->codeRange = node->codeRange; return this->result.Cast(); } vl::Ptr AstVisitor::CopyNode(WfExpression* node) { if (!node) return nullptr; node->Accept(static_cast(this)); this->result->codeRange = node->codeRange; return this->result.Cast(); } vl::Ptr AstVisitor::CopyNode(WfStatement* node) { if (!node) return nullptr; node->Accept(static_cast(this)); this->result->codeRange = node->codeRange; return this->result.Cast(); } vl::Ptr AstVisitor::CopyNode(WfDeclaration* node) { if (!node) return nullptr; node->Accept(static_cast(this)); this->result->codeRange = node->codeRange; return this->result.Cast(); } vl::Ptr AstVisitor::CopyNode(WfModuleUsingFragment* node) { if (!node) return nullptr; node->Accept(static_cast(this)); this->result->codeRange = node->codeRange; return this->result.Cast(); } vl::Ptr AstVisitor::CopyNode(WfAttribute* node) { if (!node) return nullptr; Visit(node); this->result->codeRange = node->codeRange; return this->result.Cast(); } vl::Ptr AstVisitor::CopyNode(WfFunctionArgument* node) { if (!node) return nullptr; Visit(node); this->result->codeRange = node->codeRange; return this->result.Cast(); } vl::Ptr AstVisitor::CopyNode(WfBaseConstructorCall* node) { if (!node) return nullptr; Visit(node); this->result->codeRange = node->codeRange; return this->result.Cast(); } vl::Ptr AstVisitor::CopyNode(WfEnumItemIntersection* node) { if (!node) return nullptr; Visit(node); this->result->codeRange = node->codeRange; return this->result.Cast(); } vl::Ptr AstVisitor::CopyNode(WfEnumItem* node) { if (!node) return nullptr; Visit(node); this->result->codeRange = node->codeRange; return this->result.Cast(); } vl::Ptr AstVisitor::CopyNode(WfStructMember* node) { if (!node) return nullptr; Visit(node); this->result->codeRange = node->codeRange; return this->result.Cast(); } vl::Ptr AstVisitor::CopyNode(WfStateInput* node) { if (!node) return nullptr; Visit(node); this->result->codeRange = node->codeRange; return this->result.Cast(); } vl::Ptr AstVisitor::CopyNode(WfStateDeclaration* node) { if (!node) return nullptr; Visit(node); this->result->codeRange = node->codeRange; return this->result.Cast(); } vl::Ptr AstVisitor::CopyNode(WfSwitchCase* node) { if (!node) return nullptr; Visit(node); this->result->codeRange = node->codeRange; return this->result.Cast(); } vl::Ptr AstVisitor::CopyNode(WfStateSwitchArgument* node) { if (!node) return nullptr; Visit(node); this->result->codeRange = node->codeRange; return this->result.Cast(); } vl::Ptr AstVisitor::CopyNode(WfStateSwitchCase* node) { if (!node) return nullptr; Visit(node); this->result->codeRange = node->codeRange; return this->result.Cast(); } vl::Ptr AstVisitor::CopyNode(WfLetVariable* node) { if (!node) return nullptr; Visit(node); this->result->codeRange = node->codeRange; return this->result.Cast(); } vl::Ptr AstVisitor::CopyNode(WfConstructorArgument* node) { if (!node) return nullptr; Visit(node); this->result->codeRange = node->codeRange; return this->result.Cast(); } vl::Ptr AstVisitor::CopyNode(WfModuleUsingItem* node) { if (!node) return nullptr; Visit(node); this->result->codeRange = node->codeRange; return this->result.Cast(); } vl::Ptr AstVisitor::CopyNode(WfModuleUsingPath* node) { if (!node) return nullptr; Visit(node); this->result->codeRange = node->codeRange; return this->result.Cast(); } vl::Ptr AstVisitor::CopyNode(WfModule* node) { if (!node) return nullptr; Visit(node); this->result->codeRange = node->codeRange; return this->result.Cast(); } vl::Ptr AstVisitor::CopyNode(WfAttachEventExpression* node) { if (!node) return nullptr; return CopyNode(static_cast(node)).Cast(); } vl::Ptr AstVisitor::CopyNode(WfAutoPropertyDeclaration* node) { if (!node) return nullptr; return CopyNode(static_cast(node)).Cast(); } vl::Ptr AstVisitor::CopyNode(WfBinaryExpression* node) { if (!node) return nullptr; return CopyNode(static_cast(node)).Cast(); } vl::Ptr AstVisitor::CopyNode(WfBindExpression* node) { if (!node) return nullptr; return CopyNode(static_cast(node)).Cast(); } vl::Ptr AstVisitor::CopyNode(WfBlockStatement* node) { if (!node) return nullptr; return CopyNode(static_cast(node)).Cast(); } vl::Ptr AstVisitor::CopyNode(WfBreakStatement* node) { if (!node) return nullptr; return CopyNode(static_cast(node)).Cast(); } vl::Ptr AstVisitor::CopyNode(WfCallExpression* node) { if (!node) return nullptr; return CopyNode(static_cast(node)).Cast(); } vl::Ptr AstVisitor::CopyNode(WfCastResultInterfaceDeclaration* node) { if (!node) return nullptr; return CopyNode(static_cast(node)).Cast(); } vl::Ptr AstVisitor::CopyNode(WfChildExpression* node) { if (!node) return nullptr; return CopyNode(static_cast(node)).Cast(); } vl::Ptr AstVisitor::CopyNode(WfChildType* node) { if (!node) return nullptr; return CopyNode(static_cast(node)).Cast(); } vl::Ptr AstVisitor::CopyNode(WfClassDeclaration* node) { if (!node) return nullptr; return CopyNode(static_cast(node)).Cast(); } vl::Ptr AstVisitor::CopyNode(WfCoOperatorExpression* node) { if (!node) return nullptr; return CopyNode(static_cast(node)).Cast(); } vl::Ptr AstVisitor::CopyNode(WfCoOperatorStatement* node) { if (!node) return nullptr; return CopyNode(static_cast(node)).Cast(); } vl::Ptr AstVisitor::CopyNode(WfCoPauseStatement* node) { if (!node) return nullptr; return CopyNode(static_cast(node)).Cast(); } vl::Ptr AstVisitor::CopyNode(WfCoProviderStatement* node) { if (!node) return nullptr; return CopyNode(static_cast(node)).Cast(); } vl::Ptr AstVisitor::CopyNode(WfConstructorDeclaration* node) { if (!node) return nullptr; return CopyNode(static_cast(node)).Cast(); } vl::Ptr AstVisitor::CopyNode(WfConstructorExpression* node) { if (!node) return nullptr; return CopyNode(static_cast(node)).Cast(); } vl::Ptr AstVisitor::CopyNode(WfContinueStatement* node) { if (!node) return nullptr; return CopyNode(static_cast(node)).Cast(); } vl::Ptr AstVisitor::CopyNode(WfCoroutineStatement* node) { if (!node) return nullptr; return CopyNode(static_cast(node)).Cast(); } vl::Ptr AstVisitor::CopyNode(WfDeleteStatement* node) { if (!node) return nullptr; return CopyNode(static_cast(node)).Cast(); } vl::Ptr AstVisitor::CopyNode(WfDestructorDeclaration* node) { if (!node) return nullptr; return CopyNode(static_cast(node)).Cast(); } vl::Ptr AstVisitor::CopyNode(WfDetachEventExpression* node) { if (!node) return nullptr; return CopyNode(static_cast(node)).Cast(); } vl::Ptr AstVisitor::CopyNode(WfEnumDeclaration* node) { if (!node) return nullptr; return CopyNode(static_cast(node)).Cast(); } vl::Ptr AstVisitor::CopyNode(WfEnumerableType* node) { if (!node) return nullptr; return CopyNode(static_cast(node)).Cast(); } vl::Ptr AstVisitor::CopyNode(WfEventDeclaration* node) { if (!node) return nullptr; return CopyNode(static_cast(node)).Cast(); } vl::Ptr AstVisitor::CopyNode(WfExpectedTypeCastExpression* node) { if (!node) return nullptr; return CopyNode(static_cast(node)).Cast(); } vl::Ptr AstVisitor::CopyNode(WfExpressionStatement* node) { if (!node) return nullptr; return CopyNode(static_cast(node)).Cast(); } vl::Ptr AstVisitor::CopyNode(WfFloatingExpression* node) { if (!node) return nullptr; return CopyNode(static_cast(node)).Cast(); } vl::Ptr AstVisitor::CopyNode(WfForEachStatement* node) { if (!node) return nullptr; return CopyNode(static_cast(node)).Cast(); } vl::Ptr AstVisitor::CopyNode(WfFormatExpression* node) { if (!node) return nullptr; return CopyNode(static_cast(node)).Cast(); } vl::Ptr AstVisitor::CopyNode(WfFunctionDeclaration* node) { if (!node) return nullptr; return CopyNode(static_cast(node)).Cast(); } vl::Ptr AstVisitor::CopyNode(WfFunctionExpression* node) { if (!node) return nullptr; return CopyNode(static_cast(node)).Cast(); } vl::Ptr AstVisitor::CopyNode(WfFunctionType* node) { if (!node) return nullptr; return CopyNode(static_cast(node)).Cast(); } vl::Ptr AstVisitor::CopyNode(WfGotoStatement* node) { if (!node) return nullptr; return CopyNode(static_cast(node)).Cast(); } vl::Ptr AstVisitor::CopyNode(WfIfExpression* node) { if (!node) return nullptr; return CopyNode(static_cast(node)).Cast(); } vl::Ptr AstVisitor::CopyNode(WfIfStatement* node) { if (!node) return nullptr; return CopyNode(static_cast(node)).Cast(); } vl::Ptr AstVisitor::CopyNode(WfInferExpression* node) { if (!node) return nullptr; return CopyNode(static_cast(node)).Cast(); } vl::Ptr AstVisitor::CopyNode(WfIntegerExpression* node) { if (!node) return nullptr; return CopyNode(static_cast(node)).Cast(); } vl::Ptr AstVisitor::CopyNode(WfLetExpression* node) { if (!node) return nullptr; return CopyNode(static_cast(node)).Cast(); } vl::Ptr AstVisitor::CopyNode(WfLiteralExpression* node) { if (!node) return nullptr; return CopyNode(static_cast(node)).Cast(); } vl::Ptr AstVisitor::CopyNode(WfMapType* node) { if (!node) return nullptr; return CopyNode(static_cast(node)).Cast(); } vl::Ptr AstVisitor::CopyNode(WfMemberExpression* node) { if (!node) return nullptr; return CopyNode(static_cast(node)).Cast(); } vl::Ptr AstVisitor::CopyNode(WfMixinCastExpression* node) { if (!node) return nullptr; return CopyNode(static_cast(node)).Cast(); } vl::Ptr AstVisitor::CopyNode(WfModuleUsingNameFragment* node) { if (!node) return nullptr; return CopyNode(static_cast(node)).Cast(); } vl::Ptr AstVisitor::CopyNode(WfModuleUsingWildCardFragment* node) { if (!node) return nullptr; return CopyNode(static_cast(node)).Cast(); } vl::Ptr AstVisitor::CopyNode(WfNamespaceDeclaration* node) { if (!node) return nullptr; return CopyNode(static_cast(node)).Cast(); } vl::Ptr AstVisitor::CopyNode(WfNewClassExpression* node) { if (!node) return nullptr; return CopyNode(static_cast(node)).Cast(); } vl::Ptr AstVisitor::CopyNode(WfNewCoroutineExpression* node) { if (!node) return nullptr; return CopyNode(static_cast(node)).Cast(); } vl::Ptr AstVisitor::CopyNode(WfNewInterfaceExpression* node) { if (!node) return nullptr; return CopyNode(static_cast(node)).Cast(); } vl::Ptr AstVisitor::CopyNode(WfNullableType* node) { if (!node) return nullptr; return CopyNode(static_cast(node)).Cast(); } vl::Ptr AstVisitor::CopyNode(WfObservableListType* node) { if (!node) return nullptr; return CopyNode(static_cast(node)).Cast(); } vl::Ptr AstVisitor::CopyNode(WfObserveExpression* node) { if (!node) return nullptr; return CopyNode(static_cast(node)).Cast(); } vl::Ptr AstVisitor::CopyNode(WfOrderedLambdaExpression* node) { if (!node) return nullptr; return CopyNode(static_cast(node)).Cast(); } vl::Ptr AstVisitor::CopyNode(WfOrderedNameExpression* node) { if (!node) return nullptr; return CopyNode(static_cast(node)).Cast(); } vl::Ptr AstVisitor::CopyNode(WfPredefinedType* node) { if (!node) return nullptr; return CopyNode(static_cast(node)).Cast(); } vl::Ptr AstVisitor::CopyNode(WfPropertyDeclaration* node) { if (!node) return nullptr; return CopyNode(static_cast(node)).Cast(); } vl::Ptr AstVisitor::CopyNode(WfRaiseExceptionStatement* node) { if (!node) return nullptr; return CopyNode(static_cast(node)).Cast(); } vl::Ptr AstVisitor::CopyNode(WfRangeExpression* node) { if (!node) return nullptr; return CopyNode(static_cast(node)).Cast(); } vl::Ptr AstVisitor::CopyNode(WfRawPointerType* node) { if (!node) return nullptr; return CopyNode(static_cast(node)).Cast(); } vl::Ptr AstVisitor::CopyNode(WfReferenceExpression* node) { if (!node) return nullptr; return CopyNode(static_cast(node)).Cast(); } vl::Ptr AstVisitor::CopyNode(WfReferenceType* node) { if (!node) return nullptr; return CopyNode(static_cast(node)).Cast(); } vl::Ptr AstVisitor::CopyNode(WfReturnStatement* node) { if (!node) return nullptr; return CopyNode(static_cast(node)).Cast(); } vl::Ptr AstVisitor::CopyNode(WfSetTestingExpression* node) { if (!node) return nullptr; return CopyNode(static_cast(node)).Cast(); } vl::Ptr AstVisitor::CopyNode(WfSharedPointerType* node) { if (!node) return nullptr; return CopyNode(static_cast(node)).Cast(); } vl::Ptr AstVisitor::CopyNode(WfStateInvokeStatement* node) { if (!node) return nullptr; return CopyNode(static_cast(node)).Cast(); } vl::Ptr AstVisitor::CopyNode(WfStateMachineDeclaration* node) { if (!node) return nullptr; return CopyNode(static_cast(node)).Cast(); } vl::Ptr AstVisitor::CopyNode(WfStateMachineStatement* node) { if (!node) return nullptr; return CopyNode(static_cast(node)).Cast(); } vl::Ptr AstVisitor::CopyNode(WfStateSwitchStatement* node) { if (!node) return nullptr; return CopyNode(static_cast(node)).Cast(); } vl::Ptr AstVisitor::CopyNode(WfStaticInitDeclaration* node) { if (!node) return nullptr; return CopyNode(static_cast(node)).Cast(); } vl::Ptr AstVisitor::CopyNode(WfStringExpression* node) { if (!node) return nullptr; return CopyNode(static_cast(node)).Cast(); } vl::Ptr AstVisitor::CopyNode(WfStructDeclaration* node) { if (!node) return nullptr; return CopyNode(static_cast(node)).Cast(); } vl::Ptr AstVisitor::CopyNode(WfSwitchStatement* node) { if (!node) return nullptr; return CopyNode(static_cast(node)).Cast(); } vl::Ptr AstVisitor::CopyNode(WfThisExpression* node) { if (!node) return nullptr; return CopyNode(static_cast(node)).Cast(); } vl::Ptr AstVisitor::CopyNode(WfTopQualifiedExpression* node) { if (!node) return nullptr; return CopyNode(static_cast(node)).Cast(); } vl::Ptr AstVisitor::CopyNode(WfTopQualifiedType* node) { if (!node) return nullptr; return CopyNode(static_cast(node)).Cast(); } vl::Ptr AstVisitor::CopyNode(WfTryStatement* node) { if (!node) return nullptr; return CopyNode(static_cast(node)).Cast(); } vl::Ptr AstVisitor::CopyNode(WfTypeCastingExpression* node) { if (!node) return nullptr; return CopyNode(static_cast(node)).Cast(); } vl::Ptr AstVisitor::CopyNode(WfTypeOfExpressionExpression* node) { if (!node) return nullptr; return CopyNode(static_cast(node)).Cast(); } vl::Ptr AstVisitor::CopyNode(WfTypeOfTypeExpression* node) { if (!node) return nullptr; return CopyNode(static_cast(node)).Cast(); } vl::Ptr AstVisitor::CopyNode(WfTypeTestingExpression* node) { if (!node) return nullptr; return CopyNode(static_cast(node)).Cast(); } vl::Ptr AstVisitor::CopyNode(WfUnaryExpression* node) { if (!node) return nullptr; return CopyNode(static_cast(node)).Cast(); } vl::Ptr AstVisitor::CopyNode(WfVariableDeclaration* node) { if (!node) return nullptr; return CopyNode(static_cast(node)).Cast(); } vl::Ptr AstVisitor::CopyNode(WfVariableStatement* node) { if (!node) return nullptr; return CopyNode(static_cast(node)).Cast(); } vl::Ptr AstVisitor::CopyNode(WfVirtualCfeDeclaration* node) { if (!node) return nullptr; return CopyNode(static_cast(node)).Cast(); } vl::Ptr AstVisitor::CopyNode(WfVirtualCfeExpression* node) { if (!node) return nullptr; return CopyNode(static_cast(node)).Cast(); } vl::Ptr AstVisitor::CopyNode(WfVirtualCseDeclaration* node) { if (!node) return nullptr; return CopyNode(static_cast(node)).Cast(); } vl::Ptr AstVisitor::CopyNode(WfVirtualCseExpression* node) { if (!node) return nullptr; return CopyNode(static_cast(node)).Cast(); } vl::Ptr AstVisitor::CopyNode(WfVirtualCseStatement* node) { if (!node) return nullptr; return CopyNode(static_cast(node)).Cast(); } vl::Ptr AstVisitor::CopyNode(WfWhileStatement* node) { if (!node) return nullptr; return CopyNode(static_cast(node)).Cast(); } } /*********************************************************************** .\PARSER\GENERATED\WORKFLOWAST_EMPTY.CPP ***********************************************************************/ /*********************************************************************** This file is generated by: Vczh Parser Generator From parser definition:Ast Licensed under https://github.com/vczh-libraries/License ***********************************************************************/ namespace vl::workflow::empty_visitor { /*********************************************************************** TypeVisitor ***********************************************************************/ // Visitor Members ----------------------------------- void TypeVisitor::Visit(WfPredefinedType* node) { } void TypeVisitor::Visit(WfTopQualifiedType* node) { } void TypeVisitor::Visit(WfReferenceType* node) { } void TypeVisitor::Visit(WfRawPointerType* node) { } void TypeVisitor::Visit(WfSharedPointerType* node) { } void TypeVisitor::Visit(WfNullableType* node) { } void TypeVisitor::Visit(WfEnumerableType* node) { } void TypeVisitor::Visit(WfMapType* node) { } void TypeVisitor::Visit(WfObservableListType* node) { } void TypeVisitor::Visit(WfFunctionType* node) { } void TypeVisitor::Visit(WfChildType* node) { } /*********************************************************************** ExpressionVisitor ***********************************************************************/ // Visitor Members ----------------------------------- void ExpressionVisitor::Visit(WfThisExpression* node) { } void ExpressionVisitor::Visit(WfTopQualifiedExpression* node) { } void ExpressionVisitor::Visit(WfReferenceExpression* node) { } void ExpressionVisitor::Visit(WfOrderedNameExpression* node) { } void ExpressionVisitor::Visit(WfOrderedLambdaExpression* node) { } void ExpressionVisitor::Visit(WfMemberExpression* node) { } void ExpressionVisitor::Visit(WfChildExpression* node) { } void ExpressionVisitor::Visit(WfLiteralExpression* node) { } void ExpressionVisitor::Visit(WfFloatingExpression* node) { } void ExpressionVisitor::Visit(WfIntegerExpression* node) { } void ExpressionVisitor::Visit(WfStringExpression* node) { } void ExpressionVisitor::Visit(WfUnaryExpression* node) { } void ExpressionVisitor::Visit(WfBinaryExpression* node) { } void ExpressionVisitor::Visit(WfLetExpression* node) { } void ExpressionVisitor::Visit(WfIfExpression* node) { } void ExpressionVisitor::Visit(WfRangeExpression* node) { } void ExpressionVisitor::Visit(WfSetTestingExpression* node) { } void ExpressionVisitor::Visit(WfConstructorExpression* node) { } void ExpressionVisitor::Visit(WfInferExpression* node) { } void ExpressionVisitor::Visit(WfTypeCastingExpression* node) { } void ExpressionVisitor::Visit(WfTypeTestingExpression* node) { } void ExpressionVisitor::Visit(WfTypeOfTypeExpression* node) { } void ExpressionVisitor::Visit(WfTypeOfExpressionExpression* node) { } void ExpressionVisitor::Visit(WfAttachEventExpression* node) { } void ExpressionVisitor::Visit(WfDetachEventExpression* node) { } void ExpressionVisitor::Visit(WfObserveExpression* node) { } void ExpressionVisitor::Visit(WfCallExpression* node) { } void ExpressionVisitor::Visit(WfFunctionExpression* node) { } void ExpressionVisitor::Visit(WfNewClassExpression* node) { } void ExpressionVisitor::Visit(WfNewInterfaceExpression* node) { } void ExpressionVisitor::Visit(WfVirtualCfeExpression* node) { Dispatch(node); } void ExpressionVisitor::Visit(WfVirtualCseExpression* node) { Dispatch(node); } /*********************************************************************** StatementVisitor ***********************************************************************/ // Visitor Members ----------------------------------- void StatementVisitor::Visit(WfBreakStatement* node) { } void StatementVisitor::Visit(WfContinueStatement* node) { } void StatementVisitor::Visit(WfReturnStatement* node) { } void StatementVisitor::Visit(WfDeleteStatement* node) { } void StatementVisitor::Visit(WfRaiseExceptionStatement* node) { } void StatementVisitor::Visit(WfIfStatement* node) { } void StatementVisitor::Visit(WfWhileStatement* node) { } void StatementVisitor::Visit(WfTryStatement* node) { } void StatementVisitor::Visit(WfBlockStatement* node) { } void StatementVisitor::Visit(WfGotoStatement* node) { } void StatementVisitor::Visit(WfVariableStatement* node) { } void StatementVisitor::Visit(WfExpressionStatement* node) { } void StatementVisitor::Visit(WfVirtualCseStatement* node) { Dispatch(node); } void StatementVisitor::Visit(WfCoroutineStatement* node) { Dispatch(node); } void StatementVisitor::Visit(WfStateMachineStatement* node) { Dispatch(node); } /*********************************************************************** DeclarationVisitor ***********************************************************************/ // Visitor Members ----------------------------------- void DeclarationVisitor::Visit(WfNamespaceDeclaration* node) { } void DeclarationVisitor::Visit(WfFunctionDeclaration* node) { } void DeclarationVisitor::Visit(WfVariableDeclaration* node) { } void DeclarationVisitor::Visit(WfEventDeclaration* node) { } void DeclarationVisitor::Visit(WfPropertyDeclaration* node) { } void DeclarationVisitor::Visit(WfStaticInitDeclaration* node) { } void DeclarationVisitor::Visit(WfConstructorDeclaration* node) { } void DeclarationVisitor::Visit(WfDestructorDeclaration* node) { } void DeclarationVisitor::Visit(WfClassDeclaration* node) { } void DeclarationVisitor::Visit(WfEnumDeclaration* node) { } void DeclarationVisitor::Visit(WfStructDeclaration* node) { } void DeclarationVisitor::Visit(WfVirtualCfeDeclaration* node) { Dispatch(node); } void DeclarationVisitor::Visit(WfVirtualCseDeclaration* node) { Dispatch(node); } /*********************************************************************** VirtualCfeDeclarationVisitor ***********************************************************************/ // Visitor Members ----------------------------------- void VirtualCfeDeclarationVisitor::Visit(WfAutoPropertyDeclaration* node) { } void VirtualCfeDeclarationVisitor::Visit(WfCastResultInterfaceDeclaration* node) { } /*********************************************************************** VirtualCseDeclarationVisitor ***********************************************************************/ // Visitor Members ----------------------------------- void VirtualCseDeclarationVisitor::Visit(WfStateMachineDeclaration* node) { } /*********************************************************************** VirtualCseStatementVisitor ***********************************************************************/ // Visitor Members ----------------------------------- void VirtualCseStatementVisitor::Visit(WfForEachStatement* node) { } void VirtualCseStatementVisitor::Visit(WfSwitchStatement* node) { } void VirtualCseStatementVisitor::Visit(WfCoProviderStatement* node) { } /*********************************************************************** CoroutineStatementVisitor ***********************************************************************/ // Visitor Members ----------------------------------- void CoroutineStatementVisitor::Visit(WfCoPauseStatement* node) { } void CoroutineStatementVisitor::Visit(WfCoOperatorStatement* node) { } /*********************************************************************** StateMachineStatementVisitor ***********************************************************************/ // Visitor Members ----------------------------------- void StateMachineStatementVisitor::Visit(WfStateSwitchStatement* node) { } void StateMachineStatementVisitor::Visit(WfStateInvokeStatement* node) { } /*********************************************************************** VirtualCfeExpressionVisitor ***********************************************************************/ // Visitor Members ----------------------------------- void VirtualCfeExpressionVisitor::Visit(WfFormatExpression* node) { } /*********************************************************************** VirtualCseExpressionVisitor ***********************************************************************/ // Visitor Members ----------------------------------- void VirtualCseExpressionVisitor::Visit(WfBindExpression* node) { } void VirtualCseExpressionVisitor::Visit(WfNewCoroutineExpression* node) { } void VirtualCseExpressionVisitor::Visit(WfMixinCastExpression* node) { } void VirtualCseExpressionVisitor::Visit(WfExpectedTypeCastExpression* node) { } void VirtualCseExpressionVisitor::Visit(WfCoOperatorExpression* node) { } /*********************************************************************** ModuleUsingFragmentVisitor ***********************************************************************/ // Visitor Members ----------------------------------- void ModuleUsingFragmentVisitor::Visit(WfModuleUsingNameFragment* node) { } void ModuleUsingFragmentVisitor::Visit(WfModuleUsingWildCardFragment* node) { } } /*********************************************************************** .\PARSER\GENERATED\WORKFLOWAST_JSON.CPP ***********************************************************************/ /*********************************************************************** This file is generated by: Vczh Parser Generator From parser definition:Ast Licensed under https://github.com/vczh-libraries/License ***********************************************************************/ namespace vl::workflow::json_visitor { void AstVisitor::PrintFields(WfAttachEventExpression* node) { BeginField(vl::WString::Unmanaged(L"event")); Print(node->event.Obj()); EndField(); BeginField(vl::WString::Unmanaged(L"function")); Print(node->function.Obj()); EndField(); } void AstVisitor::PrintFields(WfAttribute* node) { BeginField(vl::WString::Unmanaged(L"category")); WriteToken(node->category); EndField(); BeginField(vl::WString::Unmanaged(L"name")); WriteToken(node->name); EndField(); BeginField(vl::WString::Unmanaged(L"value")); Print(node->value.Obj()); EndField(); } void AstVisitor::PrintFields(WfAutoPropertyDeclaration* node) { BeginField(vl::WString::Unmanaged(L"configConst")); switch (node->configConst) { case vl::workflow::WfAPConst::Readonly: WriteString(vl::WString::Unmanaged(L"Readonly")); break; case vl::workflow::WfAPConst::Writable: WriteString(vl::WString::Unmanaged(L"Writable")); break; default: WriteNull(); } EndField(); BeginField(vl::WString::Unmanaged(L"configObserve")); switch (node->configObserve) { case vl::workflow::WfAPObserve::NotObservable: WriteString(vl::WString::Unmanaged(L"NotObservable")); break; case vl::workflow::WfAPObserve::Observable: WriteString(vl::WString::Unmanaged(L"Observable")); break; default: WriteNull(); } EndField(); BeginField(vl::WString::Unmanaged(L"expression")); Print(node->expression.Obj()); EndField(); BeginField(vl::WString::Unmanaged(L"functionKind")); switch (node->functionKind) { case vl::workflow::WfFunctionKind::Normal: WriteString(vl::WString::Unmanaged(L"Normal")); break; case vl::workflow::WfFunctionKind::Override: WriteString(vl::WString::Unmanaged(L"Override")); break; case vl::workflow::WfFunctionKind::Static: WriteString(vl::WString::Unmanaged(L"Static")); break; default: WriteNull(); } EndField(); BeginField(vl::WString::Unmanaged(L"type")); Print(node->type.Obj()); EndField(); } void AstVisitor::PrintFields(WfBaseConstructorCall* node) { BeginField(vl::WString::Unmanaged(L"arguments")); BeginArray(); for (auto&& listItem : node->arguments) { BeginArrayItem(); Print(listItem.Obj()); EndArrayItem(); } EndArray(); EndField(); BeginField(vl::WString::Unmanaged(L"type")); Print(node->type.Obj()); EndField(); } void AstVisitor::PrintFields(WfBinaryExpression* node) { BeginField(vl::WString::Unmanaged(L"first")); Print(node->first.Obj()); EndField(); BeginField(vl::WString::Unmanaged(L"op")); switch (node->op) { case vl::workflow::WfBinaryOperator::Add: WriteString(vl::WString::Unmanaged(L"Add")); break; case vl::workflow::WfBinaryOperator::And: WriteString(vl::WString::Unmanaged(L"And")); break; case vl::workflow::WfBinaryOperator::Assign: WriteString(vl::WString::Unmanaged(L"Assign")); break; case vl::workflow::WfBinaryOperator::Div: WriteString(vl::WString::Unmanaged(L"Div")); break; case vl::workflow::WfBinaryOperator::EQ: WriteString(vl::WString::Unmanaged(L"EQ")); break; case vl::workflow::WfBinaryOperator::Exp: WriteString(vl::WString::Unmanaged(L"Exp")); break; case vl::workflow::WfBinaryOperator::FailedThen: WriteString(vl::WString::Unmanaged(L"FailedThen")); break; case vl::workflow::WfBinaryOperator::FlagAnd: WriteString(vl::WString::Unmanaged(L"FlagAnd")); break; case vl::workflow::WfBinaryOperator::FlagOr: WriteString(vl::WString::Unmanaged(L"FlagOr")); break; case vl::workflow::WfBinaryOperator::GE: WriteString(vl::WString::Unmanaged(L"GE")); break; case vl::workflow::WfBinaryOperator::GT: WriteString(vl::WString::Unmanaged(L"GT")); break; case vl::workflow::WfBinaryOperator::Index: WriteString(vl::WString::Unmanaged(L"Index")); break; case vl::workflow::WfBinaryOperator::LE: WriteString(vl::WString::Unmanaged(L"LE")); break; case vl::workflow::WfBinaryOperator::LT: WriteString(vl::WString::Unmanaged(L"LT")); break; case vl::workflow::WfBinaryOperator::Mod: WriteString(vl::WString::Unmanaged(L"Mod")); break; case vl::workflow::WfBinaryOperator::Mul: WriteString(vl::WString::Unmanaged(L"Mul")); break; case vl::workflow::WfBinaryOperator::NE: WriteString(vl::WString::Unmanaged(L"NE")); break; case vl::workflow::WfBinaryOperator::Or: WriteString(vl::WString::Unmanaged(L"Or")); break; case vl::workflow::WfBinaryOperator::Shl: WriteString(vl::WString::Unmanaged(L"Shl")); break; case vl::workflow::WfBinaryOperator::Shr: WriteString(vl::WString::Unmanaged(L"Shr")); break; case vl::workflow::WfBinaryOperator::Sub: WriteString(vl::WString::Unmanaged(L"Sub")); break; case vl::workflow::WfBinaryOperator::Xor: WriteString(vl::WString::Unmanaged(L"Xor")); break; default: WriteNull(); } EndField(); BeginField(vl::WString::Unmanaged(L"second")); Print(node->second.Obj()); EndField(); } void AstVisitor::PrintFields(WfBindExpression* node) { BeginField(vl::WString::Unmanaged(L"expression")); Print(node->expression.Obj()); EndField(); } void AstVisitor::PrintFields(WfBlockStatement* node) { BeginField(vl::WString::Unmanaged(L"endLabel")); WriteToken(node->endLabel); EndField(); BeginField(vl::WString::Unmanaged(L"statements")); BeginArray(); for (auto&& listItem : node->statements) { BeginArrayItem(); Print(listItem.Obj()); EndArrayItem(); } EndArray(); EndField(); } void AstVisitor::PrintFields(WfBreakStatement* node) { } void AstVisitor::PrintFields(WfCallExpression* node) { BeginField(vl::WString::Unmanaged(L"arguments")); BeginArray(); for (auto&& listItem : node->arguments) { BeginArrayItem(); Print(listItem.Obj()); EndArrayItem(); } EndArray(); EndField(); BeginField(vl::WString::Unmanaged(L"function")); Print(node->function.Obj()); EndField(); } void AstVisitor::PrintFields(WfCastResultInterfaceDeclaration* node) { BeginField(vl::WString::Unmanaged(L"baseType")); Print(node->baseType.Obj()); EndField(); BeginField(vl::WString::Unmanaged(L"elementType")); Print(node->elementType.Obj()); EndField(); } void AstVisitor::PrintFields(WfChildExpression* node) { BeginField(vl::WString::Unmanaged(L"name")); WriteToken(node->name); EndField(); BeginField(vl::WString::Unmanaged(L"parent")); Print(node->parent.Obj()); EndField(); } void AstVisitor::PrintFields(WfChildType* node) { BeginField(vl::WString::Unmanaged(L"name")); WriteToken(node->name); EndField(); BeginField(vl::WString::Unmanaged(L"parent")); Print(node->parent.Obj()); EndField(); } void AstVisitor::PrintFields(WfClassDeclaration* node) { BeginField(vl::WString::Unmanaged(L"baseTypes")); BeginArray(); for (auto&& listItem : node->baseTypes) { BeginArrayItem(); Print(listItem.Obj()); EndArrayItem(); } EndArray(); EndField(); BeginField(vl::WString::Unmanaged(L"constructorType")); switch (node->constructorType) { case vl::workflow::WfConstructorType::RawPtr: WriteString(vl::WString::Unmanaged(L"RawPtr")); break; case vl::workflow::WfConstructorType::SharedPtr: WriteString(vl::WString::Unmanaged(L"SharedPtr")); break; case vl::workflow::WfConstructorType::Undefined: WriteString(vl::WString::Unmanaged(L"Undefined")); break; default: WriteNull(); } EndField(); BeginField(vl::WString::Unmanaged(L"declarations")); BeginArray(); for (auto&& listItem : node->declarations) { BeginArrayItem(); Print(listItem.Obj()); EndArrayItem(); } EndArray(); EndField(); BeginField(vl::WString::Unmanaged(L"kind")); switch (node->kind) { case vl::workflow::WfClassKind::Class: WriteString(vl::WString::Unmanaged(L"Class")); break; case vl::workflow::WfClassKind::Interface: WriteString(vl::WString::Unmanaged(L"Interface")); break; default: WriteNull(); } EndField(); } void AstVisitor::PrintFields(WfCoOperatorExpression* node) { BeginField(vl::WString::Unmanaged(L"name")); WriteToken(node->name); EndField(); } void AstVisitor::PrintFields(WfCoOperatorStatement* node) { BeginField(vl::WString::Unmanaged(L"arguments")); BeginArray(); for (auto&& listItem : node->arguments) { BeginArrayItem(); Print(listItem.Obj()); EndArrayItem(); } EndArray(); EndField(); BeginField(vl::WString::Unmanaged(L"opName")); WriteToken(node->opName); EndField(); BeginField(vl::WString::Unmanaged(L"varName")); WriteToken(node->varName); EndField(); } void AstVisitor::PrintFields(WfCoPauseStatement* node) { BeginField(vl::WString::Unmanaged(L"statement")); Print(node->statement.Obj()); EndField(); } void AstVisitor::PrintFields(WfCoProviderStatement* node) { BeginField(vl::WString::Unmanaged(L"name")); WriteToken(node->name); EndField(); BeginField(vl::WString::Unmanaged(L"statement")); Print(node->statement.Obj()); EndField(); } void AstVisitor::PrintFields(WfConstructorArgument* node) { BeginField(vl::WString::Unmanaged(L"key")); Print(node->key.Obj()); EndField(); BeginField(vl::WString::Unmanaged(L"value")); Print(node->value.Obj()); EndField(); } void AstVisitor::PrintFields(WfConstructorDeclaration* node) { BeginField(vl::WString::Unmanaged(L"arguments")); BeginArray(); for (auto&& listItem : node->arguments) { BeginArrayItem(); Print(listItem.Obj()); EndArrayItem(); } EndArray(); EndField(); BeginField(vl::WString::Unmanaged(L"baseConstructorCalls")); BeginArray(); for (auto&& listItem : node->baseConstructorCalls) { BeginArrayItem(); Print(listItem.Obj()); EndArrayItem(); } EndArray(); EndField(); BeginField(vl::WString::Unmanaged(L"constructorType")); switch (node->constructorType) { case vl::workflow::WfConstructorType::RawPtr: WriteString(vl::WString::Unmanaged(L"RawPtr")); break; case vl::workflow::WfConstructorType::SharedPtr: WriteString(vl::WString::Unmanaged(L"SharedPtr")); break; case vl::workflow::WfConstructorType::Undefined: WriteString(vl::WString::Unmanaged(L"Undefined")); break; default: WriteNull(); } EndField(); BeginField(vl::WString::Unmanaged(L"statement")); Print(node->statement.Obj()); EndField(); } void AstVisitor::PrintFields(WfConstructorExpression* node) { BeginField(vl::WString::Unmanaged(L"arguments")); BeginArray(); for (auto&& listItem : node->arguments) { BeginArrayItem(); Print(listItem.Obj()); EndArrayItem(); } EndArray(); EndField(); } void AstVisitor::PrintFields(WfContinueStatement* node) { } void AstVisitor::PrintFields(WfCoroutineStatement* node) { } void AstVisitor::PrintFields(WfDeclaration* node) { BeginField(vl::WString::Unmanaged(L"attributes")); BeginArray(); for (auto&& listItem : node->attributes) { BeginArrayItem(); Print(listItem.Obj()); EndArrayItem(); } EndArray(); EndField(); BeginField(vl::WString::Unmanaged(L"name")); WriteToken(node->name); EndField(); } void AstVisitor::PrintFields(WfDeleteStatement* node) { BeginField(vl::WString::Unmanaged(L"expression")); Print(node->expression.Obj()); EndField(); } void AstVisitor::PrintFields(WfDestructorDeclaration* node) { BeginField(vl::WString::Unmanaged(L"statement")); Print(node->statement.Obj()); EndField(); } void AstVisitor::PrintFields(WfDetachEventExpression* node) { BeginField(vl::WString::Unmanaged(L"event")); Print(node->event.Obj()); EndField(); BeginField(vl::WString::Unmanaged(L"handler")); Print(node->handler.Obj()); EndField(); } void AstVisitor::PrintFields(WfEnumDeclaration* node) { BeginField(vl::WString::Unmanaged(L"items")); BeginArray(); for (auto&& listItem : node->items) { BeginArrayItem(); Print(listItem.Obj()); EndArrayItem(); } EndArray(); EndField(); BeginField(vl::WString::Unmanaged(L"kind")); switch (node->kind) { case vl::workflow::WfEnumKind::Flag: WriteString(vl::WString::Unmanaged(L"Flag")); break; case vl::workflow::WfEnumKind::Normal: WriteString(vl::WString::Unmanaged(L"Normal")); break; default: WriteNull(); } EndField(); } void AstVisitor::PrintFields(WfEnumItem* node) { BeginField(vl::WString::Unmanaged(L"attributes")); BeginArray(); for (auto&& listItem : node->attributes) { BeginArrayItem(); Print(listItem.Obj()); EndArrayItem(); } EndArray(); EndField(); BeginField(vl::WString::Unmanaged(L"intersections")); BeginArray(); for (auto&& listItem : node->intersections) { BeginArrayItem(); Print(listItem.Obj()); EndArrayItem(); } EndArray(); EndField(); BeginField(vl::WString::Unmanaged(L"kind")); switch (node->kind) { case vl::workflow::WfEnumItemKind::Constant: WriteString(vl::WString::Unmanaged(L"Constant")); break; case vl::workflow::WfEnumItemKind::Intersection: WriteString(vl::WString::Unmanaged(L"Intersection")); break; default: WriteNull(); } EndField(); BeginField(vl::WString::Unmanaged(L"name")); WriteToken(node->name); EndField(); BeginField(vl::WString::Unmanaged(L"number")); WriteToken(node->number); EndField(); } void AstVisitor::PrintFields(WfEnumItemIntersection* node) { BeginField(vl::WString::Unmanaged(L"name")); WriteToken(node->name); EndField(); } void AstVisitor::PrintFields(WfEnumerableType* node) { BeginField(vl::WString::Unmanaged(L"element")); Print(node->element.Obj()); EndField(); } void AstVisitor::PrintFields(WfEventDeclaration* node) { BeginField(vl::WString::Unmanaged(L"arguments")); BeginArray(); for (auto&& listItem : node->arguments) { BeginArrayItem(); Print(listItem.Obj()); EndArrayItem(); } EndArray(); EndField(); } void AstVisitor::PrintFields(WfExpectedTypeCastExpression* node) { BeginField(vl::WString::Unmanaged(L"expression")); Print(node->expression.Obj()); EndField(); BeginField(vl::WString::Unmanaged(L"strategy")); switch (node->strategy) { case vl::workflow::WfTypeCastingStrategy::Strong: WriteString(vl::WString::Unmanaged(L"Strong")); break; case vl::workflow::WfTypeCastingStrategy::Weak: WriteString(vl::WString::Unmanaged(L"Weak")); break; default: WriteNull(); } EndField(); } void AstVisitor::PrintFields(WfExpression* node) { } void AstVisitor::PrintFields(WfExpressionStatement* node) { BeginField(vl::WString::Unmanaged(L"expression")); Print(node->expression.Obj()); EndField(); } void AstVisitor::PrintFields(WfFloatingExpression* node) { BeginField(vl::WString::Unmanaged(L"value")); WriteToken(node->value); EndField(); } void AstVisitor::PrintFields(WfForEachStatement* node) { BeginField(vl::WString::Unmanaged(L"collection")); Print(node->collection.Obj()); EndField(); BeginField(vl::WString::Unmanaged(L"direction")); switch (node->direction) { case vl::workflow::WfForEachDirection::Normal: WriteString(vl::WString::Unmanaged(L"Normal")); break; case vl::workflow::WfForEachDirection::Reversed: WriteString(vl::WString::Unmanaged(L"Reversed")); break; default: WriteNull(); } EndField(); BeginField(vl::WString::Unmanaged(L"name")); WriteToken(node->name); EndField(); BeginField(vl::WString::Unmanaged(L"statement")); Print(node->statement.Obj()); EndField(); } void AstVisitor::PrintFields(WfFormatExpression* node) { BeginField(vl::WString::Unmanaged(L"value")); WriteToken(node->value); EndField(); } void AstVisitor::PrintFields(WfFunctionArgument* node) { BeginField(vl::WString::Unmanaged(L"attributes")); BeginArray(); for (auto&& listItem : node->attributes) { BeginArrayItem(); Print(listItem.Obj()); EndArrayItem(); } EndArray(); EndField(); BeginField(vl::WString::Unmanaged(L"name")); WriteToken(node->name); EndField(); BeginField(vl::WString::Unmanaged(L"type")); Print(node->type.Obj()); EndField(); } void AstVisitor::PrintFields(WfFunctionDeclaration* node) { BeginField(vl::WString::Unmanaged(L"anonymity")); switch (node->anonymity) { case vl::workflow::WfFunctionAnonymity::Anonymous: WriteString(vl::WString::Unmanaged(L"Anonymous")); break; case vl::workflow::WfFunctionAnonymity::Named: WriteString(vl::WString::Unmanaged(L"Named")); break; default: WriteNull(); } EndField(); BeginField(vl::WString::Unmanaged(L"arguments")); BeginArray(); for (auto&& listItem : node->arguments) { BeginArrayItem(); Print(listItem.Obj()); EndArrayItem(); } EndArray(); EndField(); BeginField(vl::WString::Unmanaged(L"functionKind")); switch (node->functionKind) { case vl::workflow::WfFunctionKind::Normal: WriteString(vl::WString::Unmanaged(L"Normal")); break; case vl::workflow::WfFunctionKind::Override: WriteString(vl::WString::Unmanaged(L"Override")); break; case vl::workflow::WfFunctionKind::Static: WriteString(vl::WString::Unmanaged(L"Static")); break; default: WriteNull(); } EndField(); BeginField(vl::WString::Unmanaged(L"returnType")); Print(node->returnType.Obj()); EndField(); BeginField(vl::WString::Unmanaged(L"statement")); Print(node->statement.Obj()); EndField(); } void AstVisitor::PrintFields(WfFunctionExpression* node) { BeginField(vl::WString::Unmanaged(L"function")); Print(node->function.Obj()); EndField(); } void AstVisitor::PrintFields(WfFunctionType* node) { BeginField(vl::WString::Unmanaged(L"arguments")); BeginArray(); for (auto&& listItem : node->arguments) { BeginArrayItem(); Print(listItem.Obj()); EndArrayItem(); } EndArray(); EndField(); BeginField(vl::WString::Unmanaged(L"result")); Print(node->result.Obj()); EndField(); } void AstVisitor::PrintFields(WfGotoStatement* node) { BeginField(vl::WString::Unmanaged(L"label")); WriteToken(node->label); EndField(); } void AstVisitor::PrintFields(WfIfExpression* node) { BeginField(vl::WString::Unmanaged(L"condition")); Print(node->condition.Obj()); EndField(); BeginField(vl::WString::Unmanaged(L"falseBranch")); Print(node->falseBranch.Obj()); EndField(); BeginField(vl::WString::Unmanaged(L"trueBranch")); Print(node->trueBranch.Obj()); EndField(); } void AstVisitor::PrintFields(WfIfStatement* node) { BeginField(vl::WString::Unmanaged(L"expression")); Print(node->expression.Obj()); EndField(); BeginField(vl::WString::Unmanaged(L"falseBranch")); Print(node->falseBranch.Obj()); EndField(); BeginField(vl::WString::Unmanaged(L"name")); WriteToken(node->name); EndField(); BeginField(vl::WString::Unmanaged(L"trueBranch")); Print(node->trueBranch.Obj()); EndField(); BeginField(vl::WString::Unmanaged(L"type")); Print(node->type.Obj()); EndField(); } void AstVisitor::PrintFields(WfInferExpression* node) { BeginField(vl::WString::Unmanaged(L"expression")); Print(node->expression.Obj()); EndField(); BeginField(vl::WString::Unmanaged(L"type")); Print(node->type.Obj()); EndField(); } void AstVisitor::PrintFields(WfIntegerExpression* node) { BeginField(vl::WString::Unmanaged(L"value")); WriteToken(node->value); EndField(); } void AstVisitor::PrintFields(WfLetExpression* node) { BeginField(vl::WString::Unmanaged(L"expression")); Print(node->expression.Obj()); EndField(); BeginField(vl::WString::Unmanaged(L"variables")); BeginArray(); for (auto&& listItem : node->variables) { BeginArrayItem(); Print(listItem.Obj()); EndArrayItem(); } EndArray(); EndField(); } void AstVisitor::PrintFields(WfLetVariable* node) { BeginField(vl::WString::Unmanaged(L"name")); WriteToken(node->name); EndField(); BeginField(vl::WString::Unmanaged(L"value")); Print(node->value.Obj()); EndField(); } void AstVisitor::PrintFields(WfLiteralExpression* node) { BeginField(vl::WString::Unmanaged(L"value")); switch (node->value) { case vl::workflow::WfLiteralValue::False: WriteString(vl::WString::Unmanaged(L"False")); break; case vl::workflow::WfLiteralValue::Null: WriteString(vl::WString::Unmanaged(L"Null")); break; case vl::workflow::WfLiteralValue::True: WriteString(vl::WString::Unmanaged(L"True")); break; default: WriteNull(); } EndField(); } void AstVisitor::PrintFields(WfMapType* node) { BeginField(vl::WString::Unmanaged(L"key")); Print(node->key.Obj()); EndField(); BeginField(vl::WString::Unmanaged(L"value")); Print(node->value.Obj()); EndField(); BeginField(vl::WString::Unmanaged(L"writability")); switch (node->writability) { case vl::workflow::WfMapWritability::Readonly: WriteString(vl::WString::Unmanaged(L"Readonly")); break; case vl::workflow::WfMapWritability::Writable: WriteString(vl::WString::Unmanaged(L"Writable")); break; default: WriteNull(); } EndField(); } void AstVisitor::PrintFields(WfMemberExpression* node) { BeginField(vl::WString::Unmanaged(L"name")); WriteToken(node->name); EndField(); BeginField(vl::WString::Unmanaged(L"parent")); Print(node->parent.Obj()); EndField(); } void AstVisitor::PrintFields(WfMixinCastExpression* node) { BeginField(vl::WString::Unmanaged(L"expression")); Print(node->expression.Obj()); EndField(); BeginField(vl::WString::Unmanaged(L"type")); Print(node->type.Obj()); EndField(); } void AstVisitor::PrintFields(WfModule* node) { BeginField(vl::WString::Unmanaged(L"declarations")); BeginArray(); for (auto&& listItem : node->declarations) { BeginArrayItem(); Print(listItem.Obj()); EndArrayItem(); } EndArray(); EndField(); BeginField(vl::WString::Unmanaged(L"moduleType")); switch (node->moduleType) { case vl::workflow::WfModuleType::Module: WriteString(vl::WString::Unmanaged(L"Module")); break; case vl::workflow::WfModuleType::Unit: WriteString(vl::WString::Unmanaged(L"Unit")); break; default: WriteNull(); } EndField(); BeginField(vl::WString::Unmanaged(L"name")); WriteToken(node->name); EndField(); BeginField(vl::WString::Unmanaged(L"paths")); BeginArray(); for (auto&& listItem : node->paths) { BeginArrayItem(); Print(listItem.Obj()); EndArrayItem(); } EndArray(); EndField(); } void AstVisitor::PrintFields(WfModuleUsingFragment* node) { } void AstVisitor::PrintFields(WfModuleUsingItem* node) { BeginField(vl::WString::Unmanaged(L"fragments")); BeginArray(); for (auto&& listItem : node->fragments) { BeginArrayItem(); Print(listItem.Obj()); EndArrayItem(); } EndArray(); EndField(); } void AstVisitor::PrintFields(WfModuleUsingNameFragment* node) { BeginField(vl::WString::Unmanaged(L"name")); WriteToken(node->name); EndField(); } void AstVisitor::PrintFields(WfModuleUsingPath* node) { BeginField(vl::WString::Unmanaged(L"items")); BeginArray(); for (auto&& listItem : node->items) { BeginArrayItem(); Print(listItem.Obj()); EndArrayItem(); } EndArray(); EndField(); } void AstVisitor::PrintFields(WfModuleUsingWildCardFragment* node) { } void AstVisitor::PrintFields(WfNamespaceDeclaration* node) { BeginField(vl::WString::Unmanaged(L"declarations")); BeginArray(); for (auto&& listItem : node->declarations) { BeginArrayItem(); Print(listItem.Obj()); EndArrayItem(); } EndArray(); EndField(); } void AstVisitor::PrintFields(WfNewClassExpression* node) { BeginField(vl::WString::Unmanaged(L"arguments")); BeginArray(); for (auto&& listItem : node->arguments) { BeginArrayItem(); Print(listItem.Obj()); EndArrayItem(); } EndArray(); EndField(); BeginField(vl::WString::Unmanaged(L"type")); Print(node->type.Obj()); EndField(); } void AstVisitor::PrintFields(WfNewCoroutineExpression* node) { BeginField(vl::WString::Unmanaged(L"name")); WriteToken(node->name); EndField(); BeginField(vl::WString::Unmanaged(L"statement")); Print(node->statement.Obj()); EndField(); } void AstVisitor::PrintFields(WfNewInterfaceExpression* node) { BeginField(vl::WString::Unmanaged(L"declarations")); BeginArray(); for (auto&& listItem : node->declarations) { BeginArrayItem(); Print(listItem.Obj()); EndArrayItem(); } EndArray(); EndField(); BeginField(vl::WString::Unmanaged(L"type")); Print(node->type.Obj()); EndField(); } void AstVisitor::PrintFields(WfNullableType* node) { BeginField(vl::WString::Unmanaged(L"element")); Print(node->element.Obj()); EndField(); } void AstVisitor::PrintFields(WfObservableListType* node) { BeginField(vl::WString::Unmanaged(L"element")); Print(node->element.Obj()); EndField(); } void AstVisitor::PrintFields(WfObserveExpression* node) { BeginField(vl::WString::Unmanaged(L"events")); BeginArray(); for (auto&& listItem : node->events) { BeginArrayItem(); Print(listItem.Obj()); EndArrayItem(); } EndArray(); EndField(); BeginField(vl::WString::Unmanaged(L"expression")); Print(node->expression.Obj()); EndField(); BeginField(vl::WString::Unmanaged(L"name")); WriteToken(node->name); EndField(); BeginField(vl::WString::Unmanaged(L"observeType")); switch (node->observeType) { case vl::workflow::WfObserveType::ExtendedObserve: WriteString(vl::WString::Unmanaged(L"ExtendedObserve")); break; case vl::workflow::WfObserveType::SimpleObserve: WriteString(vl::WString::Unmanaged(L"SimpleObserve")); break; default: WriteNull(); } EndField(); BeginField(vl::WString::Unmanaged(L"parent")); Print(node->parent.Obj()); EndField(); } void AstVisitor::PrintFields(WfOrderedLambdaExpression* node) { BeginField(vl::WString::Unmanaged(L"body")); Print(node->body.Obj()); EndField(); } void AstVisitor::PrintFields(WfOrderedNameExpression* node) { BeginField(vl::WString::Unmanaged(L"name")); WriteToken(node->name); EndField(); } void AstVisitor::PrintFields(WfPredefinedType* node) { BeginField(vl::WString::Unmanaged(L"name")); switch (node->name) { case vl::workflow::WfPredefinedTypeName::Bool: WriteString(vl::WString::Unmanaged(L"Bool")); break; case vl::workflow::WfPredefinedTypeName::Char: WriteString(vl::WString::Unmanaged(L"Char")); break; case vl::workflow::WfPredefinedTypeName::Double: WriteString(vl::WString::Unmanaged(L"Double")); break; case vl::workflow::WfPredefinedTypeName::Float: WriteString(vl::WString::Unmanaged(L"Float")); break; case vl::workflow::WfPredefinedTypeName::Int: WriteString(vl::WString::Unmanaged(L"Int")); break; case vl::workflow::WfPredefinedTypeName::Interface: WriteString(vl::WString::Unmanaged(L"Interface")); break; case vl::workflow::WfPredefinedTypeName::Object: WriteString(vl::WString::Unmanaged(L"Object")); break; case vl::workflow::WfPredefinedTypeName::String: WriteString(vl::WString::Unmanaged(L"String")); break; case vl::workflow::WfPredefinedTypeName::UInt: WriteString(vl::WString::Unmanaged(L"UInt")); break; case vl::workflow::WfPredefinedTypeName::Void: WriteString(vl::WString::Unmanaged(L"Void")); break; default: WriteNull(); } EndField(); } void AstVisitor::PrintFields(WfPropertyDeclaration* node) { BeginField(vl::WString::Unmanaged(L"getter")); WriteToken(node->getter); EndField(); BeginField(vl::WString::Unmanaged(L"setter")); WriteToken(node->setter); EndField(); BeginField(vl::WString::Unmanaged(L"type")); Print(node->type.Obj()); EndField(); BeginField(vl::WString::Unmanaged(L"valueChangedEvent")); WriteToken(node->valueChangedEvent); EndField(); } void AstVisitor::PrintFields(WfRaiseExceptionStatement* node) { BeginField(vl::WString::Unmanaged(L"expression")); Print(node->expression.Obj()); EndField(); } void AstVisitor::PrintFields(WfRangeExpression* node) { BeginField(vl::WString::Unmanaged(L"begin")); Print(node->begin.Obj()); EndField(); BeginField(vl::WString::Unmanaged(L"beginBoundary")); switch (node->beginBoundary) { case vl::workflow::WfRangeBoundary::Exclusive: WriteString(vl::WString::Unmanaged(L"Exclusive")); break; case vl::workflow::WfRangeBoundary::Inclusive: WriteString(vl::WString::Unmanaged(L"Inclusive")); break; default: WriteNull(); } EndField(); BeginField(vl::WString::Unmanaged(L"end")); Print(node->end.Obj()); EndField(); BeginField(vl::WString::Unmanaged(L"endBoundary")); switch (node->endBoundary) { case vl::workflow::WfRangeBoundary::Exclusive: WriteString(vl::WString::Unmanaged(L"Exclusive")); break; case vl::workflow::WfRangeBoundary::Inclusive: WriteString(vl::WString::Unmanaged(L"Inclusive")); break; default: WriteNull(); } EndField(); } void AstVisitor::PrintFields(WfRawPointerType* node) { BeginField(vl::WString::Unmanaged(L"element")); Print(node->element.Obj()); EndField(); } void AstVisitor::PrintFields(WfReferenceExpression* node) { BeginField(vl::WString::Unmanaged(L"name")); WriteToken(node->name); EndField(); } void AstVisitor::PrintFields(WfReferenceType* node) { BeginField(vl::WString::Unmanaged(L"name")); WriteToken(node->name); EndField(); } void AstVisitor::PrintFields(WfReturnStatement* node) { BeginField(vl::WString::Unmanaged(L"expression")); Print(node->expression.Obj()); EndField(); } void AstVisitor::PrintFields(WfSetTestingExpression* node) { BeginField(vl::WString::Unmanaged(L"collection")); Print(node->collection.Obj()); EndField(); BeginField(vl::WString::Unmanaged(L"element")); Print(node->element.Obj()); EndField(); BeginField(vl::WString::Unmanaged(L"test")); switch (node->test) { case vl::workflow::WfSetTesting::In: WriteString(vl::WString::Unmanaged(L"In")); break; case vl::workflow::WfSetTesting::NotIn: WriteString(vl::WString::Unmanaged(L"NotIn")); break; default: WriteNull(); } EndField(); } void AstVisitor::PrintFields(WfSharedPointerType* node) { BeginField(vl::WString::Unmanaged(L"element")); Print(node->element.Obj()); EndField(); } void AstVisitor::PrintFields(WfStateDeclaration* node) { BeginField(vl::WString::Unmanaged(L"arguments")); BeginArray(); for (auto&& listItem : node->arguments) { BeginArrayItem(); Print(listItem.Obj()); EndArrayItem(); } EndArray(); EndField(); BeginField(vl::WString::Unmanaged(L"name")); WriteToken(node->name); EndField(); BeginField(vl::WString::Unmanaged(L"statement")); Print(node->statement.Obj()); EndField(); } void AstVisitor::PrintFields(WfStateInput* node) { BeginField(vl::WString::Unmanaged(L"arguments")); BeginArray(); for (auto&& listItem : node->arguments) { BeginArrayItem(); Print(listItem.Obj()); EndArrayItem(); } EndArray(); EndField(); BeginField(vl::WString::Unmanaged(L"name")); WriteToken(node->name); EndField(); } void AstVisitor::PrintFields(WfStateInvokeStatement* node) { BeginField(vl::WString::Unmanaged(L"arguments")); BeginArray(); for (auto&& listItem : node->arguments) { BeginArrayItem(); Print(listItem.Obj()); EndArrayItem(); } EndArray(); EndField(); BeginField(vl::WString::Unmanaged(L"name")); WriteToken(node->name); EndField(); BeginField(vl::WString::Unmanaged(L"type")); switch (node->type) { case vl::workflow::WfStateInvokeType::Goto: WriteString(vl::WString::Unmanaged(L"Goto")); break; case vl::workflow::WfStateInvokeType::Push: WriteString(vl::WString::Unmanaged(L"Push")); break; default: WriteNull(); } EndField(); } void AstVisitor::PrintFields(WfStateMachineDeclaration* node) { BeginField(vl::WString::Unmanaged(L"inputs")); BeginArray(); for (auto&& listItem : node->inputs) { BeginArrayItem(); Print(listItem.Obj()); EndArrayItem(); } EndArray(); EndField(); BeginField(vl::WString::Unmanaged(L"states")); BeginArray(); for (auto&& listItem : node->states) { BeginArrayItem(); Print(listItem.Obj()); EndArrayItem(); } EndArray(); EndField(); } void AstVisitor::PrintFields(WfStateMachineStatement* node) { } void AstVisitor::PrintFields(WfStateSwitchArgument* node) { BeginField(vl::WString::Unmanaged(L"name")); WriteToken(node->name); EndField(); } void AstVisitor::PrintFields(WfStateSwitchCase* node) { BeginField(vl::WString::Unmanaged(L"arguments")); BeginArray(); for (auto&& listItem : node->arguments) { BeginArrayItem(); Print(listItem.Obj()); EndArrayItem(); } EndArray(); EndField(); BeginField(vl::WString::Unmanaged(L"name")); WriteToken(node->name); EndField(); BeginField(vl::WString::Unmanaged(L"statement")); Print(node->statement.Obj()); EndField(); } void AstVisitor::PrintFields(WfStateSwitchStatement* node) { BeginField(vl::WString::Unmanaged(L"caseBranches")); BeginArray(); for (auto&& listItem : node->caseBranches) { BeginArrayItem(); Print(listItem.Obj()); EndArrayItem(); } EndArray(); EndField(); BeginField(vl::WString::Unmanaged(L"type")); switch (node->type) { case vl::workflow::WfStateSwitchType::Default: WriteString(vl::WString::Unmanaged(L"Default")); break; case vl::workflow::WfStateSwitchType::Ignore: WriteString(vl::WString::Unmanaged(L"Ignore")); break; case vl::workflow::WfStateSwitchType::IgnoreAndReturn: WriteString(vl::WString::Unmanaged(L"IgnoreAndReturn")); break; case vl::workflow::WfStateSwitchType::Pass: WriteString(vl::WString::Unmanaged(L"Pass")); break; case vl::workflow::WfStateSwitchType::PassAndReturn: WriteString(vl::WString::Unmanaged(L"PassAndReturn")); break; default: WriteNull(); } EndField(); } void AstVisitor::PrintFields(WfStatement* node) { } void AstVisitor::PrintFields(WfStaticInitDeclaration* node) { BeginField(vl::WString::Unmanaged(L"statement")); Print(node->statement.Obj()); EndField(); } void AstVisitor::PrintFields(WfStringExpression* node) { BeginField(vl::WString::Unmanaged(L"value")); WriteToken(node->value); EndField(); } void AstVisitor::PrintFields(WfStructDeclaration* node) { BeginField(vl::WString::Unmanaged(L"members")); BeginArray(); for (auto&& listItem : node->members) { BeginArrayItem(); Print(listItem.Obj()); EndArrayItem(); } EndArray(); EndField(); } void AstVisitor::PrintFields(WfStructMember* node) { BeginField(vl::WString::Unmanaged(L"attributes")); BeginArray(); for (auto&& listItem : node->attributes) { BeginArrayItem(); Print(listItem.Obj()); EndArrayItem(); } EndArray(); EndField(); BeginField(vl::WString::Unmanaged(L"name")); WriteToken(node->name); EndField(); BeginField(vl::WString::Unmanaged(L"type")); Print(node->type.Obj()); EndField(); } void AstVisitor::PrintFields(WfSwitchCase* node) { BeginField(vl::WString::Unmanaged(L"expression")); Print(node->expression.Obj()); EndField(); BeginField(vl::WString::Unmanaged(L"statement")); Print(node->statement.Obj()); EndField(); } void AstVisitor::PrintFields(WfSwitchStatement* node) { BeginField(vl::WString::Unmanaged(L"caseBranches")); BeginArray(); for (auto&& listItem : node->caseBranches) { BeginArrayItem(); Print(listItem.Obj()); EndArrayItem(); } EndArray(); EndField(); BeginField(vl::WString::Unmanaged(L"defaultBranch")); Print(node->defaultBranch.Obj()); EndField(); BeginField(vl::WString::Unmanaged(L"expression")); Print(node->expression.Obj()); EndField(); } void AstVisitor::PrintFields(WfThisExpression* node) { } void AstVisitor::PrintFields(WfTopQualifiedExpression* node) { BeginField(vl::WString::Unmanaged(L"name")); WriteToken(node->name); EndField(); } void AstVisitor::PrintFields(WfTopQualifiedType* node) { BeginField(vl::WString::Unmanaged(L"name")); WriteToken(node->name); EndField(); } void AstVisitor::PrintFields(WfTryStatement* node) { BeginField(vl::WString::Unmanaged(L"catchStatement")); Print(node->catchStatement.Obj()); EndField(); BeginField(vl::WString::Unmanaged(L"finallyStatement")); Print(node->finallyStatement.Obj()); EndField(); BeginField(vl::WString::Unmanaged(L"name")); WriteToken(node->name); EndField(); BeginField(vl::WString::Unmanaged(L"protectedStatement")); Print(node->protectedStatement.Obj()); EndField(); } void AstVisitor::PrintFields(WfType* node) { } void AstVisitor::PrintFields(WfTypeCastingExpression* node) { BeginField(vl::WString::Unmanaged(L"expression")); Print(node->expression.Obj()); EndField(); BeginField(vl::WString::Unmanaged(L"strategy")); switch (node->strategy) { case vl::workflow::WfTypeCastingStrategy::Strong: WriteString(vl::WString::Unmanaged(L"Strong")); break; case vl::workflow::WfTypeCastingStrategy::Weak: WriteString(vl::WString::Unmanaged(L"Weak")); break; default: WriteNull(); } EndField(); BeginField(vl::WString::Unmanaged(L"type")); Print(node->type.Obj()); EndField(); } void AstVisitor::PrintFields(WfTypeOfExpressionExpression* node) { BeginField(vl::WString::Unmanaged(L"expression")); Print(node->expression.Obj()); EndField(); } void AstVisitor::PrintFields(WfTypeOfTypeExpression* node) { BeginField(vl::WString::Unmanaged(L"type")); Print(node->type.Obj()); EndField(); } void AstVisitor::PrintFields(WfTypeTestingExpression* node) { BeginField(vl::WString::Unmanaged(L"expression")); Print(node->expression.Obj()); EndField(); BeginField(vl::WString::Unmanaged(L"test")); switch (node->test) { case vl::workflow::WfTypeTesting::IsNotNull: WriteString(vl::WString::Unmanaged(L"IsNotNull")); break; case vl::workflow::WfTypeTesting::IsNotType: WriteString(vl::WString::Unmanaged(L"IsNotType")); break; case vl::workflow::WfTypeTesting::IsNull: WriteString(vl::WString::Unmanaged(L"IsNull")); break; case vl::workflow::WfTypeTesting::IsType: WriteString(vl::WString::Unmanaged(L"IsType")); break; default: WriteNull(); } EndField(); BeginField(vl::WString::Unmanaged(L"type")); Print(node->type.Obj()); EndField(); } void AstVisitor::PrintFields(WfUnaryExpression* node) { BeginField(vl::WString::Unmanaged(L"op")); switch (node->op) { case vl::workflow::WfUnaryOperator::Negative: WriteString(vl::WString::Unmanaged(L"Negative")); break; case vl::workflow::WfUnaryOperator::Not: WriteString(vl::WString::Unmanaged(L"Not")); break; case vl::workflow::WfUnaryOperator::Positive: WriteString(vl::WString::Unmanaged(L"Positive")); break; default: WriteNull(); } EndField(); BeginField(vl::WString::Unmanaged(L"operand")); Print(node->operand.Obj()); EndField(); } void AstVisitor::PrintFields(WfVariableDeclaration* node) { BeginField(vl::WString::Unmanaged(L"expression")); Print(node->expression.Obj()); EndField(); BeginField(vl::WString::Unmanaged(L"type")); Print(node->type.Obj()); EndField(); } void AstVisitor::PrintFields(WfVariableStatement* node) { BeginField(vl::WString::Unmanaged(L"variable")); Print(node->variable.Obj()); EndField(); } void AstVisitor::PrintFields(WfVirtualCfeDeclaration* node) { BeginField(vl::WString::Unmanaged(L"expandedDeclarations")); BeginArray(); for (auto&& listItem : node->expandedDeclarations) { BeginArrayItem(); Print(listItem.Obj()); EndArrayItem(); } EndArray(); EndField(); } void AstVisitor::PrintFields(WfVirtualCfeExpression* node) { BeginField(vl::WString::Unmanaged(L"expandedExpression")); Print(node->expandedExpression.Obj()); EndField(); } void AstVisitor::PrintFields(WfVirtualCseDeclaration* node) { BeginField(vl::WString::Unmanaged(L"expandedDeclarations")); BeginArray(); for (auto&& listItem : node->expandedDeclarations) { BeginArrayItem(); Print(listItem.Obj()); EndArrayItem(); } EndArray(); EndField(); } void AstVisitor::PrintFields(WfVirtualCseExpression* node) { BeginField(vl::WString::Unmanaged(L"expandedExpression")); Print(node->expandedExpression.Obj()); EndField(); } void AstVisitor::PrintFields(WfVirtualCseStatement* node) { BeginField(vl::WString::Unmanaged(L"expandedStatement")); Print(node->expandedStatement.Obj()); EndField(); } void AstVisitor::PrintFields(WfWhileStatement* node) { BeginField(vl::WString::Unmanaged(L"condition")); Print(node->condition.Obj()); EndField(); BeginField(vl::WString::Unmanaged(L"statement")); Print(node->statement.Obj()); EndField(); } void AstVisitor::Visit(WfPredefinedType* node) { if (!node) { WriteNull(); return; } BeginObject(); WriteType(vl::WString::Unmanaged(L"PredefinedType"), node); PrintFields(static_cast(node)); PrintFields(static_cast(node)); EndObject(); } void AstVisitor::Visit(WfTopQualifiedType* node) { if (!node) { WriteNull(); return; } BeginObject(); WriteType(vl::WString::Unmanaged(L"TopQualifiedType"), node); PrintFields(static_cast(node)); PrintFields(static_cast(node)); EndObject(); } void AstVisitor::Visit(WfReferenceType* node) { if (!node) { WriteNull(); return; } BeginObject(); WriteType(vl::WString::Unmanaged(L"ReferenceType"), node); PrintFields(static_cast(node)); PrintFields(static_cast(node)); EndObject(); } void AstVisitor::Visit(WfRawPointerType* node) { if (!node) { WriteNull(); return; } BeginObject(); WriteType(vl::WString::Unmanaged(L"RawPointerType"), node); PrintFields(static_cast(node)); PrintFields(static_cast(node)); EndObject(); } void AstVisitor::Visit(WfSharedPointerType* node) { if (!node) { WriteNull(); return; } BeginObject(); WriteType(vl::WString::Unmanaged(L"SharedPointerType"), node); PrintFields(static_cast(node)); PrintFields(static_cast(node)); EndObject(); } void AstVisitor::Visit(WfNullableType* node) { if (!node) { WriteNull(); return; } BeginObject(); WriteType(vl::WString::Unmanaged(L"NullableType"), node); PrintFields(static_cast(node)); PrintFields(static_cast(node)); EndObject(); } void AstVisitor::Visit(WfEnumerableType* node) { if (!node) { WriteNull(); return; } BeginObject(); WriteType(vl::WString::Unmanaged(L"EnumerableType"), node); PrintFields(static_cast(node)); PrintFields(static_cast(node)); EndObject(); } void AstVisitor::Visit(WfMapType* node) { if (!node) { WriteNull(); return; } BeginObject(); WriteType(vl::WString::Unmanaged(L"MapType"), node); PrintFields(static_cast(node)); PrintFields(static_cast(node)); EndObject(); } void AstVisitor::Visit(WfObservableListType* node) { if (!node) { WriteNull(); return; } BeginObject(); WriteType(vl::WString::Unmanaged(L"ObservableListType"), node); PrintFields(static_cast(node)); PrintFields(static_cast(node)); EndObject(); } void AstVisitor::Visit(WfFunctionType* node) { if (!node) { WriteNull(); return; } BeginObject(); WriteType(vl::WString::Unmanaged(L"FunctionType"), node); PrintFields(static_cast(node)); PrintFields(static_cast(node)); EndObject(); } void AstVisitor::Visit(WfChildType* node) { if (!node) { WriteNull(); return; } BeginObject(); WriteType(vl::WString::Unmanaged(L"ChildType"), node); PrintFields(static_cast(node)); PrintFields(static_cast(node)); EndObject(); } void AstVisitor::Visit(WfThisExpression* node) { if (!node) { WriteNull(); return; } BeginObject(); WriteType(vl::WString::Unmanaged(L"ThisExpression"), node); PrintFields(static_cast(node)); PrintFields(static_cast(node)); EndObject(); } void AstVisitor::Visit(WfTopQualifiedExpression* node) { if (!node) { WriteNull(); return; } BeginObject(); WriteType(vl::WString::Unmanaged(L"TopQualifiedExpression"), node); PrintFields(static_cast(node)); PrintFields(static_cast(node)); EndObject(); } void AstVisitor::Visit(WfReferenceExpression* node) { if (!node) { WriteNull(); return; } BeginObject(); WriteType(vl::WString::Unmanaged(L"ReferenceExpression"), node); PrintFields(static_cast(node)); PrintFields(static_cast(node)); EndObject(); } void AstVisitor::Visit(WfOrderedNameExpression* node) { if (!node) { WriteNull(); return; } BeginObject(); WriteType(vl::WString::Unmanaged(L"OrderedNameExpression"), node); PrintFields(static_cast(node)); PrintFields(static_cast(node)); EndObject(); } void AstVisitor::Visit(WfOrderedLambdaExpression* node) { if (!node) { WriteNull(); return; } BeginObject(); WriteType(vl::WString::Unmanaged(L"OrderedLambdaExpression"), node); PrintFields(static_cast(node)); PrintFields(static_cast(node)); EndObject(); } void AstVisitor::Visit(WfMemberExpression* node) { if (!node) { WriteNull(); return; } BeginObject(); WriteType(vl::WString::Unmanaged(L"MemberExpression"), node); PrintFields(static_cast(node)); PrintFields(static_cast(node)); EndObject(); } void AstVisitor::Visit(WfChildExpression* node) { if (!node) { WriteNull(); return; } BeginObject(); WriteType(vl::WString::Unmanaged(L"ChildExpression"), node); PrintFields(static_cast(node)); PrintFields(static_cast(node)); EndObject(); } void AstVisitor::Visit(WfLiteralExpression* node) { if (!node) { WriteNull(); return; } BeginObject(); WriteType(vl::WString::Unmanaged(L"LiteralExpression"), node); PrintFields(static_cast(node)); PrintFields(static_cast(node)); EndObject(); } void AstVisitor::Visit(WfFloatingExpression* node) { if (!node) { WriteNull(); return; } BeginObject(); WriteType(vl::WString::Unmanaged(L"FloatingExpression"), node); PrintFields(static_cast(node)); PrintFields(static_cast(node)); EndObject(); } void AstVisitor::Visit(WfIntegerExpression* node) { if (!node) { WriteNull(); return; } BeginObject(); WriteType(vl::WString::Unmanaged(L"IntegerExpression"), node); PrintFields(static_cast(node)); PrintFields(static_cast(node)); EndObject(); } void AstVisitor::Visit(WfStringExpression* node) { if (!node) { WriteNull(); return; } BeginObject(); WriteType(vl::WString::Unmanaged(L"StringExpression"), node); PrintFields(static_cast(node)); PrintFields(static_cast(node)); EndObject(); } void AstVisitor::Visit(WfUnaryExpression* node) { if (!node) { WriteNull(); return; } BeginObject(); WriteType(vl::WString::Unmanaged(L"UnaryExpression"), node); PrintFields(static_cast(node)); PrintFields(static_cast(node)); EndObject(); } void AstVisitor::Visit(WfBinaryExpression* node) { if (!node) { WriteNull(); return; } BeginObject(); WriteType(vl::WString::Unmanaged(L"BinaryExpression"), node); PrintFields(static_cast(node)); PrintFields(static_cast(node)); EndObject(); } void AstVisitor::Visit(WfLetExpression* node) { if (!node) { WriteNull(); return; } BeginObject(); WriteType(vl::WString::Unmanaged(L"LetExpression"), node); PrintFields(static_cast(node)); PrintFields(static_cast(node)); EndObject(); } void AstVisitor::Visit(WfIfExpression* node) { if (!node) { WriteNull(); return; } BeginObject(); WriteType(vl::WString::Unmanaged(L"IfExpression"), node); PrintFields(static_cast(node)); PrintFields(static_cast(node)); EndObject(); } void AstVisitor::Visit(WfRangeExpression* node) { if (!node) { WriteNull(); return; } BeginObject(); WriteType(vl::WString::Unmanaged(L"RangeExpression"), node); PrintFields(static_cast(node)); PrintFields(static_cast(node)); EndObject(); } void AstVisitor::Visit(WfSetTestingExpression* node) { if (!node) { WriteNull(); return; } BeginObject(); WriteType(vl::WString::Unmanaged(L"SetTestingExpression"), node); PrintFields(static_cast(node)); PrintFields(static_cast(node)); EndObject(); } void AstVisitor::Visit(WfConstructorExpression* node) { if (!node) { WriteNull(); return; } BeginObject(); WriteType(vl::WString::Unmanaged(L"ConstructorExpression"), node); PrintFields(static_cast(node)); PrintFields(static_cast(node)); EndObject(); } void AstVisitor::Visit(WfInferExpression* node) { if (!node) { WriteNull(); return; } BeginObject(); WriteType(vl::WString::Unmanaged(L"InferExpression"), node); PrintFields(static_cast(node)); PrintFields(static_cast(node)); EndObject(); } void AstVisitor::Visit(WfTypeCastingExpression* node) { if (!node) { WriteNull(); return; } BeginObject(); WriteType(vl::WString::Unmanaged(L"TypeCastingExpression"), node); PrintFields(static_cast(node)); PrintFields(static_cast(node)); EndObject(); } void AstVisitor::Visit(WfTypeTestingExpression* node) { if (!node) { WriteNull(); return; } BeginObject(); WriteType(vl::WString::Unmanaged(L"TypeTestingExpression"), node); PrintFields(static_cast(node)); PrintFields(static_cast(node)); EndObject(); } void AstVisitor::Visit(WfTypeOfTypeExpression* node) { if (!node) { WriteNull(); return; } BeginObject(); WriteType(vl::WString::Unmanaged(L"TypeOfTypeExpression"), node); PrintFields(static_cast(node)); PrintFields(static_cast(node)); EndObject(); } void AstVisitor::Visit(WfTypeOfExpressionExpression* node) { if (!node) { WriteNull(); return; } BeginObject(); WriteType(vl::WString::Unmanaged(L"TypeOfExpressionExpression"), node); PrintFields(static_cast(node)); PrintFields(static_cast(node)); EndObject(); } void AstVisitor::Visit(WfAttachEventExpression* node) { if (!node) { WriteNull(); return; } BeginObject(); WriteType(vl::WString::Unmanaged(L"AttachEventExpression"), node); PrintFields(static_cast(node)); PrintFields(static_cast(node)); EndObject(); } void AstVisitor::Visit(WfDetachEventExpression* node) { if (!node) { WriteNull(); return; } BeginObject(); WriteType(vl::WString::Unmanaged(L"DetachEventExpression"), node); PrintFields(static_cast(node)); PrintFields(static_cast(node)); EndObject(); } void AstVisitor::Visit(WfObserveExpression* node) { if (!node) { WriteNull(); return; } BeginObject(); WriteType(vl::WString::Unmanaged(L"ObserveExpression"), node); PrintFields(static_cast(node)); PrintFields(static_cast(node)); EndObject(); } void AstVisitor::Visit(WfCallExpression* node) { if (!node) { WriteNull(); return; } BeginObject(); WriteType(vl::WString::Unmanaged(L"CallExpression"), node); PrintFields(static_cast(node)); PrintFields(static_cast(node)); EndObject(); } void AstVisitor::Visit(WfFunctionExpression* node) { if (!node) { WriteNull(); return; } BeginObject(); WriteType(vl::WString::Unmanaged(L"FunctionExpression"), node); PrintFields(static_cast(node)); PrintFields(static_cast(node)); EndObject(); } void AstVisitor::Visit(WfNewClassExpression* node) { if (!node) { WriteNull(); return; } BeginObject(); WriteType(vl::WString::Unmanaged(L"NewClassExpression"), node); PrintFields(static_cast(node)); PrintFields(static_cast(node)); EndObject(); } void AstVisitor::Visit(WfNewInterfaceExpression* node) { if (!node) { WriteNull(); return; } BeginObject(); WriteType(vl::WString::Unmanaged(L"NewInterfaceExpression"), node); PrintFields(static_cast(node)); PrintFields(static_cast(node)); EndObject(); } void AstVisitor::Visit(WfVirtualCfeExpression* node) { node->Accept(static_cast(this)); } void AstVisitor::Visit(WfVirtualCseExpression* node) { node->Accept(static_cast(this)); } void AstVisitor::Visit(WfBreakStatement* node) { if (!node) { WriteNull(); return; } BeginObject(); WriteType(vl::WString::Unmanaged(L"BreakStatement"), node); PrintFields(static_cast(node)); PrintFields(static_cast(node)); EndObject(); } void AstVisitor::Visit(WfContinueStatement* node) { if (!node) { WriteNull(); return; } BeginObject(); WriteType(vl::WString::Unmanaged(L"ContinueStatement"), node); PrintFields(static_cast(node)); PrintFields(static_cast(node)); EndObject(); } void AstVisitor::Visit(WfReturnStatement* node) { if (!node) { WriteNull(); return; } BeginObject(); WriteType(vl::WString::Unmanaged(L"ReturnStatement"), node); PrintFields(static_cast(node)); PrintFields(static_cast(node)); EndObject(); } void AstVisitor::Visit(WfDeleteStatement* node) { if (!node) { WriteNull(); return; } BeginObject(); WriteType(vl::WString::Unmanaged(L"DeleteStatement"), node); PrintFields(static_cast(node)); PrintFields(static_cast(node)); EndObject(); } void AstVisitor::Visit(WfRaiseExceptionStatement* node) { if (!node) { WriteNull(); return; } BeginObject(); WriteType(vl::WString::Unmanaged(L"RaiseExceptionStatement"), node); PrintFields(static_cast(node)); PrintFields(static_cast(node)); EndObject(); } void AstVisitor::Visit(WfIfStatement* node) { if (!node) { WriteNull(); return; } BeginObject(); WriteType(vl::WString::Unmanaged(L"IfStatement"), node); PrintFields(static_cast(node)); PrintFields(static_cast(node)); EndObject(); } void AstVisitor::Visit(WfWhileStatement* node) { if (!node) { WriteNull(); return; } BeginObject(); WriteType(vl::WString::Unmanaged(L"WhileStatement"), node); PrintFields(static_cast(node)); PrintFields(static_cast(node)); EndObject(); } void AstVisitor::Visit(WfTryStatement* node) { if (!node) { WriteNull(); return; } BeginObject(); WriteType(vl::WString::Unmanaged(L"TryStatement"), node); PrintFields(static_cast(node)); PrintFields(static_cast(node)); EndObject(); } void AstVisitor::Visit(WfBlockStatement* node) { if (!node) { WriteNull(); return; } BeginObject(); WriteType(vl::WString::Unmanaged(L"BlockStatement"), node); PrintFields(static_cast(node)); PrintFields(static_cast(node)); EndObject(); } void AstVisitor::Visit(WfGotoStatement* node) { if (!node) { WriteNull(); return; } BeginObject(); WriteType(vl::WString::Unmanaged(L"GotoStatement"), node); PrintFields(static_cast(node)); PrintFields(static_cast(node)); EndObject(); } void AstVisitor::Visit(WfVariableStatement* node) { if (!node) { WriteNull(); return; } BeginObject(); WriteType(vl::WString::Unmanaged(L"VariableStatement"), node); PrintFields(static_cast(node)); PrintFields(static_cast(node)); EndObject(); } void AstVisitor::Visit(WfExpressionStatement* node) { if (!node) { WriteNull(); return; } BeginObject(); WriteType(vl::WString::Unmanaged(L"ExpressionStatement"), node); PrintFields(static_cast(node)); PrintFields(static_cast(node)); EndObject(); } void AstVisitor::Visit(WfVirtualCseStatement* node) { node->Accept(static_cast(this)); } void AstVisitor::Visit(WfCoroutineStatement* node) { node->Accept(static_cast(this)); } void AstVisitor::Visit(WfStateMachineStatement* node) { node->Accept(static_cast(this)); } void AstVisitor::Visit(WfNamespaceDeclaration* node) { if (!node) { WriteNull(); return; } BeginObject(); WriteType(vl::WString::Unmanaged(L"NamespaceDeclaration"), node); PrintFields(static_cast(node)); PrintFields(static_cast(node)); EndObject(); } void AstVisitor::Visit(WfFunctionDeclaration* node) { if (!node) { WriteNull(); return; } BeginObject(); WriteType(vl::WString::Unmanaged(L"FunctionDeclaration"), node); PrintFields(static_cast(node)); PrintFields(static_cast(node)); EndObject(); } void AstVisitor::Visit(WfVariableDeclaration* node) { if (!node) { WriteNull(); return; } BeginObject(); WriteType(vl::WString::Unmanaged(L"VariableDeclaration"), node); PrintFields(static_cast(node)); PrintFields(static_cast(node)); EndObject(); } void AstVisitor::Visit(WfEventDeclaration* node) { if (!node) { WriteNull(); return; } BeginObject(); WriteType(vl::WString::Unmanaged(L"EventDeclaration"), node); PrintFields(static_cast(node)); PrintFields(static_cast(node)); EndObject(); } void AstVisitor::Visit(WfPropertyDeclaration* node) { if (!node) { WriteNull(); return; } BeginObject(); WriteType(vl::WString::Unmanaged(L"PropertyDeclaration"), node); PrintFields(static_cast(node)); PrintFields(static_cast(node)); EndObject(); } void AstVisitor::Visit(WfStaticInitDeclaration* node) { if (!node) { WriteNull(); return; } BeginObject(); WriteType(vl::WString::Unmanaged(L"StaticInitDeclaration"), node); PrintFields(static_cast(node)); PrintFields(static_cast(node)); EndObject(); } void AstVisitor::Visit(WfConstructorDeclaration* node) { if (!node) { WriteNull(); return; } BeginObject(); WriteType(vl::WString::Unmanaged(L"ConstructorDeclaration"), node); PrintFields(static_cast(node)); PrintFields(static_cast(node)); EndObject(); } void AstVisitor::Visit(WfDestructorDeclaration* node) { if (!node) { WriteNull(); return; } BeginObject(); WriteType(vl::WString::Unmanaged(L"DestructorDeclaration"), node); PrintFields(static_cast(node)); PrintFields(static_cast(node)); EndObject(); } void AstVisitor::Visit(WfClassDeclaration* node) { if (!node) { WriteNull(); return; } BeginObject(); WriteType(vl::WString::Unmanaged(L"ClassDeclaration"), node); PrintFields(static_cast(node)); PrintFields(static_cast(node)); EndObject(); } void AstVisitor::Visit(WfEnumDeclaration* node) { if (!node) { WriteNull(); return; } BeginObject(); WriteType(vl::WString::Unmanaged(L"EnumDeclaration"), node); PrintFields(static_cast(node)); PrintFields(static_cast(node)); EndObject(); } void AstVisitor::Visit(WfStructDeclaration* node) { if (!node) { WriteNull(); return; } BeginObject(); WriteType(vl::WString::Unmanaged(L"StructDeclaration"), node); PrintFields(static_cast(node)); PrintFields(static_cast(node)); EndObject(); } void AstVisitor::Visit(WfVirtualCfeDeclaration* node) { node->Accept(static_cast(this)); } void AstVisitor::Visit(WfVirtualCseDeclaration* node) { node->Accept(static_cast(this)); } void AstVisitor::Visit(WfAutoPropertyDeclaration* node) { if (!node) { WriteNull(); return; } BeginObject(); WriteType(vl::WString::Unmanaged(L"AutoPropertyDeclaration"), node); PrintFields(static_cast(node)); PrintFields(static_cast(node)); PrintFields(static_cast(node)); EndObject(); } void AstVisitor::Visit(WfCastResultInterfaceDeclaration* node) { if (!node) { WriteNull(); return; } BeginObject(); WriteType(vl::WString::Unmanaged(L"CastResultInterfaceDeclaration"), node); PrintFields(static_cast(node)); PrintFields(static_cast(node)); PrintFields(static_cast(node)); EndObject(); } void AstVisitor::Visit(WfStateMachineDeclaration* node) { if (!node) { WriteNull(); return; } BeginObject(); WriteType(vl::WString::Unmanaged(L"StateMachineDeclaration"), node); PrintFields(static_cast(node)); PrintFields(static_cast(node)); PrintFields(static_cast(node)); EndObject(); } void AstVisitor::Visit(WfForEachStatement* node) { if (!node) { WriteNull(); return; } BeginObject(); WriteType(vl::WString::Unmanaged(L"ForEachStatement"), node); PrintFields(static_cast(node)); PrintFields(static_cast(node)); PrintFields(static_cast(node)); EndObject(); } void AstVisitor::Visit(WfSwitchStatement* node) { if (!node) { WriteNull(); return; } BeginObject(); WriteType(vl::WString::Unmanaged(L"SwitchStatement"), node); PrintFields(static_cast(node)); PrintFields(static_cast(node)); PrintFields(static_cast(node)); EndObject(); } void AstVisitor::Visit(WfCoProviderStatement* node) { if (!node) { WriteNull(); return; } BeginObject(); WriteType(vl::WString::Unmanaged(L"CoProviderStatement"), node); PrintFields(static_cast(node)); PrintFields(static_cast(node)); PrintFields(static_cast(node)); EndObject(); } void AstVisitor::Visit(WfCoPauseStatement* node) { if (!node) { WriteNull(); return; } BeginObject(); WriteType(vl::WString::Unmanaged(L"CoPauseStatement"), node); PrintFields(static_cast(node)); PrintFields(static_cast(node)); PrintFields(static_cast(node)); EndObject(); } void AstVisitor::Visit(WfCoOperatorStatement* node) { if (!node) { WriteNull(); return; } BeginObject(); WriteType(vl::WString::Unmanaged(L"CoOperatorStatement"), node); PrintFields(static_cast(node)); PrintFields(static_cast(node)); PrintFields(static_cast(node)); EndObject(); } void AstVisitor::Visit(WfStateSwitchStatement* node) { if (!node) { WriteNull(); return; } BeginObject(); WriteType(vl::WString::Unmanaged(L"StateSwitchStatement"), node); PrintFields(static_cast(node)); PrintFields(static_cast(node)); PrintFields(static_cast(node)); EndObject(); } void AstVisitor::Visit(WfStateInvokeStatement* node) { if (!node) { WriteNull(); return; } BeginObject(); WriteType(vl::WString::Unmanaged(L"StateInvokeStatement"), node); PrintFields(static_cast(node)); PrintFields(static_cast(node)); PrintFields(static_cast(node)); EndObject(); } void AstVisitor::Visit(WfFormatExpression* node) { if (!node) { WriteNull(); return; } BeginObject(); WriteType(vl::WString::Unmanaged(L"FormatExpression"), node); PrintFields(static_cast(node)); PrintFields(static_cast(node)); PrintFields(static_cast(node)); EndObject(); } void AstVisitor::Visit(WfBindExpression* node) { if (!node) { WriteNull(); return; } BeginObject(); WriteType(vl::WString::Unmanaged(L"BindExpression"), node); PrintFields(static_cast(node)); PrintFields(static_cast(node)); PrintFields(static_cast(node)); EndObject(); } void AstVisitor::Visit(WfNewCoroutineExpression* node) { if (!node) { WriteNull(); return; } BeginObject(); WriteType(vl::WString::Unmanaged(L"NewCoroutineExpression"), node); PrintFields(static_cast(node)); PrintFields(static_cast(node)); PrintFields(static_cast(node)); EndObject(); } void AstVisitor::Visit(WfMixinCastExpression* node) { if (!node) { WriteNull(); return; } BeginObject(); WriteType(vl::WString::Unmanaged(L"MixinCastExpression"), node); PrintFields(static_cast(node)); PrintFields(static_cast(node)); PrintFields(static_cast(node)); EndObject(); } void AstVisitor::Visit(WfExpectedTypeCastExpression* node) { if (!node) { WriteNull(); return; } BeginObject(); WriteType(vl::WString::Unmanaged(L"ExpectedTypeCastExpression"), node); PrintFields(static_cast(node)); PrintFields(static_cast(node)); PrintFields(static_cast(node)); EndObject(); } void AstVisitor::Visit(WfCoOperatorExpression* node) { if (!node) { WriteNull(); return; } BeginObject(); WriteType(vl::WString::Unmanaged(L"CoOperatorExpression"), node); PrintFields(static_cast(node)); PrintFields(static_cast(node)); PrintFields(static_cast(node)); EndObject(); } void AstVisitor::Visit(WfModuleUsingNameFragment* node) { if (!node) { WriteNull(); return; } BeginObject(); WriteType(vl::WString::Unmanaged(L"ModuleUsingNameFragment"), node); PrintFields(static_cast(node)); PrintFields(static_cast(node)); EndObject(); } void AstVisitor::Visit(WfModuleUsingWildCardFragment* node) { if (!node) { WriteNull(); return; } BeginObject(); WriteType(vl::WString::Unmanaged(L"ModuleUsingWildCardFragment"), node); PrintFields(static_cast(node)); PrintFields(static_cast(node)); EndObject(); } AstVisitor::AstVisitor(vl::stream::StreamWriter& _writer) : vl::glr::JsonVisitorBase(_writer) { } void AstVisitor::Print(WfType* node) { if (!node) { WriteNull(); return; } node->Accept(static_cast(this)); } void AstVisitor::Print(WfExpression* node) { if (!node) { WriteNull(); return; } node->Accept(static_cast(this)); } void AstVisitor::Print(WfStatement* node) { if (!node) { WriteNull(); return; } node->Accept(static_cast(this)); } void AstVisitor::Print(WfDeclaration* node) { if (!node) { WriteNull(); return; } node->Accept(static_cast(this)); } void AstVisitor::Print(WfModuleUsingFragment* node) { if (!node) { WriteNull(); return; } node->Accept(static_cast(this)); } void AstVisitor::Print(WfAttribute* node) { if (!node) { WriteNull(); return; } BeginObject(); WriteType(vl::WString::Unmanaged(L"Attribute"), node); PrintFields(static_cast(node)); EndObject(); } void AstVisitor::Print(WfFunctionArgument* node) { if (!node) { WriteNull(); return; } BeginObject(); WriteType(vl::WString::Unmanaged(L"FunctionArgument"), node); PrintFields(static_cast(node)); EndObject(); } void AstVisitor::Print(WfBaseConstructorCall* node) { if (!node) { WriteNull(); return; } BeginObject(); WriteType(vl::WString::Unmanaged(L"BaseConstructorCall"), node); PrintFields(static_cast(node)); EndObject(); } void AstVisitor::Print(WfEnumItemIntersection* node) { if (!node) { WriteNull(); return; } BeginObject(); WriteType(vl::WString::Unmanaged(L"EnumItemIntersection"), node); PrintFields(static_cast(node)); EndObject(); } void AstVisitor::Print(WfEnumItem* node) { if (!node) { WriteNull(); return; } BeginObject(); WriteType(vl::WString::Unmanaged(L"EnumItem"), node); PrintFields(static_cast(node)); EndObject(); } void AstVisitor::Print(WfStructMember* node) { if (!node) { WriteNull(); return; } BeginObject(); WriteType(vl::WString::Unmanaged(L"StructMember"), node); PrintFields(static_cast(node)); EndObject(); } void AstVisitor::Print(WfStateInput* node) { if (!node) { WriteNull(); return; } BeginObject(); WriteType(vl::WString::Unmanaged(L"StateInput"), node); PrintFields(static_cast(node)); EndObject(); } void AstVisitor::Print(WfStateDeclaration* node) { if (!node) { WriteNull(); return; } BeginObject(); WriteType(vl::WString::Unmanaged(L"StateDeclaration"), node); PrintFields(static_cast(node)); EndObject(); } void AstVisitor::Print(WfSwitchCase* node) { if (!node) { WriteNull(); return; } BeginObject(); WriteType(vl::WString::Unmanaged(L"SwitchCase"), node); PrintFields(static_cast(node)); EndObject(); } void AstVisitor::Print(WfStateSwitchArgument* node) { if (!node) { WriteNull(); return; } BeginObject(); WriteType(vl::WString::Unmanaged(L"StateSwitchArgument"), node); PrintFields(static_cast(node)); EndObject(); } void AstVisitor::Print(WfStateSwitchCase* node) { if (!node) { WriteNull(); return; } BeginObject(); WriteType(vl::WString::Unmanaged(L"StateSwitchCase"), node); PrintFields(static_cast(node)); EndObject(); } void AstVisitor::Print(WfLetVariable* node) { if (!node) { WriteNull(); return; } BeginObject(); WriteType(vl::WString::Unmanaged(L"LetVariable"), node); PrintFields(static_cast(node)); EndObject(); } void AstVisitor::Print(WfConstructorArgument* node) { if (!node) { WriteNull(); return; } BeginObject(); WriteType(vl::WString::Unmanaged(L"ConstructorArgument"), node); PrintFields(static_cast(node)); EndObject(); } void AstVisitor::Print(WfModuleUsingItem* node) { if (!node) { WriteNull(); return; } BeginObject(); WriteType(vl::WString::Unmanaged(L"ModuleUsingItem"), node); PrintFields(static_cast(node)); EndObject(); } void AstVisitor::Print(WfModuleUsingPath* node) { if (!node) { WriteNull(); return; } BeginObject(); WriteType(vl::WString::Unmanaged(L"ModuleUsingPath"), node); PrintFields(static_cast(node)); EndObject(); } void AstVisitor::Print(WfModule* node) { if (!node) { WriteNull(); return; } BeginObject(); WriteType(vl::WString::Unmanaged(L"Module"), node); PrintFields(static_cast(node)); EndObject(); } } /*********************************************************************** .\PARSER\GENERATED\WORKFLOWAST_TRAVERSE.CPP ***********************************************************************/ /*********************************************************************** This file is generated by: Vczh Parser Generator From parser definition:Ast Licensed under https://github.com/vczh-libraries/License ***********************************************************************/ namespace vl::workflow::traverse_visitor { void AstVisitor::Traverse(vl::glr::ParsingToken& token) {} void AstVisitor::Traverse(vl::glr::ParsingAstBase* node) {} void AstVisitor::Traverse(WfAttachEventExpression* node) {} void AstVisitor::Traverse(WfAttribute* node) {} void AstVisitor::Traverse(WfAutoPropertyDeclaration* node) {} void AstVisitor::Traverse(WfBaseConstructorCall* node) {} void AstVisitor::Traverse(WfBinaryExpression* node) {} void AstVisitor::Traverse(WfBindExpression* node) {} void AstVisitor::Traverse(WfBlockStatement* node) {} void AstVisitor::Traverse(WfBreakStatement* node) {} void AstVisitor::Traverse(WfCallExpression* node) {} void AstVisitor::Traverse(WfCastResultInterfaceDeclaration* node) {} void AstVisitor::Traverse(WfChildExpression* node) {} void AstVisitor::Traverse(WfChildType* node) {} void AstVisitor::Traverse(WfClassDeclaration* node) {} void AstVisitor::Traverse(WfCoOperatorExpression* node) {} void AstVisitor::Traverse(WfCoOperatorStatement* node) {} void AstVisitor::Traverse(WfCoPauseStatement* node) {} void AstVisitor::Traverse(WfCoProviderStatement* node) {} void AstVisitor::Traverse(WfConstructorArgument* node) {} void AstVisitor::Traverse(WfConstructorDeclaration* node) {} void AstVisitor::Traverse(WfConstructorExpression* node) {} void AstVisitor::Traverse(WfContinueStatement* node) {} void AstVisitor::Traverse(WfCoroutineStatement* node) {} void AstVisitor::Traverse(WfDeclaration* node) {} void AstVisitor::Traverse(WfDeleteStatement* node) {} void AstVisitor::Traverse(WfDestructorDeclaration* node) {} void AstVisitor::Traverse(WfDetachEventExpression* node) {} void AstVisitor::Traverse(WfEnumDeclaration* node) {} void AstVisitor::Traverse(WfEnumItem* node) {} void AstVisitor::Traverse(WfEnumItemIntersection* node) {} void AstVisitor::Traverse(WfEnumerableType* node) {} void AstVisitor::Traverse(WfEventDeclaration* node) {} void AstVisitor::Traverse(WfExpectedTypeCastExpression* node) {} void AstVisitor::Traverse(WfExpression* node) {} void AstVisitor::Traverse(WfExpressionStatement* node) {} void AstVisitor::Traverse(WfFloatingExpression* node) {} void AstVisitor::Traverse(WfForEachStatement* node) {} void AstVisitor::Traverse(WfFormatExpression* node) {} void AstVisitor::Traverse(WfFunctionArgument* node) {} void AstVisitor::Traverse(WfFunctionDeclaration* node) {} void AstVisitor::Traverse(WfFunctionExpression* node) {} void AstVisitor::Traverse(WfFunctionType* node) {} void AstVisitor::Traverse(WfGotoStatement* node) {} void AstVisitor::Traverse(WfIfExpression* node) {} void AstVisitor::Traverse(WfIfStatement* node) {} void AstVisitor::Traverse(WfInferExpression* node) {} void AstVisitor::Traverse(WfIntegerExpression* node) {} void AstVisitor::Traverse(WfLetExpression* node) {} void AstVisitor::Traverse(WfLetVariable* node) {} void AstVisitor::Traverse(WfLiteralExpression* node) {} void AstVisitor::Traverse(WfMapType* node) {} void AstVisitor::Traverse(WfMemberExpression* node) {} void AstVisitor::Traverse(WfMixinCastExpression* node) {} void AstVisitor::Traverse(WfModule* node) {} void AstVisitor::Traverse(WfModuleUsingFragment* node) {} void AstVisitor::Traverse(WfModuleUsingItem* node) {} void AstVisitor::Traverse(WfModuleUsingNameFragment* node) {} void AstVisitor::Traverse(WfModuleUsingPath* node) {} void AstVisitor::Traverse(WfModuleUsingWildCardFragment* node) {} void AstVisitor::Traverse(WfNamespaceDeclaration* node) {} void AstVisitor::Traverse(WfNewClassExpression* node) {} void AstVisitor::Traverse(WfNewCoroutineExpression* node) {} void AstVisitor::Traverse(WfNewInterfaceExpression* node) {} void AstVisitor::Traverse(WfNullableType* node) {} void AstVisitor::Traverse(WfObservableListType* node) {} void AstVisitor::Traverse(WfObserveExpression* node) {} void AstVisitor::Traverse(WfOrderedLambdaExpression* node) {} void AstVisitor::Traverse(WfOrderedNameExpression* node) {} void AstVisitor::Traverse(WfPredefinedType* node) {} void AstVisitor::Traverse(WfPropertyDeclaration* node) {} void AstVisitor::Traverse(WfRaiseExceptionStatement* node) {} void AstVisitor::Traverse(WfRangeExpression* node) {} void AstVisitor::Traverse(WfRawPointerType* node) {} void AstVisitor::Traverse(WfReferenceExpression* node) {} void AstVisitor::Traverse(WfReferenceType* node) {} void AstVisitor::Traverse(WfReturnStatement* node) {} void AstVisitor::Traverse(WfSetTestingExpression* node) {} void AstVisitor::Traverse(WfSharedPointerType* node) {} void AstVisitor::Traverse(WfStateDeclaration* node) {} void AstVisitor::Traverse(WfStateInput* node) {} void AstVisitor::Traverse(WfStateInvokeStatement* node) {} void AstVisitor::Traverse(WfStateMachineDeclaration* node) {} void AstVisitor::Traverse(WfStateMachineStatement* node) {} void AstVisitor::Traverse(WfStateSwitchArgument* node) {} void AstVisitor::Traverse(WfStateSwitchCase* node) {} void AstVisitor::Traverse(WfStateSwitchStatement* node) {} void AstVisitor::Traverse(WfStatement* node) {} void AstVisitor::Traverse(WfStaticInitDeclaration* node) {} void AstVisitor::Traverse(WfStringExpression* node) {} void AstVisitor::Traverse(WfStructDeclaration* node) {} void AstVisitor::Traverse(WfStructMember* node) {} void AstVisitor::Traverse(WfSwitchCase* node) {} void AstVisitor::Traverse(WfSwitchStatement* node) {} void AstVisitor::Traverse(WfThisExpression* node) {} void AstVisitor::Traverse(WfTopQualifiedExpression* node) {} void AstVisitor::Traverse(WfTopQualifiedType* node) {} void AstVisitor::Traverse(WfTryStatement* node) {} void AstVisitor::Traverse(WfType* node) {} void AstVisitor::Traverse(WfTypeCastingExpression* node) {} void AstVisitor::Traverse(WfTypeOfExpressionExpression* node) {} void AstVisitor::Traverse(WfTypeOfTypeExpression* node) {} void AstVisitor::Traverse(WfTypeTestingExpression* node) {} void AstVisitor::Traverse(WfUnaryExpression* node) {} void AstVisitor::Traverse(WfVariableDeclaration* node) {} void AstVisitor::Traverse(WfVariableStatement* node) {} void AstVisitor::Traverse(WfVirtualCfeDeclaration* node) {} void AstVisitor::Traverse(WfVirtualCfeExpression* node) {} void AstVisitor::Traverse(WfVirtualCseDeclaration* node) {} void AstVisitor::Traverse(WfVirtualCseExpression* node) {} void AstVisitor::Traverse(WfVirtualCseStatement* node) {} void AstVisitor::Traverse(WfWhileStatement* node) {} void AstVisitor::Finishing(vl::glr::ParsingAstBase* node) {} void AstVisitor::Finishing(WfAttachEventExpression* node) {} void AstVisitor::Finishing(WfAttribute* node) {} void AstVisitor::Finishing(WfAutoPropertyDeclaration* node) {} void AstVisitor::Finishing(WfBaseConstructorCall* node) {} void AstVisitor::Finishing(WfBinaryExpression* node) {} void AstVisitor::Finishing(WfBindExpression* node) {} void AstVisitor::Finishing(WfBlockStatement* node) {} void AstVisitor::Finishing(WfBreakStatement* node) {} void AstVisitor::Finishing(WfCallExpression* node) {} void AstVisitor::Finishing(WfCastResultInterfaceDeclaration* node) {} void AstVisitor::Finishing(WfChildExpression* node) {} void AstVisitor::Finishing(WfChildType* node) {} void AstVisitor::Finishing(WfClassDeclaration* node) {} void AstVisitor::Finishing(WfCoOperatorExpression* node) {} void AstVisitor::Finishing(WfCoOperatorStatement* node) {} void AstVisitor::Finishing(WfCoPauseStatement* node) {} void AstVisitor::Finishing(WfCoProviderStatement* node) {} void AstVisitor::Finishing(WfConstructorArgument* node) {} void AstVisitor::Finishing(WfConstructorDeclaration* node) {} void AstVisitor::Finishing(WfConstructorExpression* node) {} void AstVisitor::Finishing(WfContinueStatement* node) {} void AstVisitor::Finishing(WfCoroutineStatement* node) {} void AstVisitor::Finishing(WfDeclaration* node) {} void AstVisitor::Finishing(WfDeleteStatement* node) {} void AstVisitor::Finishing(WfDestructorDeclaration* node) {} void AstVisitor::Finishing(WfDetachEventExpression* node) {} void AstVisitor::Finishing(WfEnumDeclaration* node) {} void AstVisitor::Finishing(WfEnumItem* node) {} void AstVisitor::Finishing(WfEnumItemIntersection* node) {} void AstVisitor::Finishing(WfEnumerableType* node) {} void AstVisitor::Finishing(WfEventDeclaration* node) {} void AstVisitor::Finishing(WfExpectedTypeCastExpression* node) {} void AstVisitor::Finishing(WfExpression* node) {} void AstVisitor::Finishing(WfExpressionStatement* node) {} void AstVisitor::Finishing(WfFloatingExpression* node) {} void AstVisitor::Finishing(WfForEachStatement* node) {} void AstVisitor::Finishing(WfFormatExpression* node) {} void AstVisitor::Finishing(WfFunctionArgument* node) {} void AstVisitor::Finishing(WfFunctionDeclaration* node) {} void AstVisitor::Finishing(WfFunctionExpression* node) {} void AstVisitor::Finishing(WfFunctionType* node) {} void AstVisitor::Finishing(WfGotoStatement* node) {} void AstVisitor::Finishing(WfIfExpression* node) {} void AstVisitor::Finishing(WfIfStatement* node) {} void AstVisitor::Finishing(WfInferExpression* node) {} void AstVisitor::Finishing(WfIntegerExpression* node) {} void AstVisitor::Finishing(WfLetExpression* node) {} void AstVisitor::Finishing(WfLetVariable* node) {} void AstVisitor::Finishing(WfLiteralExpression* node) {} void AstVisitor::Finishing(WfMapType* node) {} void AstVisitor::Finishing(WfMemberExpression* node) {} void AstVisitor::Finishing(WfMixinCastExpression* node) {} void AstVisitor::Finishing(WfModule* node) {} void AstVisitor::Finishing(WfModuleUsingFragment* node) {} void AstVisitor::Finishing(WfModuleUsingItem* node) {} void AstVisitor::Finishing(WfModuleUsingNameFragment* node) {} void AstVisitor::Finishing(WfModuleUsingPath* node) {} void AstVisitor::Finishing(WfModuleUsingWildCardFragment* node) {} void AstVisitor::Finishing(WfNamespaceDeclaration* node) {} void AstVisitor::Finishing(WfNewClassExpression* node) {} void AstVisitor::Finishing(WfNewCoroutineExpression* node) {} void AstVisitor::Finishing(WfNewInterfaceExpression* node) {} void AstVisitor::Finishing(WfNullableType* node) {} void AstVisitor::Finishing(WfObservableListType* node) {} void AstVisitor::Finishing(WfObserveExpression* node) {} void AstVisitor::Finishing(WfOrderedLambdaExpression* node) {} void AstVisitor::Finishing(WfOrderedNameExpression* node) {} void AstVisitor::Finishing(WfPredefinedType* node) {} void AstVisitor::Finishing(WfPropertyDeclaration* node) {} void AstVisitor::Finishing(WfRaiseExceptionStatement* node) {} void AstVisitor::Finishing(WfRangeExpression* node) {} void AstVisitor::Finishing(WfRawPointerType* node) {} void AstVisitor::Finishing(WfReferenceExpression* node) {} void AstVisitor::Finishing(WfReferenceType* node) {} void AstVisitor::Finishing(WfReturnStatement* node) {} void AstVisitor::Finishing(WfSetTestingExpression* node) {} void AstVisitor::Finishing(WfSharedPointerType* node) {} void AstVisitor::Finishing(WfStateDeclaration* node) {} void AstVisitor::Finishing(WfStateInput* node) {} void AstVisitor::Finishing(WfStateInvokeStatement* node) {} void AstVisitor::Finishing(WfStateMachineDeclaration* node) {} void AstVisitor::Finishing(WfStateMachineStatement* node) {} void AstVisitor::Finishing(WfStateSwitchArgument* node) {} void AstVisitor::Finishing(WfStateSwitchCase* node) {} void AstVisitor::Finishing(WfStateSwitchStatement* node) {} void AstVisitor::Finishing(WfStatement* node) {} void AstVisitor::Finishing(WfStaticInitDeclaration* node) {} void AstVisitor::Finishing(WfStringExpression* node) {} void AstVisitor::Finishing(WfStructDeclaration* node) {} void AstVisitor::Finishing(WfStructMember* node) {} void AstVisitor::Finishing(WfSwitchCase* node) {} void AstVisitor::Finishing(WfSwitchStatement* node) {} void AstVisitor::Finishing(WfThisExpression* node) {} void AstVisitor::Finishing(WfTopQualifiedExpression* node) {} void AstVisitor::Finishing(WfTopQualifiedType* node) {} void AstVisitor::Finishing(WfTryStatement* node) {} void AstVisitor::Finishing(WfType* node) {} void AstVisitor::Finishing(WfTypeCastingExpression* node) {} void AstVisitor::Finishing(WfTypeOfExpressionExpression* node) {} void AstVisitor::Finishing(WfTypeOfTypeExpression* node) {} void AstVisitor::Finishing(WfTypeTestingExpression* node) {} void AstVisitor::Finishing(WfUnaryExpression* node) {} void AstVisitor::Finishing(WfVariableDeclaration* node) {} void AstVisitor::Finishing(WfVariableStatement* node) {} void AstVisitor::Finishing(WfVirtualCfeDeclaration* node) {} void AstVisitor::Finishing(WfVirtualCfeExpression* node) {} void AstVisitor::Finishing(WfVirtualCseDeclaration* node) {} void AstVisitor::Finishing(WfVirtualCseExpression* node) {} void AstVisitor::Finishing(WfVirtualCseStatement* node) {} void AstVisitor::Finishing(WfWhileStatement* node) {} void AstVisitor::Visit(WfPredefinedType* node) { if (!node) return; Traverse(static_cast(node)); Traverse(static_cast(node)); Traverse(static_cast(node)); Finishing(static_cast(node)); Finishing(static_cast(node)); Finishing(static_cast(node)); } void AstVisitor::Visit(WfTopQualifiedType* node) { if (!node) return; Traverse(static_cast(node)); Traverse(static_cast(node)); Traverse(static_cast(node)); Traverse(node->name); Finishing(static_cast(node)); Finishing(static_cast(node)); Finishing(static_cast(node)); } void AstVisitor::Visit(WfReferenceType* node) { if (!node) return; Traverse(static_cast(node)); Traverse(static_cast(node)); Traverse(static_cast(node)); Traverse(node->name); Finishing(static_cast(node)); Finishing(static_cast(node)); Finishing(static_cast(node)); } void AstVisitor::Visit(WfRawPointerType* node) { if (!node) return; Traverse(static_cast(node)); Traverse(static_cast(node)); Traverse(static_cast(node)); InspectInto(node->element.Obj()); Finishing(static_cast(node)); Finishing(static_cast(node)); Finishing(static_cast(node)); } void AstVisitor::Visit(WfSharedPointerType* node) { if (!node) return; Traverse(static_cast(node)); Traverse(static_cast(node)); Traverse(static_cast(node)); InspectInto(node->element.Obj()); Finishing(static_cast(node)); Finishing(static_cast(node)); Finishing(static_cast(node)); } void AstVisitor::Visit(WfNullableType* node) { if (!node) return; Traverse(static_cast(node)); Traverse(static_cast(node)); Traverse(static_cast(node)); InspectInto(node->element.Obj()); Finishing(static_cast(node)); Finishing(static_cast(node)); Finishing(static_cast(node)); } void AstVisitor::Visit(WfEnumerableType* node) { if (!node) return; Traverse(static_cast(node)); Traverse(static_cast(node)); Traverse(static_cast(node)); InspectInto(node->element.Obj()); Finishing(static_cast(node)); Finishing(static_cast(node)); Finishing(static_cast(node)); } void AstVisitor::Visit(WfMapType* node) { if (!node) return; Traverse(static_cast(node)); Traverse(static_cast(node)); Traverse(static_cast(node)); InspectInto(node->key.Obj()); InspectInto(node->value.Obj()); Finishing(static_cast(node)); Finishing(static_cast(node)); Finishing(static_cast(node)); } void AstVisitor::Visit(WfObservableListType* node) { if (!node) return; Traverse(static_cast(node)); Traverse(static_cast(node)); Traverse(static_cast(node)); InspectInto(node->element.Obj()); Finishing(static_cast(node)); Finishing(static_cast(node)); Finishing(static_cast(node)); } void AstVisitor::Visit(WfFunctionType* node) { if (!node) return; Traverse(static_cast(node)); Traverse(static_cast(node)); Traverse(static_cast(node)); for (auto&& listItem : node->arguments) { InspectInto(listItem.Obj()); } InspectInto(node->result.Obj()); Finishing(static_cast(node)); Finishing(static_cast(node)); Finishing(static_cast(node)); } void AstVisitor::Visit(WfChildType* node) { if (!node) return; Traverse(static_cast(node)); Traverse(static_cast(node)); Traverse(static_cast(node)); Traverse(node->name); InspectInto(node->parent.Obj()); Finishing(static_cast(node)); Finishing(static_cast(node)); Finishing(static_cast(node)); } void AstVisitor::Visit(WfThisExpression* node) { if (!node) return; Traverse(static_cast(node)); Traverse(static_cast(node)); Traverse(static_cast(node)); Finishing(static_cast(node)); Finishing(static_cast(node)); Finishing(static_cast(node)); } void AstVisitor::Visit(WfTopQualifiedExpression* node) { if (!node) return; Traverse(static_cast(node)); Traverse(static_cast(node)); Traverse(static_cast(node)); Traverse(node->name); Finishing(static_cast(node)); Finishing(static_cast(node)); Finishing(static_cast(node)); } void AstVisitor::Visit(WfReferenceExpression* node) { if (!node) return; Traverse(static_cast(node)); Traverse(static_cast(node)); Traverse(static_cast(node)); Traverse(node->name); Finishing(static_cast(node)); Finishing(static_cast(node)); Finishing(static_cast(node)); } void AstVisitor::Visit(WfOrderedNameExpression* node) { if (!node) return; Traverse(static_cast(node)); Traverse(static_cast(node)); Traverse(static_cast(node)); Traverse(node->name); Finishing(static_cast(node)); Finishing(static_cast(node)); Finishing(static_cast(node)); } void AstVisitor::Visit(WfOrderedLambdaExpression* node) { if (!node) return; Traverse(static_cast(node)); Traverse(static_cast(node)); Traverse(static_cast(node)); InspectInto(node->body.Obj()); Finishing(static_cast(node)); Finishing(static_cast(node)); Finishing(static_cast(node)); } void AstVisitor::Visit(WfMemberExpression* node) { if (!node) return; Traverse(static_cast(node)); Traverse(static_cast(node)); Traverse(static_cast(node)); Traverse(node->name); InspectInto(node->parent.Obj()); Finishing(static_cast(node)); Finishing(static_cast(node)); Finishing(static_cast(node)); } void AstVisitor::Visit(WfChildExpression* node) { if (!node) return; Traverse(static_cast(node)); Traverse(static_cast(node)); Traverse(static_cast(node)); Traverse(node->name); InspectInto(node->parent.Obj()); Finishing(static_cast(node)); Finishing(static_cast(node)); Finishing(static_cast(node)); } void AstVisitor::Visit(WfLiteralExpression* node) { if (!node) return; Traverse(static_cast(node)); Traverse(static_cast(node)); Traverse(static_cast(node)); Finishing(static_cast(node)); Finishing(static_cast(node)); Finishing(static_cast(node)); } void AstVisitor::Visit(WfFloatingExpression* node) { if (!node) return; Traverse(static_cast(node)); Traverse(static_cast(node)); Traverse(static_cast(node)); Traverse(node->value); Finishing(static_cast(node)); Finishing(static_cast(node)); Finishing(static_cast(node)); } void AstVisitor::Visit(WfIntegerExpression* node) { if (!node) return; Traverse(static_cast(node)); Traverse(static_cast(node)); Traverse(static_cast(node)); Traverse(node->value); Finishing(static_cast(node)); Finishing(static_cast(node)); Finishing(static_cast(node)); } void AstVisitor::Visit(WfStringExpression* node) { if (!node) return; Traverse(static_cast(node)); Traverse(static_cast(node)); Traverse(static_cast(node)); Traverse(node->value); Finishing(static_cast(node)); Finishing(static_cast(node)); Finishing(static_cast(node)); } void AstVisitor::Visit(WfUnaryExpression* node) { if (!node) return; Traverse(static_cast(node)); Traverse(static_cast(node)); Traverse(static_cast(node)); InspectInto(node->operand.Obj()); Finishing(static_cast(node)); Finishing(static_cast(node)); Finishing(static_cast(node)); } void AstVisitor::Visit(WfBinaryExpression* node) { if (!node) return; Traverse(static_cast(node)); Traverse(static_cast(node)); Traverse(static_cast(node)); InspectInto(node->first.Obj()); InspectInto(node->second.Obj()); Finishing(static_cast(node)); Finishing(static_cast(node)); Finishing(static_cast(node)); } void AstVisitor::Visit(WfLetExpression* node) { if (!node) return; Traverse(static_cast(node)); Traverse(static_cast(node)); Traverse(static_cast(node)); InspectInto(node->expression.Obj()); for (auto&& listItem : node->variables) { InspectInto(listItem.Obj()); } Finishing(static_cast(node)); Finishing(static_cast(node)); Finishing(static_cast(node)); } void AstVisitor::Visit(WfIfExpression* node) { if (!node) return; Traverse(static_cast(node)); Traverse(static_cast(node)); Traverse(static_cast(node)); InspectInto(node->condition.Obj()); InspectInto(node->falseBranch.Obj()); InspectInto(node->trueBranch.Obj()); Finishing(static_cast(node)); Finishing(static_cast(node)); Finishing(static_cast(node)); } void AstVisitor::Visit(WfRangeExpression* node) { if (!node) return; Traverse(static_cast(node)); Traverse(static_cast(node)); Traverse(static_cast(node)); InspectInto(node->begin.Obj()); InspectInto(node->end.Obj()); Finishing(static_cast(node)); Finishing(static_cast(node)); Finishing(static_cast(node)); } void AstVisitor::Visit(WfSetTestingExpression* node) { if (!node) return; Traverse(static_cast(node)); Traverse(static_cast(node)); Traverse(static_cast(node)); InspectInto(node->collection.Obj()); InspectInto(node->element.Obj()); Finishing(static_cast(node)); Finishing(static_cast(node)); Finishing(static_cast(node)); } void AstVisitor::Visit(WfConstructorExpression* node) { if (!node) return; Traverse(static_cast(node)); Traverse(static_cast(node)); Traverse(static_cast(node)); for (auto&& listItem : node->arguments) { InspectInto(listItem.Obj()); } Finishing(static_cast(node)); Finishing(static_cast(node)); Finishing(static_cast(node)); } void AstVisitor::Visit(WfInferExpression* node) { if (!node) return; Traverse(static_cast(node)); Traverse(static_cast(node)); Traverse(static_cast(node)); InspectInto(node->expression.Obj()); InspectInto(node->type.Obj()); Finishing(static_cast(node)); Finishing(static_cast(node)); Finishing(static_cast(node)); } void AstVisitor::Visit(WfTypeCastingExpression* node) { if (!node) return; Traverse(static_cast(node)); Traverse(static_cast(node)); Traverse(static_cast(node)); InspectInto(node->expression.Obj()); InspectInto(node->type.Obj()); Finishing(static_cast(node)); Finishing(static_cast(node)); Finishing(static_cast(node)); } void AstVisitor::Visit(WfTypeTestingExpression* node) { if (!node) return; Traverse(static_cast(node)); Traverse(static_cast(node)); Traverse(static_cast(node)); InspectInto(node->expression.Obj()); InspectInto(node->type.Obj()); Finishing(static_cast(node)); Finishing(static_cast(node)); Finishing(static_cast(node)); } void AstVisitor::Visit(WfTypeOfTypeExpression* node) { if (!node) return; Traverse(static_cast(node)); Traverse(static_cast(node)); Traverse(static_cast(node)); InspectInto(node->type.Obj()); Finishing(static_cast(node)); Finishing(static_cast(node)); Finishing(static_cast(node)); } void AstVisitor::Visit(WfTypeOfExpressionExpression* node) { if (!node) return; Traverse(static_cast(node)); Traverse(static_cast(node)); Traverse(static_cast(node)); InspectInto(node->expression.Obj()); Finishing(static_cast(node)); Finishing(static_cast(node)); Finishing(static_cast(node)); } void AstVisitor::Visit(WfAttachEventExpression* node) { if (!node) return; Traverse(static_cast(node)); Traverse(static_cast(node)); Traverse(static_cast(node)); InspectInto(node->event.Obj()); InspectInto(node->function.Obj()); Finishing(static_cast(node)); Finishing(static_cast(node)); Finishing(static_cast(node)); } void AstVisitor::Visit(WfDetachEventExpression* node) { if (!node) return; Traverse(static_cast(node)); Traverse(static_cast(node)); Traverse(static_cast(node)); InspectInto(node->event.Obj()); InspectInto(node->handler.Obj()); Finishing(static_cast(node)); Finishing(static_cast(node)); Finishing(static_cast(node)); } void AstVisitor::Visit(WfObserveExpression* node) { if (!node) return; Traverse(static_cast(node)); Traverse(static_cast(node)); Traverse(static_cast(node)); for (auto&& listItem : node->events) { InspectInto(listItem.Obj()); } InspectInto(node->expression.Obj()); Traverse(node->name); InspectInto(node->parent.Obj()); Finishing(static_cast(node)); Finishing(static_cast(node)); Finishing(static_cast(node)); } void AstVisitor::Visit(WfCallExpression* node) { if (!node) return; Traverse(static_cast(node)); Traverse(static_cast(node)); Traverse(static_cast(node)); for (auto&& listItem : node->arguments) { InspectInto(listItem.Obj()); } InspectInto(node->function.Obj()); Finishing(static_cast(node)); Finishing(static_cast(node)); Finishing(static_cast(node)); } void AstVisitor::Visit(WfFunctionExpression* node) { if (!node) return; Traverse(static_cast(node)); Traverse(static_cast(node)); Traverse(static_cast(node)); InspectInto(node->function.Obj()); Finishing(static_cast(node)); Finishing(static_cast(node)); Finishing(static_cast(node)); } void AstVisitor::Visit(WfNewClassExpression* node) { if (!node) return; Traverse(static_cast(node)); Traverse(static_cast(node)); Traverse(static_cast(node)); for (auto&& listItem : node->arguments) { InspectInto(listItem.Obj()); } InspectInto(node->type.Obj()); Finishing(static_cast(node)); Finishing(static_cast(node)); Finishing(static_cast(node)); } void AstVisitor::Visit(WfNewInterfaceExpression* node) { if (!node) return; Traverse(static_cast(node)); Traverse(static_cast(node)); Traverse(static_cast(node)); for (auto&& listItem : node->declarations) { InspectInto(listItem.Obj()); } InspectInto(node->type.Obj()); Finishing(static_cast(node)); Finishing(static_cast(node)); Finishing(static_cast(node)); } void AstVisitor::Visit(WfVirtualCfeExpression* node) { node->Accept(static_cast(this)); } void AstVisitor::Visit(WfVirtualCseExpression* node) { node->Accept(static_cast(this)); } void AstVisitor::Visit(WfBreakStatement* node) { if (!node) return; Traverse(static_cast(node)); Traverse(static_cast(node)); Traverse(static_cast(node)); Finishing(static_cast(node)); Finishing(static_cast(node)); Finishing(static_cast(node)); } void AstVisitor::Visit(WfContinueStatement* node) { if (!node) return; Traverse(static_cast(node)); Traverse(static_cast(node)); Traverse(static_cast(node)); Finishing(static_cast(node)); Finishing(static_cast(node)); Finishing(static_cast(node)); } void AstVisitor::Visit(WfReturnStatement* node) { if (!node) return; Traverse(static_cast(node)); Traverse(static_cast(node)); Traverse(static_cast(node)); InspectInto(node->expression.Obj()); Finishing(static_cast(node)); Finishing(static_cast(node)); Finishing(static_cast(node)); } void AstVisitor::Visit(WfDeleteStatement* node) { if (!node) return; Traverse(static_cast(node)); Traverse(static_cast(node)); Traverse(static_cast(node)); InspectInto(node->expression.Obj()); Finishing(static_cast(node)); Finishing(static_cast(node)); Finishing(static_cast(node)); } void AstVisitor::Visit(WfRaiseExceptionStatement* node) { if (!node) return; Traverse(static_cast(node)); Traverse(static_cast(node)); Traverse(static_cast(node)); InspectInto(node->expression.Obj()); Finishing(static_cast(node)); Finishing(static_cast(node)); Finishing(static_cast(node)); } void AstVisitor::Visit(WfIfStatement* node) { if (!node) return; Traverse(static_cast(node)); Traverse(static_cast(node)); Traverse(static_cast(node)); InspectInto(node->expression.Obj()); InspectInto(node->falseBranch.Obj()); Traverse(node->name); InspectInto(node->trueBranch.Obj()); InspectInto(node->type.Obj()); Finishing(static_cast(node)); Finishing(static_cast(node)); Finishing(static_cast(node)); } void AstVisitor::Visit(WfWhileStatement* node) { if (!node) return; Traverse(static_cast(node)); Traverse(static_cast(node)); Traverse(static_cast(node)); InspectInto(node->condition.Obj()); InspectInto(node->statement.Obj()); Finishing(static_cast(node)); Finishing(static_cast(node)); Finishing(static_cast(node)); } void AstVisitor::Visit(WfTryStatement* node) { if (!node) return; Traverse(static_cast(node)); Traverse(static_cast(node)); Traverse(static_cast(node)); InspectInto(node->catchStatement.Obj()); InspectInto(node->finallyStatement.Obj()); Traverse(node->name); InspectInto(node->protectedStatement.Obj()); Finishing(static_cast(node)); Finishing(static_cast(node)); Finishing(static_cast(node)); } void AstVisitor::Visit(WfBlockStatement* node) { if (!node) return; Traverse(static_cast(node)); Traverse(static_cast(node)); Traverse(static_cast(node)); Traverse(node->endLabel); for (auto&& listItem : node->statements) { InspectInto(listItem.Obj()); } Finishing(static_cast(node)); Finishing(static_cast(node)); Finishing(static_cast(node)); } void AstVisitor::Visit(WfGotoStatement* node) { if (!node) return; Traverse(static_cast(node)); Traverse(static_cast(node)); Traverse(static_cast(node)); Traverse(node->label); Finishing(static_cast(node)); Finishing(static_cast(node)); Finishing(static_cast(node)); } void AstVisitor::Visit(WfVariableStatement* node) { if (!node) return; Traverse(static_cast(node)); Traverse(static_cast(node)); Traverse(static_cast(node)); InspectInto(node->variable.Obj()); Finishing(static_cast(node)); Finishing(static_cast(node)); Finishing(static_cast(node)); } void AstVisitor::Visit(WfExpressionStatement* node) { if (!node) return; Traverse(static_cast(node)); Traverse(static_cast(node)); Traverse(static_cast(node)); InspectInto(node->expression.Obj()); Finishing(static_cast(node)); Finishing(static_cast(node)); Finishing(static_cast(node)); } void AstVisitor::Visit(WfVirtualCseStatement* node) { node->Accept(static_cast(this)); } void AstVisitor::Visit(WfCoroutineStatement* node) { node->Accept(static_cast(this)); } void AstVisitor::Visit(WfStateMachineStatement* node) { node->Accept(static_cast(this)); } void AstVisitor::Visit(WfNamespaceDeclaration* node) { if (!node) return; Traverse(static_cast(node)); Traverse(static_cast(node)); Traverse(static_cast(node)); for (auto&& listItem : node->declarations) { InspectInto(listItem.Obj()); } for (auto&& listItem : node->attributes) { InspectInto(listItem.Obj()); } Traverse(node->name); Finishing(static_cast(node)); Finishing(static_cast(node)); Finishing(static_cast(node)); } void AstVisitor::Visit(WfFunctionDeclaration* node) { if (!node) return; Traverse(static_cast(node)); Traverse(static_cast(node)); Traverse(static_cast(node)); for (auto&& listItem : node->arguments) { InspectInto(listItem.Obj()); } InspectInto(node->returnType.Obj()); InspectInto(node->statement.Obj()); for (auto&& listItem : node->attributes) { InspectInto(listItem.Obj()); } Traverse(node->name); Finishing(static_cast(node)); Finishing(static_cast(node)); Finishing(static_cast(node)); } void AstVisitor::Visit(WfVariableDeclaration* node) { if (!node) return; Traverse(static_cast(node)); Traverse(static_cast(node)); Traverse(static_cast(node)); InspectInto(node->expression.Obj()); InspectInto(node->type.Obj()); for (auto&& listItem : node->attributes) { InspectInto(listItem.Obj()); } Traverse(node->name); Finishing(static_cast(node)); Finishing(static_cast(node)); Finishing(static_cast(node)); } void AstVisitor::Visit(WfEventDeclaration* node) { if (!node) return; Traverse(static_cast(node)); Traverse(static_cast(node)); Traverse(static_cast(node)); for (auto&& listItem : node->arguments) { InspectInto(listItem.Obj()); } for (auto&& listItem : node->attributes) { InspectInto(listItem.Obj()); } Traverse(node->name); Finishing(static_cast(node)); Finishing(static_cast(node)); Finishing(static_cast(node)); } void AstVisitor::Visit(WfPropertyDeclaration* node) { if (!node) return; Traverse(static_cast(node)); Traverse(static_cast(node)); Traverse(static_cast(node)); Traverse(node->getter); Traverse(node->setter); InspectInto(node->type.Obj()); Traverse(node->valueChangedEvent); for (auto&& listItem : node->attributes) { InspectInto(listItem.Obj()); } Traverse(node->name); Finishing(static_cast(node)); Finishing(static_cast(node)); Finishing(static_cast(node)); } void AstVisitor::Visit(WfStaticInitDeclaration* node) { if (!node) return; Traverse(static_cast(node)); Traverse(static_cast(node)); Traverse(static_cast(node)); InspectInto(node->statement.Obj()); for (auto&& listItem : node->attributes) { InspectInto(listItem.Obj()); } Traverse(node->name); Finishing(static_cast(node)); Finishing(static_cast(node)); Finishing(static_cast(node)); } void AstVisitor::Visit(WfConstructorDeclaration* node) { if (!node) return; Traverse(static_cast(node)); Traverse(static_cast(node)); Traverse(static_cast(node)); for (auto&& listItem : node->arguments) { InspectInto(listItem.Obj()); } for (auto&& listItem : node->baseConstructorCalls) { InspectInto(listItem.Obj()); } InspectInto(node->statement.Obj()); for (auto&& listItem : node->attributes) { InspectInto(listItem.Obj()); } Traverse(node->name); Finishing(static_cast(node)); Finishing(static_cast(node)); Finishing(static_cast(node)); } void AstVisitor::Visit(WfDestructorDeclaration* node) { if (!node) return; Traverse(static_cast(node)); Traverse(static_cast(node)); Traverse(static_cast(node)); InspectInto(node->statement.Obj()); for (auto&& listItem : node->attributes) { InspectInto(listItem.Obj()); } Traverse(node->name); Finishing(static_cast(node)); Finishing(static_cast(node)); Finishing(static_cast(node)); } void AstVisitor::Visit(WfClassDeclaration* node) { if (!node) return; Traverse(static_cast(node)); Traverse(static_cast(node)); Traverse(static_cast(node)); for (auto&& listItem : node->baseTypes) { InspectInto(listItem.Obj()); } for (auto&& listItem : node->declarations) { InspectInto(listItem.Obj()); } for (auto&& listItem : node->attributes) { InspectInto(listItem.Obj()); } Traverse(node->name); Finishing(static_cast(node)); Finishing(static_cast(node)); Finishing(static_cast(node)); } void AstVisitor::Visit(WfEnumDeclaration* node) { if (!node) return; Traverse(static_cast(node)); Traverse(static_cast(node)); Traverse(static_cast(node)); for (auto&& listItem : node->items) { InspectInto(listItem.Obj()); } for (auto&& listItem : node->attributes) { InspectInto(listItem.Obj()); } Traverse(node->name); Finishing(static_cast(node)); Finishing(static_cast(node)); Finishing(static_cast(node)); } void AstVisitor::Visit(WfStructDeclaration* node) { if (!node) return; Traverse(static_cast(node)); Traverse(static_cast(node)); Traverse(static_cast(node)); for (auto&& listItem : node->members) { InspectInto(listItem.Obj()); } for (auto&& listItem : node->attributes) { InspectInto(listItem.Obj()); } Traverse(node->name); Finishing(static_cast(node)); Finishing(static_cast(node)); Finishing(static_cast(node)); } void AstVisitor::Visit(WfVirtualCfeDeclaration* node) { node->Accept(static_cast(this)); } void AstVisitor::Visit(WfVirtualCseDeclaration* node) { node->Accept(static_cast(this)); } void AstVisitor::Visit(WfAutoPropertyDeclaration* node) { if (!node) return; Traverse(static_cast(node)); Traverse(static_cast(node)); Traverse(static_cast(node)); Traverse(static_cast(node)); InspectInto(node->expression.Obj()); InspectInto(node->type.Obj()); for (auto&& listItem : node->expandedDeclarations) { InspectInto(listItem.Obj()); } for (auto&& listItem : node->attributes) { InspectInto(listItem.Obj()); } Traverse(node->name); Finishing(static_cast(node)); Finishing(static_cast(node)); Finishing(static_cast(node)); Finishing(static_cast(node)); } void AstVisitor::Visit(WfCastResultInterfaceDeclaration* node) { if (!node) return; Traverse(static_cast(node)); Traverse(static_cast(node)); Traverse(static_cast(node)); Traverse(static_cast(node)); InspectInto(node->baseType.Obj()); InspectInto(node->elementType.Obj()); for (auto&& listItem : node->expandedDeclarations) { InspectInto(listItem.Obj()); } for (auto&& listItem : node->attributes) { InspectInto(listItem.Obj()); } Traverse(node->name); Finishing(static_cast(node)); Finishing(static_cast(node)); Finishing(static_cast(node)); Finishing(static_cast(node)); } void AstVisitor::Visit(WfStateMachineDeclaration* node) { if (!node) return; Traverse(static_cast(node)); Traverse(static_cast(node)); Traverse(static_cast(node)); Traverse(static_cast(node)); for (auto&& listItem : node->inputs) { InspectInto(listItem.Obj()); } for (auto&& listItem : node->states) { InspectInto(listItem.Obj()); } for (auto&& listItem : node->expandedDeclarations) { InspectInto(listItem.Obj()); } for (auto&& listItem : node->attributes) { InspectInto(listItem.Obj()); } Traverse(node->name); Finishing(static_cast(node)); Finishing(static_cast(node)); Finishing(static_cast(node)); Finishing(static_cast(node)); } void AstVisitor::Visit(WfForEachStatement* node) { if (!node) return; Traverse(static_cast(node)); Traverse(static_cast(node)); Traverse(static_cast(node)); Traverse(static_cast(node)); InspectInto(node->collection.Obj()); Traverse(node->name); InspectInto(node->statement.Obj()); InspectInto(node->expandedStatement.Obj()); Finishing(static_cast(node)); Finishing(static_cast(node)); Finishing(static_cast(node)); Finishing(static_cast(node)); } void AstVisitor::Visit(WfSwitchStatement* node) { if (!node) return; Traverse(static_cast(node)); Traverse(static_cast(node)); Traverse(static_cast(node)); Traverse(static_cast(node)); for (auto&& listItem : node->caseBranches) { InspectInto(listItem.Obj()); } InspectInto(node->defaultBranch.Obj()); InspectInto(node->expression.Obj()); InspectInto(node->expandedStatement.Obj()); Finishing(static_cast(node)); Finishing(static_cast(node)); Finishing(static_cast(node)); Finishing(static_cast(node)); } void AstVisitor::Visit(WfCoProviderStatement* node) { if (!node) return; Traverse(static_cast(node)); Traverse(static_cast(node)); Traverse(static_cast(node)); Traverse(static_cast(node)); Traverse(node->name); InspectInto(node->statement.Obj()); InspectInto(node->expandedStatement.Obj()); Finishing(static_cast(node)); Finishing(static_cast(node)); Finishing(static_cast(node)); Finishing(static_cast(node)); } void AstVisitor::Visit(WfCoPauseStatement* node) { if (!node) return; Traverse(static_cast(node)); Traverse(static_cast(node)); Traverse(static_cast(node)); Traverse(static_cast(node)); InspectInto(node->statement.Obj()); Finishing(static_cast(node)); Finishing(static_cast(node)); Finishing(static_cast(node)); Finishing(static_cast(node)); } void AstVisitor::Visit(WfCoOperatorStatement* node) { if (!node) return; Traverse(static_cast(node)); Traverse(static_cast(node)); Traverse(static_cast(node)); Traverse(static_cast(node)); for (auto&& listItem : node->arguments) { InspectInto(listItem.Obj()); } Traverse(node->opName); Traverse(node->varName); Finishing(static_cast(node)); Finishing(static_cast(node)); Finishing(static_cast(node)); Finishing(static_cast(node)); } void AstVisitor::Visit(WfStateSwitchStatement* node) { if (!node) return; Traverse(static_cast(node)); Traverse(static_cast(node)); Traverse(static_cast(node)); Traverse(static_cast(node)); for (auto&& listItem : node->caseBranches) { InspectInto(listItem.Obj()); } Finishing(static_cast(node)); Finishing(static_cast(node)); Finishing(static_cast(node)); Finishing(static_cast(node)); } void AstVisitor::Visit(WfStateInvokeStatement* node) { if (!node) return; Traverse(static_cast(node)); Traverse(static_cast(node)); Traverse(static_cast(node)); Traverse(static_cast(node)); for (auto&& listItem : node->arguments) { InspectInto(listItem.Obj()); } Traverse(node->name); Finishing(static_cast(node)); Finishing(static_cast(node)); Finishing(static_cast(node)); Finishing(static_cast(node)); } void AstVisitor::Visit(WfFormatExpression* node) { if (!node) return; Traverse(static_cast(node)); Traverse(static_cast(node)); Traverse(static_cast(node)); Traverse(static_cast(node)); Traverse(node->value); InspectInto(node->expandedExpression.Obj()); Finishing(static_cast(node)); Finishing(static_cast(node)); Finishing(static_cast(node)); Finishing(static_cast(node)); } void AstVisitor::Visit(WfBindExpression* node) { if (!node) return; Traverse(static_cast(node)); Traverse(static_cast(node)); Traverse(static_cast(node)); Traverse(static_cast(node)); InspectInto(node->expression.Obj()); InspectInto(node->expandedExpression.Obj()); Finishing(static_cast(node)); Finishing(static_cast(node)); Finishing(static_cast(node)); Finishing(static_cast(node)); } void AstVisitor::Visit(WfNewCoroutineExpression* node) { if (!node) return; Traverse(static_cast(node)); Traverse(static_cast(node)); Traverse(static_cast(node)); Traverse(static_cast(node)); Traverse(node->name); InspectInto(node->statement.Obj()); InspectInto(node->expandedExpression.Obj()); Finishing(static_cast(node)); Finishing(static_cast(node)); Finishing(static_cast(node)); Finishing(static_cast(node)); } void AstVisitor::Visit(WfMixinCastExpression* node) { if (!node) return; Traverse(static_cast(node)); Traverse(static_cast(node)); Traverse(static_cast(node)); Traverse(static_cast(node)); InspectInto(node->expression.Obj()); InspectInto(node->type.Obj()); InspectInto(node->expandedExpression.Obj()); Finishing(static_cast(node)); Finishing(static_cast(node)); Finishing(static_cast(node)); Finishing(static_cast(node)); } void AstVisitor::Visit(WfExpectedTypeCastExpression* node) { if (!node) return; Traverse(static_cast(node)); Traverse(static_cast(node)); Traverse(static_cast(node)); Traverse(static_cast(node)); InspectInto(node->expression.Obj()); InspectInto(node->expandedExpression.Obj()); Finishing(static_cast(node)); Finishing(static_cast(node)); Finishing(static_cast(node)); Finishing(static_cast(node)); } void AstVisitor::Visit(WfCoOperatorExpression* node) { if (!node) return; Traverse(static_cast(node)); Traverse(static_cast(node)); Traverse(static_cast(node)); Traverse(static_cast(node)); Traverse(node->name); InspectInto(node->expandedExpression.Obj()); Finishing(static_cast(node)); Finishing(static_cast(node)); Finishing(static_cast(node)); Finishing(static_cast(node)); } void AstVisitor::Visit(WfModuleUsingNameFragment* node) { if (!node) return; Traverse(static_cast(node)); Traverse(static_cast(node)); Traverse(static_cast(node)); Traverse(node->name); Finishing(static_cast(node)); Finishing(static_cast(node)); Finishing(static_cast(node)); } void AstVisitor::Visit(WfModuleUsingWildCardFragment* node) { if (!node) return; Traverse(static_cast(node)); Traverse(static_cast(node)); Traverse(static_cast(node)); Finishing(static_cast(node)); Finishing(static_cast(node)); Finishing(static_cast(node)); } void AstVisitor::InspectInto(WfType* node) { if (!node) return; node->Accept(static_cast(this)); } void AstVisitor::InspectInto(WfExpression* node) { if (!node) return; node->Accept(static_cast(this)); } void AstVisitor::InspectInto(WfStatement* node) { if (!node) return; node->Accept(static_cast(this)); } void AstVisitor::InspectInto(WfDeclaration* node) { if (!node) return; node->Accept(static_cast(this)); } void AstVisitor::InspectInto(WfModuleUsingFragment* node) { if (!node) return; node->Accept(static_cast(this)); } void AstVisitor::InspectInto(WfAttribute* node) { if (!node) return; Traverse(static_cast(node)); Traverse(static_cast(node)); Traverse(node->category); Traverse(node->name); InspectInto(node->value.Obj()); Finishing(static_cast(node)); Finishing(static_cast(node)); } void AstVisitor::InspectInto(WfFunctionArgument* node) { if (!node) return; Traverse(static_cast(node)); Traverse(static_cast(node)); for (auto&& listItem : node->attributes) { InspectInto(listItem.Obj()); } Traverse(node->name); InspectInto(node->type.Obj()); Finishing(static_cast(node)); Finishing(static_cast(node)); } void AstVisitor::InspectInto(WfBaseConstructorCall* node) { if (!node) return; Traverse(static_cast(node)); Traverse(static_cast(node)); for (auto&& listItem : node->arguments) { InspectInto(listItem.Obj()); } InspectInto(node->type.Obj()); Finishing(static_cast(node)); Finishing(static_cast(node)); } void AstVisitor::InspectInto(WfEnumItemIntersection* node) { if (!node) return; Traverse(static_cast(node)); Traverse(static_cast(node)); Traverse(node->name); Finishing(static_cast(node)); Finishing(static_cast(node)); } void AstVisitor::InspectInto(WfEnumItem* node) { if (!node) return; Traverse(static_cast(node)); Traverse(static_cast(node)); for (auto&& listItem : node->attributes) { InspectInto(listItem.Obj()); } for (auto&& listItem : node->intersections) { InspectInto(listItem.Obj()); } Traverse(node->name); Traverse(node->number); Finishing(static_cast(node)); Finishing(static_cast(node)); } void AstVisitor::InspectInto(WfStructMember* node) { if (!node) return; Traverse(static_cast(node)); Traverse(static_cast(node)); for (auto&& listItem : node->attributes) { InspectInto(listItem.Obj()); } Traverse(node->name); InspectInto(node->type.Obj()); Finishing(static_cast(node)); Finishing(static_cast(node)); } void AstVisitor::InspectInto(WfStateInput* node) { if (!node) return; Traverse(static_cast(node)); Traverse(static_cast(node)); for (auto&& listItem : node->arguments) { InspectInto(listItem.Obj()); } Traverse(node->name); Finishing(static_cast(node)); Finishing(static_cast(node)); } void AstVisitor::InspectInto(WfStateDeclaration* node) { if (!node) return; Traverse(static_cast(node)); Traverse(static_cast(node)); for (auto&& listItem : node->arguments) { InspectInto(listItem.Obj()); } Traverse(node->name); InspectInto(node->statement.Obj()); Finishing(static_cast(node)); Finishing(static_cast(node)); } void AstVisitor::InspectInto(WfSwitchCase* node) { if (!node) return; Traverse(static_cast(node)); Traverse(static_cast(node)); InspectInto(node->expression.Obj()); InspectInto(node->statement.Obj()); Finishing(static_cast(node)); Finishing(static_cast(node)); } void AstVisitor::InspectInto(WfStateSwitchArgument* node) { if (!node) return; Traverse(static_cast(node)); Traverse(static_cast(node)); Traverse(node->name); Finishing(static_cast(node)); Finishing(static_cast(node)); } void AstVisitor::InspectInto(WfStateSwitchCase* node) { if (!node) return; Traverse(static_cast(node)); Traverse(static_cast(node)); for (auto&& listItem : node->arguments) { InspectInto(listItem.Obj()); } Traverse(node->name); InspectInto(node->statement.Obj()); Finishing(static_cast(node)); Finishing(static_cast(node)); } void AstVisitor::InspectInto(WfLetVariable* node) { if (!node) return; Traverse(static_cast(node)); Traverse(static_cast(node)); Traverse(node->name); InspectInto(node->value.Obj()); Finishing(static_cast(node)); Finishing(static_cast(node)); } void AstVisitor::InspectInto(WfConstructorArgument* node) { if (!node) return; Traverse(static_cast(node)); Traverse(static_cast(node)); InspectInto(node->key.Obj()); InspectInto(node->value.Obj()); Finishing(static_cast(node)); Finishing(static_cast(node)); } void AstVisitor::InspectInto(WfModuleUsingItem* node) { if (!node) return; Traverse(static_cast(node)); Traverse(static_cast(node)); for (auto&& listItem : node->fragments) { InspectInto(listItem.Obj()); } Finishing(static_cast(node)); Finishing(static_cast(node)); } void AstVisitor::InspectInto(WfModuleUsingPath* node) { if (!node) return; Traverse(static_cast(node)); Traverse(static_cast(node)); for (auto&& listItem : node->items) { InspectInto(listItem.Obj()); } Finishing(static_cast(node)); Finishing(static_cast(node)); } void AstVisitor::InspectInto(WfModule* node) { if (!node) return; Traverse(static_cast(node)); Traverse(static_cast(node)); for (auto&& listItem : node->declarations) { InspectInto(listItem.Obj()); } Traverse(node->name); for (auto&& listItem : node->paths) { InspectInto(listItem.Obj()); } Finishing(static_cast(node)); Finishing(static_cast(node)); } } /*********************************************************************** .\PARSER\GENERATED\WORKFLOWPARSER.CPP ***********************************************************************/ /*********************************************************************** This file is generated by: Vczh Parser Generator From parser definition:Workflow Licensed under https://github.com/vczh-libraries/License ***********************************************************************/ namespace vl::workflow { void WorkflowParserData(vl::stream::IStream& outputStream) { static const vl::vint dataLength = 185138; // 3433199 bytes before compressing static const vl::vint dataBlock = 256; static const vl::vint dataRemain = 50; static const vl::vint dataSolidRows = 723; static const vl::vint dataRows = 724; static const char* compressed[] = { "\x00\x00\x10\x00\x2F\x5D\x00\x00\x73\x00\x01\x82\x80\x08\x23\x82\x81\x82\x06\x89\x82\x92\x1A\x87\x1A\x84\x1E\x0A\xD1\x0A\x95\x2A\x81\x2E\x84\x2F\x0A\xE7\x4A\x96\x7A\x84\x7E\x84\x04\x01\x09\x97\x01\x96\x80\x10\x93\x81\x35\x27\x82\x9B\x1A\x91\x81\x21\x96\x00\x47\x30\x8D\x20\x9D\x28\x99\x2D\x30\xDE\x30\x84\x30\x9C\x34\x98\x38\x30\xFE\x30\x83\x40\x9E\x48\x98\x51\x30\xA7\x70\x9E\x50\x99\x60\x98\x66\x30\xE0\x70\x88\x02\x01\x85\x09\xAA\x06\x9B\x18\xA3\x82\x13\xAE\x81\x15\x5E\x81\xB2\x01\xB0\x00\x1C\xB2\x1F\x64\xC2\x24\xAC\x24\xB3\x28\xB2\x2D\x64\xE3\x24\xAC\x34\xB1\x3C\xB3\x3E\x64\x85\x64\xAA\x44\xB5\x48\xB3\x4C\x64\xA2\x64\xAE\x54\xB1\x58\xB2\x5C\x64\xC1\x64\xB0\x64\xB7\x68\xB2\x6F\x64\xEF\x64\xB6\x74\xB7\x7C\xB3\x04\x03\x09\x98\x19\xC6\x84\x0C\xCF\x81\x20\x1F\xC2\x84\x12\xD1\x83\x15\xD2\x00\x31\x28\xC3\x18\x3D\x97\x7F\xD7\xB0\xAF\xCA\x80\x01\xD9\xDB\xD9\xDA\xB0\xB7\xF8\xDF\x7A\xD8\xDD\xDF\xDA\xBF\xB6\xCA\x9B\xDC\xDB\xE3\xDD\xE0\xB9\xC6\xFE\xCA\xE0\xE4\xE6\xE1\x84\xC4\xC8\xF2\xCE\xE9\xE0\xEB\xE2\xEA\xD3\xD6\xCB\xF3", "\xD9\x80\x98\xDB\xEB\xDA\xCD\xE1\xEF\xE6\x81\xE8\xED\xE2\xE3\xD5\xE5\xE0\xFB\xF3\xEE\x82\xEF\xDE\xE6\xE9\xF9\xE6\x84\xB0\x00\xEF\xA8\xF7\xCA\x84\x0A\x86\xED\x03\xFE\x0A\x46\x00\x81\x42\x07\x03\x86\x40\x02\x06\x83\x49\x01\x82\x02\x4A\x0C\x81\x40\x0B\x0F\x80\x00\x03\x12\xB2\x7D\x7A\x78\x17\xA4\x73\x42\x85\x1B\xAC\x7D\x86\x7B\x1F\x98\x81\x8A\x86\x02\x5C\x85\x8A\x87\x27\xA0\x89\x8A\x88\x2B\xA4\x81\x42\x89\x2F\xA8\x81\x8E\x8A\x33\xAC\x85\x8E\x8B\x00\x0D\x05\x86\x8C\xDF\x74\x8D\x8E\x8D\x00\x0E\x0B\x8E\x8F\x30\xBF\x88\x8D\x91\x48\xBC\x89\x90\x91\x4A\x8D\x9C\x93\x93\x40\x8B\x91\x96\x93\x53\x90\x97\x90\x95\x57\x96\x9A\x7B\x88\x5B\xAD\x8D\x97\x8D\x5F\x86\x91\x9A\x94\x59\x95\x96\x99\x99\x68\xA3\x98\x96\x9A\x5A\xB4\x7C\x96\x9B\x5E\xB0\x90\x9A\x9C\x62\xB4\x94\x99\x98\x0F\x03\x97\x98\x9B\x7B\xB6\x9B\x9A\x9F\x6D\xA8\x79\x84\x9F\x69\x80\xAD\x9E\xA0\x6F\x88\xA1\x9E\xA2\x73\x8C\xA5\x9E\xA3\x77\x86\xA5\xA0\xA4\x7F\x94\xA1\xA2\x74\x96\x87\xA8\xA7\xA6\xE7\x5C\xA3\x7D\xA6\x93\x9E\xA3\xA2\xA4\x84\xA5\xA4\xAB\xA9\xA0\xA6\xA9\xA8\xAA", "\xA2\x89\xAD\xAB\xA2\xAF\x8D\xA1\xAF\xA3\xB3\x91\xAB\xAB\xAD\xB5\x95\xA9\xAF\xA5\x9D\xBD\xAF\xA7\xAE\x9A\xBE\xA3\xA8\xAE\xC2\xAE\xA5\xB0\xAC\xC7\xB2\xA9\xB0\xAD\xCB\xB6\xA0\xB1\xA8\xCD\xBA\xA1\xB4\xAF\xBF\x93\xB1\xB1\xB5\xD8\x83\xBF\xB2\xAA\xDB\xAC\xA6\xB4\xB4\xD9\x86\xB1\xB8\xB2\xE3\x8A\xB5\xB8\xB3\xE7\x8E\xBF\xB4\xB7\xEB\x9E\xB9\xBA\xB4\xEF\x94\xBA\xB5\xBB\xC4\xB1\xB7\xB7\xBC\xF6\xA0\xB8\xBF\xBE\xE2\xBC\xB4\xBA\xBF\xE6\x80\xC8\xBA\xC0\xEA\xB9\xBC\xBA\xC1\xEE\x84\xC0\xBE\xC2\xF2\xBD\xBE\xC3\xBF\x0F\xC1\xC1\xC7\xC0\x13\xC5\xCC\xC3\xBD\x15\xCB\xC9\xC5\xC3\x10\xDD\xC2\xC6\xC7\x14\xE0\xC6\xC7\xC6\x18\xE2\xCA\xC6\xC9\x1C\xDF\xCA\xC9\xC8\x2B\xE3\xC8\xC9\xC9\x2D\xE7\xC1\xCD\xCA\x2C\xF5\xCE\xCB\xCC\x30\xF6\xC2\xCE\xCE\x34\xC5\x90\x06\x9E\xFA\xA4\xC1\xD3\xCB\x38\x91\x02\x86\x04\x01\xB4\xBD\xB5\xBD\x17\xC3\xD8\xCE\xD3\x3C\xF9\xC7\xCD\xD4\x50\xD3\xD6\xD7\xCE\x57\xFD\xC8\xD7\xD6\x5A\xDD\xD2\xD4\xD7\x5F\xDE\xD5\xD4\xD8\x63\xE2\xD7\xC1\xD3\x67\xC2\xD9\xD8\xD1\x6B\xCF\xDD\xD8\xD5\x6F\xD9\xD1\xDB\xDC\x65\xF4\xD1\xDC\xD9\x77", "\xE6\xD9\xC2\xDA\x7B\xEC\xDD\xDE\xDB\x7F\xF0\xD1\xE2\xDC\x75\xC5\xE9\xDE\xDD\x83\xFC\x88\x06\x84\x19\x09\xD8\xC0\xD3\x7C\xD0\xEE\xDE\xE4\x80\xD4\xE2\xE2\xE5\x84\xC7\xE6\xE1\xE2\x7A\xD8\xE8\xDC\xE7\x88\xDE\xED\xE7\xD2\xA4\xCA\xD6\xEB\xE3\xA5\xE8\xE7\xE8\xDA\xA0\xDB\xE2\xE9\xE8\xA9\xEC\xEF\xEA\xEB\xB1\xD1\xE5\xEF\xE4\xB7\xD5\xE9\xEF\xE5\xBB\xD9\xED\xEA\xE6\xC0\xFF\xE2\xF3\xEC\xC1\xC4\xF3\xF1\xEF\x3B\xDF\x02\x84\x08\x8E\xF2\xE8\xF3\xE8\xAB\xF6\xE1\xF4\xEE\xD3\xFA\xE5\xF4\xEF\xD7\xFE\xE6\xF3\xF6\xCF\xF0\xE9\xF7\xE7\xDC\xDF\xF0\xF6\xEA\xE4\xCE\xF2\xFA\xF7\xE5\xD2\xF9\xF8\xF5\xEB\xD6\xFD\xF8\xF6\xEF\xDA\xFD\xF4\xED\xE7\xF4\xF1\xFC\xF8\xF3\xC5\xF9\xFF\xF1\xF5\xFA\xFD\xFC\xFF\xF7\x63\x7E\xF9\x01\x88\x7D\x01\x86\x82\x7D\x06\x26\x04\xD0\x7E\x74\x80\xFB\x46\x27\x04\x0B\x81\x70\x0A\x12\x49\x04\x09\x6A\x02\x42\x2B\x12\x40\x0B\x12\x4D\x04\x09\x6E\x02\x42\x2F\x12\x40\x0C\x12\x41\x06\x09\x4C\x25\x3B\xFF\x61\x7D\x03\x8C\x87\x80\xF6\x6D\x86\x7D\x06\x33\x05\x04\xAA\x86\x20\x1A\x33\x83\x7F\x34\x88\x82\x0E\xAE\x8B\x86\x18\xBD\x80", "\x7E\x2F\x80\x8B\x0F\xF2\x79\x84\x1C\x86\x8D\x88\x48\x89\x21\x0D\x37\x89\x89\x20\x84\x8B\x85\x00\x8E\x88\xFE\x4D\x83\x89\x9D\x76\x04\x89\x50\x96\x72\x43\x28\x8F\x7C\x1C\x18\x8A\x60\x39\x12\x42\x0E\x12\x4B\x06\x09\x50\x24\x8B\x06\x3D\x06\x84\x3E\x02\x43\x1F\x12\x40\x08\x12\x41\x0A\x84\x42\x02\x43\x21\x1F\x8D\x8A\x02\x98\x8D\x01\xFA\x8E\x81\x1F\x84\x0F\x8E\x3C\x82\x21\x11\x00\x9E\x87\x40\x85\x97\x90\x42\x86\x91\x22\x88\x9F\x88\x29\xB9\x8A\x91\x8D\x9C\x8C\x0B\x92\x91\x8A\x4A\x96\x76\x08\x84\x8B\x92\x26\x91\x90\x93\x29\x99\x8F\x88\x9F\x94\x89\x27\x8F\x98\x91\x23\x19\x94\x93\x8C\x9E\x92\x23\xFB\x83\x94\x56\xA9\x94\x94\x9B\x8A\x96\x25\xA0\x9B\x95\x3E\xAD\x96\x96\xAF\x8E\x95\x2C\xB0\x98\x95\x5D\xBA\x95\x97\xC0\x92\x97\x2D\x93\x93\x99\x4A\x85\x99\x87\xC7\x93\x54\x42\x6F\x3A\x21\x24\x0D\x7B\x96\xA2\x99\x94\x2E\xBE\x93\x9B\x60\xBC\x92\x98\xD2\x84\x99\x36\xC6\x9B\x9A\x64\x9D\x9C\x96\xD0\x81\x96\x38\xB5\x9A\x9A\x6A\xA5\x9E\x9A\xBF\x98\x9A\x39\xDC\x9B\x9C\x6F\xAD\x98\x9C\xC9\x91\x9B\x3B\xF2\x98\x9D\x6A\xAA\x9D\x9E\xE7\x97", "\x9E\x3E\xD7\x9C\x9F\x74\xBD\x9E\x9E\x3E\x4F\x0B\x29\xFB\x9E\x9F\x82\x80\xA6\xA0\xF9\x9F\x9D\x42\x88\xAC\x9C\x7C\x8D\xA4\xA0\x07\xB1\xA3\x42\x92\xAF\xA0\x85\x95\xA4\xA1\xEE\x8E\xA1\x46\x90\xA3\xA3\x8E\x97\xA4\xA2\x1B\xBE\x44\x14\x12\x42\x23\x84\x02\x43\x9C\xE1\x84\x9F\x47\x9E\xA1\xA4\x8C\xB0\x9F\x9B\xF4\x9C\xA3\x4A\xB3\xAD\xA4\x90\xAF\xA3\x9E\x28\xB1\x9D\x4E\xB0\xAB\xA6\x9C\xAA\xA5\xA6\x2C\xB7\xA6\x46\xC2\xA2\xA6\xA0\xB4\xA4\xA8\x16\xA6\xAA\x52\xB7\xA7\x0A\x09\x58\x0F\x99\x3A\xBF\xA4\x52\xAE\xA1\xA7\xA4\x93\xAE\xA6\x55\xB4\xA9\x4F\xC3\xA9\xAA\xAC\x9B\xAD\xA8\x57\xA1\xA9\x57\xE2\xAF\xAA\xAB\xA3\xAF\xA8\x67\xAB\xA9\x5A\xE1\xA8\xAD\xB2\x9A\xAA\xAA\x6B\xB1\xAE\x5B\xDE\xA0\xAF\xB9\xAF\x68\x23\x68\x89\xA6\x5E\x8A\x9F\x0A\x09\x60\x09\x93\x61\x12\x42\x18\x12\x43\x0C\x09\x64\x0A\x42\x65\x12\x42\x19\x12\x47\x0C\x09\x68\x0A\x42\x69\x12\x42\x1A\x12\x4B\x0D\x81\xA6\xAE\xAE\x6D\xB5\xAE\x66\x83\x2C\x0C\xCB\xB9\x65\x0D\x9E\xB4\xAF\x5E\xBC\xAB\xB3\xA8\xA3\xB6\xA7\xA7\xBC\xA8\x66\xEA\xAB\xB5\x9B\xAE\x09\xB4\x64\xA5\xB4\x69\xA9", "\xB0\xAC\xB9\xB2\xB5\x66\x6F\x10\xB5\x66\xA7\xB0\x0E\xDD\x8E\x51\x0E\x12\x52\x0E\x84\x00\x29\xAE\x81\x34\x0A\x42\x75\x12\x42\x1D\x12\x47\x0E\x09\x78\x0A\x42\x79\x12\x42\x1E\x12\x4B\x0E\xDF\xAC\xAC\xB5\xB7\xAA\xB5\x10\xFC\x06\xBB\x65\x7D\x0D\xBB\xAD\xB6\xB4\x6D\x97\xB9\xBB\xDA\xA1\xBF\xBC\xE5\xA4\xBF\x78\xB9\x6E\x0E\xF0\xA9\xBF\xAD\xEB\xA2\xB6\x69\xF3\xB3\xB6\x90\x7F\x0E\xBD\xF1\xA5\x9C\x20\x78\xB2\x21\x40\x12\x42\x10\x12\x43\x12\x84\x04\x12\x43\x42\x12\x46\x10\x12\x47\x12\x84\x08\x12\x43\x44\x12\x42\x11\x12\x4B\x10\x7F\xF5\xB4\xC2\xD4\xB4\xBE\xC2\x2B\x6C\x13\x84\xB5\x6D\x11\x0D\xDA\xB9\xBF\xBB\xB7\xC3\x87\xA2\xC6\xBD\xF7\xB2\xBD\xC2\x23\xD5\xC2\x23\x1E\xC5\xC5\x89\x4F\x12\x42\x90\x10\xA8\x8A\xAD\xC4\xC4\xF5\xB5\xC0\xBE\x37\xC7\xC4\x86\xBB\xC9\xC4\x1E\xF4\xC3\xC6\x36\xC0\xC8\x8E\xC2\xCA\xC7\x1E\xC6\xCF\xC7\x3E\xC1\xC9\x92\xC3\xCB\xC9\x22\xC8\xCF\xC8\x4A\xD0\xC8\x93\xD2\xCE\xC9\x28\xC8\xCE\x12\x2C\xD6\xCA\x96\xD3\xCF\xC9\x2E\xDB\xCD\xCA\x5C\xDF\xC9\x6C\xA0\xC8\xBA\x32\xD7\xBF\xCC\xE2\xB9\xC7\x98\xEA\xC1\xC4\x22", "\xEB\xCE\xCD\x6D\xCD\xCB\x9B\xF2\xC1\xCE\x2A\xF3\xCD\x97\x97\x19\xC8\x93\x98\x1A\xCE\x30\xFE\xCF\xCE\x5E\xC1\xCE\xA0\xFF\xC5\xCF\x40\xC4\xD5\xCC\x6C\xC8\xD0\x9C\x8A\xD4\xCE\x46\xF6\xCD\xD0\x62\xD0\xD3\xA0\x80\xD1\xD2\x47\xC6\xD4\xD2\x93\xD1\xCD\x26\x7D\xC8\xD3\x43\xE8\xC8\xBD\x66\xC9\xCF\xA2\x9F\xD6\xC5\x4E\xE6\xD2\xD2\x9E\xC2\xD5\xA3\xA4\xD1\xD4\x50\xC9\xD4\xD5\xAF\xCB\x5A\x26\x12\x4B\x12\x19\xEB\xD2\xD5\x8F\xD6\xD1\xA5\xB0\xD3\xD4\x5C\xD7\xD0\xD5\xA7\xDA\xD5\xA6\xC2\xD9\xD4\x57\xFD\xD6\xD8\xB7\xC8\xD9\xAE\xBC\xD9\xD9\x52\xC0\xDF\xD9\xC4\xC1\xDB\x6C\x21\x12\x42\x51\x36\xD3\xD9\xBE\xDB\xD5\xB6\xC3\xDC\xD8\x6C\xCA\xDF\xD7\xD1\xD0\xD9\xB7\xE0\xD3\xDC\x6D\xDF\xDE\xDC\xCE\xC1\xDE\xBA\xE5\xDC\xDB\x6D\xC5\xD9\xDD\xEC\xD8\x44\x2A\x12\x49\x15\x6B\xE4\xDE\xDD\xD2\xD8\xDE\xB8\xFA\xDB\xDC\x7E\xF1\xD9\xDF\xE7\xCD\xDD\xC0\xEF\xDD\xD4\x78\xFE\xDF\xE0\x03\xE0\xE2\xC1\x89\xEB\xDE\x86\xFD\xDE\xE1\xFF\xCD\xE3\xC2\xB7\xBF\x14\x4E\xD2\xE3\x62\xB0\x1B\xC1\x2C\x12\x42\x16\x09\x73\x12\x42\xB4\x12\x41\x2D\x12\x46\x16\x09\x77\x12\x42", "\xB8\x12\x41\x2E\x12\x4A\x16\x09\x7B\x16\xE2\x0F\xF3\xE1\xC1\xA7\xBC\x16\x98\xF3\x35\x17\x36\xE8\xE2\xCC\xB1\xD0\xE2\x9D\xF3\xE4\xE7\x3B\xE7\xD9\x10\xBE\x19\xE6\x64\xFF\x12\x42\xC0\x16\xDC\xBA\xBF\xE2\xE8\xA6\xCD\xDE\xE9\xDE\xC1\xEB\xD3\xC0\xE0\xEB\x7B\xFD\xE7\xEA\x52\xF1\xE9\xD5\xCB\xE4\xEB\xAE\xCD\xEE\xEB\x53\xFF\xEA\xD8\xE1\xE4\xEC\xAD\xE0\xEE\xEC\x63\xE8\xEE\x26\xC6\x15\xE9\xAC\xD6\xEE\xED\x5C\xE9\xEF\xDB\xDB\xE2\xE0\xB8\xF5\xEC\xEE\x04\xE7\xEF\xDC\xFA\xE1\xEF\xB2\xFB\xEA\xEE\x7D\xEA\xEE\xE0\xFF\xEE\xEE\x58\x87\x1D\xED\x78\xEA\xE1\xE2\x97\xEC\xEF\xBB\xCD\xF1\xEF\x80\xEE\xF1\xE4\x90\xF5\xF0\xC9\xD5\xF4\xF2\x83\xE1\xF0\xE1\xD3\x68\x18\x09\x49\x1A\xE9\x96\xF9\xF1\xE8\x9B\xF4\xF4\xCD\xE6\xF3\xF4\xA7\xF8\xF1\xE9\xA8\xFC\xF4\xD5\xE9\xF2\xF1\x8F\xF0\xF7\xE4\xB2\xF7\xF2\xDA\xE2\xF3\x9A\xCF\x12\x40\x34\x20\xFE\xF5\xD6\xF6\xF3\xF5\xBD\xE1\xFB\xEF\xAF\xFC\xF1\xD9\xC5\xFD\xF6\xC7\xF7\xF7\xF0\xBE\xF9\xF8\xE0\xCB\xFA\xF8\xCD\xE4\xF9\xCC\xBF\x86\x1A\x09\x57\x1C\xF7\xCF\xF9\xF9\xF4\xCC\xF3\xFB\xD8\xDB\xF8\xFA\xDD\xE6\xF9", "\xF8\xC8\xF3\xFC\xE5\xDF\xFA\xFB\xE5\xEE\xFB\xF9\xEB\xF9\xFC\xE9\xD1\xE6\x9D\xDD\x12\x42\x37\x58\xFC\xFD\xF7\xF6\xFE\xE7\xDE\xED\xFC\xF7\xF7\xF8\xEB\xC5\xFA\xF8\xFC\xFC\x76\x77\x00\x88\x7F\xE2\x71\x80\xFE\x76\x80\xF9\x78\x80\x63\x74\x0E\x12\x25\x0E\xF4\x7F\x7F\xE8\x7A\x80\xE4\x72\x81\xE6\x70\x81\xF5\x74\x80\x13\x88\x81\x15\x84\x81\xEA\x76\x81\x1E\x8C\x81\xEE\x7A\x81\x1D\x80\x82\xFB\x72\x82\x21\x8D\x7F\x09\x86\x82\x25\x88\x82\x05\x8A\x82\x03\x8C\x82\x19\x80\x83\x1B\x8E\x82\x11\x84\x83\x17\x82\x83\x23\x8A\x10\xEB\x08\x78\x60\x7C\x0E\x12\x2D\x0E\x0F\x84\x82\x2F\x82\x80\x35\x88\x83\x27\x84\x84\x37\x88\x84\x1F\x86\x83\x4B\x86\x84\x2B\x8A\x84\x42\x85\x84\x50\x8C\x84\x51\x89\x84\x3F\x43\x0F\x12\x24\x0F\x41\x84\x85\x5C\x8E\x84\x43\x87\x80\x5D\x83\x85\x5E\x82\x85\x60\x83\x86\x56\x89\x82\x66\x8D\x84\x62\x8B\x86\x65\x8C\x86\x68\x8E\x86\x2D\x89\x86\x55\x83\x7E\xFA\x0C\x83\x88\x4B\x0F\x1B\x6E\x11\xC5\x58\x48\xFD\x02\x21\xFE\x05\x21\x12\x2A\x1F\xCC\x4D\x1D\x30\x1E\x1D\x02\x05\x88\x0A\x13\x00\x88\x89\x10\x04\x0B\x88\x06\x15", "\x00\x8E\x83\x10\x06\x01\x89\x02\x17\x00\x94\x81\x87\x70\x81\x83\xB7\x50\x12\x7B\x8B\x63\x09\x07\x89\x9A\x8D\x86\xA2\x8F\x86\xA3\x88\x89\xA5\x81\x8A\x60\x7A\x00\xA0\x83\x83\x72\x81\x86\xA7\x8C\x8A\xB7\x5B\x00\xAB\x89\x83\xAD\x85\x8B\x99\x80\x8B\xAF\x84\x8B\xB7\x8A\x8B\xB9\x87\x84\xBD\x8F\x84\xBF\x8F\x85\xA4\x8A\x48\x0C\x00\x8A\x0D\x00\x13\x27\x5B\x8B\xBE\x83\x8C\xA6\x8C\x8C\xA8\x8D\x8C\xD0\x8F\x8C\xD2\x88\x8B\xCE\x84\x8D\xD1\x86\x8D\xD3\x8C\x8B\xD5\x8A\x8D\xD7\x8C\x8D\x3B\x63\x01\xA0\x84\x01\xC8\x8E\x8A\xDB\x8B\x8C\xDD\x86\x8E\xD9\x88\x8E\xD8\x8B\x8E\xDE\x8C\x8E\xEA\x8D\x8E\xF0\x8F\x8E\xF2\x80\x8C\xE5\x84\x8F\xD1\x8A\x01\xA0\x8B\x01\xE3\x86\x8B\xC1\x84\x86\xF5\x82\x8C\xE7\x86\x8F\xE9\x82\x90\xEE\x84\x90\xF1\x86\x90\xF3\x80\x90\x03\x9A\x90\x05\x9C\x90\x07\x9E\x90\x09\x9E\x8F\x01\x9A\x63\x21\x03\x8B\x11\x97\x86\x13\x92\x91\x0B\x9A\x91\x0D\x9C\x91\x0F\x9E\x91\x17\x9A\x86\xFD\x88\x91\x1B\x94\x92\x53\x32\x02\x16\x98\x90\x2A\x90\x91\x2B\x90\x92\x2D\x96\x92\x1F\x90\x93\x21\x93\x87\x34\x94\x8E\x19\x92\x93\x2F\x92\x92", "\xFF\x8E\x92\x2C\x9D\x93\xB4\x73\x02\x29\x9E\x93\x38\x92\x94\x3A\x97\x93\x45\x95\x92\x47\x9D\x91\x43\x9C\x93\x4C\x9B\x94\x4E\x99\x94\x31\x90\x95\x33\x96\x93\x9A\x44\x02\x41\x9D\x94\x52\x99\x93\x35\x9C\x8F\x3B\x9F\x94\x5B\x9A\x8C\x5A\x94\x95\x4A\x99\x95\x44\x9F\x95\x23\x94\x96\x58\x96\x96\x5D\x9E\x28\x25\x07\x95\x5E\x92\x96\x51\x9A\x96\x46\x92\x97\x48\x94\x97\x63\x96\x97\x71\x90\x97\x53\x9C\x95\xD1\x86\x02\x6E\x98\x96\x6F\x9C\x97\x75\x9A\x97\x61\x92\x98\x77\x94\x98\x65\x98\x98\x69\x9A\x98\x81\x90\x96\x89\x96\x98\x79\x90\x99\x7B\x9E\x98\x8B\x99\x10\x27\x0F\x97\x78\x93\x99\x67\x99\x99\x85\x94\x99\x8D\x9B\x99\x8C\x90\x98\xA2\x9C\x99\x8F\x9E\x99\x96\x38\x02\xA0\x89\x02\xFB\x86\x9A\xA4\x95\x99\xAC\x91\x9A\xAD\x9F\x99\x6B\x91\x9B\xA3\x90\x9B\xB6\x92\x99\x9D\x90\x9A\xB8\x95\x9A\xBA\x9F\x9A\xBB\x9E\x9A\xBD\x97\x5A\x2F\x08\x99\xB7\x9E\x9B\xC6\x91\x9C\xB3\x95\x9C\xC8\x93\x97\xCA\x99\x9C\xBF\x92\x9B\xCC\x9F\x9C\xB5\x92\x9D\x37\x50\x03\xC4\x94\x9D\x0A\x11\x03\xD7\x92\x30\x32\x00\x8A\x33\x00\x8A\x34\x00\x8A\x29\x1D\x89\x36", "\x00\x8A\x37\x00\x8A\x38\x00\x8A\x39\x00\x8A\x3A\x00\x8A\x2C\x1D\x89\x3C\x0B\x9D\xCB\x93\x98\x30\x8D\x03\xF2\x9A\x48\x3E\x07\x9F\xD1\x97\x9C\xCE\x9C\x9F\xFB\x93\x9F\x87\x99\x10\x3F\x0A\x9F\xF4\x97\x5B\x40\x00\x8A\x2F\x1D\x89\x01\xAE\x9F\x35\x32\x04\x04\xAD\x4B\x43\x04\xA0\x44\x04\xA0\x45\x0F\xA0\x91\x9C\xA0\x3D\x66\x04\xA0\x82\x13\x9D\x88\x04\xA0\x89\x04\xA0\x8A\x04\xA0\x8B\x04\x04\xAC\x04\xA0\x84\x13\x09\x19\x1F\xBD\x40\x05\x30\x16\x1F\x52\x0D\xA2\x0A\x14\x05\xA0\x86\x13\x9D\x86\x05\x16\xAE\x23\x57\x00\x8A\x58\x07\xA3\xB9\x9D\x9F\x00\xA8\x64\x59\x00\xA3\x09\x18\x13\x09\x16\x1F\x0B\xA7\x5A\x5D\x0C\xA3\x50\x3A\x13\x9D\x8F\x05\xA0\x80\x06\xA0\x81\x06\xA0\x82\x06\xA0\x83\x06\xA0\x8C\x13\x0A\xA7\xA1\x3F\xAA\x99\x3E\xAD\xA5\xFF\x9E\xA5\x05\xAB\xA5\x3D\xAF\xA5\x64\xA1\xA6\x60\xA7\xA4\x67\xAA\xA5\x69\xA8\x8E\x65\x0A\xA4\xC0\x9B\xA6\x96\x76\x06\x6E\xA0\x9D\x66\xA5\xA6\x68\xA6\xA7\x6A\xA8\xA7\x5C\xAA\xA7\x63\xA5\xA7\x7E\xA7\xA7\x7F\xA9\xA7\x35\x37\x06\xA0\x88\x06\x73\xA3\x9D\x0C\xA9\x06\x87\xAB\x3B\x6A\x04\xA0\x6B\x04", "\xA0\x3E\x19\xA5\x7B\xA1\xA8\x7D\x7D\x06\xA0\x8E\x06\xA0\x8F\x06\xA0\x80\x14\x9D\x81\x07\xA0\x82\x07\x04\xA3\x07\xA0\x84\x07\x30\x1A\xA2\xEA\x47\x07\x42\xA6\x10\x79\x09\xAA\x03\x1B\x07\xA0\x8C\x07\xA0\x8D\x07\x8B\xAA\x10\x42\x1D\x89\x7F\x03\xAB\xD8\x99\xAB\x18\xAB\x33\x80\x0C\xAA\x02\x12\x08\xBE\xAC\xA7\x3A\x64\x08\xB8\xA2\x30\x85\x00\x8A\x86\x00\x8A\x87\x00\x8A\x88\x00\x8A\x89\x00\x8A\x8A\x00\x8A\x8B\x05\xAC\x03\x1C\x08\xD4\xA0\xA7\xBC\x98\xAD\x6F\xA2\xAC\xDB\xA4\xA9\x7D\xA0\xA8\xE0\xA2\xA8\xE1\xA3\xA9\xE3\xAF\xAD\xE2\xA7\xAE\xE4\xA8\xAE\xE6\xA9\xAE\xEC\xAB\xAE\xEE\xA9\xAD\xDC\xA4\xA7\xE5\xA0\xAF\xDE\xA4\xAF\xF3\xA4\x7B\x8D\x07\xAD\xF1\xA8\xA8\x62\xA6\xAF\xEA\xAE\xAF\xED\xA0\xB0\xEF\xAD\xAD\xF7\xA2\xAF\xFF\xA4\xB0\x07\xB6\xB0\x01\xB8\xB0\x3E\x2E\x08\xA0\x8F\x08\xFA\xA5\xAF\x1A\x90\x09\x11\xB3\x35\x91\x04\xA0\x92\x04\xA0\x93\x05\xB1\x09\xBC\xAF\x8A\x44\x09\xA0\x85\x09\xA0\x86\x14\x9D\x87\x09\xA0\x88\x09\xA0\x89\x09\x04\xAA\x09\xA0\x8B\x09\xA5\xA2\x4F\x9E\x01\xAC\x00\x00\x0A\x32\xB8\x14\x9D\x83\x0A\xA0\x84\x0A", "\x11\xB5\x0A\xA0\x86\x0A\x1C\xBB\xB0\x0A\xB3\xB0\x74\x2A\x14\x45\xAA\x10\xA9\x02\xB3\x05\xBE\x4E\xAB\x0F\xB3\x40\x2C\x0A\xA0\x8D\x0A\xA0\x8E\x0A\xA0\x8F\x0A\xA0\x80\x0B\xA0\x81\x0B\xA0\x82\x0B\x11\xB3\x0B\x4C\xB2\xB0\x5E\xBC\xB0\x42\xBE\xB1\xFB\xA4\x9B\x64\xBD\x9C\x63\xB6\xB6\x12\xB1\xB4\x5F\xBA\xB6\x60\xBB\xB6\x62\xB2\x8D\xB4\x0D\xB5\x6D\xB3\xB7\x6C\xB5\xB7\x6F\xB9\xB4\x65\xBA\xAB\xFD\xA4\xB7\x77\xBD\xB1\x79\xBB\xAB\x40\xBD\xB7\x81\xBF\xB7\x7B\xB6\xB7\x84\xBE\x8C\xB5\x02\xB7\xC7\x76\x0B\x8A\xB2\xB8\x61\xB7\xB8\x67\xBA\xB7\x8A\x47\x0B\x8D\xB3\x1B\xB8\x05\xB9\xD7\x39\x0B\x98\xB2\xB9\x91\xB0\xB8\x8F\xB8\xB6\x78\xB0\xBA\x7E\xB2\xBA\x83\xB4\xBA\x9F\xBC\xB9\x69\xBE\xB8\x6E\xB0\xB9\xA9\xBC\xBA\xA1\xB8\xBA\xAF\xBE\xB9\xAB\xB6\xBA\xB3\xB0\xBB\xA3\xB6\xBB\xA5\xB2\x98\xBA\x0B\xB9\x52\x7B\x0B\xBC\xB5\xB8\xAA\xBC\xB7\xAE\xB7\xBB\xB2\xB2\xBC\xB4\xB6\xBC\xB8\xB7\xBA\xC5\xB6\xB8\xC7\xBC\xBC\xC9\xB5\xBB\xCB\xB7\x94\xBC\x0F\xBB\xDA\xAE\xBC\xD1\xB3\xBC\xB9\xB7\xBD\xCD\xB1\xBC\xD6\xB0\xBC\xD8\xBA\xBC\xDE\xBB\xBD\xDF\xB4\xAF\xBD", "\x04\xA0\x4C\x12\xA9\xE0\xB5\xBD\xDC\xBB\xBE\xE3\xB8\xBC\xDA\xBF\xBC\xEE\xB1\xBE\xF0\xBD\xBD\xEA\xBD\xBE\xF4\xBD\xB9\xF2\xBF\xBE\xFA\xB9\xBF\xFC\xB5\xBF\xE2\xBF\xBF\xF3\xBC\xBE\x68\xBF\x0B\xD4\xB8\xBF\xFE\xB1\xC0\xF6\xBE\x28\xC0\x05\xC0\xAD\xB0\xC0\xFB\xB7\xC0\x0F\xC6\xC0\x12\xCD\xC0\x08\xCE\xC0\xFD\xB3\xC1\x4E\x18\xBE\xD0\xB7\xC1\x14\xC1\xC1\x1D\xCC\xC1\xB1\xB0\xC2\xC4\xB2\xC2\xD9\xB4\xC2\xE9\xB3\xC1\x21\xC0\xC1\x26\xCB\xC1\x2A\xCE\x8C\xC2\x0C\xC0\x29\xC8\xC2\x23\xCD\xC2\x32\xC5\xC2\x34\xCF\xC1\x37\xC1\xC3\x38\xC5\xA6\xC3\x00\x8A\xC4\x00\xC3\x33\xC5\x61\xC5\x00\xC4\x3E\x26\x0C\x04\xA7\x0C\x04\xA8\x0C\x44\xC7\xC2\x3B\xC0\x00\xC9\x00\x8A\xCA\x00\x8A\xCB\x00\x8A\x50\x1D\x89\xCD\x00\x8A\xCE\x04\xA0\xCF\x00\x8A\xD0\x0F\xB2\x3D\x53\x0D\x32\xB5\x0D\x32\xB7\x0D\xA0\x88\x0D\xA0\x89\x0D\x11\xBA\x0D\xA0\x8B\x0D\x4B\xCC\xC2\x35\xC2\x90\xDC\x02\xB3\xDE\x08\xB4\x41\xCA\x49\x52\x1A\xC1\xE5\x41\x0E\xA0\x82\x0E\xA0\x83\x0E\xA0\x84\x0E\xA0\x85\x0E\xA0\x86\x0E\xA0\x87\x0E\x11\xB8\x0E\x6D\xC1\xBF\x39\xC5\xC7\x3A\xCD\xC8\x8C\xCF", "\xC8\x36\xCF\xC6\x6E\xCD\xC4\x8E\xC1\xC9\x94\xC0\xC9\x4C\xC5\xC9\x99\xCB\x33\xE9\x09\xC8\xF7\xB7\xC9\x96\xCA\xC9\x93\xC2\xCA\x8A\xC2\xC9\xA5\xC0\xCA\x9B\xC1\xCA\x98\xC3\xCA\xEA\x4A\x0E\x9E\xC2\xC0\x15\xC1\xCB\x1E\xC4\xCA\x9F\xC4\xCB\xB0\xC3\xCB\xAB\xC7\xCA\xB6\xC9\xC0\xB3\x2B\x0E\xAF\xCC\x6C\xEC\x01\xB1\xED\x00\x8A\xEE\x00\x8A\xEF\x00\x8A\xF0\x00\x8A\xF1\x00\x8A\xF2\x00\x8A\xF3\x00\x8A\xF4\x00\x8A\xF5\x00\x8A\xF6\x00\x8A\xF7\x0F\xCB\x16\xC0\xA6\xF8\x0C\xC0\xF9\x08\xCD\xB2\xCB\xC2\xBA\xC9\xCB\xB5\xCC\x23\xFA\x0E\xCD\x0C\xAB\x0F\xA0\x8C\x0F\xE6\xC0\xCE\xEC\x4D\x0F\xEB\xC2\x10\xFE\x0F\xA0\x04\xA0\x00\x64\x11\x1F\xE2\xC7\xCB\x3F\x41\x00\xF5\xCA\x10\x02\x0B\xCF\x29\xAE\xCF\x06\x14\x00\x00\xD3\x10\x05\x03\xD0\x02\x16\x00\x06\xDB\x32\x07\x09\xD0\x00\x04\x15\x29\xA2\x4F\x0B\x04\x16\xF6\x1D\x00\x12\xDA\x10\x0F\x0C\xD0\x10\x0C\xD0\x57\x18\xC7\x81\x32\x01\x0C\xD3\x01\x0C\xDB\xCB\xD9\xC3\xC1\x14\x05\xD1\x09\x16\x01\x26\xD8\xCB\xB0\x48\x01\x21\xDA\x4E\x19\x0C\xD0\x1A\x0C\xD0\x5A\x1D\x89\x1C\x0C\xD0\x1D\x0C\xD0\x1E\x0C\xD0", "\x1F\x0D\xD2\x34\x30\x02\x3C\xD9\xCA\x40\xDC\xCA\xAA\xC3\xD4\x41\xD1\xCE\x44\xD2\xD4\x45\xD3\xCE\x47\xD6\xD4\x49\xD8\xCF\x8B\xCB\xD4\x4A\xD9\x33\x21\x0F\xD3\x48\xD5\xD5\x4C\xD6\xD5\x51\xD8\xD5\x4E\xD6\xCA\x59\xD7\xD5\x5E\xDD\xD5\x60\xDB\xD5\xA8\xCA\xD5\xBC\xC3\xD2\x63\xDF\xD5\x62\xD2\xD2\x82\x9D\x15\x1C\xD9\xD6\xF7\xC5\xD6\xDF\xCF\xD4\x4D\xD3\x2B\x23\x04\xD5\x68\xD0\xD7\x2A\xD3\xD7\x66\xDA\xD6\x79\xD4\xD6\x7B\xDF\xD6\x18\x84\x02\x76\xD1\xD6\x78\xDC\xCE\x6E\xD0\xD5\x87\xDA\xD7\x71\xDC\xD5\x89\xDE\xD7\x8B\xD7\xD6\x84\xDF\xD7\x88\xD5\xD8\x8A\x45\x02\x83\xDE\x4E\x26\x07\xD9\x94\xDC\xD8\x9B\xD0\xD9\x8D\xD7\xD7\x92\xDA\xD8\x7D\xD0\xDA\x8F\xDC\xD7\x86\xDD\xD9\xA6\xD2\xD7\x8E\xD3\xDA\x91\xD5\xDA\x80\xDE\xDA\x93\xD1\xDA\xF4\xA7\x02\x9A\xD2\xDB\xA4\xDC\xDA\x9F\xDD\xDA\xB8\xD8\xDA\xAF\xDB\xDB\xB6\xDA\xDB\xA7\xDF\xDB\x62\xD8\x02\xB5\xD0\xDB\xA2\xD1\xDC\xC6\xDB\xDA\xC8\xDE\xDB\xC9\xD7\xDB\xCB\xDF\xDC\xAA\xDE\xDC\xD1\xD0\xDC\xD3\xD9\xDB\x96\x39\x02\xC5\xD1\x44\x2A\x09\xDD\xD0\xDC\xD9\xC2\xDC\xDB\xB1\xDD\xDC\xD4\xDE\xDD\xE2", "\xD6\xDD\xE0\xD7\xDC\xD5\xD7\xDE\xCA\xD9\xDE\xDF\xDD\xDE\xE5\xDA\xDE\xD2\xD4\xDE\xCC\xD3\xDF\x13\x30\x16\x6D\xD0\xDF\xE3\xDE\xD9\xF8\xD6\xDE\xEE\xD4\xDF\xEC\xDF\xDE\xFD\xDD\xDD\xFA\xD1\xE0\xCE\x8C\x02\xDC\xDF\xDF\xFE\xD2\xDF\x02\xE9\xDA\x0A\xE8\xE0\x0B\xED\xDB\x0F\xE1\xDE\x09\xE3\xE0\x00\xE5\xE1\x13\xEC\xE0\x14\xE7\xE1\x48\x6D\x02\x07\xE3\x76\x2E\x0D\xE1\x19\xE1\xE1\xE8\xDD\xE0\x24\xE1\xE2\x0E\xE7\xE2\x25\xE8\xE1\x2A\xE0\xE1\x28\xE6\xE2\x29\xEC\xE2\x2F\xE2\xE1\x22\xEB\xDE\x31\xEC\x64\x2F\x00\xE2\x2B\xE2\xE3\x2D\xE9\xE3\x23\xEE\xE2\x3E\xEC\xE3\x34\xEF\xE3\x30\xE2\xE4\x3A\xE5\x61\x30\x08\xE3\x43\xE0\xE4\xF1\xD4\xE4\x3D\xEA\xE4\xF9\xDE\xE4\xFC\xD6\xE1\x33\xEB\xE4\x50\xEB\xDF\x56\xE4\xE0\x35\xE1\xE4\x3A\xC1\x03\x48\xE5\xE4\x4C\xEA\xE5\x49\xE1\xE6\x5E\xE5\xE5\x58\xEF\xE5\x61\x23\x16\xF7\xD2\x4F\x33\x00\xE2\x34\x00\xE2\x35\x0D\xE5\x4D\xE3\xE4\x36\x0C\xD0\x37\x0C\xD0\x66\x1D\x89\x39\x0C\xD0\x3A\x00\xE2\x3B\x0C\xD0\x3C\x04\x16\xA6\xAA\x64\x3F\x09\xD2\x03\x11\x04\x0C\xDA\x16\x9D\x83\x04\x70\xE8\x23\x44\x0C\xD0\x45\x0B", "\xE8\x54\xE2\xE6\x96\x76\x04\x84\xE7\x10\x95\xE9\xE5\x6F\x3A\x04\x90\xE1\x38\x4B\x0C\xD0\x6C\x1D\x89\x4D\x0C\xD0\x4E\x0C\xD0\x4F\x0C\xD0\x50\x0C\xD0\x51\x0B\xE9\x51\xEA\xE1\x63\xE2\xE9\x60\xED\xEA\xB0\xE1\xE7\xB1\xEF\xEA\xB2\xE5\xEB\xB4\xE7\xEB\x91\xE3\xEB\xB9\xE6\xEB\xBB\xE8\xEB\x4F\xEE\xEA\xBD\xE1\xEC\xBF\xE0\x4B\x52\x0A\xEA\x12\x8E\x16\x9D\x84\x05\x64\x12\x24\x52\xEB\xE3\xC0\xE3\xEC\xBC\xE0\xED\xBE\xEB\xEA\x53\xE2\xED\xC2\xE4\xED\xCE\xEA\x64\x62\x0C\xD0\x72\x19\xE6\xCD\xE3\x76\x64\x06\xEC\xD7\x35\x06\x20\xE6\x06\x20\xE7\x06\xE2\xEF\xED\x4D\xC8\x06\x0C\xD9\x06\x0C\xDA\x06\x0C\xDB\x06\x0C\xD4\x17\x9D\x8D\x06\x20\xEE\x06\x0C\xDF\x06\x80\xE2\x4F\x72\x07\xE9\x00\x04\x07\xFE\xE6\x07\x0C\xD7\x07\x0C\xD8\x07\xE9\xEA\xAA\x0C\xDA\x07\x07\xF5\xED\xD8\xE1\x8D\x7B\x0E\xEF\x78\x15\xB4\xEA\xE5\x24\x7F\x0B\xF0\x20\x30\x08\x0C\xD1\x08\x0C\xD2\x08\x0C\xD3\x08\x0C\xD4\x08\x0C\xDA\x17\x9D\x86\x08\x16\xF1\x10\x87\x0C\xD0\x88\x0B\xEC\x65\xE4\xE6\x13\xFF\xEC\x0D\xF6\xE6\xD6\xE1\xF3\x2F\xFC\xF2\xAC\xE1\xED\x33\xFE\xF2\x57\xE8\x6C", "\x96\x05\xF2\x30\xF7\xF3\xBA\xE2\xF3\x39\xF5\xF3\xD3\xE1\xF4\x0C\xF4\xF4\x8A\x47\x09\x0C\xD8\x09\x3C\xF4\xF3\x3F\x40\x18\xDE\xE7\x5B\x9A\x00\xE2\x9B\x00\xE2\x9C\x0B\xF4\x38\xF4\x95\x9D\x0C\xD0\x9E\x0C\xD0\x9F\x0C\xD0\xA0\x0C\xD0\xA1\x0C\xD0\x82\x1F\xF4\x03\x13\x0A\x0C\xD4\x0A\xFB\xED\x53\xA7\x0E\xEF\xA9\x0E\xEF\xAB\x0C\xD0\xAC\x0C\xD0\xAD\x0C\xF3\x84\x1D\x89\xAF\x06\xF5\x3F\xFE\xF3\x4C\x60\x0B\xFE\xE2\x0B\xFE\xEC\xF4\x02\x14\x0B\x78\xF0\x24\xB5\x0C\xD0\xB6\x0C\xD0\xB7\x0C\xD0\x88\x1D\x89\xB9\x0C\xD0\xBA\x0C\xD0\xBB\x03\xF8\xD3\x4C\x0B\x0C\xDD\x0B\x92\xF7\xED\xBB\x3E\x0B\x97\xF1\x38\xBF\x00\xE2\xC0\x00\xE2\x8A\x14\xF6\xD9\xED\xE3\xC2\x0C\xD0\xC3\x0C\xD0\xC4\x0C\xD0\xC5\x0C\xD0\xC6\x0C\xD0\xC7\x00\xE2\xC8\x0C\xD0\xC9\x09\xF6\xB7\x5C\x0C\xFE\xEE\x0C\xFE\xEC\x18\x9D\x81\x0D\x0C\xD2\x0D\x3C\xF3\x0D\x0C\xD4\x0D\x9B\xFA\xF7\x43\xF2\x4F\xD5\x0E\xEF\x8E\x12\xF1\x42\xFF\x36\xD9\x03\xFC\xB3\x1A\x0D\x0C\xDB\x0D\x0C\xDC\x0D\x0C\xDD\x0D\x0C\xD0\x19\x9D\x8F\x0D\x0C\xD0\x0E\x3C\xF1\x0E\x0C\xD2\x0E\x2A\xFD\xF2\x79\xF6\xF4\x98", "\xE0\xF4\x2B\xF7\xF5\xE2\xF6\xF3\xE4\xFD\xF3\xEB\xF0\xF8\xE5\xF4\xFC\x1A\x90\x0F\xCE\xF7\xFE\xE3\xF4\xFF\xEA\xF6\xFF\xC5\xF9\xFE\xF9\xFB\xFC\xE6\xFA\xFF\xE5\x41\x0F\xF3\x7E\xFF\x7D\x7E\xFE\x70\xFF\x03\x81\xD1\x78\x7F\x98\x78\x01\x86\x81\xD1\x7B\xFF\x02\x72\x3C\x01\x80\x04\x85\xFD\x68\x7F\x08\x8A\x00\x85\x82\x05\x92\x80\xF5\x78\xD9\x33\x06\x86\x64\x0F\x10\x83\x01\x8F\x1F\xF5\x06\x03\xA0\x18\xCA\x02\xFA\x01\x0B\x3D\x00\x71\xF8\x02\x04\xAF\x7E\xBA\x49\x0F\x0C\x6A\x3E\x0C\x68\xFB\x04\xA1\x7C\x06\x86\x6D\x0F\x0C\x6A\x3F\x18\x71\x0C\x68\x00\x28\x0D\x40\x7A\x4B\x03\x00\x6A\x16\x0F\x05\x07\x07\x8A\x09\x03\x08\x1A\x5E\x0C\x02\x05\x82\x0A\x08\x33\x25\x81\x9A\x1A\x00\x48\x81\x42\x0B\x00\x4E\x84\x02\x82\x81\xA3\x4C\x00\x42\x81\x42\x0E\x00\x56\x82\x0A\x82\x18\x08\x01\x05\xA7\x2D\x04\x1D\x82\x02\x0A\x02\x20\x83\x80\x03\x01\x63\x80\x00\x14\x00\x66\x85\x02\x26\x82\x0B\x06\x06\x97\x02\x19\x8A\x3B\x9B\x0D\x13\x59\x01\x37\x83\x01\xCE\x3A\x06\x14\x83\x4A\x33\x03\x38\x82\x20\x1E\x19\x4B\x81\x07\x1B\x83\x0D\x85\xC5\x5E\x00\x33\x8F", "\x01\x66\x81\x68\x1D\x44\x21\x06\x0C\xA2\x00\x33\x83\x02\x00\x85\x98\x04\x0D\x9D\x45\x04\x3B\x80\x79\x28\x02\x59\x83\x40\x0A\x01\x96\x82\x20\x2C\x00\x33\x8D\x02\x66\x82\x0B\x0E\x84\x81\x1F\x05\x26\x82\x18\x00\x0A\x97\x81\x05\x8C\x36\xAA\x0A\xF9\x43\x09\x19\x09\x09\xAB\x83\xB2\x15\x01\xA5\x83\x77\x36\x00\x33\x87\x03\x66\x80\x0E\x06\x83\x39\x06\x0C\xBA\x00\x33\x8B\x03\x66\x80\x0F\x11\x85\xCB\x15\x07\x26\x82\x1F\x08\x1A\x4C\x76\x16\x9F\x80\xC7\x84\x01\x89\x81\x29\x88\x01\xF7\x7C\x33\x87\x85\xD0\x87\x19\x92\x87\x64\x8E\x0A\xEF\x1C\x13\x00\x86\xD3\x80\x19\x9A\x86\x65\x8B\x00\xD5\x84\x35\x8C\x7F\xD1\x87\x1B\xAE\x7E\x3F\x5D\x04\x58\x86\x38\x95\x83\xDC\x86\x14\x99\x87\x74\x8D\x0C\x81\x86\x37\x9B\x86\xEF\x84\x1D\xA1\x87\x81\x0E\x04\x66\x84\x3C\x80\x87\xEB\x81\x1E\xBA\x86\x7C\x87\x0E\x99\x81\x3F\x8C\x32\x4F\x06\x0C\x90\x03\x62\x83\x0F\xF2\x85\x3E\x9C\x87\xF7\x83\x1C\x8A\x88\x74\x8B\x0F\x8B\x8A\x3F\x89\x88\x0C\x88\x21\x86\x89\x7F\x8E\x0E\x92\x89\x43\x91\x88\x0E\x8E\x19\x94\x88\xDA\x3E\x05\x76\x87\x44\x90\x88\x0F\x8A\x20", "\x1F\x02\x8F\x87\x11\xA1\x89\x49\x80\x12\x60\x04\x24\x96\x89\x95\x89\x11\x95\x89\x4B\x8B\x86\x1B\x8D\x1B\xAC\x88\x8C\x84\x13\xA6\x8B\x4C\x96\x89\x2F\x8A\x26\xB9\x89\xA3\x41\x06\x2A\x8B\x4E\x8D\x87\xA7\x62\x0C\x3E\x89\x9A\x8A\x11\xF7\x87\x18\x03\x8A\x38\x8C\x28\xAE\x88\xA5\x80\x13\xA0\x8A\x40\x44\x03\x66\x85\x0C\x08\x8B\xA2\x87\x61\x66\x03\x54\x93\x26\x67\x02\x25\xA8\x02\x95\x89\x06\x57\x89\x53\x97\x61\x6A\x06\x0C\xAB\x02\x33\x8C\x06\x66\x81\x1B\x06\x83\x6E\x06\x0C\xAF\x02\x95\x80\x07\x66\x81\x1C\x13\x84\x3D\x2C\x0E\x2D\x84\x00\x06\x07\x73\x88\x1E\x06\x83\x79\x06\x0C\xBA\x02\xAF\x84\x27\x7B\x02\x19\x9C\x03\x7C\x8A\x1D\xB1\x88\x46\x3D\x07\x73\x8B\x1F\x13\x8B\xE3\x81\x10\x01\x8D\x59\x12\x08\x66\x83\x20\x06\x83\x84\x06\x0C\x85\x04\x33\x86\x08\x66\x83\x21\x06\x83\x88\x03\x31\x8A\x09\x44\x06\x06\x8A\x04\x41\x87\x88\x3F\x8D\x20\xA7\x89\xA5\x89\x14\xA5\x8C\x55\x83\x8D\x5F\x88\x35\xBA\x88\xA6\x8B\x1A\xE8\x44\x26\x1A\x8C\xA0\x8C\x35\x82\x8C\xA7\x84\x1A\xA7\x8F\x4D\x96\x8D\xA1\x89\x36\xA6\x8C\x1D\x39\x09\x30\x8F\x60\x80", "\x8A\xAD\x88\x37\xB2\x8C\xE0\x83\x1B\x9F\x8A\x71\x8A\x8D\x2F\x7A\x13\x3E\x8D\xF9\x4B\x09\x4B\x8E\x40\x1C\x04\x66\x85\x13\x26\x82\x4F\x06\x06\x9F\x06\x19\x80\x05\x66\x81\x14\x26\x82\x51\x06\x06\xA3\x06\x19\x84\x05\x66\x85\x14\x26\x82\x53\x0E\x1C\xC8\x8C\x5D\x47\x05\xE5\x8D\x66\x28\x05\xF4\x89\x1B\xBF\x8E\x68\x97\x8D\x50\x19\x15\x2C\x8F\xE1\x8F\x1E\xBD\x26\x2A\x13\x8F\xE8\x43\x15\x29\x8E\x56\x06\x06\xAD\x06\x19\x8E\x05\x66\x87\x15\x26\x82\x58\x06\x06\xB1\x06\x19\x92\x05\x66\x83\x16\x26\x82\x5A\x06\x06\xB5\x06\x19\x96\x05\xF8\x8A\x38\xA8\x47\x5B\x01\x21\xB8\x10\x2E\x15\x90\xA9\x88\x3E\x99\x91\xF6\x8F\x43\x39\x04\x86\x9F\x64\xBA\x06\x0C\xBB\x05\x0F\x95\x1C\x88\x24\x2F\x04\x91\xB3\x15\x17\x2A\x88\x5F\x0A\x12\xBF\x06\x19\x80\x06\x28\x95\x3E\x88\x33\x60\x06\x06\xC2\x06\x19\x83\x06\x66\x84\x18\x26\x83\x62\x06\x06\xC6\x06\x4A\x87\x06\x66\x80\x19\x30\x8B\xDB\x2B\x0C\x73\x89\x33\x13\x8B\xCF\x06\x0C\x90\x06\x33\x81\x0D\x69\x8E\x34\x06\x83\xD3\x01\x46\xBA\x8C\x09\x90\x24\x54\x07\x5C\x96\x06\x88\x89\x22\x98\x06\x29\x96\x10", "\x59\x06\x19\x9A\x06\x66\x83\x1B\x26\x82\x6E\x06\x06\xDD\x06\x19\x9E\x06\x66\x87\x1B\x1C\x93\x1F\x20\x0E\x66\x81\x38\x0B\x93\xC7\x8A\x93\x22\x06\x38\x9B\x32\x63\x06\x4A\x84\x07\x2A\x8D\x1C\x34\x92\x0D\x94\x92\x66\x06\x19\x87\x07\x66\x80\x1D\x26\x83\x74\x06\x06\xEA\x06\x19\x8B\x07\x2A\x8C\x1D\x26\x83\x76\x03\x24\xA7\x2C\x3C\x13\x8B\xF2\x03\x2E\xB4\x06\x33\x85\x0F\x66\x82\x3D\x09\x8F\xF7\x06\x0C\xB8\x07\x3D\x9C\x21\xF1\x91\x91\x19\x07\x73\x8B\x1F\x19\x92\x9B\x8D\x0F\x7B\x92\x3F\x0F\x83\x66\x80\x00\x3C\x0F\x41\x4F\x1E\x2B\x97\x40\x06\x44\xAE\x92\x20\x38\x0F\x58\x91\x10\x5E\x0C\x01\x14\x95\x82\x41\x88\x05\x00\x5C\x9E\x1D\x06\x00\xAE\x86\x86\xB4\x8B\x43\xB4\x8F\x29\x95\x1B\xC5\x96\xB0\x9B\x8D\xC7\x94\x4A\x86\x97\xE0\x8B\x2C\xEF\x58\x05\x1C\x95\x54\x4D\x02\x10\x96\x62\x99\x2C\xCD\x94\x71\x97\x96\x32\x90\x59\x8C\x97\x6A\x9C\x2D\xDB\x94\x3B\x36\x00\xD3\x91\x88\x17\x01\x70\x9F\x43\x18\x00\xAE\x86\x52\xC3\x96\x3D\x89\x08\x0D\x07\x2E\xAA\x34\x07\x0D\x97\x8F\x6E\x03\x24\x97\x0B\x3F\x01\x73\x96\x79\x97\x1E\x20\x06\x5E\x80", "\x01\x10\x0A\x2F\xA2\x02\xBE\x83\x01\xFA\x94\x04\x30\x97\x04\x2A\x2F\xA7\x00\xAE\x98\x95\x00\x03\x05\x38\x94\x1E\x88\x23\x2E\x02\xBE\x83\x87\x2F\x07\x61\xA9\x97\x60\x9E\x2D\xEF\x58\x0C\x12\x98\x34\x19\x06\x18\x99\x9C\x12\x03\x03\x98\xC5\x85\x91\x9A\x24\x06\x1E\x98\xB0\x36\x03\x23\x99\x89\x78\x01\x1B\x9B\x9A\x39\x01\x94\x9D\x2D\x96\x1E\x0E\x1A\x97\x3B\x02\x5F\xBC\x00\x7D\x9D\x03\x7A\x96\x0F\x06\x99\x00\x00\x08\x3A\x97\x20\x07\x30\x8A\x09\x11\x0B\x98\xCB\x10\x09\x2C\x98\x99\x89\x04\x43\x98\xC8\x8A\x02\xFA\x93\x09\x3F\x95\x6C\x9A\x2C\xAD\x98\xB6\x94\x96\x15\x9F\x69\xAA\x97\xA9\x9F\x31\xD2\x99\xD5\x8C\x9A\xD6\x95\x22\x06\x9A\xAB\x9E\x29\x93\x99\xD7\x9A\x96\x20\x9D\x53\xB7\x96\xA8\x91\x36\xDE\x98\x22\x3A\x02\x5B\x98\x6B\x8E\x9A\xB5\x91\x35\xEC\x99\xD9\x80\x9B\x5C\x9D\x4C\x5B\x02\x7D\x9C\x05\x4B\x98\xD9\x91\x9B\x7C\x97\x6D\x8D\x9B\xB6\x97\x37\xEE\x98\xDE\x82\x9B\x79\x9F\x6F\xA6\x9A\xB2\x3A\x06\x69\x9B\xFB\x0B\x03\x86\x9C\x6A\x9F\x9B\xBD\x9A\x37\xD9\x99\xDF\x8F\x9C\x8A\x9D\xC4\x6C\x02\x7D\x9D\x06\x09\x9F\xD5\x9D\x29", "\x6E\x06\x72\x97\x31\x37\x0A\x39\x81\x08\x1C\x1D\x9C\x00\x01\x0E\x20\x9C\xC0\x98\x8D\x72\x02\xBE\x93\x03\xFA\x94\x0E\x3A\x97\x3A\x0A\x2F\xF6\x02\xBE\x97\x03\xA0\x98\x0F\x3A\x97\x3C\x00\x34\xBD\x28\x1F\x18\x99\x7E\x00\x67\x80\x04\x7D\x91\x08\x7A\x96\x20\x03\x9D\x3C\x13\x10\x3A\x96\x42\x00\x3C\xF0\x9A\xDF\x8B\x16\x85\x00\x67\x87\x04\x9C\x93\x0E\x89\x05\xF1\x99\x19\x8A\x02\x5F\x8B\x04\x7D\x9C\x08\x7A\x95\x23\x1A\x97\x8E\x02\x5F\x8F\x04\x7D\x90\x09\x4F\x9E\x8E\x31\x04\xFA\x92\x12\x1E\x9F\xB5\x9F\x3E\x13\x07\xF8\x8C\x27\x94\x00\x74\x95\x04\xD0\x96\x09\x67\x9D\xE3\x9D\x56\x97\x02\x5F\x98\x04\x7D\x99\x09\x7A\x96\x26\x1A\x97\x9B\x02\x5F\x9C\x04\xD0\x9D\x09\x7A\x96\x27\x15\x9D\xB7\x29\x14\x38\x99\x51\x08\x33\xA5\x06\xBE\x86\x05\xFA\x97\x14\x2E\x9F\xD9\x08\x0A\x7A\x95\x2A\x0B\xA0\xC7\x98\x72\x83\x08\x55\x08\x33\xAC\x04\xF3\x91\x88\xAE\x00\x82\xA7\x17\x57\x0A\x2F\xB0\x06\xBE\x91\x05\xFA\x92\x16\x3A\x97\x59\x0A\x2F\xB4\x06\xBE\x95\x05\x1A\xA1\x72\x81\x9C\x0C\x46\x0B\x29\xA3\xC4\x17\x05\x2E\xA3\x71\x8E\x9C\x15\xA4\x3A\x83", "\x9D\x0D\xA6\x9E\x12\xA2\x20\x38\x04\x7D\x99\x0B\x76\x98\x0D\xB6\xA1\x40\xA0\x87\xBF\xA0\x21\xA7\x39\xC3\xA0\xE3\x82\x9C\x44\xA2\x86\xA4\x9E\x81\x17\x0C\x31\xA3\xD8\x86\xA2\x33\xA5\x88\x92\xA2\x25\xAC\x37\xD0\xA3\x12\xA3\x08\xC8\x02\x5F\x89\x06\x1F\xA3\x45\xCF\xA1\x17\xAB\xA1\x39\xA6\x8B\x94\xA3\xF7\x95\x45\xDF\xA3\x0D\xBA\x25\xD7\x02\x5F\x98\x06\x2E\xA3\x46\xC8\xA3\x11\xB1\xA0\x56\xA5\x8C\xAD\xA2\x38\xA6\x46\xC1\xA3\x1B\xAF\x1F\xE6\x02\x5F\xA7\x06\x27\xA0\x46\xC1\x20\x3A\x1C\xA3\x53\x19\x1D\x20\x9C\x75\x00\x3A\xEB\x04\x20\xB6\xA3\x94\x3C\x1D\x3A\x97\x76\x0A\x2F\xEE\x06\xBE\x8F\x07\xFA\x90\x1E\x3A\x97\x78\x00\x3A\xF2\x06\xBE\x93\x07\x00\xA7\xB4\x36\x06\x9C\x98\x0F\x38\x9A\x3E\x1A\x97\xFB\x02\x5F\xBC\x06\x3E\xAD\x0F\x7A\x96\x3F\x07\xA4\x49\xA2\x8C\xAD\x18\x9C\x91\x00\x7F\x0D\x7D\x0F\x8F\x03\x06\x95\xAF\x94\x79\x24\x00\x32\xA6\xAC\x8A\x08\x05\x06\x96\xB5\x95\x00\x1A\x4B\xB9\x97\x40\x07\x00\xBD\xA6\x08\x81\xA7\x24\x83\x4C\x89\x0A\x02\x05\xA6\x41\x23\x01\x08\xA7\x81\x0C\x00\x3D\xA4\xB0\x93\xA3\x61\xA5\x8F\xB5\xA3", "\x54\xA2\x4D\xD0\xA5\x1C\xA4\xA3\xD8\xA6\x8D\x91\xA2\x6B\xAF\x45\x9A\x03\x32\xBC\xA6\xE0\xA2\x95\x95\xA6\x71\xA7\x46\xDB\xA4\x39\xA8\xA4\x57\xA1\x9C\xB5\x19\x0D\x0F\x4D\xE7\xA4\x35\xA5\xA7\xE9\xA6\x9D\xB7\xA3\x6B\xAA\x4D\xF1\xA7\x38\xB5\x19\x1C\x05\x9D\xBE\x71\x0E\x0A\x4F\xD3\x1A\x07\x1A\xA7\x1F\x02\x9F\xA0\x00\x7D\xA1\x02\x7A\xA6\x08\x1A\xA7\x23\x02\x9F\xA4\x00\x7D\xA5\x02\x7A\xA6\x09\x1A\xA7\x27\x02\x9F\xA8\x01\x7E\xA8\x4E\xF4\x51\x0A\x14\xA8\xB0\x22\x05\x18\xA9\x79\xA3\x4D\x9C\xAA\x3A\xB3\x1A\x2B\x03\xA3\xB4\x56\x16\x0A\x4F\xAD\x02\x33\xB4\xA3\x1F\xAD\xA2\x99\xA6\x94\xA2\x4F\xE6\xA7\x3D\xB0\xA7\x72\xA5\xA5\xB6\xA6\x98\xA3\x7E\x3B\x02\x48\xB3\xA9\x2A\xAD\x9E\xB1\xA9\x97\xA9\x53\xAC\xA8\x4F\xAF\xA7\x3D\xA8\x06\x7C\x01\x9B\xAB\x53\xB4\xAA\x4E\xAB\xA9\xD1\xA6\xA8\xBE\xA8\xA5\xA7\x2E\x3D\x02\x3E\xBE\x01\x44\xA8\xA9\xB7\x2D\x1F\x01\x55\xB7\x28\x10\x15\xAA\x0A\x09\x08\x3A\xA6\x21\x0A\x4F\xC3\x00\x56\xA9\xAA\xDE\x44\x08\x3A\xA7\x22\x0A\x4F\xC6\x02\x3E\xA7\x02\xFA\xA0\x09\x3A\xA7\x24\x0F\x55\x86\x0A\x12\x1A\xA7\x4B", "\x05\x97\x8C\x99\x72\x2E\x04\x3D\xA6\x7D\x10\x02\x76\xAA\x21\x12\x02\x7D\xA3\x05\x7A\xA4\x15\x0D\xAB\x13\x1D\x0A\x3A\xA6\x2B\x00\x58\xA9\xA8\x50\xB4\x19\x57\x01\xAF\x89\x09\x2C\x0A\x58\xAA\xA3\x16\x05\xAC\x88\x24\x0B\x3A\xA7\x2E\x0A\x4F\xDE\x02\x3E\xBF\x02\xFA\xA0\x0C\x3A\xA7\x30\x0A\x4F\xE2\x00\x64\xA4\x3B\x63\x02\x9F\xA4\x03\xCF\xAC\x54\x82\x19\x19\x04\xAD\xEA\x26\x0C\x1F\xAD\x33\x0A\x4F\xE8\x02\x3E\xA9\x03\xA8\xAF\xB0\x82\x48\x35\x0A\x4F\xEB\x02\x3E\xAC\x03\xFA\xA5\x0D\x3A\xA6\x37\x0A\x4F\xEF\x03\x67\xB0\x03\xFA\xA1\x0E\x32\xAA\x79\x24\x07\x0D\xAF\x40\x16\x03\xC6\xAA\x20\x38\x02\x7D\xA9\x07\x7A\xA6\x1E\x11\xAD\x40\x13\x0F\x3A\xA6\x3E\x00\x5D\xAE\xA9\x69\xA3\x08\x7D\x01\xB9\x81\x09\x3F\x0A\x5D\xF7\xA5\x20\x15\xAE\x6F\x1A\x10\x3A\xA7\x41\x0A\x4F\x84\x06\x3E\xA5\x04\xFA\xA6\x10\x3A\xA7\x43\x0A\x4F\x88\x04\x78\xB1\x33\x89\x02\x9F\x8A\x05\xF7\xA2\x55\xBF\x23\x22\x14\xAF\xBB\x1C\x11\x1F\xAD\x46\x0F\x59\x8E\x04\x7E\xAB\xAA\x84\x3F\x11\x3A\xA6\x48\x0A\x4F\x91\x06\x3E\xB2\x04\xFA\xA3\x12\x3A\xA6\x4A\x0F\x59\x95\x06", "\x3E\xB6\x04\xC3\xAD\xA7\x19\x05\xEE\xAB\x09\x5D\xAD\x27\x1A\xA7\x9E\x02\x9F\x9F\x05\xFF\xA9\x10\x20\x06\x3E\xA1\x05\x1C\xB4\x9E\xBE\xA8\x51\x0D\x5D\xA4\x05\x77\xA3\x87\xA6\x01\xC4\x93\x19\x53\x0A\x4F\xA8\x06\x3E\xA9\x05\xFA\xA2\x15\x3A\xA7\x55\x0A\x4F\xAC\x06\x3E\xAD\x05\x2A\xB6\xB0\x9E\xA9\x80\x0E\x0A\x27\xB1\x50\xA2\xB1\x60\xAA\xB6\x96\xAF\x1F\xBD\x51\xC3\xB0\x3A\x50\x05\xFA\xA1\x16\x27\xA9\x20\xBB\x63\xBF\xA9\x93\xB7\xAE\x3A\xB6\xC8\x8F\xB2\x22\xB1\x65\xB8\xAA\x90\xB6\xA7\xBF\x01\xC7\xB2\xA9\xA2\xA4\x65\xDB\xB1\x7D\xB5\xB2\x5C\xB7\xCA\xB1\x32\x60\x0A\x4F\xC1\x06\x96\xAE\xB2\x50\x1A\x18\x1F\xAD\x61\x0E\x63\xB4\x19\x31\x1F\xAC\xC6\x02\x9F\x87\x06\x7D\xA8\x0C\x67\xB0\x94\xA3\x3B\xC9\x02\x9F\x8A\x06\x7D\xAB\x0C\x7A\xA4\x33\x1A\xA7\xCD\x02\x9F\x8E\x07\xCF\xAF\x0C\x7A\xA4\x34\x11\xB0\xB7\x2B\x1A\x1D\xAF\x6A\x0D\x5D\xD7\x06\x3E\xB8\x06\xFA\xA1\x1B\x27\xB2\x6D\x0A\x4F\xDB\x06\x9D\xBD\xB2\xF7\xA4\x1B\x1D\xAE\x6F\x0D\x66\xB6\x8C\x38\x17\xB4\x3E\x11\x1C\x3A\xA6\x71\x0A\x4F\xE3\x06\x3E\xA4\x07\xFA\xA5\x1C\x3A\xA6\x73", "\x0A\x4F\xE7\x07\x99\xA8\x07\xFA\xA1\x1D\x0B\xB2\x20\xB4\x6B\xC5\xB2\x95\xB3\xB2\x62\xB7\xCB\x9E\xB3\xA3\xAC\x6B\xD4\x4B\x3D\x1A\xA7\xF8\x03\xD6\xB6\xB5\x30\xB8\x6B\xC5\xB6\x94\xA7\xB6\xB7\xB0\xD9\x84\xB6\x65\xB7\x94\x06\x01\x32\x57\xA5\x04\x17\xD9\x81\x09\x67\xAB\x6B\x80\xB1\xAE\xBD\xB5\x4C\xB4\xD9\x98\xB7\x5A\xB0\x66\xBA\xB4\xD9\x35\x00\xD2\xB6\x97\x82\x08\x0B\x01\x6E\xD4\xB4\x9A\xA9\xB6\xE8\xB3\xD9\xA9\xB6\x6F\xB7\x67\xE7\xB6\xBA\xAF\xB7\x47\x4C\x04\x21\xB6\xEF\x05\x02\x65\xB6\xB5\xA6\xB6\xEB\xB3\xDB\x83\xB6\x76\xB8\x69\xED\xB6\xBF\xBD\xB7\x48\x33\x06\x33\xB6\x85\x04\x03\x03\xB9\xB6\xA5\x27\x35\x06\xE0\x92\x3A\x1B\x0A\x70\x93\x1B\x0D\x0D\xB8\x20\x18\x07\x10\xB9\x80\x09\x03\x13\xBA\xBB\xAF\x5B\x3A\x06\xE2\xBB\x00\x8B\xBC\x03\x16\xB9\x0F\x16\xB8\x3E\x06\xE2\xBF\x00\x8B\xB5\x24\x40\x02\xC5\xA1\x02\xE1\xB3\xAE\xAC\x26\x22\x01\x6E\xF6\x0E\x11\x0D\xB9\x0A\x08\x09\x16\xB9\x24\x06\x71\xCA\x00\xC9\xBB\x19\x4B\x06\xE2\x8C\x03\x9B\xB7\x6D\xF7\xB4\x8E\x0D\x02\x30\xB9\x21\x0F\x03\xA0\xBA\x42\xD1\x00\xCF\xBA\x25\x52\x06", "\xE2\x93\x02\x8B\xB4\x05\x16\xB9\x15\x16\xB8\x56\x06\xE2\x97\x02\x8B\xB8\x05\x47\xBA\xB6\xBE\xB9\x61\x11\x0B\x16\xBA\x8D\x4A\x05\x5B\xB8\xBC\xBA\xB7\xDD\xB0\xEC\x95\xB7\x83\xBF\x75\xBE\xAB\x16\x16\xB8\x5C\x06\xEB\xBC\xB6\x58\x2D\x05\x6A\xBB\x4D\x3E\x02\x6E\xBA\x21\x1F\x03\xB8\xB9\x10\x60\x00\xDD\xBC\xB6\x65\x51\x0C\x16\xB8\x31\x06\x71\xE3\x02\xC5\xA4\x03\x16\xBD\x0C\x16\xB8\x33\x07\x77\x83\x0B\x19\x16\xB8\x68\x01\xE5\xB2\x27\x35\x04\x74\x83\x09\x1B\x0D\xBC\x02\x0F\x0D\x16\xB8\x38\x06\x71\xF1\x01\xE1\xA0\x19\x72\x06\xE2\xB3\x03\xCB\xB3\x76\xF8\xB9\xCD\x14\x03\x90\xB9\x20\x36\x03\xD0\xB7\x4F\xF8\x00\xE7\xBA\x24\x79\x06\xE2\xBA\x02\x8B\xBB\x07\x16\xB8\x1F\x16\xB8\x7D\x06\xE2\xBE\x02\x8B\xBF\x07\x27\xBF\xBF\xB4\xA6\x80\x06\xF6\x84\x3D\x40\x0A\x7B\xBD\xB8\xD9\xAB\xBB\xF8\xB5\xEC\xBF\xBC\xB1\xBE\xA7\x02\x06\xC5\xA3\x04\xF6\xB3\xF8\x98\xBA\xE1\xBE\x79\xB7\xBD\xF0\xA0\xBE\x57\xBA\xF9\x92\xBF\x20\x21\x09\x16\xBA\x24\x1D\xBD\xCF\xBB\x56\x13\x04\xEC\xB3\x4D\x14\x07\xE9\xB5\x04\xA7\xBE\x12\x1C\xBF\x7C\xB8\x81\x17\x06\xC5", "\xB8\x04\x16\xB9\x13\x16\xB8\x4D\x06\x71\x9B\x06\xC5\xBC\x04\xA7\xBD\x13\x16\xB8\x4F\x0A\x78\xBD\x29\x28\x04\xBD\xA3\x04\xF4\xA5\x04\x8B\xB6\x0A\x16\xBB\x29\x03\xBF\x74\x10\x15\x16\xB9\x54\x00\x80\xD0\xBC\xF9\xA9\x08\xAA\x04\xF4\xAC\x04\xD2\xB3\x0E\xAE\x05\x01\xD3\x15\xAF\x06\xE2\xB0\x04\x8B\xB1\x0B\x16\xBA\x2C\x16\xB8\xB3\x06\xE2\xB4\x04\x8B\xB5\x0B\x0F\xC3\xF2\xA6\xC0\x74\x56\x16\x1E\xC1\xE9\xBB\x6F\xF8\x9B\x2D\x03\xC1\xCD\xB8\xE0\xBE\xBD\x14\xC8\x8E\x38\x06\xC5\xB9\x05\x28\xC5\x04\xCB\x16\x5D\x01\x83\x8A\x27\x2E\x07\xBD\xBC\x07\xF4\xBD\x05\x1A\xCD\x79\xA7\x46\x2F\x16\xB8\xBF\x06\xE2\x80\x06\x8B\xB1\x0C\x16\xBA\x30\x16\xB8\xC3\x07\xF4\x84\x06\x8B\xB5\x0C\x75\xBF\x6D\x28\x06\xA4\xBA\x19\x24\xBC\x66\x06\x71\xCD\x06\xC5\xAE\x06\x3C\xC0\x00\x0F\x06\x8B\xB0\x0D\x59\xC2\xF3\xB5\x88\xD1\x04\xF4\x93\x06\x06\xC1\x11\xD5\x06\x17\xDC\x11\xD6\x06\xE2\x97\x06\x8B\xB8\x0D\x16\xB9\x36\x16\xB8\xDA\x06\xE2\x9B\x06\x8B\xBC\x0D\x67\xC3\x0A\xDF\xA2\xDD\x06\x0E\xCC\x32\x6F\x0A\x87\xD1\xBC\x0B\xD9\xBE\x1F\xC4\xF8\x9F\xC3\x03\xCC", "\xA0\x5F\x06\xC5\xA0\x07\x7D\xC4\x10\xC3\x09\x70\x09\x88\x81\x1E\x38\x07\xBD\xE3\x07\xF4\xA4\x07\x46\xC0\x82\xE3\x3D\x39\x16\xB8\xE6\x06\xE2\xA7\x06\x8B\xB8\x0E\x16\xB9\x3A\x16\xB8\xEA\x07\xF4\xAB\x06\x8B\xBC\x0E\x4E\xC3\x69\x2F\x07\xA4\xB9\x1E\x24\xBD\x79\x06\x71\xF4\x06\xC5\xB5\x07\x59\xC6\x1E\x16\xB9\x7B\x04\x89\x82\xC5\x44\x98\x07\xA4\xBA\x1F\x24\xC2\x9B\x8C\x0F\x35\xC6\x42\x1D\x07\x16\xBE\x1F\x24\xB8\x8B\xB0\x00\x05\x10\xAB\x8F\x95\xC6\xC3\x96\x85\x53\x64\xC0\x6D\x86\x0B\x00\x0C\xC6\xBB\xA4\x04\xE1\xBB\x65\x14\x00\x50\xC6\xB8\xA5\x53\x05\x06\x1A\xF6\x67\x3B\xC3\x8D\xD2\xC5\x0F\xDD\xC6\x7F\xC6\x0F\xDC\x60\x03\x0A\x8D\xC3\x82\x35\xC6\xB7\x83\xC4\xF9\xB2\xC0\x6F\xC7\x71\xB6\xC4\x37\xDF\xC6\xF0\xC5\x1D\xC1\xC5\x79\xCC\x8E\xE9\xC5\x25\xCE\xC7\x80\xC5\x1E\xEA\xC0\x5D\x25\x01\x65\xC7\x41\x96\x00\xFE\xC6\x20\x17\x01\x80\xCB\x8E\xB7\x2C\x06\x04\xC8\x60\x39\x03\x08\xC9\x95\x1A\x01\x0B\xCB\x3A\xAE\xC8\xF6\xC2\x02\x5C\x00\x87\xCD\x01\x0E\xCA\x07\x0E\xC8\x1F\x06\x21\xE0\x00\x87\xC1\x02\x10\xC8\x8F\x02\x01\x0E\xCB\x04", "\x16\xC6\x95\xB8\xD9\x56\xC6\x7D\x08\x01\x26\xCA\x21\x2A\x00\x87\xCB\x02\x0E\xC8\x0B\x1E\xC8\x34\x1D\x05\x0E\xC8\x17\x00\x93\xF9\xC5\x38\xC1\x13\x2F\x01\x25\xC9\x09\x18\x0A\x93\xAA\xA3\x0C\x15\xC9\xD3\x24\x06\x0E\xC9\x1A\x0E\x90\xB6\x02\x43\xD7\x01\x0E\xC8\x07\x0E\xC9\x1C\x0E\x90\xBA\x00\x50\xCA\xC4\xE0\xC2\xC0\x7B\x01\xA7\xCA\x8E\xD1\xCA\x55\xCB\x19\x3C\x04\x2A\xF7\xC6\x7A\xC7\x93\xD5\xCB\x04\x7D\x01\x0E\xCE\x07\x1A\xCA\x7C\xC0\x35\x3F\x03\x58\xD2\x27\x40\x07\x2C\xC9\x09\x20\x0A\x96\x86\x0A\x10\x0D\xCB\x05\xCB\x3E\x43\x02\x87\xC4\x04\x0E\xC9\x11\x0E\xC8\x46\x06\x21\xC7\x02\x87\xC8\x04\x70\xCA\x40\x09\x02\x0E\xCA\x09\x23\xC8\x79\x2D\x04\x3D\xCB\x40\x0F\x02\x86\xCA\x20\x11\x02\x87\xC2\x05\x0E\xCB\x14\x1E\xCB\x2B\x1C\x0A\x0E\xC9\x2A\x00\x99\xF2\xC4\x3B\xD6\x02\x89\xC9\x20\x18\x03\xCC\xC7\x4F\xDA\x01\x65\xD3\x1A\x5B\x06\x21\xDC\x02\x87\xCD\x05\x0E\xCA\x17\x0E\xC8\x5F\x06\x21\xE0\x02\x87\xC1\x06\x1F\xCF\x3E\xCE\xA9\x62\x06\x35\xFD\x3B\x31\x02\x9B\xB6\xC9\x5C\xD7\xCA\x96\xCD\x2B\xDB\xCA\x7D\xCE\xE5\x64\x02\x43\xC5", "\x03\xB5\xCA\x1C\xE0\x18\x33\x01\x9C\xE5\x27\x19\x15\xCC\x68\x05\x32\xE9\x03\xE2\xCE\x95\xD2\x46\x1A\x0E\xC8\x6B\x06\x21\xEC\x02\x87\xCD\x06\x0E\xCA\x1B\x0E\xC8\x6F\x05\x32\xF0\x02\x87\xC1\x07\x03\xCD\x5C\x9C\xCC\x76\x04\x33\xF8\x02\x87\xC9\x07\x0E\xCA\x1E\x0C\xCE\x8E\x13\x0F\x0E\xC8\x3E\x08\x9E\xE4\xCA\x3D\xBD\x03\x9C\xCF\x0F\x1C\xCD\xC4\x8D\x9E\xCB\x16\x20\x0E\xC8\x83\x06\x21\xC4\x04\x87\xC5\x08\x0E\xCA\x21\x0E\xC8\x87\x06\x21\xC8\x05\xFA\xCC\x9B\xB6\x8D\x22\x04\xD0\x52\x3A\x11\x08\xD1\xDB\xC1\x8F\x91\xC8\x57\xCC\xD0\xB9\xC8\x42\xEA\x3B\x45\x0E\x90\x8C\x07\x39\xCF\xD0\xB8\xCE\x41\xC5\xD0\xE1\xCD\xA0\xAF\xCC\x54\xDD\xD0\xEF\xC1\x42\xD9\xD0\x75\x2A\x09\x0B\xD3\x88\xC1\xD1\x1A\xD2\x37\xEE\xCF\xE6\xC9\xA2\x92\xD2\x87\xD4\x53\x9B\x06\x44\xE0\xD0\xDB\xC7\xA2\xB4\xD3\x8C\xDC\xD0\x22\xD7\x46\xDF\xD1\x1C\xDC\xA3\xAD\xD2\x33\x5C\x04\x32\xD5\x47\xEF\xD1\xDD\xCA\xA2\x98\xD2\x8E\xCC\xD1\x43\xD3\x45\xC4\xD3\xD3\x2D\x09\x41\xD2\x8F\xC7\xD2\x4B\xD5\x46\xF8\xD1\x27\xD2\xA4\xA8\xD1\x92\xD4\x4A\x9E\x06\x49\xD7\xD3\x0D\xDB\xA3", "\xD4\xD2\x97\xDB\xD2\x45\xD4\x4B\xC8\xD2\x2B\xD4\xA6\xB6\xD0\x8F\xDF\x04\x5A\xD5\xEF\x20\x04\x87\xC1\x0A\x17\xD2\x98\xD1\xD2\x50\xD2\x49\xF2\xD2\x23\xD5\xA5\xE6\xD3\x97\xC5\xD3\x53\xD0\x4C\xEE\xD0\x3C\xDD\xA5\xFA\xD2\x94\xDD\xD3\x96\x67\x15\x29\xD2\xCB\x30\x0B\x0E\xC9\x2C\x0E\xD3\x61\xD1\x51\xFB\xD2\x3B\xDE\xA7\xF1\xD0\x9D\xD7\xD3\x8C\xD6\xCB\x7F\x04\x87\xC0\x0C\x03\xD4\x8E\xC1\x06\x96\xD7\x6D\x02\x07\xCA\xC3\x0C\x15\xCC\x31\x19\xD4\x63\xD4\xC9\x05\x06\x87\xC6\x0C\x0E\xCB\x31\x0E\xC8\xC8\x06\x21\xC9\x06\x87\xCA\x0C\x15\xCF\x32\x0E\xC8\xCC\x06\x3B\xF7\x2D\x67\x0C\x99\xD1\x04\x67\xD3\x06\x0E\xCC\x1A\x0E\xC9\x6A\x01\xA4\xD6\x06\x43\xD7\x06\xA0\xD0\x4E\xF7\xA6\x6C\x0C\x99\xDA\x07\x7C\xD1\x88\xDC\x01\x58\xF3\x0D\x6E\x0E\x90\xDE\x06\x43\xDF\x06\x0E\xC8\x1C\x0E\xC9\x70\x0E\x90\xE2\x06\x43\xC3\x07\x41\xD4\x1C\x0E\xC9\x72\x08\xA8\x8B\xD5\x9E\xDC\xD3\xA1\xD7\x5B\xD1\xD5\x71\xD2\xAE\xE5\xD4\xA0\xC4\xD7\x4B\x73\x1E\x0A\xD7\x47\xDD\xA8\xF5\xD2\xB9\xC1\xD7\xE7\xD7\x5D\xCC\x34\x7A\x0E\x90\xF5\x05\xB7\xDF\xD3\xF0\xD1\x5F\xC2", "\xD6\x48\xD2\xAF\xF3\xD3\x9B\xDE\xD7\x2A\xA3\x00\x08\x11\x63\xC8\xAF\xFB\xD5\xBB\xDC\xD7\xF1\xD1\x61\xFA\xD6\x80\xDE\xAD\x8A\xDB\xCB\x64\x00\x03\xDA\x19\xD3\x71\x02\x01\xB1\xCD\xC7\x0F\x26\x00\x15\xD9\x1A\xC6\x09\x03\x09\xB1\xD7\xC5\x43\x7D\xD8\xDE\x09\x01\x20\xD8\x85\x0A\x00\x23\xDB\x13\x86\xD9\x06\x0C\x01\x28\xD9\x81\x0D\x00\x2B\xDA\x40\x0E\x00\x2E\xD9\x20\x0F\x01\x98\xD0\x00\x10\x00\xCD\xC8\xD8\xC7\x39\x02\x37\xD8\x75\x22\x01\x3B\xD8\xB8\xC6\xD8\x3F\xDC\x75\x53\x00\x9F\xDD\xA7\x14\x00\xCD\xD5\x00\x1D\xD8\x1D\xC7\xD9\xA5\xD1\xB4\xEC\xD5\xD3\xDF\xD7\x4E\xD8\x5D\xCB\xD9\x65\x13\x02\x34\xD8\x09\x09\xDA\x51\xDD\x5F\xD9\xDA\x87\xDC\xB0\x85\xD9\xD7\xCE\xD4\x50\xD9\x6C\xCA\xD4\xAF\xDB\xB5\xEC\x26\x0C\x04\xDA\x5A\xDA\x6C\xCD\xD9\xA9\xDA\xB6\xE4\xD8\x3B\xD3\x01\x68\xDF\x94\x74\x01\xB8\xD1\x38\x35\x00\xCD\xD6\x01\x34\xDF\x06\x34\xD8\x1C\x04\xB3\xB9\x00\xCD\xDA\x01\x34\xDB\x07\x34\xD8\x1E\x04\xB3\xBD\x00\xCD\xDE\x01\x34\xDF\x07\x34\xDA\xA0\xD2\x90\x40\x03\xE2\xDB\x1D\x41\x07\x71\xE5\xDA\xC6\xD9\xB6\x8C\x52\x10\x12\xDC", "\x82\x4B\x08\x34\xD8\x22\x08\xB5\xED\xD8\xD8\xC3\xDB\x9F\xDB\x6D\xD4\xDC\xAE\xD3\xB9\xDF\xDA\x34\x52\x02\x34\xDB\x0A\x1D\xDC\xD0\xDE\xAE\xA4\xDE\xE7\xCD\xDD\x6C\xDC\x75\xF8\xD9\xD1\xD1\xBB\xA2\xDE\xE9\xD3\xDD\xB3\x11\x0C\x18\xDC\xD9\xDC\xB4\xD2\xD8\xED\xDF\xDD\xB7\xDD\x77\xD5\xDC\xDB\xD2\x4F\x62\x03\xEE\xC4\xDE\xAF\xD8\x77\xE5\xDD\xE5\xD9\xBC\xC2\xDE\xEB\xCC\xDD\x63\x07\x78\xEE\xDA\xDE\xDF\xB4\xD4\xDE\xEF\xC1\xDE\x21\xD4\x0C\x12\xDF\x09\x65\x06\x5B\xDD\xCD\x06\x03\x34\xDF\x0C\x34\xD8\x34\x04\xB3\xE9\x00\xCD\xCA\x03\x34\xDB\x0D\x34\xD8\x36\x04\xB3\xED\x00\xCD\xCE\x03\x34\xDF\x0D\x34\xD8\x38\x0E\xBD\xCA\xDD\x4F\x31\x03\xF5\xDB\x67\x32\x03\xFC\xD5\xBD\xC8\xDE\xF5\xCA\x48\x73\x04\x7F\xC2\x48\x3A\x04\xB3\xF5\x03\xEA\xDE\xDF\x08\xE3\x7A\xC9\xE1\xD0\xDA\xC0\x8D\xE0\x03\xEF\xE0\xB0\xD8\x78\xD7\x1F\x41\x02\xC0\xF4\x54\x21\x15\xE0\x61\x15\x10\x34\xD8\x43\x04\xB3\x87\x04\xCD\xC8\x04\x34\xD9\x11\x34\xD8\x45\x04\xB3\x8B\x04\xCD\xCC\x04\x34\xDD\x11\x34\xD8\x47\x04\xB3\x8F\x04\x06\xF5\xDD\x60\x38\x12\x2F\xE0\xCB\x11\x09\x33", "\xE0\xF6\xD7\xDE\xCC\xDA\xEA\x12\x04\x1B\xE8\x81\x13\x04\xCD\xD4\x04\x07\xE6\x81\xD1\xE1\x1B\xE3\xBC\xC2\xE2\xFD\xDF\xDF\xCF\xDB\x81\xC3\xE3\x1C\xE3\x9F\x22\x04\x0F\xED\xDE\xFD\xDE\x88\xCE\xDE\x18\xE0\xC1\xC7\xE2\x12\xE0\x54\xA3\x07\x89\xC8\xE2\x2A\xEB\xC4\xD0\xE0\x0E\xFE\xE2\x45\xE5\x8A\xED\xD6\x52\x0A\xC5\xD7\xE3\x14\xF2\xE0\x60\xE1\x89\xD2\xE3\x28\xE2\xC6\xEC\xE0\x00\x05\x05\x65\xE3\x8D\xDF\xE3\x2D\xE8\xC6\xF4\xE0\x11\xEA\xE3\x6D\xE6\x36\xA6\x05\x38\xE9\xC7\xE1\xE1\x17\xF6\xE3\x4C\xE2\x8E\xFE\xE2\x2B\xE2\xC8\xB4\x3F\x29\x1C\xE3\x7F\xE6\x8C\xEE\xE2\x42\xED\xC7\xF8\xE1\x22\xE5\xE4\x5C\xE4\x91\xCF\xE5\x12\x78\x0A\x08\xE6\x24\xF7\xE4\x67\xE7\x8E\xD1\xE5\x4C\xE1\xC8\x8D\xE7\x27\x69\x05\x96\xE4\x93\xE9\xE3\x4D\xEB\xC8\xA2\xE4\x20\xE3\xE5\x75\xE7\x1E\xAA\x05\x50\xE5\xCA\xAD\xE7\x1C\xEA\xE4\xAF\xE0\x92\xE9\xE4\x59\xE6\xBA\xAB\x04\x2B\xF1\xE5\x9E\xE3\x96\xF9\xE4\x4D\xEA\xCB\x93\xE6\x2F\xF2\xE4\xAC\x07\x96\xC3\xE4\x53\xE0\xCB\xC3\xE6\x2B\xE6\xE6\xB8\xE7\x97\xC3\x9D\x56\x02\xCC\x8E\xE4\x26\xE7\xE6\xCE\xE4\x98\xF4\xE5", "\x4E\xEA\xCC\x93\x56\x2B\x0D\xE6\xA4\xE1\x99\xCF\xE6\x6D\xE2\xCD\xBB\xE4\x35\xED\xB7\xAF\x00\x9B\xEE\x26\x58\x02\xCE\xBC\xE6\x39\xFF\xE6\xDD\xE7\x9E\xB1\x04\x9A\xD2\x0B\x65\xE6\x4F\xB3\x05\xEE\xE7\x5C\x34\x04\xEF\xD5\x0B\x5E\xDE\x2D\x11\xE7\xA7\xE1\x88\x37\x04\x9A\xD8\x0B\x34\xD9\x2E\x14\xD9\xBA\x04\x66\xFB\x04\x9A\xDC\x0B\x5E\xDD\x2F\x14\xD9\xBE\x05\x63\xE4\xC9\xDD\x11\x0C\x1D\xDA\x7D\x03\x06\x0E\xEA\x21\x05\x06\x9A\xD6\x0C\x34\xDB\x31\x08\xE4\xC8\x04\x66\xC9\x06\x7C\xE5\xCC\xCB\x72\x32\x11\xE8\x09\x0C\x19\x20\xE8\x15\xAE\x0C\x1C\xEA\x40\x0F\x06\x34\xD8\x1A\x34\xD9\x68\x04\xB3\xD2\x04\xCD\xD3\x06\x34\xDC\x1A\x34\xD9\x6A\x08\xC8\xD6\x04\xCD\xD7\x06\x41\xE6\x9B\xE8\xE5\x73\xEB\xD3\xE8\xE4\x34\xF9\xE6\xC8\xE1\xC8\x65\x06\x9A\xD6\x0E\x39\xE9\x35\xFC\xE6\x3F\xED\x97\xDB\xE7\xA0\xE1\xCD\xC9\xE8\xDE\x94\x07\x34\xDD\x1E\x06\xEB\xA5\xED\xD4\xC8\xEA\x55\xEC\xEA\x40\xED\xAA\xD8\xEA\x90\x93\x00\x0B\x10\xC1\xC1\x08\x04\x06\xAB\xC3\x08\xA5\xDE\xD4\xBE\xEB\x55\xFA\xEA\x68\xE9\xAB\xEA\xEA\xA5\xE9\xCE\xD4\xEB\x4E\xB2\x00\x62", "\xEE\x62\xD3\xE7\x9E\xE4\xD7\xF9\xE5\x47\xEB\xEB\x78\x9B\x02\x31\xEA\x8D\xD3\x10\x14\x03\x5E\xFE\xD8\x92\xE5\x02\x3F\xEB\x6D\xCC\x64\x16\x03\x60\xEB\x16\x17\x07\xB0\xE7\x16\x0C\x0A\xD8\xF6\xEA\x33\x59\x00\x8D\xEB\x20\x1A\x01\xC8\xE2\x10\x1B\x00\x65\xE1\x08\x1C\x07\xB2\xC0\x01\x0E\x0A\xD9\x9E\x02\x66\xE5\x12\x1F\x02\xB3\xE0\x01\xBF\xEB\xD0\xD7\x1F\x08\x1F\xEB\xF6\x0D\x04\x28\xEC\x85\x07\x02\x1A\xEC\x0A\x1A\xEC\x29\x07\xB3\xFB\x18\x15\x0A\xD9\xAB\x02\x6C\xE5\xEB\x07\x8C\x05\x2B\xED\x84\x0E\x02\x3B\xEE\x0A\xB0\x01\xB7\xEA\x97\x31\x00\xCD\xE2\x03\x1A\xEF\x0C\x1A\xEC\x34\x02\xB3\xF5\x00\xCD\xE6\x03\x1A\xEF\x0D\x01\xEE\x94\x38\x07\x1A\xED\x1C\x00\xDD\xE9\xEA\xA3\x1A\x01\xD5\xE9\xCE\x3B\x01\xEC\xEE\x28\x3C\x00\x77\xF3\x0D\x3D\x07\xBB\xE6\xEA\x1D\x3E\x03\x1A\xEF\x0F\x1A\xEC\x40\x02\xB3\xC1\x02\xCD\xE2\x04\x1A\xEF\x10\x02\xEF\x09\x0C\x08\x1A\xED\x22\x04\xDA\xF2\x24\x12\x1E\xED\x03\x0A\x09\x38\xEE\x81\x0C\x04\x1A\xED\x13\x1A\xEC\x4E\x00\xBE\xC2\x19\x27\x0A\xD9\xD0\x02\x80\xF7\xEB\xDE\xB1\x0A\x3B\xEF\x80\x03\x05\x0B\xF3", "\x3D\xB5\x02\x07\xF2\x91\x16\x02\xCD\xE7\x05\x1A\xEC\x16\x1A\xEC\x59\x02\xB3\xDA\x02\xCD\xEB\x05\x1A\xEC\x17\x11\xF0\x3A\xEE\xB1\xE1\xF0\x04\xFC\xD3\xA2\xF3\x51\xFB\xEA\x25\xF6\xE9\x1D\x02\xCD\xEE\x05\x20\xF3\x89\xE1\x13\x5F\x06\xC5\xFD\x24\x30\x0E\xE2\xE1\x02\x8B\xE2\x03\x32\xF5\xAD\xEA\x27\x31\x0A\xD9\xE4\x02\x66\xE5\x03\x9A\xEE\x0C\x1A\xED\x33\x0A\xD9\xE8\x02\x8B\xE9\x03\x9A\xEA\x0D\x35\xEF\x9E\x2D\x06\x0E\xF3\x1B\x0E\xF0\x71\x02\xB3\xF2\x02\xCD\xE3\x07\x39\xF2\x8F\x14\x03\x9A\xED\x0E\x16\xF3\xB3\xE2\x13\xF6\x02\x83\xF8\x03\x0E\xF3\x1C\xBA\x03\x2D\xF0\x35\x7B\x02\x66\xFC\x03\x9A\xED\x0F\x1A\xEC\x3F\x0A\xD9\xFF\x02\x66\xE0\x04\x9A\xE9\x10\x24\xF3\x30\x12\x08\x73\xF0\x5E\xE3\xEF\xD6\xE9\xC5\xF3\xEA\x13\xFE\xD6\xEC\xE8\x35\xA3\x04\x9A\xEC\x10\x36\xF3\x5E\xE5\x08\x03\xF7\xEE\x06\x04\x2E\xF7\x10\x2E\xF0\x44\x06\xE8\xF8\xF0\x3B\x29\x04\x9A\xEA\x11\x1A\xED\x45\x0A\xD9\x8C\x06\x66\xED\x04\x9A\xEE\x11\x2E\xF1\x47\x0A\xD9\x90\x07\x92\xF7\x2D\x93\x06\xC1\xD5\x04\x07\xF7\x09\x1A\xEC\x26\x1A\xEC\x99\x05\xD1\xC9\x08\x4D", "\x0A\xD9\x9B\x06\xAA\xFC\xF3\x43\x74\x13\x0E\xF0\x4F\x01\xE6\x91\x88\x28\x0F\xF5\x13\x19\x14\x1A\xEC\x51\x0A\xD9\xA3\x06\x66\xE4\x05\x9A\xED\x14\x1A\xEC\x53\x0A\xD9\xA7\x04\xAE\xE2\x08\xA8\x07\xD8\xE3\xF1\x3D\xF4\xE2\x8E\xF6\x9F\xFC\xF2\xCF\xF0\xC5\xF4\xD3\x54\x0A\xD9\xAA\x06\xB2\xFE\xE5\xAB\x07\xDA\xD3\x1A\x56\x0E\xE2\xAD\x06\x8B\xEE\x05\xDA\xF2\xC7\xF4\x19\x57\x0A\xD9\xB0\x06\x66\xF1\x05\x9A\xEA\x16\x1A\xED\x59\x0A\xD9\xB4\x06\x8B\xF5\x05\x9A\xEE\x16\x1F\xF5\xD3\x29\x0B\x0E\xF3\x2E\x0E\xF0\xBD\x02\xB3\xFE\x04\xCD\xEF\x0B\x57\xF4\x30\x1A\xEC\xC1\x01\xDC\xF8\xED\x09\x72\x0C\x0E\xF0\x31\x15\xF5\x36\x8E\x18\x02\xF8\x20\x17\x0C\x1A\xEC\x32\x1A\xEC\xC9\x02\xB3\xCA\x06\xCD\xEB\x0C\x1A\xEC\x33\x1A\xEC\xCD\x07\xDA\xCE\x07\x85\xF2\xED\xF5\xE9\xB3\xFE\xF8\xCC\xF1\xE4\xCB\xF7\x91\xFE\xCB\xCF\x04\xC7\xF9\xF3\xCE\xF2\xCF\xE4\xF9\x3E\xFA\xF2\xAF\xF3\x9D\xE0\xF9\x65\x50\x1A\x27\xF8\x92\x41\x0D\x57\xF6\x34\x1A\xEC\xD3\x02\xB3\xD4\x06\xCD\xE5\x0D\x1A\xEE\x35\x1A\xEC\xD7\x02\xB3\xD8\x06\xCD\xE9\x0D\x1A\xEE\x36\x1A\xEC\xDB\x02", "\xB3\xDC\x07\x99\xF1\xED\xE5\x25\x37\x0C\xFA\xB3\x0E\x1B\x10\xFB\x94\xF4\xF5\xAF\xDF\x37\x13\xFA\xA8\x58\x1C\x1A\xED\x70\x08\xF5\x9E\xBE\x38\x1D\xFA\x13\x1B\x1C\x2E\xF0\x72\x0E\xE2\xE5\x04\xD8\xE2\xF9\x9A\x26\x1C\x1A\xED\x73\x0A\xD9\xE8\x06\x66\xE9\x07\x9A\xEA\x1D\x1A\xED\x75\x0E\xE2\xEC\x06\x66\xED\x07\xF3\xF7\xC2\x30\x06\x07\xF2\x0F\x0E\xF0\x3D\x1A\xEC\xF5\x02\xB3\xF6\x07\x6B\xF7\x0F\x1A\xEC\x3E\x07\xFB\x2B\xFD\x8E\x79\x06\x07\xFB\x0F\x08\xFA\x6D\x9D\x07\x88\xF8\x00\x3E\x07\xCF\xEA\xD9\x80\x02\x83\x1F\xEA\xF7\x0F\xF2\xD2\xD9\x81\x02\x00\x1A\xFE\x5C\xE1\x08\x03\x06\xF3\xFC\xEA\x81\x04\x00\x22\xFC\x60\xFB\x19\x05\x06\xF4\xC4\xED\x8E\xF0\xEB\x83\xFB\xC7\xED\xFD\xD0\xF5\xE5\xEC\xF9\xF7\x86\x00\x2A\xFF\x10\x96\xFD\x30\xFD\xA1\x78\xFC\xA9\x39\x00\x3B\xFF\xC4\x0A\x00\xBE\xF8\x64\x0B\x01\xE0\xF9\xF8\xFD\x38\x03\x04\xFE\x39\x10\xF9\xCE\x00\xE4\xFF\x00\x48\xFC\x04\x08\xFE\x11\x00\xF9\xC5\x12\x09\x08\xFC\x93\x02\xE9\xE5\xED\xEF\x1E\x02\x26\xFC\xFB\x08\x01\x5B\xFE\x42\x1A\x00\xC8\xFB\x03\x08\xFE\x0E\x02\xFD\xBB\x19\x07", "\x08\xFE\x1E\x05\xFC\xEE\xFC\x75\xAF\x01\x5E\xFD\x42\x01\x01\xEE\xFA\x85\xA3\x00\xF5\xFA\x4B\x24\x00\xF2\xE5\x01\xC8\xFE\x04\x08\xFF\x13\x08\xFC\xA8\x00\xF2\xE9\x01\xC8\x7E\x0A\x04\xFF\x50\x0D\x2B\x03\x00\x88\xF2\x79\x7E\xB3\x7C\x02\x82\xEE\x71\x7E\x55\x7C\xEC\x7A\x63\x2C\x00\x06\x83\xCB\x7E\x00\x87\x80\x13\x82\x04\x8F\xFA\x57\x80\x68\x7D\xBB\x5D\x02\x08\x7F\x2E\x01\x04\x8D\xF4\x74\x09\x2F\x02\x07\x85\x9D\x22\x80\xD9\x24\x09\x89\x10\x32\x00\x26\x81\x05\x8C\x68\x33\x00\xC8\x7C\x0D\x08\xFC\x75\x00\xC8\x7E\x0D\x08\xFC\x77\x00\xC8\x7C\x0E\x09\x02\x83\x04\x39\x00\xF2\x7A\x03\x17\x7F\xF2\x11\x0F\x01\xFF\x43\x04\x3F\x03\x0F\x82\x10\x01\x01\xC8\x7E\x10\x08\xFC\x43\x01\x37\x80\xC8\x04\x04\x08\x7F\x45\x01\x12\x85\xFC\x76\x46\x46\x02\x10\x81\x10\x08\x01\x52\x83\x3D\x5A\x04\x0E\x81\x9A\x13\x12\x08\xFC\x4C\x01\xC8\x7D\x13\x08\xFC\x4E\x01\xC8\x7F\x13\x08\xFC\x50\x01\xC8\x7D\x14\x08\x05\x89\x80\x2A\x82\xEC\x7B\x00\xAC\x7E\x18\x83\x13\x8C\x06\xB8\x66\x52\x00\xF2\x73\x05\x27\x81\xED\x68\x15\x04\x07\xB0\x12\x55\x00\x16\x86\x05", "\x18\x81\x57\x03\x1D\x8C\x00\xBD\x14\x58\x00\xF2\x79\x05\x08\x7F\x5A\x00\xF2\x7B\x05\x08\x7F\x5C\x00\xF2\x7D\x05\x18\x81\x5E\x00\xF2\x7F\x05\x3C\x80\x3D\x16\x18\x05\x05\xA4\x01\x55\x82\x19\x08\xFC\x67\x01\xC8\x7C\x1A\x0E\x07\xB8\x08\x69\x00\xF2\x7A\x06\x1B\x82\x14\x83\x3D\x4B\x06\x15\x81\x6D\x01\x15\x83\x0E\x6F\x01\xA0\x81\xE0\x00\x07\x08\x7F\x71\x00\xF2\x72\x07\x08\x7F\x73\x00\xF2\x74\x07\x08\x7F\x75\x00\xF2\x76\x07\x29\x82\x8E\x0B\x1D\x08\xFC\x78\x01\xB8\x82\x1A\x8B\xFE\x6E\x81\xA1\x81\x06\x8B\x06\x81\x83\xC0\x80\x9D\x29\x07\x3D\x82\x0D\x81\x1B\x8E\xF2\x5F\x80\xCC\x82\x2F\x8F\x07\xA9\x81\x18\x22\x1E\x08\xFC\x7B\x01\xC8\x82\x02\x8F\x0B\x8B\x83\xCE\x83\x1B\x85\x0C\x8D\x83\xC9\x83\x0D\x3C\x07\x08\x7F\x7D\x01\x35\x8C\xBA\x7E\x01\xE2\x83\x0F\x1F\x07\x18\x81\x80\x00\x16\x81\x08\x25\x83\xC2\x80\x2C\x12\x08\x08\x7F\x83\x00\xF2\x74\x08\x08\x7F\x85\x00\xF2\x76\x08\x08\x7F\x87\x00\x16\x88\x08\x08\x7F\x89\x00\x24\x87\x5B\x0C\x02\x55\x82\x23\x05\x05\x90\x02\xC8\x7D\x24\x08\xFC\x52\x02\xEC\x81\x40\x03\x09\x08\x7F\x94\x01", "\x42\x88\x0D\xA5\x39\x95\x01\x15\x87\x09\x26\x82\x11\x45\x26\x0E\x10\x85\x09\x9A\x00\xF2\x7B\x09\x08\x7F\x9C\x00\xF2\x7D\x09\x08\x7F\x9E\x00\xF2\x7F\x09\x08\x7F\xA0\x03\x45\x83\x0C\x96\x80\xED\x83\x33\x8A\x0C\xA8\x81\x2B\x87\x49\x80\x32\x61\x02\xC8\x7E\x28\x06\x12\xA1\x68\xA3\x03\x4C\x89\x33\x24\x02\x58\x81\x29\x08\x05\xA6\x02\x36\x86\x36\x8A\x49\x27\x02\xC8\x7C\x2A\x08\xFC\x69\x02\xC8\x7E\x2A\x08\xFC\x6B\x02\xC8\x7C\x2B\x08\x05\xAD\x02\xC8\x7E\x2B\x0E\x0F\xA7\x16\xB1\x01\x15\x83\x0B\x15\x81\xB5\x00\xF2\x76\x0B\x08\x7F\xB7\x02\x43\x88\x0B\x08\x7F\xB9\x01\x4F\x84\x0C\xBE\x38\xBA\x01\x15\x8C\x0B\x14\x84\x36\x46\x2F\x0E\x15\xB4\x09\xBF\x00\xF2\x70\x0C\x08\x7F\xC1\x00\xF2\x72\x0C\x08\x7F\xC3\x00\xF2\x74\x0C\x08\x7F\xC5\x02\x43\x86\x0C\x08\x7F\xC7\x03\x53\x89\x12\xBE\x84\x2C\x87\x5E\x8F\x15\xBD\x85\xDB\x81\x36\x8D\xAD\x0A\x03\xC8\x7F\x32\x07\x16\x82\x6B\xCC\x03\x61\x83\x2B\x0D\x03\x58\x82\x33\x08\x05\x8F\x03\x8A\x85\x37\x8B\x32\x10\x03\xC8\x7D\x34\x08\xFC\x52\x03\xC8\x7F\x34\x08\xFC\x54\x03\xC8\x7D\x35\x08\x05\x96", "\x03\xC8\x7F\x35\x0A\x17\x95\x18\xDA\x01\x15\x8C\x0D\x15\x81\xDE\x00\xF2\x7F\x0D\x08\x7F\xE0\x02\x43\x81\x0E\x08\x7F\xE2\x01\x64\x86\x0D\xBD\x29\xE3\x01\x15\x85\x0E\x24\x85\xB6\x47\x39\x02\x1B\x86\x04\xE8\x00\xF2\x79\x0E\x08\x7F\xEA\x00\xF2\x7B\x0E\x08\x7F\xEC\x00\xF2\x7D\x0E\x08\x7F\xEE\x02\x43\x8F\x0E\x08\x7F\xF0\x03\x68\x8F\x10\xB3\x86\x7C\x86\x4B\x82\x18\xA8\x84\x81\x86\x64\x8D\xC4\x33\x03\xC8\x7C\x3D\x0B\x1B\x90\x68\xF5\x03\x76\x83\x02\x58\x81\xF7\x00\x16\x88\x0F\x1E\x87\xD5\x87\xB9\x09\x0F\x08\x7F\xFA\x00\xF2\x7B\x0F\x08\x7F\xFC\x00\xF2\x7D\x0F\x08\x7F\xFE\x03\x19\x88\xFC\x40\x00\x11\x0A\x33\x62\x4F\x03\x00\xF5\x84\xE7\x78\x4B\x79\x87\x02\x06\x7D\x07\x00\x3C\x87\xA3\x7D\x40\x08\x00\x00\x88\x1E\x6D\x02\x04\x20\xAB\x7E\x6F\x0E\x02\x07\x20\x8A\x04\x0B\x03\x82\x80\x1D\x99\x48\x0C\x00\x81\x86\x1F\x0E\x00\x12\x8B\x7B\x40\x01\x0E\x88\xB7\x15\x04\x08\x21\x83\x04\x12\x03\x86\x82\x10\x13\x00\x1E\x89\x40\x04\x01\x21\x88\x00\x01\x05\x04\x22\x96\x00\x24\x8B\x05\x04\x22\x93\x0D\x18\x00\x89\x89\x01\x04\x88\xD8\x7C\x34", "\x8F\x20\x94\x87\xCF\x86\x8C\x86\x23\xAD\x84\xD7\x80\xE0\x4C\x01\x2B\x88\xD2\x86\x75\x80\x18\xB5\x88\x38\x8A\x4A\x8E\x17\xB4\x88\xBD\x11\x07\x0C\x23\xB9\x88\x3D\x8B\x8C\x8C\x0D\x8A\x89\xD3\x87\x92\x87\x23\xA0\x1D\x1E\x03\x91\x82\x24\xA5\x87\x4F\x88\x95\x81\x24\x91\x87\x48\x8A\x1B\x7F\x01\x24\x88\x20\x00\x8C\x8E\x23\x89\x89\x55\x88\x90\x83\x24\x8E\x89\x57\x8B\x5F\x85\xC7\x23\x00\x24\x88\x09\x02\x25\xBE\x84\x25\x03\x9A\x83\x67\x26\x00\x6E\x88\x9D\x07\x02\x31\x89\x8E\x08\x0A\x04\x27\x8D\x89\x37\x15\x0A\x04\x22\xAA\x00\x24\x8B\x0A\x04\x22\xAC\x00\x24\x89\x0B\x04\x22\xAE\x00\x77\x8A\x42\x0F\x02\x24\x88\x30\x02\x97\x8D\x53\x33\x00\x15\x8A\x12\x1D\x28\x86\x04\x37\x00\x89\x88\x03\x24\x88\x39\x01\xA1\x87\x2E\x3A\x00\x24\x8B\x0E\x06\x29\xA1\x89\x18\x38\x0F\x0F\x28\x83\x04\x3E\x03\xA7\x8A\x4E\x40\x01\x9B\x8B\x0F\x11\x04\x24\x88\x42\x00\x89\x83\x04\x24\x88\x44\x00\x89\x85\x04\x24\x88\x46\x00\x89\x87\x04\x25\x8A\x63\x88\x9E\x8F\x25\x99\x89\x53\x8A\x98\x86\x25\xB5\x8A\xEF\x44\x12\x04\x22\x89\x01\xB4\x88\xC9\x7A\x04\x01\x8B", "\x3B\x1B\x12\x04\x2C\x8C\x01\xC4\x89\x13\x04\x2C\xBF\x88\x53\x0E\x13\x04\x22\x8F\x01\x24\x88\x14\x04\x22\x91\x01\x24\x8A\x14\x04\x22\x93\x01\xC4\x88\x15\x04\x22\x95\x01\x8A\x8B\x6D\x18\x05\x22\x8A\x01\x06\x16\x00\x2E\x80\x00\x5C\x00\x89\x8D\x05\x24\x88\x5E\x03\xB2\x8C\x23\x1F\x01\x24\x88\x18\x0A\x2E\xB8\x8A\x41\x39\x18\x03\x2E\xA3\x01\xE3\x8B\x38\x45\x06\x2F\x8B\x39\x0E\x19\x04\x22\xA7\x01\x24\x88\x1A\x04\x22\xA9\x01\x24\x8A\x1A\x04\x22\xAB\x01\x24\x88\x1B\x08\x2F\xB8\x08\x6D\x00\x89\x8E\x06\x04\x88\x08\x4C\xB3\x80\x26\xA5\x89\x44\x8B\xC3\x8C\x2B\x8C\x89\xB7\x8A\x2E\x12\x07\x24\x88\x73\x03\xC1\x8E\xC8\x74\x01\x1A\x8C\x3B\x15\x07\x04\x8B\x76\x00\xB1\x87\x07\x1D\x8C\x64\x8B\x85\x18\x07\x24\x88\x79\x00\x89\x8A\x07\x24\x88\x7B\x00\x89\x8C\x07\x24\x88\x7D\x00\xB1\x8E\x07\x24\x88\x7F\x01\xB7\x87\x5A\x02\x02\xE3\x88\x21\x03\x2E\x86\x02\x24\x8B\x21\x04\x22\x88\x02\x24\x8F\x6C\x09\x08\x24\x88\x8A\x01\xD0\x85\x31\x93\x32\x8B\x03\xB8\x8D\x08\x35\x8B\x11\x47\x23\x06\x34\xA7\x0B\x90\x00\x89\x81\x09\x24\x88\x92\x00\x89\x83", "\x09\x24\x88\x94\x00\x89\x85\x09\x24\x88\x96\x03\xD3\x86\x10\x17\x02\x24\x88\x26\x0C\x30\x87\x8D\x66\x88\xBC\x85\x36\xB9\x8A\x0E\x8E\xD9\x81\x31\xBD\x1D\x9C\x00\x89\x8D\x09\x1E\x8D\x4A\x72\x27\x00\x37\x8A\x12\x9F\x00\xB1\x80\x0A\x04\x8B\xA1\x03\xDC\x8B\x2B\x88\x12\xA2\x00\x89\x83\x0A\x24\x88\xA4\x00\x89\x85\x0A\x24\x88\xA6\x00\x89\x87\x0A\x04\x8B\xA8\x00\x89\x89\x0A\x36\x8C\x17\x18\x2B\x03\x2E\xAE\x02\xE3\x88\x2C\x04\x22\xB1\x02\x24\x8A\x2C\x0A\x37\x80\x00\xB3\x00\x89\x84\x0B\x17\x8E\x69\x8D\x9F\x25\x0B\x23\x8B\xB7\x00\xD3\x86\x13\x79\x02\x9C\x8C\x8F\x0A\x0B\x24\x88\xBB\x00\x89\x8C\x0B\x24\x88\xBD\x00\x89\x8E\x0B\x24\x88\xBF\x00\x89\x80\x0C\x17\x8E\xC1\x00\x89\x82\x0C\x23\x8D\x14\x8D\xEE\x8C\x29\x92\x8C\x7B\x8E\xAE\x8E\x3B\x9D\x8E\x3A\x1A\x31\x04\x22\x87\x03\xA5\x8D\x88\x68\x0C\x05\x8F\x39\x0D\x32\x04\x2C\x8A\x03\xC4\x8B\x32\x08\x3C\x98\x89\x39\x0C\x33\x04\x22\x8D\x03\x24\x8A\x33\x04\x22\x8F\x03\x24\x88\x34\x04\x22\x91\x03\xC4\x8A\x34\x04\x22\x93\x03\x8C\x8D\x85\x16\x0D\x23\x8B\xD8\x03\xB8\x8A\x0D\x24\x88\xDB", "\x00\x89\x8C\x0D\x17\x8E\xDD\x00\x89\x8E\x0D\x0F\x8F\x67\x8F\x24\x3F\x0D\x23\x8B\xE1\x02\xE8\x86\x1B\x63\x03\xF0\x8C\x9D\x04\x0E\x24\x88\xE5\x00\x89\x86\x0E\x24\x88\xE7\x00\x89\x88\x0E\x24\x88\xE9\x00\x89\x8A\x0E\x17\x8E\xEB\x00\x89\x8C\x0E\x38\x8E\xBB\x8E\xDA\x85\x32\xBD\x8E\xC0\x8D\xFC\x82\x41\xAB\x8D\xB6\x44\x3C\x09\x3F\x8F\x90\xBF\x8C\xEF\x89\x41\x8E\x90\xB6\x8A\xEE\x8F\x45\x71\x03\x17\x91\x07\x9D\x40\xA8\x8D\x1A\x91\x04\x94\x41\x90\x8F\x3E\x86\x3C\x01\x42\xA4\x8D\x27\x93\x04\x98\x41\xA6\x90\x2F\x91\x09\x92\x43\xB0\x12\xF3\x03\x0A\x9E\x41\x93\x8C\x23\x90\x0A\x9E\x42\xA2\x90\x10\x8F\xF8\x14\x0F\x24\x88\xF5\x00\x03\x9D\x43\xBC\x90\x38\x93\x10\x9C\x42\xB1\x90\x1C\x93\x11\x9C\x6C\x39\x03\x24\x8A\x3E\x06\x43\x9E\x5E\xFB\x03\x13\x93\x31\x3C\x03\xC4\x89\x3F\x04\x2C\xBE\x03\x52\x91\x11\x92\x32\x24\x88\x13\x09\x27\x21\x00\x14\x08\x98\x7E\x00\x00\x46\x9B\x7E\x02\x07\x00\x03\x46\x9F\x7E\xAA\x4B\x19\x91\x20\xB5\x0C\x05\x02\x1A\x9E\xB1\x46\x00\x6E\x91\x8C\x8F\x43\x09\x00\x6E\x92\x7D\x0B\x00\x35\x91\x0A\x05\x03\x0E\x46", "\x9E\x07\x0E\x03\x1E\x96\xD1\x3E\x91\xEF\x0C\x04\x00\x48\x86\x04\x11\x03\x20\x96\x44\x87\x44\x12\x00\x1E\x99\x10\x14\x00\x8A\x92\x0A\x56\x01\x06\x92\x17\x1B\x05\x00\x49\x81\x04\x18\x03\x24\x90\x00\x19\x00\x96\x92\x06\x06\x49\x9B\x00\x96\x90\x07\x06\x49\x9D\x00\x96\x90\x0C\x94\x44\x90\x90\x33\x90\x09\x99\x44\xB7\x90\xA4\x91\xDF\x1E\x01\x16\x92\x1F\x01\x28\x99\xCE\x60\x00\xAE\x92\x92\x11\x02\x31\x92\x40\x0A\x08\x04\x4B\xB8\x08\x23\x03\x2D\x9B\x43\xB2\x13\x24\x02\x25\x95\x02\x16\x92\x26\x02\x25\x97\x02\x16\x92\x28\x02\x25\x99\x02\x3A\x92\x74\x0A\x0A\x06\x49\xAB\x00\x71\x92\x3C\x1E\x02\x0D\x92\x03\x04\x0C\x00\x4D\x8B\x04\x96\x93\x0C\x06\x49\xB4\x00\xC8\x92\xE5\x05\x03\x16\x92\x36\x01\x36\x93\x4A\xAB\x44\x37\x03\x34\x94\x71\x62\x93\xF7\x53\x0E\x0E\x4D\x97\x0F\x3C\x02\x25\x9D\x03\x16\x92\x3E\x02\x25\x9F\x03\x16\x92\x40\x02\x25\x91\x04\x16\x92\x42\x03\x39\x97\x2E\x03\x01\x96\x90\x11\x04\x4E\xA2\x92\x4A\x91\x3F\x98\x4A\x9B\x90\xA6\x91\x40\x9A\x43\x81\x0E\x46\x02\x25\x97\x04\x36\x93\x26\x78\x12\x08\x50\xA7\x16\x49\x03", "\x42\x92\x10\x0A\x01\x0E\x95\x40\x0B\x04\x11\x94\x00\x96\x8E\x1C\x04\x16\x92\x4D\x02\x25\x9E\x04\x16\x92\x4F\x02\x25\x90\x05\x16\x92\x51\x00\x45\x92\x05\x16\x92\x53\x01\x33\x9D\x53\x16\x01\xE4\x90\x16\x04\x4E\x9A\x01\x96\x93\x16\x06\x49\x9C\x01\x14\x95\x91\x0D\x05\x16\x92\x5E\x01\x4C\x95\x4A\x93\x32\x5F\x00\x39\x91\x06\x3B\x93\x11\x47\x18\x06\x53\xB4\x0C\x64\x02\x25\x95\x06\x16\x92\x66\x02\x25\x97\x06\x16\x92\x68\x02\x25\x99\x06\x16\x92\x6A\x03\x4F\x90\x24\x2B\x01\x96\x90\x1B\x0C\x53\xA7\x92\x39\x93\x2E\x9F\x4F\xBC\x93\x57\x97\x4D\x96\x55\x95\x95\x2D\x91\x7E\x3E\x06\x0E\x95\x03\x94\x12\x92\x50\x9B\x95\x87\x90\x57\x92\x56\xA1\x95\xBB\x0F\x1B\x00\x56\xA4\x95\x5A\x91\x2A\x93\x56\x9D\x95\x8E\x08\x1C\x06\x49\xB1\x01\x53\x97\x5B\x97\x56\xAC\x95\x6E\x94\x5A\x9E\x4F\xA6\x95\xDF\x93\xD4\x03\x07\x16\x92\x74\x03\x5A\x9C\xC5\x75\x01\x82\x96\x3B\x16\x07\x14\x94\x77\x00\x45\x98\x07\x05\x96\x7D\x97\xCE\x09\x07\x16\x92\x7A\x02\x25\x9B\x07\x16\x92\x7C\x02\x25\x9D\x07\x16\x92\x7E\x00\x45\x9F\x07\x16\x92\x80\x02\x49\x97\x5B\x03", "\x02\xE4\x91\x21\x04\x4E\x87\x02\x96\x90\x22\x06\x49\x89\x02\x8C\x96\x42\x0A\x08\x16\x92\x8B\x01\x6A\x99\x55\x93\x2A\x8C\x00\x39\x9E\x08\x35\x95\x15\x44\x24\x0E\x5A\x82\x0C\x91\x02\x25\x92\x09\x16\x92\x93\x02\x25\x94\x09\x16\x92\x95\x02\x25\x96\x09\x16\x92\x97\x03\x6D\x95\x56\x87\x97\x6D\x95\x45\x98\x57\x8A\x97\x70\x95\x63\x96\xC9\x18\x02\x96\x91\x26\x06\x5C\x82\x71\x9A\x03\x74\x98\x48\x1B\x02\x14\x94\x27\x04\x51\x9D\x02\xD6\x94\x73\x9E\x4E\x1E\x02\x96\x93\x27\x06\x49\xA0\x02\x96\x91\x28\x06\x49\xA2\x02\x96\x93\x28\x04\x51\xA4\x02\x96\x91\x29\x0E\x59\xA7\x16\xA8\x00\x39\x9A\x0A\x24\x93\xAC\x02\x25\x9D\x0A\x16\x92\xAE\x01\x77\x9F\x0A\x16\x92\xB0\x01\x77\x98\x55\x8C\x28\xB1\x00\x39\x93\x0B\x34\x96\x19\x49\x2D\x0E\x5F\xBC\x08\xB6\x02\x25\x97\x0B\x16\x92\xB8\x02\x25\x99\x0B\x16\x92\xBA\x02\x25\x9B\x0B\x16\x92\xBC\x01\x77\x9D\x0B\x16\x92\xBE\x02\x1B\x91\x6E\x5E\x97\xCE\x96\x5D\x9D\x61\xBA\x95\xAF\x96\x87\x9B\x57\x93\x0C\xC4\x02\x25\x95\x0C\x07\x98\x21\x6A\x31\x08\x62\xB9\x0C\xC7\x00\x45\x98\x0C\x14\x94\xC9\x03\x8A", "\x90\x62\x82\x0C\xCA\x02\x25\x9B\x0C\x16\x92\xCC\x02\x25\x9D\x0C\x16\x92\xCE\x02\x25\x9F\x0C\x14\x94\xD0\x02\x25\x91\x0D\x2F\x97\x17\x18\x35\x04\x4E\x96\x03\xE4\x90\x36\x06\x49\x99\x03\x96\x92\x36\x0D\x5D\x9B\x03\x96\x90\x37\x02\x63\x8B\x97\x80\x29\x37\x04\x4E\x9F\x03\x04\x9A\x4C\x41\x0E\x13\x99\x74\x0A\x38\x06\x49\xA3\x03\x96\x90\x39\x06\x49\xA5\x03\x96\x92\x39\x06\x49\xA7\x03\x96\x90\x3A\x0D\x5D\xA9\x03\x96\x92\x3A\x0A\x61\xA3\x98\xC9\x97\x7F\x98\x5C\xB9\x95\x54\x9A\x56\x9D\x5C\x8A\x04\xF0\x02\x25\x91\x0F\x1C\x99\xC2\x6A\x3C\x0C\x67\xB3\x0A\xF3\x00\x45\x94\x0F\x14\x94\xF5\x03\x9F\x90\x67\x81\x04\xF6\x02\x25\x97\x0F\x16\x92\xF8\x02\x25\x99\x0F\x16\x92\xFA\x02\x25\x9B\x0F\x14\x94\xFC\x02\x25\x9D\x0F\x04\x99\x15\x19\x8E\x0A\x0A\x7D\x87\x3A\x0B\x2B\x5C\x88\x1D\x9A\x64\x91\x40\x05\x00\x20\x9A\x68\x92\x01\x04\x6A\xAB\x91\x53\x0F\x01\x07\x6A\x9E\x6C\x08\x03\xAA\x98\x20\xB7\x99\xEA\x39\x02\x0B\x6A\xB6\x91\xB3\x9B\x7B\x4D\x00\x2E\x9A\xF2\x12\x03\x08\x6B\x89\x04\x0F\x03\xAE\x96\x10\x10\x00\xBE\x9B\x40\x01\x01\x01\x9B", "\x61\x40\xB1\x94\x06\x46\x9B\x67\x40\xB2\x93\x35\x15\x00\xC8\x9A\x05\x0B\x6A\x9B\x98\x72\x99\x9C\x96\x67\xB7\x95\xB0\x98\x5F\x97\x68\x9C\x98\x0A\x04\x07\x08\x6C\x9D\x00\xCA\x99\x3A\x7E\x01\x1D\x9B\x4A\x1B\x07\x00\x6E\x80\x09\x20\x03\xB8\x98\x23\x21\x00\xE6\x99\x9D\x90\x4B\x22\x00\xC8\x9B\x08\x08\x6C\xA4\x00\xC8\x99\x09\x08\x6C\xA6\x00\xC8\x9B\x09\x09\x6E\xB4\x09\x28\x00\xB2\x99\x02\x2B\x9A\x72\x92\x22\x1C\x02\x35\x9A\xBC\x74\xC0\x96\x10\x30\x00\xC8\x99\x0C\x08\x6C\xB2\x00\xF7\x9A\xE5\x03\x03\x08\x9B\x34\x01\xC2\x9F\x61\x8B\x39\x35\x02\xC0\x93\x10\x37\x00\x12\x9E\x3A\x59\x03\x0E\x9C\xD7\x0E\x0E\x08\x6C\xBB\x00\xC8\x98\x0F\x08\x6C\xBD\x00\xC8\x9A\x0F\x08\x6C\xBF\x00\xC8\x98\x10\x08\x71\xA7\x0B\x41\x00\xB2\x92\x04\x0F\x9B\xD7\x99\xB4\x94\x67\x95\x9B\x73\x98\xB6\x91\x62\xB3\x98\x03\x04\x12\x08\x6C\x89\x01\x27\x9E\x89\x7A\x04\x39\x9C\xA7\x17\x12\x0C\x73\xBC\x77\x3F\x9D\x40\x0D\x04\x01\x9D\x32\x9F\x6D\x1E\x04\x08\x9B\x4F\x00\xB2\x90\x05\x08\x9B\x51\x00\xB2\x92\x05\x08\x9B\x53\x00\xD1\x94\x05\x08\x9B\x55\x00\xBF\x92", "\x4F\x18\x01\x15\x9D\xB8\x89\x75\xA4\x8B\xC8\x99\x17\x08\x6C\x9E\x01\x44\x9D\x91\x0F\x05\x08\x9B\x60\x01\xD8\x93\x6D\xAC\x2E\x61\x03\xD6\x93\x06\x1B\x9D\xF6\x8A\xD9\x94\x33\x26\x01\xC8\x9B\x19\x08\x6C\xA8\x01\xC8\x99\x1A\x08\x6C\xAA\x01\xC8\x9B\x1A\x08\x6C\xAC\x01\x6E\x9C\x90\x0D\x06\x08\x9B\x6E\x00\xCB\x93\x73\xAA\x9B\x22\x9B\xE0\x90\x73\x92\x9B\x54\x95\xCC\x94\x07\x08\x9B\x75\x01\xDF\x9E\xC7\x76\x01\x8E\x9D\x39\x17\x07\x04\x9D\x78\x00\xD1\x99\x07\x11\x9E\x87\x9C\x22\x1A\x07\x08\x9B\x7B\x00\xB2\x9C\x07\x08\x9B\x7D\x00\xB2\x9E\x07\x08\x9B\x7F\x00\xD1\x90\x08\x08\x9B\x81\x02\xD5\x9D\x53\x04\x02\x5B\x9E\x21\x0B\x75\x88\x02\xC8\x99\x22\x08\x6C\x8A\x02\x98\x9E\xA3\x0B\x08\x08\x9B\x8C\x01\xED\x9F\x70\x9F\x32\x8D\x03\xD6\x9F\x08\x2C\x9D\x11\x45\x24\x0A\x7B\x8B\x0B\x92\x00\xB2\x93\x09\x08\x9B\x94\x00\xB2\x95\x09\x08\x9B\x96\x00\xB2\x97\x09\x08\x9B\x98\x03\xF0\x99\x10\x19\x02\xC8\x9A\x26\x02\x78\x96\x9B\x86\x9C\xB5\x9A\x7D\xBB\x9E\xDB\x9D\xCB\x97\x76\xBE\x54\xA0\x02\xF4\x98\x7D\xA3\x9F\x31\x9E\xCB\x95\x74\xA5\x9F\xDF", "\x9C\xEA\x21\x0A\x22\x9F\xE8\x9D\xE2\x98\x78\x85\x9E\xE4\x9F\xFB\x94\x73\xAA\x53\xA2\x00\xFB\x92\x7F\x84\x9E\xF3\x9F\xCB\x9D\x7D\x99\x9F\xDC\x9F\x37\x93\x0A\x36\x9F\xFA\x9D\xFF\x9E\x7D\xAE\x9F\x01\xA3\x00\xA0\x7F\x82\x38\xA4\x00\x00\xA7\x7E\xB7\x9F\x99\x9F\x02\xA5\x80\xBC\x9F\x06\xA1\x90\x35\x0A\x0A\xA0\xE6\x9D\x05\xA9\x7E\xB1\x9F\x0F\xA0\x06\xA7\x4F\x66\x02\xC8\x9B\x29\x07\x7D\xAD\x9F\x07\xA0\x03\xAB\x7F\x9A\xA0\x16\xA0\x01\xAE\x80\x80\x00\xAD\x00\xB2\x9E\x0A\x14\xA0\x98\x5B\x2B\x0C\x82\xB4\x0C\xB0\x00\xD1\x91\x0B\x04\x9D\xB2\x03\x0B\xA1\x82\xAB\x0C\xB3\x00\xB2\x94\x0B\x08\x9B\xB5\x00\xB2\x96\x0B\x08\x9B\xB7\x00\xB2\x98\x0B\x04\x9D\xB9\x00\xB2\x9A\x0B\x2A\x9E\xB7\x15\x2F\x0B\x75\xBF\x02\x5B\x9D\x30\x08\x6C\x82\x03\xC8\x9B\x30\x0A\x80\x84\x03\xC8\x99\x31\x06\x83\xB9\x9F\x4D\x32\x31\x0B\x75\x88\x03\xC0\x9E\x4D\x4A\x0C\x17\xA1\x61\x0B\x32\x08\x6C\x8C\x03\xC8\x99\x33\x08\x6C\x8E\x03\xC8\x9B\x33\x08\x6C\x90\x03\xC8\x99\x34\x00\x86\x8D\xA0\x25\xA3\x0D\xA7\x82\xB1\xA1\x58\xA0\x1D\xAE\xC8\x52\x03\xC8\x9B\x34\x0F\x86", "\x82\x6B\xD4\x03\x1E\xA3\x2B\x15\x03\x44\x9E\x35\x04\x74\x97\x03\x7E\xA3\xB5\x98\x0D\x08\x9B\xD9\x00\xB2\x9A\x0D\x08\x9B\xDB\x00\xB2\x9C\x0D\x08\x9B\xDD\x00\xD1\x9E\x0D\x08\x9B\xDF\x00\x12\xA7\x5A\x22\x03\x5B\x9C\x39\x0B\x75\xA6\x03\xC8\x9B\x39\x08\x6C\xA8\x03\x0A\xA1\x3A\x08\x6C\xAA\x03\x85\xA0\x04\xA0\x83\x2B\x03\x5B\x9D\x3B\x0D\x85\xB6\x46\xEF\x01\x29\xA6\x10\x30\x03\xC8\x99\x3C\x08\x6C\xB2\x03\xC8\x9B\x3C\x08\x6C\xB4\x03\xC8\x99\x3D\x08\x6C\xB6\x03\x0A\xA3\x3D\x08\x6C\xB8\x03\xAE\xA0\x08\xA5\x87\x97\xA0\xC2\xA0\xFE\x96\x8C\xB0\xA1\xC4\xA2\x08\xA2\x80\x82\x26\xF9\x01\x30\xAA\x8C\x91\xA0\xC7\xA3\x08\xA7\x0F\x7A\x03\xC8\x9B\x3E\x0E\x8C\x99\xA0\xC5\xA0\x32\xA6\x82\xB6\xA1\xDA\xA2\x1C\xA3\x0E\x7C\x03\xC8\x99\x3F\x07\x8D\xBC\x68\xFE\x03\x38\xA8\x24\x04\x9D\x41\x0B\x12\x41\x00\x14\x5B\xAF\x9A\x34\xA7\x61\x02\x00\xEC\xA1\x22\x21\x8F\x8C\x22\xF3\xA3\x23\x25\x8F\x92\x22\xF7\xA1\x25\x29\x8F\xAB\x0C\x08\x03\x3E\xA0\x00\x09\x00\xD4\x59\xBF\x98\x48\x0C\x00\xD4\x5B\x84\x85\x90\x8A\x04\x10\x02\x3F\xA1\x01\x3E\xA3\x12\x02", "\x3F\xA3\x35\x13\x00\xFE\xA0\x05\x0E\x90\x89\xA3\x25\x39\x05\x07\x90\xA2\x04\x17\xA6\x0A\x59\x01\x13\xA4\xB0\x12\x06\x0E\x8F\x9B\x00\xFE\xA0\x07\x0E\x8F\x9D\x00\xFE\xA2\x07\x0E\x8F\x9F\x00\xFE\xA0\x08\x0C\x91\x9E\xA3\x14\xA7\x1C\xAD\x92\x9C\xA3\xEE\xA0\x36\xAF\x8C\xAF\x7F\xFE\xA2\x08\x0B\x92\xBE\x84\x23\x03\x4D\xA3\x67\x24\x00\x3A\xA4\x9D\x05\x02\x3D\xA4\x8E\x0A\x09\x00\x94\x8B\xA3\x41\x13\x09\x0E\x8F\xA8\x00\xFE\xA1\x0A\x0E\x8F\xAA\x00\xFE\xA3\x0A\x0E\x8F\xAC\x00\x43\xA6\x42\x0D\x02\x3E\xA3\x2E\x01\x40\xA2\x4F\x31\x00\x19\xA7\x2A\x49\x95\x82\x04\x35\x02\x3F\xA6\x03\x3E\xA3\x37\x01\x54\xA7\x2E\x38\x00\xFE\xA1\x0E\x02\x96\xA4\xA0\x75\x32\x0E\x0B\x95\x81\x04\x3C\x03\x5A\xA7\x4F\x7E\x00\x67\xA7\x0F\x1F\x03\x3E\xA3\x40\x02\x3F\xA1\x04\x3E\xA3\x42\x02\x3F\xA3\x04\x3E\xA3\x44\x02\x3F\xA5\x04\x31\xA5\x20\x0E\x11\x0E\x8F\x87\x01\x80\xA6\x4C\xA6\x98\xAE\xA4\xDB\xA3\x4B\xAA\x98\x89\xA6\x8C\xA4\x4B\xAD\x98\x93\x32\x48\x01\x61\xA8\x98\x8E\xA6\x94\xA7\x30\xA4\x4D\x49\x01\xFE\xA2\x12\x02\x99\xB0\xA4\x44\xA5\x36\xA1\x93\x93", "\xA6\x96\xA5\x65\xAB\xA3\x4B\x01\xFE\xA0\x13\x0B\x99\xAD\x6B\x4D\x03\x69\xA0\x4B\x0E\x01\x92\xA7\x13\x02\x99\x90\x01\xAA\xA6\x68\xA1\x38\x11\x01\xFE\xA2\x14\x0E\x8F\x93\x01\xFE\xA0\x15\x0E\x8F\x95\x01\xFE\xA2\x15\x02\x99\x97\x01\xFE\xA0\x16\x06\x95\xBD\x14\x5B\x02\x5B\xAD\x05\x2E\xA5\x5F\x02\x3F\xA0\x06\x3E\xA3\x61\x01\x6C\xA8\x23\x22\x01\xFE\xA3\x18\x0E\x9C\x91\xA3\xAC\x2C\x19\x0E\x96\xA6\x01\x6E\xA7\x38\x48\x06\x13\xA7\x81\x0D\x1A\x0E\x8F\xAA\x01\xFE\xA3\x1A\x0E\x8F\xAC\x01\xFE\xA1\x1B\x0E\x8F\xAE\x01\xFE\xA3\x1B\x0C\x9D\x9F\xA6\x9C\xA4\x34\xAD\x8D\xA1\xA6\xF0\xA4\x75\xA4\xCD\x70\x01\xFE\xA1\x1C\x0B\x9E\xA6\x6E\x72\x03\x7D\xA7\x3D\x33\x01\x92\xA4\x1D\x02\x99\xB5\x01\xFA\xA6\x29\xA6\x10\x36\x01\xFE\xA3\x1D\x0E\x8F\xB8\x01\xFE\xA1\x1E\x0E\x8F\xBA\x01\xFE\xA3\x1E\x02\x99\xBC\x01\xFE\xA1\x1F\x03\x9C\xB7\x16\x80\x02\x5B\xA2\x08\x2E\xA5\x84\x02\x3F\xA5\x08\x3E\xA3\x86\x01\x80\xA6\x10\x07\x02\xFE\xA0\x22\x0E\xA1\x9E\xA6\xAC\x2D\x22\x0E\x96\x8B\x02\xD9\xA5\x44\x4D\x08\x23\xA8\x20\x0E\x23\x0E\x8F\x8F\x02\xFE\xA0\x24", "\x0E\x8F\x91\x02\xFE\xA2\x24\x0E\x8F\x93\x02\xFE\xA0\x25\x0C\xA2\x81\x04\x95\x02\x3F\xA6\x09\x3B\xA8\xA0\xA6\x7C\xA2\xA0\xA4\xA8\xEE\xA4\x7B\xAB\x98\xB2\xA6\x46\xAB\x63\xA0\x3F\x40\xA9\xED\xA7\x90\xA3\x93\xA8\xA5\x7D\x1C\x26\x0E\x8F\x99\x02\x4C\xAB\x91\xA1\x9F\xAF\xA7\x42\xA8\x94\xA8\xA4\x9D\xA6\x2D\x3A\x26\x0E\x8F\x9B\x02\x55\xA9\x88\x6C\x09\x21\xA9\x39\x0D\x27\x02\x99\x9E\x02\x92\xA7\x27\x04\xA6\x97\xA9\x8E\x08\x28\x0E\x8F\xA1\x02\xFE\xA2\x28\x0E\x8F\xA3\x02\xFE\xA0\x29\x0E\x8F\xA5\x02\x92\xA6\x29\x0E\x8F\xA7\x02\x13\xAB\x69\x1A\x0A\x2E\xA5\xAC\x02\x5B\xAE\x0A\x3E\xA3\xAF\x02\x3F\xA0\x0B\x00\xA9\xB1\x02\x3F\xA2\x0B\x2B\xA9\x59\xAB\x7C\x23\x0B\x2E\xA5\xB5\x01\x8A\xA6\x13\x77\x02\x8C\xA8\x9D\x08\x0B\x3E\xA3\xB9\x02\x3F\xAA\x0B\x3E\xA3\xBB\x02\x3F\xAC\x0B\x3E\xA3\xBD\x02\x3F\xAE\x0B\x15\xAA\x49\xAB\x96\xA5\xA4\x9C\xA9\x87\xA5\x93\xAA\xA5\xAE\x54\xBF\x02\x3F\xA0\x0C\x24\xAA\xC4\x5D\x30\x00\xAB\x8B\x0B\xC2\x02\x64\xA3\x0C\x12\xA6\xC4\x03\xAC\xAF\x4F\x85\x03\xFE\xA2\x31\x0E\x8F\x87\x03\xFE\xA0\x32\x0E\x8F\x89\x03", "\xFE\xA2\x32\x02\x99\x8B\x03\xFE\xA0\x33\x0D\xA7\x97\x18\xCF\x02\x5B\xA1\x0D\x2E\xA5\xD3\x02\x3F\xA4\x0D\x3E\xA3\xD5\x00\x90\xA6\x0D\x3E\xA3\xD7\x02\xAE\xAB\xAA\x9A\x24\xD8\x02\x5B\xAA\x0D\x12\xAA\xB6\x44\x37\x0A\xAD\x83\x04\xDD\x02\x3F\xAE\x0D\x3E\xA3\xDF\x02\x3F\xA0\x0E\x3E\xA3\xE1\x02\x3F\xA2\x0E\x3E\xA3\xE3\x00\x90\xA4\x0E\x3E\xA3\xE5\x03\xB8\xAF\xA4\x84\xA9\x4E\xA9\xAA\xA6\xA5\x8D\xAA\xF7\xA9\xBF\xA5\xA6\x26\x03\xF6\xAA\xBE\xAA\xA4\x98\xA9\x04\xAD\xA9\xAC\xA6\x92\x20\xE7\x02\x3F\xA8\x0E\x01\xAC\x41\xA9\xC1\xA8\xAA\x8D\xAC\x06\xAC\xBF\xA2\xB0\xB6\x46\xE9\x02\x3F\xAA\x0E\x0C\xAC\x80\x4F\x3A\x08\xB1\xBC\x08\xEC\x02\x64\xAD\x0E\x12\xA6\xEE\x03\xC6\xA6\x82\xAF\x03\xFE\xA0\x3C\x0E\x8F\xB1\x03\xFE\xA2\x3C\x0E\x8F\xB3\x03\xFE\xA0\x3D\x02\x99\xB5\x03\xFE\xA2\x3D\x0B\xAC\x95\x18\xF9\x02\x5B\xAB\x0F\x2E\xA5\xFD\x02\x3F\xAE\x0F\x0E\xA4\x40\xA8\x00\x09\x27\x18\x7E\x01\x03\xCF\xA1\x6A\x90\xAC\xEB\x3E\x00\x02\xB4\xBD\x87\xFB\x07\xD1\xA1\x10\x28\x4B\x36\x46\x01\x0A\xB4\xA7\x7E\xB0\x13\x01\x0F\xB4\x86\x41\x53\xAD\x12\x45", "\xB5\x86\x53\x57\xAE\x41\x0B\x00\x19\xAD\xCC\x50\xD7\xA2\x10\x0D\x00\x5E\xAF\xC4\xA7\xB0\xA7\xAA\x64\xAD\xBE\xA4\xB4\xA5\xAD\xAC\x6E\x03\x01\xB6\xBE\xAC\x6B\xAE\x24\x70\x01\x2D\xAD\x48\x19\x04\x00\xB7\xBE\x08\x12\x03\xDC\xA0\x24\x13\x00\x76\xAF\xD8\xAF\x3E\x14\x00\x6B\xAD\x05\x0B\xB6\x96\x00\x6B\xAF\x05\x0B\xB6\x98\x00\x6B\xAD\x06\x09\xB7\xA1\x09\x1A\x03\xDA\xAB\x01\x0F\xAD\x02\xA6\x26\x1E\x01\x0F\xAD\xF6\x04\x08\x00\xB9\x8A\x04\x22\x03\xDA\xA3\x02\x2B\xAD\x24\x03\xE1\xA1\x38\x25\x00\x6B\xAE\x09\x0A\xB9\x91\xAC\xF9\x37\x09\x03\xB9\x89\x04\x29\x03\xE8\xAA\x42\x6B\x00\x9F\xAF\xEE\x0C\x02\x2B\xAD\x2D\x03\xDA\xAE\x02\x2B\xAD\x2F\x03\xDA\xA0\x03\x2B\xAD\x31\x03\xDA\xA2\x03\x29\xAE\xAA\x1B\x0C\x0B\xB6\xB4\x00\xB8\xAF\xEB\x65\x03\x3D\xAE\xB7\x16\x0D\x00\xBC\x93\x9C\xC3\xAE\x40\x08\x03\x05\xAF\x62\xAF\xDB\x09\x03\x2B\xAD\x3A\x03\xDA\xAB\x03\x2B\xAD\x3C\x03\xDA\xAD\x03\x2B\xAD\x3E\x00\xF2\xA0\x00\x3F\x00\x6B\xAC\x10\x0C\xB8\xB2\x13\x43\x02\xE9\xA3\x10\x05\x01\xDE\xAE\x40\x07\x04\x2B\xAD\x48\x03\xDA\xA9\x04\x16\xAF\x45", "\x0A\x12\x0B\xB6\x8B\x01\xE8\xAF\xBE\xA4\xA7\x0C\x01\xE1\xAD\x40\x0E\x04\x31\xAF\xF7\x50\x14\x0D\xBE\xB4\x0C\x51\x03\xDA\xA2\x05\x2B\xAD\x53\x03\xDA\xA4\x05\x2B\xAD\x55\x03\xDA\xA6\x05\x2B\xAD\x57\x03\xFD\xA0\x24\x18\x01\x06\xB2\xDE\xAB\xAD\x8E\xAC\x68\xAC\xBE\xAB\xC0\xA0\xAE\x10\xB0\xF1\x59\x05\x09\xB0\x12\xAF\xD9\xA6\xB6\xAA\xAA\x0E\xB1\x06\xBE\xAF\xA4\x1D\x5A\x00\x05\xBC\xC0\x97\xB0\xEE\xAD\x04\xBD\xC0\x9B\xB0\xA0\x67\xDA\xAC\x05\x1E\xB0\x22\xB0\x08\xB3\xB0\xA9\xB0\x0F\xB3\xC3\xA8\xC1\xA0\x29\x5D\x03\xDA\xAE\x05\x28\xB0\xA6\x6F\x17\x04\xC3\x97\x0F\x60\x02\xF5\xA1\x06\x16\xAF\x62\x03\x0D\xB6\xB6\xA3\x01\x6B\xAC\x19\x0B\xB6\xA5\x01\x6B\xAE\x19\x0B\xB6\xA7\x01\x6B\xAC\x1A\x06\xBD\xA9\x01\x6B\xAE\x1A\x0B\xBD\x8C\x79\xF4\xAF\x1B\x04\xBF\xB1\x01\x6B\xAE\x1C\x0B\xB6\xB3\x01\x3E\xB2\x41\x04\x07\x2B\xAD\x75\x01\x16\xBA\xC1\x93\x30\x76\x00\xFD\xA8\x07\x34\xAF\x62\x7A\x17\xB0\x32\x3B\x01\x6B\xAC\x1F\x0B\xB6\xBD\x01\x6B\xAE\x1F\x0B\xB6\xBF\x01\x6B\xAC\x20\x0B\xB6\x81\x02\x66\xB1\xF2\xAF\xC1\xAD\xB0\x23\xB2\x1D\xBC\xC2", "\x9F\xB1\x3C\x6A\x20\x0B\xB6\x83\x02\x75\xB2\x2F\x74\x08\x01\xB2\x53\x0D\x21\x06\xBD\x86\x02\xD6\xAF\x21\x04\xC8\xAD\xA4\x88\x03\xDA\xA9\x08\x2B\xAD\x8A\x03\xDA\xAB\x08\x2B\xAD\x8C\x03\xDA\xAD\x08\x16\xAF\x8E\x03\xDA\xAF\x08\x0F\xB1\xB7\x16\x24\x04\xBF\x94\x02\xF4\xAE\x25\x0B\xB6\x97\x02\x6B\xAC\x26\x01\xC8\x99\x02\x6B\xAE\x26\x0B\xC8\xAB\xB0\x74\x27\x26\x04\xBF\x9D\x02\x64\xB1\x44\x4F\x09\x2B\xB2\x40\x08\x28\x0B\xB6\xA1\x02\x6B\xAE\x28\x0B\xB6\xA3\x02\x6B\xAC\x29\x0B\xB6\xA5\x02\x6B\xAE\x29\x01\xC8\xA7\x02\xB4\xB2\x02\xBC\xC7\xAF\xB0\x7A\xB2\x0B\xB1\xC2\x8A\xB3\xAC\xB2\x3C\x18\x0A\x05\xB3\x15\xB0\x32\xB6\xC1\xB8\xB1\x2A\xB2\xA9\xAF\x3E\x29\x02\x6B\xAE\x2A\x00\xCD\xB7\xB1\xC7\xB3\x32\xB9\xC7\x93\xB3\xDD\xB1\x33\xB2\x98\x2B\x02\x6B\xAC\x2B\x0B\xCD\x82\x6B\xAD\x03\x39\xB3\x2B\x2E\x02\xD6\xAF\x2B\x06\xBD\xB0\x02\xEA\xB3\xB5\x91\x0B\x2B\xAD\xB2\x03\xDA\xA3\x0B\x2B\xAD\xB4\x03\xDA\xA5\x0B\x2B\xAD\xB6\x02\xF5\xA7\x0B\x2B\xAD\xB8\x00\x27\xB7\x5A\x3B\x02\xF4\xAD\x2F\x04\xBF\xBF\x02\x6B\xAC\x30\x0B\xB6\x81\x03\x81\xB2", "\x30\x0B\xB6\x83\x03\xF1\xB1\x35\xB4\x79\x04\x03\xF4\xAE\x31\x01\xCB\xB6\x44\xC8\x01\x44\xB6\x10\x09\x03\x6B\xAE\x32\x0B\xB6\x8B\x03\x6B\xAC\x33\x0B\xB6\x8D\x03\x6B\xAE\x33\x0B\xB6\x8F\x03\x1A\xB5\x38\xB6\xCD\x94\xB3\x2C\xB6\x4A\xB6\xCC\xA4\xB0\x82\x28\x34\x09\xD2\xB0\xB4\xE2\xB1\x4B\xB4\xD3\xAB\xB4\x2E\xB5\x34\xBE\xCD\x92\xB4\x3A\xB5\x4D\xB9\xD3\x81\x0E\xD1\x03\x4C\xB9\xCC\x9F\xB3\xD2\xB1\x51\xBB\xD3\xB6\xB4\x43\xB4\x4F\xBC\xCD\xAD\x38\xD2\x03\xDA\xA3\x0D\x02\xB5\x3C\x68\x35\x00\xD5\x85\x09\xD5\x02\xF5\xA6\x0D\x16\xAF\xD7\x03\x54\xBA\x41\x98\x03\x6B\xAD\x36\x0B\xB6\x9A\x03\x6B\xAF\x36\x0B\xB6\x9C\x03\x6B\xAD\x37\x06\xBD\x9E\x03\x6B\xAF\x37\x02\xD0\x97\x18\xE2\x00\xFD\xA4\x0E\x34\xAF\xE6\x03\xDA\xA7\x0E\x2B\xAD\xE8\x01\x20\xB9\x0E\x2B\xAD\xEA\x02\x56\xBE\xD3\x8E\x23\xEB\x00\xFD\xAD\x0E\x17\xB4\xAC\xA0\x54\xB0\x0F\x2B\xAD\xF1\x03\xDA\xA2\x0F\x2B\xAD\xF3\x03\xDA\xA4\x0F\x2B\xAD\xF5\x03\xDA\xA6\x0F\x3A\xB5\x38\xB5\x9C\x47\x0F\x10\xB6\x2F\xB5\x52\xB8\xD4\xA0\xB3\x37\xB5\x90\x38\x0F\x14\xB6\x3D\xB5\x64\xB6\xD9\xBF", "\xB4\x7B\xB1\x66\xBD\xD9\x95\xB6\x4D\x31\x3E\x0C\xD9\x8B\xB5\x9F\xB6\x68\xB8\xDA\x98\xB6\xA9\xB5\x6B\xBB\x12\x7A\x03\xA7\xB5\x68\xBE\xDA\x86\xB5\x7B\xB7\x6C\xB7\xD4\xA0\xB6\xCC\xB2\x67\xBC\xDA\xBB\xB6\xB4\xB6\x1C\xAB\x0F\x2B\xAD\xFC\x01\x6C\xB8\x37\x7D\x03\xC2\xB6\x42\x0E\x0F\x28\xAF\xF4\xAD\x00\x0F\x33\x21\x91\xCB\xB7\xD0\xAD\xDB\xB8\x08\x03\x01\x73\xB8\x46\x84\x00\xD2\xB7\x1A\x95\x00\x15\xB7\x6F\x90\x76\xBE\x1D\x07\x00\xDA\xB7\x47\x0D\xDD\xA7\x0B\x09\x03\x77\xB6\x10\x0A\x00\xD8\xB5\xE3\xA3\x35\x0D\x00\xD8\xB6\x7D\x0F\x00\x29\xB7\x0A\x05\x04\x02\xDE\x9C\x88\xEF\xB7\x87\x81\xDF\x88\x12\x14\x03\x7C\xB5\x22\xB6\xB7\x16\x02\x7D\xB7\x01\x2C\xB7\x09\x05\x06\x06\xDF\x9A\x00\xF6\xB7\x06\x06\xDF\x9C\x00\xF6\xB5\x07\x06\xDF\x9E\x00\xF6\xB4\x68\x79\xE0\xBB\x0C\x20\x02\x7D\xB1\x02\x0B\xB8\x3E\x0A\x08\x00\xE1\x8C\x31\x23\x00\x7F\xB6\x10\x25\x00\x16\xBB\x7C\x27\x02\x18\xB7\xBD\x50\x00\x0C\x02\x36\xB7\x2D\x03\x84\xBD\x30\x76\xB7\x2F\x02\x88\xB1\x26\x30\x00\xF6\xB5\x0C\x06\xDF\xB2\x00\x19\xBA\x40\x04\x03\x36\xB7\x35\x02\x7D", "\xB6\x03\x36\xB7\x37\x02\x7D\xB8\x03\x26\xB8\xC7\x1D\x0E\x06\xDF\xBA\x00\x38\xB8\x06\x9B\x03\x3D\xB8\x37\x14\x0F\x00\xE4\x8A\x04\x3D\x01\x8B\xB1\x10\x3F\x00\xF6\xB4\x10\x03\xE4\x8A\xB5\x8E\x09\x10\x06\xDF\x82\x01\xF6\xB7\x10\x06\xDF\x84\x01\xF6\xB5\x11\x06\xDF\x86\x01\x4B\xBA\x41\x07\x04\x36\xB7\x48\x01\x79\xB2\x4F\x0B\x01\x46\xB8\x00\x0D\x04\x21\xB9\x4F\x02\x7D\xB0\x05\x36\xB7\x51\x01\x96\xB3\x31\x12\x01\xF6\xB7\x14\x06\xDF\x94\x01\xF6\xB5\x15\x01\xE6\x97\x01\xF6\xB4\x16\x06\xDF\x99\x01\xF6\xB6\x16\x06\xDF\x9B\x01\xF6\xB4\x17\x0A\xE6\x82\x04\x5D\x03\x9F\xBB\x32\x1E\x01\xF6\xB7\x17\x02\xE8\x80\x00\x60\x03\xA1\xB0\xA8\x21\x01\x61\xBB\x18\x01\xE6\x98\x23\x65\x00\x87\xBA\x10\x2A\x01\xF6\xB7\x1A\x07\xE8\xAC\x01\xF6\xB5\x1B\x07\xE8\xAE\x01\xF6\xB7\x1B\x06\xDF\xB0\x01\x61\xBA\x1C\x06\xDF\xB3\x01\xF6\xB4\x1D\x06\xDF\xB5\x01\xF6\xB6\x1D\x0A\xE8\xB7\xB6\xB8\x67\x1D\x0B\xEA\xB5\xB6\xBC\xB4\xAB\xB6\xDB\xB0\xBA\x3A\x30\x1E\x0F\xEA\xBA\xB6\xCF\xB7\x68\xBA\xEB\xAB\xB6\xB9\xB8\xAF\xB2\xEB\x92\x23\x79\x03\xAD\xB4\xDA\xBD\xBA", "\xB2\xB5\xAC\xB4\xEB\xBF\xBA\xD2\xB2\x1E\x02\xEC\xBB\xBA\xC5\xB8\xB1\xB9\xDB\x83\xBB\xC8\xB9\xB4\xB8\x8E\x3B\x01\xCB\xBA\xAF\xB7\xEC\xA6\xA0\x7C\x01\xB5\xBD\xEC\x92\xBB\xB8\xB8\xB7\xB0\xED\x97\xBB\xDD\xB8\xB8\xBF\xED\x8D\x59\x7D\x02\xB6\xBF\xEC\x8C\xBB\xE7\xBA\xB5\xB1\xEE\xAB\xBB\xE3\xBB\x34\x1E\x07\x26\xBB\x44\xB6\xB7\xB8\xEE\xB1\xBB\xE2\xBB\xBC\xBC\xE4\xA9\xBB\xDB\xB9\xBD\xBA\xEE\x95\x44\x7F\x00\xBC\xB7\xEF\xB4\xBB\xEC\xBA\xBD\xB7\xD9\x8E\xBB\x00\xBD\xBB\xB2\xF0\x9F\x51\x80\x02\x7D\xB1\x08\x3E\xBB\xAC\x6E\x20\x0C\xF0\xBF\x10\x83\x03\xA1\xB4\x08\x07\xBA\x85\x03\xC3\xBA\xDA\x8E\x0A\x86\x02\x7D\xB7\x08\x36\xB7\x88\x02\x7D\xB9\x08\x36\xB7\x8A\x02\x7D\xBB\x08\x07\xBA\x8C\x02\x7D\xBD\x08\x1E\xB9\x3D\x14\x24\x01\xE6\x92\x02\x61\xB8\x25\x06\xDF\x95\x02\xF6\xB6\x25\x06\xF1\x81\x04\x97\x02\x7D\xB8\x09\x07\xBA\x99\x03\xCC\xB6\xEC\x96\x1E\x9A\x01\x98\xBC\x09\x0F\xBA\x11\x46\x27\x0A\xF3\x85\x09\x9F\x02\x7D\xB0\x0A\x36\xB7\xA1\x02\x7D\xB2\x0A\x36\xB7\xA3\x02\x7D\xB4\x0A\x36\xB7\xA5\x03\xD0\xB2\xEF\xBB\xBB\x07\xBF\xC5\xB8", "\xEF\x97\xBD\x3E\x56\x29\x02\xF5\xBA\xBB\x62\x37\x29\x0B\xF5\x82\x24\xA8\x02\xCE\xB9\x0A\x36\xB7\xAA\x02\x7D\xBB\x0A\x36\xB7\xAC\x02\x7D\xBD\x0A\x36\xB7\xAE\x02\x7D\xBF\x0A\x36\xB7\xB0\x02\x7D\xB1\x0B\x36\xB7\xB2\x02\x7D\xB3\x0B\x1F\xBD\xA4\xB4\x2D\x08\xF7\xA1\x09\xB5\x03\xDE\xB4\xF5\xBF\xBD\x20\x4E\x2D\x0E\xF7\xA2\x35\xB7\x02\x7D\xB8\x0B\x03\xBE\xC4\x5D\x2E\x08\xF8\xB3\x60\x87\xBB\x2E\x07\xE8\xBC\x02\x8B\xBF\x3F\x9D\x0B\x36\xB7\xBE\x02\x7D\xBF\x0B\x36\xB7\xC0\x02\x7D\xB1\x0C\x36\xB7\xC2\x03\xA1\xB3\x0C\x36\xB7\xC4\x00\xCA\xB7\x5B\x07\x03\x61\xB9\x32\x01\xE6\x8B\x03\xF6\xB4\x33\x06\xDF\x8D\x03\x3A\xBE\x33\x06\xDF\x8F\x03\x91\xBF\xC0\xB4\x78\x10\x03\x61\xBA\x34\x00\xF4\xB6\x44\xD4\x01\xEC\xB3\x10\x15\x03\xF6\xB6\x35\x06\xDF\x97\x03\xF6\xB4\x36\x06\xDF\x99\x03\xF6\xB6\x36\x06\xDF\x9B\x03\xBA\xBE\xD5\xB5\xE6\x1C\x03\xC9\xBF\xAC\xB1\xF0\x80\xBE\x58\xBF\xBF\xB2\xFD\xA1\x89\xDD\x01\xF3\xBB\xF3\x86\xBC\x34\x8A\x37\x06\xFD\x84\xBC\xD3\xBF\x69\x1F\x0D\x1B\xBF\x53\xBD\xBE\xBF\xFC\xA2\xBF\xD8\xBC\xF9\xB5\xC1\xA0\x03\xE0", "\xBC\xD7\xB1\xFD\xB2\xBE\xEA\xBC\x55\x21\x0E\x29\xBF\xE3\xBF\xFA\xB8\xDB\x85\xBC\x61\x0A\x38\x00\xFF\xA5\xBF\xF2\xBE\xF2\xBD\xFD\xBA\xBF\xEC\xBD\xCE\x03\x0E\x37\xBF\x55\xBE\xF3\xB8\xFF\xB4\xBF\xD0\xBC\x01\xC6\xFE\x81\x0E\xE4\x00\x00\xC5\x00\xFB\xBF\x02\xC1\x00\xC7\xFD\x8E\xC0\xDC\xBE\xD4\x15\x0E\x0A\xC0\x07\xC1\x05\xC9\xFF\x8D\xC0\x0B\xC1\xFF\xB3\x00\xCC\xC0\x7E\x2A\x39\x07\xFB\xB1\xBF\x06\xC3\x05\xCF\x00\xD9\xC0\xF3\xBC\x07\xC1\x01\xE5\xC0\x1A\xC3\x72\x98\x0E\x14\xC0\x22\xC3\x09\xCC\xFF\xA8\xC0\x30\xC3\x0B\xC9\x5C\xA9\x03\x2C\xC1\x08\xC6\x03\xE6\xC0\xE1\xBD\x0B\xC9\x03\xF7\xC0\x29\xC0\x09\xC2\x03\xD8\xC0\x2F\x3E\x3A\x05\x03\xF8\xC0\xED\xBC\x11\xC0\x02\xC6\xC1\x1B\xC1\x26\x2B\x0E\x16\xBF\xEC\x03\x10\xCD\x03\xD6\xC0\x3C\xC1\x0C\xC0\x04\xFA\xC0\x45\xC3\x13\xC4\x05\xC7\xC1\x56\xC1\x14\xCF\x03\xE3\xC0\x50\xC2\xBA\x3D\x0E\x0E\xC1\x52\xC0\x17\xC7\x05\xD3\x32\xEE\x03\x07\xC9\x04\xE1\xC1\x2E\xC3\x61\xA0\x0F\x36\xB7\xF1\x00\x18\xCA\x4E\x72\x03\x6E\xC1\x40\x03\x0F\x07\xBA\xF4\x03\xA1\xB5\x0F\x31\xC1\x27\xA2\x3D\x06\xDF", "\xB7\x03\xF6\xB4\x3E\x06\xDF\xB9\x03\xF6\xB6\x3E\x06\xDF\xBB\x03\x87\xB8\x3F\x06\xDF\xBD\x03\xA2\xBF\x69\x10\x00\x06\x0D\x9E\x99\x7D\x0C\x08\xFA\x87\x8C\x23\x23\xC8\x46\x85\x00\x92\xC3\x1A\x96\x00\x15\xC2\x50\xAD\xCE\x07\x00\x18\xC2\x46\x40\x27\xCA\x05\xD3\x30\x09\x00\x26\xC6\x47\xA2\xC2\xB6\x9A\x27\xCD\x53\x0E\x00\xA6\xC2\x41\x0F\x00\x29\xC2\x03\x04\x04\x0C\x0A\xC2\x04\x11\x03\x2B\xC1\x10\x12\x00\xB2\xC0\x00\x03\x01\x35\xC2\x14\x01\x2D\xC9\x06\xF7\x53\x15\x02\x2E\xCB\x03\xC8\xC1\x10\xC3\x2F\xC9\x05\xFD\x14\x16\x02\x2F\xC5\x05\xE8\xC1\xC2\xC0\x32\xC7\x0C\xDB\xC1\xBB\xC1\x33\xC3\xE4\x17\x00\xC6\xC0\x16\xCA\x0C\xD2\xC3\xCC\xC1\x32\xC5\x0D\xE6\xA0\x18\x01\x34\xC7\x06\xD7\xC3\xD4\xC3\x14\xCF\x09\xCD\x31\x19\x01\x2D\xCA\x01\x1A\xC3\x5F\x87\x06\x04\x0E\xF1\x19\x1C\x03\x39\xCE\x28\x1D\x00\xEA\xC3\x6C\x0E\x01\x2D\xC3\xDF\xC3\x07\x05\x0B\xE0\x00\xB5\xC1\x08\x05\x0B\xE2\x00\xB5\xC3\x08\x05\x0B\xE4\x00\xF0\xC1\x42\x05\x02\x35\xC2\x26\x00\x26\xC6\xDE\xBB\x0C\x29\x00\x29\xC9\x10\x2B\x00\x06\xC6\x41\x0D\x02\x35\xC2\x2E\x01", "\x2D\xCF\x02\x3D\xC3\x02\x0C\x0C\x05\x0B\xF1\x00\x10\xC7\x34\xC4\xAF\x32\x00\x09\xC7\x40\x04\x03\x19\xC4\xEA\x52\x0D\x05\x11\xCA\x12\x37\x01\x2D\xC8\x03\x35\xC2\x39\x01\x2D\xCA\x03\x35\xC2\x3B\x01\x2D\xCC\x03\x35\xC2\x3D\x03\x47\xCE\x0D\xD1\x53\x3E\x02\x4B\xC2\x06\xDF\xC3\xE6\x9F\x0F\x05\x0B\xC0\x01\x32\xC6\x33\xCB\x0C\xEF\xC4\x9E\x5D\x10\x09\x13\xD6\xC3\x3C\xC5\xCC\x92\x04\x35\xC2\x43\x03\x4F\xCB\x13\xF3\xC4\xC0\xC1\x73\x64\x04\x06\xC5\xDD\xC0\x52\xC3\x0C\xCF\xC5\x16\xC5\x30\xC0\xEB\x85\x01\x4C\xC7\x36\xC1\x14\xDC\xC3\x56\xC6\x53\xC7\x8A\x06\x01\x55\xC6\x54\xCD\x14\xFA\xC4\x5F\xC4\x50\xCA\x15\xD8\xC5\x15\xB3\x11\x0D\x15\xFE\xC0\x57\xC5\x5A\xC3\x16\xEA\xC5\x60\xC5\x56\xC3\x35\x08\x01\x67\xC5\x17\xC0\x15\xE4\xC5\x68\xC7\x5A\xC6\x17\xED\xC5\x61\x09\x12\x01\x17\xE3\xC1\x5E\xC6\x5B\xC2\x16\xF8\xC5\x75\xC7\x38\x4A\x04\x3B\xC5\x34\xC7\x5F\xC6\x18\xC7\xC5\x80\xC6\x5C\xC1\x15\xC1\xC6\xBF\xBB\x12\x04\x18\xC9\xC5\xC5\xB8\x13\x02\x13\xCD\x01\x8F\xC7\x5C\xCC\x16\xC7\xC6\x61\xC4\x62\xC8\x19\xFE\xC5\xAB\xA5\x65\xCB\x18\xCA", "\xC6\x74\xC4\x68\xC7\x19\xDA\xC6\xD7\x83\x13\x0E\x19\xE1\xC6\x7C\xC4\x63\xC4\x1A\xD9\xC6\xAC\xC4\x67\xCD\x14\xD0\x01\xA7\xC4\x22\x11\x05\x31\xC6\x77\xC7\x66\xCD\x17\xF7\xC6\xAA\xC5\x6B\xC8\x1B\xE2\xC6\xB5\xC7\x6A\xCE\x1A\xEE\x54\x52\x00\x6D\xC9\x18\xE9\xC6\xBC\xC7\x70\xC5\x18\xFE\xC6\xDD\x2B\x14\x02\x1C\xD1\x44\x54\x01\x2D\xC5\x05\x0B\xC7\x21\x6A\x15\x02\x13\xD7\x01\xB4\xC4\x16\x02\x13\xD9\x01\x32\xC6\x16\x00\x1D\xFA\xB6\x5B\x01\x2D\xCC\x05\x35\xC2\x5D\x01\x2D\xCE\x05\x35\xC2\x5F\x01\x2D\xC0\x06\x32\xC4\x61\x01\x2D\xC2\x06\x02\xC4\xF2\x11\x19\x0C\x11\xC1\x04\x67\x03\x7B\xC0\x00\x29\x01\xB5\xC2\x1A\x05\x0B\xEB\x01\xB4\xC4\x1B\x05\x0B\xED\x01\xDB\xC7\x6F\xC4\x7B\x2E\x01\xF2\xC4\x1C\x02\x1F\xE3\x43\x72\x01\x7F\xC1\x26\x33\x01\xB5\xC0\x1D\x05\x0B\xF5\x01\xB5\xC2\x1D\x05\x0B\xF7\x01\xB5\xC0\x1E\x05\x0B\xF9\x01\x06\xC8\x3B\x1A\x07\x35\xC2\x7B\x01\x85\xC2\xAC\x7C\x01\x1A\xCB\xAC\x0D\x07\x32\xC4\x7E\x02\x4C\xCF\x07\x1D\xC8\xD7\x98\x20\x05\x0B\xC1\x02\xB5\xC2\x20\x05\x0B\xC3\x02\xB5\xC0\x21\x05\x0B\xC5\x02\x32\xC6\x21", "\x05\x0B\xC7\x02\xEC\xC5\x4F\x1A\x08\x32\xC7\x8C\x02\x7C\xCE\x08\x35\xC2\x8F\x01\x2D\xC0\x09\x34\xC6\x91\x01\x2D\xC2\x09\x24\xC8\x90\xC7\x4D\x13\x09\x32\xC7\x95\x03\x80\xC1\x11\x57\x02\x44\xCA\x41\x08\x09\x35\xC2\x99\x01\x2D\xCA\x09\x35\xC2\x9B\x01\x2D\xCC\x09\x35\xC2\x9D\x01\x2D\xCE\x09\x34\xC6\x9F\x01\x93\xCF\x19\xC4\xC7\x60\xCB\x71\xCA\x1B\xF9\xC6\xFE\xC5\x03\xA0\x0A\x35\xC2\xA1\x02\x97\xC8\x1A\xE2\xC9\x65\xC9\x71\xC6\x1B\xE4\xC9\x73\x1A\x28\x0A\x26\xE3\xC6\x63\xCA\x9B\xC8\x1C\xF0\xC9\x78\xCA\x9D\xC5\x27\xE1\xC9\x45\xC8\x9B\xCB\x5C\xA3\x02\xB5\xC0\x29\x03\x27\xFD\xC6\x7B\xCA\x9F\xC9\x27\xFC\xC9\x96\xC4\xA1\xCD\x26\xC4\x5F\xA5\x03\xA0\xC6\x1C\xFD\xC9\x90\xC9\xA2\xCF\x23\xA6\x02\x8E\xCB\x9B\xCA\x27\xCB\xCA\x86\xCB\xA5\xCB\x1B\xC8\xCA\x5F\xCA\x42\x07\x0A\x15\xCA\x77\xCA\xA6\xC7\x28\xD9\xCA\x9C\xCB\x9A\xC1\x29\xDD\xCA\xA7\xCA\xA9\xC6\xE2\x68\x02\x98\xC1\x87\xBF\x28\xD2\xCA\x96\xC9\xA9\xC4\x27\xD8\xCA\xA9\xC9\x89\x3D\x0A\x20\xCA\x85\xC9\xAD\xCA\x28\xDB\xCA\xA4\xC9\xAF\xC8\xBA\x2E\x02\xB8\xC8\xAD\xC0\x2B\xE1\xCA", "\xB2\xCB\xAE\xC3\x2A\xEA\x3B\xAF\x01\xB0\xCC\x2B\xFA\xCA\xAF\xC8\xAA\xC3\x2C\xF9\xCA\xCF\xCA\xB0\xC3\x10\x30\x02\xCA\xCB\xB1\xC1\x2D\xCB\xCB\xD7\xCA\xB5\xCE\x2C\xDB\xCB\xAA\xC8\xB7\xC1\x10\x31\x02\xD5\xCA\xA8\xC2\x2E\xC5\xCB\xBB\xC2\x2C\x01\x2E\xE4\xCB\xB1\xCA\xAF\xC9\x2D\xE3\xCB\xDF\xB3\x2C\x07\x2E\xEA\xCB\xDE\xCA\xB1\xCC\x2E\xCC\xCB\xEA\x10\x2D\x0F\x2E\xF4\xCB\xC4\xC8\xBC\xCD\x2D\xFB\xCB\xB3\xC8\xB6\xC1\x2F\xC5\x09\xB5\x03\xBD\xCB\x2E\xE8\xCB\xF9\xC8\xBE\xC6\xA6\x76\x02\x02\xCF\xBF\xC9\x2E\xC6\xCC\xD2\xC8\xBF\xC2\x2F\xC4\xCC\xD0\xCB\x40\x07\x0B\x09\xCC\x0E\xCD\xB3\xC5\x31\xCB\xCC\x03\xCE\xBE\xC3\x76\x38\x02\x14\xCD\xBF\xCA\x2D\xD7\xCC\x05\xCD\xC6\xCC\x30\xFE\xCB\x20\xCD\x32\x79\x0B\x1D\xCC\x0F\xCE\xC6\xC9\x32\xE3\xCC\x1F\xCE\xC7\xCF\xB6\x3A\x02\x28\xCE\xC5\xCE\x32\xD0\xCC\x0D\xCF\xCC\xCA\x32\xC0\x2A\xBB\x01\xCC\xC8\x31\xCA\xCC\x21\xCC\xCF\xC1\x31\xE5\xCC\x3A\x18\x2F\x0A\x33\xFD\xCC\x40\xCC\xC9\xC7\x98\xBD\x02\x43\xCF\xCF\xC6\x33\xEC\xCC\xF3\xCA\xC8\xCE\x34\xCE\x1D\xBE\x01\xD2\xC5\x33\xEB\xCC\x4F\xCD\xD1\xCD", "\x32\xD4\xCD\x1C\x33\x2F\x02\x35\xC6\xCD\x58\xCE\xD5\xCD\x34\xFE\xCC\x53\xCC\xA0\x20\x0C\x1B\xCD\x57\xCE\xCC\xCD\x35\xCB\xCD\x55\xCC\xDA\xCE\x74\x01\x03\x64\xCF\xD7\xCE\x35\xF4\xCC\x5C\xCE\xD9\xC2\x37\xFB\xCC\x6F\xCF\xCD\xC4\x37\xE2\x53\xC2\x01\xDB\xC0\x37\xE5\xCD\x77\xCF\xD9\xCE\x37\xF3\xCD\x21\x6B\x30\x0A\x37\xF6\xCD\x44\xCE\xDA\xC5\x37\xCC\xCD\x7B\xCE\xDB\xC6\x38\xCB\xCE\x7F\xCD\x44\x44\x0C\x03\xCE\x88\xCC\xE1\xCA\x34\xCD\xCE\x85\xCC\xE5\xC3\x39\xC0\xCE\x97\xCD\xDF\xC8\x39\xE1\xCD\x9A\xCD\xE7\xC0\x4B\x05\x03\x90\xCD\xDA\xCE\x3B\x86\x03\xA1\xCC\xD8\xC1\x37\xDE\xCE\x99\xCC\xCD\x07\x0C\x25\xCE\x87\xCC\x83\x28\x0C\x2C\xCE\x2B\x0D\x32\x00\x3B\xD6\xCE\x9C\xCD\xE5\xCB\x39\xE7\xCE\xB6\xCC\xEA\xC5\x3B\xE9\xCE\xBC\xCD\x45\x4A\x0C\x33\xCE\xB7\xCF\xF1\x1B\x0C\x00\xCF\x3C\x08\x33\x04\x3C\xF9\xCE\xC8\xCD\xEF\xC8\x3B\xCA\xCF\x57\xCD\x33\x07\x3C\xCC\xCF\x8A\xCC\xED\xCB\x3C\xFE\x84\xCE\x03\xF3\xCB\x3B\xD7\xCF\xD3\xCD\xF6\xCC\x37\xC9\xCF\xD8\xCF\xF1\x1F\x0C\x16\xCF\xDA\xCD\xF4\xC1\x3C\xE2\xCF\xBA\xCD\xF8\xCD\xD9\x10\x03\xE0", "\xCF\xF6\xC0\x3D\xC9\xCE\xEC\xCE\xE4\xCD\x3D\xE4\xCF\xDC\xCE\xF9\xCE\x3E\xE1\x09\xD1\x01\xAB\xCA\x10\x16\x03\xB5\xC3\x35\x09\x3E\xF0\xCF\xEB\xCF\xFC\xCA\x3E\xEF\xCF\xED\xCD\xE4\xC2\x40\xE2\xCE\xE3\xCD\x00\xD4\x40\xED\x6B\xD8\x03\xFE\xCC\x6C\x19\x03\xB5\xC2\x36\x0A\x40\xE6\x35\xDB\x00\xCA\xCC\x0D\x32\xC4\xDD\x02\x4C\xCE\x0D\x35\xC2\xDF\x03\x03\xD1\x4D\x60\x03\xB5\xC1\x38\x05\x0B\xE2\x03\xB5\xC3\x38\x05\x0B\xE4\x03\xB5\xC1\x39\x02\x13\xE6\x03\xB5\xC3\x39\x05\x23\xF7\x16\xEA\x02\x7C\xCC\x0E\x32\xC7\xEE\x01\x2D\xCF\x0E\x35\xC2\xF0\x00\x6D\xC1\x0F\x35\xC2\xF2\x02\x06\xD2\x3A\xF3\x03\xF2\xC5\x3D\x0A\x24\xF6\x44\xF7\x03\xA0\xC8\x0F\x35\xC2\xF9\x01\x2D\xCA\x0F\x35\xC2\xFB\x01\x2D\xCC\x0F\x35\xC2\xFD\x01\x2D\xCE\x0F\x00\xCF\xB5\xC0\x00\x08\x34\x18\x7E\x92\x71\x00\x03\x45\xCE\xB7\x48\x1A\x00\x07\x45\xE8\x91\x45\x0B\x00\x0B\x45\xE8\x9A\x3C\x08\x01\x0F\x45\xD9\xC2\x53\xCD\x01\x03\x46\xFD\x4A\x67\xD3\x10\x49\x46\xC9\x04\x08\x03\x1A\xD6\x10\x09\x00\x6E\xD3\x40\x0A\x00\x31\xD1\xC2\x7C\x1D\xD1\x10\x0C\x00\x63\xD3\x40\xC4\x33", "\x0F\x00\x63\xD2\x7D\x01\x01\x3D\xD1\x0A\x07\x04\x06\x47\xE7\x41\x83\xD1\x05\x03\x48\xD3\x0D\x16\x03\x20\xD7\x01\x07\xD2\xE5\xCF\xF1\x18\x01\x00\xD2\xEB\x48\x24\xDA\x42\x5C\x00\x8C\xD0\x2C\x1D\x01\x03\xD2\x1E\x03\x20\xDF\x01\x03\xD2\x20\x03\x20\xD1\x02\x03\xD2\x22\x03\x20\xD3\x02\x15\xD2\x39\x0C\x09\x04\x4A\xC0\xD0\xFE\xCC\xFF\xC8\x4A\xC3\xD0\xA6\xCF\xFF\xCB\xE4\x25\x00\xA7\xD2\xFC\xCC\x4A\xED\xCE\xAD\xD2\x2A\xD2\x4B\xDE\x30\x26\x01\x2C\xD4\x92\x27\x00\xBA\xD2\x2D\xDE\x4A\xFF\xD2\xBE\xD1\x30\xD6\x40\xF3\x27\x28\x01\x2F\xD3\x4C\xF4\xD2\xC8\xD0\xE3\xC5\x40\xE9\xD2\xC7\xD2\x32\xDD\x48\xC2\xD3\x3E\x55\x0A\x06\x4C\xE5\x39\x2A\x03\x20\xDB\x02\x13\xD3\xAF\x6C\x0B\x08\x4D\xF7\x16\x2D\x03\x36\xD3\x10\x2E\x00\xDE\xD2\x40\x0F\x02\x03\xD2\x30\x01\x38\xDE\xDA\xB1\x00\x83\xD2\x0C\x03\x48\xF3\x00\x83\xD0\x0D\x03\x48\xF5\x00\x83\xD2\x0D\x06\x4E\xC0\x00\x37\x03\x20\xD8\x03\x39\xD1\xF2\x13\x0E\x02\x49\xC3\x04\x3D\x03\x3E\xD2\x10\x3F\x00\x83\xD0\x10\x03\x48\xC1\x01\xF3\xD1\x91\x02\x04\x03\xD2\x43\x01\x41\xDF\x4C\xF7\x14\x44\x02", "\x3F\xD1\x10\x06\x01\x0E\xD7\x3D\x58\x04\x0A\xD4\x34\x0D\x12\x03\x48\xCA\x01\x83\xD3\x12\x03\x48\xCC\x01\x83\xD1\x13\x03\x48\xCE\x01\x83\xD3\x13\x04\x51\xCC\x19\x50\x03\x20\xD1\x05\x23\xD4\x7E\x72\x14\x08\x52\xE5\x13\x53\x03\x3C\xD4\x05\x33\xD3\x55\x03\x4A\xD5\x17\xD6\x01\x83\xD3\x15\x03\x48\xD8\x01\x83\xD1\x16\x03\x48\xDA\x01\x83\xD3\x16\x03\x4F\xDC\x01\x83\xD1\x17\x08\x4F\xFD\x14\x60\x01\x44\xD2\x06\x11\xD4\x64\x03\x20\xD5\x06\x03\xD2\x66\x02\x4C\xDE\x28\x27\x01\x83\xD0\x1A\x0E\x54\xCD\xD3\x64\x1D\x1A\x01\x51\xEB\x01\x11\xD7\x38\x4D\x06\x13\xD5\xCB\x0A\x1B\x03\x48\xEF\x01\x83\xD0\x1C\x03\x48\xF1\x01\x83\xD2\x1C\x03\x48\xF3\x01\x83\xD0\x1D\x0C\x55\xC9\x04\x75\x03\x5A\xD7\x40\xF1\xCF\xC0\xD0\x55\xDB\x4C\xF3\xD2\xCE\xD1\xDF\x16\x07\x2E\xD5\xB5\xD2\x5C\xDB\x50\xCC\xD3\x7C\xD4\x5D\xDA\x49\x37\x01\x78\xD4\xD8\x18\x07\x01\xD6\x75\xD5\xFF\xCE\x57\xF3\xD5\x6F\xD6\x61\xDA\xAA\x04\xD6\xD2\xCD\x5C\xDD\x57\xC9\xD6\xAB\xD0\x64\xD5\x4E\x3A\x01\x8C\xD4\x62\xD9\x57\xEF\x47\x7B\x01\x65\xDB\x57\xC7\xD6\x9B\xD6\xD4\x1C\x07\x1A", "\xD6\x70\xD4\x34\xD1\x4D\x7D\x01\xA0\xD6\x62\xD1\x2F\xFE\x01\xA5\xD5\x64\xD7\x59\xDC\xD6\xA1\xD6\x5E\xDD\x5A\xCF\xD6\xF7\x43\x1F\x09\x5A\xF7\xD2\xAB\xD6\x64\xDE\x58\xDC\xC0\x80\x03\x20\xD1\x08\x33\xD6\xCD\x66\x20\x0C\x5B\xD6\x0E\x83\x03\x3C\xD4\x08\x19\xD5\x3C\x0A\x21\x0F\x5B\xCF\xAC\x87\x03\x20\xD8\x08\x03\xD2\x89\x03\x20\xDA\x08\x03\xD2\x8B\x03\x20\xDC\x08\x33\xD3\x8D\x03\x20\xDE\x08\x03\xD5\xB7\x15\x24\x01\x51\xD3\x02\x11\xD5\x25\x03\x48\xD6\x02\x83\xD3\x25\x0C\x58\xD8\x02\x83\xD1\x26\x03\x48\xDA\x02\x83\xD3\x26\x01\x51\xDD\x02\x83\xD2\x27\x03\x48\xDF\x02\x83\xD0\x28\x03\x48\xE1\x02\x83\xD2\x28\x03\x4F\xE3\x02\x8C\xD4\x29\x03\x48\xE5\x02\xF3\xD2\x29\x07\x5C\xD8\x20\xA7\x01\x44\xD9\x0A\x04\xD7\xF9\x47\x18\xDD\xE1\xB0\x02\x83\xD1\x2C\x03\x4F\xF2\x02\x83\xD3\x2C\x03\x4F\xF4\x02\x83\xD1\x2D\x03\x48\xF6\x02\x83\xD3\x2D\x03\x48\xF8\x02\x83\xD1\x2E\x03\x48\xFA\x02\x83\xD3\x2E\x0F\x5F\xEC\xD6\xA6\xD5\x32\xDD\x58\xE2\xD6\xB6\xD6\xF4\x2F\x61\xE5\xD8\xAE\xD5\x88\xD5\x58\xEA\xD6\x22\xDA\x65\xD7\x61\x3D\x02\x27\xD9\x6D", "\xD2\x63\xED\xD8\x9D\xD7\x8C\xD1\x10\x3E\x02\x31\xD8\x8D\xDF\x5A\xE0\xD8\x2C\xDB\x8A\xD4\x5B\xFA\xD8\x4C\x1B\x2F\x09\x63\xFE\xD8\xB7\xD4\x8A\xD0\x5B\xC0\xD9\x50\x0C\x30\x03\x48\xC1\x03\x43\xD8\x8F\x62\x0C\x0D\xD9\x45\x0B\x30\x03\x4F\xC4\x03\xF3\xD1\x31\x00\x65\xDA\x90\xC6\x03\x20\xD7\x0C\x03\xD2\xC8\x03\x20\xD9\x0C\x03\xD2\xCA\x03\x20\xDB\x0C\x33\xD3\xCC\x03\x20\xDD\x0C\x18\xD7\xA7\x14\x34\x01\x51\xD2\x03\x11\xD4\x35\x03\x48\xD5\x03\x83\xD2\x35\x0C\x58\xD7\x03\x83\xD0\x36\x07\x65\xFB\xD8\x41\x11\x36\x01\x51\xDB\x03\x04\xDA\x6D\x4D\x0D\x0D\xD9\xDE\x03\x20\xDF\x0D\x03\xD2\xE0\x03\x20\xD1\x0E\x03\xD2\xE2\x03\x20\xD3\x0E\x03\xD2\xE4\x00\x63\xD5\x0E\x37\xD9\x2A\xDB\x88\xD9\x62\xFD\xD8\x92\xDB\x91\xD4\x64\xE3\x1F\xE6\x00\xA4\xD4\x69\xEE\xD8\x97\xDB\xA4\xDF\x63\xDD\xDA\x96\xD9\xA5\xDC\x63\xDF\xDA\xBE\x73\x39\x0A\x69\xF3\x19\xE8\x03\xA9\xD5\x64\xF6\xD8\xA2\xDA\x91\xD3\x6A\xEB\xDA\x48\xDB\x9C\x19\x0E\x2A\xDA\x24\xD8\xAB\xDC\x69\xED\xDA\xB6\xDB\xCE\x0A\x0E\x03\xD2\xEB\x00\xAD\xD8\x37\x6C\x03\xF3\xD1\x3B\x0C\x58\xEE\x03", "\xF3\xD3\x3B\x03\x4F\xF0\x03\xBE\xDA\x75\x81\x0F\x03\xD2\xF2\x03\x20\xD3\x0F\x03\xD2\xF4\x03\x20\xD5\x0F\x03\xD2\xF6\x03\x3C\xD7\x0F\x03\xD2\xF8\x00\x9A\xD7\x61\x3B\x03\x11\xD5\x3F\x09\x55\xC3\xD2\xB6\xC2\x17\x93\x01\x0B\x41\x45\x0A\x00\x03\x6E\xD8\x7E\x03\x03\xB9\xD8\x45\xF8\xD9\xA7\x20\x01\x0A\x6E\xC8\xAD\x26\x17\xBB\xDB\xB4\xAF\x47\x08\x02\xBC\xD4\x46\xE5\x13\x09\x02\xBD\xDE\x1D\x0A\x00\xFA\xD8\x83\x8D\x6F\xC9\x04\x0C\x03\xBF\xD6\x10\x0D\x00\x02\xDF\x58\x75\x70\xC2\x04\x0F\x03\xC1\xD0\x6A\xC8\x1B\x10\x02\xC2\xD8\x6B\xF1\xDA\xB0\xDB\xC2\xDE\x6A\xC1\x11\x11\x02\xC3\xD7\x6B\xD7\xDC\x35\xD8\xC4\xD5\x6B\xDA\xDC\x37\x16\x04\x0E\x70\xD3\x00\x16\xDD\x3A\x74\x01\x21\xDC\x3E\x09\x05\x04\x72\xF9\x0C\x16\x03\xC9\xD8\x23\x17\x00\x2A\xDD\x98\x08\x01\x2D\xDC\x57\xCD\x06\x0E\x70\xDA\x00\x0E\xDF\x06\x0E\x70\xDC\x00\x0E\xDD\x07\x0E\x70\xDE\x00\x30\xDE\xA3\x0F\x01\x0E\xDC\x20\x02\xBD\xDA\x47\xF9\x0C\x23\x02\xBD\xD9\xDA\x46\xDD\xAC\x76\xC3\xD8\x02\x0E\xDC\x29\x01\xCF\xD3\x2B\x2A\x00\x0E\xDF\x0A\x0E\x74\xE1\xDA\x3D\x18\x0B\x08", "\x74\xFC\x76\x57\xDF\x6F\x73\x75\xEF\x0F\x31\x02\xC3\xD2\x03\x0E\xDC\x33\x02\xC3\xD4\x03\x0E\xDC\x35\x02\xC3\xD6\x03\x0E\xDC\x37\x03\xD6\xD3\x71\xE7\x16\x38\x02\xDA\xD9\x6B\xEC\xDB\x1C\xDC\xD5\xDD\x37\xF9\x00\x6E\xDD\xDC\xDF\x6A\xDB\xDC\x12\xDF\xDB\xD1\x69\xD8\xDC\x96\x32\x0E\x05\x77\xF9\xDD\x76\xDF\xDA\xD1\x78\xCA\x83\x3B\x03\xDF\xDF\x70\xC0\xDE\x88\xDF\xE1\xDE\xE3\x3C\x00\x0E\xDD\x0F\x06\x78\xFC\xDD\x7B\xDD\xC6\xD9\x78\xD0\xDE\x9B\xDA\xE4\xDA\x49\x3E\x00\x8F\xDE\xE5\xDD\x6E\x7F\x00\x99\xDC\xDC\xD3\x79\xDA\xDE\xA0\xDC\x35\x50\x04\x1D\xDE\x91\xDE\xE7\xDA\x78\xD4\xDE\xDD\x29\x10\x04\x7A\xD5\xDE\xA6\xDF\x2E\xC2\x04\x2B\xDE\xA4\xD8\xEA\xD1\x71\xE7\xDE\xED\x6B\x10\x00\x7B\xF3\xDE\xB2\xDC\xDE\xD4\x7B\xED\xDE\xA1\xDD\xE9\xD6\x1B\x44\x01\xB7\xDE\xEE\xD9\x7B\xDE\xDA\xB8\xDD\xEF\xD9\x15\xC5\x01\xC1\xDC\xF1\xD2\x7C\xC6\xDF\xB1\xDD\xBB\x66\x04\x0E\xDC\x47\x01\xF2\xD4\xA7\x48\x01\xD2\xDF\xFB\x09\x04\x06\xDE\x4A\x02\xE1\xDB\x04\x15\xDF\x97\xB4\x13\x0E\x70\xCD\x01\x0E\xDE\x13\x0E\x70\xCF\x01\x0E\xDC\x14\x0E\x70\xD1\x01\x86", "\xDE\x14\x0E\x70\xD3\x01\x42\xDE\x3C\x16\x05\x19\xDD\x03\x04\x16\x00\x7F\xC2\x04\x5A\x02\xC3\xDB\x05\x0E\xDC\x5C\x00\xF7\xD3\x10\x1D\x01\x0E\xDE\x17\x0A\x7F\xC3\xDE\x17\x1B\x17\x03\x7F\xC1\x04\x61\x03\x00\xE7\x4F\x63\x01\xFF\xDF\xCA\x04\x06\x0E\xDC\x65\x02\xC3\xD6\x06\x0E\xDC\x67\x02\xC3\xD8\x06\x0E\xDC\x69\x02\xC3\xDA\x06\x09\xE0\xBB\xDC\x13\x3B\x06\x18\xE0\xC3\xDE\xDC\xDC\x7B\xDF\xE0\xB6\x44\x1B\x0C\x81\xCC\xDF\xC5\xDC\x08\xEC\x7A\xFE\xDE\x27\xE1\x0A\xEB\xE4\x2D\x01\x23\xE2\x09\xED\x7C\xEE\xE0\x25\xE0\x0A\xEC\x35\xEE\x01\x2D\xE2\x0C\xE1\x83\xEA\xE0\x37\xE1\x86\x4F\x06\x35\xE0\x38\xE3\xF2\xD0\x83\xFE\xE0\x36\xE0\x10\xED\x83\xF3\x0A\x70\x00\x0F\xEF\x82\xC1\xE1\xCA\xDD\x12\xEF\xCD\xB1\x01\x46\xE1\x0E\xEE\x84\xC2\xE1\x47\xE3\x10\xEA\x32\xF2\x01\x4D\xE0\x14\xEF\x84\xCA\xE1\x77\xDC\x16\xE9\x28\xF3\x01\x55\xE2\x16\xEA\x77\xD2\xE1\x59\xE2\x07\xED\x14\xF4\x01\x5D\xE2\x18\xE0\x86\xC2\xDE\x9F\xDF\x0F\xE2\x02\xF5\x01\x65\xE1\x18\xEE\x86\xE8\xE1\x19\xE3\x19\xE1\x06\xF6\x01\x6D\xE0\x1C\xED\x81\xEF\xE1\x5F\xE1\x14\xEA\x87", "\xD7\xE1\x66\xE3\x1E\xE6\x85\xFA\xDE\x77\x01\x1D\xE9\x87\xFC\xE1\x78\xE0\x00\xE9\x86\xC8\xE1\x7D\xE0\x21\xE6\x87\xE4\xE0\x7F\xE2\x17\xE7\xC3\x38\x01\x82\xE2\x21\xE7\x82\xB9\x01\x0E\xDE\x1E\x01\x89\xC7\xE2\x72\xE2\x24\xE2\xCD\xBB\x01\x97\xE1\x1C\xE5\xC1\xBC\x01\x9D\xE3\x1D\xEB\x88\xEA\xE1\xD7\x99\x1F\x01\x8A\xC8\x19\x7E\x03\x29\xE4\x8A\xC5\xE2\x98\xE2\x1F\xEE\x88\xED\xE2\x75\xC7\x1F\x0A\x8A\xC8\xE2\xAC\xE2\x27\xEA\x88\xC3\xE2\xD1\xCC\x20\x03\x8B\xD3\x13\x81\x03\x2E\xEE\x8A\xC9\xE2\x8D\xE0\x30\xEF\x8A\xE7\xA0\x82\x02\x2F\xE7\x8B\xDA\xE2\x8C\xE3\x30\xE2\x8A\xF8\xE2\xCA\xE1\x32\xE2\x8C\xE5\x39\x83\x02\x31\xE1\x8C\xF5\xE2\xCB\xE0\x32\xEB\x8A\xE3\xE2\xB4\xE3\x65\xB4\x08\x12\xE3\xCD\xE3\x35\xEC\x8C\xCF\xE3\xD4\xE2\x06\x95\x08\x0E\xDC\x86\x00\x37\xE0\x8E\xD8\xE3\x99\xE3\x61\xA7\x08\x26\xE3\xE1\xE2\x1B\x78\x08\x2C\xE3\xE8\xE3\x2F\xED\x8E\xF2\xA1\x89\x00\x3C\xEF\x8D\xC7\x44\x8A\x02\x3D\xE6\x8D\xD9\xE3\xF7\xE1\x3C\xE9\xDF\x0B\x02\xFA\xE0\x2C\xE3\x8D\xFE\xE3\x03\xE5\x3F\xE6\x90\xE2\xD8\x8C\x01\x40\xEA\x49\x0D\x02\x0A\xE5", "\x35\xE2\x90\xDD\xE3\xFC\xE3\x3E\xE8\xA3\x4E\x02\x0D\xE6\x33\xE3\x8F\xE9\xE3\xB6\xE1\x41\xE2\x91\xF2\xE3\x04\xE6\x04\x2F\x08\x15\xE4\xDE\xE2\x33\x20\x09\x20\xE4\x11\xE7\x43\xE7\x8E\xC7\xE4\x26\xE7\xFB\x01\x09\x24\xE4\x18\xE6\x43\xE9\x91\xD0\xE4\x2D\xE6\x45\xED\x91\xEA\xCC\x92\x00\x4B\xEC\x91\xE8\xE4\x2F\xE5\x99\x33\x09\x1D\xE2\x94\x02\x4D\xE7\x8C\xEE\xB6\x95\x02\x4F\xEA\x91\xE9\xE4\x33\xE4\xEA\x26\x09\x1D\xE2\x97\x02\x50\xED\xD9\x18\x02\x4A\xE7\x49\xEB\x91\xFF\xE4\x39\xE7\x45\xE7\x93\xCF\xE5\x8E\x09\x26\x0D\x94\xD2\xE5\x50\xE6\x4B\xEA\x76\x1A\x02\x9D\xE3\x26\x07\x95\xC5\xE5\x61\x88\x27\x0F\x95\xF8\xE4\x5A\xE6\x4C\xE4\x96\xE6\xE5\xC9\x95\x27\x03\x96\xD4\xE5\x30\xE7\x54\xE4\x94\xE7\xE5\x21\xE7\x5B\xEC\x96\xCE\xE5\x72\xE5\x5D\xE1\x95\xE0\xE5\x70\xE5\x49\xEC\xA3\x5E\x02\x6B\xE6\x5D\xE5\x96\xF1\xE5\x77\xE5\x5E\xE8\xA3\x5F\x02\x7D\xE6\x26\x10\x0A\x05\xE6\x7F\xE4\x90\x01\x0A\x08\xE6\x68\xE6\x5F\xED\x98\xC1\xE6\xCE\x22\x28\x0E\x70\xE3\x02\x8C\xE6\x97\x34\x0A\x0A\xE4\xA5\x02\xE1\xD6\x0A\x06\xDE\xA7\x01\x65\xE9\xCC\x68", "\x02\x0E\xDD\x2A\x0E\x70\xEA\x02\x0E\xDF\x2A\x0E\x70\xEC\x02\x0E\xDD\x2B\x06\x78\xEE\x02\x0E\xDF\x2B\x0D\x7E\xFD\x14\xB2\x02\x01\xE4\x0B\x06\xE0\xB6\x02\xC3\xD7\x0B\x0E\xDC\xB8\x00\x06\xE9\x0B\x0E\xDC\xBA\x02\x67\xE4\x69\xFB\x02\x06\xE1\x2F\x06\x80\xE3\x43\xBF\x01\x27\xE0\x0C\x0E\xDC\xC1\x02\xC3\xD2\x0C\x0E\xDC\xC3\x02\xC3\xD4\x0C\x0E\xDC\xC5\x02\xC3\xD6\x0C\x18\xE0\xC7\x02\x6F\xEE\x96\xD0\xE6\x8E\xE4\x60\xE9\x98\xF1\xE4\x80\xE4\x32\x06\x9D\xD9\xE5\x8F\xE7\x76\xE7\x9D\xF7\xDA\xC9\x03\x77\xE3\x94\xD8\xE7\xE8\xE6\x78\xE0\x9E\xDA\xE7\xE1\xE5\x7B\xEC\x9E\xFD\x1D\xCA\x02\x79\xED\x96\xEB\xE7\x7A\xE6\x7A\xE7\x9E\xF6\xE7\xF3\xE7\x7D\xEE\x9E\xF5\xE7\xFB\xE7\xD4\xCB\x0C\x32\xE7\x74\xE6\x8F\x3C\x0C\x18\xE0\xCD\x00\x06\xEE\x0C\x03\xE7\x8F\xE4\x34\x08\xA0\xCA\x19\xD2\x03\x82\xEC\xC4\x14\x03\x9D\xE1\x35\x00\xA0\xC2\x26\xD6\x02\xC3\xD7\x0D\x0E\xDC\xD8\x02\xC3\xD9\x0D\x0E\xDC\xDA\x02\x01\xEC\x0D\x0E\xDC\xDD\x02\xBD\xD8\x30\x61\x03\xAF\xE6\xC0\x04\x0E\x13\xE8\x12\xC0\x8A\xE2\x98\xFB\x68\xE6\x00\x06\xE7\x0E\x18\xE0\xE8\x02\x83", "\xEC\x9D\xC0\x09\xEA\x02\x8C\xE3\x67\x2C\x03\x36\xEB\x27\x3E\x0E\x1D\xE2\xEF\x02\x8A\xE0\xA6\x30\x03\x0E\xDD\x3C\x0E\x70\xF2\x03\x0E\xDF\x3C\x0E\x70\xF4\x03\x06\xE2\x3D\x0E\x70\xF7\x03\x22\xEA\x42\x0B\x0F\x25\xE8\x13\x0C\x00\x00\x10\x00\xB6\x81\x00\x00\xFE\x13\x00\x02\x83\x81\x03\x82\x83\x7F\x08\x89\x88\x86\x87\x82\x85\x84\x86\x03\x8E\x8F\x90\x80\x02\x8B\x84\x8A\x16\xFF\x54\x95\x86\x8B\x8D\x8C\x8F\x1D\x98\xA1\x90\x8F\x88\x8D\x80\x86\x05\xA4\xA3\x8C\x85\x92\x96\x88\x90\x2F\xA2\xB1\x8E\x9E\x80\x99\x9A\x99\x37\xB4\x8A\x96\x9B\x9B\x8C\x0A\x88\x29\xAC\xAB\x8D\x83\x9A\xA1\xA2\xA2\x39\xC6\x89\xA8\xAD\x9A\x9F\x88\xA7\x17\xD0\x9A\x98\x9D\xA2\xA5\xAA\xA6\x4F\xD6\x99\xB8\xA1\xAA\xAD\xAE\xAE\x53\xD2\xBC\x9B\xA1\x8B\xA1\xB3\xA3\x67\xCB\xA9\xB7\xAB\xB4\xB2\x81\x96\x5E\xE1\xB1\xA3\xBF\xAD\xB5\xBB\xB7\x66\xF8\xA8\xBA\xBA\xB4\xBC\xB6\xBF\x6E\x9C\xBB\xA2\xCD\xBC\xC3\xBE\xC3\x81\xF0\xA0\xB4\xB2\xBB\xC4\xAB\xC4\x79\x88\xF7\xB2\xCD\xC6\xB9\xCA\xC0\x93\x8A\xD6\xCC\xCC\xCF\xC5\xCD\xC8\x9A\x98\xD7\xD4\xCD\xCA\xB2\xCF\xD1\xA1\xA4\xE7", "\xC5\xD3\xBB\xD6\xD6\xD3\xB0\xAD\xF1\xCE\xC3\xDB\xCF\xD6\xD9\xB8\xB4\xF9\xD6\xD5\xDA\xD0\xD6\xDD\xC0\xBC\xFB\xDE\xD7\xD9\xE0\xE3\xDE\xAA\xC8\xE9\xCB\xE0\xD5\xE7\xC0\xE6\xCF\xCE\xC5\xD0\xE3\xEA\xEB\xC2\xEA\xD7\xD6\xD0\xD1\xEC\xED\xE9\xEF\xEC\xDF\xDB\xDE\xE3\xF0\xF4\xF2\xF1\xF2\xE8\xE7\xEA\xFF\xC1\xF4\xF6\xF2\xF7\xE9\xF0\xEB\xE8\xDA\xEA\xFA\xFA\xFA\xED\xF8\xC5\xC1\x0F\x98\x95\xE2\xE1\xC6\x49\x73\x72\x80\x01\x98\x73\x7F\x6F\x00\x89\x87\x73\x80\x06\xB7\x78\x83\x82\x05\xB5\x7A\x7D\x7C\x13\x87\x8F\x7C\x84\x0A\x84\x89\x85\x83\x15\x8E\x87\x86\x86\x18\xA1\x80\x8B\x88\x1C\x8F\x84\x8A\x84\x26\xA5\x8F\x86\x8A\xCA\x68\x8B\x8A\x8B\x2D\xB9\x79\x88\x8C\x0C\xB4\x81\x86\x8C\x2F\xB8\x81\x8F\x7B\x1D\xBD\x83\x8E\x8E\x35\x80\x97\x8C\x8F\x3F\x84\x99\x8E\x91\x3B\x94\x85\x92\x92\x47\x8C\x99\x92\x85\x4F\x9E\x81\x96\x8F\x4D\x90\x91\x90\x92\x03\x82\x0D\x7E\x41\x41\x43\x9E\x93\x95\x5F\x9E\x96\x96\x98\x52\xA0\x93\x9B\x86\x36\xA8\x92\x92\x9A\x58\xA4\x94\x97\x94\x4B\xA7\x92\x88\x8B\x66\xA5\x9E\x99\x9C\x76\xAC\x91\x9A\x9E\x72\xA7\x8B\x9B\x9C", "\x69\x80\xAF\x9E\x9F\x6D\xBC\x99\x9E\xA0\x85\x88\xAB\x9E\xA2\x7D\xB4\x97\x9F\x87\x03\x1B\x94\x41\x95\x87\x84\xAB\xA2\xA5\x8D\x81\xA8\xA5\xA5\x8E\x86\xAF\x99\x9D\x9F\x8F\xA0\x9C\xA5\xA1\x9E\xA8\x9D\xA9\x8C\x9C\xAA\xA5\xA7\xA9\xA8\xAB\xA6\xAB\xAC\xAF\xA7\xAB\xAC\xA4\xB4\xA3\xAB\xAD\xA0\xB6\xA9\xAD\xAD\xBC\xB8\xA2\xAB\xAE\xBE\xA6\xAD\xAC\xB0\xC4\xBF\xA6\xB2\xB0\xC1\xAD\xAA\xAF\xB1\xCA\x83\xBC\xB2\xAC\xCE\x88\xB5\xB2\xB4\xCF\xB1\xA6\xB7\xAA\xD8\x83\xA7\xB6\xB6\xD9\x89\xA0\xB5\xB2\xDF\x93\xBD\xB0\xB8\xDB\x85\x64\x02\xA4\x02\x5D\x94\xB7\xBA\xE3\xA2\xB1\xB9\xB5\xDD\x97\xA5\xBA\xBC\xF1\x99\xAC\xB7\xBD\xDE\xB3\xB6\xBD\xBE\xF5\xAA\xA8\xBC\xBD\xFF\xBB\xB0\xC0\xBF\x01\xFE\xB4\xC3\xC1\x03\xC9\xC2\xC3\xC2\x06\xCA\xCD\xC0\xC3\xAE\x85\x08\xB8\x00\xEA\xAD\xB0\xBD\xC1\xB0\xBD\xB9\xC4\xC6\xCB\xAC\xBF\xBA\xC7\xFA\x93\x66\x03\xC4\x15\xDF\xC6\xC4\xC8\x9A\x87\x04\xC9\xB4\x02\x48\x0B\xC8\x44\x09\x2F\xCC\x42\x02\x32\xC6\x4B\x01\xCD\x03\x4C\x08\xCE\x40\x0D\x3B\xC0\x02\x03\x3E\xCF\x0E\xCC\x04\x3E\xD1\x0E\xCE\x04\x3E\xE1\xCB\xC4\xC2\x10", "\xDD\xC7\xCB\xD3\x26\xE3\x83\x05\xD2\x1A\xFE\x44\xD4\xC7\x2C\xD1\xDA\xD2\xD3\x5A\xD5\xD9\xD7\xD6\x5F\xDE\xD4\xBA\xD8\xEE\xA0\xD3\xD8\xD6\xE0\x95\x07\xD4\xD3\x0F\xED\xD3\x6A\x05\x6B\xCE\xCB\xD2\xDC\x5C\xE6\xD5\xD8\xD9\x17\xEC\xD3\xDD\xD3\x61\xE8\xD7\xDE\xDF\x79\xF4\xDD\xDE\xDE\x75\xF8\xD8\xC8\xE0\x87\xC4\xE3\xE2\xE0\x67\xCA\xED\xE0\xE3\x7F\xCE\xE1\xE4\xE4\x81\xFC\xDF\xE2\xE5\x93\xD8\xE5\xE6\xDB\x85\xC8\xE0\xD6\xDD\x9B\xFB\xDC\xE7\xE2\x9A\xC9\xE4\xE6\xE9\x81\x57\x01\xDD\xE9\x9F\xC6\xED\xEA\xE7\x5D\xF0\xE0\xE8\xEA\xA3\xD7\xE5\xED\xE6\xB7\xE1\xED\xE6\xE4\xBA\xE4\xE9\xEC\xED\xA2\xC1\xFB\xEF\xE9\xAF\xFC\xE0\xF3\xF0\xAC\xF1\xE6\xF1\xF1\xC4\xCA\xFD\xF3\xEC\xCC\xC9\xF0\xF6\xF3\xD2\xEE\xE4\xF7\xEF\xD1\xD8\xF7\xF7\x68\x18\x2B\xEA\xF7\xF4\xE0\xD6\xF1\xFA\xEC\xE2\xE5\xF4\xFB\xF9\xCB\xDB\xF8\xF3\xF7\xE6\xE9\xF3\xFA\xFB\xED\xCF\xF1\xFD\xF5\xE8\xF2\xF5\xFC\xFD\xF0\xF7\xFC\xFA\xFE\xC2\xFE\xED\xFE\xED\xFF\x78\x75\x00\xBD\x70\x81\xF5\x43\x87\x78\xFE\x66\x82\x02\x89\x8C\x81\x02\x8D\x82\x80\x0B\x8E\x82\x04\x90\x8F\x80\x02\x94\x83", "\x82\x16\x99\x80\x02\x98\x8B\x83\x0B\x9E\x82\x83\xD9\x67\x81\x08\x91\x8F\x83\x0E\xA0\x82\x7D\x15\x86\x86\x0A\xA3\x89\x84\x16\x90\x21\x03\x3E\x7A\x02\xF7\x22\x88\x84\x0E\xAE\x85\x84\x37\x87\x87\xFB\x76\x79\x7F\x1E\xBC\x87\x87\xF8\x60\x8B\xFE\x3E\x81\x89\x22\x83\x8A\x88\x34\x9B\x86\x11\xC9\x86\x7B\x0D\x33\x84\x84\x3A\x93\x7F\x11\xCB\x80\x8B\x15\xB5\x80\x87\x57\x91\x8B\xA0\x1C\x0F\x89\x16\x99\x8E\x8A\x4A\x93\x8A\x18\xCC\x8C\x7F\x2A\xB9\x80\x8C\x52\x84\x8C\x11\xE3\x86\x8D\x2F\xA7\x8F\x8D\x6E\x91\x8D\x18\xEA\x88\x88\xAE\x5D\x05\x8B\x36\x91\x8E\x07\x78\x88\x8B\x39\xAD\x8E\x8F\x5E\x80\x91\x1E\x82\x9D\x8F\x34\xBF\x8E\x90\x81\x88\x93\x20\x8A\x95\x91\x32\x89\x96\x91\x8B\x90\x91\x23\xEB\x84\x8E\x2A\x8F\x94\x92\x87\x92\x92\x16\x98\x97\x93\x3A\x9D\x96\x92\x91\x9C\x91\x28\x97\x5F\x02\x3E\x9B\x97\x52\x20\x06\x94\x1A\x9A\x9B\x94\x51\x93\x96\x93\xA3\x80\x97\x2B\xB2\x97\x94\x5A\xAD\x90\x96\xB3\x8C\x8F\x27\xBA\x91\x96\x5E\xB9\x95\x92\xBE\x95\x95\x30\xB7\x96\x96\x38\x84\x92\x98\xC0\x89\x9A\x89\x21\x0A\x94\x63\x8C\x90\x99\x99\x8E", "\x94\x34\xBB\x9A\x98\x6A\x91\x98\x97\xD3\x9D\x95\x35\xDA\x97\x9B\x62\xB2\x8F\x99\xC4\x83\x98\x1C\xA2\x0E\x67\x11\x0D\x9F\x9B\xAC\x8E\x99\x3A\xE8\x92\x9B\x70\x9B\x9F\x97\xDD\x82\x9C\x3B\xD8\x9E\x9D\x78\xAF\x99\x9B\xF0\x96\x9A\x3E\xDC\x9B\x9F\x7C\xBC\x9F\x9F\xFE\x81\xA0\x3E\x83\xA5\x9F\x7E\x84\xA0\x8E\x24\x07\x9F\x31\x85\xA0\xA1\x83\xB3\x9E\x9B\x0B\xAA\x9D\x3B\x92\xA4\x9E\x8A\x90\xA0\x9C\x16\xB2\x9D\x44\x8F\xAA\xA2\x8C\x9C\xA7\x9E\x0C\xA2\xA1\x48\x8E\xAB\xA3\x92\x9E\xA6\xA4\x83\x45\x06\x42\xA7\xAC\xA5\x75\xA8\xA3\xA2\x1F\xB6\x9E\x4C\x86\xA3\xA5\x9A\x99\xA0\xA4\x37\xB3\xA5\x43\xB6\xA1\xA6\x9A\xB9\xA6\xA7\x3D\xBB\xA7\x4F\xC2\xA1\xA8\x91\x83\xAE\xA8\x45\xA4\xA5\x4B\xB0\xAF\xA5\x8A\x89\xAB\x20\x26\x0B\xA6\x4B\xCB\xAE\xA9\xA6\x97\xA3\xAA\x58\xAC\xA8\x55\xD7\xAA\xAB\xAC\x95\xAB\xAB\x1D\xBE\xA8\x57\xDF\xA2\xAD\xB0\x9D\xAF\xAC\x64\xA8\xAF\x58\xEB\xA6\xAD\xB4\xAE\xAC\xAD\x38\xAF\xAB\x51\xCA\xA5\xAD\xB8\x96\xAD\xAD\x70\xBA\xA4\x52\xF7\xA6\xAE\xB0\xBD\xAD\xAE\x7A\xB4\xAE\x5A\xF8\xA4\xB1\xBF\x83\xB6\xB0\x6F\xA5\xB1\x60\x9E", "\x67\x04\x9F\x68\x02\xAA\x87\xAB\xB3\x5C\xBC\xAC\xAE\xC9\xB2\xAF\xB2\x95\xA0\xA9\x66\xC4\xAB\xB3\xBD\xBE\xAE\xB2\x9D\xAF\x59\x0A\x10\xB9\xB0\xC4\xB9\xAA\xB3\x9F\xA8\xB4\x60\xAA\xB5\x30\x15\x24\xB7\xB4\x9C\xA9\xB5\x6C\xAB\xB3\xB7\xC8\xAC\xB5\xB4\xA0\xB2\xB6\x67\xB4\xBB\xB6\xDB\xB5\xB0\xB7\x14\x2B\x07\x6B\x8A\xB7\xB6\xD8\xBD\xB0\xB8\xE0\x4C\x07\x70\xA6\xBA\x7B\x16\x0B\xBB\x23\x2E\x1E\x67\x0B\x3E\x60\x06\x9F\x71\x06\x67\x32\x1E\x67\x0C\x3E\x64\x06\x9F\x75\x06\x67\x36\x1E\x67\x0D\x3E\x68\x07\xE7\x85\xBC\xB8\xBF\xA9\x79\x0E\x66\xB8\x38\x1D\x2C\xBF\xB8\xC6\xA2\xB0\x72\xF0\xB8\xBC\xFA\x8C\xBF\xBE\x5C\x7B\x07\x7B\xF2\xB1\x30\x1E\x3B\xBC\xB2\xBA\xBC\xBD\x7D\x82\xC8\xBF\xF3\x85\xC1\xBD\x03\xC0\xC0\x6F\x84\xC9\xB7\x05\xCA\xC6\xB7\xF6\xAD\xC0\x84\x8C\xC6\xC0\x09\xF3\xBE\xA1\x3D\x1F\xBF\x64\x9B\xC8\xB3\x00\xCF\xC7\xC2\x1F\xD1\xBD\x88\x89\xCC\xC3\xD0\xA3\xC7\xC0\x11\xD5\xC2\x8A\x88\xC8\xC4\x0A\xEC\xC6\xC2\x22\xC5\xC6\x87\xB2\xCE\xC0\x1A\xD3\xC6\x8A\x3E\x1A\xC1\xD4\x3F\x0A\xC6\x13\xF6\xC0\xC4\x3F\xD1\xC5\x87\xB5\xC3\xC9\x1B", "\xC1\xCC\xC4\x45\xC0\xC9\x92\xC2\xCE\xC7\x25\xD3\x30\x08\x3E\x61\x09\x8F\xB3\xCE\xC9\x16\xE7\xC0\xC6\xDA\x62\x0B\x94\xC4\xCD\xC9\x2E\xD4\xCE\xCB\x5C\xDF\xCA\x98\xE1\xC4\xCC\x23\xD5\xC8\xCB\x56\xC7\xC9\x9A\xE7\xCB\xC5\x14\xEF\xC5\xCD\x2E\xCE\xCC\x16\xC3\x0B\xCA\x98\x84\x0D\xCE\x4A\xC0\xCE\x99\xFA\xC9\xCF\x31\xFB\xCE\xCF\x7D\xC5\xCD\xA0\xFF\xC2\xD0\x26\xC0\xD6\xD0\x85\xC8\xC8\x9F\x88\xD4\xD1\x46\xC3\xD7\xD1\x8C\xD0\xD2\xA2\x87\xD8\xC9\x22\x38\xC9\xD2\x98\xD3\xD1\xA2\xEB\xCB\xA2\x23\x3E\x67\x08\x97\xDA\xD2\xA3\x99\xDC\xD2\x4A\xE5\xD3\xD3\x68\xC9\xD4\x9C\xD7\xCB\xD4\x35\xEA\xD7\xCD\xB0\xD2\xCD\x9C\xB3\xDC\xD5\x58\xF4\xD6\xD5\xAD\xCC\xCE\xAD\xB5\xDE\x5C\x24\x21\xD7\xD4\xA3\xC2\xD6\xA4\xC0\xD3\xD9\x57\xF2\xD4\xD7\xB7\xDA\xD7\xB1\xB8\xDB\xD6\x66\xCB\xDA\xD9\xC9\xCB\xD2\xB0\xA4\xD6\xD9\x67\x49\x0F\xD7\xD5\xC8\xDA\xB6\xCE\xD1\xDA\x53\xD9\xDC\xDB\xDB\xD0\xD9\xB8\xD2\xD4\xD8\x6A\xF9\xD4\xDC\xDF\xC2\xDC\xB8\xEB\xDA\xDD\x76\xE8\xDF\xDC\xDE\xD0\xDC\xAA\xF2\xD1\xD9\x72\xD3\xDF\xDE\xF6\xCE\x56\x12\x58\xD4\xDF\x62\xFD\xDE\xDC", "\xCD\xCE\xDD\xBC\x81\xEF\xDC\xA2\x8B\x0C\xDF\x04\xE3\xE3\xB3\x85\xEB\xE0\x85\xDD\xDB\xDE\x09\xF0\xE1\xC3\x92\xEF\xE1\x7A\xE9\xDC\xE1\x15\xFE\xDD\xC4\x96\xEF\xDE\x7C\xD7\xE6\xE1\xE3\xC0\xE4\xBB\x98\xE1\xE4\x8A\xE5\xE1\x7D\x4C\x08\xE3\xC4\x9C\xEB\xE2\x8D\xEB\xE6\xE5\x19\xE0\xE3\xCB\xB2\xE1\xE6\x8F\xDD\xE1\xDF\x1F\xE6\xE7\xC8\xA2\xE2\xE0\x9D\xF1\x8D\x09\x13\x62\x03\xCD\xB9\xEC\xE5\x99\xF6\xE1\x8F\x4F\x01\xE8\x45\x51\x0A\xE9\x96\xF4\xE7\xE4\x30\xF0\xEB\xD3\xBB\xEE\xE6\x92\xD4\xED\xE8\x35\xF8\xE7\xD0\xDB\xEE\xE9\xA3\xC6\xEA\xEB\x5D\xE0\xEF\xD7\xC4\xE1\xEB\xAB\xE5\xED\xE7\x58\xF2\xEA\xD7\xD9\xE4\xED\xA9\xE8\xEF\xEC\x56\xEF\xEE\xDB\xF1\xE4\xEE\x9E\xF5\xED\xEA\x76\xF1\x33\x14\x2A\xEC\xEC\xAE\xE3\xEE\xEF\x7D\xE0\x5C\x15\x7C\xEA\xEC\xB1\xC1\xF7\xEF\x61\xED\xEF\xDA\x85\xFA\xF0\xC3\xCC\xF0\xF0\x8F\xE9\xF0\xE4\xE6\xE3\xEF\xBC\xF8\xE8\x76\x55\x04\xF0\xE5\x8B\xFB\xF2\xC7\xDD\xF5\xF1\xA0\xF3\xF2\xDC\x9C\xF3\xF4\xCF\xE5\xF1\xF4\x01\xF6\x0A\xE6\xA7\xF2\xF5\xBB\xE9\xEF\xF3\xAD\xF6\xF3\xEB\xAC\xF2\xF3\xDA\xC8\xF7\xF6\x87\xF9\xF5", "\xE4\xB8\xFB\xF7\x64\xD7\x0B\xF5\xAE\xF0\xEE\xEC\xC2\xF7\xF3\xD9\xC1\xFD\xF2\xC5\xE4\xFA\xF1\xC3\xF8\xF9\xE5\xC9\xFD\xF9\xCA\xF1\xF8\xF4\xD3\xF4\xF5\xE3\xD5\xFC\xF9\xD7\xEF\xF9\xF6\xCE\xFC\xFA\xE9\xD5\x50\x0B\xC0\xF8\xFA\xE9\xD6\xF3\xFC\xF1\xE8\xF4\xF7\xB0\xF6\xF6\xEE\xE9\xF8\xFC\xDA\xED\xFC\xFC\xE7\xEB\xFE\xFB\xF2\xF0\xFF\xD8\xDA\xFD\xFC\xF7\xF1\xFD\xEF\xFB\xFC\xFC\xFA\xE6\xFE\xFE\xDD\x74\x7D\xF8\x71\x80\xDB\x7E\x7D\x03\x86\x80\xFA\x7D\x7F\xFC\x73\x7F\x0B\x89\x05\xE1\x79\x7F\x00\x88\x80\x14\x1A\x05\xAB\x7B\x05\x0F\x84\x80\x07\x82\x80\x09\x8C\x80\x0A\x8D\x81\x1C\x8F\x81\xF5\x7A\x7E\x0B\x81\x82\xEF\x7F\x7F\x22\x8E\x81\x71\x7C\x05\x17\x8A\x64\x5D\x0A\x63\x5E\x0E\x33\x5F\x0E\x33\x60\x0E\x33\x61\x0E\x33\x62\x0E\x33\x63\x0E\x33\x64\x0E\x33\x65\x0E\x33\x66\x0E\x33\x67\x0E\x33\x68\x0B\x82\x1A\x81\x81\x7D\x29\x06\xAB\x7A\x06\x44\x85\x80\x45\x87\x82\x20\x86\x82\x25\x80\x3B\x6B\x0B\x84\x19\x8C\x84\x56\x8E\x2A\x6C\x04\x85\x1B\x84\x82\xFE\x70\x81\x4E\x8C\x85\x23\x80\x85\x5D\x88\x81\x5B\x82\x86\x61\x8E\x85\x51\x8E\x2D\x6D", "\x0E\x33\x6E\x0A\x85\x46\x82\x4F\x6F\x0E\x86\x10\x10\x07\xE7\x41\x07\xE7\x42\x07\x72\x89\x86\x12\x88\x1C\x73\x0E\x33\x74\x0E\x33\x75\x0E\x33\x76\x0E\x33\x77\x0E\x33\x78\x07\x4E\x79\x0E\x33\x7A\x03\x31\x03\x0E\x45\x7D\x0D\x74\x0C\x1F\x07\x90\x86\x10\x81\x0E\x33\x82\x0E\x33\x83\x0A\x63\x84\x0E\x33\x85\x09\x87\x63\x8B\x87\x7A\x81\x18\x86\x03\x89\x03\x18\x08\xA4\x88\x82\x1E\x5A\x08\xAB\x7B\x08\x3E\x3C\x08\x3E\x3D\x08\x3E\x3E\x08\x3E\x3F\x08\x3E\x30\x09\x3E\x31\x09\x3A\x62\x09\x9E\x87\x86\x64\x8F\x86\x55\x8F\x8B\x65\x88\x86\x9F\x8D\x84\xA1\x87\x85\xC1\x8D\x8B\x5F\x86\x86\xA8\x82\x8C\xBC\x80\x8A\xC3\x82\x4F\x93\x0B\x8B\xCB\x88\x8C\xC5\x80\x8C\xBE\x87\x8C\xCE\x8D\x8C\xC4\x8F\x8C\xD6\x89\x8C\xCC\x83\x8D\xD9\x80\x8E\xDB\x8A\x8D\xC6\x87\x8D\xE6\x8E\x8D\xD4\x8C\x8D\xD8\x83\x8E\xE2\x88\x64\x94\x02\x8D\x4F\x8F\x8D\xF1\x89\x8E\xE4\x8D\x8D\xD5\x8B\x8E\xE5\x88\x8E\xE1\x83\x8F\xFB\x80\x86\xED\x86\x8F\xEA\x87\x8E\xF7\x82\x90\x01\x9A\x8F\xEC\x8C\x8F\x07\x9E\x8F\x08\x99\x8F\x03\x96\x90\x0C\x95\x90\x0D\x91\x91\x10\x93\x91\x0B\x85", "\x09\xF0\x8A\x90\x18\x9A\x8C\x23\x26\x09\x17\x9E\x51\x97\x0E\x33\x98\x07\x4E\x99\x0E\x33\x9A\x0E\x33\x9B\x0E\x33\x9C\x0E\x33\x9D\x0E\x33\x9E\x0E\x33\x9F\x0E\x33\xA0\x0E\x33\xA1\x0E\x33\xA2\x0E\x33\xA3\x0D\x91\xF2\x8A\x90\xA4\x0B\x7A\xA5\x08\x93\xF4\x8F\x8F\xF8\x80\x90\xF5\x8B\x81\xA6\x0E\x93\xFD\x8A\x91\x19\x93\x18\xA7\x06\x94\xDE\x48\x0A\x3A\x69\x0A\x3E\x3A\x0A\x3E\x3B\x0A\x3E\x3C\x0A\x3E\x3D\x0A\x3E\x3E\x0A\x3E\x3F\x0A\x3E\x30\x0B\x3E\x31\x0B\x3E\x32\x0B\x3E\x33\x0B\x4C\x9F\x90\x43\x94\x11\xB4\x0B\x7A\xB5\x05\x96\x42\x90\x94\x04\x97\x96\x0E\x96\x7A\xB6\x0C\x96\x5C\x37\x0B\x74\x9F\x96\x6E\x91\x97\x41\x9B\x97\x78\x9B\x90\x6D\x9E\x97\x7C\x9A\x97\x7D\x99\x94\x3F\x90\x98\x83\x98\x94\x88\x92\x8F\xB8\x07\x97\x82\x9D\x98\x12\x90\x97\x8F\x99\x97\x91\x96\x98\x8E\x94\x91\x92\x96\x99\x94\x93\x99\x84\x9B\x8F\xB9\x0C\x98\x03\x2A\x0B\x9E\x98\x99\x9B\x99\x90\x89\x95\x98\xA3\x96\x96\x97\x90\x99\xA2\x95\x9A\x47\x99\x93\xAC\x94\x9A\x44\x6B\x0B\xA1\x9A\x9A\xB4\x99\x9A\xB6\x99\x99\xAB\x9E\x9A\xBA\x96\x9A\xAF\x98\x9A\xB8\x95\x9B", "\xBF\x97\x9B\xA7\x9F\x97\xC3\x91\x98\x9A\x9D\x9B\xC4\x98\x9C\xC6\x97\x42\xBC\x03\x9B\xC2\x9A\x9C\x87\x9B\x9B\xAD\x9C\x9B\xD2\x90\x9B\xD4\x97\x9D\xD3\x99\x9D\xD6\x9A\x9D\xBE\x95\x9C\xD1\x98\x9D\xDB\x91\x9E\xDD\x90\x9D\x95\x90\x9C\xDE\x95\x9E\xCF\x95\x9D\xE3\x9A\x9E\xC9\x9C\x9E\xCB\x96\x9E\x1E\x5D\x0B\xCE\x91\x9C\xF4\x9A\x90\xBE\x03\x9F\xD3\x3F\x0B\x3A\x60\x0C\x3E\x31\x0C\x3E\x32\x0C\x3E\x33\x0C\x3E\x34\x0C\x3E\x35\x0C\x3E\x36\x0C\x3E\x37\x0C\x3E\x38\x0C\x3E\x39\x0C\x3E\x3A\x0C\xF8\x94\x9E\xCF\x6B\x0C\xAB\x7C\x0C\x11\xAE\x9E\xDF\x9C\x9D\xED\x90\x9E\xDA\x3D\x0C\x17\xAC\xA1\x1B\xAA\xA1\xEF\x99\x9E\x20\xA3\xA2\xF5\x92\xA1\xB9\x95\xA2\x19\xA2\x9E\x21\xAC\xA2\x26\x2E\x0C\x1F\xA2\xA2\x2B\xAE\x9B\xCF\x07\x4E\xD0\x00\x8F\xD1\x01\xA3\x2E\xA3\xA3\x2D\xAB\x9E\x2A\xA8\x9E\x27\xA8\xA1\x40\xA7\x9E\xC7\x92\xA4\x45\xAF\xA3\x47\xA2\xA3\x43\xA8\xA2\xF0\x96\xA4\x29\xAA\xA4\x49\xAB\xA3\x4B\xA2\x8F\xD2\x0A\xA3\x3E\xA0\xA5\x98\x93\x0D\x56\xA3\x1A\xD4\x0B\xA5\x26\xA4\xA4\x4F\xA2\xA5\x51\xA7\xA5\x62\xA1\xA6\x64\xA7\xA6\x3D\xA9\xA6\x5F", "\xAC\xA4\x24\xA8\xA5\x4D\xA8\xA4\x66\xAA\xA6\x3C\xAB\xA6\x4E\xAF\xA6\x6E\xAE\x81\xD5\x0E\xA5\x73\xAB\xA7\x53\xA6\x66\xD6\x0A\xA7\x7D\xA7\xA7\x41\xA0\xA7\x76\xA5\xA6\x85\xA8\xA6\x74\xA4\xA8\x6D\xA1\x18\xD7\x00\xA8\x63\xA2\xA7\x81\xA6\xA8\x8B\xA8\xA8\x7C\xAF\xA8\x89\xA2\xA8\x60\xA7\xA8\x90\xA6\xA9\x95\xA1\xA7\x97\xAE\x76\xD8\x0E\xA8\x9E\xAD\xA9\x9A\xAF\xA9\x94\xA1\xA9\xA7\xAC\xA9\xA8\xAB\xA9\xA3\xAB\xAA\xA6\xA1\x57\xD9\x02\xAA\xA5\xA4\xAA\x93\xAC\xAA\xB3\xAE\xAA\xB4\xA3\xA8\x98\xAC\xA6\xBA\xA2\xA9\xBD\xA9\xAA\xAD\xAA\xAA\xC2\xA1\xAC\xC4\xA7\xAB\xC3\xA6\xAC\xC5\xA0\x35\xDA\x02\xAB\xB5\xAF\xAA\xCE\xA9\xAB\x99\xAD\xAC\xD0\xAC\xAB\xD1\xAF\xAB\xB6\xA2\xAD\xB8\xA9\xAD\xC7\xA8\xAD\xDB\xA6\xAD\xCF\xAA\xAD\xCF\x2B\x0D\xCC\xAE\xAD\xD3\xA5\xA7\xDC\xA9\xAC\xE4\xA0\xAE\xC8\xAB\xAE\xE7\xAC\x53\xDC\x03\xAE\xD5\xA1\xAF\xD4\xA3\xAF\xE6\xA9\xAE\xDD\xA2\xAF\xF5\xA8\xAF\x8A\xA6\xAF\xE8\xAA\xAF\xBB\xA9\xAF\x91\x1D\x0D\xF0\xAA\x29\xDE\x0A\x63\xDF\x0E\x33\xE0\x0E\x33\xE1\x0E\x33\xE2\x0E\x33\xE3\x0E\x33\xE4\x0E\x33\xE5\x0E\x33\xE6\x0E", "\x33\xE7\x0E\x33\xE8\x0E\x33\xE9\x03\xB0\x00\xBB\x4E\xEA\x0B\x7A\xEB\x0C\xB1\xFB\xAE\xAF\xBE\xA4\xB2\xA4\x7C\x0E\x22\xBF\xAF\x23\xB4\xAF\x2B\xBD\xB1\x2D\xBF\xB2\x2A\xB1\xB3\x25\xBC\xB2\x32\xB0\xAC\xEC\xAC\xAF\x19\x2D\x0E\x3E\x3E\x0E\x29\xBE\xAB\xEF\x00\x8F\xF0\x07\x4E\xF1\x07\x4E\xF2\x0E\x33\xF3\x0D\xB3\x36\xB0\x47\xF4\x0E\x33\xF5\x0E\x33\xF6\x0E\x33\xF7\x0E\x33\xF8\x0E\x33\xF9\x07\x4E\xFA\x0E\x33\xFB\x0C\x88\x5E\x4E\x0F\xA7\x82\x10\x15\x00\x11\x42\x70\xB6\x5F\xBE\x1F\x10\x13\x00\x63\xBC\x25\x14\x14\x00\x67\xB3\x29\xE0\x25\x00\x6B\xB9\x2E\x14\x16\x00\x6F\xB4\x31\xE5\xA0\xB3\xBE\xA7\x00\x73\xB1\xB6\x0C\x19\x00\x79\xB5\xB7\x97\x2B\x00\x73\xB5\x32\xD3\x3C\x00\x81\xB4\x11\x0D\x05\xB8\x10\x1E\x00\x88\xBC\x10\x0F\x0B\xB8\x06\x10\x01\x8E\xB3\x10\x11\x01\xB9\x02\x12\x01\x94\xB8\xB3\xED\xA9\xB9\x00\x03\x01\x97\xB1\x77\x14\x0D\xB9\x34\xB3\xB3\x2E\xB5\xB3\xD7\xA8\xB9\xA6\xB6\xB2\xA5\xB8\xBA\xDF\xA3\x20\x15\x07\xB9\x16\x00\xBA\xA3\xBE\x76\x17\x00\xBB\x30\x58\x01\xB4\xB7\x18\x19\x07\xBB\x81\x1A\x01\xBA\xB9\xB4\xA7\xBA\x29", "\x1B\x07\xB9\x1C\x07\xB9\x1D\x07\xB9\x1E\x07\xB9\x1F\x07\xB9\x20\x0D\xBB\xA3\x11\x02\x97\xB2\x02\x73\xBD\x88\x79\x45\x02\x7D\xB0\x11\x27\x05\xBD\x0C\x19\x02\x97\xBA\x02\x97\xBB\x02\xCC\xB6\x22\x2C\x07\xB9\x2D\x0F\xBD\x7E\xB2\xBA\x85\x9E\x02\xD8\xB6\x10\x30\x09\xBE\x37\xB1\x2B\x32\x04\xBE\xE0\x23\x03\x97\xB4\x03\x97\xB5\x03\x97\xB6\x03\x97\xB7\x03\x97\xB8\x03\x97\xB9\x03\xF0\xB7\xAF\xA1\xBE\x9B\x3A\x0F\xBF\xC9\x6B\x03\x04\xCD\xBE\x01\xC9\xBA\x09\xCB\xBA\xFD\xAB\xC0\xE5\xBE\xBB\xAA\xBE\x45\x3C\x07\xC0\x9A\xB1\xC1\xEA\xA5\xC1\x0E\xC7\xC1\xBF\xB1\xBB\x10\xC9\xC1\x00\xCC\xC1\x0A\xC0\xC2\x0C\xC8\xC0\x22\xC9\x35\x3D\x04\xC1\x1B\xC6\xB7\x1D\xC5\xC2\x1A\xC6\xC1\x1F\xCA\xC2\x21\xC0\xC3\x23\xC8\xC1\x2C\xCF\xC2\xA4\xB3\xC3\x29\xC7\x18\x3E\x0C\xBE\x34\xC2\xC3\x0F\xC1\xC3\x37\xCF\xC3\x38\xCE\xC2\x0D\xC5\xC3\x45\xCE\xC3\x2D\xCE\xC1\x47\xC1\xC4\x49\xC6\xC4\x24\xC8\xC4\xDD\xA0\x04\x28\xC4\xC4\x4F\xCC\xC4\x36\xC6\xBE\x56\xCB\xC4\x58\xCB\xC5\x2B\xC0\xC5\x5A\xCD\xC5\xFB\x81\x04\x53\xCA\xC4\x55\xCC\xC5\x40\xC6\xC6\x43\xC4\xC6\x3D", "\xC9\xC5\x65\xC0\xC6\x68\xC2\xC4\x70\xC8\x1C\x42\x03\xC6\x4E\xCB\xC6\x6F\xCD\xC4\x5E\xCD\xC6\x67\xCE\xC6\x7C\xCB\xC7\x7E\xC9\xC6\x75\xC9\xC3\x77\xC7\xC5\x7D\xC0\xC8\x79\xCC\x6E\x43\x0C\xC3\x82\xC5\xC8\x71\xC4\xC8\x7F\xCD\xC8\x5F\xCF\xC8\x78\xCC\xC6\x76\xCC\xC8\x93\xC3\xC8\x91\xC6\xC8\x94\xCB\xC8\x92\xCE\xC8\x9A\xC8\xC9\x7A\xCF\xC9\x93\x15\x04\x97\xB6\x04\x74\xC7\xC8\x9C\xC2\xCA\x9D\xC9\xC9\x90\xC1\xCA\xAD\xCE\x81\x47\x07\xCA\x9B\xC4\xC5\x95\xCB\xCA\x19\x28\x04\xB2\xC0\xCA\xB5\xCA\xCA\xBC\xCF\xCA\xA9\xCE\xCB\xB4\xCD\x6E\x49\x09\xCB\x96\xCE\xC9\xB9\xAA\x04\xC4\xC1\x57\x4B\x09\xCC\xBD\xC7\xC9\xC5\xCC\xCA\xCE\xC6\xCB\xBB\xC0\xCC\x6A\xCF\xCB\xD1\xCD\xCC\x03\x2C\x04\xCC\xC0\x54\x4D\x08\xC2\x4E\x0B\xCD\x10\x1F\x04\x97\xB0\x05\x97\xB1\x05\x97\xB2\x05\x97\xB3\x05\x97\xB4\x05\x97\xB5\x05\x97\xB6\x05\x97\xB7\x05\x97\xB8\x05\x97\xB9\x05\xE0\xC6\xCC\x40\xAA\x05\xF7\xC1\x20\x5B\x0B\xCF\xAE\xC7\xCD\xD4\xC1\xC8\x29\x8E\xCF\xD3\xC0\xD0\x4E\x8D\x05\x04\xDF\x81\x5E\x09\xD0\x5F\x07\xB9\x60\x07\xB9\x61\x07\xB9\x62\x07\xB9\x63\x07", "\xB9\x64\x07\xB9\x65\x07\xB9\x66\x07\xB9\x67\x07\xB9\x68\x07\xB9\x69\x09\xD0\xC1\xCA\x90\x6A\x02\xD2\x91\x1B\x06\x26\xD2\xD0\xD5\xC3\xD2\x2B\xDC\x73\x6C\x09\xD2\x66\x6D\x06\x30\xD3\xCB\x2D\xDA\xD2\x36\xD8\xCA\x2C\xD7\xD3\x34\xDA\xD3\xBA\xC6\xCD\xF8\xCF\xD3\xD0\xC0\xD4\x19\x2E\x06\x33\xD1\x18\x6F\x05\xD4\xCF\xCF\xCF\x42\xD5\xD0\x4B\xDE\xD3\x41\xDF\xD4\x4A\xD0\xD5\x4C\xD2\xD5\x51\x30\x07\x48\xD1\x57\x71\x07\xD5\xD8\xC4\xD5\x39\xD8\xD3\x35\xDE\xD5\x3C\xD9\xD4\x53\xD1\xD5\x64\xD3\xD6\x1C\x62\x07\x5A\xD1\xD0\x60\xDB\xD6\x3B\xDC\xD6\x3D\xDD\xD5\x6D\xD1\xD7\x6F\xDF\xD5\x72\xD2\xD6\x4E\xD5\xD6\x77\xD6\xD6\xED\x63\x07\x69\xD6\xD0\x4D\xD0\xD7\x73\xD1\xD6\xD2\xC9\xD7\x84\xD0\xD8\x76\xD6\xD8\x83\xD8\xD8\x5B\xD8\xD7\x8A\xDA\xD6\x75\xD9\xD8\x74\xD1\x18\x74\x0D\xD7\x7F\xD1\xD9\x87\xD6\xD9\x90\xD2\xD8\x8B\xDA\xD7\x8D\xD4\x54\x75\x04\xD9\x5C\xD8\xD9\x9B\xD5\xD8\xA2\xDE\xD8\x81\xDE\xD6\x97\xDA\xD9\xA6\xD9\xDA\xA8\xD9\xD9\x30\x56\x07\xA0\xDE\x31\x77\x01\xDB\x9C\xD5\xDA\x7E\xD1\xDA\xAA\xD7\xDB\x8C\xD6\xDB\x95\xD9\xDB\xBD\xDD\xDA", "\xA3\xDD\xD9\xBF\xDF\xD8\xC1\xDC\xDB\xB8\xD0\xDC\xAB\xDE\xDA\xC4\xD2\x7A\x78\x04\xDB\x71\x49\x07\x28\xCA\x07\x09\xDB\x07\x97\xBC\x07\x97\xBD\x07\x97\xBE\x07\x97\xBF\x07\x97\xB0\x08\x97\xB1\x08\x97\xB2\x08\x97\xB3\x08\x97\xB4\x08\x97\xB5\x08\xCE\xD2\xDC\xC9\x66\x08\xCE\xD7\x08\xE9\xD6\xDC\xBB\xDE\xDB\xC7\xDD\x3C\x88\x0F\xDE\xF2\xD1\xDF\x30\x59\x08\xF6\xD6\x66\x8A\x09\xD0\x8B\x07\xB9\x8C\x07\xB9\x8D\x07\xB9\x8E\x07\xB9\x8F\x07\xB9\x90\x07\xB9\x91\x07\xB9\x92\x07\xB9\x93\x07\xB9\x94\x07\xB9\x95\x0B\xDF\xCB\xD1\x70\x96\x0E\xDC\x97\x04\xE1\xA7\xD5\xE1\xC3\xDB\xE1\xDE\x48\x09\x1A\xEC\xDA\x1C\xE3\xDF\xC9\x39\x09\x09\xDA\x09\x09\xDB\x09\x8A\xCA\xDE\xF8\xD7\x29\x9D\x0B\xE2\x1E\x5F\x09\x30\xE5\xAF\xA1\x0E\xDC\xA2\x01\xE2\x83\xD3\x0A\x97\xB4\x0A\x97\xB5\x0A\x97\xB6\x0A\x97\xB7\x0A\x8A\xC9\x0A\x97\xBA\x0A\x73\xB4\x00\x14\x1E\x0A\xD1\xBF\x21\xB1\x09\xD0\xB2\x08\xE3\x6D\x43\x0B\x50\xE9\xDC\xC5\xD7\xDF\x1C\x64\x0B\x09\xD5\x0B\x09\xD6\x0B\x33\xE8\xDC\xBA\xD0\x35\xB8\x0D\xE5\x4E\x5A\x0B\x62\xEE\xAB\xBC\x0E\xDC\xBD\x03\xE5\x1A", "\xCE\x0B\x97\xBF\x0B\x97\xB0\x0C\x97\xB1\x0C\x97\xB2\x0C\x8A\xC4\x0C\x97\xB5\x0C\x47\xE4\x11\xC9\x0B\xE4\xC8\x1C\x0C\x09\xDD\x0C\x6A\xE8\x45\xCE\x01\xE8\x24\xE2\xE2\x1E\xE4\x7A\xCF\x04\xE8\x2D\xE7\xE8\xCA\xDC\xE8\x55\xEE\xE5\x1D\xE6\xE8\x92\xEE\x2A\xD0\x0A\xE8\xB5\xD6\xE5\xA4\xD8\xE9\x2C\xE7\xE9\x90\xE5\xE8\x8D\xE3\xE9\x8F\xE3\xE2\x8B\xE0\xEA\x1F\x21\x0D\xCE\xD2\x0D\x96\xE9\xE9\x9D\xE3\xEA\x9F\xED\xEA\xA1\xEE\xE8\x54\xE1\xEB\x5F\xEA\xEA\xA2\xEC\x6E\xD3\x05\xE6\xA4\xE3\xEB\x9B\xE4\xEB\xB0\xE4\x54\xD5\x09\xEA\xBB\xE1\xEC\xF0\xDC\xE9\xB5\xEC\xEB\xB9\xE1\xE9\xAE\xE2\xEB\xC8\xEF\xEA\xC7\xEE\xE9\xCC\xE9\xEC\xBA\xE3\xEC\xC6\xE0\xED\xCB\xEA\xEC\xCE\xE6\xED\xAC\xE3\xDA\xD6\x00\xEC\xD2\xE2\xEC\xB0\x37\x0D\xDC\xE3\x18\xD8\x01\xEE\xAB\xE4\xEC\xBD\xE5\xED\xD1\xEA\xE9\xDD\xEB\xEE\xF5\xA9\x0D\xE4\xE5\xEC\xDE\xE5\xEE\xD3\xEF\xEC\xF4\xE8\xED\xE6\xED\xEC\xD9\xE6\xEF\xF3\xEA\xEF\xF1\xE0\xEF\xEC\xE2\xEF\xFD\xE7\xEE\xD7\xE9\xEE\x00\xF6\x3D\xDA\x0F\xEE\x02\xF9\xEF\x04\xFE\xEF\xEA\xED\xF0\x05\xFE\xF0\x0C\xFF\xF0\x12\xFD\x3C\xDB\x08", "\xF0\xF8\xE7\xEF\x71\x5C\x0D\x16\xF3\x1A\xDD\x0B\xF1\xF5\xEB\xF0\x09\xF8\xF1\x1F\xF8\xEE\x24\xF3\xF0\xED\x7E\x0D\x1E\xFC\xEF\xFF\xE1\xF1\x2C\xF1\xF2\xFB\xE0\xF2\x17\xFF\xF2\x25\xFA\xF0\x93\x9F\x0D\x29\xF0\xF3\xD4\xE6\xF2\x3A\xF4\xF3\x3B\xF2\xF2\x2A\xF0\xF1\x2E\xF1\xF0\x31\xFA\x90\xE0\x07\xF3\x0C\x11\x0E\x46\xFD\xF3\x32\xFA\xF4\x42\xF9\xF3\x3C\xFF\xF4\x3E\xF1\x70\xE2\x09\xF4\x50\xFB\xF4\x55\xFD\xF4\x23\xFC\xF4\x2B\xF1\xF4\x5B\xF3\xF4\x5D\xFE\xF4\x51\xF3\xF3\x61\xFA\xF5\x40\xFE\xF5\x65\xF0\xF6\x56\xFA\xD7\xE3\x04\xF5\x63\xF7\xF5\x5F\xF9\xF5\x6E\xF7\xF6\x70\xFD\xF6\x74\xF9\xF6\x76\xFA\x90\xE4\x0C\xF6\x77\xFF\xF6\x3F\xF3\xF1\x5C\xF2\xF7\x7D\xFD\xF2\x66\xFE\xF7\x83\xF2\xF8\x68\xF1\xCC\xE5\x0A\xF7\x58\xF1\xF8\x7F\xF4\xF8\x87\xFC\xF7\x38\xF6\x22\xE6\x0A\xF8\x90\xF2\xF6\x7B\xF0\xF8\x91\xFC\xF8\x85\xFD\xF8\x86\xF3\xF7\x97\xFE\xF8\x9E\xFB\xF8\x44\x57\x0E\x94\xF8\xF9\x96\xF2\xFA\xA7\xF5\xF9\x64\xF2\xEF\xE8\x05\xFA\xA0\xFA\xF9\x8F\xF6\xFA\xAB\xFD\xF9\xB0\xF1\xFA\xAA\xF1\xF7\xA8\xC9\x0E\xA9\xEA\x0E\xAE\xF4\xFB\x99\xFF\xFB", "\xA9\xF2\xFB\xB8\xFE\xFB\xC1\xFF\xFA\xC0\xF3\xFB\x9C\xFD\xD3\xEB\x0D\xFB\xC9\xFB\xF9\xCE\xF1\xFB\xC6\xF5\xFC\xC4\xF8\xFC\xCF\xF6\xFB\x83\x2C\x0E\xCC\xF5\xFD\xB5\xFB\xFD\xC7\xF3\xFC\xCD\xF0\xFD\xD3\xFE\xFD\xDA\xFD\xFD\x75\xFD\x0E\xD9\xF0\xFE\xDF\xF6\xFD\xD1\xF4\xFD\xE8\xF3\xFE\x0C\x1E\x0E\xE7\xFA\xFE\xE1\xF5\xF7\xA8\xFC\xFE\xF2\xF9\xFE\xDC\xF2\xFD\xF8\xF4\xFE\x9F\xF3\xFF\xFD\xF1\x18\xEF\x01\xFE\x79\x7E\xFB\x73\x00\xE2\x7D\xFB\x67\x80\x38\x60\x1E\x02\x80\xFE\x75\xFF\x06\x83\xFD\x6E\x7F\x04\x84\x01\xB7\x7C\xFA\x73\x01\x97\x2D\x3C\x0B\x80\x96\x7A\x1E\x18\x80\xF9\x33\x0F\x1B\x82\x03\x85\x80\x14\x82\xF8\x61\x81\xF5\x7F\x01\x92\x82\x08\x9F\x7F\x10\x85\x04\xBA\x7F\x14\x83\x02\xFE\x7D\x03\x8D\x81\x6E\x3C\x1E\x1E\x81\xBA\x75\x0F\x33\x83\x07\x56\x07\x36\x87\x05\xA8\x80\x04\x80\x02\xBB\x83\x03\x9C\x81\x26\x81\x7D\x37\x07\x1C\x85\x01\xBA\x82\x11\x85\x82\x48\x87\x04\x87\x82\x25\x89\x04\xA4\x80\x0C\x84\x3D\xF8\x04\x08\x8C\x83\x29\x8E\x04\xBE\x81\x0F\x8B\x82\x55\x80\x0B\xAE\x81\x26\x8B\x05\xD4\x81\x17\x99\x82\x5C\x83\xFF\x4F", "\x37\x7C\x07\xB9\x7A\x06\x14\x80\x83\x5E\x82\x0C\x91\x81\x15\x80\x04\xEC\x83\x0F\x8F\x83\x57\x81\x0C\xAC\x80\x2B\x81\x04\xDF\x82\x1D\x8A\x83\x2A\x83\x0D\xBA\x83\x3C\x8C\x07\x9A\x5F\x3E\x07\x83\x77\x83\x0E\x81\x66\x7E\x00\x08\xF8\x83\x13\x8D\x83\x7B\x87\x10\xB0\x82\x20\x5D\x0F\x05\x86\x20\x92\x83\xA6\x3E\x1F\x22\x68\x47\x88\x08\xFD\x80\x1D\x8E\x83\x71\x81\x0D\xA4\x3C\x00\x06\x01\x40\x09\x26\x88\x83\xA0\x87\x30\x01\x01\x4E\x84\xB6\x6E\x16\x00\x04\x85\x68\x5D\x0E\x86\x85\x4B\x89\x08\xAC\x86\x25\x9A\x82\x7D\x13\x00\x28\x84\xB6\x53\x99\x04\x03\x2C\x90\x5B\xAA\x87\x11\x9A\x85\x4A\x8A\x08\x9F\x85\x20\x9C\x85\xAE\x85\x17\xB9\x84\x60\x80\x0B\x93\x0D\x01\x17\x85\x74\x5B\x18\x8B\x84\x4C\x8A\x0C\xBE\x87\x2A\x85\x86\xC4\x80\x12\x8B\x87\x56\x80\x0D\xD3\x87\x2B\x92\x86\xCE\x82\x17\xA8\x64\x03\x08\x0C\x82\x5C\x36\x8D\x86\xE0\x80\x8B\x07\x01\x6E\x89\x0D\xD1\x87\x2E\x96\x86\xC2\x84\x19\xAA\x86\x83\x08\x00\x64\x85\x38\x94\x86\xDF\x83\x6F\x6E\x86\x77\x1A\x00\x48\x86\xDE\x50\x87\xE7\x85\x1C\xA8\x87\x60\x8C\x0F\xBB\x74\x03\x16\x87", "\xFA\x81\x20\xBC\x7E\x07\x03\x0F\xCF\x17\x03\x00\x88\xEF\x87\x1A\xB9\x87\x84\x89\x0E\xF8\x85\x15\x91\x00\x08\x8B\x1D\x8A\x89\x50\x81\x18\x13\x01\x41\x9E\x18\x14\x07\x22\x8D\x89\x89\x8F\x0B\xFB\x85\x35\x82\x88\x4D\x6D\x02\x1A\x88\xFA\x46\x01\x23\x8B\x47\x8C\x88\xFD\x81\x1E\x8E\x89\x8E\x80\x12\xAB\x8B\x33\x8A\x89\x1C\x8F\x25\x84\x33\x0B\x06\x12\xB0\x8B\x46\x97\x89\x29\x8B\x21\x92\x88\x9C\x87\x12\xBB\x89\x4E\x85\x4C\x18\x05\x26\xBA\x88\x97\x8A\x0D\xAC\x88\x4A\x9D\x89\x54\x69\x03\x02\x8A\x8A\x85\x14\xB2\x88\x53\x86\x87\x4F\x8E\x23\xB6\x89\x9F\x86\x14\xBE\x88\x52\x91\x89\xBE\x4A\x03\x0B\x8B\xAA\x84\x14\xD0\x88\x57\x98\x8A\x5E\x8E\xE5\x5B\x01\xAD\x8E\x14\xDF\x88\x1C\x3C\x00\x64\x8E\x77\x5D\x01\xB4\x8E\x2A\x1E\x03\x48\x9F\x00\x23\x88\x04\x23\x89\x10\x03\x12\xA2\x03\x48\x83\x01\x23\x8C\x04\x23\x89\x12\x03\x12\xA6\x03\x48\x87\x01\x23\x88\x05\x2C\x8A\xA9\x8E\x73\x29\x03\x60\x99\x1A\x2A\x07\x30\x87\x8B\xA9\x87\x15\x9A\x5F\x0A\x0A\x8C\xED\x3C\x05\x10\x8D\xAE\x84\x18\xD1\x89\x4B\x80\x8B\x95\x8E\x2C\x94\x8B\xB2\x8C\x19\xCD", "\x89\xCC\x6D\x01\x93\x88\x33\x97\x8C\x9E\x8C\x18\xA5\x8F\x50\x82\x8D\x8B\x8F\x34\x9A\x5C\x17\x01\x1A\xA4\x8E\x6A\x9B\x8C\x9E\x89\x2C\xB1\x8D\xCC\x8D\x19\xB2\x8E\x6D\x94\x8D\xB3\x8B\x34\xB0\x8D\xDB\x8A\x1B\xA9\x0F\x0B\x0D\x8D\xBB\x88\x37\xBC\x8D\xD4\x86\x19\xC4\x8E\x66\x8D\x8C\xC1\x8D\x37\xA6\x8D\xE2\x86\x15\xCB\x8F\x71\x8E\x8E\xB5\x8A\x38\x92\x8E\xE5\x8F\x1A\x9B\x28\x0C\x00\x8E\xC8\x89\x3B\x95\x67\x18\x08\x1D\x91\x0E\x0C\x1D\x8E\xD5\x88\x3A\xB9\x8C\xE3\x81\x1D\xD4\x8F\xEC\x33\x01\xE0\x8C\x39\x94\x8C\x5F\x64\x03\x69\x8F\x61\x15\x01\xEE\x8D\x3C\xA4\x8F\xF1\x8D\x1C\xE1\x8E\x7D\x85\x4C\x36\x01\x3E\xA4\x3D\x1B\x0A\x1F\xC3\x8D\x7D\x8A\x8F\xA8\x8F\x3F\x8F\x8F\xFB\x83\x20\x80\x92\x6B\x86\x90\xC9\x88\x22\x38\x01\xFE\x83\x1D\xF3\x8E\x7F\x8B\x8F\x0E\x95\x41\x82\x90\xF9\x83\x21\xF6\x69\x0E\x08\x86\x48\x71\x42\xA6\x8F\x02\x9C\x21\x94\x90\x84\x95\x90\x0F\x91\x40\x9F\x91\x11\x92\x22\xA5\x93\x81\x9D\x90\xF4\x8C\x44\xAC\x37\x1E\x0C\x20\x9B\x92\x87\x86\x91\x09\x90\x44\x92\x90\x15\x91\x23\xB4\x92\x76\x84\x90\x3D\x6E\x07\x2D\x90", "\x0D\x9C\x23\xB2\x92\x8B\x89\x91\x30\x97\x46\x88\x90\x21\x98\x22\xA1\x93\x89\x9E\x55\x3F\x03\x47\xBE\x91\x1E\x96\x23\xE2\x8E\x91\x95\x91\x41\x96\x49\x9B\x08\x20\x0A\x24\xCD\x90\x8E\x80\x92\x47\x90\x4B\xA6\x5D\x20\x05\x25\xD1\x93\x95\x8F\x92\x44\x97\x45\x99\x92\x30\x92\x25\xBF\x90\x99\x9F\x92\x6D\x22\x08\x1D\x93\x31\x93\x23\xDE\x93\x90\x85\x93\x4C\x96\x4D\x85\x93\x36\x9A\xD7\x43\x03\x9A\x90\x92\x6C\x96\x4C\xB4\x92\x3C\x9C\x27\xE1\x91\xA5\x04\x02\x77\x96\x4F\xA7\x93\x37\x98\x26\xFA\x92\xA1\x91\x93\x79\x90\x51\xBD\x92\x38\x9F\x6C\x45\x01\xA0\x8C\x94\x56\x94\x50\x92\x95\x39\x97\x28\xCB\x92\xA5\x91\x94\x94\x92\x51\x82\x94\xAE\x16\x04\x0F\x95\xA1\x9A\x94\x90\x90\x46\x87\x02\x4F\x93\x29\xE2\x93\xA2\x9F\x94\x97\x92\x4E\xA6\x95\x4D\x95\x29\x98\x97\xAA\x81\x95\xB7\x48\x09\x24\x95\x4C\x99\x2A\x89\x95\xAD\x87\x95\xA5\x92\x4B\xAC\x94\x50\x9B\x4E\x49\x03\xAC\x8F\x95\xA8\x96\x55\xBA\x94\x58\x98\x2B\xB4\x96\xB0\x83\x94\x9B\x62\x09\x3F\x95\x61\x91\x2C\xAA\x94\xB3\x99\x95\xC8\x90\x58\xA8\x65\x25\x0B\x2C\xD1\x97\xB3\x86\x96\xCE", "\x96\x5A\x9A\x97\x3D\x9B\x2B\xB7\x95\xB7\x87\x96\xDC\x94\x58\x9F\x96\x8F\x1C\x04\x40\x8D\x13\x03\x89\x4E\x05\x5A\xA1\x97\x66\x96\x2B\xE0\x95\xAB\x99\x96\xEB\x90\x5A\xB1\x96\x6C\x98\x13\xCF\x02\xBA\x8F\x97\xED\x90\x5E\xB8\x97\x62\x92\x2D\xF4\x94\xBF\x97\x96\xFD\x91\x60\x80\x99\x81\x9B\x2D\xFB\x97\xB8\x9C\x30\x50\x07\x5E\xBC\x95\x2A\x81\x05\x0A\x9A\xB7\x82\x97\x10\x9C\x5D\xBF\x97\x82\x9B\x30\xFE\x94\x72\x92\x02\x0E\x9E\x5D\x95\x98\x81\x94\x31\x8F\x9A\xC4\x87\x98\x13\x9B\x5E\x9C\x98\x91\x94\x30\xA4\x99\xC7\x9A\x98\x1E\x9E\x5B\x13\x03\x8C\x9A\x2F\x9B\x99\xC9\x86\x98\x11\x9A\x5E\xB0\x99\x8F\x92\xED\x54\x00\x70\x95\x02\x23\x8E\x0A\x2C\x99\x7C\x9C\x33\xA1\x9B\xCC\x92\x99\x2E\x9F\x64\xAD\x99\x94\x96\x31\xB1\x99\xD1\x94\x99\x48\x98\x68\x84\x9B\x91\x9F\x33\xC7\x98\x4C\x37\x02\x3B\x9E\x67\xBC\x7E\x2C\x01\x35\xCD\x31\x16\x17\x93\x5A\x03\x24\x9B\x03\x91\x8C\x05\x23\x89\x17\x03\x89\x5E\x03\x24\x9F\x03\x91\x80\x06\x23\x89\x18\x03\x89\x62\x03\x24\xA3\x03\x91\x84\x06\x55\x9A\xD1\x9D\x13\x65\x01\x6A\xA6\x02\xB7\x99\x34\xCE\x9A", "\xDD\x9D\x13\x67\x04\x6E\x8A\x9A\xCC\x48\x06\x7A\x9B\xD9\x29\x03\x18\x95\x69\x8C\x9B\xA0\x96\x32\x85\x9E\xE0\x8F\x99\xE0\x15\x0D\x23\x88\x37\x0E\x37\xAB\x87\x1B\x0D\x9C\x93\x08\x0E\x00\x8F\x38\x00\x1C\xF2\x00\xE4\x82\x9A\x50\x1B\x0E\x23\x88\x3A\x03\x12\xF5\x03\x48\x96\x03\x23\x8F\x0E\x23\x88\x3C\x00\x1C\xF9\x03\x48\x9A\x03\xC8\x82\x7A\x58\x23\x3E\x01\x11\x86\x0B\x1F\x0D\x9D\x03\x09\x10\x23\x88\x41\x03\x12\x83\x07\x9D\x84\x04\x23\x8D\x10\x17\x9C\xC3\x90\xA4\x06\x04\xEC\x82\x08\x88\x07\x77\xB6\x7A\x45\x01\x35\x8B\x07\x48\x8C\x04\x23\x8D\x11\x23\x88\x47\x03\x12\x8F\x07\x48\x90\x04\x23\x89\x12\x3B\x9D\xC3\x90\x0C\x92\x05\xE0\x84\x9C\xD4\x9C\x77\x8B\x9A\xC4\x9B\x3D\x98\x9C\x00\x16\x04\xD3\x98\x7B\xA2\x9F\xEE\x9A\x3D\xA8\x9A\xF9\x83\x9A\xE7\x9D\x67\xA0\x99\xE9\x17\x09\x61\x9C\xF9\x99\x9E\xF0\x9B\x7C\xA9\x9E\xA9\x9F\x3E\xF2\x9C\xFA\x97\x9F\xEA\x9F\x6D\x9C\x9F\xF9\x9B\x3E\x9A\x14\x26\x0E\x9F\xFC\x9A\x7F\x9E\x9F\xFE\x95\x37\x83\x9D\xFD\x87\xA0\x01\xA5\x80\xBB\x9E\xFC\x94\x3F\x89\xA3\xDE\x8C\xA0\x04\xA5\x0A\x99\x04\x00", "\xA0\x41\xD5\x66\x26\x14\xA0\x1C\x33\x13\x37\x92\x4E\x03\x12\x9D\x07\x48\x9E\x04\x23\x8F\x13\x23\x88\x50\x03\x12\xA1\x07\x48\x82\x05\x23\x8B\x14\x23\x88\x52\x03\x12\xA5\x07\x48\x86\x05\x18\xA5\x81\x99\x11\x53\x01\x35\xA8\x05\x0C\xB1\xA0\x77\x9B\x81\xA2\x11\x54\x07\x43\x82\xA0\x0E\x6A\x05\x3D\xA3\x9D\x2B\x05\x3B\x9C\x0A\x23\x89\x2B\x03\x89\xAE\x03\x24\xAF\x05\x91\x80\x0B\x23\x89\x2C\x03\x89\xB2\x03\x24\xB3\x05\x91\x84\x0B\x23\x89\x2D\x03\x89\xB6\x01\x88\x8F\xA0\x11\x17\x0B\x51\x98\x2E\x1A\xA2\x39\xA3\x80\xBE\xA0\x8A\x09\x0B\x60\xA1\xF2\x1A\x05\x66\xA2\x87\xB2\xA1\xFC\x9A\x40\xE2\xA1\x1B\xA5\x9F\x15\xA7\x8D\xB1\x9F\x01\x1B\x0B\x69\xA2\x1B\xBB\xA2\x6B\xA1\x8F\xB8\xA0\x03\xAE\x40\xFE\x94\x2F\x16\xA3\x70\xA4\x8D\xB8\xA3\x3D\xAA\x46\x84\xA7\x1D\xA1\xA3\x1B\x45\x17\x00\xA5\x39\xAD\x47\xFC\xA1\x1C\xA3\xA4\x63\xA6\x7E\x82\xA4\x44\xA4\x11\x3E\x07\x22\xB2\xA4\x7A\xA1\x92\x88\xA1\x47\xA4\x49\x98\xA6\x21\xA1\xA4\x97\x2F\x17\x02\x9F\x4F\xAD\x97\x41\x07\x28\xBE\x28\xC3\x07\x94\xB5\x57\x62\x01\x35\xC6\x07\x25\xB3\x4C\xC7\x03", "\x24\x88\x07\x91\x89\x0C\x23\x8A\x32\x03\x89\xCB\x02\x78\x8D\x07\x91\x8E\x0C\x57\x9C\x43\x12\x06\xA9\x9F\x43\x15\x07\x57\xA9\x6C\x56\x04\x31\xBC\xA4\x8E\xA3\x92\x89\xA7\x4C\xA2\x47\x9E\xA6\x26\xAD\xA4\xF2\x27\x1A\x07\xA6\x65\xA5\x48\xCF\xA4\x32\xB5\xA6\xCD\xA3\x93\x94\xA7\xBF\x48\x0D\x53\xA4\x33\xB0\xA4\xD9\xA0\x9A\x87\xA5\x65\xA4\x4A\xCE\xA4\x91\x39\x06\xDE\xA5\x9C\x9A\xA7\x6F\xAD\x49\xEB\xA6\x3A\xA2\xA7\xA0\xA3\x7A\x1A\x07\x74\xA6\x4D\xDB\xA5\x3C\xB5\xA7\xEC\xA4\x9C\xB8\xA7\x77\xA6\x45\x5B\x04\x3D\xA1\xA7\xD7\xA3\x9C\x98\xA6\x70\xA4\x50\xED\xA4\x3C\xA0\x2A\xDC\x07\x9F\x85\xA8\x7D\xA0\x50\xF6\xA4\x23\xA1\xA8\xF7\xA5\xA1\xB1\x23\x6E\x0A\x50\x86\xA8\x44\xAF\xA8\x0E\xAE\x9C\x8B\xA9\x81\xA6\x51\xF0\x22\x37\x15\xA8\x0C\xAB\xA3\x82\xA9\x91\xA1\x51\xA2\xA9\x49\xBD\xA8\x97\x2F\x1B\x20\xA8\x8E\xA1\x52\xA8\xA8\x3F\xB9\xA8\xEE\xA3\x9F\xB2\xA8\xD8\x10\x0E\x2B\xA8\x49\xB8\xA8\xF9\xA4\xA5\xBA\xA9\x9B\xAA\x51\xAE\xAA\xF5\x01\x07\x36\xAF\xA4\xAD\xA9\xA1\xAB\x53\xC2\xA9\x51\xB8\xA9\x2F\xA9\x6A\x22\x07\xA0\xA8\x54\xB3\xAA\x49", "\xAD\xAA\x12\xA9\xA9\x92\xAB\xA9\x83\x0E\x4C\xA9\x4F\xA4\xAA\x3C\xA9\xA6\x91\xAA\xA7\xAE\x53\xDB\xAA\x57\xAF\xAA\x79\x24\x1C\x37\x93\x72\x0A\x4A\xE0\xAB\x64\x47\x07\x65\xAE\xA9\x29\x07\xB4\xAE\xAB\x6B\x05\xD4\x8C\x07\x56\xAD\xFD\x2D\x07\x91\x8E\x0E\x23\x8B\x3B\x03\x89\xF0\x03\x24\xB1\x06\xE1\x93\x0F\x23\x88\x3D\x1E\xA5\x06\x08\x1F\x01\xA6\xE4\x0B\x0F\x71\xAA\x43\x3C\x07\x86\xAF\xA2\x97\xAB\xA3\xAB\x58\xD9\xAB\x41\xAD\xAC\x46\xAE\xB1\x8A\xAC\xAD\xA5\x18\x7D\x07\x9D\x9E\x07\x6C\xAC\xB1\x93\x4C\x00\x07\x01\x60\x58\x50\x22\x00\x9D\xAC\x21\x37\x87\x9B\x54\x00\x21\xAD\x2A\x98\x22\x05\x06\xB4\xB4\x84\x1A\x96\x00\x2A\xAC\x2E\x8C\x08\x07\x06\xB5\x89\x86\x86\x08\x00\x32\xAD\xC9\x09\x00\xB6\xAC\x22\x0A\x00\xD9\xA3\x5A\x82\x08\x03\x19\xAD\x10\x0D\x01\x32\xAD\x0C\x9C\x10\x11\x02\x6C\xAA\x9D\x01\x14\x02\x00\xAE\xCB\x75\x01\x4B\xAE\xD2\x76\x00\xCE\xAB\xB2\x8F\xAC\xCA\xAD\x55\xE6\xAB\x74\xB7\xAE\xD2\xAD\xEA\x57\x01\xE8\xA0\x53\xD8\xAD\x77\xB9\xAE\xDF\xA9\xBC\xB9\xA8\xB4\x78\x01\x5C\xAF\x78\xB1\xAC\xE8\xA8\xAA\x96\xAE\xF0\xA7", "\x5E\xEA\xAE\x66\x99\x00\xE6\xAB\xAA\x9F\xAB\xEA\xA4\x5F\xD8\xA9\x7A\xB0\xAC\xEE\xAE\x9B\x1A\x01\xF8\xAC\x55\xF6\xAD\x7E\xBA\xAC\xDE\xAD\xBD\xB8\xAF\x01\xBD\xD4\x1B\x00\x7F\xB3\xAF\xFE\xAC\xC0\x81\xB0\xF9\xAB\x5E\xE2\xAD\xDC\x3C\x00\x07\xB5\xC1\x82\xB0\xEA\xA9\x60\x94\xB0\x80\xAC\xAF\x0C\xB0\xA5\x9D\x01\x08\xBE\x54\x1E\x00\x87\xB5\xB0\x0B\xB5\xBF\x97\xB0\x07\xB2\x62\x92\xAE\x07\x5F\x00\x1F\xB6\x37\x60\x01\x14\xB1\x57\x21\x00\x8B\xB7\xAF\x16\xB6\xC4\x93\xB1\x10\xB8\x60\xA3\xB1\xBB\x22\x01\x2F\xB7\xBF\xB2\xB1\x0C\xB0\x62\x98\xB1\x89\xB0\xB1\x01\x13\x04\x39\xB0\x05\xBE\x63\xB5\xB3\x8E\xBF\xB1\x3A\xB0\xC8\x85\xB2\x09\xBC\x63\x93\x0C\x09\x03\xB2\x31\xB2\xC9\xA4\xB0\x23\xB2\x65\xB3\xB3\x92\xAE\x2A\x25\x00\xCA\xB4\xB1\x2A\x86\x02\x5A\xB3\x40\x07\x01\x5E\xB3\xCA\x8C\xB2\x24\xB4\x64\xE2\xB1\x7D\xB6\xB1\xB1\x10\x05\x21\xB2\x2B\xB6\x66\xBD\xB1\x9B\xA8\xB3\x64\xB1\xCA\xB9\x35\x14\x0B\x66\xCD\xB0\x30\x8A\x01\x6B\xB3\x05\x35\xB3\x38\xBB\x65\xE7\xB3\x91\xB4\xB2\x49\xB5\x2F\x6C\x01\x3D\xB0\x68\xE5\xB0\x9B\xA7\xB4\x76\xB5\xCA", "\x89\xB5\x40\xB6\x68\x8B\xB5\xA3\xBC\xB3\x57\xB6\xCD\x88\xB4\x5E\x5D\x02\x04\xB7\x98\xA5\xB4\x72\xB7\xD1\x98\xB5\x3E\xB2\x69\x8E\xB5\xB7\x4E\x01\x96\xB6\xCF\xA0\xA5\x17\x01\x6A\x81\x0C\x0C\x1C\xAD\x8C\xB5\xFD\x32\x00\x54\xB4\x54\x34\x00\xAB\xBD\x56\x36\x05\xD4\x95\x15\x1B\x02\x6B\xC0\x84\x0E\x06\xAF\x39\x06\xBC\xBA\x00\xF3\xAB\x03\x66\xAC\x0F\x0F\xB5\x06\x0E\x07\x26\xAF\x1F\x03\x5C\x94\x0B\x10\x07\xAE\x14\x0E\x08\x26\xAF\x23\x05\x6B\xB8\x60\x12\x0D\xB6\xB9\x51\x09\x10\xB6\x4D\xB8\x47\xCA\x03\xB4\xAC\x08\x4B\x00\xD8\x91\xB4\xDF\x4D\x04\x5A\xB4\x87\x2F\x02\xDE\xB6\x74\x51\x03\x6B\xB1\x20\x52\x00\xB9\xB5\x7A\x53\x06\xBC\x94\x02\xF3\xA5\x05\x66\xAE\x15\x06\xAF\x57\x01\xDC\x99\x02\xF3\xAA\x05\x45\xB4\x44\x1E\x02\xC8\xB0\x22\x21\x02\xF3\xA2\x06\x67\xB6\xE6\x43\x03\xFE\xB6\x74\x64\x03\x80\xBE\x69\xB4\x91\x19\x01\xB8\x66\x01\xDC\x85\xB9\x05\x48\x06\x0A\xBA\x47\x2A\x03\x0E\xBD\x5E\x6C\x02\x82\xB1\x19\x6D\x00\xC5\xB8\x74\x6E\x06\xBC\xAF\x02\xF3\xA0\x07\x66\xAD\x1C\x06\xAF\x72\x01\xDC\xB4\x02\xF3\xA5\x07\x76\xB4\x43\x19", "\x03\xF9\xB3\x40\x3C\x03\x8B\xBB\xAF\x7D\x00\xCB\xA2\xB5\x38\xAE\x0F\x2F\xB9\x4E\xB0\x69\xEF\xB3\x9F\xB7\xB4\x38\xB8\xE6\x94\xB6\x9D\xB9\x69\xBD\xB8\xA7\xB0\xB3\x44\x37\x0F\x26\xAE\x40\x03\x73\xC0\xB9\xCE\xB4\xB9\x9B\xB3\xDB\xB7\xB8\x9E\xBF\x73\xCB\xB8\xD2\xA7\xBA\x46\xBC\xE9\x8A\xBA\x45\xB5\x73\x87\xB5\x20\x05\xBA\x6B\x32\x10\x18\xBA\xAA\xB9\x74\xB6\xB8\xD7\xB0\xBA\x4E\xB9\xEA\x8F\xBA\xA9\xBE\x75\xA9\xB5\xD3\xBF\xBA\x64\xBB\xD2\xB2\x47\x41\x0B\x75\xC0\x28\x21\x0D\xBB\x3B\xBB\xEC\xB2\xBA\xB1\xB4\x77\xE1\xBA\xDD\xB5\xB2\x0E\x05\x14\x1E\xAD\x7B\xB7\x1A\x48\xAE\x65\x19\x08\xBD\xA8\x00\x03\x03\xD3\x01\x78\x83\xBE\x54\x05\xBC\x84\xBE\xD8\x89\xBC\x88\x06\x78\xF1\x08\xE2\xA7\xBC\x8A\xB8\xF2\x8C\xBD\xC5\xBC\x10\x0D\xBC\x58\x0F\xBC\x8E\xBC\x22\x31\x00\xCA\xB6\x10\x28\x00\xE7\xA3\x08\x3F\x07\xF3\x82\x09\x24\x04\x2A\x19\x09\x02\x14\x08\x8B\x05\xF4\x96\x09\xD3\xB0\x11\x2D\x07\x69\x05\x00\xA7\x09\x23\x30\xBC\xA9\x09\x11\x07\x01\xEC\xB6\x08\x81\xBF\x08\x27\x0C\x04\x07\x7B\x92\x08\xEB\xAC\x08\x89\x07\xF5\xBD\xBC\x87\x06\x7B", "\xB4\xBC\xEE\xB4\x08\x0B\x03\xF7\x83\xBE\x85\x0F\x7B\x86\x09\x06\x02\xBE\xC6\xBA\x22\x05\xBF\xB8\x00\x78\x94\x0A\x0F\x0A\xBE\xD1\xBE\x21\x0D\xBF\x81\x06\x07\x50\xBC\xF5\xB6\x08\xD3\xB8\x2C\x15\xBE\x88\x0B\x79\xD2\x08\xEF\xB9\xBE\xCC\xBC\x22\x22\x02\xEF\xB2\x7E\xE0\xBF\xF2\xA9\x08\x81\xBC\x09\x18\xBF\xEF\xBE\x7B\x94\x08\x24\x0C\xBF\x7F\xBE\xFD\xA8\xBE\xF8\xB4\x11\x1D\x03\xFC\xAD\xBF\xF5\xB8\x22\x3A\x01\xD3\x07\x5B\xA7\x0F\xF6\xA2\x08\x7F\x00\xFF\xA2\x0D\x8C\x05\x80\xD2\x0B\x01\xC0\x00\x09\xC2\x2A\x33\xBC\xFA\xB4\x7C\xEF\xBC\x42\x19\xBD\xFF\xB9\xFF\x81\xC0\xE0\xB4\x80\x94\x0B\x03\xC6\xBD\x14\x09\x02\xF1\x0B\x09\xC0\x80\x95\xC3\xFE\xB7\xC0\xC8\xB9\x03\xCB\xC1\xD5\xB4\x11\x4F\xBE\x54\x0D\xC0\x71\x0F\x01\xE2\xC0\xB0\x04\x82\x9A\xC2\x09\xD4\xC0\x0A\x09\xF0\x97\xBE\xF3\xB6\x81\xFF\x07\x03\xDD\xBE\x2F\xC6\x03\xC6\xC1\x10\xCA\x80\x94\x0D\xED\xBD\xC1\x81\xBD\xFC\xB1\x0B\xF3\xB8\x83\x89\x0B\x03\xCB\xBF\x41\xC0\x66\x03\xC2\x88\x03\x83\x96\x0D\x0D\xCB\xC1\xD2\xB8\x09\xD4\x08\xF9\xBC\x83\xA7\xC2\x0F\xD6\xBF\x1D\xC2\x0A\xCE", "\xC0\x22\xC2\x81\xBD\xC1\xF8\xB6\xC1\x39\xC5\xFF\xAA\xC0\x23\xCC\x82\x82\xC1\x18\xD4\xAD\x53\xC1\x12\x45\xC3\x8C\x0C\x80\x94\x08\x13\xC0\x0B\x32\xC3\x0E\xF4\xC3\x2C\xCE\x85\x98\xC1\x17\xCD\xC2\x08\x0F\x01\xC1\xBF\x28\xC0\x87\xE3\xC0\x15\xDA\xC3\x7B\xC2\x21\x27\xC2\x2C\xCE\x10\x01\xBD\xF2\xBF\xC3\x25\xC1\xFD\xAF\x21\x37\xCC\x0E\xF1\xC2\xEB\x88\xC4\x89\xC0\x21\x0B\xC4\x36\xC2\x11\x3A\xC3\x1A\xD9\xC4\x92\xC4\x21\x00\xC3\xB8\x05\x32\x77\xC2\x65\x19\xC3\x65\xC6\x0B\xDB\xC4\x50\xCC\x7F\xE4\xBF\x27\xCC\xC5\x5F\xC0\x22\x10\xC2\x52\xC6\x87\x96\xC7\x40\x15\xC2\xA2\x0F\x0A\xDC\xC5\x1B\xC1\x89\xAD\xC4\x43\x1C\xC2\x4B\xC5\x07\xCF\xC1\xFB\xB4\x88\x95\xC6\x21\xD2\xC3\xA9\xC0\x10\xFF\x07\x55\xC0\x8B\x81\xBE\xFF\xB0\xC4\x68\xC6\x09\xD4\x09\x01\xC2\x79\x8C\x0A\x17\x1D\xBB\x5A\xC3\xF2\x95\xC6\x83\x06\x79\x96\x0C\xE6\xB7\xBC\x91\xB9\xF3\x9A\xC6\x71\xC5\x79\xA2\xBE\xE0\xA6\xC7\xDD\xC2\x34\x1F\xC6\x6F\xC1\x8E\xE0\xC6\x2B\xDB\xC6\x03\x0E\xF3\xB0\xC6\x81\x01\x7A\xF3\xC4\x00\x04\xBD\x53\x10\x04\xD0\x09\xD4\xB6\x8F\xD7\xC6\x54\x1E\xBB", "\x8C\xC1\x0D\xE3\xC6\x77\xC5\x8E\xF6\xC5\x3A\xD4\x0C\xEB\xC2\x1D\xED\xC6\x76\xC3\x90\x8C\xC9\x41\xC4\xC7\xDC\xC0\x1D\xD2\xC8\x7B\xCA\x84\x84\xC9\xE7\xA6\xC7\xF5\xC0\x22\xC3\x08\x7C\xC0\x2A\x7A\xC4\x43\x1C\xC7\xB4\xC3\x23\x07\xC6\x83\x03\x06\x18\xC5\x26\xC5\x19\x8C\x0F\x01\xE5\xC9\x64\xCD\x8B\x9A\xC5\x36\xCC\x08\xBA\xB8\x1A\xC1\xC8\x69\xC0\x11\x03\xC5\x48\xC2\xC9\x78\xC4\x22\x2B\xC9\x11\xC6\x86\xAF\xCA\xCD\x0F\xC5\xAC\xC7\x01\xEE\xC1\x9B\xC8\x93\xA2\x0E\x4A\xC6\xC9\x89\xC4\x19\xEC\xC4\x4F\xC2\x93\xBB\xC5\x28\xC6\x08\xA3\xC0\x2C\x28\xC8\x5B\xC2\x10\x3B\xC8\x0D\xDD\xC9\x7D\xC2\xF3\x80\xCA\x50\xCF\x84\x94\xC5\x51\xDE\xC8\x24\xC8\x29\xFB\xC2\xA5\xC0\x8A\xF1\xBF\x56\xD9\xC4\xC3\xC6\x2B\xF8\xC8\xB0\xC3\x10\x56\xCA\x15\xD8\xCA\xCA\xC6\x19\xE7\xCB\x44\xCF\x80\xD4\xC4\x51\xC3\x08\x06\x04\x2A\xD0\xC0\xB1\xC4\x87\xA5\x19\x5E\xC3\xC9\xB7\xC4\x2F\xC7\xC3\xAC\xC0\x11\x31\xC9\x30\xDE\xC2\x82\xC2\x2D\xC0\x01\xBF\xC1\x83\xE4\xC0\x4F\xCA\xC5\x3E\xCB\x20\x0F\xC5\xC3\xCA\x8C\xC2\xCA\x62\xCC\xCC\x39\xCF\x10\xEC\xC9\x68\xCE\x92\x84", "\xCC\x43\x1B\xC1\x94\xCD\x25\xF1\xC4\x51\xC7\x99\xFA\xC8\x2E\xD4\x0C\xBA\xC0\x16\xCB\xC7\xC8\xC2\x10\x15\xCA\x65\x06\xC5\x33\xC9\x10\xEA\xBF\xD2\xC0\x98\x88\xC2\x60\xDA\xBF\x71\xCB\x0B\xF3\xCB\x3D\xC9\x96\xC5\xC4\x5E\xC6\xCD\xB7\xCC\x0F\xF9\xCC\x88\x0F\x8C\xA1\xCC\x67\xC3\xCD\x06\x0E\x2E\xD2\xCA\x8A\x09\x9A\xED\xC0\x32\xCF\xCC\xCA\xC5\x64\x0D\xCF\x0D\xC7\x89\x9B\xCD\x6C\xCB\xCD\x9E\xCE\x20\x06\xCC\xB0\x00\x9B\xCE\xC8\x4D\xDC\xC0\xBE\xCA\x20\x13\xCE\xED\xBE\x98\xD7\xC8\x64\xD9\xCE\x92\xCB\x37\xF4\xC2\xCB\xC1\x9E\x80\x03\x78\xCF\xCA\x81\xCE\x3A\xDE\xCF\xCE\xC3\x9C\x9F\xCE\x7A\xCC\xCB\x02\x09\x2A\xD6\x0C\xE9\xC0\x9C\xF2\xCE\x6A\xC4\xCB\x99\xC1\x09\xF7\xCE\xE7\xC6\x10\x33\xC7\x72\xD0\x08\xEF\xCF\x3B\xD5\xCE\xE8\xC2\x9A\x80\xD1\x22\xC6\xCB\x4D\xCA\x35\xFD\xCD\xBB\xC2\x9E\xFD\xCC\x83\xC7\xCE\x0E\xD3\x0F\xF2\xCB\x08\xD0\x8B\xF5\xCA\x39\xDE\xC7\x71\x08\x20\xF3\xCF\x7F\x09\x90\x88\xCB\x42\xCA\xC8\x0D\xC8\x45\xCF\xC8\x8B\xC3\x10\x07\xCB\xF8\xAB\xD1\x0E\xC9\x22\xC6\xC9\x89\xCA\x91\x82\x0A\x8B\xC7\xBE\xEF\xC5\x46\xC0\x00", "\x79\xCA\xA3\x99\xC8\x8B\xC3\xBD\xAA\xBC\x3A\xC3\x08\x90\xCF\xA3\x80\x00\x88\xC0\x0B\x22\xD2\x35\xE5\xD1\x17\xD2\xA3\xBA\xD3\x8D\xDD\xC4\x27\xD6\x44\xE9\xD0\x29\xD0\xA3\xAA\xD1\x93\xC5\xD2\x4F\xD5\x11\xD1\xD2\x26\xDD\xA2\xE6\xC6\x6B\xD6\xD2\xF1\xC0\x23\xE6\xC6\x8E\xCE\x26\x78\xCC\x00\x04\xD2\x31\xD3\x20\x07\xD2\xCB\x09\xA4\xCD\xC7\x96\xD8\xD1\x55\xD4\x4A\xD7\xD3\x34\xD6\xA3\xB4\xD0\x96\xD6\xD3\x74\xD7\x1C\xF3\xD1\x3D\xDA\xA3\xDF\xD2\x9C\xC1\xD3\xF6\xC6\x47\xF9\xD2\x32\xDE\x29\x66\xD0\x9A\xD9\xC5\x3D\xC1\x41\xE3\xCA\xD6\xC0\x00\x5B\xCF\x6B\xC2\xC6\x14\x0E\x26\xE6\xCE\x65\xC9\xA1\xF4\xC2\x23\xC3\xD0\x42\xD2\x20\x03\xCB\x49\xDD\xA0\x8C\xD4\x68\xDC\xCE\x90\xD0\x22\x3A\xCE\x44\xD7\x9E\xF5\xCE\x41\x1E\xD3\x19\x0D\x3B\xD2\xD1\xD9\xCE\x9F\xB0\xC5\xA5\xDC\xD2\x02\x08\x18\xE0\xD4\xC4\xC0\x86\xAD\xD4\x2B\xCF\xD5\x70\xD6\x20\x05\xCF\x59\xD5\x99\xD3\xC6\x62\xCD\xD3\x99\xD3\x2F\xF6\xD4\x50\xC5\x32\x40\xD4\x79\xDA\xCC\x17\xD7\x3A\xF8\xD4\x28\xD5\x98\x98\xD7\xB1\xC0\xCF\x14\xD0\x00\x06\xD6\xF8\xC6\x9B\xC3\xD5\x26\xCB\xD6\x5A", "\xD0\x22\x13\xCC\x5E\xD2\x9A\xEC\xCD\xB4\xD3\xD6\x0A\xD1\x3E\xC9\xD7\x11\xD8\xAD\x82\xCA\x7D\xDC\xD0\x41\xCC\x22\x23\xD4\xCA\x05\xAC\x96\xD0\xA7\xD8\xD0\x8C\xD0\x55\xD6\x08\x55\xDD\xA1\xAC\xD7\xB7\xCE\xD7\x6F\xCD\x54\xE2\xCC\x08\xD6\x9C\xD7\xCF\x84\xC7\xD0\x0C\x08\x5C\xF2\xCC\x64\xDF\xAE\xCA\xD4\xA3\xDB\xD5\x8F\xD4\x56\xEE\xC3\xF6\xC1\x78\xE6\xD3\x69\xD2\xBD\x3D\xC5\x64\x0D\xD8\x02\xD2\xAE\x85\xD8\xB9\xCC\xD4\x8E\xD2\x34\x34\xD7\x74\xD5\x93\x8A\xCF\xC4\xC1\xD6\x0F\xDE\x22\x0A\xD4\x3A\xC5\xAE\xBE\xC7\x4F\xC8\xD7\x5C\xCD\x05\xDE\xD8\x7C\xD4\xAA\x94\xD6\xA7\xCE\xD6\xD4\xD0\x00\x2B\xD7\x3A\xCB\x77\x8D\xCC\xC1\xD9\xD7\x2E\xD8\x3D\xED\xCC\x98\xD1\xAE\x82\x0A\x81\xDB\xCF\x14\x0F\x63\xCF\xD7\x05\xD6\xB1\xFF\xCC\xA3\xD2\xD5\x09\xDD\x57\xD0\x08\x62\xC1\xAD\xC2\xD9\xCC\xC1\xD9\x12\x0B\x64\xC3\xCC\x53\xD3\x10\x08\xDA\xC6\xC1\xD5\x0C\x0A\x39\xC0\xDA\x4F\x85\x9B\xC2\xD7\xB8\xCA\xCD\x25\x1E\x1B\xA0\xD9\xE0\xCC\x8B\xC7\xCE\x1F\xDD\xD7\x23\xD1\x31\xED\xCE\xB1\xD3\xB4\x95\xD8\xCE\xDD\xD4\x3A\xD8\x00\x1B\xD7\xA4\xDD\xAD\xAA\xDB", "\xDA\xCC\xD9\xA8\xC8\x2E\xFB\xD6\xEB\xBC\xB3\x83\xD8\x69\xD7\xDB\x5D\xD8\x6A\xCE\x08\xA9\xD8\x9B\xFB\xD9\x8E\xDC\xD6\xC7\xCD\x2B\xC0\xDC\x9B\xDF\x9C\xC5\xDA\xAB\xC7\xDA\x7D\xD8\x39\xC3\x08\xA6\xD0\xB0\xA7\xAD\x66\xCD\xDC\x6F\xD8\x5E\xF1\xDA\xAB\xD4\x19\x1B\xD9\xCA\xCB\xD8\x3A\xD3\x4D\xE2\x0C\x81\xD6\xA9\xEF\xD0\xB3\xD1\xD3\xB0\xD2\x4F\xCE\xD2\x3C\xD0\xA6\xF5\xD0\x9F\xD7\xD3\xAF\xD9\x4F\xD9\xD2\x73\xD7\xAA\xE6\xC4\x8F\xC5\xD2\x82\xD5\x75\xF7\xC7\x20\xDD\xB6\x82\x0B\xA1\xD9\xDB\x5E\xC4\x70\xC2\xCE\xC3\xD0\x93\x91\xDE\xDA\xDF\xDA\x8F\xD9\x6E\xF3\xDB\xAB\xDA\xB0\x8C\x0B\xA6\xD9\xDC\x06\xD9\x6E\xDF\xD4\xBA\xD9\xB8\xEA\xD4\xD9\xCA\xC4\xF1\xD6\x78\xF6\xD6\xC7\xD7\xAB\x90\xDC\xCA\xC8\xCB\xB5\xD0\x79\xDD\xDF\xCD\xDA\xBD\xA0\xDD\xE5\xC3\x08\x95\xD0\x15\xE2\xDE\x62\xD4\x11\x69\xDD\x79\xD0\xDE\x17\xD9\x6E\xD9\xD9\xCE\xD8\xB5\x86\x0A\xA4\xDB\xDA\xB0\xA8\x6F\xD0\xD8\x7D\xD6\xB6\xA9\xC3\xF7\xD4\xCB\x76\xD9\x5A\xEE\xDF\x9B\xDD\xB2\xF0\xD8\xD5\xC2\x08\xD3\xDC\x79\xCA\xDB\xBF\xD2\xC0\xFA\xDE\xC8\xDA\xDB\xFD\xDF\x70\xD4\xDE\x7F", "\xDB\xBD\xF8\xDE\x41\x03\xE0\x98\xDD\x80\xDA\xDD\x03\xE0\x00\x48\xDA\x02\xF5\xDB\x4B\xDA\x31\xD8\xE0\xA2\xD0\xBF\xC6\xD8\xF9\xDF\xDF\xBC\xCE\x57\xED\xCE\xE2\xA7\xB9\xA4\xE2\x06\xF7\xCE\x25\x1C\x85\xE7\xC5\xF7\xDF\xC2\xF1\xDC\x07\xF3\xDF\xA9\xD5\x7E\xC3\x09\xFB\xD2\x1A\x31\xE2\x03\xF1\xDA\x10\xE7\x3A\xD7\xD4\x14\xEB\x9E\x81\xE3\xF9\xC2\x08\x32\xE6\x28\xF4\xE0\xE0\xD9\xB3\x9C\xE1\x02\xF4\xDF\xCD\xD8\x2A\xCA\xCD\x24\xE4\x19\x6A\xDC\xF7\xC0\xC5\x25\xD8\x05\xD2\xE1\x0F\xE5\xBD\xB2\xC7\x14\xFF\xE1\x83\xD9\x88\xE3\xD0\x7E\xD8\xB8\x94\xE1\x08\xEB\xE1\x60\xE2\x21\x02\xDF\xB2\xD2\xC4\xEA\xC0\x11\xE6\xD3\x5A\xDD\x87\xC5\xCB\x16\xEE\xB6\xB5\xE0\xD8\xD3\xE3\x33\xE4\x80\xCC\xE2\x03\xE4\xBC\xDA\xCD\xF9\xD0\xD6\x47\xE2\x24\xCE\xD9\xEB\xD9\x10\x59\xE0\x89\xDE\xDF\x68\xDB\x55\xD3\xC5\xF6\xC9\x92\xCB\xE3\xFE\xCD\xE2\x7D\xE3\x20\x0F\xE3\x1C\xE1\xC5\xDC\xBE\x62\xCD\xE4\x7A\xE7\x91\xFC\xE3\x08\xEC\x10\x72\xD6\x44\x1E\xDC\xE0\xDE\x8B\xCC\xE5\x34\xE9\x10\x6B\xE0\xF6\xD1\xDB\x1E\xE0\x8A\xCB\xE0\x83\x04\xB9\x96\xE3\x57\xD4\xD8\xD5\xD3", "\x7D\xD7\xD7\x83\xDF\xC7\xC9\xCC\x21\xE8\x08\xA6\xE5\x90\xD8\xD9\x5A\xEB\xC3\xB7\xE4\x76\xDC\xE0\xCB\xDA\x95\xE0\xE0\xE7\xDE\xCB\x86\xE4\x53\xC9\xE4\xF5\xD2\x54\xC5\xE7\xEC\xDF\xC6\xB0\xE4\x00\x1F\xD9\x76\xE1\x79\xDC\xE1\x54\xE4\xC9\xAB\xE7\xE4\xCB\xE6\x27\xE0\x99\xDC\xD9\xAC\xDE\xCB\xB9\xE4\x7D\xD1\xE4\x02\x08\x87\xF3\xD6\x1D\xE2\x10\x3C\xE3\x1E\xFB\xE0\xE0\xE2\x6E\xFC\xE4\x4D\xD8\xCD\xCE\xE3\x3A\xF2\xD9\xED\xE1\x9D\xDE\xE4\x87\x00\xCA\x80\xE2\x28\xF2\xE5\x49\xCE\x7B\xDA\xE7\xCF\xDC\x10\x2D\xE5\x34\xE3\xDF\x1C\xE4\x73\xD5\xE7\x61\xE6\xCB\xF9\xC6\x33\xF8\x00\xDD\xE2\x8C\xCA\xD2\x8A\x02\xCE\x9F\xE4\x39\xE0\x00\xE6\xE2\x93\xE8\xE6\x4E\xE7\xB2\xFB\xE5\x28\xE4\xE6\xD6\xD1\x9F\xD2\xDF\x77\xE3\xB3\x8F\xE0\xFF\xCD\xE3\x5B\xE2\x98\xDD\xE2\x86\x00\xCD\xE7\xE5\xF4\xD3\xE6\xEF\xE6\x9F\xE6\xE8\x1B\xE9\xCE\x82\xEB\x38\xF5\xE4\x02\x09\x8E\xEB\xE8\xD5\xCE\xCD\xBF\xE5\x3A\xED\xE8\xF4\xE7\xA1\xD1\xE8\x8F\xE0\xC9\x94\xE9\x7A\xCD\xE6\xC1\xD7\x79\xFF\xE6\x2C\xEF\xB2\xC0\xE9\xEF\xD0\xE7\x19\xEB\x51\xF1\xDB\x79\xEA\x10\x75\xE5\x0A", "\xF7\xE7\x57\xE3\x96\xE8\xE5\x94\xE1\xCF\xBE\xEA\x40\x0E\xE9\x0E\xE8\xA6\xC0\x00\x99\xE9\xBA\xA2\xDC\x65\x04\xDD\xA9\xDB\x76\xE6\xD9\x2E\xD1\xBB\xBA\xDE\x58\xFA\xE2\xA8\xD9\x57\xE4\xEB\xD5\xD5\xD6\xFF\xD2\xEB\xCC\xEB\x7D\xD6\x76\xE2\xD2\x7B\xC4\xA8\xAD\x16\xA1\xCA\xCC\x6C\xD9\x66\xEE\xCB\xA1\xE7\x92\x94\x09\x5E\xFD\xD9\x00\x03\xAF\xF3\xE8\x69\xE7\xD3\xEF\xE7\x4E\xF2\x08\x61\xDA\x2F\xC2\xEC\x89\xE7\xD2\xE9\xE5\x30\xE3\xE8\x23\xEE\xF9\xB8\xEA\xC5\xE5\xD5\xA0\xEB\xB9\xD6\xE8\xF6\xE4\x81\xC1\xE5\xBF\xEE\xB7\xE1\xC9\x52\xE4\xD9\xCC\xE0\xB3\xCF\xEA\x92\xE3\xD9\xDD\xDB\x62\xFC\xE9\x9B\xE6\xB2\xC6\x08\x6A\xEF\xD2\xD6\xE6\x40\x0A\xE9\x34\xDD\x14\xB4\xE3\xAA\xC5\xD9\xE3\xE2\x1B\xE2\xED\x45\xE6\x7C\xE5\xE0\x58\xC5\xD3\xC6\xE4\x43\xE6\xEC\xB5\xEB\xA1\xDA\xD7\x77\xE2\xD4\x83\xEC\x40\xE9\xE7\x93\xE5\xB5\xC4\xE8\x4B\xEF\xD9\xD3\xDA\x3C\xEF\xE7\x25\xEC\xB1\xEC\xE8\xAB\xED\xC1\xD4\xE9\x73\xE5\xDC\xD4\xE8\xAB\xF9\xE8\xAD\xEC\xD5\xA8\xEF\x71\xDD\xED\xBB\xE6\xA8\xF1\xD9\xC3\xE1\xC6\x9F\xEA\x6D\xE3\xEE\xE2\xE8\xB0\xC5\xEE\xE9\xE6", "\xC2\xEE\xE5\x7A\xFD\xEC\xCC\xE8\x9F\xCA\xEA\x0E\xEC\xD4\x89\x0A\x53\xF9\xED\xA4\xEF\xBA\xC3\xDE\xEA\xEC\xDA\xD9\xEA\x6B\xE0\x00\xB0\xEE\xBB\xCD\xED\xEC\xEF\xCE\xDD\xEC\x10\xE1\xDE\x0A\xEE\x4D\xCD\xD7\xF7\xE2\xB9\xE5\xE5\x70\xEA\xF0\x0C\x0F\xB1\xCA\xEF\xC8\xE3\x10\x6B\xEE\x80\xF3\xEE\xAA\xEA\x92\xDC\xE9\x07\xFB\x94\xDA\xC8\x83\xEA\xDC\xF2\xE8\xB4\xD3\xEB\x0F\xF1\xBE\xD1\xEA\x46\xE1\xE8\x05\xF7\x43\xD8\xC7\xB8\xD7\xD6\x87\xE7\x94\xC1\xEB\xAC\xDE\xAD\xEA\xDC\xD8\xD0\xD7\xB4\xF2\x8D\xF2\xDD\x5E\xD2\xAE\xC1\xD5\x31\xDC\xBB\xB1\xDB\xEF\xC9\xDD\x11\x03\xC5\xCA\xC6\xB0\xE6\x11\x44\xF2\x44\x06\xF2\x0E\x08\xC9\xCA\x08\x25\xF9\x10\x4C\xF0\x42\x0E\xF2\xFF\x00\xCA\xD0\xF3\xC0\xB5\x06\x66\xC5\x90\xFF\xC7\x3D\xC2\xCA\xD9\xF3\x2D\xFE\x85\xDA\xF1\x97\xFC\xF2\x43\xF4\x51\xD5\xF2\x7B\xC7\xE5\xA1\xD0\x98\xE2\xCD\x5E\xF1\xCC\xDF\xF3\x35\xFA\xE6\xED\xF0\x9A\xE7\xF3\xD4\xED\x0B\x16\xF2\x21\xFF\xE6\xEC\xF1\x9D\xEE\xF3\xC7\xC9\xCD\xF7\xF3\x3D\xF9\xE7\xF0\xF1\x86\xE2\x08\x41\x03\xCE\xD8\xF2\x3B\xFD\xE7\x84\xF7\x75\xDA\xF3\x85\xF0\xCF", "\xC7\xF4\x3F\xF3\xA2\xD3\xF0\x45\x07\x09\x3A\xD5\xCC\xC8\xD2\x46\xFA\x9A\x88\xF7\xA2\xE6\xF4\x8D\xF4\xD2\xF0\xC4\x4B\xF9\xE9\x98\xF6\x70\xE5\xAE\x74\xF1\xD1\xFC\xF3\x4B\xFA\xE8\x9D\xF5\xA9\xF5\xF4\x9A\xF4\x15\xCE\xF4\x88\x03\xE6\x91\xF5\xA8\xE4\xF5\xA3\xF6\xD4\xF1\xF4\x54\xFE\xE9\x9B\xF5\xAA\xE0\xC5\x9C\xF7\xD3\xEA\x5E\x41\xF6\xE6\xB5\xF6\xAA\xF7\xF5\x99\xC1\xD7\xF6\xF4\x5F\xF8\xEB\xC0\xF5\x22\xCB\xF5\x0C\x0C\x0B\x3C\xF5\x49\xF4\xEC\xC1\xF6\xB1\xFB\xC3\xC2\xF7\xD7\xCD\xF7\x63\xFF\xEC\xF4\xC0\xB2\xFB\xF5\x64\xF7\xD5\xF2\xF4\x51\xFC\xED\xB0\xF5\xB7\xFB\xF6\xDE\xF1\xDC\xE0\xF7\x71\xFA\xEB\x83\x08\x0C\x0B\xF6\x6C\xD5\xDA\xD9\x09\x68\xF5\xEC\xD3\xF4\xB4\xEA\xF7\x45\xF0\xDE\xC7\xF2\x46\xDE\x02\x68\xF7\xE8\xD2\xF7\x49\xF0\xDF\xCB\xF2\x7D\xFD\xE4\xFC\xF7\x93\xFE\xF7\x51\xF4\x51\xC6\x02\x7B\xFF\xD5\x80\xF8\xBB\xEE\xF6\xEE\xF6\xDA\xC6\xF9\x85\xF9\xF0\xA9\xDF\x0C\x04\xF8\xEB\xF4\xE1\xE7\xF5\x61\xF3\xF1\xD2\xF5\xC5\xED\xF7\x17\xF8\xE1\xDC\xE1\x1D\x00\xF1\xF1\xF5\xC3\xFE\xF8\x19\xFC\xDA\xDF\xF9\x79\xF3\xF2\xF9\xF5\xC9\xFB", "\xF7\x71\xDD\x07\x1D\xF8\x92\xF1\xF2\xEF\xF7\xC9\xFD\xF7\x2F\xFF\xDF\xF1\xF9\x80\xF3\xF3\x81\xBF\x07\x0B\xF9\x26\xFD\xE5\xCA\xF9\x99\xF7\xF0\xA2\xFA\xCE\xF1\xF8\x35\xFC\x22\x21\x02\x9C\xF8\xF2\xBF\xF8\xC8\xF3\xF5\x14\xF8\xE9\xD6\xF8\xA5\xF8\xF1\xCC\xFA\xC6\xE9\xE7\x27\x06\x1C\xE6\x00\xA2\xF0\xF3\xC6\xF8\xCB\xEE\xFA\x3E\xF8\xEB\xEE\xF8\xAB\xF9\xF3\xDA\xFB\xCE\xFC\xE0\x51\xFE\x1E\xD3\xFB\x6C\xF3\xE8\xDC\xF9\xD1\xFE\xFA\x40\xFE\xEC\xD5\xFA\xB4\xF7\xF4\xDF\xF4\xAD\xFC\xE0\xA7\xEF\x74\xC6\x08\x49\xF9\xEE\xBC\xFA\xC4\xEC\xFB\x57\xFE\xED\xC9\xFA\xBD\xFB\xF4\xD4\xED\x74\xEA\xEB\x02\x0C\xEE\xF7\xF6\xBB\xF4\xF8\xEA\xFA\xCC\xE6\xFC\x34\xF8\xF1\xFD\xF8\x0D\xDC\x9C\xD4\xFB\xE1\xF8\xFB\x5D\xFC\xEF\xCD\xFA\xC9\xFF\xF4\x94\xFD\xD6\xF6\xFC\x5B\xF9\x9D\xCC\x0D\xC0\xB2\xF8\x85\xF9\xE1\xF0\xFC\x67\xF8\xF3\xDF\xFA\xD0\xFB\xF6\xA2\xFD\xDA\xE9\xE7\x16\xF2\xEE\xD2\x5C\x6D\xFF\xF6\xA4\xFF\xE3\xE6\xFD\x6D\xFA\xDC\xED\xFC\xD8\xF9\xF7\xB2\xFC\x84\xE6\x08\x61\xFA\x47\xE3\xFA\x57\xF5\xF6\xAE\xFD\xE2\xFE\xFD\x8B\xFB\xF4\xF4\xFD\xC8\xF6\xFB", "\xFD\xFB\x9F\xE0\x00\xB9\xFD\x48\xFB\xFD\x22\xDD\xF9\xA7\xFF\xF0\xE1\xFD\xC5\xFB\xF2\xD1\xFF\xCA\xF3\xFD\x97\xFD\xF5\xF9\xFC\xD4\xE9\xF9\xF9\xD3\xE5\xF9\xA7\xCD\xFD\xEC\xE4\xF7\x7B\xFF\xFA\xC2\xFE\xF1\xFE\xFC\xE4\xFF\xF7\xF3\xFD\xE6\xFA\xF5\xC2\x08\xED\xFA\xBB\xDC\xFE\xEE\xDE\xFE\xB5\xF8\xFC\xC6\xFE\xF9\xF2\xFD\xF4\xFC\xF5\xF6\xFF\xD6\xF8\xFF\xD8\xFF\xF4\xF9\xAD\x8C\x08\x0F\x0E\xFC\xBF\x7F\xF3\x75\xFA\x7C\x7F\xD0\x7E\xFE\x73\xFE\x46\x80\xE5\x7C\x02\x87\xFE\x61\x7F\xE7\x74\x43\x0D\x00\x00\x80\xC1\x7D\x02\x88\xFE\x4A\x80\xF1\x7F\x04\x86\x01\x8C\x80\x17\x83\xFC\x75\xEE\x42\x04\x48\x01\x8F\x70\xD8\x4A\x02\x10\x83\xDD\x72\x00\xAF\x7E\x04\x83\x00\x84\x01\x84\x7F\x27\x81\x01\x8B\x01\x80\x00\x42\x02\x07\x80\xDF\x42\x04\x7E\x01\x08\x8F\xF9\x63\x80\x01\x81\x09\x84\x02\xA9\x80\x26\x81\x06\x85\xFF\x6B\x80\x22\x02\x0B\x8D\xE0\x40\x00\xB9\x6E\x8C\x70\xFF\x68\x80\x3A\x83\xFD\x75\x04\xB9\x7F\x47\x83\xFE\x78\x03\xB7\x80\x49\x83\x01\x8B\x02\xAD\x00\x3E\x83\x03\x6B\x05\x32\x80\x8A\x7E\x08\x86\x03\xB5\x80\x4B\x80\x16\x8D\x04\x92", "\x80\xB7\x7F\x40\x07\x05\x11\x81\x14\x06\x28\x04\x05\x80\x7F\x56\x81\x16\x81\x01\x8B\x80\x1A\x80\x06\x8A\x06\x9D\x78\x10\x04\x09\x00\x06\x90\x04\x44\x02\x2F\x77\x06\x95\x80\x6B\x83\x0E\x85\x07\x86\x81\x77\x80\x12\x89\x07\x8C\x7E\xAC\x78\xEB\x7B\x07\x8E\x81\x7F\x80\x17\x89\x06\x83\x82\x76\x80\x21\x88\x07\xAC\x81\x0C\x05\xAB\x7C\xEC\x55\x81\x33\x83\x15\x83\x07\x84\x81\x81\x80\x1A\x85\x96\x54\x04\x72\x79\xEF\x74\x03\x8F\x82\x2A\x81\x24\x84\x07\x86\x82\x7A\x80\x27\x8A\x04\xAB\x80\x81\x7A\x25\x8E\x08\xA5\x81\x5B\x82\x24\x87\x08\x85\x82\xA8\x83\x29\x81\xA0\x4F\x7A\x7E\x82\x27\x80\x08\xAE\x82\x82\x81\x2A\x8D\x09\xB2\x82\x9F\x82\x26\x80\x09\xB0\x82\xA6\x83\x2C\x8A\x0A\xBA\x82\xBC\x81\x2D\x88\x0B\x9B\x82\xB4\x83\x2B\x83\x09\xBD\x81\xA2\x82\x19\x84\x0A\xB6\x82\x99\x83\x2F\x87\x0B\x81\x83\xB1\x83\x2A\x80\x11\x27\x7B\xC5\x81\x29\x80\x0C\xBB\x82\xBE\x80\x33\x89\x0B\x95\x83\xD4\x82\x30\x89\x0D\xA9\x6E\xCA\x79\x34\x88\x0C\xB9\x80\xDF\x80\x13\x81\x0E\x9A\x81\xE3\x80\x26\x80\x0E\x88\x82\xD8\x79\xAF\x7C\x08\xAB\x83\x64\x81\x23", "\x86\x0C\xB1\x6D\xD0\x82\x3A\x8D\x0E\xAC\x83\x97\x83\x31\x8A\x0C\x89\x83\xC3\x80\x43\x05\xEF\x5E\x83\xF7\x83\x39\x86\x0D\x93\x83\xBD\x82\x36\x81\x10\x8D\x83\x03\x87\x35\x85\xBA\x50\x04\x03\x7C\x3F\x8F\x0F\x8B\x83\xDB\x82\x41\x84\x10\x98\x83\x05\x84\x40\x80\x11\x93\x84\x02\x84\x1F\x8C\x10\x0F\x7C\x0A\x85\x43\x82\x11\x95\x84\x1C\x87\x43\x8D\x11\x8E\x84\x20\x87\x46\x8E\x11\xA9\x6E\x1C\x7D\x46\x81\x11\x8C\x84\x27\x84\x3E\x8A\x11\xA8\x84\x14\x87\x48\x81\x12\xAC\x84\x07\x84\x43\x0A\xF2\x66\x84\x2D\x87\x4B\x8A\x12\xA9\x84\xFE\x83\x4A\x87\x13\xB5\x84\x22\x84\xE0\x70\x00\x37\x7C\x34\x87\x47\x8D\x13\x83\x85\x30\x86\x4B\x84\x14\xBB\x84\x42\x85\x51\x8E\x13\x83\x7D\x41\x86\x51\x8A\x14\x87\x85\x39\x84\x4E\x82\x0E\xBD\x83\x53\x87\x42\x88\x14\xA9\x6E\xEC\x7E\x8C\x7E\xFE\x5E\x7E\xF4\x83\x28\x8E\x0E\x92\x83\x4F\x85\x58\x87\x15\xBE\x84\x59\x85\xEA\x6B\x15\x8E\x85\x63\x84\x54\x85\x15\xBA\x84\x51\x84\x4F\x82\x16\xAD\x85\x49\x85\x5A\x8D\xFF\x5E\x76\xF2\x81\x3D\x8F\x15\xA5\x83\xF6\x82\x55\x80\x17\xA9\x6E\x7F\x7E\x5A\x84\x0E\x94\x85", "\x7F\x86\x5E\x8B\x16\x92\x85\x81\x84\x5B\x83\x18\xAE\x85\x72\x84\xED\x63\x10\x23\x6C\xE6\x83\x61\x81\x17\xBB\x85\x36\x84\x64\x8E\x17\x8D\x86\x85\x87\x83\x68\xC7\x43\x7E\x5D\x87\x3B\x89\x19\xA0\x85\x89\x86\x64\x8F\x16\xA8\x75\x92\x75\x53\x81\x19\x8E\x86\x68\x86\x67\x8D\x19\xA4\x86\xA3\x85\x65\x88\x18\xA6\x86\x63\x77\xFA\x72\xF5\x6D\x82\x82\x86\x6A\x8F\x18\xA8\x86\x93\x85\x5E\x86\x18\xB2\x86\x58\x87\x6B\x82\x1A\xB5\x86\x77\x84\x60\x84\x19\xBF\x86\x8C\x69\x59\x8E\x13\xA7\x85\xA9\x84\x70\x8D\x1B\xB1\x86\xC6\x84\xE2\x71\x78\x42\x87\xEA\x7C\x00\x04\x1C\xBC\x86\x9B\x84\x5E\x87\x1C\xB7\x86\xC9\x85\x3A\x7F\xFF\x7B\x86\x9F\x84\x6E\x85\x1C\xB6\x86\x84\x85\x75\x84\x03\x81\x5E\x0F\x80\x76\x87\x1A\x9A\x87\xD0\x87\x3C\x86\x1E\xB6\x85\x1C\x71\x07\x86\xD0\x41\x6B\x20\x82\x78\x8C\x1A\xB4\x86\xD9\x86\x77\x8E\x15\x91\x87\xE8\x83\x40\x0D\x02\xAB\x87\x47\x75\x0C\x8E\x1E\xB0\x87\xE3\x86\x7C\x8A\x19\xA7\x87\x57\x81\xE0\x5D\x03\xB8\x87\x31\x6D\x10\x85\x1A\xBC\x87\xEF\x84\x79\x81\x1F\x9C\x87\xAB\x84\x82\x8E\x20\xAE\x78\x0C\x04\x14\x84", "\x20\x80\x76\x53\x83\x7E\x8A\x20\xBD\x87\x0C\x8B\x6C\x87\x21\x89\x88\x94\x85\xE0\x5F\x05\x93\x88\x2F\x80\x00\x02\x06\x96\x88\xFE\x84\x67\x8C\x21\x99\x88\x07\x8B\x86\x8F\x20\x81\x5E\x6E\x80\x88\x8F\x03\xB1\x81\xFA\x77\x5C\x83\x10\x2F\x00\x6F\x82\x35\x60\x1B\x94\x87\x28\x8B\x76\x83\x1D\x84\x86\x54\x7B\x8D\x8D\x1D\xB9\x88\xE5\x84\x7A\x8E\xFB\x7D\x88\x24\x88\x90\x8B\x20\xBB\x88\x0D\x8A\x8A\x8A\x24\x81\x5E\x95\x81\x5D\x83\x1F\x80\x88\xFF\x86\x90\x82\x25\x87\x7F\xA1\x82\x93\x81\x25\x8F\x89\x53\x8B\x95\x8A\x25\xAB\x80\x90\x7B\x22\x80\x25\xA6\x88\x0F\x89\x89\x82\x1D\xB4\x87\xC8\x86\x91\x88\x21\x88\x89\x1A\x8B\xB5\x73\x10\x0A\x82\x75\x7C\x99\x88\x23\xA8\x89\x29\x8A\x98\x85\x1F\x82\x04\xF1\x82\x97\x89\x25\xA0\x89\x4A\x8A\x9C\x85\x26\x81\x7D\x10\x05\x37\x86\x25\xB8\x89\x7A\x8B\x9B\x8E\x26\xBF\x88\xF0\x82\x8F\x89\x24\x81\x8A\x84\x8B\xA0\x87\x28\x8C\x6A\x75\x89\x9B\x8F\x25\xA3\x89\x8F\x8A\x6F\x86\x26\xAD\x86\x00\x03\x3E\x8F\x27\x90\x8A\x77\x88\xA6\x88\x25\x9B\x8A\x0D\x82\x41\x09\x10\x97\x8A\x92\x88\x9C\x8A\x23\x8A\x8A\x69", "\x88\xC0\x71\x78\x58\x84\xA0\x8B\x9E\x84\x2A\xB1\x89\x93\x89\x98\x8C\xA8\x65\x84\xA9\x8A\xA0\x81\x29\xAA\x8A\xB3\x8A\xAC\x84\xDD\x73\x84\xB1\x89\xA2\x85\x2B\xBA\x8A\x99\x88\x60\x86\xF3\x46\x8A\xA5\x8A\xA8\x81\x24\x9C\x8A\x78\x89\xE0\x5C\x14\xB9\x8A\x8B\x8A\xB0\x87\x24\xAB\x8A\xA3\x88\xD4\x7A\x1B\x88\x8B\xC1\x88\xB3\x83\x2C\x9B\x89\x9A\x89\xA7\x8F\x65\x4F\x8B\x76\x88\xB1\x85\x2D\x80\x8A\xAD\x89\x9E\x8C\xA8\x71\x7D\xCB\x8B\xAE\x89\x2C\x92\x8B\xE1\x8B\x77\x85\xC1\x58\x86\xE2\x89\xB4\x89\x2E\xAC\x8A\xCA\x8B\x78\x81\x78\x4C\x86\xDD\x88\xA2\x83\x2E\xAB\x8B\xA9\x85\xE0\x5C\x18\x32\x8B\xEA\x89\xAF\x84\x2B\xBA\x8B\xCE\x80\x46\x70\x2D\xAC\x8B\xE4\x8B\x99\x81\x30\xA7\x88\x71\x6C\x73\x82\x23\x82\x04\xCF\x85\xB9\x8A\x2D\xA1\x8A\x03\x8E\xAB\x8C\x27\x8C\x04\x06\x8E\x62\x88\x30\x80\x8B\x00\x8C\xBD\x83\x2D\x9C\x8B\xED\x88\xA5\x81\x31\x94\x8A\x09\x8E\xC0\x86\x31\x8A\x8C\xD4\x88\xC3\x83\x24\x94\x04\x1B\x8C\x68\x80\x55\x14\x8C\xCD\x88\xBF\x8C\x2B\x8B\x8C\xFB\x89\x80\x84\x11\x17\x87\xFF\x89\xCA\x8C\x32\xB6\x8A\x33\x8F\xCA\x89\x05", "\xA0\x87\x28\x8F\xC5\x8B\x2D\xBB\x8C\x22\x8E\xCA\x86\x11\x86\x04\xEA\x85\x47\x6E\xCC\x6D\x87\x31\x8E\xCE\x8D\x33\xB5\x8C\xF3\x8A\xCF\x81\x13\x86\x04\xF7\x86\xD0\x81\xAC\x7A\x87\x45\x8C\xC8\x88\x31\x8D\x8C\xDE\x89\xC6\x86\x32\x82\x04\x03\x8A\xD3\x87\xD4\x46\x88\x32\x8D\xC8\x8D\x32\x9E\x8D\x34\x8F\xCD\x84\x11\x12\x88\x5A\x8D\xCC\x65\x21\x91\x8D\x1E\x8E\xD2\x85\x31\xAA\x8D\x5D\x8F\x0A\x8F\x21\xA5\x8D\x80\x77\x88\x88\x36\x84\x8C\x54\x8C\xBE\x8B\x36\x88\x8D\x4B\x8F\x40\x0D\x22\xB0\x8D\x21\x88\x8C\x81\xE2\x4E\x7C\xE6\x63\xC8\x61\x78\x70\x8C\x45\x69\x78\x8A\xA3\x7B\x8D\x65\x6A\x33\x7E\x37\x89\x8E\xC1\x6A\x07\x0E\xCB\x41\x5E\x98\x65\xA1\x6E\xCC\x72\x01\xE6\x61\xE4\x8C\xD7\x76\x8C\x53\x8F\xC7\x89\x36\xB8\x8D\xA9\x6C\x9B\x88\x2E\xAC\x8D\x46\x8F\xD7\x89\x39\xA6\x8B\xC4\x83\xDC\x8E\x30\xB5\x8D\xF1\x89\xB7\x8C\x24\xB9\x8C\x52\x8C\xCF\x82\x3A\xAE\x8E\x61\x8C\x28\x8C\x3A\x9B\x8E\x60\x8C\xE6\x80\x3B\xB6\x8E\x73\x8B\xE6\x23\x3B\xB4\x8D\x9A\x8C\xEF\x80\x3A\xAD\x8E\x47\x8D\xED\x89\x34\x9C\x8E\x6D\x8F\x38\x84\x24\xA6\x8E\x55\x8C", "\xEA\x86\x35\x89\x8F\x23\x8F\x33\x8B\x3B\xA7\x8E\xBD\x8C\xF4\x8F\x3B\xB4\x8E\x2B\x82\x9F\x89\x2D\x82\x8F\xF9\x88\xF1\x81\x3A\xB1\x8E\x5D\x80\x9D\x8F\x3C\x8C\x8F\xD3\x8E\xEF\x8A\x3D\x80\x8F\xF9\x81\x3A\x87\x3D\xA3\x8E\xE3\x8C\xF5\x87\x3B\x83\x8F\xD6\x8A\x40\x06\x29\xA7\x8F\xEB\x8D\xF6\x88\x3D\xB7\x8D\xF3\x8E\x4F\x8F\x29\xB0\x8F\xC1\x8C\xFA\x85\x3F\x9B\x8F\xB8\x8D\x6C\x87\x2A\x9F\x8F\x76\x8D\xF1\x89\x3F\xB1\x8F\x29\x89\xE0\x50\x2B\xB8\x8F\xAF\x8F\x00\x9A\x40\x89\x90\x0C\x91\xBF\x86\x10\x38\x8A\x08\x90\xF7\x8B\x40\x92\x90\x0D\x90\x8F\x84\x11\x00\x85\xC8\x8D\x00\x9C\x3F\xAC\x8F\xFA\x8F\x0A\x87\x2C\x91\x90\xFD\x8C\x05\x92\x42\xA1\x90\x24\x93\xCF\x87\x2D\xA2\x7D\x00\x91\xEA\x8B\x3C\x9A\x90\xD9\x87\x72\x88\x2D\x8E\x8A\xE1\x8E\xF4\x89\x3E\xA2\x8F\xFB\x8F\xC1\x81\xD8\x69\x90\x2B\x92\x0A\x9A\x3C\x9C\x70\x7D\x84\xF9\x83\x42\x9C\x90\x04\x92\x00\x95\x41\xA6\x90\x15\x69\x91\x89\x43\x87\x91\x3B\x92\xE6\x78\x43\x89\x91\x31\x90\xF8\x83\x43\x97\x8D\x00\x01\xEA\x7E\x43\xA5\x90\xF2\x8D\x07\x91\x44\xBE\x85\x2E\x90\x0A\x96\x44\x8C", "\x91\x4F\x92\x13\x95\x43\x92\x8C\xC8\x7F\x0B\x9F\x39\x9D\x91\x2C\x92\xFA\x83\x41\x96\x90\xD6\x2E\x18\x9C\x15\x91\x8F\x5E\x92\x15\x97\x46\x80\x91\xB9\x8D\xC9\x80\x21\x86\x04\x1D\x8C\x0D\x9E\x46\x83\x91\x55\x93\x15\x93\x45\x84\x91\x00\x00\xE1\x80\x43\xA4\x91\x3A\x90\x1B\x95\x46\x94\x8A\x86\x8C\x08\x90\x47\xB8\x91\xF4\x8F\x1D\x9F\x43\xB9\x8D\x1C\x81\x8D\x86\x10\x04\x8D\x86\x91\x1E\x9F\x46\x92\x92\x88\x92\x10\x9E\x40\xB6\x87\x8E\x93\x40\x00\x35\x91\x92\x89\x92\x1E\x96\x46\x95\x92\x1B\x90\x23\x90\x00\x19\x8D\x8C\x8F\xD6\x8B\x44\x82\x92\x81\x91\x13\x9A\x26\x82\x04\x64\x8D\x29\x96\x36\xA7\x92\xAA\x91\x2A\x90\x48\xB1\x6D\x6F\x8E\x2B\x91\x37\xB0\x92\xB3\x90\x17\x9F\x45\xB6\x91\xDD\x8C\x00\x08\x38\x92\x8E\xC1\x6B\xE2\x8B\xDB\x79\x8E\x5E\x75\x01\x96\xBA\x76\x90\x2D\x7B\x92\x6E\x13\x89\x93\xC7\x90\x18\x9C\x4C\xAF\x78\xCB\x91\x8C\x70\xE3\x54\x64\x3A\x79\x8F\x6C\xE3\x6E\x88\x0F\x63\x8F\x76\x49\x94\x91\x9D\x93\x24\x9D\x4D\xA5\x8F\x6B\x88\x2E\x9B\x4B\xB2\x90\xE3\x91\x1B\x9D\x4B\x9E\x8E\x6B\x91\x2C\x98\x44\xA8\x92\x0F\x8E\x41", "\x0D\x24\x9C\x92\xDB\x93\x21\x9B\x48\x9F\x93\xF3\x92\x4F\x85\x25\xB0\x93\xA1\x90\x3D\x9C\x4D\xB1\x93\x94\x93\x25\x92\x10\x1D\x89\x7F\x91\x39\x93\x48\xA4\x93\x8A\x93\x3E\x99\x4F\xBC\x93\xFA\x92\x3C\x96\x50\xB6\x90\xE8\x91\x42\x9D\x4F\x8B\x94\x9F\x91\x3D\x98\x45\x94\x04\x8D\x8B\x18\x92\x50\xB2\x92\x17\x95\x3B\x93\x10\x16\x8F\x01\x95\x41\x9A\x50\x9F\x94\x0F\x94\x48\x99\xBA\x55\x94\xE9\x91\x2E\x9C\x4E\xBA\x92\xC5\x88\x45\x92\x4E\x9E\x94\x21\x95\x4B\x9E\x50\x86\x93\x10\x07\xFB\x8D\x51\x9E\x92\xBC\x92\x37\x98\x50\xB7\x94\xCD\x87\xFD\x83\x53\xB6\x94\x07\x95\x4F\x9B\x47\xAE\x94\xF5\x88\x45\x08\x2A\xB8\x93\x3F\x97\x4B\x98\x53\x85\x95\x47\x94\x18\x97\x40\xBB\x94\xA0\x90\x52\x9E\x53\x91\x94\x10\x94\xA5\x80\x41\x8C\x95\x12\x96\x53\x96\x55\x90\x95\x49\x8B\xAF\x8B\x45\xA7\x94\x5C\x95\x13\x96\x2C\xAB\x94\x34\x94\x41\x91\x56\xA6\x93\xBE\x88\xC9\x8A\x46\x86\x95\x4F\x95\x4D\x9D\x54\x98\x95\x1A\x89\x16\x9A\xFB\x60\x95\x3C\x97\x55\x9A\x56\x95\x95\xEE\x8A\x4E\x60\x57\xAB\x95\x73\x95\x54\x92\x56\xA5\x95\x50\x74\x55\x9A\x57\xA4\x95", "\x78\x97\x5E\x91\x58\x8B\x89\x8D\x7F\x56\x9A\x4E\xA8\x94\x63\x97\x2A\x92\xC8\x49\x95\x79\x96\x48\x9C\x58\x82\x96\xB7\x85\xE0\x52\x45\xAC\x95\x68\x96\x5C\x90\x59\xBF\x95\x8A\x96\x1C\x91\x78\x75\x91\x97\x96\x63\x99\x56\x9D\x96\x40\x97\x44\x99\x46\x9A\x91\x19\x90\x46\x9C\x52\x95\x96\x94\x94\x59\x87\x56\x8F\x96\x80\x94\x5D\x9D\x58\xA1\x96\x2D\x92\x59\x94\x5A\x84\x95\xA9\x97\x67\x9D\x5A\x98\x96\xAA\x8F\xCB\x87\x57\xAE\x96\xA0\x94\x6A\x9F\x5A\xBE\x96\x50\x91\x21\x9E\x57\x9E\x96\x96\x97\x6D\x94\x5C\xB5\x96\x36\x91\xD0\x86\x4B\xA1\x88\x90\x93\x70\x90\x5B\x88\x97\xD0\x97\x6F\x9C\x5A\x81\x5E\x4D\x8F\x72\x9F\x03\x9B\x92\xCE\x94\x70\x96\x5C\x8F\x97\xD2\x96\x6D\x92\x20\x99\x92\xF4\x63\x6E\x98\x5B\xAB\x93\x87\x95\x3A\x7D\x4A\x80\x93\x47\x77\xD9\x84\x5B\x9D\x97\xC5\x97\x40\x9B\x5D\xB0\x94\x0C\x05\x2D\x98\x5E\xB1\x6C\x72\x8F\x7A\x9D\x5B\xAC\x96\xEE\x95\x7E\x9C\xA8\x7F\x92\x76\x76\xE2\x89\xD0\x5E\x61\x89\x75\xD7\x66\x08\x17\x72\x7A\x67\x80\x9B\xB8\x73\x76\x00\x00\x22\x04\x60\x9D\x6D\x0A\x9B\x28\x7D\xB5\x4F\x02\xA5\x74\xE3\x66", "\x10\x10\x98\xF6\x63\x3B\x99\xA7\x77\x93\x79\x68\x40\x96\x51\xAB\x80\x24\x94\x37\x86\x8E\x5D\x98\x3E\x84\x88\x9D\x1C\xB2\x94\xBA\x6E\x4E\x9B\x61\xBD\x92\x43\x95\x9E\x6B\x54\xBA\x6E\x53\x96\xEE\x6A\x59\x94\x04\x9C\x97\x1C\x97\x42\xAF\x95\xF6\x60\xB8\x80\x46\xBD\x90\x75\x94\x82\x66\x8E\x5B\x7E\x46\x71\x9E\x6F\x62\x90\x04\x31\x9A\x5B\x9A\xFC\x66\x63\x3F\x98\x43\x01\x64\xB2\x96\x34\x98\xF2\x83\x38\x9F\x8F\x38\x8E\x3D\x6A\x5C\xB3\x97\x1F\x82\x39\x65\x5D\x90\x99\x21\x88\x76\x9A\xBB\x64\x92\x54\x9B\x0F\x8C\x35\x8D\x87\xE7\x95\x7F\x91\xAC\x6A\x97\x79\x6A\x7C\x9E\x65\x87\x75\xF5\x95\x76\x9E\x13\xBC\x97\xAF\x0A\x99\x62\x4C\xA3\x99\x31\x6C\x2B\x0F\x5F\xBD\x74\xC7\x7F\x7D\x77\xDF\x66\x69\x1A\x9A\x71\x74\xD4\x71\x6D\x40\x03\x3B\x7C\x07\x1C\x78\xE0\x92\x40\x09\x67\xA4\x78\x10\x07\x9E\x91\x23\xA7\x72\x1C\x72\x0C\x0F\xCE\x4D\x94\x17\x79\x7B\x79\xCE\x4A\x00\xEF\x72\x6C\x56\x67\x92\x75\x1C\x70\x15\x70\xD9\x66\x71\x0C\x04\x03\x0C\x67\xBE\x93\x3F\x87\x3B\x7E\x47\x97\x8E\xF3\x75\x3A\x7F\x41\x93\x70\x69\x6C\x45\x02\x0B\x17\x9A\x96", "\x84\x44\x04\x06\x2F\x73\xB7\x00\xA9\x9C\x47\xA7\x9A\x80\x98\x43\x09\x6A\x83\x9A\xBA\x71\xDC\x6C\x6A\xB8\x76\x66\x6B\xAB\x9F\x37\x98\x77\xC7\x7F\xAC\x95\xC6\x61\x9A\x10\x06\xAD\x96\xE2\x5D\x9A\xD4\x74\x0B\x0F\xCE\x59\x01\xAA\x9A\x28\x9B\x04\x2F\x73\x8E\x02\x78\x97\x5C\xAC\x97\xD1\x97\x7D\x9D\x1C\x88\x9A\xB6\x96\x7E\x94\x5E\xAE\x8C\xA5\x8E\x7D\x9F\x5E\xB8\x97\xA6\x97\x58\x9B\x3A\x86\x96\x26\x95\x79\x9E\x6D\x94\x89\xCA\x98\x77\x9E\x6C\xAD\x97\xB9\x94\x44\x05\x67\x9A\x97\xD2\x98\x62\x91\x57\x8D\x9B\xD7\x99\xB4\x99\x6D\xBC\x95\x89\x81\xB8\x98\x6E\xAF\x9B\x83\x96\x62\x92\x62\xA4\x9B\xD3\x99\x46\x94\x35\x81\x5E\x1C\x97\x89\x9B\x6E\x8C\x9B\x00\x9F\xB8\x9C\x6E\x81\x5E\xF7\x98\xBB\x99\x6E\x9D\x95\x5D\x90\xC1\x92\x6F\x98\x9B\xF9\x9B\x69\x91\x54\xB1\x94\x0B\x9E\xBB\x9D\x70\x89\x96\x02\x7D\xC4\x98\x6F\xAA\x9B\xF5\x9A\xA9\x82\x54\x96\x9C\x06\x9C\xBD\x9C\x5B\x84\x96\x10\x07\x8A\x95\x52\xBA\x9B\x08\x9C\xC9\x94\x3A\xB2\x84\x1C\x9D\xC0\x9D\x6E\x97\x9C\xCD\x8C\x43\x08\x41\x96\x9B\x07\x9F\xB7\x95\x4E\x9F\x95\xDC\x9A\xC9\x9D\x6D", "\xB7\x9C\xED\x8D\x18\x93\x5B\xA6\x99\x12\x9C\xC6\x9F\x71\x9D\x88\x48\x9B\x90\x95\x73\x8E\x9C\x3D\x9D\xC9\x99\x52\x90\x04\x36\x9A\xCA\x91\x73\xB8\x9C\x44\x9E\x0D\x98\x63\x8A\x9D\x1E\x9F\x78\x9E\x73\xA5\x9A\x0C\x04\xBC\x83\x71\xBF\x9B\x02\x9C\xD4\x91\xB7\x77\x8B\x51\x9F\xB2\x99\x75\x9F\x9D\x20\x9E\xBF\x80\x73\x9D\x9D\xE2\x9B\xCA\x93\x70\x81\x9D\xDB\x7D\xCA\x90\x76\x8B\x9D\x36\x9D\xCE\x95\x64\xB4\x91\x6A\x9E\xD9\x9A\x75\x93\x9D\x59\x94\xDA\x9D\xFE\x71\x9D\x6C\x9D\xD3\x9D\x71\x85\x8C\xAB\x95\xD1\x92\x73\xBA\x9D\x73\x9D\xCB\x96\x10\x1B\x9A\x23\x9C\xE0\x9B\x76\xA4\x9D\xF3\x99\xDC\x62\x5C\xBE\x9B\x19\x9F\xD5\x9D\x78\x8A\x87\x14\x07\x93\x9C\x66\x91\x99\x43\x9C\xC5\x9E\x78\xBF\x9C\x8C\x6B\x94\x93\x79\x95\x99\x78\x9C\xE2\x9C\x70\xBB\x9B\x14\x04\x96\x9B\x79\x9A\x99\x9D\x9F\xE5\x92\x75\xAC\x91\x81\x5D\x97\x99\x66\x8E\x73\x60\x98\xE3\x98\x79\xA6\x9E\x5E\x9E\xDC\x90\x45\xA2\x99\xAB\x9D\xB0\x65\x66\xAE\x9E\xA7\x9F\xDF\x96\x79\xA0\x9E\x6D\x80\x78\x90\x00\x2B\x99\x8F\x99\x22\x60\xDE\x71\x6D\x72\x9B\x43\x77\x6E\x89\x9A\x84\x74", "\x75\x7F\x67\xB4\x9A\xCE\x72\xA0\x97\x6B\xBB\x77\xC7\x7F\xF2\x9B\x6B\x8A\x72\x0C\x06\xF3\x9F\x6B\xA2\x78\x85\x9B\xA1\x95\x6C\xA9\x6E\x8C\x99\xAB\x96\x10\x0E\x9A\xEC\x75\xF2\x97\xFC\x52\x9A\x13\x78\xA5\x96\x10\x16\x9A\xB0\x9B\x37\x74\xDD\x6F\x9C\xA0\x98\xF5\x93\x78\x9B\x9F\x4B\x87\x3B\x73\x6A\xA9\x9F\x36\x74\x75\x7A\x6B\xAD\x9F\xC9\x72\xAB\x90\x7F\x8D\x87\xF7\x9C\x17\x76\x7E\x83\x04\xBE\x9B\x30\x97\x67\x9C\x70\xFD\x9E\x48\x7F\x7F\x82\x04\x01\xA0\xA7\x98\x7D\xA9\x73\x05\xA3\xA4\x9C\x6B\xBA\x9F\xF4\x9E\x6F\x70\x11\x02\x9B\xDE\x9F\x40\x04\x6C\x91\xA0\x8C\x6B\xB1\x95\x81\x82\x04\xC9\x99\xE5\x98\x75\xB2\x9E\x20\xA0\xD0\x95\x6D\xBC\x9C\x2C\x9E\xEE\x9F\x81\x8A\x96\xD0\x99\x09\xAC\x74\xBB\x9E\xA8\x9C\x25\x85\x7A\xB4\x9D\x65\x9E\x7B\x91\x78\x58\x98\xB8\x9D\xEC\x99\x77\xAC\xA0\x27\x9E\x41\x07\x7C\xBE\x9D\x2B\xA3\x09\xAE\x79\xBC\xA0\x6D\x9E\xE1\x90\x82\x87\x8F\x63\x9C\xEC\x91\x83\xBF\xA0\x36\x91\xC1\x91\x78\xA6\xA0\x8F\x9D\x0B\xAD\x27\xAF\xA0\x46\x9C\x0E\xA9\x70\xAA\x94\x1E\xA1\x13\xAC\x84\xAF\x9E\x1C\x72\x12\xA7\x78\x86", "\xA1\x89\x9C\xEF\x9A\x0F\x90\xA1\x57\xA1\xEE\x93\x85\x88\x84\x60\xA1\x0F\xA6\x85\xA6\xA1\x98\x99\x8A\x95\x83\x87\xA1\x5C\xA3\xE7\x92\x78\x83\x04\x22\x9D\x17\xA1\x85\xBE\xA0\xCB\x8D\xE0\x5D\x62\x85\x9E\x52\xA1\x10\xA9\x87\xAB\x80\xEC\x9F\x1A\xA2\x87\xA1\xA1\x36\xA0\xA3\x6F\x69\xBE\xA1\x6E\xA0\x20\xAC\x86\x90\x9E\xA3\x95\x92\x95\x84\xB0\xA0\x7F\xA0\x1A\xA4\x75\xB8\x7E\x7D\x9E\x0A\xAA\x87\xB4\xA1\x5E\xA0\x5D\x8B\x88\xB3\xA1\x67\xA3\x24\xAD\x67\x8F\x73\x65\xA2\x26\xA8\x85\x98\xA2\x98\x9A\xD5\x9C\x88\x85\xA2\x8E\xA1\xDD\x97\x19\x8D\xA2\x9E\xA2\x18\xA3\x73\xBD\x98\x84\xA0\x10\xA2\x84\xB7\xA0\xF0\x98\x24\xAB\x73\xAD\xA2\x92\xA3\x2B\xA8\x84\xB9\x98\x10\x8D\x24\xAB\x77\xA3\xA2\xAE\xA2\xB6\x96\x77\x9A\x85\x9D\xA2\x2D\xAD\x86\x9E\x97\xBF\xA2\x59\x81\x8C\xBB\xA1\xC8\xA0\x25\xA6\x1D\x87\xA3\xCA\xA2\x21\xA8\x8A\xAB\x80\x8B\x9C\x1E\xAD\x8C\xA5\xA2\x87\xA3\x1B\xAD\x48\x98\x93\x14\x05\x73\x94\x8B\xBB\xA2\xA0\xA2\x2A\xA7\x74\x8C\x04\x9A\x9D\xED\x99\x1F\x8C\xA3\x99\xA2\x30\xA5\x89\x83\x04\xA2\x9E\x38\xA5\x20\xA4\xA3\x9F\xA2\x33", "\xA3\x5D\xA3\x8D\xBE\x9D\xEB\x92\x8D\xA5\xA3\xC9\xA0\x3D\xA1\x8B\x9E\x81\xBE\x9F\xED\x93\x8F\xAD\xA3\xD4\xA3\x33\xAE\x8B\xBD\x9E\xD8\xA0\x1C\x8C\x8E\x9E\xA3\xF5\xA1\x64\x94\x11\x29\xA0\xDC\xA2\x3B\xAD\x8B\xB7\xA3\x02\x04\x42\xAB\x84\xBD\xA3\xA4\xA3\x2A\xA0\x11\x16\x98\xDB\xA3\x43\xA9\x8A\x81\xA2\x1A\x94\xA0\x73\x90\x98\xA4\xBC\xA1\x71\x91\x78\x7B\xA0\xB5\xA1\x41\xA4\x90\x93\xA3\x17\xA5\x35\xAA\x90\xB1\x96\x23\xA1\x45\xAB\x85\x9D\xA4\x09\xA4\xB5\x9C\x10\x1A\xA1\x21\xA3\x2D\xA6\x91\x82\xA1\xFC\x9B\x46\xA6\x92\x90\xA4\xC4\xA2\xF3\x85\x85\xBC\xA3\x25\xA6\x3F\xA9\x3B\xB0\xA4\xB0\xA2\x3D\xA2\x94\x86\xA4\x10\x9F\x4E\xA3\x92\x83\xA5\x47\xA4\xA6\x96\x62\xBB\xA3\x49\xA5\x53\xAC\x91\x8E\xA1\x17\x86\x4D\xAE\x93\x88\xA5\xB1\x9E\x01\x92\x95\x91\xA4\xE6\xA0\x54\xAF\x40\x97\xA5\x0B\xA4\x55\xAD\x56\x97\x90\x5C\xA5\x48\xA4\x92\x9F\xA3\x06\x07\x20\xAC\x94\x8F\xA5\x27\xA5\x4B\xA2\x36\x89\xA2\x42\x9D\x69\x93\x8C\xA2\xA5\x5E\xA5\x6E\x83\x8B\xA7\xA5\x37\xA5\x4F\xA8\x95\x86\x8F\x76\x96\x51\xA8\x96\xB8\xA4\x70\xA4\xA6\x9F\x74\xAB\xA4", "\xDD\xA3\x5E\xA6\x97\x8D\x87\xA2\xA1\x60\xA5\x97\x99\xA5\x39\xA3\x2B\x7D\x95\xBC\xA4\x88\xA7\x18\xA2\x76\xA4\xA0\x6A\xA5\x63\xA3\x98\xA8\xA4\xB9\xA3\x5C\xA3\x95\x8C\xA6\x22\xA5\x55\xA5\x8C\x83\x87\x61\xA5\x64\xA9\x99\xA5\x9D\x42\x99\xDA\x9A\x97\x87\xA6\x9F\xA7\x65\xAF\x88\xB3\x98\x6D\xA7\x25\xA9\x96\xB3\xA4\xA5\xA7\xC3\x9E\xFF\x5D\xA6\xAC\xA7\x58\xAD\x9A\x8D\x87\xD1\xA2\x69\xA2\x98\x92\xA6\x34\xA5\xE4\x9E\x7B\x9A\xA3\x74\xA6\x6D\xA4\x9A\xB2\xA6\x0C\xA4\x0B\x8E\x7B\x96\x99\xBD\xA7\x5D\xA0\x9C\xB1\xA5\xAE\xA6\x41\x09\x8E\x9C\x08\x66\x6B\x96\x9D\x97\x8E\xA5\xBF\xA7\x60\x99\x7A\xB1\xA3\xB0\xA4\x60\xAB\x9A\xA0\x9D\x1E\x89\x3E\xA5\x9D\xB1\xA4\x6F\xA6\x67\xA9\x3B\xA8\x99\xCC\xA6\x7F\x94\x7F\x83\x9F\x1C\x71\xF1\x9A\xD5\x60\xA4\x6A\x71\x82\x79\x3B\x92\x9F\xF8\x9F\x36\x76\x10\x16\x9F\x02\xA0\xA4\x99\xCE\x6C\xA7\xFE\x9F\x03\xAF\x9E\xBB\x9F\x36\x92\xA1\x9B\x81\x80\x00\x0E\xA4\x2E\x7A\x9E\x9B\xA2\xDD\x9C\xF3\x91\xAC\x60\x9F\xC8\x9F\x71\x74\xDD\x64\x9F\xFE\x77\x72\x7E\x5B\x78\xA7\x60\x91\x1F\xA6\x80\xB6\xA7\x03\x04\xE1\x91", "\x7E\x86\xA8\xC7\x7E\x59\xAE\x80\xAE\x9F\x03\x07\xFC\x9F\x7C\xAC\x71\x39\x9D\x03\xA5\x7E\x90\xA8\x08\xA0\x83\xA4\x29\x9E\xA8\x09\xA8\x85\x71\xA2\x98\xA0\xB2\x98\xAA\x92\xA2\x90\x91\x24\xAB\x76\x7F\xDF\x49\xA0\xC1\x9C\xB0\x97\xFC\x54\xA0\x02\xAB\x51\x77\x81\x9B\xA8\x84\x99\x3A\x7A\x81\xB5\xA8\x31\x6D\x07\xAE\x96\xAC\xA4\xB1\xA6\x74\xA7\x90\x9B\xA7\x41\xA4\x66\xA9\x3B\xBD\xA7\xDC\xA4\x90\xA6\x9D\x8E\xA6\xEE\x90\x91\xA2\x93\x8B\xA9\x6B\xA4\x43\x04\x83\x85\xA7\x8B\xA4\x74\xAE\x9B\xB0\x97\x3A\xA2\x93\xAD\x9D\x81\xA9\x46\xA8\x72\xA5\xA5\xB7\xA6\xE7\x92\x96\xAA\xA4\x89\xA9\xD6\xA0\x00\x00\x94\x8F\xA9\x64\xAB\x75\xA1\x76\x86\x04\xFD\x98\x95\xAF\x9C\xA0\xA9\xC7\xA4\x51\xAF\x92\xA2\xA9\x86\xA7\x95\xA9\x9C\xA6\x7B\x74\xAA\x9A\xA5\xA4\xA7\xA6\xEE\x8D\x9E\xAC\x97\x9E\xA7\xFE\x8D\xB2\x5E\xA7\x93\xA6\x80\xAB\xC7\x9F\x3F\xA3\xA6\x76\xAB\x97\xA1\x9D\x98\x9A\x71\xA2\x71\xAE\xA5\xAF\xA9\xA0\xA4\x45\x07\x87\x89\xAA\x90\xA8\xA5\xA8\x8B\x86\x04\x0E\xAA\xA5\xAC\xA5\x96\xA9\x77\xAA\x40\x06\xA1\x8E\xAA\x5D\xA9\xA8\xAF\x57\xA1\xA6\x77", "\x9C\xA2\xA0\xAA\x9C\xAA\x8A\xAA\x5C\xAA\x88\x90\xA6\x9B\xA8\x9C\xAF\xA8\x97\xAA\x6D\x67\xA0\xA8\x9B\xB3\xA6\x94\xA5\x81\x62\xAB\xB4\xAA\x85\xAB\xA8\xA5\x58\xBF\xA8\x75\xAB\xA9\xAE\xAA\x98\x9A\x5C\x9F\x96\xA0\xA5\xB3\xAA\xC1\xA7\x64\x9D\xAA\x8B\xAA\xA8\xAA\x47\xAB\x99\x8D\x87\x31\x9B\x9E\xAF\xAB\x89\xAB\xB0\xAA\x6B\x86\x99\xBE\xAA\xC8\xAB\xB3\xAA\x99\xAC\xA5\xA2\xA4\xAF\xAA\xA7\xA8\xA9\x22\xA1\x65\xAB\xAA\xAA\xA4\x69\xAB\x9F\xA7\xAC\x9A\x97\x4B\x9A\xA9\xA9\xAA\x94\xAB\x9A\xAB\x8A\x86\xB8\x37\xAA\x71\xA8\xB4\xA9\x20\x81\x5E\x92\x9E\x3A\xA4\x79\x9A\xAB\xE2\xAB\xB0\xA8\xAB\x94\x8A\xE1\xA1\x78\xAF\x34\xAC\xAB\xAF\xAB\xB8\xAD\xA9\xA3\x92\xBE\x9E\x73\xA9\xAB\x96\xAB\xD5\xA9\xA4\xA0\x11\x2A\x9E\xFA\xA9\x7A\x9C\xAF\xA2\xAA\x04\xAC\x96\xA8\x8F\x81\xA4\x0C\x06\x3E\xA9\xAE\xA1\xAB\x84\xAA\xBF\xAD\x1C\xA0\xA7\x12\x0A\x9A\x9B\xB0\xAE\xAB\xF6\xAB\x91\xAB\xB1\x8D\xAC\xE8\xAA\x4F\x88\xA4\x8E\xAB\x05\xAF\xC4\xAA\x58\x94\xA4\x6E\xAB\xC0\xA5\xB2\xA1\xAC\xA2\x96\x94\xAF\xB1\xAB\xAC\xE7\xA9\xCB\xA9\xA5\xA6\xAB\x95\xA8\xCB\xA5\xB3", "\xB1\xAC\x37\xAD\xCE\xA7\x76\xA9\xA4\x29\xAE\xC5\xAA\xB3\xBE\xAC\xD1\xAA\x99\xAF\xB2\xA6\xAC\x68\xA9\x4D\xA4\xB3\xAA\xAC\x44\xAD\x1D\xA4\x85\xB4\xAB\x15\xAD\xC7\xAD\xAF\x90\x91\x67\xAA\xB0\xA4\xB1\x84\xAB\x81\xA9\x51\xAC\xB4\x94\xAD\x0C\xAC\xCC\xA6\x43\x8B\xA5\x49\xAF\x98\xA4\xB2\x8E\xAC\x02\x06\x1A\xAD\xB3\x8E\xAD\x59\xAD\xD7\xA9\xCE\x4D\xAA\x38\xAC\xD2\xA6\xB3\xBB\xAC\x28\x9F\xD1\xA0\xB4\xAF\xAD\xD8\xA4\x58\xAE\xB6\xA4\xAD\x1C\xAF\x10\xA2\xF4\x43\xAD\x6B\xAC\xDC\xAB\xA6\xA8\xA6\xD9\xAA\x6A\xA5\xAF\x93\xAD\xF7\xA8\x14\x9F\x76\xA7\x8C\x73\xAC\xE0\xAD\xAE\xA0\xAC\xCD\x85\xD2\x94\xB7\x88\xAE\x3F\xAD\xDC\xAD\x57\xA0\xAB\x5F\xAD\xDE\xAB\xB8\x9F\xA5\x3A\x99\xE1\xA1\xB9\xA9\xAD\x2A\x9E\xBD\x88\xB7\x98\xAE\x93\xAC\xD8\xA1\x45\x9B\xAE\x8D\xAE\xE1\xA5\xB5\x9E\xAB\xA9\xA4\xAB\xAD\xB9\x92\xAE\xA2\xAE\x9C\xA2\x8B\x9F\xAB\x63\xAD\xEA\xA5\xB7\x97\xAE\x36\x93\xE0\xA3\x31\x96\xAE\xDC\xA9\xED\xAC\x77\x93\xAB\x9C\xAE\xEB\xAC\xB8\xAA\xAD\xCD\x86\x84\xA8\xBA\xB0\xAE\xBC\xAE\xB2\xA1\x5C\x60\xAE\xC1\xAD\xF1\xAF\xAE\xBA\xA6\x10\xAF", "\x23\x94\xBC\xBA\xAD\xC0\xAC\xBE\xA3\x9C\x8B\xAF\xA7\xAD\xEE\xAA\x58\x8B\xA7\x19\xAE\x33\x72\xB0\x8C\xAF\xB6\xAF\x98\xA3\x9D\x89\xAF\x03\x06\x3C\xA6\xB6\x9B\xAB\x52\xAD\x76\xAC\xBD\x82\x04\x12\xAF\xEF\xA9\xBD\xBD\xAA\x32\xAE\xDE\x8E\x7B\x80\x9F\x13\xA8\x28\x64\x9E\xA9\x73\xE6\xA7\x7F\x78\x9E\xA5\x72\xFF\xA4\xA6\x94\x9F\x8F\xA8\x18\xAA\x40\x00\x9F\x8A\xA0\xCE\x76\xF2\x9A\x67\xAB\xA8\x32\x9A\x40\x0A\x9F\xBC\xA8\x80\x74\x92\xAF\xBE\x94\x77\x01\xAB\xF4\x99\x7F\x9F\x9F\x00\xB1\xE0\x58\xA0\xAE\xA8\x0A\xA8\x00\x08\x7E\xB8\xA8\xB1\x98\x07\x79\xA9\x9F\xA8\xF9\xAD\x1F\x9D\xC0\xB7\xAD\xFB\xA6\x86\xA7\x7D\xBD\xAF\xB9\x9A\x8A\xA8\xA2\x84\xA0\x22\xB0\x05\xBA\x7E\xA1\xB0\xFB\xA4\x8C\xAD\xBE\xB2\xA7\xF6\x9D\x09\xBF\xC1\xB8\x9A\x39\x9C\x8D\xAA\xC0\xAE\xA7\x16\xA3\x06\xB0\x11\x3B\xA8\x33\xB0\x3F\x76\x10\x3E\xA8\x81\x72\xD3\x60\xD8\x60\x01\xBE\x72\xC4\x6A\x97\x40\xB1\x23\xB0\xFC\xAF\xCE\x73\xAF\x08\x06\x10\xBD\xB5\x44\xB1\x26\xB1\xFD\x91\x7D\xBF\xAF\x0C\x6F\x10\xB6\xC3\x8C\x04\xF7\xAF\x85\xAB\xC0\x83\x04\xFB\xAC\xBB\x61\xB4\x52", "\xB1\x45\xB0\x75\x73\xC0\xB9\xB0\x17\x76\x41\x08\xA4\x8A\xB1\x12\x9B\x40\x0C\xC4\xAF\xB0\xD0\x9D\xCE\x99\xC0\xAD\xA7\x3A\xB3\x40\x04\xA0\x88\x76\x5B\xB3\x12\xB3\xC5\x86\x04\x0F\xB1\x53\x7F\xD0\x53\xB0\x3D\xB0\x17\xBD\xC4\x92\xA0\x2E\x9E\xA6\x9B\xB2\x72\xB1\x5D\xB1\x85\xA2\x7F\xBF\xB1\x65\xB2\x40\x07\xC6\xB1\xA7\x27\x78\x03\xAE\xC2\xAE\x72\x02\x06\x0F\xB1\x22\x87\xB2\xFC\xAC\x0C\xBB\x02\xAD\xA8\x76\xB2\x56\x7A\xC2\x96\x04\x64\xB0\x82\x90\xC9\xB1\xA8\x0B\xA1\x0B\xB9\xC2\x84\xB2\x9A\xB3\x1C\xB3\x10\x14\xB2\xF6\x77\x43\x77\xC9\xB0\xB1\x35\x6D\x28\xB1\xC8\xB1\xB0\xC3\x98\x28\xB9\xC7\x4C\x04\x9B\xB3\x0A\xB9\xC8\x94\x77\x38\xB0\x1B\xB1\xC6\x83\x04\x3C\xB1\x9E\x64\x23\xA3\xAF\x46\x6A\x39\x6B\xCB\xBC\x8D\x3F\x81\x31\x96\xBE\x92\xAD\x32\xA3\x90\xA4\xBB\x84\xB3\x45\xAE\x31\xB7\xB5\x81\xAE\xBA\xAE\xD6\xA0\x46\xA8\xAC\xDF\xAF\xDF\xAD\xBC\x90\x91\x53\xA9\x34\xBD\xB4\x8D\xB3\x9E\xAC\x12\xB8\xCD\x83\xB3\x5E\xAF\xF9\xA0\xBE\x9A\xAF\xCA\xB2\xDF\xA7\xCD\x93\xB3\x76\xAE\x4E\xAB\xCC\x87\xAE\xCE\xB2\xDE\xA6\xB4\xA7\xB3\x4F\xAF\x36", "\xB9\xBB\x8A\x9C\xC7\xB1\x37\xB8\xCC\x85\x8A\xF1\xB0\xFA\xA1\xBA\x9D\xAB\x06\x04\x89\x9D\xBA\xA4\xB3\xFC\xB2\xC6\x94\x86\xB5\xB3\xDF\xB2\x3D\xBC\xB6\x86\x04\x62\xAE\x35\xB8\xB5\xAF\xAE\xAF\x88\xF4\xAE\xCE\xB7\xB3\x8C\x6B\xA4\xAC\xCD\x82\xB4\xEA\xB2\xDC\xAC\xCE\xA5\xAD\x0F\xB5\x62\xAE\xA9\x8A\xB4\xFD\xB2\xD2\xA8\xAD\xA5\xAA\x13\xB4\x42\xB3\xCF\x88\xA2\xA4\xAD\xDF\xA6\xBA\x8B\xB4\xC6\xAD\xF4\xA5\xAB\xB1\xAA\x00\xB6\x34\xBE\xCD\x87\x7F\x7F\xA4\x49\xB8\xBD\x9F\xB4\x65\xA9\x61\xA1\xD0\xB3\xB4\x4C\xAA\x62\xAC\xD0\xB0\xB4\x6A\xAA\x64\x98\xD1\xAB\xB4\x12\xA5\x48\xBC\xD1\xA2\xB3\x07\xB7\xEE\xA1\xD1\x9B\xB4\xC0\xA1\x4A\xB3\xCE\xBC\xB4\x2B\x82\xEC\xAE\x1C\xBB\xB4\x38\xB5\x4D\xB2\xAD\xAC\xAE\x06\xB4\x33\xB9\xD1\x9C\x70\xBE\xAE\xF4\xA8\xD4\x92\xB5\x8C\x69\x6D\xA5\xD1\xAA\xB4\xE1\xAC\xF2\xA0\xCC\x8F\x60\xBC\xA5\x54\xB8\xCE\xA2\xB5\x9B\xA1\xBE\xA5\xBD\xBB\xAB\x46\xB5\x50\xB9\xCE\x8E\xAE\x0C\x04\xF5\xA9\x1F\x0D\xA7\x4C\xB6\x3C\xB7\x8E\xAC\x92\xD4\xA5\x5A\xB8\xD5\x8D\xB5\x39\x9C\xED\x99\xB0\xB4\x97\x71\xB4\x44\xB6\xD2\x81\xAD", "\x18\xAF\x5B\xB2\x9E\x8D\xB1\x07\xB1\x9C\x97\xC4\xA2\xB2\x7E\x98\x14\xBB\xC7\x8C\x6A\x55\xB0\x06\xB7\xC5\xBA\xAF\x88\xB4\x00\x0F\xC5\xB6\xB2\x99\x76\x18\xB1\xD9\xAB\xB1\xF5\xA5\x06\xBF\xC6\xA5\x77\x70\x99\xCE\x95\xC7\xA5\xB2\x5A\x74\x1E\xB8\xC8\xB2\xA8\x39\x9F\x05\xB5\xA2\x87\xA0\x1A\xB3\x2A\xBE\x41\x83\xB2\xAA\xB5\x2F\x94\xCA\x88\x04\x73\x9A\x33\x77\xCA\x9C\xB6\xA9\x75\x87\xAB\xC8\x91\xB2\x69\xB3\x24\xB7\xDB\x9C\xB2\x20\xB2\x6D\xBF\xC9\xAD\xB6\xB9\x8E\x0C\xB4\xD9\xA3\x76\x06\x07\x8D\xA8\xC6\x9C\xA8\x2B\x81\x2D\xB9\xD9\x8F\xB6\x00\x01\x2E\xBA\xBB\x42\xB3\xE9\xAF\x5B\x77\xE3\x66\x75\xD2\x91\x34\x9D\xD6\x53\x93\x35\x78\x8E\x77\xDD\xBE\x84\xF5\x74\x14\x97\xBB\x79\x69\xD7\xAC\x14\x95\xD7\x72\xAB\x21\x8A\x36\x9D\x1C\x90\xB7\x27\xB6\x74\xBA\xDD\x99\xB7\xD4\xB7\x76\xBD\x1C\x8F\x93\x69\x77\x7B\xB5\xDD\xB2\xB7\xD4\x92\x3D\x6F\xDD\xBA\x6E\xE1\xB5\x00\xBB\xBB\x7C\xB2\xE6\xB7\x4D\xB2\xD7\x9A\xA5\xE1\x92\x5D\xB3\xD6\x9B\xB5\x39\x9F\xC8\xA7\xD5\x83\xB8\xEF\xB2\x0B\xA2\xE0\xAD\xB3\x53\xB5\x3A\x75\xCD\x84\xB8\x6A\xB4\x59\xB8", "\x69\x9A\xB3\x0D\xB8\x4D\xB7\xD4\xB8\xB5\x11\xBB\x3B\xAC\xB3\x92\xB8\x1E\xB4\x38\xB6\xCE\x80\xB5\x77\xB7\x7F\xB6\xD1\x80\x00\x6D\xA8\x87\xB2\xD4\xBF\xB5\xC7\xAF\x87\xB3\xD2\x95\xB8\x5C\xB4\x48\xB6\x3E\xAB\xB8\x07\xB8\x83\xBE\xCF\x9F\xA1\x0B\xB8\x45\xB6\xD5\x99\xA4\x00\x00\xD7\xA0\xE1\xA1\xB8\x7E\xB7\xDE\xA1\xB6\xBD\xB5\x16\xB9\x6E\xA1\x72\x80\xB9\x2D\xB8\x80\xB2\x10\x0E\xB4\x37\xBA\x88\xBE\xD4\x99\x9A\x35\xB9\x87\xBD\xE3\xB4\x9C\x1D\xB7\x89\xBE\xD2\xA8\xB8\x82\xAE\x2E\xAF\xD2\x8A\xB9\xD7\xB0\xA9\xA5\xD4\x91\xB9\x6B\xB7\x94\xBE\xE5\x81\x5E\x8A\xAE\x97\xBC\xE2\x99\xB9\xE7\x8B\x3E\xB1\xE3\xB6\xB8\xA1\xAF\xBB\x84\xE4\x97\xB8\x73\xB7\x62\x99\xE4\xBD\xB8\xE4\xB2\x4E\xBD\xE4\x92\xB9\x63\xB9\x52\xB6\xE5\x94\xB9\x62\xBB\x99\xBC\xA7\xBA\x9C\x50\xB7\x8E\xB8\xE0\xBE\xB7\xCE\x88\xEE\xA0\xE8\x81\xB9\xCC\xB2\x96\xB6\x8C\xB3\xB9\x5D\xB9\x9D\xB8\x97\x90\x04\x55\xB7\xA0\xB5\xE4\x84\xBA\xB9\x8E\x56\xBF\xE6\x90\xBA\xED\xB0\xBC\xAB\x9B\xAB\xB9\x19\xB9\x82\xB0\x11\x26\xB5\x82\xB4\x5A\xBC\xE5\xA6\xB8\x89\xBB\x8C\xBA\x9C\x81\xAC\x98", "\xB8\x8F\xBE\x55\xB0\xA3\xBC\xB2\xF7\xAE\xE7\xB2\xB8\x5D\xB4\x44\x0A\xD7\xA7\xB5\x64\x99\xA9\xBF\xE7\xA5\xB4\x3E\xBA\x2F\x9B\xBE\xB2\xBA\xAC\xBA\x8B\xB1\xE0\x9F\xBA\xAB\xB8\x9A\xB1\xB4\x86\xB8\x18\xBA\xA9\xBB\xE4\x90\xB3\xBD\xBA\x93\xB9\xD3\x94\x04\x0F\xBB\xA4\xBF\xE8\xBF\xAD\x1F\xA4\xAE\xBE\xEB\x97\xB9\x70\xBA\x9E\xB7\xAD\xB1\x9B\x88\xB8\xA8\xB6\xED\xA1\x98\xCE\xBA\xB1\xBB\xE4\xA5\xB8\xC5\xB8\x9D\xB9\xCC\xAA\xB8\x90\xAE\xB4\xB1\xEA\xB8\xB8\x51\xAC\x96\xB9\xE9\xA9\xB9\x14\x06\x3E\xB7\xED\x8A\xBB\x64\xBB\x3F\xBC\xEB\xAC\xBB\xE7\xB8\xAD\xB7\xA8\xAF\xBB\x8E\xB8\x9B\xB5\xA6\xA8\xAD\xF5\xB9\xBC\xB0\xED\xB7\x8A\xD9\xBA\xB7\xB8\xE3\xA6\xB6\xF9\xBA\xB0\xBD\xD3\xA5\xA5\xFD\xBB\xB8\xBD\xE6\x8A\xB5\xCD\xAA\xB8\xBB\xEE\x82\xAF\x3E\xB7\x96\xB0\xE2\xB3\xBA\xFB\xBB\x92\xB1\xE6\x8A\xBA\x10\xBC\x9E\xB1\x78\x6D\xB4\x14\xBD\xAE\xBF\xE4\xBB\xAA\x0F\xBE\xC6\xB4\xE9\xAA\xAE\x36\xB4\xAD\xB9\xF1\x8F\xBB\x50\x92\xB1\xA8\xE7\xA3\xBC\x75\xAE\xA1\xBC\x99\x95\xBB\xDD\xBA\xC1\xB1\xE8\xBD\xB9\xF0\xBA\xC0\xBA\xEF\x95\xB9\x82\xBA\xC8\xBA\xF0", "\xA8\xAE\x2A\xBC\xB3\xA5\xF0\x8B\xBC\xF2\xBA\x6E\x9C\xF2\xB1\xBC\x15\xBD\x39\xBE\x00\xBB\xBC\x2D\xBC\xB9\xAE\xD5\x96\x97\x60\xB4\xD1\xB0\xF4\x82\xA9\x9B\xBB\xF3\xAF\xF3\x81\xBC\x41\xBF\xF4\xA4\xEA\x8F\xBD\x36\xBD\xB0\xB9\x3B\x88\xAC\xB0\xBB\x2B\x94\xF5\x91\xBC\xF6\xB8\x75\x7F\xEA\x9D\xBA\xB1\xBB\xD6\xB7\xF2\xB7\xBC\xD1\xB6\xAD\xBC\xCB\xAC\xAF\x05\xAA\xFB\xA5\xBF\xBB\xB9\xF1\xAD\x04\xBA\xCD\x85\xB6\x39\x9D\x63\xB7\xDA\xA0\xA8\x00\x01\x16\xB2\xCB\xA4\xB6\x2B\x82\xDC\xB0\xC1\xA6\xA8\x75\xBD\x64\xB3\xD9\x8B\xB7\x34\xB1\x43\xA7\xD9\x8D\x9A\x91\xB7\x67\xB0\xDB\xB7\xB1\x91\xB4\xC0\xB5\xC9\xBF\x77\x8D\xB9\x7A\xA6\xDE\x6B\xB6\x1D\xB1\x64\xBF\xDA\xBF\x03\xB1\xB5\xB0\x63\xDB\x8E\xBE\x9D\xB6\x6E\xBF\xDB\x8B\xB6\x29\xAB\xE6\xB7\xDC\xB9\xA8\x9E\xB0\x01\xB1\x22\x97\xBE\xF4\xAF\xE3\xBD\x4B\x82\xB7\x80\xBD\x1B\xB2\x10\x06\xB7\xA3\xB5\x27\xB7\xFC\x4A\xB7\xF8\xAC\x73\xBE\xDC\xAD\xAE\x81\x5C\x67\x72\xF4\xA7\x9F\x71\x9D\xE0\x52\xDA\xA1\xBB\x71\x6E\x04\x09\xFB\x94\x04\xBE\xBD\xE1\xAB\x59\xBF\xBE\x40\x98\xF1\xBC\x10\x26\x01\xC6\xBE", "\x41\x08\xD0\x42\xBF\x14\x07\xEE\xB6\xE6\xB1\x6D\x1A\x01\xF2\xB3\x10\x11\xBF\xCC\xBC\x44\x08\x05\x12\xBF\x02\x04\xDA\xB9\x93\xA2\x56\xD8\xBC\x00\x0E\x38\x95\xBF\x46\x99\xF7\xB9\xF0\xB8\xB8\x56\x01\xF7\xBE\xC8\xB7\xBE\x84\xAC\xBD\xB0\x46\xA3\xBF\xBA\xB9\x23\xBD\xFD\x86\x78\x0C\xBE\x41\x0F\x81\x7F\xAB\xB6\xBC\x3E\xB9\x33\x1D\xBF\xCE\xBE\xD1\xB0\x11\x01\xBF\xEA\xBC\xA5\x8C\xFF\x9D\xBC\x98\x98\xFB\xB5\xA6\x82\xC0\x23\xB8\xF2\xB0\xFE\x8A\xBF\xF8\xBD\xF7\xB4\xFD\xBD\xBF\x50\x93\x02\xC0\x00\xFB\xB9\xD7\xBF\x01\xC3\x10\x1A\xBF\xF1\xBF\x40\x07\xFE\xB6\xBF\x02\x07\xF7\xBC\x00\xFA\xB7\x04\xC2\x4B\xA0\x77\x92\xC0\x02\x05\xF9\xB0\x02\xC0\x00\x17\xC2\xA8\xB9\xFE\x8F\xC0\x7C\x91\x07\xC1\xA5\x86\x04\x25\xC0\x8E\xB0\xFF\x83\xB4\x03\x07\xFC\xB7\xE0\x4A\x63\x70\xBF\x0A\x8D\xF6\xBC\xBD\x6F\xBF\xDA\xBC\x47\xBA\xBD\x8B\xBD\x04\xB6\xF7\xA9\xBD\x2C\xB3\x13\xBB\x9F\xBF\xC0\x33\xC1\x6D\xBB\x02\xBF\xBD\xB1\xBD\xE0\xBC\x9F\x83\xBE\xFB\xA7\x66\xB8\xF9\x86\xC1\xBD\x92\xE1\xB4\xF9\x88\xBE\xC0\xB7\x26\xAA\xF8\xA0\xB6\x8C\xBD\x64\xBF\xA9\xB3", "\xBD\x19\xB2\x07\xBD\xFA\xBD\xB6\x9A\xBE\xE8\xBF\x03\xA4\xBE\xFE\xA6\xE9\xB9\x3B\x93\xBE\x95\xBF\x51\x74\x06\xFF\x03\x35\xC2\x6B\xBB\xDB\xB7\xBD\xAE\xBE\x6F\xB2\x06\xCF\x60\x6B\xC1\x1B\xC1\xDC\xAD\xB2\x55\xC0\xA6\x90\xFB\x96\xB1\x4A\xC3\xEC\xB1\xDB\x73\x71\x66\x69\x2C\xB0\x04\xC9\x62\x53\x64\x20\xBC\xF9\xA5\xA7\x87\xB6\x83\x95\xC8\x80\x00\x82\xC1\x11\xC3\xD1\x42\xC1\x73\xC0\x45\x04\x04\xCE\x04\x85\xC3\x22\xCD\x08\xF4\xB6\x8F\xC1\xDC\xBA\xD8\x81\x72\x98\x70\x2C\xBE\xF7\x9A\x9F\x8A\xC2\x2A\xB7\x08\xCB\x9A\x84\xBD\x28\xCF\xCA\x86\x04\x97\xC3\x13\xC9\x09\xEB\x80\x52\xC1\x1A\xC1\xB3\x79\xBF\x98\xB3\x65\x85\xC5\x54\x04\xA9\xC1\xE9\xB9\xF9\xBD\x92\x57\xC3\xE1\xBA\xD5\x4D\xBE\x09\x05\x25\xC2\x0A\xDF\xBE\x15\xB2\xA7\x9C\xDA\x91\x6B\x9D\xC0\x2A\xC2\xF9\xAF\xC1\xB1\xC3\x29\xAE\xCC\x75\xC2\x65\xC3\x2D\xC7\x06\xC8\xC3\xA8\xB0\x1E\x71\x08\xC7\xC3\x9E\xBC\x23\xBE\xE6\x87\x75\xCC\xC0\x1B\xCA\x03\xE2\x92\x68\xC2\x29\xBB\x60\x96\xC2\x91\xB4\xEA\xB9\x04\xEA\xBE\x00\x00\xEB\xB2\xC7\x4A\xC3\xC1\x69\x36\xC6\x07\xDB\xA2\x7B\xC2\x63", "\xBD\x07\xCA\xBD\x50\xBF\xE8\xA6\xD9\xA2\xBD\x79\xB9\xAB\xB4\xED\x9B\xC0\x28\xBE\xBF\xBC\xC1\x44\xBB\x4B\xBC\xC9\xB5\x0F\xDC\x70\xC9\xB9\x3C\xCE\x0F\xF1\xB9\xAC\x80\x3D\xC9\x0F\xEE\xBC\x1F\xBE\xB6\xB3\xF0\xBB\xBA\x28\xC0\x42\xCB\xEC\xAB\xC0\x78\xAA\x41\xC4\xF6\xA8\xBB\x4F\xA2\x44\xC6\xF5\x95\xBA\x4B\xAD\x43\xCC\xF3\x9C\xBD\x64\xA5\x44\xC8\x0F\xD3\xC4\x55\xBC\x07\x7A\xEE\x85\xBD\x24\xC6\xA6\xBC\x10\x3A\xB8\xFD\xC2\x42\xC3\xF3\xB5\xBA\x05\xB5\x49\xC2\x10\xE9\xBC\x14\x04\xBE\xB1\x12\xD1\xBB\xF6\xC3\x56\xA6\x11\xE6\xBB\xFF\xA1\x1F\xB7\x13\xF4\xC4\x6D\xBB\x16\xCF\x12\xFA\xC3\x1B\xBC\x51\xB7\xE8\x9F\xC4\x17\xC7\x40\xC1\x1C\xB7\xB9\xFF\xC0\x4F\xC1\x14\xCC\x04\x13\xBC\x48\xCC\x11\xF9\xC4\xB6\xAB\x4E\xC9\x10\xC0\xC5\xD4\x76\x4C\xBF\x10\xEB\xC4\xC5\xB0\x3A\xCF\x13\xCE\xC4\xED\xBB\x63\xAC\xFB\xB8\xC4\x51\xBE\x09\xCF\xD4\xA5\xAE\x5F\xC6\x52\xC3\x15\xD4\xAE\x0D\xBF\x50\xCA\x11\xEE\xC4\x33\xC7\x88\xB8\xF0\xB0\xC3\x6D\xC7\x92\xBF\x16\xD2\xC5\x57\xC6\xCC\xBD\x4B\xBC\xC2\x63\xBD\x51\xCA\x12\xFD\x92\x92\xBB\x56\xCB\x11\xD6\xBC", "\x47\xBD\x96\x99\xF4\xB4\xC5\x5D\xBC\xB3\xB4\x11\x1C\xBA\x3C\x0A\x99\x64\x9C\xBF\xC5\x49\xC7\xB1\xB0\x11\x2E\xB5\x89\xC6\xF5\xA0\x17\xCF\xC5\x1F\xA3\xF6\xAF\xD5\x94\x04\xAA\xB9\x4A\xC4\x15\xC6\xC6\xAE\xBA\x76\xA4\x18\xD8\xC5\x4E\xC4\x14\x91\xD8\x91\xC6\xC1\x93\x64\xC9\x17\xED\xBF\x4B\xC3\x67\xC6\x17\xD5\xC6\xE1\xB0\x8C\xBA\x17\xDB\xC6\x10\xC6\x40\x0C\x0F\xFE\xC5\x6C\xC7\x50\xBE\xB2\xAA\xC6\x61\xC5\x4D\xC3\x10\x14\xB8\xA1\xC5\x63\xC5\x17\xF9\xC6\x60\xC6\x3C\xCC\x10\xEE\xC6\xC1\xC6\x51\xC4\xEE\xA6\xC6\xBE\xC7\x42\xC2\x10\x1C\xBB\x9A\xC4\x57\xCB\x12\xF0\xB3\x44\xC5\x71\xCB\x17\xFF\xA4\xC8\xC7\x41\xCE\xB9\xA3\xC4\xCD\xC4\x63\xC9\x15\xE7\xC4\xD5\xC5\x6F\xC8\x01\xC0\x00\x2D\xC5\x76\xC5\x1B\xC0\xC6\x43\xB8\x6E\xCE\xF1\x9C\xC6\x6D\xAD\x74\xC6\x16\xE8\xC7\x98\xA9\x77\xCF\x1A\xE2\x92\x3E\xC5\x5C\xC5\x18\xDD\xC5\xAB\xAC\x59\xCF\xFC\x92\xC7\xB0\xC5\x47\xC3\x16\xE2\xB4\x65\xC7\x59\xCA\x1D\xDF\x8B\xEE\xC4\x7E\xC8\x16\xD1\xC5\xEA\xC6\x7F\xC3\x1E\xF5\xBA\x56\xC7\x7C\xC0\x1A\xDA\xB4\xD2\xC3\x81\xC6\x1D\xDA\xB8\x5E\xC7\x7D\xCB", "\x1E\xCA\xC8\x8B\xB9\x5A\xCB\xF2\x85\xC8\xBF\xC7\x79\xCE\x76\x88\xC5\x0F\xCA\x78\xCB\xFD\xB5\xC7\xFC\xC6\x84\xC6\x20\xDE\xC8\xE9\xB4\x9F\xB6\x1F\xFF\xC7\xEF\xC7\xC4\xA5\xAE\x98\xC8\x14\xC8\x70\xC5\xA6\xBD\xC5\xF2\xC7\x82\xCE\xE1\x8C\x04\xF1\xAB\x5E\xB3\xAF\xAB\xC5\x24\xC9\x8C\xC5\x21\xCC\x8D\x4E\xBC\x8B\xC2\x23\xD3\xC8\x3C\x83\xD4\xBE\x23\xEB\xC6\x1A\xCB\x13\x85\xD7\x83\xC9\x2E\xCB\x88\xC6\x43\x9F\xBD\xA4\xC5\xD8\xB8\x24\xC5\xC9\x44\xC8\xC8\xB2\x10\x23\xC6\x14\x0A\xC6\xA3\x9E\x9B\xC3\xA9\x6F\x0D\xC8\xDA\xB9\xC0\x66\xC3\x26\xAC\x03\xD8\xC1\x3E\xC1\x64\xBF\x25\xFA\xC2\xFF\x77\x24\xCA\x0A\xC3\x78\xC7\x7C\x12\xCC\x07\xE4\xC3\x06\xB0\x96\xCE\x13\x98\xB6\xE3\xC3\x2D\xB2\x10\x0E\xC1\xB6\xC0\x14\xC9\x3B\xAD\xC2\x54\xC3\x28\xCB\x7E\xBE\xB1\x79\xC3\x9E\xB1\x1F\xE0\xC9\x7C\xBE\x17\xC8\xDB\x88\xB7\x6E\xC1\x35\xC3\x28\xE0\xBE\x28\xB1\x24\xCD\x6B\x94\xC3\x8A\xC8\x04\xAA\x27\xC9\xCA\x60\xB1\x65\xB0\x80\xA1\xC3\x78\xC3\xA3\xC9\x73\xAD\xC3\x5C\xC2\xEC\xBF\x66\xB6\xC9\x9B\xA2\x96\xC4\xF7\x9C\xC9\xCE\xC2\x97\xCB\x09\xDF\xC1\x92", "\xB1\x2F\x93\x26\xD3\xC1\x5A\x76\x99\xC5\x27\xEB\xC2\xBD\x92\x9A\xCE\x0E\xEC\xC9\x4C\xC1\xA3\xCC\xC0\xBD\xC9\x7C\x90\x9E\xC1\xDA\x89\xBE\x7C\xCA\xA5\xC0\xF9\xB2\xCA\x19\xA8\xA3\xC1\x29\xC4\xB7\x93\xC8\xAD\xCC\x0D\xD0\xC3\x98\xC0\x9A\xC2\x07\xFF\xCA\xF8\x76\x41\x05\x07\xEE\xC9\xFC\x9C\xB1\xC7\x26\xD8\x78\xAC\xB3\x7E\xA6\x0E\xFC\xB6\xA5\xC9\xEE\x88\x29\xFB\xBD\xA8\xB6\x1F\xC9\x0C\xF2\x76\xA7\xC2\x19\xB1\xC4\xBE\x75\x7A\xB0\x30\xC7\xC2\xB9\x9C\x9E\xC9\x06\xBA\xCD\x81\x98\xE0\xC2\xB0\xC9\xBA\x67\xCA\xAE\xC0\x60\x7A\x2A\xC9\xB1\xE0\xCA\x21\xC2\x2E\xCE\xB1\x9A\xC3\x10\xC1\x61\xBF\xC2\xA4\xC9\x6E\xBD\x2A\xE0\xC2\xD1\x6A\xED\xBF\x80\x6A\xC3\xCC\xCA\x0D\x90\x27\xEB\xC9\x72\xC8\x67\x57\x2F\xDD\xCB\x86\xB1\xE1\xBF\xCE\x70\xC2\xD1\xC2\xE5\x68\x30\xCC\xC2\xB8\xCB\x7E\xA8\x17\xFF\x03\xE8\xC8\xBE\xC7\x28\xC1\xC3\xD4\x77\x9F\xC4\x26\xD1\xB0\x82\xCA\x16\xBC\xB5\x69\xCB\xBA\xC9\xA1\xCC\x2B\xE7\xA8\xFD\xC9\xB8\xC9\x2F\xC4\xCA\xCF\xC2\xA1\xCE\x31\xDC\xCB\x4A\x70\x44\x00\x30\xDD\xC9\x98\x99\x37\xC6\xC9\x87\xCC\x2D\xCE\x27\xCA\x2E", "\xFE\x84\x32\xCF\x8B\xA4\x33\xF3\xC2\x2E\xCC\xA5\xC2\x2D\xFB\xCC\xD3\xC3\xCD\xCD\x1C\x97\xCB\x3D\xC0\xDF\xBA\x2D\xF9\xC8\x94\xC4\xD3\xB7\x0F\xF8\xC8\xB4\xC4\xD2\xC0\x45\x80\xBB\x02\xC8\x8A\xC8\x1A\xF3\xC6\x3A\xC9\x92\xCC\x1E\xC3\x04\x01\xC5\xD5\xC0\x25\xC1\xBD\xCD\xBA\x79\xC6\x1C\xD1\xCD\x0E\xCA\x77\xC2\xE6\x41\xC8\x40\xCB\x8E\xCE\x11\xCC\xCD\x5A\xCF\xD7\xC5\xA6\x8C\xC7\x4D\xCD\xDB\xCD\xF3\xA0\xBB\x22\xC9\x86\xCA\x36\xE3\xB8\xE5\xB9\xD9\xC6\x35\xCA\xC7\x95\x88\xD9\xCA\x24\xC1\xAD\x28\xC6\xDB\xC9\x34\xF3\xCD\xC7\x7D\x78\xCE\x37\xE7\xC6\x4B\xC6\x41\x02\x13\xFF\xCD\xD3\xC4\x46\xC0\x11\x08\xB9\x83\xCD\x72\xC2\xE4\xBA\xC4\x4F\xC8\xE0\xC4\x1F\xC3\x04\x1A\xCE\xE3\xC1\x25\xF0\xC4\x42\xC7\x85\xC8\x36\xC8\xCE\xF9\xC6\xD9\xCB\x1F\xFF\xB4\xC4\xC6\xDD\xCB\x35\xC2\xC7\xB4\x76\xD7\xC9\x38\xFE\xC3\x17\xBE\xDE\xC2\x37\xFA\xAA\x95\xAD\xE4\xC7\x3A\xEF\xCE\x7C\x91\xB0\xA0\x36\xCE\xCD\xE8\xBC\x3B\x76\x3A\xDD\xCE\x5C\xCF\xB2\xA6\x43\xAA\xC0\x3F\xCB\xDE\xC9\xB9\xBA\xCE\xEB\xBE\xEA\xCD\x22\xE4\xCE\x26\xC9\x88\xC2\x35\xE2\xCE\x86\xA8", "\xF0\xCC\x31\x82\xCF\xBD\xCF\x92\xB3\x31\xDD\xC8\x8D\xCF\x76\xC6\x10\x30\xC8\x9C\xCE\x73\xC5\xE8\x81\xC6\xA3\x9F\x60\xCE\x3A\xF8\xCE\xA3\xCC\xA6\x98\x18\xD5\xC9\xCE\x73\x62\xC1\x36\xE9\xC8\x10\xCB\xA8\xBC\xCB\xB9\xB7\xD0\xCD\xDA\xCC\x3A\xD1\x88\x47\xCB\xE6\xC4\x38\xFE\xCE\xEA\xA9\x67\xCC\xCB\xA5\xAF\xB4\xCD\xFA\xC6\x1B\xC6\x04\x54\xCB\x7C\x06\x25\xC4\xB6\x01\xCC\x18\x95\x2E\xCC\xB7\xA0\xC8\xA7\xC6\xBF\xA3\xCA\x17\xCF\xB8\xC9\xF7\x84\xD0\xD4\xCA\xBE\xC9\x3B\xAE\xCA\x99\xCA\x12\xCD\x26\xF0\xCC\x7B\xBB\xC0\xCF\x2A\xC5\xCC\x74\xC9\x33\xC2\x40\xFB\xB9\xB6\xCB\x7F\x7C\x30\xC5\xCB\xD0\xC8\x1F\xA9\x2B\xF3\xCB\x7C\xB0\xC1\xB1\xF9\x82\xCD\x36\x91\xCE\xC1\xC1\x8B\xCB\x10\xD3\xAA\x9E\x2C\xEB\xCA\xC6\xC9\x18\xC8\x2C\xF5\x9A\xBE\xCB\x70\xB9\x2C\xC1\xCB\x21\xCF\x1D\xCF\x33\xE4\xD0\x60\x90\xD1\xC0\x28\xD9\xCB\x2A\x7A\x85\x8A\x4C\xB4\xB7\xEC\xB6\x8C\x70\xDF\xB3\x69\xED\xB5\x10\xD8\xDD\x93\xB7\x42\xD1\x8E\x76\xDF\xB3\x75\x3A\x6B\x78\xB6\x23\xE5\xB7\x9B\xC8\xAB\xC9\x3B\xBF\xCF\x4A\xC1\x00\xD2\x45\xE2\xCA\xF6\xC8\x0E\xD4\x29\xAC", "\xCB\x0F\x77\xBB\xCA\x0D\xE9\xD0\xA2\x90\x03\xD8\x2D\xF4\xBD\x0F\xD1\xA8\xC8\x69\x92\xD0\x0D\xD0\x39\xC5\x41\xDF\xD1\x66\xD0\x06\xDB\x30\xD1\xCC\x23\xCD\x6A\xB5\x43\xDB\xA2\x95\xCD\xBB\xC1\x22\x9D\xCC\x70\xC0\x18\xC2\x32\xEF\xD0\xB2\xB5\x0C\xD9\xFA\x85\xCC\x28\xD1\x1B\xDA\x42\xEA\xCC\x79\xD1\xB5\xCB\x89\xA6\xD0\x7C\xBD\x20\xD7\x41\xFC\x91\xE2\xC0\xC1\xC2\x29\xEB\xBE\x91\xB6\x0E\xDB\x31\xC6\xCD\x63\x80\xFC\xC6\x39\xC1\xA7\x48\xA8\xE7\x7C\x3C\xD7\xCE\x7C\x91\x26\xD4\x11\x03\x81\xEA\xCC\xF7\xC8\x3A\xCA\xB8\xBC\x7F\xF6\xC6\x3D\xF7\xCD\xB2\x8C\xD9\x76\x4A\xC7\xCF\x8E\xC4\x43\x0A\xCD\x9A\xD2\xB7\xCF\x29\xDD\x3D\xFB\xB9\xA0\xD1\xF5\xCC\x4A\xDE\xC0\xC3\xC7\xFB\x7B\x49\xE8\xD2\x9E\xCE\xD0\xAA\x4A\xEE\xCF\x97\xD3\x2C\xD6\x8A\x89\x7B\x95\xD3\xEA\xC2\x4A\xEB\xCF\x2F\xBA\x2E\xD1\x4B\xF7\xD2\x78\xCC\x4C\xA0\x4B\xEB\xD2\xE3\xCF\x8C\xC9\xCF\x85\xD3\xC3\xCE\xE4\xCF\x38\xDE\x8A\xD4\xD1\xF3\xC5\x4D\xD8\xCE\x51\xA7\x2F\xD1\x3A\xD6\xD2\xF6\xCC\x14\x97\x38\xD0\x91\xB5\xD3\xFB\xC6\x4C\xDD\xB9\x76\xA1\x36\xDC\x49\xF2\xD2\x52\xC8\x93", "\xB5\x4A\xC0\xD3\xE1\xD3\x97\xBC\xC1\xAF\xD3\xDF\xD3\x39\xDC\x4C\xF6\xB9\x35\xBC\xA5\x85\x4E\xC1\xD3\xD6\xD3\xF5\xC9\x39\xFA\xBC\xDE\xD1\x7F\xC6\x4F\xD1\xD3\xE9\x71\x98\xBF\x4C\xF0\xD3\x62\xCE\x6E\xCE\xB3\x6A\xD3\xBC\xD1\x43\xDA\x38\xD5\x9D\x0C\xD6\x30\xDC\x4E\xC8\xD3\x21\xBE\x3E\xDB\x4B\xD2\xD4\x9E\xAE\xC9\xBA\xDF\xBB\xD3\xF1\xD1\x47\xD7\x14\xF9\xD3\xE4\xD3\x45\xDD\x4F\xC1\xA7\x73\xC4\x3D\xD2\x50\xDB\xD3\xC7\xD3\x30\xD0\x22\xE0\xCE\xCA\xD0\x34\xD5\x3F\xDF\xBB\x16\xC8\x40\xD6\x52\xF1\xCD\x28\xD7\x44\xD3\xED\xAF\x9F\x01\xD4\x4D\xDA\x4D\xFB\xD4\x50\xC7\x40\x04\x3D\xE1\xD4\xCB\xD0\x41\xD7\xEA\x90\x04\x35\xC9\xD6\xB7\x23\xDD\x7F\x22\xD4\xEC\xC3\x20\xD8\x92\xBC\xB2\xF8\xCD\x1C\x9C\xD4\x09\xD7\xEC\xC5\x22\xD0\xC6\xE0\xCD\xB0\x69\xDF\x87\xD4\xF5\xD1\x4D\xD7\x4F\xFD\x92\x58\xBC\xD8\xBA\xF5\xB3\xD4\x5B\xD6\x43\xD9\x3C\xF2\xCF\x97\xC4\x44\x04\x3F\xF6\x90\x50\xD4\xF9\xCF\x52\xCC\xC8\xF8\xCF\xAD\xB9\x53\xE1\xD5\x18\xD7\xBF\xAE\x49\xD0\x04\x69\xD6\x54\xD1\x4A\xCB\xD5\x82\xBF\x5B\xD2\x54\xC3\xD4\x1F\xCB\x40\x04\x35\xD6\xD4", "\x41\xD7\x5A\xDD\xE6\x99\xCD\x80\xD6\x4B\xD1\x3D\xF0\xD4\x33\xAC\x58\xDB\x57\xDA\xD5\x38\xBF\x27\xD9\x54\xE9\xD4\xA2\x93\x5C\xD0\xEA\x41\xD6\x87\xD4\x5B\xD7\x36\xC8\xD5\x94\xD7\x5D\xDA\x22\xD4\x04\x6C\xCC\x18\x95\x57\xC8\xCF\x4A\xD6\xFE\xB3\xA7\xBA\xD5\x82\xD4\x68\xD7\x53\xD7\xD6\x2D\xD4\x42\xDA\x56\xCD\xCE\x81\x5C\x76\xC8\x56\xCF\xD6\x36\xD4\x5E\xD9\xE3\x91\xD4\x23\xD5\x5C\xD6\x12\xC4\xB4\xB4\xD5\x68\xDB\x58\xFA\xC7\x00\x03\x38\xDB\x51\xF0\xD6\x70\xD4\xA6\x9C\x38\xDE\xD6\xC0\xD7\x81\xCA\x55\x8A\xD6\xA5\xD4\x38\xD2\x88\xB9\xD6\x90\xD5\x70\xD8\x46\xB1\xD4\xBB\xCC\x73\xD1\x5B\xCE\xD7\x2A\xD4\xDF\xAC\x52\xC2\x81\xC5\xD5\x72\xD7\xFC\x46\xD4\x8E\xD5\x66\xD6\x4B\xCD\xD6\x8F\xAC\x76\xDE\x5D\xE6\xD3\x8C\xD4\x61\xA2\x5D\xD4\xD7\xD3\xD7\xBF\xAC\x63\xB4\xD5\xD9\xD5\x65\xDC\xC1\x5A\xD4\x58\xD7\x49\xDC\x53\xE2\xD5\xCF\xD7\x4A\xDE\xF0\x98\xD6\x86\xD6\x66\xD6\x5C\xCA\xCF\x50\x93\x91\x9C\x5E\xE3\xD7\xFC\xD0\x37\xD6\x5F\xEA\xC5\xF8\xD6\x6A\xD6\x57\xDF\xD7\xCD\x85\x49\xDC\xFC\x6D\xD7\xFA\xD5\x5F\xD2\x10\x13\xCC\xF1\xD6\x4E\xDB", "\x4E\xE8\xD7\x9E\xAF\x4F\xDF\x5B\xC0\xD8\x1E\xD4\x8E\xB5\x54\xDE\xD5\x47\xD5\x6A\xD9\x55\xF3\xD7\xB6\xD5\x89\xCF\x3D\xFA\xCF\xE1\xCF\x79\xDB\x5B\xD3\xD8\xFF\xA8\x55\xD4\x62\xD6\xD5\x26\xDA\x76\xD5\x5E\xE5\xC8\x5D\xD5\x93\xCF\x55\xCB\xD8\x18\xD9\x54\xD5\xA6\x8C\xC9\x55\xD6\x93\xC4\x63\xF9\xD7\x08\xDA\x7B\xD9\xCE\x79\xCF\xF7\x07\xFE\xCB\x63\xC6\xD8\xA6\xD4\x3A\xDD\x1A\xDE\xD8\xF2\xD4\x8A\xD4\x3B\xC4\xA1\x05\xDB\x87\xDA\x64\xFE\xD8\x71\x79\x8B\xD0\x65\xFC\xD5\x25\xC8\x61\xD0\x54\xFC\xD8\xE4\xD4\x88\xD3\xE1\x92\xD9\x0D\xDB\x94\xD8\x37\xDF\xD6\xCA\xD7\x6A\xD0\x46\x92\xD6\x73\x7C\x83\xDD\x63\xC1\xAD\xCE\xD1\x77\xD8\x65\xC1\xD8\xCD\xD6\x4F\x8D\x59\xC5\xD6\x44\xD9\x98\xD2\x4D\xE8\xD6\xE2\xD7\x9A\xD9\x61\xED\xB9\x69\xDB\x7F\xD6\x67\xF6\xD8\x43\xD4\x8D\xB8\x5C\xDE\xD9\x5A\xD8\x45\xD2\x10\x3D\xCD\xC4\xD5\x8D\xD2\x66\xF7\xCF\x03\x06\xE0\xC5\x68\xFB\xD9\x87\xD8\x79\xCC\x10\x3E\xD6\x11\xD8\x85\xD7\x62\xC1\xA7\xC3\xD4\x9C\xDE\x64\xF4\xD7\x6D\xD9\x73\x89\x0B\xD7\xD8\x8C\xDB\x81\xDC\xD6\xA2\xD0\x7F\xD9\x97\xD2\x6A\xC8\xDA\x9F", "\xCF\x7D\xD8\x64\xD2\xD8\x98\xD9\x7A\xD5\xF6\x8A\xD8\x4D\xD9\x92\xD9\x6A\xD2\xDA\x89\xAC\x97\xD7\x66\xF3\xDA\x9F\xDB\x40\x0D\xD2\x91\xDA\x93\xD9\x88\xDF\x36\xD0\xD4\xA4\xD4\xA0\xDF\x64\xF0\xC0\x6B\x66\x4F\x80\x66\xD4\xD9\xA3\xD9\xAD\xD6\x3B\xE1\xDA\xB4\xD8\x9B\xD6\x64\xFF\xD3\xD1\xD5\xAF\xD5\x6C\xCA\xDB\x9B\xD4\xB3\xD1\x3C\xCE\xDB\xC9\xDB\x9D\xD5\xA6\xAC\xDA\xA7\xD8\xAC\xDE\x6B\xE4\xD4\x48\xC4\xAE\xDE\x62\xC1\xDA\x52\xBB\x8A\xC3\x64\xD7\xDA\xBA\xD9\xB5\xD2\x16\xC0\x00\x16\xDA\xB7\xDB\x6D\xE5\xDB\xC6\xD8\x00\x0B\x61\xF2\xD8\x1D\xD9\x9D\xD1\x67\xC4\xDB\xC9\xD8\x75\x9D\x23\xE3\xDB\xAE\xD8\xBB\xD0\x6D\xE9\xD8\x42\xC8\xBE\xD8\x6A\xFA\xDB\xF1\xD2\x65\xC8\xF4\x98\xC6\xB2\xD9\x96\xDF\x6B\xFF\xCE\x64\xD7\xC0\xD6\x56\xC5\xDC\xFB\xDB\xB7\xDD\x53\xD3\xC9\x6E\xD4\xFF\xC0\x46\xD9\xC9\x89\xC3\x1C\xD3\x40\xD9\xD1\x16\xDF\x9E\xBC\x45\xE9\xCA\x9F\xC3\x7E\xA5\x46\xCB\xD2\xA2\x90\x1A\xD3\x46\xDA\xB6\x0A\xCF\x7E\xAB\x41\xCF\xCB\x8A\x9B\x9E\xC2\x31\xDA\xC1\xC3\xC0\x08\xDC\xA8\x48\xD2\xA8\xB6\x22\xD7\x45\xF1\xCC\x2B\xD2\x05\xD3\x73", "\xFB\xB9\x30\xDC\xDD\xB2\x73\xED\xD0\x7B\xD2\x0C\xD0\x43\xDA\xD1\x50\x91\x23\xD3\x41\xCF\xD2\xE5\xC1\x24\xD8\x6C\x8C\xDC\xD6\xD9\x2B\xD3\x0F\xC8\xDB\x06\xDF\xAB\xD5\x3E\xF9\xD2\xF2\xD8\xB9\xD5\x5B\xD3\xDD\xF5\xD6\x5F\xD8\x74\xFC\xD9\xF4\xD8\x35\xB7\x75\xCD\xDA\x0D\xDD\x89\xCF\x4A\xEA\xD9\xF3\xDB\x8B\xDF\x6C\xCA\x96\xC3\xDA\xD8\xD6\x6E\xF1\x6D\x64\xDB\xEA\x76\x68\xDE\xDA\xB5\xCE\x2F\xDC\x74\xDD\xDD\x63\xDD\xB9\x94\x4C\xD4\xDB\x4D\xDC\xC0\xD2\x77\xC9\xD3\x51\xDD\xBE\xD4\x75\xD9\xDA\x25\xC9\x9E\xD3\x59\xDD\xDA\x45\xD9\xB4\xDE\x67\xFE\xDB\xDA\xD9\xDC\xD8\xE3\x84\xDA\x96\xDA\xDE\xDA\x5B\xCE\xDC\xC1\xA6\xA2\xD9\x78\xFF\xDB\x7B\xDE\xAA\xD5\x22\xD0\xDA\x60\xDE\xD4\xDB\x78\xEB\xDB\xC2\xD7\xD6\xDC\x76\xC4\xC4\x10\x07\xA6\xDA\x6E\xC6\xDE\x9B\xDF\x72\xD4\x77\xF0\xDD\x67\xDF\xC1\xBD\x6D\xD5\xDE\x8A\xDC\xDF\xD0\x7A\xEF\xBC\x27\xCA\xB0\xD6\x66\xF5\xDD\xED\xD0\x77\xDA\x67\xE1\xDD\xE0\xDA\xE4\xD7\x63\x9A\xDE\x81\xDD\xAE\xDD\x4E\xC2\x8E\xA8\xDC\xE4\xD7\x79\xEB\xDE\xD4\x77\x7A\xDF\x77\xF4\xDE\x07\xDC\xEC\xDB\xE7\xB0\xD7\xBD\xDD", "\xE1\xD5\x7A\xD7\xDB\xA7\xDF\xEC\xD6\x79\xEA\xDE\xCB\xDD\xF6\x7D\x7C\xC3\xDF\xCF\xDE\xED\xD1\x7D\xC7\x7F\xD8\xD9\xDE\xDE\x7B\xD0\xDF\xC6\xDD\x75\xD5\x6A\xC4\xD8\xD9\xDA\xEE\xDF\x7B\xE4\xDA\x72\xD0\xE1\xD2\x7E\xDC\xDF\xF2\xD3\xF0\xA3\x7A\xC9\xDD\x59\xDD\xAD\xBF\x6E\xF9\xD8\x31\x6D\x58\xBE\x7A\xEB\xDD\xB9\xDE\x83\xD2\x9C\x8D\xD5\xB8\xDE\x9C\xD5\x7F\xF6\x90\x2A\xD9\x90\xD2\x19\xEB\xDF\x58\xDE\xD9\xD1\x3F\xEC\xCF\xA9\xB9\xFE\xDD\x7E\xC1\xDC\x14\x04\x8E\xDB\x62\xFA\xD8\xAD\xDB\xF6\xD6\x7D\xDD\xDF\x06\xAC\x43\x00\x64\xFD\x08\x42\xDB\xC9\xC8\x72\xE2\x9F\xE4\xC9\xC5\xDE\x72\xF8\x99\x08\xD1\x21\xDA\x40\xD8\xD1\x71\xD2\x17\xDB\x0E\xD8\x9A\x62\xD1\xD1\xC8\xDA\x9F\xDC\x37\xDC\x1F\x92\x72\xE6\xE0\x74\xBF\x1A\xD3\x82\xEE\xD1\x26\xDC\x1C\xDC\x47\xC1\x6B\x13\xCF\x0B\xEC\x47\xB5\xD1\x0F\x74\x1E\xD3\x08\xF8\xBD\x3D\xDF\x1F\xD4\x74\xFB\xDC\x1D\xD1\x0F\xE1\x27\xFF\xE0\x7E\xD3\x10\xE0\x2C\xE4\xCC\x1B\xE0\x09\xB4\x48\xFB\xE0\x71\xC3\x0A\x82\x74\xE9\xD1\x05\xCF\xB4\xCE\x81\xE8\xCC\xEC\xC3\xD1\xD7\x25\xD3\xDC\x3E\x84\x15\xD4\x0E\xD6", "\xD1\x3C\xDF\x7A\xAD\x81\xCC\xE1\x7A\xD2\x17\xE8\x71\xC9\xE1\xE9\x71\x09\xEB\x43\xE4\xD1\xB1\xCB\x0C\xE7\xD4\x6E\xE0\xFD\xCC\xA5\x89\x41\xD1\xB0\x27\xDC\x0B\xD1\x84\xF9\x8E\x9B\xDA\x1D\xDF\x03\xB5\xE0\x6D\xE0\x14\x98\x83\xDA\x75\x3A\xE2\x23\xCD\x85\xC7\xD2\x35\xDC\x1B\xD0\x72\xE9\x6E\x39\xDD\x06\xB0\x84\xE9\xDC\x90\xCA\xCF\xDD\x47\xC0\xDD\xFA\xB5\x21\xEC\xDC\x87\xE2\x18\xE2\x13\xE5\x29\xE4\xE1\xB4\xB2\x15\xE2\x71\xC2\xD2\xA2\x92\x16\xE5\x30\xDC\xE1\x73\xE0\x08\xEA\x86\xF1\x6C\x22\xE1\x1E\xEA\xDF\x9B\xDC\x65\xC9\xC7\xD1\x47\xE8\xE0\x7F\xE3\x19\xD5\x0A\xD9\xDC\xB5\xCB\x1B\xDC\x88\xC7\xD7\x9F\xE0\x60\x78\x87\xD8\xE1\xCD\x87\x1E\xEF\xDF\x7D\xE1\x1C\xD0\x22\xE7\x2C\xCA\xE2\x96\xBD\x11\xEE\x48\xC7\xE1\x00\x00\x24\xE4\xA1\xBB\xE2\x3E\xE0\x30\xE2\x8C\xC3\xA0\x8A\xB3\x12\xEE\x87\xDD\xE2\x98\x9B\x13\xE3\x72\xCC\xB7\x52\xE0\x18\xE6\x48\xFA\xC1\x96\xE3\xBC\xC6\x83\xD9\xE2\x1A\xE2\x05\xE8\x31\xD0\xC2\xB1\xE1\x88\x81\x8A\xF4\xE2\x36\x90\x29\xE1\x26\xEF\xE2\x14\x06\x19\xE3\x49\xE7\xE0\x69\xE0\x2F\xEB\x86\xE5\xDC\x71\xD1\x1C", "\xE6\x73\xE9\xE2\x7B\xB9\x1D\xEF\xD0\x73\xE2\x98\xE1\xEA\x66\x8B\xDC\xCC\xBE\xE3\xD0\xD6\x8C\xF9\xE3\x50\xE0\x11\xE4\x8E\xE6\x9A\x81\xE3\x35\xE4\x88\xC1\xE4\xA2\xE1\xE0\x5E\x8C\xEC\xE0\x19\xB1\x34\xEB\x8C\xFA\xE2\xC9\xB5\x35\xEA\x8D\xEF\xE3\xCC\xE0\xDB\xB9\x8D\xC5\xD0\xF4\xCB\x01\xD3\x86\xCF\xE4\x15\xE6\xA9\xCF\x85\xCB\xE4\x91\xE3\xBE\xCE\x71\xE9\xE3\xC5\xE3\x0C\xD3\x27\xEC\xE3\xDD\xE3\x0F\x8E\x8E\xC2\xE2\x29\xE2\x28\x92\x8F\xFB\xC2\x2C\xDF\x08\xDC\x8A\xC3\xCB\xCA\xE1\x2E\xED\x91\xE9\xCC\x71\xD3\x31\xE1\x04\xC4\xE3\x46\xE2\x48\xE1\x8C\xFC\xE3\xCF\xE2\x12\xC6\x93\xF3\xB2\x33\xAB\x24\xE8\x91\xE1\xD0\x03\x06\x24\xD8\x2A\xFF\x77\x47\xCC\xE6\xD3\x7E\xC3\xE0\x4B\xDC\xF1\xDE\x74\xF7\xD6\x50\xDE\xF2\xD0\x81\xE2\xD6\x4D\xA8\xFD\xDA\x7F\xE3\xB8\x56\xD8\xE9\xD3\x95\xE0\xD7\xAE\xD3\xEB\xDA\x95\xDF\xE5\xEC\xDC\xDE\xC0\x35\xFB\xDF\xC0\xDC\x2E\xDE\x3D\x96\xE5\x07\xE3\xB9\xDF\x66\xDB\xE5\x8C\xDE\xD2\xC8\x77\xD2\xE5\x60\xE7\xB9\xD5\x37\xD7\xE5\x69\xE5\xDC\x6E\x5A\xE5\xE5\x02\xE1\xDB\xD8\x78\xEC\xE5\x4A\xE5\xB8\xDB\x71\xA8\xE5", "\x79\xE7\x77\xCE\x5B\xE1\xE5\xB5\xDE\xE7\xA5\x69\xFC\xE5\x78\xE4\x6F\xDB\x69\xC4\xE6\xC5\xDE\x7E\xB5\x39\xCC\xE6\x4F\xE5\x89\xC9\x7D\xF0\xE5\x90\xE7\x26\xA3\x99\xE7\xDF\x0F\xE1\xDB\xDD\x14\xDC\xDD\x95\xE6\x5F\xAE\x95\xDD\xE6\x7B\xB9\x82\xC5\x98\xD8\xE6\x9E\xAE\xEC\xC4\x96\xD7\xDF\xB1\xC7\xE7\xA0\x98\xE3\xE6\xF6\xDF\x65\xED\x96\xD1\xDE\x54\xE6\x75\xD6\x6A\xCE\xE0\x94\xE4\x62\xD2\x9B\xE0\xDF\xB4\xE4\x69\xEB\x5F\xD2\xDB\xCB\xCF\x6A\xED\x98\xD2\xCF\x11\xAB\x67\xE1\x80\xD0\xA3\xC2\xE4\xD7\xD6\xE9\xBC\xB2\xF2\xDF\x6B\xEB\x94\xED\xDD\x23\xDA\xFF\xDE\xE9\x8E\xE5\x76\xDE\x42\xD0\xB0\xA7\xCF\xC5\xE4\xDB\xD2\x70\xC2\xC6\x04\xDE\x6F\xE1\x99\xC0\xDB\x00\x02\x02\xEE\x9C\xCC\xE0\xA9\xDD\x66\xE0\x9A\xFC\x91\x13\xE0\x63\x05\x81\xE1\xE7\xB5\xE6\x65\xD9\x57\xC0\xDE\x74\xE5\x6A\xE3\x96\xED\xE7\xAC\xE5\x89\xCF\x57\xC8\xE6\xA8\xE7\x35\xD8\x35\xD5\xE7\xA7\xE4\x14\x9C\x1B\xDC\xE6\xC3\xE7\x6F\xED\x9F\xD8\xD2\xF8\xE6\x25\xD0\x1D\xD0\xE7\xB0\xE7\x6E\xE3\x77\xEC\xE7\x75\xE4\x9E\xD1\xA0\xED\xDF\x03\xE9\xF5\xD9\x9E\xF3\xD9\x7D\xAA\x76\xE1", "\x9D\xE8\xC6\x7B\xE5\x5C\xEC\x9F\xEA\xE7\xE0\xC7\x82\xE9\x97\xD6\xA5\x12\xE9\x81\xE6\x7F\xC7\xE6\x16\xE9\xE8\xD1\xB7\x4B\xE6\xFF\xE6\xBE\xD0\xE5\x84\xE8\xCB\xE4\xE7\xD0\x5D\xD3\xDB\x08\xE9\x60\xE7\x77\xF7\xE6\x9A\xCE\x83\xEA\x9B\xCB\xD9\x79\xA5\x8B\xE1\x9F\xFB\xDA\x04\xC8\x8A\xE8\x7E\xC8\xE0\xAD\xCE\x8E\xE2\x9E\xF6\xE6\xC1\xDA\x72\xEB\xA3\xE7\xDB\x1A\xD7\x78\xEF\xA3\xF7\xAE\x30\xBD\x5F\xE7\xA4\xE8\xC6\xAE\xE6\x92\xEF\xA0\xEC\xDE\xC6\xCF\x8C\xEE\xA4\xFF\xAB\x4D\xE9\x62\xEE\x9F\xD8\xE8\xCF\xCD\x89\xEE\xA1\xD5\xC0\x3C\x0E\x86\xE7\xA3\xD4\x8A\xEF\xDF\x02\xE1\x7F\xDE\xE9\x8D\xE6\xBD\xD8\x7F\xDD\xE8\x29\xEB\xB9\xDD\x7F\xD4\xE0\xFF\xDE\x8D\xE7\xA5\xED\xB9\x31\xD8\xFC\xD4\x21\xA4\xE9\xDB\xE4\xA5\x8E\x9D\xEC\xE9\xB6\x9C\x9D\xE3\xA1\xFF\xD8\x11\xDE\x35\xE5\x90\xF5\x62\xFB\xA4\x27\xEC\x90\xDA\xE4\x17\xE4\x45\xE4\x94\xC9\xB6\x85\xE9\x02\xD4\x85\xE4\xE0\xFC\xC8\x25\xE7\xFC\x6B\xE0\x67\xE0\xC9\xDF\x8F\xCC\x04\x6F\xE0\xDF\xB7\x92\xC2\xE4\x3E\x87\x4A\xE9\x05\xD3\xEA\xA0\xD9\x49\xEF\x80\x78\xE2\x17\xE3\x30\xEE\x42\xEA\xE3\x31", "\x6F\x4F\xEC\x83\xF4\xE4\x9E\xE8\x45\x06\xAA\xCD\xE1\x42\xE3\x2F\xEA\x93\xEB\xEA\x61\xE0\x20\xE1\x93\xE1\xEA\xC8\xE1\xB0\x92\x94\xC6\xEA\x19\xA2\x43\xE8\x9E\xD2\xE9\x38\xE9\x54\xEC\xAB\xF5\xE7\x61\xA8\x9A\xE3\xA4\xF8\xB8\xF3\xE5\x88\xE9\x9F\xED\xDD\x59\xE6\x91\xE0\x97\xDD\xCD\x6E\xE9\x9D\xE4\x9F\xCF\xEB\xC6\xEB\x88\xBF\x9E\xC9\xE8\xC7\xEA\xBD\x9A\xA7\xDB\xE9\x60\x93\x5A\xE1\xAD\xD4\xEB\x74\xCF\xB5\xEB\x9C\xCD\xE8\xBB\xEA\x90\xE9\x99\xED\xD6\xDE\xE8\xFA\xD1\x78\x55\xE8\xCA\xEB\xAF\xEC\x94\xC9\xDA\xE5\xEB\xB8\xE1\x13\xED\xEB\x8C\xC5\x3A\xD2\xAC\xCB\xE9\xE9\x70\x89\xE7\xA1\xD6\xE7\xF3\xD2\x8F\xEF\xA4\xFD\xD9\x03\xD9\x8C\xE1\xAE\xD3\xE9\x34\xE8\x6F\xED\x5F\xF0\xEB\x06\xEA\x25\xA2\xA3\xE2\xEB\xF1\xE9\x99\xBB\xAF\xDC\xEB\x66\xE6\x7B\x64\xB0\xC1\xEC\x0D\xC8\xC2\xEA\xAE\xF5\xBA\x45\xEA\x96\xE9\xA6\xC8\xE9\xAD\xDE\xC4\xEA\xB1\xD2\xE6\x1C\xCA\xC5\xE3\xAC\xE0\x7D\x1D\xEF\xBD\xE5\xAD\xDF\xD4\x49\xEA\x95\xEE\xAC\xE9\xDF\xAF\xA7\xBC\xEB\xB0\xE9\xE6\x16\xD9\xBA\xEB\xB1\xE0\x91\x61\xEB\x77\xE3\xA6\xEA\xEC\x13\xEE\x62\x9D\x9C", "\xF8\xE9\xE3\xA0\xCD\xEF\xB2\xE9\xB8\x6D\xB5\xBF\xD7\xB0\xC0\xEC\xAC\xD4\xAA\xB5\x56\xCC\x04\x99\xC4\xD0\xE6\xB2\xC4\xCF\x77\xEA\x79\xEE\xCC\x67\xD5\x47\xEC\xB6\xE4\x7E\xE5\xE7\x0F\x74\x05\xCD\xB4\xD7\xEC\x1C\x73\xB4\xEE\xA2\xC6\xE7\x47\xD9\x6E\xEB\xB3\xD0\xEB\xDB\x99\xB3\xEB\xA7\xFC\xEB\xF7\xE6\xCE\xE6\xB4\xFC\xEC\x89\xD6\xBE\xE5\xB3\xDE\xEC\xF4\xEA\xD2\xDE\xAB\xDB\xED\xDB\xE9\x6A\xE3\x97\xCC\xEC\x57\xEC\x07\x7A\xAD\xEE\xEC\x63\xEC\xD4\xAF\xB0\xC1\xED\x70\xCF\xCA\xEF\xA5\xEB\xEB\x11\xEA\xD7\xEE\xB4\xCE\xDA\xD8\xD2\xD8\xE3\xB5\xE7\xD6\x3F\xBA\xE0\xE0\xAC\xC1\xA7\x83\xE4\xDA\xEB\xAC\xD2\xAA\x77\xED\xAF\xE2\x10\x36\xEB\x22\xE8\xBE\xEA\x6F\x4D\xEE\xF5\xD8\x7F\xDC\x01\xD4\xEE\x5C\xEE\xE5\xE3\xFC\x86\xEE\xD0\xEB\x77\xCB\x99\xD1\xEE\x23\xED\xDC\x68\xF1\x8A\xEE\x67\xED\xDC\x62\x9A\xEF\xE9\xA1\xEC\x07\x76\x9A\xF0\xE7\xA8\xEC\x75\x75\xB1\xE2\xEC\xAC\xED\x1C\x91\xB2\xE0\xEE\xB1\xEE\x65\xE3\xBB\xE9\xEE\xB8\xEE\xF4\xD0\x52\xED\xED\x7B\xED\xDB\xD5\xA5\xC7\xEE\x5F\xEE\xF3\xC8\xB9\xFC\xEE\x7C\xC7\xF0\xEA\xA2\xC0\x8D\x97\xB8", "\xE7\xE4\xBC\xC1\xA7\x37\xEE\xD2\xEF\x9C\xFF\xEC\x83\xEE\xBB\xEF\x18\xFE\xEC\xFF\xE9\xF4\xE9\xB0\xC7\xAC\xED\xCC\xF4\xE0\xBC\xFF\xED\xFA\xB5\xD2\xEF\xD0\x4C\xED\xDB\xEC\xD5\xE6\xE4\xA6\xBD\x43\xEE\x41\x02\xB5\xE1\xEF\x1F\xED\x3A\x76\xB5\xFD\xEE\x3C\xEB\xD2\xCA\xBD\xDD\xEE\xBD\xC5\xD7\xE6\xB6\xEC\xED\xC0\xE6\x46\xAA\xBC\xF4\xED\x60\x93\x7E\xE4\xBB\xF0\xED\xEC\xEC\xE9\xE5\xF6\xAB\xEF\xAD\xEC\xFF\xED\x4B\xAF\xED\x71\xED\xEE\xE7\xFC\x73\xED\xFE\xED\xDD\xEA\xDF\x84\xF0\xFD\xEC\xEC\xE7\xFC\x4C\xF0\x01\xF1\x01\xF4\xDD\x77\xE5\xE8\xED\xDA\xED\xB0\xE8\xEB\x09\xF2\xF5\xEF\xAF\x8E\xDE\xF0\xEE\x03\xF9\x9A\xC9\xEE\x1E\xF1\x03\xFC\xC1\x60\xE8\xF8\xED\xE5\xED\x79\xC6\xEF\x2F\xEB\x45\xB7\xBF\xD9\xF0\x1A\x8F\xED\xE5\xBB\xDC\xEF\x99\x96\x0B\xF2\xC0\xE7\xEC\x8A\x97\xE7\xE6\xC0\xD2\xF0\x2C\xB4\x0A\xF8\xB5\xFD\xE8\xEF\xEF\xF2\xE6\xA2\xF2\xC2\x7A\xED\x04\xFB\x02\xAF\xEE\xFB\xEC\x0E\xFB\x21\xFB\xEE\x25\xF1\x07\xF0\xB2\xC8\xF1\x2C\xF2\x12\xF0\xA5\xD7\xD7\x41\xF0\x0D\xF4\xB2\xD9\xEC\x0A\xF1\x12\xF5\xEB\x99\xE9\x21\xF2\x10\xFD\x4B\xED", "\xEC\x4D\xF2\x0F\xF8\x69\xB1\xEC\x38\xEF\xCC\xEE\xB7\xE2\xEF\x60\xEE\x40\x0D\xBC\xCF\x74\x4E\xD5\x15\xFD\xC5\xDF\x97\xD4\xE7\x0A\xF9\xC5\xD7\xBD\xD9\xED\xF5\xE5\xC1\xD7\xEF\xF1\x96\x67\xC3\xC6\xE9\xEF\x6A\xEC\xC4\xD7\xF6\x9F\xC3\x08\x9B\x1E\x0F\x2D\xDA\xC5\x31\x6E\x1F\xFC\xA9\xC3\x04\x9A\xE0\xD1\xD7\x2E\xC0\xF1\xCE\x72\x20\xFF\x92\xEB\xCB\x1B\xE4\x25\xC8\xC8\xC1\x6B\x8A\xF2\xA3\xE5\x2F\xE1\xE0\x7C\xF3\xC3\xC1\xC9\xC3\xE5\x8C\x6A\x39\xE7\x94\xD1\xB0\x63\xB3\x23\xF7\xD4\x57\xF2\xB8\xE9\xDC\x60\xA9\xE7\xE3\x2D\xE1\x25\xF5\x33\xC6\x04\xA0\xF2\xA2\xE8\x28\xDE\xB6\xAE\xE0\x31\xCA\x97\x69\xF2\x53\xE3\x2A\xFE\x41\xEB\xDC\xA6\xC3\x29\xF3\x10\x30\xF2\xD2\xE3\x07\xE8\x69\xB7\xE3\x81\xCA\x29\xFC\x33\xCC\x04\xB8\xF0\x47\xE2\xAA\xED\xEA\xFA\xE3\xAB\xEE\xCB\xE6\x69\xC1\xF2\x4C\xE3\xCC\xE8\xEA\xA4\xE8\x60\x7B\x06\xFE\xC2\x96\xF0\x4F\xE8\x90\xCF\xE2\xC7\xF1\x22\xF2\xCD\xD1\xEA\xD4\xF1\x2D\xFF\xCB\xE8\xF2\x3E\xCD\x1C\xDA\x90\xCE\xF2\x80\xF0\x60\x79\xCC\xF4\xEA\x37\xE5\x43\xEB\x9F\x89\xE5\x72\xE9\x88\x8A\x07\x3A\xF0\x6D\xB8\x00", "\xF2\xC5\xFB\xF0\xEE\xEE\x1C\xFE\xC4\xC2\xE8\xA4\xD3\xFC\xEA\xC6\xD8\xE8\xC9\xE9\x17\xFD\xBE\xE5\xED\x3D\xF2\x15\xFE\xCF\xFA\xF3\xE7\xDA\x3B\xF1\xBC\xC6\xF1\x1C\x98\x3B\xF5\x38\xDB\x94\x06\xF5\x1E\xFE\x76\xF6\xF3\x1A\xF0\x54\xE7\x96\xF7\xF1\x16\xF0\xDE\xC4\xC1\xF3\xF3\x33\xF0\xF1\xC8\xC1\xEF\xF1\x03\xF4\x6F\xDC\xC1\xDE\xF1\x64\xF1\xC3\xE0\xC2\xC5\xF1\x22\xF1\x3A\x74\xC2\xC0\xF4\xD2\xE4\xE4\xE7\xC3\xFD\xEE\x27\xE9\x3F\xF4\xD2\xE6\xDE\x4C\xF0\x46\xF0\xC3\xD3\xF1\x51\xE8\xFD\xEB\xC6\xF5\xE8\x0C\xF7\x1C\xFC\x95\xF9\xE8\x2A\xF6\x4B\xFF\xAD\xDC\xBC\x39\xF4\x48\xFE\x4F\xD1\xEC\xF7\xF2\x4F\xF9\x3B\x84\xF1\x27\xF6\x16\xF2\xBB\xED\xF4\x42\xF5\x46\xFD\x4B\xBF\xEE\x14\xF4\x41\xFD\x4B\xCC\xF5\x1C\xF4\x1E\xFD\xB0\xD0\xF5\xFF\xF2\x4E\xFC\x47\x98\xF1\x49\xF7\x4B\xF8\xE3\x9C\xF1\x56\xF5\x44\xFB\x02\xA0\xF1\xCE\xEF\x51\x79\x9C\xC1\xF5\x45\xF5\xEE\x87\xC6\xDA\x75\x69\xF1\x43\xF4\xD6\xD4\x77\x6B\xE9\x58\xFB\x8E\xAE\xF1\x59\xF7\x9E\xB1\xA7\xE2\xE9\x73\xE8\x5C\xF5\xD6\xDB\xA2\xDE\xEE\x56\x70\xBE\xCD\xF5\x21\xF5\x19\xF4\xBE\xCA\xDC", "\x0C\x07\xF9\xEC\xD7\xC6\xF5\x9B\xA2\x40\xFA\xD5\xD2\xEE\xF1\xF2\xD6\xEB\xD6\xD7\xCD\xB2\xC5\x42\xFC\xD8\xC0\x00\xF9\xF1\x57\xFB\xB8\xE6\x9B\x8E\xF6\x53\xFF\xCE\xC8\xF6\x4D\xE5\x4F\xF7\xD7\xE3\xD2\x79\xED\xE9\xE1\xD7\xFC\x91\x08\xF2\x64\xF3\xB1\xE0\xEB\x8A\xF6\x5A\xFF\x6C\xE4\xF6\x51\xF2\x52\xF9\x3B\x93\xF4\x51\xF6\x57\xFD\x4B\xD7\xF4\x9F\xF6\x6B\xFD\x78\xD5\xF6\xCF\xC7\xBB\xE6\xD7\xEF\xF0\x7B\xBB\x48\xF2\xDA\xD0\xEC\xED\xC7\x6D\xFC\xA0\xF9\xEB\x9A\xF4\x6E\xFE\x97\xC2\xEC\x97\xEE\x6F\xF6\xD9\xF6\xEE\x48\xF7\x66\xFD\xD1\xF9\x9C\x36\xF2\x70\xF2\xDB\xDB\xA2\xA3\xEF\x6E\xFB\xD8\xF9\x9C\xA7\xEF\x65\xFA\xDC\xF1\xCE\xB4\xF7\x4F\xF1\x1A\x90\xF4\xA9\xF5\x3B\xD4\xD5\xEB\xF4\xC7\xE9\xCE\xBD\x6C\xDC\xF7\x9E\xF4\xF3\xD9\xDC\xCE\xF7\x93\xF7\x8A\xED\x9B\xE4\xF7\x32\xF4\x96\xE9\xDD\xE7\xEC\x4D\x98\x7B\xF3\xDD\xFC\xD6\x60\xF7\x43\x73\xD6\xE6\xF6\x36\xF5\xD9\xB7\xD6\xFF\x77\x69\xF5\x7E\xF3\xDF\xFD\x92\x6D\xF7\x43\x78\x3E\xE0\xF7\xF4\xF0\xF6\xE5\x80\xC6\xF7\x7D\xF7\xF1\x79\xD7\xFF\x77\x7B\xF5\x6B\xFD\xDD\xD5\xDD\x7A\xF1\xF9\xE3", "\x01\xEF\xF7\x6E\xE7\xDA\xEF\xDF\xF0\xF7\x59\xEF\x83\xF2\xD5\xF9\x9C\xC5\xE9\x55\xF8\xD9\xE1\xED\xF2\xF4\x7E\xFD\x6E\xFA\xEF\xD7\xF7\x73\xF7\xD8\xE5\xF8\x9E\xAE\x61\xFB\xDC\xC9\xF8\x39\x9C\x04\xF6\xDD\xE8\xF7\x6E\xD8\x85\xFC\xD9\xE3\xD6\x21\xFA\x7F\xFC\x9D\xEE\xF8\xAA\xF5\x8E\xF8\x69\xAC\xF6\x1E\xF9\x78\xF2\xA8\x88\xF8\x84\xF5\x3B\xDB\xD1\xFD\xF8\x05\xFB\xA3\xD2\xE3\xC2\xD8\x03\x06\x6E\xF1\xDB\xF4\xF1\xBD\xF5\x8D\xF3\xD8\xC1\xA7\x8F\xE4\x81\xFF\xDB\xC4\xF7\x9B\xEE\x93\xFE\xE0\xCF\xDD\xDF\xDE\xBF\xE5\xDA\xF6\xF8\x26\xF0\x53\xC7\xE4\xC3\xF7\xF9\x76\x95\xF4\xE4\xCD\xEC\xD5\xF6\x8E\xFB\xE2\xFD\x92\xAB\xED\x45\xF7\xE2\xEE\xEE\x5F\xFB\xB2\xDA\xDE\xC3\xEC\x40\xFB\x8B\xF8\x7D\xF2\xF0\xC7\xF7\x9A\xF3\xE7\xE7\xF7\x6A\xFB\x99\xF7\xD4\xE5\xEC\x5C\xFB\x93\xF5\xE1\xCF\xD8\x6D\xF8\x93\xFE\x53\xC1\xFA\x37\xF7\x40\x05\xDF\xDA\x75\xF7\xF5\x9F\xF7\xE5\xFA\xF7\xF7\xD9\x70\xF9\xE7\xE0\xF9\xE6\xCE\x84\xF1\x5E\xB1\xF9\x66\xF8\x1F\x93\xD7\xF2\xEC\x75\xF6\x98\xF2\xE5\xF9\xB5\x76\xF1\x4D\xFE\xE7\xDC\xEF\x2C\x89\x9F\xE6\x0D\xFE\xCB\x14", "\x07\x38\xF2\x87\xF7\x71\x1F\xCD\x1F\xF1\xD9\x85\xF2\xC0\xE3\x21\xF9\xEA\xD1\xF3\x83\xF0\xA2\xE4\xC9\xC7\x98\xB0\xFB\x22\xFE\x13\xA2\xE3\x7C\xBE\x17\xD5\x31\xF5\xFA\x92\xF3\x11\xCD\xA8\xE3\xFA\xAF\xF0\x48\xE9\x93\xE6\x69\x6B\xD3\xAE\xF6\xCB\xC2\x04\xA6\xF8\x44\xE3\xA8\xF7\xC9\xAD\xF3\x66\x71\xEC\xF1\xFA\xEE\xD1\xAA\xEC\xE8\x80\xCD\xD6\xF0\xB4\xFC\xCB\xE8\xB6\xA0\xE9\x2F\xC1\x2F\xCB\xC2\xC9\xF8\x4A\xE0\x8F\xC3\xD2\x35\xE4\xB5\xF0\xC9\xD7\xF3\xA4\xF2\x21\xE2\xEE\xDF\xF2\xE4\xFB\x26\xF9\x48\xE7\xFB\x81\xF1\xBA\xF6\x87\xF4\xC1\xEC\xFA\x38\xFD\xCD\xD2\xFB\x0C\x07\x37\xFA\x10\x06\xFB\xDB\xF3\x2D\xF6\x74\xE7\xF3\xBE\x9F\xE4\xB5\xD3\x58\xEA\xCD\x84\xAB\xFA\x93\xC2\xEA\x33\xE6\x27\xED\xCC\xDE\xE3\x62\xC9\x23\xF4\xCE\xC0\xE5\x39\x9E\x26\xFF\xEE\xD9\xF8\xB9\xF3\xA2\xE1\x41\xEB\xE2\xBD\xF9\x14\xCD\xEC\xD8\xF2\x23\xEB\x07\xD8\xF1\xDC\x70\xD7\xF8\xDD\xB9\xED\xCA\xFB\x05\xFC\xCD\xD3\xAB\xE7\xFA\x21\xFC\xCE\xD4\x90\xE0\xE3\x60\x92\x23\xEE\x93\xEE\xFB\xDE\xC0\xB4\xF7\x90\xD8\xF3\x4A\xC2\xBD\xF4\xF2\xCB\xF3\x55\xE0\xBF\xFC\xCB", "\x88\x43\xAA\xF3\xCC\xF5\xAB\xC6\xB6\x81\xE9\xC2\xF9\xA8\xF1\xF2\xDB\xE3\x24\xF4\xEF\xF7\xA7\xD0\xFA\xC3\xFF\xD0\x68\xE2\x11\xE6\x0A\xE4\xF1\xDB\xFC\xE9\x71\xA5\xE8\xDA\x97\xEA\x7F\xEB\x09\xF4\xCB\xF6\xFA\xB5\xE1\xCB\xDC\xF4\xE1\xBE\x43\xFC\x0D\xD5\xF1\xCC\xF3\x21\xE7\xCF\xD4\xF5\xE5\xD0\x27\xFD\x3D\xE8\x33\xE1\xFD\x83\xE2\x4F\x8F\xF2\xE5\xFB\xD0\xE3\xBE\xF1\x47\xE8\xF3\x8A\xFB\x3E\xF6\xE1\xE2\xF8\x8B\xF8\x43\x94\xE8\xCE\xF4\x00\x01\x87\xFB\xE9\xE8\xF4\xC8\xBB\xDC\xF4\x11\xDD\xE5\x94\xFA\x9D\xF5\xE7\xFA\xF9\xC4\xCE\x8A\xFB\xE1\xEC\xF8\x05\xF5\xDF\xF0\xF8\xD8\x9A\xA1\xF7\x92\xF3\xDA\xD9\xC4\x8E\xFB\xDF\xF0\xE9\xF4\xD9\x1A\xFA\x89\xFB\xE7\xBC\xF8\x77\xFD\x99\xEF\xE3\xDA\xFA\xD2\xF4\x77\xE3\xE4\xD5\xFE\x18\xF9\x79\xC8\xF9\xCA\xFE\x65\xBE\x92\xF8\xE2\xC5\xEC\x03\x06\x49\xF0\xE3\xFC\xF6\x94\xCE\xDE\xFE\xB8\xC5\xCF\x50\xF1\x79\xF7\xFA\xF1\xAE\x74\xF8\xE1\xF1\xE4\xFB\xB9\xCD\xF7\xA3\xF2\xF9\xFC\x91\xD1\xF4\xE8\xF7\xE1\xDB\xA2\x65\xFA\xDF\xF2\xFB\xF9\x8E\x69\xFA\xE3\xF7\xFB\xE2\x92\x44\xF7\xEB\xF0\xF7\xE2\xF7\x2C\xEA", "\xA7\xF1\xF7\xEB\xFE\xDF\xF5\xE6\xFA\xE8\xC8\xFF\xEB\xF6\xF2\xF3\xE6\xE9\xE6\xCD\xFE\xEE\xF0\xF7\xCA\x96\x58\xF7\xE8\xFD\xDE\xDC\x70\x5C\xF6\xF5\xFF\xFC\xD8\xCF\xE4\xB7\x0F\x89\xE8\xDF\xFA\x87\xFC\x84\xF7\x7F\xD2\xFA\x00\x01\x7F\xF4\xFE\xC3\xFE\xBD\xD1\x80\xFA\xD5\x43\xF8\xCE\xFF\xFA\xF2\x4A\x97\xFA\x61\xF1\xA6\xF2\xFD\xDC\xFE\x48\xED\xA7\xFD\xF8\xFF\xFE\x3F\xF0\x40\xA8\xFE\xC2\xF6\x14\x67\x6D\x7C\x82\x4E\xC2\x65\xD3\x38\xF7\x66\x69\x04\x80\x51\x7F\x42\x31\x1C\x6E\xD5\x7C\x32\x79\xF7\x5D\xE9\x50\x7D\xB8\x7C\xD4\x5A\xAE\x7A\x00\x8F\x30\x68\x00\xA8\xFC\x5B\x68\x0A\x7E\x6D\x7F\xAB\x7F\xD8\x78\x6E\x66\xC5\x59\xFD\x6B\x73\xCE\x7D\xAE\x36\x05\x82\xEC\x7D\x1C\x43\xE5\x6A\xFB\x28\x5B\xC5\x7C\x0A\x80\x07\x83\x04\x85\xF6\x6D\x0E\x4E\xFD\x74\x5E\x27\x72\x03\x82\x33\x3C\x05\x89\x92\x69\xDD\x1A\xEA\x11\x58\x13\x66\x19\x81\xB0\x34\x06\x8F\xED\x70\x8F\x56\xFD\x67\x61\x0D\x81\x03\x80\xCB\x7B\x66\x64\xEB\x6B\x01\x83\x01\xBA\x66\x45\x80\x07\x81\x07\x80\xDA\x7A\xF2\x64\x87\x4F\xF3\x2A\x80\x4A\x80\x1E\x81\xD2\x78\x26\x71\xEE\x69", "\x02\x82\x01\xAE\x7E\xB7\x75\x95\x66\xC3\x66\x08\x80\xED\x66\xCA\x4F\xFC\x10\x02\x6C\x7E\x78\x67\x06\x82\x09\x80\xA2\x65\x00\x90\x01\xE6\x34\x65\x81\x04\x82\x31\x33\x01\x81\xEF\x61\x11\x69\x01\x97\x80\x50\x49\x08\x80\xDD\x5B\x02\x83\x06\x88\x03\xBE\xFC\x33\x7D\x25\x67\xAE\x37\x1B\x84\x04\x89\x9F\x5F\xF5\x40\x01\xDB\x80\x64\x80\x61\x7E\xAB\x74\xD8\x7D\x06\x9F\x01\x7B\x01\xAD\x80\x36\x49\x17\x81\x06\x59\x06\x87\x06\x8E\xE6\x07\x02\xB5\x80\x99\x74\x8D\x7F\x1F\x83\xB5\x2F\x30\x6F\x04\xBD\x00\xF6\x71\x3F\x80\x2D\x80\x25\x84\x03\x86\x09\x93\x02\x83\xE4\x23\x7E\x62\x81\x20\x82\x23\x87\x08\x87\x42\x65\x04\x8F\x60\x1D\x81\xCB\x7C\x59\x75\x15\x81\x0F\x8B\x08\x68\x05\xA5\xFC\x60\x7D\x1F\x81\x9D\x72\x15\x83\x14\x88\x05\x97\xA1\x6C\x02\x88\x4C\xAE\x80\x9A\x7C\x35\x76\xE6\x71\xBA\x2C\x32\x4D\x93\x14\x45\x43\x69\xB5\x38\x12\x6F\x88\x6B\xDE\x43\x06\x96\xB7\x46\x68\xC7\x81\x22\x35\x77\x5A\xBF\x57\xDF\x52\xF1\x17\xD5\x14\x02\x4E\x68\xA3\x68\x14\x6B\x16\x81\xAC\x33\x05\x3F\xF1\x22\x81\xD5\x81\x55\x7F\x44\x72\x13\x8F\x5A\x28\x30", "\x56\x03\x90\x80\x19\x81\x50\x80\x20\x86\x4C\x3F\x0D\x9F\xFA\x60\x91\x72\x80\x19\x58\x3A\x80\x36\x87\xA8\x35\x0E\x9B\xFA\x5B\xA2\x46\x7E\x5A\x3B\x4E\x79\x1D\x86\x99\x3D\x0E\x97\xFA\x4F\xEA\x4B\x7E\x93\x81\x6E\x83\xC3\x65\x1E\x81\xCA\x71\x34\x57\xFC\x79\x81\xB3\x2A\x6F\x82\x0C\x77\xE0\x77\x87\x66\x05\x94\x04\x7C\x81\x39\x7E\x03\x69\x2F\x4D\xE3\x7D\x05\x66\x08\x90\x04\x08\x82\x40\x7E\x85\x80\xD7\x7B\xD8\x7B\x88\x77\x05\xBB\x03\xA4\x81\xEB\x7C\x6A\x80\x3B\x80\x23\x81\x73\x6E\x08\x8C\x04\x10\x82\x11\x7E\x59\x78\x31\x7D\x1F\x7B\x8F\x7A\x08\xB1\x6C\x20\x82\xC2\x79\x9D\x7D\xB4\x66\x9B\x7E\x11\x86\x08\x28\x04\xCA\x79\x2A\x82\x73\x7B\xDA\x7F\x57\x3A\x97\x38\x05\x17\x03\x86\x02\xA4\x37\x07\x32\x4D\x80\xDA\x72\xF0\x74\x33\x74\x04\xDD\x36\x3B\x82\x73\x80\x06\x87\xE7\x7B\x2D\x78\x09\xB5\x04\xF7\x80\xB1\x80\x75\x82\x51\x80\x28\x8E\x01\x84\x08\x8F\x60\x72\x81\x01\x37\xA3\x80\xB4\x7E\x04\x8F\x05\x8C\x08\x29\x00\xE5\x16\x52\x82\xA1\x80\x14\x4A\x11\x8C\xDC\x4C\x04\x98\x05\xCC\x82\xD0\x7D\x1B\x80\xDF\x59\x07\x84\x11\x19\x09\x94", "\x04\x41\x82\xEE\x81\x5D\x79\x26\x87\x0F\x63\x10\x06\x0B\x90\x04\x68\x82\xF6\x80\x9C\x73\x20\x85\x22\x81\xC8\x2E\x0B\x8C\x04\x70\x82\xFD\x81\x64\x73\x2A\x85\x2E\x89\x15\x89\x0B\xA6\xFC\x20\x81\x01\x81\xAF\x83\x22\x60\x2F\x89\x10\x99\xC8\x53\x04\xF3\x82\xBD\x71\xF6\x32\x5D\x86\x20\x04\x18\x91\x08\x86\x06\x9B\x51\x67\x7F\x13\x80\xDD\x5A\xE6\x72\x0E\x8D\x0B\xBD\x05\xF1\x82\x32\x83\x58\x81\x18\x82\xBF\x58\xDE\x41\x5A\x41\x03\xEA\x5B\x45\x68\x63\x80\x10\x6A\x34\x88\x4C\x53\x6F\x65\x06\xEE\x5B\x36\x49\x65\x81\xE0\x2D\x19\x89\xBA\x2F\x06\x90\x04\x51\x81\x1C\x6D\x69\x82\x45\x84\x03\x8D\x18\x81\x09\x9A\x00\xEB\x81\x31\x37\xDA\x81\x4A\x85\x9C\x7D\x4B\x5D\x09\x8E\x73\x0C\x80\xE3\x80\x67\x3A\x6E\x80\x26\x8C\x1B\x82\xC3\x78\x01\xA1\x80\x83\x82\xA4\x82\x53\x82\x12\x6D\x12\x83\x08\x03\x07\x8B\x7E\xA7\x75\x77\x82\x1F\x84\x1B\x81\x10\x8F\x98\x4F\x07\xBA\x7E\xC5\x82\x00\x54\x3E\x84\x3A\x84\xEA\x6F\x0B\xA4\xE4\x4B\x83\x10\x02\xAF\x80\x6E\x80\xB0\x37\x1D\x80\xF9\x7A\x02\xF1\x71\x92\x80\xEE\x83\x65\x81\x2F\x89\x31\x6B\x0B\x85\x05", "\x9B\x81\x4A\x81\xF2\x82\xB7\x7E\x13\x83\xF6\x60\x0C\xBA\x00\xC7\x3A\xF2\x82\x80\x7C\xD8\x7E\x3E\x8D\x08\x81\xD6\x39\x07\xEA\x80\xA3\x59\x40\x73\x7D\x81\x37\x8C\x11\x9A\xB9\x4D\x07\x82\x02\xFF\x82\x38\x82\x7E\x59\x32\x85\x15\x85\x6E\x47\x08\x80\x00\x09\x84\x3E\x81\x0E\x6A\x57\x74\x1D\x87\x7F\x7A\x04\xB7\x82\x16\x61\xF5\x81\x61\x87\x50\x70\x00\x1E\x0D\x81\x6B\x40\x83\x19\x84\xB0\x82\x56\x83\x14\x71\x0E\x81\x0C\x9C\xBF\x22\x84\x7E\x83\x1D\x61\x89\x81\x93\x56\x1D\x8D\x0A\x9D\xFD\x4E\x39\x50\x82\x16\x62\x86\x86\x31\x8C\x21\x94\x0A\x8F\x74\x57\x82\x27\x85\xE4\x80\xB4\x7C\x2B\x8A\x04\x62\x0F\xB2\x08\xA8\x84\x98\x82\x5C\x61\x7A\x84\x2D\x8E\xFE\x40\x12\xAC\x07\x82\x59\x2E\x73\x3C\x5A\x91\x83\x43\x8F\x72\x62\x10\xB1\xB1\x3A\x84\x23\x85\xC0\x2D\x13\x80\x90\x6E\xCA\x54\x0D\x85\x08\xE6\x7D\x51\x59\x25\x84\x8D\x85\x49\x8C\x1F\x89\x65\x6D\x08\xB5\x81\x2C\x83\x2C\x84\x94\x81\x45\x86\x6C\x54\x10\x9D\x75\x3E\x81\xD0\x49\xD1\x81\x31\x83\x4D\x81\x1A\x8C\x13\x89\xD1\x28\x83\xCE\x48\xD3\x80\x18\x4A\x35\x84\x11\x0C\x0D\xBE\x84\x2E", "\x83\x0C\x02\xD8\x80\xBC\x6A\x36\x8C\x09\x73\x11\xB6\x06\x95\x83\x41\x74\xFC\x82\x36\x85\xE7\x7A\xCD\x66\xD3\x11\x08\x88\x81\xE7\x81\x15\x86\x27\x7C\x40\x80\x0E\x84\x0A\x8D\xCC\x15\x6A\x21\x45\x43\x84\x24\x85\x39\x40\x0F\x9F\xEF\x31\x08\x90\x85\x3F\x40\x49\x87\x25\x87\x4D\x6B\x1D\x84\x12\x97\xC3\x0C\x85\x51\x85\xB4\x17\x3F\x84\x3A\x85\x0C\x6E\x0E\x83\x04\xAF\x84\x34\x71\x6A\x7A\x7F\x85\x25\x71\x47\x7F\xF8\x66\x08\x80\x61\xC2\x83\x2B\x85\x36\x7E\x95\x7A\x25\x9F\x13\x8F\x06\xA2\x7E\x7B\x82\x6B\x61\xA9\x80\x41\x82\x2B\x8B\xF9\x45\x0A\xB1\x85\x4C\x80\x27\x85\x38\x79\x52\x83\xEF\x60\x0F\xB5\xFB\x2A\x85\x82\x85\x2E\x82\x99\x86\x27\x4D\x19\x84\xDB\x42\x03\xEE\x84\xC4\x81\x36\x86\xB4\x87\x4D\x88\x0C\x8A\x13\x93\x0B\xD1\x85\x32\x3C\x3A\x84\x44\x06\x4E\x8D\x1C\x58\x13\x86\x04\x7A\x84\xE9\x79\x1F\x41\x7F\x58\x3A\x84\x87\x3A\x0F\xBE\xCF\x5B\x81\x5B\x84\x0E\x72\xA3\x84\x38\x8C\xF0\x76\xC8\x47\x07\xC1\x84\x0B\x69\xE9\x81\xBA\x84\x83\x36\x23\x9A\xEA\x2C\xE1\x0A\x84\x0E\x59\x51\x87\xBC\x85\x5E\x73\x24\x96\x15\x9C\x08\x8C\x82", "\xCC\x5A\x57\x86\xB9\x83\x44\x54\xF6\x73\x14\xBB\x07\xB9\x85\x47\x84\xB9\x81\x31\x7E\xEB\x74\x26\x9F\x04\x88\x0C\xCC\x84\x71\x36\x06\x87\x43\x3C\x32\x83\x1F\x89\x05\xBB\x02\xB3\x82\x86\x7E\x73\x74\xC4\x7B\xFB\x7E\xE3\x7B\x70\x6E\xFE\x36\x7F\xA9\x36\xBB\x7D\xFC\x7B\xF9\x74\x29\x51\xEC\x5E\xFF\x72\x7F\xA9\x36\x12\x7E\xF1\x7D\xED\x78\xFF\x60\xF5\x5B\x0C\xBB\x7F\xBE\x7F\x01\x7A\xEA\x7C\xFC\x69\xF8\x7A\xFE\x4A\xF0\x28\x7B\x1F\x86\xE1\x7F\x48\x4B\x66\x80\xB8\x63\x08\x14\xFE\x23\x86\x6E\x7F\x41\x6C\xCF\x87\x2B\x73\xEF\x57\xFF\x40\x0D\xE7\x6D\x1F\x7A\x9B\x87\xF1\x7C\x71\x79\x31\x92\xDE\x50\xCE\x46\x86\x27\x87\x5A\x5D\x94\x7F\x68\x80\xCF\x7D\xD7\x72\xD4\x50\x86\x4A\x86\x84\x6F\x9B\x7D\xB8\x7F\xF9\x79\x1A\xBC\xED\x37\x48\x4D\x87\xF4\x78\x4E\x7A\x9E\x74\x32\x88\x19\xBE\x84\x3D\x7F\xE5\x7E\xF6\x7C\xF0\x7B\x68\x85\xBF\x6A\xCD\x5D\x0D\xAB\x86\x5F\x87\xEA\x7E\xD7\x85\x6C\x8A\xDF\x52\x1B\xB0\x0D\xF4\x86\xD0\x7E\x38\x7F\xDB\x80\x64\x84\xA5\x71\xFD\x73\xFE\x6A\x86\xC4\x67\xEC\x7F\xDD\x86\x8A\x71\xDF\x78\x1A\x83\x0E\xE7\x6D\x87", "\x7D\xFF\x3B\xF8\x7C\x6E\x84\x38\x87\x8C\x4D\xFA\x64\x86\xD3\x7E\xFB\x70\xD6\x44\x7A\x7B\xE5\x66\x1B\xA8\xFE\x74\x5A\x07\x7D\xBD\x86\xCE\x87\x5F\x5B\xE0\x71\x60\x4D\xF8\x11\x87\x7F\x86\x51\x48\xD4\x72\xAB\x30\x00\x9F\xF7\x40\x08\xAD\x06\xE8\x84\x7F\x84\x63\x5D\x44\x83\x30\x91\x03\xAC\x0E\xA7\x87\x92\x5A\x79\x86\xEA\x82\x94\x7D\x29\x93\x1D\xBE\x03\xB1\x70\x61\x83\x7E\x87\x6E\x85\x5D\x8B\x10\x8E\x0F\xBB\x0E\xD1\x83\xB8\x85\x58\x80\xAC\x73\x1A\x7F\x17\x8F\x18\xBB\x0B\xD8\x7E\xC6\x84\x65\x65\xAF\x86\x09\x85\x2C\x88\x15\xB6\xA8\x6A\x7E\x9A\x83\x28\x6B\xA6\x81\xE0\x79\x3A\x9F\x1D\xAC\xEA\x46\x83\x49\x82\xE5\x82\xF3\x80\x14\x7E\x22\x94\x08\x81\x6B\x48\x7E\x16\x87\x89\x7D\x13\x67\x3B\x8B\x3D\x80\xEC\x10\xFD\x78\x85\x12\x5B\x58\x80\x3D\x70\x51\x84\x29\x40\x18\x8A\xC1\x02\x86\xB0\x87\x29\x86\x3F\x71\x54\x80\x90\x60\x0C\xAD\x0E\x8D\x71\x05\x87\xE9\x87\xC1\x82\x78\x8D\x3C\x9E\x1E\x8F\x0F\xCA\x85\xBC\x80\x3F\x74\xFA\x80\x22\x0E\x21\x87\xEA\x04\xFC\x67\x83\x2A\x85\x75\x84\xB9\x81\x56\x77\x71\x6F\x17\x89\x0C\xBE\x7D\x1F\x73", "\xA9\x81\xED\x86\x7A\x8C\x40\x90\xC1\x6D\xE3\x27\x85\xFE\x87\x98\x37\xFA\x86\x60\x80\x46\x4E\x1F\xA4\xC3\x70\x87\x03\x88\x86\x02\xFC\x85\x24\x84\x3F\x82\x21\xB9\x0F\xF4\x83\xCD\x64\xFB\x85\xFC\x87\x84\x81\x3E\x8C\xA4\x59\x01\xC7\x87\xAF\x5F\x65\x84\x05\x8E\x76\x86\xC4\x44\x14\xA5\x10\x86\x02\xE8\x80\xE6\x5B\x37\x72\x42\x83\x14\x8E\x20\x90\x0C\xD9\x4F\x11\x89\x1B\x8B\x40\x05\x5E\x8F\xDF\x37\x17\xBC\x10\xDB\x82\xFA\x84\x1A\x8A\xCA\x69\x8E\x6B\x41\x9A\x1F\x9D\x10\xBE\x87\xEC\x84\xE0\x85\xF1\x84\x7F\x81\x2C\x8A\x21\xA1\x10\x86\x02\x23\x88\x63\x79\x15\x8E\x78\x8A\x44\x81\xCA\x76\x02\x8D\x86\x3E\x42\x2F\x83\x43\x3B\x33\x80\x3A\x99\x9D\x5E\x0C\x9C\x86\x45\x7D\xCC\x78\xE4\x85\x65\x82\x68\x75\xFB\x6C\x0D\xA9\x78\x90\x7B\x37\x88\x86\x72\x65\x8C\x37\x88\x23\xB5\x11\xB7\x86\x2F\x87\xEB\x7F\x4C\x7D\xB3\x76\x47\x9B\x1C\x8D\x87\x35\x86\x87\x87\xAA\x84\xE4\x79\x67\x8C\xFF\x78\x34\x78\xF8\x31\x86\x72\x7D\x9C\x4F\xCF\x81\x6A\x81\x34\x93\xAD\x61\x0D\x84\x89\x28\x4C\x39\x89\x9B\x59\x69\x81\x48\x9F\xF0\x47\xB9\x12\x89\x65\x54\xD3", "\x7F\x1D\x8F\xB4\x70\xDC\x6B\x23\x94\x0D\xAC\x7A\x7C\x7C\xCB\x84\xCC\x83\xCF\x56\x37\x9B\x24\x9F\xFF\x48\x4E\x98\x88\xBF\x79\xEE\x7B\x6E\x8D\x38\x9C\xE1\x5E\x12\x8C\x89\x70\x89\xE0\x7D\x21\x89\x6D\x84\xFC\x69\x25\xB2\xC5\x7E\x86\x89\x89\x59\x88\x1F\x4D\x94\x8E\x47\x98\x23\x94\xF9\x30\x4C\xB6\x88\xBC\x64\x2F\x8A\x97\x83\xFC\x7E\x5C\x42\x0E\xA6\x89\xA2\x89\xA0\x55\xF7\x7C\x95\x81\xBF\x60\xFF\x4F\xD1\x62\x7F\xC1\x88\xC9\x87\xF9\x78\xB0\x76\x10\x0A\xFF\x4C\x0E\xFB\x88\x3D\x77\x36\x7A\xE6\x84\x98\x8E\xB9\x54\xFF\x6E\xF5\x76\x7F\xFB\x7F\xD0\x86\xE0\x6E\x20\x0D\x39\x9C\x7B\x5F\x0E\xEC\x88\x80\x86\x4C\x4F\xE8\x87\xBF\x30\x00\x8C\xB2\x7A\x6E\x02\x7F\xA2\x48\x91\x84\x40\x60\x4D\x8C\xF7\x7B\x80\x6E\x13\xB4\x5F\x8C\x7E\x70\x57\x3A\x5E\xDA\x48\x33\x85\x7B\x47\x12\x93\x7F\xF4\x89\xC0\x76\x3D\x8F\x2F\x7A\x64\x56\xED\x45\x14\x8B\x67\xE6\x30\xCF\x6D\x27\x88\x9F\x8F\x4B\x85\x7E\x7E\xD0\x1A\x77\xC0\x89\x87\x88\x2A\x8A\xA2\x81\xE6\x60\xA6\x6A\xB9\x14\x8A\xB0\x85\xB2\x5D\xF1\x7F\xCE\x71\x4A\x95\x75\x43\x13\xCB\x7A\xB8\x88\xE4\x79", "\x47\x8F\x3B\x67\x4C\x8C\xD9\x41\x14\x86\x7D\xC9\x77\x83\x88\x38\x57\x71\x8C\x50\x99\x26\xA8\xFF\x70\x7F\x1C\x38\x6F\x8B\x43\x3D\x68\x71\xB4\x45\x27\xA8\xB6\x67\x89\x38\x5D\x75\x89\x04\x5D\x9D\x89\x47\x94\x14\x70\x13\xA1\x86\x27\x8A\xFB\x76\x4A\x8C\x9F\x74\x36\x97\x27\x9E\xAE\x7F\x89\xA0\x7B\xA0\x8B\x42\x7B\xA4\x5D\x4F\x85\x91\x4B\x12\xE9\x39\xB0\x7B\x32\x57\xE6\x79\x6E\x34\x49\x87\xFE\x20\xE8\x30\x71\x79\x35\xA9\x87\x12\x7B\xA4\x80\xD3\x6D\xFD\x65\xBD\x35\x7F\x39\x4F\x55\x8B\x88\x58\x6D\x88\xDD\x78\x28\x95\x78\x4A\x8A\x1F\x8B\x3D\x7C\x15\x79\x68\x59\x56\x82\x29\xAB\x15\xDA\x86\x38\x6B\x81\x8A\xFA\x6B\xA8\x88\x52\x88\xCE\x4A\x15\xFB\x7B\x11\x58\x6B\x8A\xD4\x5A\x9B\x8C\x4F\x82\xDA\x54\x13\xDD\x57\x4A\x8A\x9B\x88\xDD\x58\xA7\x88\x1A\x7A\x29\xBC\xBD\x00\x80\xD0\x78\x0E\x82\x2E\x07\x71\x4D\x53\x8F\x9A\x4A\x15\xF2\x89\x0E\x5C\xA5\x88\x1D\x8E\x3D\x7A\x54\x88\x2A\xA2\x92\x00\x89\x0F\x79\xCA\x8A\x52\x8F\xA9\x84\xDD\x31\x2A\xA3\xB8\x53\x8A\x1B\x3E\xA5\x8B\x55\x89\x7D\x89\x55\x88\x2B\xA1\x14\x98\x4D\x6D\x8A\x4C\x4C\x58", "\x8B\x05\x42\x56\x84\xF3\x4A\x15\xB2\x89\xBD\x49\x8D\x8B\x11\x7C\xAB\x88\xB1\x71\xE9\x5C\xEC\x78\x7C\xB3\x8B\xB7\x89\xBB\x6D\xA4\x8C\x5B\x6B\x26\x94\x77\x09\x87\x11\x59\xC5\x86\xCD\x74\xA5\x8E\xB9\x4E\xFF\x7F\x77\x30\x8A\xE6\x4B\x38\x79\x4B\x8C\x9C\x8A\xFF\x65\x2A\x94\x04\x06\x8B\xA8\x5A\xC4\x89\x7F\x87\xA8\x3B\x58\x94\x3F\x46\x15\xA2\x56\x8F\x8A\xA5\x8A\xC9\x81\x9D\x33\x59\x9C\xAD\x7F\x14\xD8\x5D\x66\x8B\xE5\x62\x66\x89\xBC\x8B\x54\x9A\x27\xA9\xBB\x4A\x8A\x9E\x8B\x86\x74\x68\x8F\x6C\x52\x5A\x89\x28\xA6\x63\x5A\x8A\x4F\x79\xD9\x72\xE7\x51\xB5\x84\xFB\x6A\x2A\xAD\x16\xA9\x73\x64\x8A\x51\x48\x6C\x8B\xA8\x76\x5A\x98\x2D\xB8\xD3\x34\x8B\x5B\x8A\xDD\x8A\x47\x8F\xB4\x86\xFE\x7C\x2D\x9B\xF1\x4A\x8A\xC0\x8A\xBE\x5E\x70\x89\xF3\x44\x5C\x9C\xB7\x7C\x15\xCC\x8A\x7E\x8A\xEC\x70\x44\x04\xA6\x8E\x2C\x82\x08\x02\x16\x99\x58\x84\x8B\x32\x54\x74\x8C\xEE\x52\x5D\x83\x16\x86\x02\x8C\x8B\x7C\x2E\xF2\x8B\x67\x83\xC6\x30\x2D\x89\x06\xA5\x18\xD6\x85\xD4\x84\xD2\x81\x9C\x80\x4E\x84\x29\x5A\x16\x8C\x04\x5C\x85\x36\x48\x6F\x87\x46\x36", "\xF7\x43\x2E\x9E\x29\xA6\x63\x5F\x8B\xCD\x42\xC8\x88\x75\x3B\xBB\x84\xDD\x3D\x2E\xBD\xD2\x38\x8C\x49\x50\xA5\x88\x66\x8D\xC5\x73\x5E\x94\x2B\xBD\xED\x7D\x8A\xEE\x5C\x8B\x88\x41\x88\xC9\x86\xE4\x64\x2F\xA3\x16\xD2\x7E\x3A\x34\xF8\x8A\xEE\x70\xC0\x81\x5F\x98\xCD\x5E\xAE\x2B\x8B\xBD\x49\xFB\x88\x6F\x69\xBF\x89\xBA\x3B\x2F\x9B\xA2\x32\x8B\xFF\x8A\x01\x8D\x0C\x7E\xBF\x80\x52\x84\x33\xAA\x15\xB6\x8B\xDC\x72\x03\x8D\x70\x56\xB7\x87\xFC\x29\x30\xA8\xB6\x0B\x8C\x71\x36\xBC\x88\xDF\x5A\xAF\x8C\xA8\x26\x2E\x91\xB0\x48\x8B\xD4\x3A\x99\x8A\x56\x3C\xC2\x8F\x35\x97\x30\x8C\xB7\x19\x8C\x23\x5D\x0D\x8D\x06\x5D\xC3\x80\xD4\x67\x09\xA0\x18\x89\x7B\x9D\x47\xEC\x88\x79\x8C\xC7\x87\xFC\x3E\x31\x80\xE8\x64\x8B\x96\x8A\x0F\x4C\xA4\x8D\xC8\x8C\x64\x93\xA6\x64\x17\xE9\x8B\xA9\x73\xF5\x88\x75\x3D\xAA\x89\x73\x4F\x32\x8F\x0D\xA5\x8B\xE4\x8A\xFA\x8B\x2E\x8C\xC0\x8C\x47\x58\x32\xB9\x8E\x5A\x8C\xBD\x68\x2E\x8E\x4F\x46\xCB\x88\x69\x40\x33\xA5\x19\xD4\x8C\x53\x8C\x31\x8D\x57\x8A\xBE\x8D\x37\x86\x33\x81\x0E\xDD\x5F\x6C\x8D\x9C\x4E\x9B\x8C\xEE", "\x50\x67\x9C\xE0\x32\x19\xA8\x5B\x74\x8D\xB8\x36\x9D\x8C\xEF\x58\x67\x87\xFE\x3A\x19\xFF\x3B\x7C\x8D\x5A\x5E\x9F\x8A\x09\x60\x68\x8D\xD8\x42\x1A\xCC\x5B\x84\x8D\x1F\x87\x22\x65\xBA\x8D\xC4\x52\x82\x4E\x06\xA8\x50\x4A\x8A\x20\x8D\xD0\x52\xC7\x8D\xB0\x6C\x34\xA9\xE6\x0E\x8D\x0F\x6A\x35\x89\xE5\x83\x81\x7D\xFD\x43\x32\xBC\xD6\x11\x8D\xFF\x54\x74\x8D\xD9\x5C\xB3\x87\xC1\x7B\x4E\x45\x0D\xBD\x78\x1C\x74\xB9\x89\x7A\x65\xD2\x85\xFA\x6A\x2A\x92\x19\xD3\x7A\xA4\x8C\xD9\x6A\xA8\x8A\xB6\x66\x6A\x84\x9E\x68\x1A\xAC\x63\xAE\x89\x71\x8E\xE6\x53\x04\x6E\x6A\x9C\xB6\x76\x1A\xDE\x7B\xF9\x8D\xF9\x89\xC2\x8D\xD6\x80\x6B\x82\xDE\x74\xC3\x05\x87\xF0\x8C\x67\x8A\x34\x80\x9A\x83\x02\x7F\x35\xB4\xBD\x41\x8D\xA8\x63\x61\x8C\x6A\x5D\xD8\x89\x9A\x67\x36\x91\xB0\x49\x8D\xDF\x63\x65\x8C\x39\x65\xD9\x88\x37\x6F\x36\x8A\xC1\x3C\x8A\x67\x88\xB9\x7C\x79\x8C\xDB\x89\x73\x5E\x36\x9C\x89\x5D\x5F\xDA\x8C\x4A\x46\xBA\x8E\x86\x46\x6E\x92\x19\x93\x1A\xE4\x8B\xEC\x8D\x9C\x4C\xA6\x8A\xA3\x7A\x54\x9C\x34\xAB\x80\x1E\x8D\x4D\x7D\x22\x37\xBD\x89\xB7\x88", "\x66\x95\x30\xAC\xFE\x34\x8D\x5F\x8A\xFB\x89\xF7\x5A\xD5\x8D\x1C\x4C\x35\x87\xDF\x7D\x8B\x0D\x8E\xA2\x8E\x57\x8F\xB6\x81\x75\x81\x33\x85\x1D\xBB\x8B\xB8\x8C\x04\x8D\x4A\x8C\xDE\x86\xC6\x6D\x30\xA5\xBD\x1A\x8E\x74\x5E\x8E\x8E\x91\x61\x73\x8C\x75\x9D\xCE\x4D\x17\x82\x8E\xCF\x8A\x51\x7C\x40\x83\x64\x3F\x80\x32\x02\xA8\xFA\x3C\x6D\x8B\x60\xB7\x8F\x2B\x82\x94\x4C\x23\x84\x87\x67\x0F\xB4\x60\xB0\x87\xBA\x8D\xC1\x67\x24\x7F\x1D\x71\x39\x9F\x0D\xFE\x8E\x6D\x6E\x96\x8E\x34\x8E\xE5\x8F\x70\x7A\x1D\x4F\x12\xCF\x4D\xEE\x8D\x7C\x8B\xB8\x8A\xB1\x45\x73\x80\x38\xB4\xF8\x4A\x7F\x4D\x8B\xD5\x7D\xCE\x8A\x9A\x8B\x73\x9A\xEE\x6C\xEB\x0F\x8E\x06\x8A\xC8\x8C\xD3\x82\xDE\x81\x74\x91\x38\x93\xEE\x18\x8F\x0D\x8B\xF0\x5C\xE8\x8B\x6B\x85\xE5\x7A\x3C\x93\x14\xEB\x6C\xA9\x66\x00\x6F\x45\x88\xF5\x8B\x28\x84\xBF\x45\x1C\xFF\x7C\x47\x8E\x2B\x8D\xA1\x79\xCB\x77\x35\x81\x27\xA7\x19\xD3\x8E\xCC\x7F\x85\x8C\xDD\x7A\xCD\x81\x6E\x83\xF4\x63\x1E\xC8\x77\x76\x8B\xDF\x8C\x53\x68\xFD\x78\x71\x83\xDF\x60\x1D\x99\x58\x62\x8F\xC2\x8E\xC7\x8C\xEF\x50\x72", "\x90\x23\xA2\x1C\x85\x66\x24\x8F\xDA\x7A\xFF\x7F\xAF\x89\xFD\x59\x36\x96\x1F\xA3\x60\x82\x8F\x5E\x68\xE1\x89\x38\x50\x6E\x93\xF1\x62\x1B\xB1\x73\x0F\x7A\x25\x8D\x45\x64\xF3\x83\x48\x96\xBF\x73\x1C\xC1\x56\x93\x8F\xD7\x79\xE2\x88\x22\x0A\x69\x9E\xE8\x5D\xBF\x22\x7F\x4B\x89\xB2\x8F\xD0\x8C\xB7\x6B\x6F\x8A\x38\x87\x1C\xE6\x7F\xFD\x8D\x76\x6B\xBF\x88\xF6\x8C\x74\x85\x91\x4E\x1D\xDE\x6F\x6E\x86\xF1\x8C\xE9\x89\xA2\x84\x7E\x94\x3D\xA3\xF7\x02\x90\x56\x87\x03\x92\xE7\x8B\x00\x9E\x50\x8C\x3D\x93\xFB\x42\x8F\x0F\x81\x02\x92\xBB\x6B\xEB\x8B\x80\x9C\x91\x67\xE9\x12\x90\xC7\x8E\xE6\x59\xF2\x89\x38\x5B\x7C\x88\x6D\x4D\x1F\xB8\x5C\xCF\x8E\xA2\x6D\xF4\x8D\xF0\x86\x72\x84\x87\x51\x1B\xC3\x88\x7A\x32\xB9\x8C\x2B\x35\x64\x06\x02\x8D\x3B\xA4\x0F\x99\x88\xE6\x86\xC5\x31\x0B\x93\x5D\x5B\x23\x89\x22\x8F\x0A\x82\x02\x33\x91\xB9\x88\x18\x8E\x05\x86\x83\x85\x91\x40\x1E\xD7\x8B\xF6\x6F\xEC\x8D\x70\x53\xFB\x84\x3C\x7D\x3E\x88\xF9\x20\x80\x15\x91\xF2\x8C\x97\x74\xC4\x5D\xFD\x47\x3F\x86\x1D\xCE\x90\x5F\x87\xF4\x8D\x70\x55\xF2\x8E\x78\x98", "\xAD\x63\xC0\x3E\x8E\xBD\x68\xF8\x8F\xF1\x3A\x93\x89\x73\x53\x3F\x8F\xF5\x3A\x8F\x54\x8E\x59\x8C\x8E\x59\xFF\x86\xFE\x7B\x3F\xA3\xD5\x70\x8E\x08\x90\x4C\x87\x77\x67\xF5\x88\x70\x97\x3F\x80\x20\xF5\x8F\x0C\x8E\x31\x90\x93\x70\x0C\x99\x66\x8B\x3F\x83\xBD\x23\x60\xBB\x8D\x0C\x59\xAF\x8D\x4C\x56\x71\x99\x60\x45\x1F\xA3\x5C\x19\x90\x25\x63\x06\x94\x78\x6D\x81\x94\x7B\x5F\x20\xA8\x63\x21\x90\x60\x73\x08\x95\x0A\x9A\xBE\x5B\xE3\x6D\x67\x77\x3B\x2E\x90\xFA\x4D\x29\x31\x05\x9F\x82\x88\x0C\x87\x75\x3E\x84\x84\x78\x4A\x91\x0D\x90\x77\x81\xAD\x30\x44\xB4\x20\xC2\x88\x48\x39\x1E\x93\xAF\x5F\xFA\x82\x81\x82\x42\x84\xCF\x44\x90\xED\x68\x23\x93\xE3\x78\x09\x9E\x5C\x9C\x23\x8B\x21\x8D\x8F\xC4\x66\x28\x91\xAD\x5A\x16\x9A\x58\x52\x42\x96\xF4\x76\x90\x56\x90\x09\x90\x16\x94\xD2\x6A\x54\x9C\x42\xBB\xCA\x69\x90\x06\x91\xE4\x7D\x12\x91\x18\x91\xFD\x63\x46\xA0\x0D\x92\x90\x66\x91\x36\x89\xFF\x89\x68\x5F\x7F\x92\xAD\x6C\x21\xE6\x7F\x70\x91\x55\x6C\x1D\x96\xE8\x81\x8D\x81\x43\x97\x1D\xA8\x76\x71\x8A\xD3\x8F\x1D\x92\x02\x99\x87\x8C\x6E", "\x7B\x21\xA3\x5C\x7D\x90\xE6\x5B\x1F\x95\x61\x71\x88\x84\x87\x43\x22\xED\x69\x85\x91\x0C\x5B\x21\x97\xC6\x67\x76\x83\x27\x8D\x22\xFF\x7F\x8A\x32\x19\x63\x51\x3A\x05\x9C\xBE\x22\xC3\x31\x1D\x95\x91\x0B\x86\x67\x38\x26\x92\x20\x02\x8F\x91\xD9\x34\x23\xD9\x83\x98\x4C\xBD\x8C\xD1\x6B\x1F\x90\x00\x1D\x47\x80\x76\x7F\x91\xBC\x86\x66\x7C\x27\x92\x80\x87\x44\x9A\x6F\x42\x24\xC0\x71\x77\x8E\xF6\x84\x12\x8B\x21\x90\x2F\x9B\x44\x4F\x24\xBA\x72\x7C\x8E\x38\x88\xE0\x8D\xEF\x8A\xD0\x52\xDF\x76\x1E\xA7\x91\x1D\x93\x82\x63\x36\x8E\xF2\x8C\x8A\x8B\x3C\xB2\xE5\x21\x92\xE3\x8E\xC3\x85\x66\x8A\xF5\x8A\x78\x82\xF4\x47\x19\x9F\x92\xED\x68\x2A\x91\xFF\x7D\x9B\x66\xE5\x71\x37\xAA\x24\x9D\x8D\xB8\x91\x7A\x8C\x04\x90\x00\x0E\x85\x86\x23\x8C\x20\xA2\x8F\x35\x92\x88\x89\x03\x97\x26\x9B\x02\x44\x43\xAB\x22\x9C\x51\xCA\x77\xD5\x8C\x51\x90\xCD\x78\x92\x91\x90\x6E\x24\xB1\x8F\x5A\x7D\xA7\x91\x35\x91\xF7\x8E\x86\x8E\xF3\x49\x20\xC2\x91\xAF\x89\xF1\x74\xEF\x8E\x65\x8A\x83\x90\x49\xA6\xFF\x5D\x91\x4A\x61\x6F\x93\x63\x79\x1C\x9A\x04\x63\x47\x93", "\xCE\x13\x87\x0F\x8D\xAC\x93\x88\x59\x1D\x9C\xDC\x4B\x47\x8A\xF4\x09\x91\x3A\x73\x45\x93\x4C\x95\xAD\x6E\x88\x92\x40\x9B\x24\xE3\x66\x3B\x92\x53\x93\x19\x96\x20\x08\x8A\x8D\x23\xAA\x22\xC5\x89\xD8\x8B\x9D\x90\x2D\x92\x2D\x79\x93\x81\x3F\x9E\x25\xFC\x48\x83\x92\x1C\x5E\x2D\x93\x2F\x93\x10\x12\x49\x9E\x1F\x97\x8F\x0E\x91\x26\x8D\x64\x96\x26\x62\x81\x9E\x45\xBD\xD2\x3D\x92\xB0\x8F\xA9\x90\x5C\x88\x46\x75\x7B\x8A\x4B\x9B\xD7\x05\x93\x48\x93\xA0\x91\xC0\x8E\x1D\x91\x28\x8B\xFD\x4F\x23\x84\x77\x50\x93\xCE\x92\x49\x95\xB6\x88\x7B\x84\xBF\x5A\x26\xED\x6D\xAF\x92\x6C\x91\x70\x74\x25\x9D\x95\x9E\x4C\xBA\x1A\x94\x90\xB6\x93\x15\x40\x59\x94\x1C\x66\x96\x92\x26\xA5\x23\x85\x66\xE7\x91\x36\x88\x5B\x92\x09\x6E\x96\x8B\x72\x70\x25\xE6\x34\x72\x93\xC7\x91\x84\x7C\xFA\x8F\x7B\x55\x12\x91\x01\x98\x84\x45\x85\x7B\x93\x26\x97\x82\x82\x26\x83\x00\xB8\x23\xA4\x82\x18\x92\xE7\x93\x15\x80\x14\x90\x00\x17\x48\xA6\x69\x04\x92\x16\x85\x4F\x93\x0E\x91\x11\x82\x8A\x9B\x4C\xA5\x24\xE0\x8F\xA9\x63\xC9\x92\xD5\x6B\x27\x9D\x97\x88\x4D\xBF\x25", "\xE2\x86\x6F\x7E\xF2\x6D\x62\x90\x35\x60\x8B\x8C\x4C\x86\x26\xB9\x93\x36\x8E\xF5\x93\x4B\x90\x3F\x99\x3B\x4E\x4C\x87\x21\x99\x74\x3B\x93\x5D\x90\xEC\x8A\x0B\x99\x9A\x76\x4C\x90\xF9\x20\x93\xB1\x93\xEF\x61\x82\x97\xDC\x66\x94\x91\xC0\x63\x0D\xAB\x93\xA8\x63\x65\x92\x79\x97\x53\x8E\x7A\x88\x50\x93\x23\xB0\x93\x17\x94\xDF\x75\x86\x92\x41\x9B\xA1\x90\x23\x9B\x25\xFF\x93\xB9\x8C\x69\x88\x58\x94\x1C\x62\x96\x98\x9B\x7B\x26\x85\x66\xBD\x93\xC2\x8F\x6F\x94\xE8\x61\x9C\x88\x4D\x83\x27\xE4\x61\xC5\x92\xBC\x67\x71\x93\x69\x7D\x94\x94\x4B\xB0\x23\xED\x33\x96\x47\xE7\x92\x24\x91\x6E\x1A\x89\x9C\x4E\x9E\x27\xFA\x91\xB4\x32\xE9\x92\x8F\x95\x3C\x90\x28\x8B\xCC\x3D\x28\xE3\x93\x60\x49\x1F\x95\xB0\x34\x20\x99\xA3\x9B\x4E\x88\x29\xEE\x70\x44\x95\xB6\x6F\x5D\x90\xED\x60\x9A\x9A\x4B\xAD\x11\xED\x93\x0E\x95\xDD\x62\x57\x70\x08\x9B\xF7\x6F\xCB\x73\x1E\xCC\x90\x82\x92\xD0\x93\x7C\x95\x4C\x5B\x98\x8D\x23\xBE\x27\xC7\x92\xED\x8E\xBC\x66\x80\x96\x3E\x90\x00\x04\x50\x8A\xE6\x5D\x5F\x98\x92\x36\x97\x82\x90\xC7\x53\xA7\x88\x8D\x4D\x28\xE8", "\x93\xC9\x91\xA3\x92\x84\x95\xDD\x6D\x8C\x88\x4F\xA7\x26\xD9\x94\xC4\x90\xBD\x86\x36\x97\x2A\x95\x8C\x9C\x4F\xAE\x15\xD7\x91\x6D\x87\x3A\x96\x56\x95\x46\x9E\x7B\x9A\x4F\x93\x20\xC1\x8F\x8E\x95\x13\x94\xD1\x69\x45\x9C\x88\x88\x4B\xAF\x14\xA0\x93\x2F\x95\x82\x65\x8C\x92\x9A\x83\xA3\x99\xD3\x74\x26\x92\x70\x6A\x8E\xEA\x83\x08\x3D\x51\x93\x2F\x65\x19\x23\x2A\x91\x90\x4F\x95\x89\x90\x75\x95\x81\x32\x02\x97\x4E\xBD\xE4\x76\x8E\x22\x39\x23\x95\x45\x91\x20\x91\xA5\x86\x55\xB2\x2A\x8F\x88\x16\x7E\x8A\x91\x2B\x90\xD1\x88\xE5\x69\x4F\x83\x2A\xEB\x93\x8E\x94\x2C\x94\x7A\x97\x3D\x9B\xF8\x69\x39\xAB\xFE\x63\x94\x23\x5D\xFA\x91\x1B\x88\x59\x9D\xB0\x6C\x56\xA9\xE6\x65\x94\xA8\x93\x33\x96\x55\x90\x32\x9F\xAB\x82\x08\x2B\x29\xED\x88\x6E\x95\x5E\x6A\x81\x94\x78\x61\xA7\x8D\x23\x8A\x2A\xEE\x62\x1D\x95\x31\x90\x68\x91\x4F\x93\xAD\x85\x22\x4E\x2A\xFD\x94\xBD\x95\x3F\x94\x7A\x97\x5B\x98\x6F\x95\x4A\xAB\x2B\xE1\x95\x73\x90\x77\x97\x97\x97\x43\x97\x94\x81\x51\x85\x1E\xA3\x94\x05\x67\x12\x96\x34\x8A\x52\x90\x8C\x74\x54\xB0\x1E\xAB\x94", "\xC0\x71\x16\x94\xA0\x90\x00\x09\xA9\x84\xBA\x5B\x2A\x85\x8F\x9D\x94\xF0\x70\x84\x92\xC3\x81\xAA\x9E\x14\x8B\x06\xA4\x95\x18\x73\x76\x35\xAB\x93\x3A\x91\x0B\x84\x48\x8F\x2C\xA8\x95\xB3\x94\x0B\x89\xC5\x97\x27\x82\xA4\x89\x55\x8E\x24\xB5\x95\x65\x83\x5B\x97\x0F\x8D\xE9\x71\xA5\x86\x1D\x97\x11\x83\x02\x4A\x95\x4B\x92\xAB\x93\x9A\x7D\x23\x8B\x59\xB0\xFC\x30\x95\x14\x97\xE4\x87\xFD\x5F\x53\x9F\x7D\x84\xFD\x67\x27\xC5\x95\x0C\x02\x2B\x96\xC6\x80\x22\x02\xAC\x96\x59\x86\x1E\xA3\x92\xB9\x89\x60\x74\xD0\x93\x13\x5E\xAC\x92\x3E\x87\xE8\x4B\x92\xC1\x53\xA2\x94\x49\x95\xBC\x8B\xB0\x9E\xEB\x50\x2B\xCE\x86\x02\x8A\xA4\x94\xEC\x89\x4D\x98\xF7\x7E\xFC\x52\x2D\xED\x69\xD9\x94\x9F\x91\xE7\x8E\x50\x9D\x4E\x7D\x56\xBB\x2C\xBF\x92\x1F\x61\xA1\x94\x6A\x88\x5E\x97\xD0\x65\x9D\x62\x2D\xFB\x5C\xE4\x94\xF8\x92\xB9\x97\x6A\x96\xFE\x68\x57\x97\x0E\x81\x90\x87\x93\x81\x94\xBB\x97\x2C\x99\x9A\x8A\x40\x9C\x2D\xDE\x95\x64\x96\x85\x7B\xDC\x95\x6A\x99\xB2\x67\x5B\x80\x20\xF6\x95\x9D\x7E\x1A\x64\x6E\x95\x69\x9B\xE4\x5C\x57\xBA\xE4\x7E\x95\x5C", "\x92\x97\x88\x73\x92\x60\x9F\x94\x85\x58\x80\xE3\x07\x96\x81\x96\xE6\x8B\xFC\x63\x4B\x99\x76\x95\x4B\x95\x2B\xBE\x95\x71\x97\x44\x8C\xCD\x90\x58\x9C\xB6\x9C\x23\x7D\x2C\xF4\x7E\xC4\x95\x3E\x8A\x77\x8C\x51\x97\x9F\x84\x5C\xA9\xE6\x4A\x95\x47\x92\xA5\x95\xA5\x94\x69\x9F\x94\x8F\x5A\xA4\x26\x8E\x89\x7E\x96\x51\x48\xD5\x93\x69\x97\xAD\x87\x4A\x99\x2D\xB0\x8F\xDB\x94\x36\x96\xD7\x95\x5C\x95\xB7\x98\x4A\xA6\x2E\xF4\x8F\x79\x96\x89\x5C\xE9\x91\x34\x9D\xB9\x92\xAD\x7B\x29\xB2\x93\xA5\x93\x2E\x7F\x76\x7D\x78\x9A\xAA\x52\x43\xA5\x2D\xBD\x97\x85\x95\xDF\x97\x17\x92\x5E\x94\xF7\x7B\x5B\x8B\x2D\xF4\x95\x50\x96\x88\x97\xDD\x90\x00\x98\xAF\x84\xBA\x7A\x2B\xCB\x96\x86\x96\xC5\x63\xF0\x90\x60\x9A\x93\x6C\x5C\x9F\x29\x8E\x97\x3A\x72\xC8\x95\xEF\x8E\xC2\x8D\x8E\x98\x59\xB6\x28\xCC\x93\x27\x90\x81\x02\x84\x3B\x07\x80\x9D\x8A\xE7\x13\x2C\xC3\x94\xBA\x94\xEA\x83\xFC\x93\x1E\x9E\xB2\x88\xFB\x6D\x2C\xBB\x92\x53\x94\xD4\x61\x00\x9B\x7C\x7A\xB3\x9C\x5D\x9F\x2E\xDD\x94\x5A\x95\xC3\x8F\x12\x93\x80\x9E\xD7\x6A\x5D\xB0\x1E\xA8\x97\xBC\x96", "\x07\x98\x9B\x92\x82\x9D\x46\x8E\x5D\x9F\x29\xD2\x95\x4F\x93\xD9\x96\xD6\x90\x0E\x53\xBC\x97\x5D\xAC\x29\xB9\x97\x6D\x89\xDD\x97\xEB\x96\x7A\x9B\xBA\x84\x61\xB0\x1E\xF7\x94\x5F\x95\xB4\x96\xCF\x97\x78\x9D\x36\x8E\x5B\x88\x30\xC7\x6D\xCC\x96\xD5\x48\xF5\x97\x85\x90\xBD\x82\x54\x99\x2E\xF1\x90\x88\x94\x20\x75\x0D\x9C\x6B\x81\xC3\x85\x7B\x58\x2F\xCF\x92\x80\x97\xF5\x97\xA3\x90\xFD\x7F\xBD\x9B\x60\x9D\x1D\x97\x90\x3D\x98\xFE\x6C\xE5\x85\x71\x9A\x5C\x8F\x4A\x89\x2C\xFC\x5A\x49\x93\xCA\x97\x8D\x91\x5A\x37\x92\x71\x44\x8D\xB1\x25\x06\x55\x98\xF1\x91\xC6\x95\x15\x79\xBF\x9E\x14\x99\x31\xB5\x93\x23\x97\x03\x55\xC9\x91\x51\x39\x77\x83\x63\xA7\x2C\xA1\x91\x5D\x98\xF7\x95\x7C\x91\x99\x86\x63\x8A\x60\x8F\xB3\x14\x97\x3C\x96\x38\x99\x3D\x89\x89\x9A\x47\x98\xD0\x4C\x30\xD3\x7C\x8F\x8F\x1B\x98\xDD\x78\x82\x9A\xB6\x8C\x5D\x90\x12\xD4\x63\x6E\x98\x4A\x46\x05\x9C\x6D\x77\xAE\x63\xDE\x6F\x1B\xDB\x97\xBC\x97\xDA\x94\x60\x95\x39\x4E\xC1\x9B\xE9\x50\x19\xF4\x98\x46\x8E\x11\x9A\x1A\x99\x50\x9C\xC3\x9A\x63\xB4\x30\xA6\x98\x89\x96\x83", "\x74\x22\x9F\x75\x9A\xC2\x82\x5D\xBD\x92\x2C\x98\xCD\x88\x0F\x8D\x2B\x8E\x29\x9F\xC7\x87\x54\xAD\x26\xEC\x98\x71\x87\xE0\x97\x86\x72\x28\x90\x94\x90\x64\x98\x28\xB3\x98\x75\x98\xAA\x5A\x21\x9A\x8B\x9B\xC9\x9F\x52\x9D\x2F\xC0\x71\x45\x99\x4A\x7E\x28\x49\x7C\x95\x62\x61\x64\x90\x91\x64\x97\x70\x5A\x5F\x9A\x7E\x58\x7D\x96\xA6\x2A\x5F\x88\x12\xF8\x7A\xED\x96\x4F\x99\x70\x55\x04\x95\x30\x60\x00\x87\xEF\x6B\x98\x44\x87\xC6\x88\xDE\x85\x9E\x76\xC9\x9C\xCE\x47\x30\x9C\x89\x94\x7A\x61\x9B\x33\x9F\x66\x94\xC8\x8D\x49\x93\x32\xE0\x94\xB1\x97\x9D\x85\x14\x9E\x15\x9B\x34\x96\x5A\x6E\x32\xB5\x5D\x18\x99\x6F\x9A\x06\x9B\x2E\x9C\xC1\x83\x67\xB3\x1B\xD5\x99\x46\x8E\x10\x9B\x51\x92\x92\x9F\xB6\x98\x64\xBF\x27\xF6\x99\x47\x92\x14\x9B\xDB\x95\x93\x9E\x4B\x88\x43\xB0\x33\xFC\x94\xC8\x62\x39\x5D\x38\x9A\x86\x95\x75\x96\xFC\x61\x1E\xE1\x96\xE7\x99\x31\x8D\x41\x99\x72\x9C\x99\x96\x5B\x92\x2F\xC6\x98\xE5\x6F\x7F\x98\xF2\x93\x09\x83\xD0\x8D\x0E\x77\x32\xBA\x72\xB9\x99\x4C\x9B\xF0\x8C\x39\x98\xB8\x8E\x64\x8A\x2E\x92\x8C\x0C\x02\xF3\x97", "\xDB\x94\x98\x9C\x7A\x41\x68\x89\xE0\x49\x99\xA3\x88\xF2\x71\xC3\x97\x3D\x85\xB9\x02\x59\x8E\x06\xA5\x06\xFF\x5F\x0A\x81\xFF\x92\x32\x8B\x08\x8A\xCC\x31\x34\xDC\x80\xF8\x97\x55\x95\x20\x3F\xA6\x9A\xA3\x99\x69\x9B\x2C\xED\x33\x3C\x9A\x27\x97\x16\x9C\xEE\x80\xB2\x9B\x7F\x6E\x34\xDD\x88\xAC\x79\x34\x9B\x0D\x90\x00\x01\xD4\x93\x01\xB3\x34\x8D\x84\x33\x96\xD1\x90\xAF\x97\x6D\x97\xC7\x94\x5B\x85\x30\xCF\x92\xD7\x98\xE5\x95\x02\x9D\xA2\x9D\xCF\x95\x59\x9D\x33\xE4\x99\xA7\x89\xA3\x96\x44\x9F\x3B\x64\xC1\x89\x5D\xA6\x34\xE6\x99\x63\x9B\x73\x6D\x3A\x9F\xAB\x94\x93\x89\x68\x89\xB4\x6E\x99\x94\x93\x73\x98\x56\x8D\x96\x95\xF6\x54\x67\xB8\xED\x60\x96\x27\x61\xB4\x98\x9D\x92\x95\x96\xB4\x9A\x64\x8F\x34\xB0\x8F\xFC\x99\x72\x9A\x3F\x9C\xAE\x9B\x84\x8E\x61\x98\x33\xA4\x99\x6C\x9A\x42\x96\x0D\x9C\xB0\x9C\x9D\x78\x67\xBC\x2E\x8E\x9B\x23\x98\xBE\x9A\x41\x9D\x6F\x9E\xD6\x9B\xEA\x67\x35\x82\x97\x90\x95\xCA\x9A\xAF\x8E\xEB\x8D\xD5\x88\x47\x4B\x31\xDF\x99\x24\x9B\x2F\x4F\x65\x9A\x72\x98\xFE\x69\x4E\xB4\x12\xA9\x37\xCC\x98\xA2\x6D\xFC", "\x94\xA2\x96\x9D\x9B\x51\xA0\x31\xC2\x9A\xB8\x94\x85\x92\x4E\x9E\x1A\x66\x61\x76\x62\x9E\x2C\xF9\x85\x4A\x9A\x70\x7B\x36\x95\xB5\x9E\xD3\x92\x59\x8B\xA8\x6D\x33\xB5\x9A\x5A\x99\x18\x9B\xFC\x45\xD4\x9B\x6D\xB2\x34\xB1\x96\xE5\x87\x10\x44\x41\x91\xB8\x9F\xDA\x88\x6A\xAC\xC2\x51\x94\xDB\x98\xCC\x94\x63\x9E\xE8\x85\xD5\x9D\x6B\x9C\x2E\xFA\x9A\xA8\x63\xAC\x99\xE6\x71\x9B\x9C\xD5\x82\x6C\x9E\x35\x9D\x9B\xA5\x97\x3E\x98\x1F\x9E\x67\x95\xD6\x91\x60\xA3\x36\xBE\x86\xE7\x9A\xA1\x86\x30\x9F\x90\x9F\xD7\x8C\x53\x8A\x32\xCF\x92\x8D\x99\xA3\x92\x3C\x9C\x77\x96\xD7\x87\x6C\x8A\x36\x95\x99\xD3\x9B\x57\x9B\x42\x9C\x9D\x96\xB6\x9A\x6C\xA9\x73\x01\x9B\x61\x9A\x83\x00\x28\x9A\x3A\x76\xD8\x9A\x6A\xB0\x30\xD8\x9B\xE6\x7B\xFD\x9A\x46\x9C\x92\x95\x7A\x88\x70\xA0\x2B\xB0\x99\x06\x9D\x1D\x99\x83\x99\xBF\x93\xD1\x9F\x61\x9F\x33\xC1\x98\x0B\x9D\x21\x98\x73\x91\xA3\x9E\xD1\x96\x40\x84\x1F\xE9\x9B\xD3\x73\x4B\x94\x5C\x9B\x20\x01\xDA\x8A\x58\x63\x38\xEC\x97\x93\x97\xF5\x9A\x14\x98\x7E\x94\x11\x00\x00\x00\x10\x00\xB7\x47\x01\x00\xFF\x00\x81", "\x80\x81\x00\x05\x82\x82\x00\x0F\x07\x86\x82\x82\x81\x06\x85\x82\x0D\x0F\x80\x0C\x81\x85\x02\x88\x8A\x18\x81\x84\x8F\x89\x87\x85\x8C\x87\x0F\x91\x9E\x98\x86\x8B\x91\x8C\x8A\x07\x17\xA7\x94\x82\x02\x88\x02\x95\x14\x88\x30\x8B\x91\x80\x92\x84\x06\x33\x82\x9B\x8A\x8D\x8A\x87\x8E\x89\x22\xBE\xA4\x99\x94\x99\x96\x92\x9A\x00\xAD\x8F\x8F\x97\xA2\x82\x99\xA6\x34\xB6\x87\x98\x90\xAB\x82\x89\x9E\x07\xBF\xA1\x84\xA0\x85\x92\xA0\xA4\x00\xC6\x9F\xA0\xBA\xA2\x84\xA7\xB1\x4E\xDC\xA7\x92\xA6\x84\xA8\xB4\x8D\x57\xEA\xAC\xB0\x8A\xB6\xAD\xAC\xB0\x61\xEA\x99\x85\xB7\x87\xB3\xBB\x98\x7A\x98\xB3\xA0\x0E\xB7\xBC\x87\x9D\x07\xD8\x8B\x82\xC0\xA5\xB9\xC0\x94\x8F\x8C\xBC\xA6\x8E\xBB\xC4\xC1\xAA\x6B\x92\x85\xD6\xC7\xC1\xB8\xCD\xC1\x41\x86\xC2\x96\xBC\xC8\xA6\xB0\xD1\x34\x93\xC5\x95\xC5\x81\x8F\xA7\xB7\x2B\x83\xDB\xCD\xD8\x8B\x01\xC8\x81\xB6\x98\xD9\x99\xD0\xDF\x90\xDE\xD4\x2B\xAA\xC0\x05\x3A\xB7\xDD\xD2\x9A\xC6\xB4\xF8\xA9\xE3\x88\xBF\x7E\xE6\xCE\xFF\x42\xE4\xE8\xC8\xEA\xE6\xEB\xCB\xB7\xC1\x98\xE0\xB4\xEC\xA4\xE1\x5D\x45\xDA\xE0\x8E\xE8", "\xE7\xF1\xE7\xE7\xE5\xC1\xF2\x81\x22\xF2\xDD\xDA\xE9\xF1\xEF\xF4\x8A\xF7\x92\xE1\x09\xEE\xBD\xFB\xD2\xFA\xF8\xFB\xF8\x86\xF5\x7B\x7F\x7C\x6E\xFC\x40\x7E\x6D\x81\xC7\x6B\x7F\x40\x75\xBD\x41\x8E\x7D\x7F\xF4\x48\x8A\x71\x77\xE7\x42\x70\x0D\x7E\x06\x82\x80\x84\x80\x12\x8D\x79\x77\x80\x01\x42\x7C\x14\x86\x09\x87\x80\x88\x79\x1D\x91\x7E\x80\x4B\x12\x57\x85\x75\x8A\xD7\x70\x8F\x87\x86\x02\x56\x84\x8B\x84\x48\x6B\x8C\x87\x89\xE8\x7C\x8A\x8D\x8D\x12\x6E\x07\x8E\x87\x14\xBE\x82\x8D\x91\x34\xA1\x82\x46\x11\x43\xAA\x87\x91\x8E\x4F\xA6\x7C\x8E\x70\x33\x0D\x91\x8E\x91\x58\x89\x98\x8B\x94\x12\x7B\x06\x97\x8C\x19\x8F\x81\x99\x84\x59\xA3\x92\x66\x44\x3D\x1F\x98\x92\x99\x04\xA5\x95\x8B\x5E\x12\x5F\x0A\x98\x94\x6E\xB8\x82\x96\x96\xD2\x52\x41\x1B\x9C\x77\xAC\x9B\x75\x94\x2B\x7F\x8A\x93\x43\x27\x2A\x52\x72\x09\x7C\x81\xA0\xA2\x89\x78\x82\xA9\x52\x44\x85\x98\x67\xA1\xA2\x8C\xBE\x9B\x95\xA3\x8B\xB0\x9F\x43\x18\x94\x9A\x86\xA5\x8F\x98\xB5\x94\x93\x77\x12\x62\x1D\xA6\x98\x6F\xA8\xA6\x9E\xA2\xA2\x8E\x9C\x97\x43\xA4\x6B\xA0\xAB\xA7\x8E", "\xB3\xA9\xA8\x99\xA1\xB8\x92\x72\x44\xA3\xBF\x9D\xAB\x95\xB9\xB4\xA5\x86\x44\x19\x27\xA8\xAE\xB0\xBF\xA0\x97\xAF\x99\x84\x86\xA2\x44\xA2\x2F\x89\xBB\x9B\xB2\x6D\x81\xB4\xB7\xA0\x0A\x51\xAD\x6F\xA4\xD1\x96\xB2\xAE\xA7\xD7\x97\xA8\xB2\xAE\x90\x8E\xBF\x40\xB4\x0D\x99\xAA\xA9\xAF\xAC\x9E\xBC\xBA\x7D\xE5\x92\xAF\xB2\xB1\x3B\xAE\xBE\xAA\xBD\xC0\x9F\xA2\x70\x0F\xF4\x95\xB3\xBB\xBF\xE1\xB6\xAF\xB7\xBA\xD1\x42\x71\x69\x89\xB5\x89\xCA\xBB\xB1\x01\xC2\x78\x12\x5A\xBC\x91\x73\x62\x22\xFD\xBE\xA8\xBE\xB2\x03\xCC\xC9\xC4\xB3\x0A\x42\x10\xC7\x79\x83\x7E\x15\xC6\xB8\x01\xCA\xC2\xB4\xA9\x0F\x62\x0F\xC4\x8F\x83\x7F\x03\xCA\xC0\xEF\xA0\xBB\xC6\xBF\x25\xC3\xBF\x41\x0B\x2B\xF8\x93\x63\x16\x2F\xE6\xC7\xC7\xB4\x33\xD8\xB7\x43\x15\x39\xDF\xA3\x62\x28\x3D\xCB\xC5\xBC\xC0\x41\xE4\xCD\xD1\x9E\x0F\x64\x05\xD1\xC0\x83\x44\x1A\x58\x62\x06\x51\x02\x5D\x63\x98\x71\xA1\xCC\x46\x58\xC5\x4A\xD7\x67\x5C\xFD\x6E\xD5\x74\xA7\x4D\xCE\x4A\x5A\xAF\x46\xDA\x67\xD5\x12\x63\xDD\x6C\x68\x8E\x7C\x89\xDB\xD3\xC2\x6C\x6F\xB9\xDB\x54\xEF\xD8\x65\xD8\x00\x32", "\xD6\x80\xDD\x5D\xE7\x77\xDF\xD7\x2C\x8B\x5C\xD8\xC8\x7E\xFD\x60\xE2\xE0\x25\x84\xE6\xDA\xE1\x36\xE6\x5B\xE0\xCB\x8D\xC6\x8F\xE3\xD6\x5B\x45\xE6\xDD\xE5\x7D\x57\xEA\xCD\xE6\x25\x9B\xE4\xD9\xE7\x93\xDF\xEF\xAA\xE5\x98\x7C\xDF\xD2\x6C\x49\xE7\xCD\x9E\xDA\x0B\xB1\xEF\xCC\x9D\xE4\xB5\xED\xB4\xD3\x88\xCB\xD5\xCE\xEC\x0A\x8A\x41\x7B\xEE\xBF\xF7\xE3\xEF\xD3\xB5\x82\x7D\x78\xF1\xC8\xCA\xD4\xCD\xF3\xAB\xC7\x48\x7C\xF3\xBD\xCF\xF5\xF6\xC5\xBC\xF7\xB9\xF5\xBE\xC5\xDB\xF8\xC7\xF5\x8F\xBA\xE9\xB8\xF0\x95\x9D\xF6\xF8\xDE\x2D\xB6\xEE\xF4\xD0\xE0\xF0\xC5\xC2\x44\x23\x94\xFA\xF7\xF9\xED\xFE\xCA\xBD\xFA\xF2\xDC\xF0\xF6\xF1\xED\xB7\xFF\x42\x8B\xE3\x7C\x7D\xF9\x7B\x7B\x7C\x94\x4A\x22\x48\xF9\x7F\x7B\xFC\x04\x84\x7F\xF7\x4F\x24\x49\x09\x8C\x7F\x02\xF5\x7E\x78\xEC\x74\x72\x21\x55\x51\x80\xEE\x05\x87\x78\x0A\x91\x7E\x20\x5E\x5A\x81\x07\x93\x84\x84\xFD\x6D\x7A\x38\x69\x42\x85\xFF\x0D\x86\x84\x07\x8A\x22\x4E\x2A\x83\x82\x07\x82\x8A\x52\x85\x3B\x49\x86\x32\x73\x84\x07\xAB\x88\x7D\x66\x72\x5F\x5C\xEA\x6C\x86\x02\xAD\x8E\x38\xE1\x1A\x5E", "\x40\xDC\x41\x83\x0E\xB2\x85\x85\x21\xB8\x2A\x38\x9C\x58\x84\xC1\x44\x8E\x88\x09\x85\x8D\x54\x41\x8C\x82\x16\xBA\x82\x88\xB2\x12\x27\x6C\x53\x95\x8B\x06\xDD\x83\x8D\x1E\xBC\x52\x89\x64\x83\x84\x15\xD6\x8F\x88\x62\x59\x8C\x8B\x5B\x8D\x8A\x17\xBE\x8B\x5B\x79\x52\x8A\x63\x70\x99\x8E\x1C\x86\x87\x21\x23\xA5\x41\x89\x06\x56\x7D\x1A\xBC\x8A\x8F\x2B\xB4\x88\x89\x76\x88\x8D\x1C\xEB\x85\x8D\x42\xAD\x8F\x90\x7F\x89\x91\x20\x95\x8E\x68\x47\xAC\x8F\x92\x7C\x86\x20\xBF\x77\x8E\x77\x45\xA2\x8A\x8D\x9F\x81\x7B\x41\x07\x62\x56\x41\x9E\x90\x93\xA0\x93\x8E\x42\x0F\x68\x33\x88\x4E\x3B\x62\x6F\x9B\x8D\x2A\x8D\x9E\x85\x83\x1E\x65\x95\x8C\x6F\x22\xC8\x1C\x96\x7A\x59\x84\x96\x97\xF0\x49\x67\xD4\x2F\x72\x22\x97\x7C\x96\x82\xA7\x94\x94\x23\xA9\x32\x22\x9C\x78\x90\x73\x0F\x3C\x67\x31\x95\x90\x99\x1C\x95\x98\x23\xC2\x24\x6B\x33\xA3\x7F\x20\xA4\x53\x9E\x7D\xCB\x9F\x95\x38\xCC\x86\x90\x85\x12\x6B\x9B\x6E\x6F\x22\xD5\x7F\x62\x22\x07\x1C\x72\x21\xA4\x8F\x5C\x18\xF8\x20\x70\x77\xA7\x70\x9E\x75\x78\x4F\xE1\x35\x94\x32\xD1\x69\x9F\x26\x70\x6F", "\x22\x3D\xF3\x65\x6C\x03\x73\x98\x2C\xFB\x85\x9D\xE8\x2D\x79\x96\x80\xAC\x9A\xA0\xEF\x83\x95\x3E\x9F\x59\xA1\x47\xAC\x75\x37\xAE\x6D\x7C\xEC\x0F\xAA\x21\x81\x83\x75\xA0\x25\x47\xA2\x69\x20\x7D\x9E\x86\x90\x9E\xA1\x8E\x6D\x9D\x44\x86\x21\x9F\x8C\x22\xA5\x28\x24\xAB\x36\x3F\xFD\x6F\x21\xD9\x2F\x5D\x9E\x2B\xB4\x2E\xE7\x7A\x91\xA6\x00\x3A\x6E\x35\x0D\xB3\x29\x2C\xE3\x96\x9A\x85\x86\x24\x41\x93\x84\x7D\x51\xA1\x91\x98\x85\x08\xA8\x61\x94\x80\x9C\x53\xCB\xAA\x95\x83\x03\x7A\x91\x96\x8A\x9B\x54\xE1\x85\xAA\x83\x0B\x78\xAB\xD7\x98\x8D\x58\x9D\x97\x84\x89\x13\x78\xAC\x44\xBC\xAA\x56\xA8\x92\x9D\xAD\xA2\xA9\xAD\x6F\xB6\xA3\x41\x4F\xA5\x95\xA8\xA6\x91\xAB\xCC\x9F\x7F\x50\xEE\xA4\xAD\xB1\x80\x4F\x21\xF1\x68\xAC\x5F\xBD\x90\xAF\xBE\x86\xAD\x20\x00\x89\xA8\x0D\xEA\xA3\x97\xC6\xA2\x96\x20\x89\xB0\xAA\x52\x8C\xBD\xAC\xB6\x8D\xAF\x20\x08\x82\xB2\x65\xD4\xAB\xAD\xCE\xB9\xAA\x21\x10\x9A\xB2\x67\x95\xB3\xB4\x72\x83\xB2\x68\x06\x39\x82\x68\x8E\xB6\xB5\xCD\x94\xB7\xB2\x20\x9B\xAE\x6B\xF1\xA3\xB6\x8E\x47\x21\x85\xAB\xA4\xB4\x6B\x9C", "\xBF\xB3\x83\x30\x81\xB7\xAD\xA5\xB4\x6F\x8F\xB5\x21\x1B\x80\xBB\xB8\xC1\xBB\xB7\x6B\xB5\x8D\x8E\x73\x4A\x20\x5D\x8A\xAB\x88\x72\xD3\xBB\xB8\x6C\xB1\x5D\x8E\x40\x9F\x9B\x5D\xFE\xA8\x99\xB2\x9B\x52\xB6\xC2\xB5\xB8\x6D\x99\x95\x20\x53\x5A\xBE\xAE\xE8\xBF\x81\x41\x2F\xA4\x9B\xC2\x84\xB7\xB4\xED\xB2\xAF\x19\xF5\xA3\xB3\xF1\x8A\xBE\xBE\xC4\xA0\x01\xB1\x67\xB5\xBE\xC3\xB0\xB8\x6A\xD9\x4E\xBB\x41\x50\xB2\xB3\xC5\xB8\xB9\xB9\xBA\xB9\xBE\x1F\xB2\x50\x91\x02\xD2\xBA\xBC\xFE\xB5\xB7\x5F\x81\xCF\x87\xE7\xA0\xBF\xBE\x11\xC1\xBD\xE2\x14\xC8\xBA\x0B\xFC\xBE\xC0\x19\xD8\xC3\x7B\xDD\xA5\x21\x4D\x87\xB8\xC2\x23\xDA\xC1\x88\x89\xC0\xB6\x9D\xA7\xC7\xC0\xD4\xB0\xC4\x8A\xA8\xB5\x20\x56\xBD\x36\x95\x78\x30\x97\x87\x8F\xC2\xC7\x1E\xF6\xB6\x20\xB7\x97\xC5\x50\x86\x2B\x97\x17\xEB\xC0\xC1\x48\xD1\xC7\x8F\x85\x2A\x64\x74\xB4\xA2\x21\xC6\x86\xC9\x8A\xA2\xCD\xBA\xEE\xA1\x7A\x21\xCE\x82\xCB\x49\x87\x22\x9A\x29\xD5\xCE\xBD\x5F\xDF\xBD\x36\xC3\x9A\xA2\x89\x1E\x9E\xCB\xF1\xB2\xC1\x98\xEA\xC9\xCC\xF2\x80\x07\x9C\x5A\xDC\x9A\x42\x6B\x99\xA5\x87", "\x10\x01\xA7\x00\x0D\xA7\x50\x3C\x40\x71\x3B\xF7\x9A\xA2\x3B\xB4\xA1\x4F\xBF\xA8\x23\x8C\x92\x64\x74\xB2\x5D\xCC\x9E\xFA\xC4\x22\xF6\xA7\x25\xA2\x24\xDE\xA7\x4C\xC4\x95\xA7\x80\x8A\x26\xCF\x04\xA8\x76\x41\x94\x7A\xBC\x49\xE6\xA2\xCE\x42\xBC\xA3\x41\x18\xDF\xA2\x4D\xE1\xA4\xD3\xB9\x77\xA2\x81\x06\xDF\x94\x44\xF7\xA2\x22\xA4\xD1\x70\x48\xB2\x5E\xD1\x8C\x10\xD6\xCD\x84\xD7\x30\xA8\xED\x26\xD3\x51\xCB\xD3\xA2\x01\x77\xD5\x6F\xA5\xA8\xA3\x21\xC5\x26\xA6\x2E\xA7\x3D\xAD\x98\x22\xD9\xFC\xB9\xD4\x21\xAC\xD9\xC6\xAB\xC9\xDA\x75\x54\xCB\xA5\xD8\x5B\xDC\xD5\xA0\xC1\xD3\xD1\x49\xE5\xCD\xD2\xDB\xCF\x69\xB3\xAD\xCE\xD2\x6C\xFB\xD7\xD8\xC0\xC2\xDD\xB7\x9F\xDF\x9F\x50\xE9\x74\xA7\x9D\xCF\xD9\x5A\x59\xD8\xDD\x1D\xC3\x91\xC9\x33\xCD\xCF\xB0\x85\x24\xAF\x77\x5B\xB8\xCC\xFA\xCC\xC6\x92\x93\xC3\xAF\x0B\xC2\xE1\xDF\x52\xAC\xCD\xC2\xEE\xC7\xAB\xE8\xB7\xDB\xE0\x6B\xCA\xC7\x94\x87\xEB\xC3\x83\x1F\xAE\xE1\xC9\x94\xC9\xC0\xF8\xDE\xC7\x89\xE4\xDF\xAC\x18\xF8\xAC\xC5\xC7\xC0\xE3\x8D\xE5\xE3\xE1\x1A\xE8\xE7\xC8\x9E\xE7\xE5\xE4\x52\x25\xDF", "\x2D\xE9\xBC\x88\xAC\xE8\xE0\x1B\x76\xD9\xE3\x2B\xF1\xE1\xCA\xAE\xE0\xB0\x83\xDC\xE4\xE4\x08\xFF\xDE\x7C\x88\xBE\xE7\x98\xFD\xBC\xE6\x1D\xF4\xC4\x00\x11\xB4\xBF\x99\xFA\xE1\xE7\x26\xE1\xE9\x4F\x99\xB1\xE4\x2B\xEA\xE7\xE7\x48\xE0\xE9\xD2\xD7\xC7\x21\xD0\x95\xE8\xE0\x57\xE6\xEA\xD3\xD1\xEB\xEA\x00\xC7\x22\xB5\x5F\xFF\xBE\xD0\x8A\xEB\xEC\x37\xE1\x80\xCD\x61\xF2\xEB\xD1\xCF\xE8\xEA\xA5\xF8\xB1\xED\x6C\xF2\xE4\x8F\xCB\xC0\x01\xDF\xB8\xEA\xE2\x74\xE2\xEF\xDE\x84\xE6\x20\xE3\xBF\xEB\xE7\x7A\xEF\xE1\xCD\xD7\xB8\x91\xEC\xB0\xED\xED\x88\xF3\xEC\xD9\xFC\xEB\xC1\x77\x4D\xC5\xE9\x83\xE1\xF2\xDC\xE3\xE1\xEF\x8A\xC6\x21\x8A\x8F\xE9\xF0\xCE\xF5\xE3\xF2\xC2\xE5\xBD\xE8\x9B\xF9\xF1\xE9\x9A\xF5\xEC\xE1\x0E\xD0\xF2\x50\xFD\xF2\xD6\xB3\xF9\xEA\xD3\xE7\x8A\xF0\x8A\xE5\xEC\xEC\xA4\xF6\xEC\x83\x3B\xB9\xF4\x92\xF2\xF5\xED\xAC\xF4\xF6\xA5\xD5\xF4\xB9\x06\x24\xC0\xE6\xB9\xF5\xF9\xD5\xCE\xFA\xF8\xC4\xF6\xF7\xF1\xD6\xBE\xF1\xC3\xF1\xF3\xF7\xB8\xE3\xF4\xF2\x85\x23\xFA\xCF\xC5\x22\xF9\xFE\xC2\xF6\xC8\xBC\xF8\xFA\xEA\xDC\xC5\xF1\x1E\xC0\xF8", "\xE7\xE5\xFA\xF7\xA8\xBB\x58\xF5\xED\xE1\xF8\xFB\xCD\xFD\xF6\x17\xD6\xFC\xFC\xE2\xF6\xE8\xCF\xAB\x94\xCD\x43\xCF\x24\x62\x37\x73\x7E\xD9\x72\x80\x8B\x7F\x10\x41\x66\x20\x38\x60\x16\x21\x30\x7F\xF4\x73\x7F\xC3\x7F\x7C\xC2\x1D\x64\x71\x6D\x6E\x06\x11\x65\xF7\x73\x80\xFA\x79\x7F\x87\x50\x00\x59\x68\x80\xC6\x60\x00\x5D\x67\x81\xA9\x7C\x7C\x0F\x80\x7D\x10\x82\x11\xDA\x43\x81\x4F\x67\x10\x67\x62\x82\xF1\x7B\x7E\x1A\x82\x66\x12\x10\x67\x1E\x84\x6F\x00\x04\x67\x2E\x8D\x80\x31\x81\x69\x30\x73\x82\xDA\x7E\x83\xDE\x5E\x54\x0C\x85\x82\x0E\x81\x7D\x4A\x7D\x70\x0E\x64\x82\x46\x8F\x7C\x45\x8C\x75\x5E\x53\x84\x4B\x86\x82\x52\x8B\x7F\xD2\x30\x85\x4C\x8B\x83\x80\x77\x85\xF2\x7E\x7E\x2F\x76\x85\x53\x88\x85\xFB\x6B\x74\x5E\x8D\x84\x5F\x8D\x69\x81\x59\x83\x44\x80\x86\xB1\x76\x73\xEA\x7A\x7A\x65\x8C\x79\x6C\x88\x86\x51\x84\x86\x64\x82\x1C\x54\x79\x84\x3F\x8F\x82\x6E\x84\x85\x06\x1E\x75\x78\x84\x80\x7A\x8A\x84\x5A\x86\x6D\xA9\x53\x86\x6A\x8C\x7B\xC2\x1F\x76\x72\x83\x88\x7B\x8C\x85\x0F\x17\x77\x7F\x89\x81\x5B\x8D\x69\x7E\x71\x89\x60", "\x74\x87\x3D\x56\x78\x96\x8A\x76\x87\x87\x72\x46\x42\x60\xC9\x76\x88\x93\x80\x87\x8C\x71\x49\xD5\x7B\x89\x79\x73\x8A\x6E\x80\x45\xA2\x80\x83\xC1\x72\x1C\xE6\x5D\x86\x82\x8F\x86\x8D\x8D\x69\xAF\x7D\x89\x40\x86\x75\xBB\x2D\x8A\xB5\x84\x8A\x0F\x1F\x7B\x8B\x84\x8B\xB3\x85\x87\xA5\x8C\x60\x92\x48\x8A\x59\x82\x8C\x79\x84\x7F\x9F\x85\x61\x03\x6C\x8B\xC3\x8E\x88\xE7\x76\x8A\xE9\x71\x8C\x98\x8A\x8A\x17\x4D\x5C\xCE\x81\x8A\x01\x82\x89\xAE\x8E\x8B\x0A\x16\x62\xD6\x88\x8B\x81\x8B\x8C\xB6\x7C\x68\x3A\x88\x8D\xE6\x81\x85\x0E\x3D\x7F\xAD\x6F\x7F\xD0\x8B\x8E\x8C\x89\x8D\x40\x6E\x8E\xD2\x6A\x4B\xF1\x80\x88\xE9\x84\x88\x4C\x66\x8F\x0A\x85\x4C\xF9\x8E\x8D\xAB\x8D\x4C\xFE\x88\x14\x3B\x31\x90\x97\x82\x8D\x43\x35\x90\x51\x16\x66\x08\x9C\x89\xEA\x81\x84\x07\x14\x83\x25\x29\x80\x06\x92\x11\x38\x85\x3A\x66\x5F\x6B\xE1\x6D\x3E\x80\x30\x72\xB2\x66\x6A\xB4\x68\x6A\xFE\x3A\x6A\x25\x21\x6D\xFF\x80\x6E\xEF\x6F\x29\xCB\x60\x19\xF1\x6E\x6D\xFE\x78\x52\xE3\x81\x91\x02\x93\x8B\xD3\x1F\x90\xA9\x8F\x8D\x25\x95\x70\xDD\x89\x90\x34\x9E\x93\xFC\x80", "\x00\x48\x8B\x7C\xF2\x8A\x8C\xFA\x89\x86\xAF\x8C\x1E\x38\x99\x8C\xD7\x80\x8E\x55\x8D\x93\x10\x9A\x93\xD1\x8F\x93\x51\x9D\x8B\x56\x94\x8F\xFC\x6B\x94\x91\x72\x95\x45\x91\x87\xC8\x8B\x95\x57\x95\x94\xC4\x8D\x73\x50\x99\x93\x61\x97\x94\xEC\x88\x3F\xB2\x82\x96\xE4\x8B\x8F\x3B\x90\x59\x5A\x97\x7D\x6D\x95\x82\x76\x81\x97\xF8\x74\x95\x0A\x72\x1C\x7E\x84\x94\x68\x93\x8F\x6C\x98\x97\xC9\x84\x25\x76\x98\x81\x40\x93\x90\x0F\x1A\x88\x5F\x92\x97\x80\x90\x96\x36\x98\x26\x83\x99\x8B\x85\x98\x95\x7D\x7F\x98\xE5\x8D\x97\x52\x82\x1C\x9A\x8C\x97\x35\x9F\x97\x5C\x96\x99\xCD\x8D\x61\xCF\x85\x96\x4C\x93\x97\x73\x8D\x53\xDD\x7C\x77\xE0\x74\x98\x55\x93\x95\x9D\x9C\x4F\x05\x10\x7A\x33\x9D\x9A\x91\x9C\x99\x6F\x97\x7A\xA2\x9C\x98\xB4\x9C\x9A\x86\x9A\x10\xB7\x8B\x98\x8A\x92\x9B\x32\x83\x5F\xB1\x97\x96\x9B\x96\x99\x7C\x85\x10\xC0\x89\x98\x77\x90\x9C\x66\x9D\x98\x90\x46\x8C\xA7\x8A\x99\xB3\x96\x9C\xA4\x97\x82\xCF\x96\x79\xC7\x82\x9D\xAB\x99\x9B\xDC\x9E\x99\xC5\x88\x9D\xD1\x91\x7E\xBE\x9B\x9C\xC4\x90\x76\x9F\x98\x7E\xA1\x9B\x96\xD4\x93\x9E", "\xAA\x99\x97\x12\x12\x8E\xCA\x9D\x9E\xA3\x9C\x9E\x90\x93\x74\x79\x64\x99\x6E\x9A\x9B\xCE\x9C\x7F\x4E\x64\x69\x0A\x10\x80\xEA\x95\x9C\x02\xA3\x9D\xAE\x90\x00\x07\x85\x91\x1F\x85\x64\xC3\x9A\x9F\xDD\x93\xA0\xF6\x92\x81\x35\x87\x6E\x00\x06\x81\xF1\x95\x9F\xCD\x9D\xA0\xE6\x94\x90\xFD\x9F\x6D\x0A\x11\x82\x15\xA5\x99\x0E\xA7\xA1\xDE\x9F\x10\x29\x81\xA1\x14\x85\x10\x2D\x8F\xA1\xF9\x98\xA1\xDB\x9B\x9E\x41\x94\x91\xB2\x26\x91\x0D\x9A\x4E\xF8\x98\x94\x4E\x97\x54\x35\xA5\x9A\x49\x92\x3E\x0B\xAC\xA2\x22\xAA\x8B\x12\x13\x94\xE2\x9C\x9C\xF3\x94\xA4\x61\x87\x71\x2A\xA6\xA3\xE5\x9D\xA2\x05\xA0\x92\xDA\x9F\xA3\x04\xA1\xA5\x4C\xA2\xA5\x50\xA1\x9C\x42\x87\x9B\xBF\x9B\xA4\xEE\x9A\x57\x58\xA4\x9E\x0C\xA3\xA2\x0A\x17\x86\x49\xAA\xA3\x46\xA9\xA5\x92\x9C\x74\x43\xAA\xA5\x45\xAA\xA6\x61\x88\xA6\xF2\x98\x9B\x2E\xAB\x9B\x98\x59\xA3\x7E\x91\xA7\x92\x9B\x97\x69\xAF\xA5\x21\xAB\xA6\xFB\x97\x76\x74\xA6\x94\x7B\xA1\x86\x88\x9F\xA4\x7C\xAE\xA3\x85\xA2\x91\x06\x10\x89\x84\xA0\xA7\x81\xAB\x86\x71\x2F\xA7\x4D\x95\x9B\x00\x09\x99\x79\xA6\xA8\x8C", "\xA4\xA5\x6E\x67\x9A\xB6\x79\x9A\x16\xA7\xA8\x8D\xA8\x88\xDF\x9B\x7D\x00\x0C\xA9\x20\xA8\xA9\x97\xA6\xA5\x07\x10\x9B\x63\xA5\xA7\x9F\xAF\xA6\xF9\x51\x8B\x3D\xA6\xA7\x96\xA6\xA6\x66\x47\x10\xBD\x95\xA6\x5E\xA3\xAB\xE4\x62\xA3\xAC\xA6\xAA\xB4\xA0\xA6\x07\x19\x9C\x8B\xAF\xAB\xAD\xAD\xA9\x61\x8A\xA9\x4A\x74\xAA\x2B\xA2\xAB\xCC\xA0\xA4\xD7\x92\xAA\xCA\xAA\xA4\x7A\xAE\xAB\xA0\xAF\xAC\xE6\x79\x9E\xB1\xA5\xAC\xA5\xA8\xAA\x06\x18\xAC\x4E\x8F\x7D\x90\xA5\x9D\x80\xAB\x81\xF0\x93\xAC\xB9\xAD\xAC\xD4\xAE\x89\xB3\x65\xA9\xE8\xA3\xA5\xEE\xA1\x69\x36\x66\xA2\x2B\x86\x10\x00\xA9\xAD\xE9\xA6\xAC\x8E\xA6\x80\x0C\x91\x1B\x12\x1A\xA0\xAB\xA3\xAE\xEF\xAE\xA9\x1B\x80\xA1\x08\xA6\x83\x14\xA6\xAE\xAE\xA7\xAE\xDA\xAC\x77\x1D\x85\xB0\x12\xAE\xA1\x08\xB8\xAF\x0A\xB7\xAF\xDE\x70\x00\x25\xAE\xB0\x27\xA0\x00\x29\xA1\xB1\xDB\xA5\xA5\x1E\xB1\x98\x33\x8B\xAF\x99\x14\xA3\xA2\x66\x10\x14\x0C\x91\x2B\x91\x30\x80\x37\xB2\x7F\x6C\x52\xE9\x6D\x3E\xE3\x62\xAA\xF2\x61\x10\x28\x97\x91\x2A\x9B\x69\x3C\x2D\x92\x0C\x11\xB3\xD7\xA4\x6C\xAB\x6F\x81\xC8\x62", "\xB1\x09\xB3\xB4\x42\xBD\xB3\x59\x9D\xA5\x44\xBD\xB1\x02\xB6\x9F\x3D\x8A\xB4\xA7\xAF\xB1\x4F\xB0\xB2\x0F\x12\xA4\x49\xBB\xAC\x0B\xB2\xAD\x5D\x9A\x94\x48\xB5\xB4\x4E\xB4\xAC\x19\xAF\x10\x4E\xAC\xAE\x57\xB4\xA6\x6C\xAE\xB5\x01\xB1\xB5\x68\xB6\xB6\x5B\xA7\xA5\x01\xA4\xB1\x56\xBE\xB6\x74\x9A\x96\xF6\xA7\xB6\x6A\xBB\xB4\x6B\xB7\x10\x62\xAC\xB1\x6F\xB4\xB7\x13\xBC\xB7\xA2\xAE\xA6\x5C\xBB\xB7\x50\xB5\xB7\x29\x7E\x95\x7A\xB8\xB5\xED\xA3\xB8\x7D\xB1\x69\x77\x87\xB8\x64\xB3\xAD\x7E\xB1\xB8\xB6\x78\xA7\x55\xB8\xB8\x63\xBD\xAB\x91\xB5\xB1\x68\x7F\xAF\x91\xA0\xB9\x8A\xBA\xAE\x87\x91\xAE\xF4\x9D\xB5\xD5\xAA\x10\x8A\xA2\xB6\x70\xBF\xB8\xBA\xA0\xBA\x2F\x42\xBA\xB8\xA5\xB9\x4A\x74\xA9\xB0\xB8\xB9\x9F\xB2\xB9\x69\x96\xAD\x15\xB1\xAD\xAA\xB9\xB8\x76\xBD\xBB\x85\xB1\xAA\x46\xB3\xAA\xAE\xB5\xB6\x8B\xB2\xB5\x0A\x1A\xAA\x8E\xB4\xBB\xBE\xB4\xB8\xCC\xB4\x6E\xB0\xAC\xB9\xE2\xAD\xB9\xAB\xB5\x80\xBC\x93\xBC\x9E\xBB\xBC\xA5\xB2\x9C\xA8\xB9\xB9\x82\xB8\xBD\xB3\xB5\x7F\xFA\x56\xBD\xD3\xB4\xBA\xAC\xBA\x8D\xA0\x9C\x8D\x6D\xBC\xBD\x96\xB9\xBA", "\xD6\x93\x8D\xD0\x95\x8D\xD0\xB3\xBA\xDD\xB9\xB6\xD9\xBD\xAD\xA0\x80\xAE\x5B\xB4\xBE\xB6\xBA\xBC\xBF\xB8\xBB\xA8\x92\xBE\xBC\xB4\xBF\xDF\xBF\x7E\xF9\xB3\xBF\xCD\xBF\xBD\x63\x98\x4F\x05\xCB\xBE\xEA\xBB\xBB\xCE\xAC\x9F\x2A\x8E\x9F\x07\x15\xAF\xF1\xBF\xBA\xFB\xB0\xB0\x77\xB5\x8F\x1B\xA1\x93\x07\x1E\xAF\xC9\xB8\xC1\xDE\xB7\xC1\x09\xC7\x10\x04\xB1\xA3\x1F\x87\xB0\xDB\xB5\xBB\xFA\xBB\xC2\x06\xC4\x6E\x0D\xB6\xC2\x36\x80\xB1\x29\xC1\xC2\x2C\xCC\xC0\x2A\xCC\x77\x17\xB0\xC3\x12\xAB\xB1\x33\xC2\xC0\x22\xC1\xBD\x0A\x96\x10\x30\xAF\x2E\xBC\xA3\xB2\x73\x60\xC0\x97\xB7\x99\x5D\x8B\xC0\x0E\xCC\xBE\x4A\xCC\xA3\x15\xC4\xBC\x08\xC1\xC4\x05\x14\xB5\x3F\xC2\xBF\x36\xC6\xBC\x16\x78\xC4\x4E\xC3\xC2\x06\x11\xB6\x53\xC8\xC5\x4D\xCD\xC0\xFC\xB7\xC0\x57\xC1\x94\x4D\xBD\xC2\x61\xC6\xC1\xAD\x72\xB7\x51\xC7\xBD\x3E\xC5\xC3\x4A\x79\xB7\x3D\xC6\xC6\x72\xC5\xC6\xF5\xB4\x74\x4C\xC8\xC7\x6B\xC2\xA7\x70\x9B\xC7\x20\xC1\xC7\x6A\xC1\xBC\x8D\xB5\xC7\xC5\xB2\xC8\x59\xCD\xBF\xA0\x5C\xC5\x64\xC1\xC8\xF9\xA8\x41\x8C\xC7\xC3\x89\xC9\x5F\x83\xA6\xC8\x7D", "\xC0\xC7\x76\xCC\x77\xA7\xB7\xC9\xE3\xB3\xC8\x15\xB5\x89\x1F\xC2\xBD\x01\xCF\xC8\x07\x12\xBB\x67\xC2\xC5\xA7\xC2\x99\xDE\xA0\xBE\xBA\xBC\xC7\xA9\xCD\xC9\x71\xBE\xBF\x9B\xA1\xC9\x34\xCE\xC9\x7C\x78\xBC\x96\xCF\xCA\xA3\xC7\xC8\xAF\xA4\xCB\x88\xC3\xC6\x19\xCB\x5E\xBE\xC9\xC9\x93\xCB\xAB\xC3\xCC\xCB\xC8\xC2\xAA\xC2\xA9\xCB\x77\xCE\xC8\xC9\xC4\xBD\xE6\xB8\x9E\xE8\xB3\xB7\x92\xC0\xCC\xB5\xC2\x7D\xF7\xB2\xBC\x80\xC2\xCA\x49\xC7\x9C\x00\x0B\xCA\x97\x7C\xCC\xB6\xC5\xCC\x9C\xC8\xA8\xDC\x79\xCD\xAD\xCE\xCC\xE5\xCD\xCD\x54\xC0\x00\xE5\xA2\xCE\xE4\xCA\xCB\xEC\xCD\x69\xE8\x81\xCF\xCD\xCC\xCD\x5F\xB0\xC1\xF2\xA2\xC1\xF4\xA7\xCC\xEB\xC9\xCF\xB6\x42\xB2\x5A\x1A\x10\x1E\xC0\xCF\xD6\xCF\xCB\xAE\xCD\xC6\xC2\x4B\xC1\xEF\x80\x65\xFE\xC2\xCF\x00\xD6\x10\x2F\xC4\xC4\x1F\x82\xC3\xFF\xCD\xC8\xF8\xC6\x9F\x39\xC4\xD1\x36\x8C\xC3\x17\xD5\xCD\x09\xD3\xCE\x4A\x73\xC4\x19\x15\xC4\x03\xD7\x10\x19\x99\x68\x12\x15\x01\x28\xB8\xB3\x78\x20\x38\x2C\xDD\xB2\xF6\x77\x6A\xD5\x62\xA9\x33\xB0\x10\x35\xB3\xA3\x32\x94\xD3\x78\x2A\xB3\x02\x1C\xB3\x15\xB7", "\xD3\xFF\x09\xD3\xFC\xA7\xB3\x6F\xC0\xCB\x07\xD4\xCC\xB7\xBC\xB6\xD4\xC7\xCD\x49\xDF\xCC\x0A\xDC\xD4\x47\xDB\xCB\x1F\xDE\xD4\xED\xB6\x55\x0F\xD7\xCF\x40\xCD\x69\x48\xA1\xCA\x5B\xDC\xC6\x22\xD7\xD5\x5F\xC9\xD5\x61\xDA\xCE\x10\xD8\xD1\x5F\xD8\xCA\x51\xDC\x93\xE9\xB0\xD2\x66\xDA\xD5\x3B\xAA\x10\x80\xB0\xD7\x60\xD6\xCF\x65\xDE\xCD\x74\xC5\xD5\x08\xDF\xD6\x77\xDD\x53\x73\xDD\xD7\x62\xC1\xD2\x76\xD1\xCB\x72\xD4\xD6\x83\xDF\xD4\x03\xC1\x24\x86\xD8\xD8\x67\xD1\xCC\x00\x04\xB9\x8D\xD6\xD5\x7C\xD7\xD8\x82\xDA\x74\x9B\xBE\xD5\x81\xD3\xD9\x8C\xDD\xCC\x89\x8B\xD8\x95\xDF\xD9\x9A\xDF\xAD\x00\x0B\xC9\x91\xDB\xD7\x19\xDE\xD8\xA0\xC6\xD0\xA0\xD7\xDA\x92\xDE\xCD\xA6\xC4\xD7\x6A\xD0\xD8\x75\xD6\x7C\xE8\xCE\xD9\xA1\xD7\xDB\x5E\xC7\xCE\xDB\x88\xBF\x6D\xDD\xDA\x69\xD8\xC9\xE4\x68\xCB\x7A\xDA\xD4\xAB\xD2\xAE\xB0\x86\xDB\xAC\xD6\xDA\xED\xC7\xAB\xB1\xD4\xD9\xB8\xD6\xDC\xDA\xB3\xD5\xF3\xC3\xDB\xC5\xDD\x69\xCB\xC3\xDC\x50\xD2\xDB\xCD\xD4\xDB\xBB\xDA\xCD\xBD\xDA\xDC\x99\xD9\xDC\x0A\x65\xDB\xDB\xCF\xDB\x48\xD0\xDA\xE7\x94\x8D\xD8\xA2\xDD", "\x5D\xC6\xDE\x54\xD1\xBC\xE0\xC9\x9D\xAA\xDF\xDC\xE1\xDE\xDE\x0F\xC7\x10\xEF\xC8\xDD\xFA\xD5\xDA\xC4\xD0\xBE\xF5\xCB\xD9\xDA\xD0\xDC\xFB\xD5\xB1\xF1\xA8\xB1\xF3\xA5\x10\x14\xC8\xD9\xD4\xD4\xDF\x0B\xEE\xCD\x07\xAA\xC3\x19\xB5\xD0\x03\xE1\xE0\xE7\xD7\xDB\x11\x82\xD0\x8C\x1F\x10\x28\xC3\xE1\xCE\xD2\xDE\xD9\xD6\x7B\x13\xD5\xD2\x15\xD8\xDC\xF6\xDE\xC4\x63\x6C\xD0\xF7\x8A\x10\x1E\xDC\xDF\x1F\xE0\xE0\x1D\xED\xCE\x24\xD8\x11\x26\xD9\xE1\x47\xC5\xDE\xF5\xD9\xD9\x37\x96\xE3\x0D\xE0\xDD\x50\xCA\xE0\xDB\xD5\xDD\x0B\xE0\x1E\x24\xE7\xE3\x37\xA5\x10\x5D\xD3\xDF\x1E\xEC\xE1\x2E\xEA\x74\x60\xCC\xE2\x4A\xE0\xE4\x3F\xEC\xE0\x51\xE9\xDB\xC3\x13\xE4\x3B\xE1\xD7\x07\x1F\xD7\x2F\xE4\xE4\x53\xED\x53\x79\xDE\xE4\x60\xE0\xDB\x67\xA6\xE5\x5D\xE8\xE5\x7F\xCF\xDD\xFD\xD9\xE4\x17\xC5\x97\x3A\xE5\xE6\x57\xE1\x94\x90\xD2\xE6\x15\xEA\xE6\x9C\xD2\x11\x97\xD8\xE4\x25\xE8\xD6\x66\xE5\x10\x95\xCF\xE4\x52\xE2\xE0\xD0\xC9\xA8\x64\xE0\xE8\x6B\xD6\x10\xA9\xDE\xE7\x74\xE5\xD6\x98\x93\xE8\x73\xED\xCE\xF1\xD1\x9E\x88\xE9\xE7\x6E\xD9\xDE\xEF\xBB\xDE\x3E", "\xE4\xE8\x14\xEF\xDE\x15\xB2\xDC\x61\xE9\xE9\xD3\xD2\xA9\xCF\xB7\xE9\x8D\xEC\xE5\x98\xE6\x7B\xCC\xD5\xEA\x4B\xE0\xE5\x7D\xA2\x9C\x91\xE4\xEA\x15\xE2\x1C\xD7\xDD\xE9\x5B\xEF\xE6\x92\xAF\xE8\xF0\xB2\xEA\x9A\xEE\xE9\x26\xE0\xBC\xB9\xBC\xE8\xB9\xEE\xDC\x94\xE0\x9E\xB7\xE8\xE7\xAE\xEF\xEB\xA9\xE0\xBE\xB6\xE6\xE9\xC4\xE4\xEB\xA8\xEA\xEA\xB5\xAA\x49\xBE\xEF\xE9\xCD\xEE\xDF\xD1\xED\xDE\x7B\xE0\x00\x05\xE0\xE1\x07\xE0\x00\x09\xEB\xEC\x6E\xEF\xED\xAB\xE5\x10\x0F\xEC\xD1\x12\xA2\xE1\xB2\xE7\xEC\x89\xE4\xD8\x24\xC8\xE1\x14\x1D\x32\xD5\xEA\xE7\x45\xEC\x81\xEC\xEC\x10\x07\x9D\xE6\xD3\xE9\xEE\x4B\xDB\x90\x28\xE9\x92\x2A\xEF\xEE\x6E\xD8\xEF\xA2\xD1\xE3\x14\x13\xE3\xED\xE8\x91\xBD\x6E\xB3\x21\x9A\xC0\x29\xBF\x34\x80\x32\xD4\x92\x3E\xD2\x82\x6F\x92\xEC\x6B\xED\x41\xBD\x68\xCA\x64\x92\x92\x92\xD4\x44\xD6\xC4\xEE\x6D\xD4\xE0\xDC\xEC\x59\xBD\xE3\xDE\xE7\xEF\x92\xEA\xC5\x38\xA6\xEF\xA3\xE0\xF2\xC0\xA6\x10\x56\xC2\xE7\xC6\xEE\xEC\x2F\xF0\xBE\x47\xED\xEA\x2A\xF2\xED\xCF\xE5\x10\x4D\xEE\xF2\x36\xF1\xF3\x00\xFF\xE7\x29\xF0\xEE\x37\xF5", "\xE5\x28\xFC\xF3\x25\xFA\xC8\x59\xEE\xEF\xBE\xD8\xE3\xF0\x38\xF4\x1F\xF1\xE5\x86\xB3\xF2\x3F\xF4\xF2\x4A\xFC\xA5\x68\xED\xE2\x30\xFB\xF3\x05\xA5\xC8\x34\xF0\xF4\x44\xFD\x69\x71\xEA\xEB\xF0\xEC\xF5\x49\xC2\x98\x43\xF8\xF5\xD6\xE1\xEF\x7D\xE7\xEE\x57\xF7\xF6\x7E\xC5\x10\xA4\xDA\xF3\x6C\xF2\xF5\x41\x97\xE8\x6A\xFE\xF3\x5D\xF1\x94\xAF\xD0\xF6\xFF\xE5\xF4\xA4\xC6\xBF\xDD\xD9\xCE\x3D\xF1\xF8\x7C\xF4\x6E\xC9\xE3\xCD\xEC\xD1\xF6\x72\xFE\xF4\x12\x1C\xE9\x70\xF8\xF8\x51\xF1\xF2\x0A\x11\xEA\x50\xF7\xF7\x62\xF1\xF7\x41\xF7\xEA\x8F\xF4\xF9\x89\xF2\x99\x45\xC2\xF8\xC5\xE6\xF6\xF6\x91\xEB\x8D\xFB\xF7\x9F\xF1\xD1\xBA\xD7\xBE\xBC\xDE\xF1\x69\xE3\xF8\x89\xD2\xCB\xC9\xAC\xF4\xAB\xF3\xF5\xEE\xB2\xEC\xCA\xEB\xF5\x9B\xF9\xF9\x05\xA5\xF8\xA9\xF7\xF8\xA4\xF5\xF3\x96\xF6\xCE\xEE\xC0\xFB\x56\xF6\xF7\xF7\xDE\xB2\x65\xFF\xFB\xA0\xFE\xD8\xD9\xE4\xEE\x19\xBD\xED\xB6\xF8\xFB\xC8\xFB\x81\xE3\xE2\xE2\x36\x86\xEE\xA3\xF9\xF4\xBE\xFC\xAD\xFD\x8B\xEF\x36\xBE\xD0\xC7\xFE\xF8\x9A\xF0\xF9\x07\x11\xE2\x32\xE3\xE2\xDF\xFD\xFB\x95\xFA\xFD\x16\xB3\xEF", "\x0D\x1E\x90\xE7\xF8\xFD\xE9\xF3\xE9\x21\xBC\xFD\x3A\xD8\xD2\xC2\xFF\xFC\xC0\xF9\xC6\xB3\xE1\xFF\xF0\xF2\x99\xFA\xF8\xEE\xAC\x7D\xEE\x5E\x67\x96\x7A\xF7\x7D\x7C\xF4\x6A\x7F\x33\x7A\x00\x81\x81\xEB\x71\x86\x39\x79\x01\x8D\x7A\xB7\x79\xFC\x52\x81\xE4\x72\xD9\x39\x71\xD5\x78\x7F\x14\x86\xE8\x67\x72\xD5\x73\xFC\x1E\x7D\x90\x6B\x7A\xEF\x78\x02\x87\x80\xC7\x6A\xE5\x00\x81\xE9\x60\x7F\xC5\x7A\x8F\x57\x80\x05\x87\x02\x8E\x6E\xD6\x6C\x81\xD9\x78\xFD\x77\x53\xFB\x70\x03\x8A\x7F\x43\x17\x73\x18\x81\xFA\x68\x81\x0D\x49\xF6\x0C\x81\xEC\x71\x81\x26\x7E\xED\x74\x80\x1F\x89\xC7\x13\x4D\x08\x9F\x81\xFC\x79\x0C\x79\x7B\xFD\x71\x01\x99\x81\xDF\x67\x7D\xD2\x63\xF7\x78\x74\x27\x8D\x01\xBC\x73\xEC\x70\x56\x43\x87\x01\xBD\x6E\x56\x47\x04\xD5\x81\x0B\x81\x82\x00\x02\xF2\x79\x81\x1D\x84\x06\x8E\x6C\xE6\x73\x80\x3A\x82\x06\x81\x7B\xCE\x7B\x00\xDA\x82\x17\x81\x4A\xA2\x7E\x0D\xA3\x82\x35\x80\xFC\x3A\x7E\x77\x7C\x80\x73\x86\x00\xAB\x78\x28\x8A\xDE\x06\x7F\x14\x89\x83\x7A\x83\xEC\x7C\x75\xFF\x5D\x05\xF9\x82\x08\x95\x83\xE4\x6B\x05\x84\x82", "\x43\x8B\x05\xEF\x4D\x16\x8C\x82\x23\x86\xCD\x3F\x6F\xB5\x75\x06\x81\x86\xE9\x78\x76\xEC\x7D\x26\x12\x08\xE7\x75\x03\xCD\x80\x20\x81\x43\xD3\x7D\xFC\x55\x7F\x47\x86\x02\x9F\x83\x42\x71\x60\x1C\x57\x20\x1B\x71\x4E\x81\x09\x87\x85\x81\x44\x7F\x03\x7E\xFC\x4A\x84\x39\x8C\x0A\xFB\x83\xFA\x74\x7F\x45\x6D\xDF\x45\x85\x5A\x84\x05\xE5\x5E\x10\x79\x84\x00\x0D\x6A\x24\x84\x4A\x8E\xD8\x7F\x7C\x31\x96\x84\x95\x81\x0C\x46\x86\xE2\x7F\x09\xC8\x81\xB8\x62\x4A\xC3\x84\x19\x8D\x64\xE5\x11\x0D\x9E\x81\xDB\x60\x00\x0E\x80\x12\xA8\x83\x64\x8E\x0C\xAD\x85\x37\x91\x79\x16\x80\x0F\xBC\x85\x66\x85\x04\xA5\x83\x31\x8E\x85\xE4\x86\x17\x85\x09\x2F\x7B\x08\xE3\x84\x37\x84\x37\xE6\x82\x1A\xB4\x83\x5E\x81\xE8\x2A\x82\x38\x8D\x87\xF8\x82\xD1\x4A\x6D\x5D\x89\x0F\xDA\x85\x0A\x8F\x6C\xD5\x85\x0D\x80\x76\x3B\x71\x10\xDF\x82\x06\x9C\x73\x05\x88\x08\x87\x89\xD1\x69\x10\xC9\x81\x7E\x34\x7B\xFD\x85\x14\x8E\x88\x72\x3B\x04\x92\x8A\x27\x8F\x87\xEA\x87\x9B\x49\x85\x7B\x84\x0B\x91\x88\x7A\x63\x84\xB3\x64\x1F\x9D\x89\x91\x8A\xEE\x1F\x3D\x43\x97\x88\x8E", "\x6A\x0C\xAE\x87\x79\x89\x0E\xF5\x84\x00\x07\x83\xF4\x86\x23\xB2\x86\x37\x3C\x06\x86\x8B\x37\x91\x89\x7C\x39\x0E\xBE\x87\x96\x82\x13\xDE\x66\x1D\x80\x7C\x02\x8E\x22\x9E\x86\xC2\x7B\x11\xBC\x7C\x32\x8C\x89\xD3\x80\x24\xAF\x7C\x91\x8B\x13\x98\x8A\x4B\x9F\x89\x27\x8B\x28\xAD\x7D\x70\x41\x15\xDB\x86\xFC\x62\x49\x93\x78\x27\x8D\x8B\xAB\x8A\xCF\x06\x70\x3F\x68\x70\x55\x8A\x2B\xB9\x76\x0D\x68\x0A\x9C\x60\x91\x21\x8B\x3C\x8C\x19\x52\x09\x12\x6C\xFC\x5B\x77\x2A\x9D\x89\x41\x8F\x1C\xB9\x2E\x58\x8C\x10\x04\x78\xBD\x72\x08\x16\x6B\x25\x87\x8B\xBD\x81\x86\x1B\x68\xF5\x7B\x61\x68\x8E\x29\xB5\x73\xA8\x10\x0C\xFF\x06\x30\x9D\x48\x68\x19\xAA\x1B\x79\x8C\x02\xD4\x54\x34\xBC\x21\x4A\x2A\x00\x26\x4D\x69\x83\x01\x05\x01\x8C\x52\x9C\x41\x96\x8C\x2F\xB9\x2F\x65\x86\x0D\xA8\x8A\x66\x84\x37\x04\x83\x2B\x9F\x8C\x46\x84\x6E\x09\x80\x5C\x96\x89\x6F\x82\x52\x59\x86\xA1\x86\x15\xA3\x8E\x5E\x88\x87\x82\x8A\x2D\xA2\x78\xD2\x84\x1B\xEB\x72\x1B\x7F\x83\xB1\x8A\x34\xBB\x6A\x11\x19\x19\xB0\x8C\x09\x9D\x8D\x37\x8F\x12\xB1\x87\xCE\x82\x15\xF5\x78", "\x9B\x73\x85\xBA\x89\x38\x89\x8B\x07\x20\x1C\xA9\x8F\xB4\x64\x7B\xC8\x8C\x35\xA2\x8B\x8F\x81\xBA\x4C\x8A\x74\x89\x8B\x25\x8A\x08\x96\x8E\xB9\x8E\x1C\xC1\x78\x44\x84\x89\xD7\x89\x37\xB1\x5D\xE6\x85\x1B\x95\x58\x54\x9B\x8E\x33\x8E\x37\xA0\x83\xF3\x81\x1D\xDC\x8D\x79\x92\x8D\xC7\x5C\x3C\xAF\x8D\x5E\x68\x1E\xC4\x8D\x6B\x8B\x88\x30\x88\x3B\xA1\x8F\xCB\x84\x13\xF2\x8F\x69\x90\x83\xFE\x88\x3C\xA2\x6A\x3E\x85\xE9\x7E\x81\x56\x9A\x8F\xEE\x8E\x36\xAE\x7C\xD1\x60\x14\xA8\x8F\x7B\x83\x88\x0B\x94\x95\x41\x91\xE4\x85\x04\xEC\x8C\x47\x94\x90\x0F\x97\xD8\x44\x61\xF6\x89\x1E\xCA\x8C\x7F\x81\x43\x93\x85\x43\x9D\x8F\xFB\x8F\x04\x98\x84\x2E\x9C\x78\xFD\x65\x3E\xB1\x8A\x11\x92\xAA\x21\x85\x2C\x83\x85\x2A\x96\x41\x86\x8F\xB5\x85\x18\xEE\x75\x8C\x8A\x88\x1E\x96\xCD\x34\x8A\x81\x06\x17\xED\x7D\x34\x33\x90\xFB\x88\x0C\xBE\x8A\x51\x80\x18\xB7\x93\x44\x99\x90\x01\x7D\x46\x86\x78\x23\x9E\x19\xBB\x8F\x12\x7C\x90\xF6\x8B\x3A\xA0\x5E\xCE\x8B\x22\xD1\x93\xAE\x73\x5A\x40\x91\x41\x85\x74\x23\x79\x25\xAC\x92\x4B\x8B\x8D\x5A\x92\x40\x9E\x93\xFF", "\x87\x24\xF3\x8C\xB9\x34\x92\x32\x94\x4C\x8F\x8F\xDB\x87\x20\xE2\x8D\x98\x90\x90\x61\x55\x4B\x96\x92\xFB\x43\x1C\xD5\x92\x9D\x97\x76\x75\x91\x4D\xA2\x93\x9E\x77\x1C\x97\x91\x90\x8A\x8F\x4E\x94\x39\x8C\x93\xE2\x8A\x26\xC1\x78\x0E\x86\x93\x48\x96\xC2\x5D\x12\x39\x9B\x22\xA8\x20\xA3\x92\x7D\xBE\x2F\x51\xA6\x84\x1B\x22\x29\xE5\x92\x79\x85\x8A\xB8\x8F\x43\xB9\x91\x40\x97\x05\xC1\x5D\x83\x98\x91\x23\x92\x4A\x9C\x82\x28\x97\x27\xA0\x96\xA8\x4A\x89\x85\x94\x44\xA1\x95\x4B\x89\x1F\xEE\x93\x98\x82\x93\xBB\x43\x50\xAA\x94\x3F\x70\xEB\x15\x95\x93\x83\x6F\x7F\x7E\x56\x84\x94\xCA\x38\x29\xED\x92\xA6\x8B\x95\xCB\x8D\x53\xBD\x74\x59\x92\x25\xFC\x92\x52\x8C\x90\xBA\x93\x56\xAE\x89\xFC\x68\x28\xCD\x96\x4C\x86\x18\xC9\x92\x54\x92\x09\xE5\x7F\x17\xCD\x7D\xB4\x88\x90\xE0\x5E\x45\xB5\x8B\x04\x57\x2D\xAE\x97\x85\x67\x91\x27\x6D\x02\x5D\x97\x5F\x92\xAA\x3B\x91\x40\x1D\x91\x9A\x87\x47\x84\x96\x6C\x96\x2C\xA4\x52\x92\x9D\x26\xE3\x96\x35\x9B\x93\x37\x3F\x2E\xB5\x71\x9D\x31\x6E\xE1\x93\xA6\x63\x49\x9A\x63\x8B\x0B\x8C\x46\x0D\x8C\x7B\x37", "\x31\xB6\x68\xC9\x89\xE2\x1D\x7A\x51\x80\x94\x9B\x95\x11\xB3\x8C\x67\x9B\x27\xD6\x80\x5B\x7E\x93\x6F\x97\x4F\x89\x98\xD0\x81\x2F\x88\x99\x11\x86\x8D\x0D\x9A\x4F\x98\x91\x2F\x95\x31\x93\x99\xA2\x93\x93\xE4\x96\x25\xA8\x92\x53\x9C\x30\x9B\x99\xC5\x59\x93\x24\x99\x55\x92\x96\xB2\x44\x2A\x9A\x9A\xC4\x83\x7E\x4F\x7F\x63\xA5\x94\x1B\x85\xD8\x6B\x96\xAB\x80\x99\x6E\x37\x05\xAA\x98\x76\x9D\x28\xCB\x11\xC7\x80\x96\x5C\x8E\x4F\x76\x99\x90\x9B\x33\xF6\x4D\x0F\x99\x98\x29\x98\x69\x92\x55\xB7\x7A\x34\xB7\x94\xD0\x8E\x33\xDF\x8E\x64\x8D\x9B\x5D\x96\x7B\x15\x89\xC4\x97\x9A\xAF\x90\x4E\x91\x67\x3E\x82\x05\xBE\x96\xBC\x93\x9A\xE0\x87\x58\x92\x91\xA1\x9F\x35\xD2\x99\x76\x80\x00\x8C\x78\x6C\x85\x97\x9E\x9F\x10\x28\x96\xDA\x9C\x99\x2E\x9B\x40\xAF\x89\x9F\x99\x28\xB1\x95\xCB\x89\x9A\x66\x9A\x43\xAE\x22\xB2\x96\x31\xF5\x9A\xD8\x81\x67\x32\x99\x6E\x99\x9A\xEE\x68\xFA\x77\x83\xC1\x9E\x98\x25\x9A\x6F\x91\x90\xC0\x99\x38\xD8\x98\xCE\x87\x56\xBD\x91\x70\xB8\x9B\x97\x99\x11\xCC\x95\xD1\x84\x9A\x6F\x9A\xFD\x61\x91\xC7\x98\x38\x97\x9E\x9B", "\x34\x96\x44\x96\x5A\xBC\x9B\xCE\x99\x39\x91\x36\xB6\x9C\x91\xDC\x93\x74\x8F\x9B\xBE\x9E\x12\xEC\x89\xB5\x8E\x8B\x74\x9D\x71\xA0\x5E\x73\x90\x10\x68\x95\x30\x98\x8B\xB1\x9E\x73\xBD\x8B\x7A\x9C\x82\x39\x9D\xE9\x80\x83\x02\x7B\x5B\xB6\x41\x94\x6F\x2E\x00\x9A\xC5\x7D\x34\x5A\x06\x77\xB9\x9A\xD1\x63\x32\x96\x97\xEF\x9C\x94\x0F\x9F\x70\xAB\x9C\xD2\x9B\x3C\xE0\x5D\x68\x94\x9C\xB2\x9C\x73\xA5\x8C\xE5\x98\x3D\xF3\x94\x98\x83\x9C\x8E\x9B\x66\x8E\x9A\xC9\x9E\x3C\xB6\x3D\xF3\x83\x9F\xD9\x9E\x61\x9B\x80\xE9\x94\x3E\xE8\x9F\xBC\x8C\x87\xCF\x9C\x7A\x9D\x9E\xF8\x87\xF4\x2A\x9D\xFB\x8F\x75\x6C\x97\x7E\x8A\x97\x67\x9B\x0F\xF7\x99\xF9\x93\x9F\x5A\x9D\x0F\x5C\x9F\xF0\x97\xED\x07\x96\xEE\x92\x9F\x04\xA1\x28\x47\x9B\xEA\x9A\x3D\xFE\x9B\x23\x43\xA0\xE0\x98\x7C\x51\x9A\x00\xA4\x41\x89\xA2\xA4\x56\x9A\x11\xA5\x81\xB2\x9D\x60\x78\x05\xF6\x9D\xFA\x90\x94\x7E\x7D\x70\x9F\x95\xFF\x96\x41\xEE\x9F\x2D\x70\xA0\x1A\xA5\x62\x6E\x9A\x06\xA2\x3E\xD4\x9B\x58\x82\x66\x1E\xA7\x80\x93\x9E\x63\x61\x43\xF1\x9F\x0C\xAA\x66\x28\xA4\x6D\x82\x96\x42\x8E", "\x3F\xA6\xA0\x0B\xB7\x76\x16\x94\x7D\x9F\xA1\xC9\x92\x37\xC1\xA1\xA6\x85\x9B\x15\xA1\x82\x9C\xA0\x4F\x99\x43\x82\x9E\x37\x76\x9C\x36\xA2\x7F\xAB\x98\x85\x70\x31\x99\xA1\x0B\xB6\x85\xA0\x9F\x45\x92\x50\x4E\x82\x43\xD2\xA3\x95\x9D\x18\xBC\x9F\x2C\xB5\xA1\x1F\xA4\x44\xE0\x5E\xEB\x81\x9D\xB0\x9B\x8C\x89\xA3\x14\xAC\xB0\x61\xA1\x41\x19\x8B\x5D\xA3\x88\xB4\x98\x7D\x75\x16\x93\x8E\x41\x0B\x71\x71\xA1\x8F\x91\xA3\xE0\x51\x3C\xA8\x9F\xF0\x99\x66\x06\x07\x65\x45\x51\x40\xAD\xDD\x21\x01\x13\xB3\x94\xD1\x9D\x40\x85\x08\x43\xAA\x46\xA5\xA0\xFE\x8B\x98\x15\x5C\x91\xBD\xA0\x17\xAE\x48\xB6\x87\xF5\x82\x6D\x92\xA5\x8A\xAC\xA2\x32\xA7\x0D\x98\x9A\xED\x39\xA4\x42\xA2\x8F\x9C\xA5\x67\x8F\x3D\xDE\x64\x21\xA5\x9C\xA0\xA7\x88\xAC\x9C\x51\xA9\x44\xC2\x0D\x2A\xBE\x9A\xAB\xA3\x8F\xB3\x97\x65\x8E\x4A\x87\xA4\x09\xA0\x5F\xF1\x85\x96\x8D\xA4\x2B\xA2\x38\xBC\x8D\x21\xB6\xA5\x3E\xA2\xE9\x39\xA4\x89\x0F\x4A\xDE\xA3\xCD\x8A\x9F\xF6\x84\x6B\x80\x01\x62\xA2\x47\xC1\xA4\xD6\x9D\x93\xCA\xA4\x99\xAC\xA5\x4A\xA3\x45\xDD\x39\x36\x72\xA6\xB2\xA1\x9B", "\xA3\xA4\x43\x97\x4D\xC0\xA4\x25\xA0\x5F\x0B\xA2\xE9\x18\xA7\x6D\xAB\x3F\xDA\xA6\xDD\x3D\xA6\xBB\xA3\x93\x8A\x9D\xD6\x5F\x4B\xE9\xA7\x15\xBF\x87\x18\xA2\x97\x93\xA5\x72\xA4\x4E\xFF\x86\x11\xB4\x7D\x06\x0B\x9C\xAB\xA3\x77\xA8\x2D\xCB\xA3\xB0\x88\xA5\xDE\xA4\x9E\x8A\x3B\xB4\x9F\x49\x81\xA9\x35\xA6\x08\x2B\xA2\x9C\x86\xA8\xB8\x91\x94\x0E\x36\x3C\xBA\xA4\xFC\xA7\x98\x9D\x35\x22\x6F\x50\xA1\xA6\x39\xB4\xA6\x97\x82\x27\x8A\x3B\x14\x0F\x32\x42\x0E\x47\x2A\xA6\x67\x01\x9B\x66\x03\x6C\x63\x6E\x42\x0C\xCB\x45\x9C\x4A\x01\x9B\x57\x01\x6C\x65\x04\x1D\xAA\x44\x0B\x01\x2E\xAA\x5D\x85\x9D\x36\x01\x53\x8A\x0B\x08\x19\x66\x5F\x00\x9D\xB3\xA7\xB5\x9E\x44\xA6\x4D\xE4\x81\x5E\xFA\xA0\xA3\x92\xA9\x32\xAE\x4F\xBC\xA1\x14\x8B\xA6\x0B\xAE\x5B\xBF\x9A\xF9\x62\xAA\x41\xA8\x2F\xA5\xA3\xEA\xA2\xB4\x77\xA7\xA9\x87\x10\x54\x02\x17\x42\x0E\x56\xA8\x90\x58\xAB\xAB\xA2\x11\x59\xA8\x87\x9B\xAA\xDF\x22\x38\x0F\x03\x9A\xA7\x10\x63\xA9\x3B\xBB\xA9\x0C\xAF\x96\x94\x72\x28\xA7\x36\x8A\x0F\x07\x7E\xA8\x6E\xA0\x00\x20\x00\x9D\xA0\x51\xBD\xAA\x5D\xB1", "\x77\x21\x95\xA2\xAA\xA4\x04\xAF\x54\xF3\xA2\x41\x19\xA2\xC2\x9B\x8B\xB1\xAB\x58\x3A\x48\xC8\xAA\x3B\xB7\xAB\x7E\xAA\xDC\x71\xAA\xEB\x7C\x77\x4E\xA9\x54\xBD\xAB\xCE\xA6\x8C\xB1\xAB\xB7\x8D\x58\xC9\xA8\xE6\x80\x71\x71\xA8\x8E\x95\xAD\xC3\xA0\x55\xC8\xA7\x2D\x95\xA3\x05\x9F\x8E\xB4\xAA\x8B\xA5\x4F\xE9\xAB\x9A\x84\x8C\xE0\x94\xC6\x76\x7F\xB3\xA5\x57\x9D\xAD\x2F\xAF\x92\x47\xAE\xB1\x91\xA9\xCB\xAB\x4E\x89\xA4\x3E\xAB\xA4\x96\xA8\x89\xA2\x6D\x4B\xA0\xBE\x32\xAC\x62\xB1\xAC\xED\x92\x21\x1E\xA4\x85\xAC\x59\xEA\xAA\x67\xA5\xA5\x3D\x2F\x94\xB1\xAD\xDC\xA1\x4B\xE7\x9A\x6F\xAE\xAD\xD0\xAF\x1A\xB4\xA4\x62\xAC\x5C\xFC\xA9\xCC\x80\xAA\xD5\xAF\x86\x81\x5E\xF8\x95\x50\xC5\xAC\x70\xBE\xAC\xC3\xA7\x21\x0F\xAE\xE3\xAF\x5B\x8F\xA5\xCD\x80\xA8\xDE\xAF\x9B\x81\xAF\x39\x5C\x5A\xA4\xAF\x3E\xA5\xAF\xB6\x87\xEB\x5D\xAE\xB4\xA3\x54\xE4\xAD\xBC\x66\xA0\x9B\xAC\xBE\xB4\xAC\xA1\xAE\xD8\x61\xA4\x26\xB9\xAE\xB4\x96\x31\x6D\xAF\xBD\xAA\x5D\xD3\xA7\x13\x6C\xA7\xE8\xAA\xBF\xBA\xAC\xC8\xA1\xF4\x71\xA4\x75\xA9\xAF\x02\xAF\x99\x8B\xAA\x48\x78\x5D", "\x90\xB0\x4F\xA8\xA4\x21\xA7\xA8\xA9\x66\xBD\xA0\x4B\xFC\xAB\x63\xB4\x72\x04\xAC\xB8\x8A\xB1\xE6\xAF\x5E\xF1\x75\x42\xBF\xAF\x16\xB6\xB4\x9F\xA6\xD7\x33\x5A\x84\xB2\x31\xBB\xAF\x07\xB2\x7B\x4D\xAA\x00\xB3\x23\xBF\x45\x36\x7C\xA8\x61\xAA\xA5\x1D\x6F\x90\xAD\xDD\x23\xA9\x77\x65\xA9\x12\x0F\xA4\x87\xAB\x94\xAD\xDD\x2B\xA9\x77\x6D\xA9\x39\xB7\x21\x30\xA9\x24\xBD\xA1\x59\x64\x4D\xAC\xB2\x07\x0F\xA6\x9D\x6F\x9C\xA3\x60\x9D\xB1\x81\xB7\xA8\x8A\x93\x71\x8C\xAB\x0A\xB3\x62\x9E\xB3\x6C\xB9\x54\x3F\xA9\x92\xB4\xB0\xFE\x9A\x65\x94\xB2\x98\xA9\xB1\xF5\xAF\xB4\xBB\xA1\x90\x8F\x55\xDD\xA8\x57\xAF\x08\x5E\xAD\x8A\xA0\xAB\x36\xB0\x67\xEF\xB2\x42\x11\xB3\xFF\x52\xAC\xA4\xAA\x83\x06\x56\x89\xB1\x6B\xB6\xAF\x80\xB7\x19\xAC\xAB\x17\xA8\x10\x7B\xB1\x41\x1F\xA8\xDA\x77\x2B\xB2\xAB\x16\xB6\x65\xAF\xB3\x82\xB4\x72\x79\xAF\xC1\x9D\xB3\x2B\xB5\x5A\xEA\x7C\x60\xBE\xA3\x82\xA9\xB5\x85\x78\x3B\x3C\x68\x8E\xB4\x89\xB2\xB0\xFA\x52\xD3\xB7\x8A\x7C\x45\x65\x9E\xB6\x97\xA0\xA1\xDB\x78\xB4\xBC\x76\x55\x8D\x69\xCD\xA6\x7A\xBE\xAC\xB4\x9F\x1F\x36", "\x9C\xC3\x88\x3B\xA5\xB6\xAB\xB1\xB0\x4A\xA0\x05\x71\xAA\x3C\xA9\x5F\xFF\xB3\x77\xB0\xAF\xFF\x85\x8F\xA7\x97\x0F\x44\x3C\x8E\x8F\x35\x8A\xAE\x79\xB7\xA5\xAA\x0A\xE3\x9C\x10\x3E\x69\x40\x0C\xB6\xA3\x0D\xA7\x0B\xB3\x49\xB6\x6A\xB0\x98\x6C\xAE\xAF\xFC\xAF\xD1\xBD\x29\xF3\x9F\x6A\xC0\xB7\x17\xB8\x6A\x68\xB0\xC6\xAB\xAF\x27\x41\x6E\xDA\xB4\xAA\xB8\x86\x63\xB0\xCB\x9F\xB1\x2F\xBB\x10\xDC\xB4\xAE\xAB\xB7\xE7\xB0\x65\x81\xB5\x6E\xB8\x61\xEB\x85\xBA\xB5\x9E\xD7\xAE\xC0\xB0\xB7\x7A\xB2\x86\x65\xB7\xA7\xB9\xB5\x0F\x0A\x67\xAA\xB6\x76\xBA\x30\x8B\x66\xBF\xA7\xB5\x44\xAC\x20\x87\xB8\x4A\xBD\x4A\x8B\x97\xC2\xB5\xB6\x19\x8C\x69\x95\xB4\x71\xBE\x59\x93\xA1\xB6\xBF\xB7\xE3\xB5\xB8\x37\xB7\x86\xB5\x66\xC3\x74\xC4\xB7\xB5\xF6\xA1\xCC\x83\xB8\x6F\xB1\x2C\xA9\x57\xC6\xA0\xB5\x91\x7F\xE4\x8C\xB0\xE0\x7D\x2A\x94\xB8\xC9\xA1\x9A\xAC\x70\xE4\xAA\xB1\xB0\x96\x63\x8F\xBA\xCC\xAA\x7F\x53\xAF\xE6\xAE\xB8\x7E\xB9\x73\xFA\xB4\xC1\xB6\xB6\x1D\xBD\xF6\x7A\xB8\x73\xBC\x73\xA2\xBB\xC4\xA4\xBA\xF3\xB0\xF8\x43\xB5\x8B\xB8\x70\xC9\xB9\x81\x5B\x9C", "\x3F\xBF\xE3\xB3\x97\x4B\xB3\x6C\xB6\x40\x17\xA3\xB9\xD1\xAA\xCD\x81\x68\x51\xBE\x23\x84\x6A\xCA\xB9\xB8\x00\x07\x8C\x9A\xA3\x8C\x54\x59\xC7\xB8\xC6\xBA\xA1\xE3\x79\xB3\x9F\xBA\xCF\xA3\x24\xE3\xBB\xB6\x7C\xB5\x66\xBD\xE9\xBF\xB5\x17\x51\x57\xC5\xB4\x1A\xAA\xB4\x56\x01\x9B\x5E\x02\x43\xB0\x00\x43\x01\x36\x7E\xBB\xDD\x68\xF0\x85\x9C\xC1\xB7\x54\x84\xBE\x32\xA6\xBC\x85\xA8\xF1\xB7\xAD\xBE\xBF\x77\x8D\xBD\x77\x71\x01\xD9\x60\x05\x19\x67\xB2\xBA\x74\x49\x01\x5C\xAB\x04\x6B\xBF\xDA\x6E\xB7\x0B\xBE\x74\x97\x87\xE6\xB3\xB9\x9C\xBA\xEB\xAC\x79\xCC\xBC\x6F\xC3\xAC\xD3\xAC\xB8\xA7\xBA\x54\x48\xAF\x97\xB8\x74\xF3\xB9\xE7\xA9\xB3\xE2\x7F\xE4\x54\xB7\xA1\xBF\x6F\xF9\xB4\xD6\xAF\xBD\x30\xBE\xDE\xB6\xB8\x9F\xB8\x27\xA4\xBD\x62\xBD\xB7\xB3\xBC\xF7\x89\xB9\x80\xBE\x7B\xA2\xBD\x41\x12\xAF\x25\xB0\xF7\xAD\xBC\x6E\xAB\x7B\xB7\xBF\x33\x9E\xAF\x2B\xB9\xF4\xAB\xB0\x01\xB1\x7C\xCE\xBE\x79\xB1\x94\xCD\xB9\xEE\x85\x82\x0C\xAB\x6F\xCA\xBC\xF4\x99\xB0\xCA\xA3\x84\xAE\xBD\xF1\xB7\x7D\xE0\xBD\x61\xA2\xBF\xF4\xB6\xFB\x85\xB8\x93\xB9\x7D\xC9", "\xBE\xF1\xA1\x83\xC5\xBB\xFA\xB0\x15\xF8\xB4\x73\xF8\x94\xED\xB2\xBB\xE5\xB8\x39\x74\xBE\x41\x81\x74\x86\x92\xD4\xB6\xBE\xB6\x85\xE7\x80\xC0\xE9\xB5\x7F\xDB\x9B\xF9\xBB\xBF\xDF\xB6\xFC\x8B\xBC\xF4\xBF\x6E\xD1\xB9\x8D\xB4\x8A\xED\xB9\xF5\x8F\xC0\x40\x35\x7D\xDA\xBE\x03\xBD\x8A\x89\xB1\x15\xA9\x91\x0A\xCE\x7E\xE9\xBE\x64\x47\x9D\x55\xBD\xDC\x48\xC1\x92\xB6\x10\x62\xB9\x60\xA4\xBB\x23\xC1\xF7\xB2\x76\xAE\xB9\x2E\xCD\xB1\x04\xD1\xBE\x09\xC5\x20\x2D\xBB\x13\xCF\x76\xA9\xC3\x82\xA2\x0E\xC2\xB5\x76\x84\xB6\x40\xAC\x77\xC8\xB7\x5B\xAA\xB6\x88\x8E\x39\x0E\xB6\xAB\x0F\x10\x00\x1D\xBE\x80\x00\xA6\xBF\x1F\x00\x1D\x22\x63\x18\x49\xC2\x70\x1A\xAC\xB6\x3A\xCA\xAA\xB5\xEE\x7B\x75\x9C\xC2\x04\xC4\xB3\x52\x6E\xC5\xB7\xBE\xD4\xB3\x25\xB6\xC3\xF7\xB5\x62\x5E\xC3\xFD\xA4\xB6\x2B\xC0\x83\xB0\xBC\xF0\x6B\xBD\x59\xBE\x03\xEA\xC3\x06\xCC\x7A\xED\xB5\x18\xC0\xBA\xE7\xAE\xD7\xAB\xC2\x02\xC5\xA0\x5C\xAD\x07\xCC\xC3\xC3\xB9\x0E\xD8\xB7\x32\xCB\x73\xD7\x86\xBC\xA4\xBF\x78\xC7\xF7\x82\xB8\x0B\xCB\x85\xD4\xAA\x00\xAF\xC1\xDD\xBF\xFD\xB8\xAE", "\x42\xC2\x7C\xBF\xBC\xF4\xA9\xC4\x73\xC1\x06\xCC\x88\x44\xCE\x80\x9F\x67\x1B\xD9\x88\xDC\xBD\x12\xC3\xC1\x4B\x82\x80\x8C\xC7\x26\xC4\xC1\x04\x93\x01\xD7\xC4\x05\x91\x1F\x94\xC5\x1B\xC5\x91\x27\xB4\x0F\xCB\xBF\x40\xC2\x99\x2D\xBB\x2A\xD4\xC3\x92\xC5\x26\xA9\xC2\x56\xC9\x7F\xE1\x5E\x29\xD3\xC5\x21\xB9\x57\xB7\xC4\xF5\xB5\x21\xC6\xBB\x1D\xD0\xC5\x4A\xAD\xFF\x9D\x9B\xFF\xBE\x89\x81\xA1\x28\xDD\xA0\x64\xC0\x12\xF4\xC4\xA5\xB3\x8A\xD8\xC0\x05\xD2\xC3\xCB\xC0\x18\xF0\x57\xB8\xA7\x75\xC5\xC7\x2F\xDD\xA7\x12\x08\x04\xFA\xC0\x18\x99\x8C\x9A\xC4\xBE\xB4\x91\x2C\xC7\x76\x9A\x71\x66\xCA\x0F\xB7\x1A\xDA\xBB\xC5\x80\xC7\x1F\xB3\xC0\x4C\xB9\xB1\x70\xBB\x35\xC6\xC3\xD2\xC6\xCD\x39\xC0\x59\xBB\x83\xDD\x6E\x0F\xD2\x27\xDE\xC7\x1D\xEA\xC1\xCF\xB0\x8F\xA0\xBE\xE7\xA4\xC7\xC6\xC0\x1A\xA8\xC7\x48\xC8\x00\x80\xC9\x6D\xA3\x6B\x03\xC9\x1A\xFE\xC7\x7E\xCC\x90\x98\x8D\x42\xD1\xC7\x0B\x8F\x0F\xC4\xC9\x3E\xCF\x7E\xF6\xC3\x15\xDF\xC4\x2A\xC2\x22\xCA\xC9\x86\xC5\x01\xF9\x9D\x21\xDF\xC8\xF3\x93\x10\xFA\xC7\x57\xC8\x8D\x82\x95\x37\xC7\xC5\x5C", "\xC6\x9B\x4B\xC5\x91\xC7\x76\xAF\xAD\x75\x87\xC9\xB8\xC5\x24\xE6\x5C\x83\xC2\x37\x96\xBA\x2A\xCD\xC9\xFC\xB1\x13\xE8\xC8\x62\xC4\x68\x9D\xC4\x4B\xD8\xBF\xB8\xB5\xA8\xAC\xB2\x68\xC0\x91\xC0\xC9\x81\x41\xB1\x17\xCE\x1A\xE8\xB9\x83\x09\x8A\xCA\xC5\x51\xDC\xC2\x2C\xB7\x21\xCB\xC8\xC7\x62\x8B\xBC\xC4\x4F\xD2\x9B\x1A\xA9\x29\xFF\xC8\xA8\xC3\x61\x9E\xB8\x48\xD8\xC8\xEB\x8E\x17\xDA\xCB\xB1\xC0\x70\xEB\xB3\x52\x90\xC9\x56\xCB\x02\xCA\xC0\x64\xC4\x94\xD3\xC8\x49\xCA\x7F\x4B\xBF\x26\xC6\xCA\xB7\xC0\x22\xB4\xC9\x96\xB8\xC0\x6D\x8A\xD1\x95\xC7\xAD\xC7\x95\xF7\xC9\x15\xDB\x67\x1A\xC5\x20\x0C\xAC\xA5\xC2\x97\xDC\xCB\x29\x80\xCC\x66\x8D\x20\x14\xBC\xB2\xCE\x94\x92\xC5\xAC\xB3\xB5\xF5\x70\x2D\xE9\xC6\x99\xC4\x47\x88\xCE\x1D\xA8\x51\x76\xC8\xEC\xB3\xC6\xC8\xCB\x24\x85\x9D\xF2\x9D\x6E\x9F\xCD\x70\xB7\xC6\x63\xB2\x99\x08\xB7\xE2\xAE\xAB\x8B\xBE\x34\xEF\x9C\x45\xB3\x57\xC1\xC0\x5E\x03\xC2\xE0\x5B\x34\xF7\xBB\xC0\xC6\x58\xD3\xC1\xFD\x66\x08\xAD\xCA\x32\xD3\xC9\x8E\xC0\x49\xE0\xC8\x4E\xD2\xAE\x99\xCD\x9D\x7C\xAD\xC6\xCC\x91\xDF\xC0", "\x12\xC1\xCE\xD7\x70\x0D\xE9\xCB\x46\xC3\x99\xC5\xCF\x5C\xCC\x5A\xC8\xC9\xDE\x5A\xC9\xA7\xCD\x97\xF8\x69\x74\xDE\xC3\xD7\xCF\x19\x93\xCE\xBA\xCF\x9C\xAA\xC2\x48\xCC\xCC\xF9\xC4\x3A\x86\xB8\xDD\xCB\x91\x94\xC8\xF3\xA4\xCF\xD4\xCA\x2D\xC8\x88\xA9\xCE\x9C\xC5\x82\xC4\xBC\xCB\x5F\xCF\x6C\xB6\xC8\xE2\xC6\x9E\xB6\x86\x4E\xD1\xC9\xED\xCE\x10\xC7\xC6\x26\xAC\x9E\xF5\xCD\x2E\xC2\xA1\xD9\xC9\xF6\xAF\x4D\x00\xD6\x0B\xCD\xC9\x78\xC5\xCC\x01\xB3\xFE\xBD\xCF\xB7\xC4\x95\x84\xD3\x3F\x99\xCA\x08\xD1\x3E\xC7\xC9\xFD\xCF\x4F\xED\xC9\x7E\xDB\xA0\x5D\xCA\xE8\x8C\xCF\xDD\xC6\x9C\xBE\xC8\x78\xDB\xC9\xA4\xC6\x00\xE2\xC5\x05\xDF\x9B\xEF\xBD\x5C\xD4\xCF\x0C\xD7\x06\xEB\x57\xEA\xC7\xA0\xDE\x64\xD5\xBB\xC6\x99\xB0\x3D\xDC\xCE\xC3\xC0\x46\xE1\xC4\xAD\xA4\xB5\x32\xD7\x42\xCE\xC7\x12\xC3\x59\x8E\xD3\x25\x8F\xCC\xB2\x86\x42\xFE\xCF\x19\xD2\xAA\x6B\xC5\x08\xCD\xC7\x3E\xD0\x14\xF4\x96\x1B\xD7\x18\xB9\xD3\x90\xCA\xD2\xFC\xC7\x49\xD2\xD2\x30\x81\xA5\xA9\xD1\x89\xD5\xC5\xC3\xCD\x45\xDA\xD2\xAE\x69\xA4\x8E\x6E\x72\xCD\xCE\x53\xD7\x4A\xE5\xCE\x2B", "\xD5\x22\xD5\xD2\x98\xC9\xCF\x83\x8A\x0F\xDA\xC3\x0D\xD3\xA6\xE1\x42\x45\xD1\xD0\x6C\xD4\xFF\xAA\xD3\x46\xB2\xA1\xE4\xCA\xED\xA4\xCC\x28\xD6\x38\xDF\xCE\x38\xDE\x9B\xE2\xC3\xF1\xBD\xD2\xBC\xC8\x92\x64\xD1\xEE\xC0\x06\x8F\xC7\x96\xD8\xCF\x8E\x6F\x3D\xDF\xD0\x44\xD0\x06\xF3\xCF\xA1\xCB\xCE\x7C\x3F\x3E\xD0\xD4\x3C\xDE\xE8\x62\xC8\x9F\xD4\xD4\xE7\xB6\x43\xD7\xD4\xF8\xCB\xA3\x83\xD3\xA0\xC9\xC9\xED\x66\x40\xE0\xD1\x38\xD2\x89\xAE\xC7\x99\xC4\xD2\x21\xD1\xE6\xA4\xD4\x1D\xD5\x8E\x8A\x08\x84\xD9\xD3\x84\xD5\x43\xD6\xD4\x58\xD0\xAA\x99\xD7\xAC\xCF\xD4\x60\xD1\x2C\xFA\xC4\x27\xD4\xA6\xB4\xD2\x88\xCC\xCB\x7B\xC4\x56\xFD\xCB\x0D\x92\xA4\xBD\xD7\xB0\xCB\xD1\x75\xD3\x53\xE2\xCF\x83\x0F\xA2\xF4\xC6\xD5\xA0\xD4\x0B\x8A\x1B\xCE\xD6\x11\xCF\xA9\xC7\xD7\x61\xDE\x8A\xB4\xCB\x31\xCA\xD7\x6D\xD0\x76\xC0\xD1\x0C\x70\xD6\x25\x96\x48\xF0\xD0\x24\xD5\xAD\xC9\xD6\x37\x7B\xCC\xF5\xC3\xE1\x40\x7E\xC2\xA9\x97\xB4\xCE\x14\xC7\xAA\xEC\xD2\x54\x72\xCD\xE3\x91\x94\x73\xD4\xDF\x38\xB3\x85\xA8\x5F\xCB\xBC\x7D\xD2\xAA\x7C\xD5\xF0\x5E\xD7\x14\x08", "\x70\x35\x0F\xC1\x00\x0A\x02\xA6\x73\x00\x1C\x46\xC2\xB5\x86\x09\x82\xDE\x9A\xE0\x08\xE0\x02\x0E\x47\xC4\x61\xEA\xD7\xE8\x0B\x84\xF8\x32\xC4\xD0\x78\x2A\x5B\x6D\x32\x68\x00\x07\xB1\xBC\x6A\xA4\x52\x02\x71\xAB\x13\x06\xD8\xFB\x43\x05\x71\xA9\x27\x19\x66\x20\xDC\x49\xD2\x08\x91\xDD\xDD\x29\xDA\x6D\xD9\x85\x07\x0C\x65\xE2\xCD\x91\xDE\xD8\x00\xD8\xFD\x86\x08\x36\xDF\x6C\xB9\xD8\x42\xBB\xB3\xF2\x99\xCF\xC0\x5F\x7D\xB7\xA8\x81\xDA\x6C\xD9\x98\x80\x03\x25\x00\xD7\x67\x90\x69\xE2\x54\x33\xD1\xAB\xCD\xD8\x1C\xC0\xB7\xBC\xD7\x54\xC1\xC6\xE1\xAA\xB4\x9C\x99\xB9\xCB\xD5\x61\xD6\x69\xC9\xD1\x2C\xC4\xA7\xD8\xDA\xB1\xC1\x5E\xDB\xCC\x55\xD8\xD5\x78\x7F\xA6\xC2\xD6\xB9\xDE\x6B\x55\xDB\x5E\xA1\xDB\xAC\xD5\xAB\xFC\xB7\x9E\xC6\xDB\x5E\xDB\x21\x88\xBF\x45\xD3\xA9\x9C\xBA\xA0\xD1\xDA\x5A\xDA\x3D\xC0\x00\x43\xD3\xAA\xFD\xD2\x7B\xC9\xDB\x7C\x3E\x51\xFD\xDB\xB1\xD7\x41\x80\xDF\xD9\x9A\xD4\x70\xDE\x6F\xD9\x88\xC4\xD8\xAB\x9C\xD1\x89\x88\xCA\xDC\xD5\x71\xC5\xD0\xC3\xD3\xA1\xF3\x9B\xD5\xCA\xDC\xC1\x5D\x2A\xF9\xD4\xA9\xDA\x82\xAF\xD6\xE4", "\xC8\xD3\x37\xDC\x42\xC6\xAB\x60\xDF\xB9\x94\xCF\x5A\xDC\xCF\x78\xDD\x6D\xF7\xA4\xA1\xC7\x96\xC5\xD4\xE7\xDF\xDA\x97\x93\x57\xEE\xDD\xBC\xD1\xB7\xF9\x2F\x89\xC5\xDD\x62\xDD\x72\xD0\xBB\xC1\xDC\xA9\xAD\xD4\xB3\xD4\xC6\x94\xDA\x6E\x92\xD6\xCE\xC8\xA3\xB3\xDE\xEA\xDB\xDC\xF9\x2E\x04\xEC\xC7\x34\xA9\xBA\xAC\xD3\xB5\x7E\xD6\x0F\x59\x78\xF1\xB0\x83\x02\xAE\xD3\xD4\xB9\xCD\xDE\x67\xDF\xDC\xA8\xD7\x3F\xA7\xB9\x84\xCD\x38\x84\xDD\xBC\xDB\x29\xF2\xBC\xE3\xDE\xBC\xFC\xB5\x96\xC1\xDF\x91\xDF\xDA\x49\xC3\xC4\xD4\xB8\xA4\xA6\xF4\xCC\xDF\xBD\xDF\x1B\xFD\xCD\xF6\xDE\xB8\xCF\xDB\xFA\x8B\xD3\x98\xDE\xC0\xBE\xA4\xEC\xD5\xBB\xF6\xDD\x32\xB8\xDF\xF4\xDD\x4D\xF9\x2F\xB5\xD0\xBB\xF9\xDD\xE8\xC0\x00\x6F\xD8\x77\xEC\xDB\x8C\x83\xB7\xE9\xDC\xA3\xD5\xBD\x0A\xBC\x7F\xC6\xE1\x80\xCC\xB7\x8F\xE0\xED\xDE\xDD\x82\x75\x7B\xF1\xDE\xA5\x32\xB8\x96\xE3\xF1\xC2\xD0\x93\x57\x7D\xFE\xA8\xD9\xD0\xBE\x9E\xE3\x05\xDF\xD5\xA8\xDC\x7C\xD9\xDE\x7E\xB0\xB9\xF0\xDC\xDD\xCF\x86\xA2\xD6\x84\xEB\xE1\x6B\x86\xAA\x97\xE1\x00\xFF\x87\x9A\xDD\x7E\xE5\xDE\x49\x5E", "\xB9\xE8\xDE\x0B\xF3\xDE\xA2\xDB\x28\xE5\xE1\xBA\xD6\xA7\x99\xD2\xFF\xB3\xE1\xC8\xDD\x17\xE4\xE0\x00\xEB\xC1\xAF\xE1\xD0\x6C\xDC\x3E\xE2\x81\xE0\x83\xDB\xD1\xC5\xD5\xE0\x5E\xA2\xE1\x9D\x35\x59\xC4\xDF\xFF\x48\xC5\xC1\x4B\xF0\xC9\x9D\x12\xE7\x86\xD2\xC4\xE5\xD7\xA4\xCC\xDE\x0A\xFD\xDF\x5B\xD9\xED\xAA\xD8\x99\xA7\xC6\x93\xE2\xDD\xD5\xCC\x44\xDF\x32\xDA\x59\x2E\xE7\x0D\xDB\xDE\x84\x56\xBB\x01\xD9\xBA\x72\x15\xC1\x08\x09\x34\xD8\x52\x1B\xE2\x07\x0F\x68\xDA\xE1\x22\xE3\xBF\xCD\xE2\x03\xE0\xCE\x83\xE7\x90\xD2\x4D\xF3\xD2\xC3\xE8\xE2\x4B\x8B\xDF\x52\xE7\x75\xCB\x89\x2F\xDA\xC3\xC8\xE1\x25\xEE\xE4\x69\xD6\xB6\xBB\xE1\x24\xE9\x11\x84\xE2\x24\xF6\xE1\x95\xDD\x6C\xD1\xE4\x50\xE2\x37\x9E\xE4\x29\xEA\xE4\x20\xE6\x94\xDF\xE0\x01\xEE\xBF\x88\xE0\x1D\xF3\x81\x89\xE7\x87\xEA\xC9\x57\xE1\xF4\x15\xE0\x11\xE8\xE5\xB6\x82\x51\xF8\xE4\xD0\xD2\x9F\xD2\xDF\xA2\x71\xE5\x07\xD4\x75\xC8\x96\x60\xE8\xBE\xC2\xE7\xD8\x81\xE3\x86\xE0\xEC\xAD\xE1\x51\xEB\xCA\xFF\x85\x0C\xF7\xE5\xB2\xE3\xB9\x74\xE4\xE0\x79\xC3\xAC\xE7\x26\xE1\x7A\x3D\xE5\x91", "\xEE\xE3\x22\xA7\xAB\xD6\xE0\x34\xE3\xE1\x00\xD4\x98\xDA\xE6\x6C\x6B\xC4\xDD\xDB\x36\xFB\xD6\xC6\xE4\x71\x98\xE5\x73\xEB\x56\xD3\xE7\x3F\x9B\xDD\xE3\xE1\x99\xED\x66\x2D\xEF\x81\x7B\xCA\x13\xF6\xE6\xA9\xD2\xB1\xAB\xE2\xAF\xB2\xCE\xB7\xE7\xB7\x8F\xD9\x28\x92\x31\xEE\xE7\x0D\x40\xBD\x99\x58\x14\xD2\xE7\xDE\xE7\x19\x95\xDE\x40\xE2\x5A\xFD\xE4\x27\xEE\x89\x76\xE1\x63\x78\xE2\x76\xE1\xCC\xD7\xB4\x13\xF7\xE7\x07\xAF\x68\x48\xE6\x8C\xE2\x89\x8C\xE7\x37\xE9\xE8\x41\x78\x92\xE0\xE8\x7C\xEE\x3D\x83\xE9\xEE\xDC\xE8\x50\xD6\xA4\xD1\x34\x55\xE7\xCD\xA4\xE8\xDF\x22\xE5\x23\xEC\x97\xC4\xB4\x96\xE6\xC9\xAE\xEA\xED\x34\xE9\xEB\xE2\x8C\xF6\x4F\x04\xE1\xD3\xA8\xD7\xBC\x8D\xE0\xD1\xE5\xA7\xEA\x7F\x95\xC8\xD2\x8B\xE1\x3E\xFB\xDB\x2A\xEE\xCD\x3A\xE5\xA0\xE1\xCF\xA2\x6D\x07\xFF\xE8\x4D\xE8\x7C\x52\xD5\x87\xE9\xD3\xBD\xC9\x37\xF1\xEA\x4C\xED\xD6\x57\xEA\xA8\xEC\xD5\x92\x4F\x32\xE2\xEA\x46\xEB\x5E\x8F\xE6\xAA\xE4\xD1\xD7\x75\x0D\xED\xE6\x3E\xE8\x83\xF3\x2F\x96\xE2\xD3\xD8\xC9\x52\xF0\x9C\xE5\xE4\xAD\xE9\xEB\xC3\xDB\xD5\xE4\xEA\x4E\xEE", "\x6C\x50\xE0\xAB\xCC\xE6\x51\x59\xD7\xDD\xEB\x25\xEA\xEB\xC1\x7E\xA1\xFF\xEB\xB3\x90\xCF\xFE\xEA\x4D\xE4\xB4\xF4\xE7\x59\xC2\xED\xC3\xE2\xDA\x5F\xE0\x37\xCD\xE3\x77\xEA\x45\xD7\xD7\x0C\xC5\xB4\xDA\xD5\x56\xF6\xEB\x84\xB5\xA0\xDB\x77\x83\xE5\xD4\x85\xE1\x40\xCB\xE8\x1F\x46\x1D\xDD\xED\x4F\xEE\xAB\xBF\x87\x3E\xEB\xAD\xF7\x97\x20\x09\xD9\x4D\xBA\x10\x7D\xE1\xC3\xCE\x33\x25\xDD\xBB\x71\xED\x89\xDB\x81\x63\xAC\x66\xE3\xED\x9B\x8D\xD5\x95\xEA\xDC\xE9\xB4\xB6\xB7\x6E\xFB\xE5\x97\x84\xB7\x9C\xB0\xB9\xE7\xD2\xC0\xE3\x71\xDE\xED\x65\xEA\xAF\xDD\x34\x4A\xE0\xFC\x76\xD7\x7C\xB0\xEC\x08\xE9\xAA\xC3\xEF\x9A\xED\xD6\xDD\xC0\x72\xF1\xEC\xA4\xEA\x3F\xC0\xBF\xE5\xAB\xD8\xD5\xEF\xFE\xDC\xEE\x1B\xE8\xB8\xCA\xD3\xF0\xAA\x10\x36\xEF\x60\xF1\xEE\xD8\xCF\xBA\xE8\xEF\xDB\xEE\x97\x86\x0B\x9E\xD3\xEE\xBF\xEF\xB2\xC1\x7B\x06\xE0\xDF\xC9\xEE\x61\xFF\x87\x44\xED\xB7\xAF\xEA\x4A\x6A\xDB\xF6\xEC\x7B\xFE\x66\xBA\xE5\xBE\xD8\xEF\x53\xEE\xCD\x36\xCA\x80\xEB\xEF\xE7\xEA\x6E\x8E\xB0\xF1\xAB\xDF\xC4\x89\x5C\xFC\xB2\xD0\xEC\xB7\xE9\xE3\xD3\xD5\xA1", "\xD1\xA5\x83\xE2\x55\x90\xDF\xC0\xD2\xF0\xEA\xEB\x81\x29\xC6\x86\xE2\xEF\x61\xE8\x56\x9F\x23\xFE\xE3\xE0\xE8\xEA\x92\xD4\xA8\x92\xB1\xC2\xE0\xF0\xC9\xEE\xAA\xB7\xB0\xDF\xAA\xCD\xC1\x5C\xC7\x85\x9C\x1F\xB5\x38\xC0\xB3\x43\x02\xB2\xCA\xA4\xC8\x85\x9C\x23\xB5\x38\xC8\xB0\xDC\x22\x0E\xD3\xB1\x18\x4F\xC2\x27\xBC\x77\xEF\xD6\x32\xB4\xB2\x7E\xB3\x88\xFF\xEE\xB4\xB4\xE1\xA3\xDD\x61\xA6\xEF\x8C\xEB\xC5\xCB\x88\x4D\xDF\xE1\xF2\xED\x94\xFE\x89\x96\xD5\xCA\xFB\xEB\x64\xD9\xCE\xDB\xB1\x26\xF8\xD9\x76\xB5\xAA\xA1\xF2\x30\xFA\x55\xEE\xB1\x99\xF5\xB3\x50\xB4\xCF\xBC\xBB\xA1\xDF\xE4\x97\xF3\xB2\x9C\xBB\xA8\xC9\x23\xB0\xF0\xB7\xBC\x9A\xA4\xF0\x82\xF7\xF2\x9E\xA9\xD2\x8C\xF1\xEE\xE3\xD7\xCA\x39\x62\xF1\xD1\xE0\xEA\xC5\xD6\xF2\x39\xDF\x97\xF1\xE1\x68\xA2\xCC\x76\xF3\xC3\xF1\xEF\x9E\x24\xC6\xE3\xD6\x19\xF6\xF0\x7C\xF5\xB8\xC2\x0E\xCD\xEA\x68\x9C\xEE\x7E\xF1\xF4\x21\xF6\xF6\x20\xED\x8E\x69\xE8\xD2\xF0\x81\xFE\xAC\x11\xEB\xDB\x53\xE9\x68\xB9\xB3\x5B\xF3\x6F\xFF\xDE\x17\xEE\xD3\xE5\xEC\x8D\xE2\xE8\xA6\xF4\x60\xFE\xE8\x4B\xF0\xAC\xEE", "\x32\x91\xEA\xDC\xB5\xF6\x6A\x8E\xF3\x8B\xF2\xD6\xCA\x86\x5C\xFC\x77\x38\xEA\x7F\xE9\xF0\xE0\x58\xA6\xF6\xF5\x58\xF1\x94\x3E\xF5\x89\xF6\xD6\x73\xD4\xB8\xD9\xF4\x42\xBC\xD3\xC3\xF4\xB0\xFE\x66\x40\xEE\xD5\xC7\xF6\x97\x89\xDF\x83\xF5\x9F\xF2\x9B\xB6\xE4\xD8\xF7\xEF\x0D\x4B\xD4\xD2\xF6\x21\xE2\x0E\x4F\xEA\xDB\xEC\xEF\x5F\xE1\xDE\xD6\xF4\xCE\xB5\xEB\xCF\xF6\xDB\xD2\xAA\x74\xF8\xE7\xBA\xF5\x7E\x3F\xEA\xCE\xF5\xDD\xC1\x4B\xB1\xE9\xEE\xEE\xF5\x11\x87\xEB\xCA\xF6\xB3\xCA\x3B\x6A\xE5\xDD\xE6\xF5\xA4\x39\xE6\xDB\xF5\xB8\xD8\xF3\x07\xF9\xEB\xF1\xF5\xEE\x6C\xF7\xFD\xF2\xDD\xC8\x76\x84\xF7\xED\xAA\xF7\xE2\xCC\xF8\x02\xFA\xE1\xCF\xA2\x5E\xF4\xD8\x94\xFA\x9F\xE0\xDE\x98\xF2\xDF\xCD\xED\xC5\xA6\xF1\xA2\x6D\xA3\xF6\xDE\x8F\xF1\xD5\xFE\xF6\x16\xFA\xC6\x80\xEB\x11\xD6\xF4\x23\xF9\xBB\xEE\x89\x4D\xF5\x24\xE5\xF6\xC4\xF0\x71\x75\xBE\x8F\xF4\x08\x86\xE5\x10\x50\x02\xCC\xFF\xF4\xF6\xF3\x69\xFE\xE4\x8B\xE6\xCE\xD3\xF6\xFE\xC1\x52\x1D\xFA\xE6\x41\xFB\xFB\x01\xF4\xA9\xF8\xCE\xE8\x63\x43\xFE\x23\xC5\xF9\x80\xF1\x69\x42\xF4\xD3\xFA\xF8", "\xC6\xEE\xD8\xF7\xF3\x84\xFD\x69\x52\xFA\xA2\xE7\xE7\xD0\xA2\xE4\xEF\xF9\x73\xB1\xED\xB9\xF8\x87\xF6\x4F\xD5\xF3\xEB\xD2\xEE\x87\xBE\xF2\xDE\xFB\xBC\x9D\xF6\x66\xF8\xCB\xA0\xF7\x9D\xFF\x10\x53\xE9\xBD\xE6\xF8\x1B\x45\xAF\xE2\xF7\xB7\xFA\xD5\x84\xFB\xAF\xF2\xF7\x92\x50\xDE\xCF\xFA\x95\xF2\xD6\xC5\xF9\x4F\x38\xF7\x5F\xFB\xD9\xE2\x6C\x7E\xFD\xF0\xC6\xF8\xB9\x20\xF8\x73\xF8\xEF\xEA\x64\x88\xF2\xF8\x8E\xFB\x53\x8C\xFC\x50\xFE\xF0\xFC\xEA\xC8\xFC\xF7\xF7\xFB\xC1\xF6\xFB\x3E\xFE\xF2\xD7\x84\x2A\xE0\xF7\x91\xFB\xB5\x65\xEC\x89\xFC\xEA\xC1\x4B\x3F\xF2\x3A\xE5\xF9\xE7\xEE\x6C\x8E\xEC\x5A\xE6\xFD\xBD\xF5\x22\x9F\xF8\xCD\xF3\x50\x49\xFE\x1C\xE7\xEC\x83\x08\xF2\xE2\xFA\x3F\xFA\xB5\xB3\xF8\x33\xD9\xF9\xCA\xF7\x36\xA1\xF6\xA2\xA3\xF5\x15\x0E\xF6\xE3\xF6\x9E\xF9\xEF\xBC\xFE\xD2\x2C\xDA\x26\xF5\xF1\xD4\x72\x58\xF4\xF7\xA1\xFF\x06\x54\xF5\xAC\xF9\xF9\xE0\x82\xE6\xE2\xFA\xD1\xFD\xF1\xE7\xFA\x92\x50\xF9\xD7\xFE\xE9\xFD\xA6\x31\xFD\x9C\x9B\xFD\xA7\xE7\x4E\xD3\xFB\xC2\xFD\xCE\x56\xFA\xE3\xE7\xF5\xFD\x9D\xD5\xE9\xFB\x80\xCD\xF5\xA7", "\xFD\xE4\xED\x67\x61\xFB\xFD\xE3\xFE\xA3\x9E\xFD\xB7\x2C\xDB\xE8\xB0\xEA\xFE\xFD\xCB\x88\xB7\xFA\xF8\xCD\xFF\x13\xF4\xFC\xD8\x7E\xF3\x76\x9F\x32\x7D\xFE\x7D\xFF\x70\xFC\x3A\x7D\x02\x82\xF2\x7D\x53\x34\x7B\x06\x81\xF5\x7F\x0C\x40\x7E\x4B\x7F\xF0\x7A\xC7\x5B\x7F\xC8\x79\xB0\x25\xFF\x4D\x79\x42\x72\xD6\x72\xFF\x62\x6F\x41\x71\xEB\x6A\xE4\x45\x80\x19\x76\x46\x48\xF9\x73\x7F\x0A\x80\x10\x50\x00\x9C\x7F\x01\x81\x2D\x6C\xF9\x56\x7F\x81\x7E\x24\x47\x01\xB5\x18\x18\x7F\xEA\x79\x00\xA0\x41\xA9\x7D\x84\x3F\x02\xA1\x5D\x3D\x68\xF8\x78\x02\xAE\x30\xE7\x62\x0C\x80\x02\x97\x42\x2C\x7F\xF5\x69\xFF\x6C\x80\x9D\x6B\x92\x66\xF2\x4A\x6C\x05\x04\xF0\x7D\x15\x09\x57\x37\x7F\x49\x0F\xFA\x70\x02\x3C\x63\x6B\x71\x86\x0E\x77\xC1\x7F\x06\x87\xFE\x7C\x1D\xDA\x7D\x0B\x80\xC1\x45\x72\x57\x7D\xE6\x77\x36\x4C\x7F\x0D\x80\xF9\x7C\xA5\x7A\x80\x27\x70\x42\x6E\x03\xA1\x81\x9E\x7E\xFE\x7E\xA7\x42\x3D\x67\x82\x03\x89\xCA\x77\x80\x4E\x7F\x0C\x86\xFC\x65\x72\x37\x82\xF9\x72\xF9\x58\x68\xC4\x5C\x19\x88\x07\xA3\x67\x43\x82\x1C\x86\x5D\x51\x70\x7D\x83", "\x0F\x8A\xA4\x59\x7B\x82\x81\x09\x81\x94\x28\x7D\x6A\x83\x0E\x82\xAA\x21\x7B\x85\x80\xD4\x74\xEE\x41\x82\x68\x82\x0A\x64\x00\x91\x82\xEF\x7D\xA7\x13\x09\xAE\x81\x94\x81\x18\x28\x00\x8D\x82\x73\x82\x71\x7C\x00\x98\x82\xA0\x80\xAB\x47\x03\x84\x7E\x69\x80\x11\x89\x13\x77\x80\x97\x82\x18\x89\x08\x93\x7E\x23\x81\x17\x84\x02\xBA\x6A\xE1\x71\x1B\x8A\x0A\x97\x43\xA9\x81\x29\x8E\x07\x85\x41\x2B\x83\x2D\x84\x01\x81\x2F\xA0\x7C\x27\x89\x02\x80\x3F\xA4\x7F\xB6\x36\xCF\x57\x81\x5E\x80\xA1\x55\x03\x9B\x3B\x83\x67\x2B\x8D\x09\x94\x39\xAE\x7F\x09\x37\x03\x94\x7A\xB4\x65\xED\x76\x05\xBF\x70\x27\x3B\x11\x8C\xDA\x7D\x4E\x7A\x80\xFA\x78\x5A\x56\x83\xA3\x5A\xBD\x47\x54\x54\x81\x4B\x81\xA9\x76\x83\x3E\x02\x4D\x80\x63\x47\xF1\x3C\x08\xD0\x59\x15\x88\x27\x29\x83\xE1\x83\x3A\x87\x0E\xAE\x83\xE2\x81\x50\x2E\x04\x31\x55\x95\x01\x36\x35\x02\x19\x33\xAB\x74\xDF\x17\x0F\xB9\x7E\x00\x45\x77\x3B\x0F\x85\x4E\xF9\x82\xED\x1F\x0F\x96\x66\x87\x79\x3F\x84\xDB\x76\x27\x4D\x02\x3D\x88\x0F\x8A\x84\xFC\x80\x7D\x72\x11\x03\x84\xCA\x51\x40\x8A\x74\x10", "\x84\x94\x76\x1C\x7E\x10\x8F\x04\xE0\x83\x3F\x00\x9B\x6F\x7E\x92\x01\x36\x36\xF3\x5D\x37\xF3\x81\x77\x39\x10\xA0\x84\xD9\x33\x48\x87\x10\x91\x1A\x21\x85\xE1\x46\x12\x87\x55\x12\x86\xA3\x7A\x68\x50\x6C\xB3\x65\xD1\x65\x1F\x30\x66\x77\x83\xCF\x7C\x05\x84\x83\xCA\x81\x6E\x79\x0D\xAA\x7D\x40\x7F\x4E\x8E\xBD\x5A\x2D\xB2\x82\x2D\x80\xC2\x54\x7F\xB3\x82\x2E\x8A\x05\xBF\x82\x05\x29\x16\x81\x01\x80\x7B\xE2\x7E\x2B\x8E\x14\x86\x77\x71\x82\x2F\x8A\x08\xAE\x44\x76\x82\xF0\x72\x7F\x49\x7B\x47\x87\x54\x81\x92\x77\x80\xED\x7E\x29\x85\x0C\xB2\x4D\xF1\x7F\x2A\x8C\xE5\x64\x7D\x90\x81\x28\x8A\xA4\x48\x82\x5E\x87\xB7\x7F\xA8\x3E\x84\x6F\x71\xE1\x18\x0A\xA7\x80\xBB\x82\x4D\x86\x96\x43\x73\x41\x86\x21\x87\x0D\x5B\x82\x99\x80\x52\x8D\xE1\x7E\x7D\xB6\x23\x28\x87\x03\x88\x7E\x52\x85\x05\x88\x01\x9E\x80\x1A\x82\x58\x85\x04\xB5\x82\x76\x86\x51\x81\xBB\x71\x82\x65\x85\x51\x85\x8B\x48\x86\x95\x82\x61\x87\xC0\x79\x82\x81\x85\x56\x82\xAA\x3D\x82\x79\x86\x56\x87\xC0\x41\x83\x7A\x67\x0D\x87\x0C\x8A\x5A\xC9\x83\x53\x85\x13\xBC\x1D\xCD\x82\xC1", "\x2F\x0C\xBD\x80\x8D\x86\x50\x85\x80\x54\x6F\xBB\x58\x5F\x84\x77\x7C\x83\x4A\x82\x46\x8D\x53\x3A\x00\x71\x55\xAC\x5E\xCD\x2D\x84\xED\x75\xBD\x14\x67\x7B\x34\xA9\x7A\x70\x02\x01\x23\x79\x05\x07\x6F\x87\xE6\x5E\x65\x5F\x7B\x30\x67\xD4\x74\x78\x72\x5A\x44\x08\x01\x00\x87\x84\x04\x73\x8A\x01\x0E\x87\xCC\x84\x16\x0C\x1C\xB1\x86\x54\x38\x4C\x85\x1C\x80\x00\x1E\x00\x73\x8C\x80\x7F\x43\xDB\x87\x25\x49\x77\x43\x87\x07\x06\x75\x80\xD8\x5D\x87\xEA\x3C\x79\x8E\xD8\x22\x87\x01\x64\x6D\x80\x1E\x86\x04\x83\x05\x46\x48\x1B\x94\x39\x15\x3C\x60\x71\x1F\x81\x64\xC2\x87\x6E\x87\x10\x35\x87\xC9\x86\x99\x53\x1E\x8C\x87\xC8\x87\x1E\x62\x1C\x0B\x87\xEB\x86\x6E\x89\x1F\x8A\x04\xCF\x85\x80\x80\x00\x05\x88\xF6\x86\x41\x02\x1D\x86\x88\xD4\x85\x3B\x38\x1E\x95\x6E\xD9\x86\x81\x86\x1E\xA0\x41\x13\x8B\x42\x4F\x1D\x89\x88\x05\x07\x83\x8B\xAC\x47\x71\xD7\x85\x85\x85\x22\x5A\x88\xB9\x84\x00\x0A\x1E\x98\x88\x00\x01\x7B\x81\x30\x52\x2A\x14\x87\xE2\x58\x1B\x82\x07\x29\x8B\x6A\x64\x9B\x57\x84\x0A\x04\x6E\x8F\xFA\x70\x88\x07\x07\xDE\x59\xE6\x45\x04", "\x8A\x5E\xA8\x29\x23\x81\x2F\x3B\x89\xC5\x2D\x23\xBC\x1D\x3F\x8A\xED\x11\x24\x8A\x1D\x43\x8A\x68\x35\x24\xA0\x2F\x47\x8A\x70\x09\x24\x92\x04\x90\x5D\x77\x32\x79\x5D\x37\xDA\x6A\x70\x06\x79\x7C\x83\x98\x5E\x14\x89\x5F\x2D\x88\xC1\x2F\x8A\x8F\x10\xB1\x55\x34\x8A\x41\x08\x25\x95\x2C\x5A\x8B\x43\x0F\x25\xB4\x60\x8A\x59\x57\x82\x99\x19\x84\xDE\x31\xBC\x61\x13\xB2\x71\x46\x7B\x0F\x6C\x69\x58\x06\xEC\x82\x6C\x88\x0E\xAF\x83\x28\x8B\x42\x8E\x0F\x9C\x89\x0C\x84\x40\x89\x27\x84\x84\xAB\x5B\x21\x65\x38\x76\x88\x3F\x7A\x44\x0B\x24\x8F\x04\x83\x8A\x42\x05\x28\x87\x04\x87\x8A\x41\x09\x28\xB8\x88\x8E\x5F\xE0\x5D\x28\x85\x5E\xD9\x31\x93\x85\x38\x4F\x89\x85\x4D\x94\x82\x11\x13\x89\xDC\x81\xD7\x57\x10\x15\x89\x81\x88\x46\x8C\x77\x6A\x89\x74\x7A\xBB\x6F\x29\x87\x3C\x19\x88\x9E\x1A\xE3\x5A\x0E\x12\x04\x6E\x83\x18\x27\x8A\x1A\x27\x04\x88\x04\x80\x00\xAC\x8B\x01\x6D\x0A\x87\x73\x1A\x59\x96\x7E\xE5\x64\x89\xB4\x65\xAC\x55\xB1\x5B\x6C\xCD\x68\x6C\x68\xB0\x78\x19\xBD\x89\x4F\x1D\x1F\x95\x84\x05\x85\xAC\x52\x1C\x00\x8A\x42\x7A\xA0\x8F", "\x28\x87\x5E\xCB\x89\xE2\x5D\x2C\x8B\x5E\x8B\x88\xE3\x51\x78\x4F\x8B\xA2\x2A\xA4\x87\x54\x54\x8A\x47\x56\xA5\x8F\x10\x18\x8A\x7C\x88\x15\x66\x10\x1C\x8A\xA9\x85\x62\x80\xC2\x4A\x85\x9A\x7F\xD4\x6A\xC9\x56\x86\x63\x84\x96\x4C\x16\x84\x72\x54\x6F\xBA\x88\xCE\x5B\x24\xEE\x8B\x68\x8F\x15\xAF\x8B\x37\x86\xBC\x89\x13\xB0\x43\x70\x81\x1D\x8A\x2F\xB1\x8B\x4C\x79\x41\x0D\xEC\x69\x85\x4F\x86\x5E\x2E\x1A\x92\x2A\x61\x84\xC0\x88\x13\xA2\x36\x84\x81\x66\x82\x18\x9A\x47\x75\x85\x64\x82\xA9\x0C\x82\x0A\x8F\x1E\x85\xCA\x2F\x85\xB3\x8A\xBD\x81\x30\x86\x71\xC6\x87\x52\x81\x31\x9B\x3A\x37\x83\x27\x8E\x18\x9B\x8C\x07\x70\x04\x85\x2E\x8D\x7E\x76\x4D\xB8\x8E\x30\xAF\x5F\x80\x84\xC8\x83\x2F\x9D\x79\xFA\x87\xBC\x86\x31\x8B\x7C\x15\x8E\x55\x81\xE5\x6C\x8C\xC4\x87\xC8\x87\x32\xBF\x7F\x31\x8F\x34\x8A\xF0\x44\x6B\x1F\x82\xCA\x8A\x16\x98\x45\x71\x84\xD6\x73\x2D\x71\x80\x26\x8F\x32\x8E\x59\x5F\x86\xB4\x65\x68\x87\x30\x8B\x8D\xDE\x31\x69\x82\xA1\x16\x76\x32\x8E\x77\x7A\xA1\x19\x8A\x2D\x60\x97\x17\x03\x81\x81\x35\x60\xBF\x85\xCC\x73\x3F\x54", "\x8E\x38\x6E\x0D\x9E\x6C\x92\x25\x84\x8D\x35\xB7\x68\x58\x1A\xDE\x5C\x77\x51\x8B\x68\x8C\xB5\x8C\x23\xAA\x8D\x3E\x88\xDB\x80\x24\xAE\x8D\xB6\x1E\xB5\x8A\x4C\x58\x8B\xCA\x52\xB6\x8A\x10\x1C\x8B\x86\x79\x9F\x85\x10\x20\x8B\xCA\x50\xB2\x89\x6C\x44\x8A\x70\x8C\x91\x81\x38\x86\x89\x83\x8C\x92\x85\x38\x8A\x89\x87\x8C\x93\x81\x79\x53\x5E\xD9\x30\xDE\x84\x2C\xBA\x8D\x00\x00\xDF\x8B\x2F\x41\x25\xB1\x87\xEB\x76\x2C\x92\x04\x7E\x8E\x9B\x86\x28\x89\x8E\x80\x8F\xB4\x8E\x39\x8E\x8A\x9F\x8C\xA4\x81\x3A\x8C\x8B\x8F\x5F\xE2\x80\x25\x8D\x8E\x97\x5D\x5C\x50\x08\x31\x55\x81\x01\x5C\x53\x08\x25\x83\xC1\x2F\x85\x8F\x0D\xB0\x8E\x15\x2D\x7D\x07\x2C\x99\x33\xF5\x06\x37\x36\x3B\x8A\x8B\xDD\x37\xEE\x8D\x39\x85\x4E\xBE\x8F\xE6\x8D\x3B\x9C\x8E\x0A\x05\xF0\x88\x28\xB8\x8E\xC4\x8F\x41\x06\x3C\x8A\x8A\xC8\x8F\xE8\x85\x58\x4B\x8F\x8C\x8B\xF0\x8E\x3C\x8B\x5E\xD0\x8C\x00\x02\x37\x8F\x8F\xA6\x8C\xF0\x8C\x38\x92\x8F\x85\x4E\xE3\x8D\xAE\x45\x6D\x92\x8D\xCF\x77\x2F\x93\x78\xAC\x79\xCF\x86\x16\xBB\x63\x37\x80\x18\x87\x3E\xB7\x8C\xC0\x3C\xF4\x7A\x18", "\x82\x8D\x60\x2F\xC0\x8F\x3E\xAB\x8C\xC4\x7C\xBA\x8A\x0D\x98\x85\x1A\x8F\xFA\x8E\xA6\x7B\x8B\x0D\x8E\xD1\x8D\x7B\x5A\x8D\x79\x60\x7B\x5D\x3F\xBA\x85\xEA\x3E\x99\x85\x19\xB9\x8F\x1B\x21\xC1\x83\x3F\xA3\x8F\xC1\x2D\xC2\x8A\x3F\x84\x90\x91\x18\x5A\x8B\x40\xAC\x8B\xD8\x5F\x00\x9A\x19\xA7\x4D\xFC\x7F\x03\x97\x41\x96\x75\x39\x8E\x64\x84\x3F\x82\x63\x86\x4D\x61\x86\x30\x8A\x73\x1D\x8E\xFC\x87\xF9\x3E\x85\x00\x93\xEA\x6B\x37\x56\x90\x41\x8C\x39\x7C\x18\xA6\x8F\x1F\x8D\x08\x80\x19\xBE\x8F\x1E\x90\xE1\x45\x2B\xA9\x90\x91\x54\xCD\x8A\xA1\x76\x8C\x34\x93\x35\x44\x19\xBE\x8C\xA2\x85\x4F\x18\x19\x9A\x90\x0B\x8E\x89\x43\x36\xBA\x18\x2C\x92\xFD\x8C\x77\x08\x8D\x45\x6E\xD2\x8F\x32\x94\x83\xE0\x63\x11\x90\x90\x38\x90\x57\x85\xC9\x7D\x2D\xB7\x66\x6F\x53\xD5\x8D\x1A\x94\x91\x33\x8C\xD7\x87\x45\xB0\x6C\x06\x05\x83\x8A\x33\xAE\x64\x5C\x6D\x0B\x9F\x33\xA5\x91\x4A\x93\x07\x92\x3C\x37\x80\xEE\x8F\x01\x90\x3F\x8A\x04\x44\x86\x6A\x84\x44\xA9\x91\x0C\x91\xC5\x24\x2E\xAE\x8C\x15\x74\xD5\x35\x34\x90\x90\x81\x68\xDE\x2C\x3F\xBB\x91\x1B\x90", "\x07\x8B\xDD\x70\x90\x72\x92\xE9\x6E\x2F\x9C\x85\x26\x90\xF0\x3A\x40\xAE\x91\x6A\x93\x41\x0E\x40\xB1\x90\x90\x92\x7D\x22\x41\x8C\x92\x67\x91\x05\x90\x48\xA6\x91\xA2\x35\x06\x91\x49\xA2\x8B\x88\x41\x07\x93\x42\xB9\x91\x73\x84\xAD\x84\x48\x9C\x92\x21\x80\x5E\x83\x47\xB7\x8F\x4C\x65\x22\x95\xA0\x22\x8C\x78\x93\xD6\x8E\x2A\x88\x90\x85\x91\xE8\x34\x31\xAF\x90\x22\x93\x04\x95\x96\x68\x70\x15\x79\x2D\x94\x49\x82\x92\x33\x90\x1F\x9D\x43\x8B\x7E\x9E\x92\x2D\x9F\x32\xBC\x8C\xBA\x90\x10\x94\x2F\x94\x51\xA3\x90\xFB\x81\x02\x9C\x86\xB4\x67\x30\x8F\x44\xA0\x92\x85\x7B\xE3\x8E\x2D\x88\x7A\x5C\x91\x08\x8E\x34\xA8\x60\xD5\x92\x21\x9B\x82\x52\x91\x6C\x71\x32\x9F\x4B\x95\x91\xAC\x84\x3F\x82\xDA\x4C\x8D\x51\x8F\x06\x2E\xFB\x74\x66\xB1\x86\xAF\x82\x11\x20\x88\x83\x04\x8E\x59\xDA\x46\x04\xAA\x8A\x44\x0E\x4E\x87\x55\xF8\x86\x32\x55\x4F\x85\x56\x63\x8A\xED\x11\x26\x8A\x04\xF9\x91\x19\x75\x26\xBB\x89\x11\x84\x40\x92\x4D\x98\x91\x06\x87\xEC\x8C\x3D\x87\x55\x99\x8F\xE2\x59\x11\x82\x07\xB9\x8D\x4F\x15\x3D\x91\x8B\x0F\x95\xF3\x80\x3A\x9A", "\x8F\xD3\x8E\xA8\x21\x51\x87\x94\xA4\x8C\x45\x93\x51\x87\x55\x17\x96\x46\x92\x3A\x9E\x94\x19\x94\x47\x91\x29\x92\x94\xD7\x88\x49\x95\x37\xA6\x94\x85\x56\xF7\x8E\x22\xA0\x8F\x28\x97\xE2\x59\x50\x96\x94\x7C\x5D\x47\x92\x52\x95\x94\xC1\x2E\x4C\x9A\x4C\x76\x94\xD8\x8C\x4D\x95\x3B\x89\x8F\x06\x04\x4E\x94\x3D\xBC\x94\x05\x06\x4F\x90\x53\xBA\x94\x7C\x1D\xF5\x87\x3D\xBF\x94\x4E\x89\x4B\x92\xAA\x36\x8D\xCA\x8C\xEA\x84\x25\xB4\x8E\x7C\x1F\x42\x9A\x1C\x91\x81\x27\x86\x9B\x1F\x52\xAE\x44\x69\x8C\x51\x92\x24\x80\x95\xD2\x8B\x46\x91\x52\x9F\x95\xCE\x89\xE9\x89\x54\xA7\x8E\xDD\x36\x4A\x9B\x26\x85\x84\xE1\x8E\xA8\x27\x55\xB3\x4B\x59\x96\x57\x91\x56\xAE\x95\xD0\x88\x57\x9D\x56\x9F\x94\x47\x57\x51\x92\xAA\x34\x8D\x85\x54\x53\x96\x10\x26\x95\xA1\x88\x4B\x97\x23\x80\x00\xEF\x85\x3B\x33\x1F\x95\x6E\x83\x97\x86\x81\x1C\x8C\x87\xF7\x92\xF8\x84\x17\x83\x88\x3B\x91\x40\x63\x2C\x8A\x96\xE0\x2C\x80\x84\x22\x85\x96\x21\x88\x82\x8C\x58\x86\x04\x96\x96\x7F\x82\x11\x0B\x88\x24\x8A\x18\x91\xEF\x20\x88\x54\x3A\xD8\x87\x59\x99\x8C\xFB\x86\x81", "\x82\x3B\x9A\x96\x0F\x04\x68\x9D\xCE\x1E\x88\x45\x40\x6B\x99\x11\x6A\x96\xD7\x3B\x88\x87\x54\x5F\x84\x24\x8A\x89\x83\x2F\x41\x96\xD7\x38\x65\x90\x1F\x88\x96\xBC\x96\x84\x8A\x1D\xBC\x87\xCC\x86\x64\x93\x5A\x8D\x87\x06\x89\x66\x9D\x1B\x92\x04\xC6\x94\x64\x92\x1C\x1C\x96\xC3\x96\x67\x97\x0D\x70\x96\xF1\x3A\x68\x98\x5A\xB5\x8C\x01\x66\x6B\x9E\x12\x67\x96\xC7\x95\x6A\x9F\x5B\xBE\x96\x06\x88\x74\x97\x0D\x72\x96\xCA\x50\x6D\x93\x5C\xB6\x96\x7C\x1C\x65\x92\x1C\x26\x97\xD3\x1B\x59\x90\x39\xBA\x8A\x7A\x73\xBB\x03\x18\x1D\x00\xA4\x8B\xED\x1F\x2A\x9B\x00\x50\x97\xF2\x6A\x68\x50\x83\x45\x6C\x7B\x95\x84\x78\x19\xF0\x95\xC9\x25\x2A\x9B\x6C\xF4\x96\x95\x87\x12\x3F\x8A\x1B\x6D\x7F\x9F\x4E\x85\x04\xF1\x93\x43\x01\x60\x95\x95\x61\x20\x07\x01\x57\x79\x00\xF5\x96\xD2\x1B\x60\xAC\x84\xD9\x33\x84\x99\x37\x93\x93\x00\x03\x0D\x06\x27\x9C\x93\x0A\x06\x86\x9C\x0F\xB8\x00\xF1\x94\x13\x62\x11\x36\x00\x11\x9A\x68\x36\x61\x85\x56\xFB\x93\x41\x07\x62\x9F\x8F\x72\x72\x87\x9A\x27\xBC\x83\x2E\x9B\x51\x5E\x60\xBC\x83\x10\x99\x77\x33\x63\x9C\x98", "\x07\x05\x8D\x97\x60\x80\x96\x78\x18\x89\x92\x60\xA2\x2A\xC9\x94\x90\x95\x1B\x95\x98\x1B\x9B\x51\x5B\x62\xAB\x94\x2D\x98\x91\x9D\xDD\x29\x98\x06\x07\x91\x9A\x5E\x98\x98\x31\x9A\x32\x5E\x64\xA0\x89\x4A\x98\x8E\x96\x10\x11\x99\x2A\x37\x2B\x9D\x0D\x82\x4D\x0C\x9B\x4A\x06\x39\x95\x99\x14\x99\x77\x33\x65\xB8\x8A\x45\x6C\x96\x9B\x78\x63\x99\xFA\x90\x98\x91\x50\xA2\x99\x71\x56\x99\x92\xAA\x28\x99\xFE\x90\x6D\x6E\x66\x81\x2F\x70\x9A\x68\x3C\x64\x85\x04\x75\x98\xF8\x27\x67\x80\x00\x79\x9B\xEB\x73\x67\x95\x2C\x7D\x9B\x07\x2F\x67\xBC\x1D\x79\x9A\x70\x0B\x67\x81\x9A\x36\x23\xA0\x9A\x13\x29\x8A\x78\x19\x7E\x70\x9B\x42\x07\x59\x01\x91\x9A\x4C\x51\x9A\xFC\x81\x29\x02\x69\x83\x94\x60\x91\x41\x06\x69\x9D\x37\x6B\x97\x01\x73\x57\xA0\x95\x71\x96\x56\x92\x38\xA2\x9A\x84\x8C\xA9\x96\x38\xA2\x95\x93\x8B\xF6\x8D\x3D\xA9\x8E\x3F\x99\xF0\x2C\x5C\x97\x98\x04\x97\xE5\x8F\x10\x14\x9A\x2F\x99\xE1\x44\x6B\x9F\x91\x01\x74\x00\x0B\x69\xB6\x9A\x97\x9B\xE2\x57\x6B\xB0\x9A\x99\x9A\xAE\x95\x62\x8A\x61\xED\x97\x11\x6E\x68\x04\x98\x99\x1A\x42\x09", "\x11\xBB\x8A\xC9\x9A\xAD\x21\x62\xB8\x19\xCB\x98\xA3\x9B\xB1\x47\x9B\xD2\x99\xB3\x96\x10\x11\x9B\xFB\x97\xB4\x9F\x6C\x9B\x6C\xD8\x99\x8C\x88\x67\x1B\x3C\x0F\x6F\xB7\x9B\x6D\x96\x9B\x05\x07\xC6\x32\x1C\x20\x88\xE7\x99\x36\x30\x22\x9F\x99\x9C\x9B\xD9\x82\x57\xAF\x9B\xA6\x98\xE2\x81\x6F\xBC\x8E\x70\x95\xB5\x89\x3D\x99\x8B\x4E\x96\x95\x9B\x37\xB7\x7F\xE7\x88\x2C\x94\x32\xB5\x8F\xFE\x9A\x32\x9B\x81\x2A\x8F\x9B\x92\xC0\x96\x9F\x2D\x91\xC6\x90\x14\x91\x3F\x99\x93\xB1\x90\x29\x9D\xF0\x68\x7A\x90\x97\x33\x91\x6F\x79\x8B\x0C\x9C\x8C\x5D\x14\xA4\x93\x56\x83\xC5\x92\x71\xA3\x7D\x79\x81\x12\x91\x70\xA1\x21\x06\x91\xC2\x9B\x33\x80\x82\xDE\x92\x2F\x9F\x07\xAF\x64\x97\x90\x1D\x92\x37\x53\x92\x22\x9C\x19\x96\x49\xA5\x9C\x81\x93\x2D\x9E\x16\x95\x9C\x24\x7F\x60\x8B\x58\xB0\x9C\x98\x91\x88\x8D\x4B\xB1\x9C\xC3\x93\xE2\x35\x42\xB4\x9C\x9D\x81\x54\x6E\x71\xBC\x90\xF9\x14\x29\x8E\x70\x8D\x9C\x6E\x19\xCA\x87\x4A\xAF\x91\xB8\x92\x93\x71\x71\xA5\x93\x4A\x6B\xCE\x99\x73\x8F\x56\x3A\x90\x87\x84\x74\xBC\x9C\xE0\x73\x0D\x93\x74\xAD\x92\xF1", "\x3B\x0F\x9B\x74\x9C\x9D\x92\x2B\x10\x95\x70\x9F\x93\xC0\x80\xD1\x88\x73\xAA\x9C\x21\x88\x13\x92\xC7\x4E\x91\x50\x9F\xBF\x93\xD9\x6C\x98\x05\x84\xD4\x83\x46\x9C\x9C\x65\x8C\x3F\x82\x0D\xB5\x90\x17\x8E\xBB\x42\x4E\xAA\x92\xE6\x91\xCC\x7D\x6A\x95\x2C\xE4\x96\x7D\x99\x2B\xA6\x8D\x7F\x97\xA7\x9F\x56\xB4\x95\xA0\x9A\x8E\x80\x6F\xB5\x9B\x6B\x8C\xAA\x95\x52\xA4\x95\xAB\x9B\x53\x9D\x6E\x85\x9E\x8B\x9C\xE2\x97\x78\x89\x9E\x8D\x9C\xE3\x9D\x36\xB3\x9B\x0F\x06\x5D\x91\xBC\x38\x95\x8B\x5E\x5E\x95\x10\x3C\x95\x64\x9A\x1C\x79\x56\xA7\x88\xCF\x42\x6E\x9D\x53\x2A\x9E\x9D\x19\x62\x99\x11\x6E\x9E\x2E\x46\x75\x99\x4B\xB3\x37\xC2\x07\x63\x99\x11\x42\x97\x7F\x8C\x6F\x84\x7B\x88\x97\x7C\x5D\x90\x9E\x12\x6F\x9A\x9A\x8C\x6A\x79\x2C\x9A\x97\x7F\x96\x74\x91\x7C\x96\x9D\x67\x4E\xEC\x9C\x77\x18\x97\xBB\x9C\xF1\x9D\x29\x94\x97\x84\x5A\xF2\x96\x7B\x1E\x97\x92\x24\x78\x97\x7C\x85\x04\x81\x9F\xB3\x54\x27\x81\x0C\x71\x88\x6C\x6D\x7D\xA7\x07\xDF\x9F\x9C\x81\x0F\x9F\x0A\xE1\x9C\x3C\x8D\xD3\x20\x9F\xDB\x9F\xD3\x05\x7E\xA4\x9F\xE9\x9D\xFB\x0B\x7E", "\x9C\x9F\xED\x9D\x74\x0F\x7E\xA0\x70\xB8\x95\xBC\x3C\x7A\xB6\x9F\xBD\x94\x89\x80\x7B\x9D\x88\xDB\x94\x89\x86\x7B\x87\x75\xB8\x9D\x76\x9A\x7B\x9A\x77\xBE\x9F\x75\x85\x80\x80\x76\xC0\x9E\x72\x9D\x99\x43\x97\xD4\x9C\x08\x76\x7C\x8A\xA0\x2D\x8D\xE5\x62\x7D\x84\x5A\xCC\x9E\x76\x7D\x80\xB6\x42\x13\xA2\xDC\x49\x81\x86\x77\x17\xA3\x3F\x46\x7D\x90\xA0\x0A\x05\xF6\x96\x67\xBC\x5D\xF7\x9E\xA4\x25\x82\x92\x26\xFB\x9F\x01\x79\x82\x89\x9F\x7C\x5F\x06\xA5\x7B\xBC\x5D\x01\xA1\xF3\x93\x80\xAE\x44\x07\xA3\xD9\x45\x83\x84\x5A\x09\xA1\x46\x4E\x5C\x92\x26\x1D\xA3\x06\x2F\x80\x99\x44\x2E\xA3\xAD\x87\x36\x55\xA0\x2E\x45\x0F\xA6\x9F\x01\xA1\x11\xA2\xDC\x46\x84\x91\x1A\x1F\xA1\x46\x42\x82\xB2\x89\x41\x26\x8E\x97\x54\x4A\x9A\x71\x99\xD1\x6F\x64\x5D\x99\x27\x07\xA3\x93\x62\x99\x33\x52\xA2\x32\x5E\x63\x85\x4E\x54\xA2\x4B\x84\x9B\x57\xA1\x18\x6D\xD0\x3D\x85\x85\x56\x61\xA0\xC8\x7A\x68\x64\xA1\x60\x8E\x19\xA9\xCD\x29\xA1\xAF\x7C\x1B\xA5\x58\x60\x98\xDD\x37\x17\xA7\x54\x67\xA1\x8B\x5E\x1D\xAA\x4C\x70\xA1\x1F\x22\x1C\xA9\x87\x9C\xA1\xD9\x32", "\x1E\xA8\x86\xB1\x55\x7E\xA0\x69\x6F\x34\x2F\x7E\x6A\x00\xDF\x55\x7F\x97\x43\x27\xA0\x08\x7D\x88\xB6\x42\x2B\xA1\xE5\x61\x89\x86\x96\x21\x90\x08\xAD\x58\x95\x6E\xFF\x9F\x75\x81\x83\x9A\x77\x8F\xA3\x3F\x47\x83\x94\xA2\x9F\xA1\x88\x89\x83\x87\x75\x3B\xA0\x08\x7B\x84\xA0\x41\x3F\xA3\x51\x7B\x81\x9E\x33\xAB\xA1\x4F\x14\x84\x97\x87\xA7\xA3\x42\x4D\x8A\x9D\x1A\xB3\xA1\x50\x28\x6E\x92\x04\x74\xA0\x89\x8D\x84\x87\x75\x4F\xA3\x6D\x8C\x1C\x9D\xA2\x97\x40\x30\xAA\xFE\x13\xA2\x21\x88\x31\xA4\xE5\x35\xA2\x92\x28\x32\xA2\x99\x19\xA2\x80\x77\x26\xA7\xD4\x42\xA3\x8E\x35\x28\xA4\xE5\x12\xA3\xED\x33\x28\xA7\x1D\xA5\xA2\xB6\x41\x2C\xA5\x22\x69\xA2\xFC\x9C\x77\x94\x22\xAF\xA2\x80\x76\x36\xAD\x5A\xBD\x9F\x0C\xA1\x36\x39\x8B\x83\x97\xBB\xA3\x75\x8D\x8B\xBD\x14\x8B\xA1\xEA\x9F\x8B\xB9\x9F\xC3\x96\x31\xAB\x5A\xA4\xA3\xD3\x97\x41\x0C\x8C\x81\x64\xCE\xA3\x75\x80\x8D\xA0\x41\xD4\xA3\xB5\x3D\x8F\xB1\x3B\xD6\xA0\x60\x78\x8D\xBF\x43\xE2\xA1\x46\x4C\x8D\xA5\x96\x24\x8A\x32\xA1\xF4\x20\xA3\x01\x65\x41\xA1\x7B\xB4\xA3\x02\xA1\x78\x8C\x1C\xA9", "\xA3\x80\x77\x13\xA2\x1C\x34\x00\xD9\x30\x46\xAC\x0F\x89\xA2\xFE\x96\x7C\x97\x0D\x86\x04\x69\x03\xB0\x98\x88\xB1\x97\x09\x9A\x42\x01\x92\xBF\x9D\x5B\x98\x42\x58\x67\x18\x50\x83\x05\x4A\x85\x6A\x0A\x04\x2E\xA5\xC2\x35\x56\x78\x19\x77\x03\x4A\xAB\x6C\x5F\x20\xFD\x90\x40\x01\x27\xBB\xA4\xE8\x9E\xF8\x96\x7E\xAC\x9F\x3E\xA4\x50\xAF\x93\x9B\x3B\x2B\x86\x4C\xA8\x7C\x95\x8D\x06\x04\x92\x7F\x92\x87\x04\x73\x00\x9E\x1D\x94\x9B\x6C\x71\x7B\xAB\x82\xE3\x4B\xA5\x06\x07\x3D\xA8\x94\x85\x04\x7D\x00\x9E\x12\x62\x99\x9B\xE4\x9B\x20\x9B\xC7\x4A\x8E\x1B\x6C\x6F\x53\x18\x22\xA5\x20\x41\x57\xA1\x07\x38\x19\x75\x00\x9E\x10\x07\x2A\xA5\x78\x18\x1D\x08\x67\x2C\x00\x37\xA6\x0D\x2E\x96\x9B\x6C\x85\x00\x9E\x17\x08\x38\x19\xB5\x00\x9E\x16\x0B\x38\x19\x41\x7A\x51\xA5\x10\x3D\xA5\x5F\xA6\x92\x5C\x97\xB8\x19\xC4\xA3\x60\x05\x98\x92\x04\x79\x00\x9E\x18\x07\x0A\xA6\x78\x19\x62\xAB\xB1\x4B\xA6\x8F\xA4\x9E\x13\xE7\x69\xA4\x05\x04\x2D\x08\x67\x39\x02\x97\xA4\x9E\x11\x9A\x54\xA5\x05\x05\x23\x01\x97\x92\x28\xBB\x00\x9E\x11\x9A\x9B\x6C\x71\x67\x60", "\x06\x99\x9B\x6C\xB2\x02\x68\xA2\x99\xAB\xA6\x1B\x6F\x64\xAA\x29\x86\x04\xAE\xA7\x55\xA0\x00\x31\xA6\x5E\x8F\x41\x04\x9B\xA4\x8D\xB6\xA4\x6B\xAD\x95\xB7\xA6\x83\x04\x6F\xAA\x63\x7B\xA6\xBA\xA4\x67\xA3\x9B\x81\xA7\x7E\xA7\x70\xAD\x9A\x84\xA7\x81\xA5\x47\x18\x9C\xAE\x97\x12\x07\x6C\x72\x9C\xAE\x6C\xC2\xA6\x6F\xAF\x10\x27\x02\x78\x18\x2A\x08\x67\x10\x0E\xC9\xA7\x41\x0E\x03\x1F\xA6\x19\x2C\x76\xAC\x9C\xA8\x79\x5D\xA5\x40\xAF\x9A\x85\x04\x3F\x6F\x60\x05\xBD\x43\x06\x55\x00\x9E\x10\x04\x38\x19\x47\x8B\x60\x0B\x0A\x38\x19\xA9\x00\x7C\xA8\x67\x2A\x02\x78\x1B\xC7\x73\x18\x36\x64\xF7\xA4\x9E\x13\x8F\x43\x06\xFB\xA6\x44\x0C\x09\x38\x19\xFF\xA7\xC6\x6E\x09\x38\x19\x96\x00\x81\xA6\xA0\x9B\x6C\x05\xAB\xC6\x6F\x09\x38\x19\x0B\xAB\xC6\x6B\xA7\x43\x06\x84\x00\x9E\x1C\x08\x38\x19\xB1\x00\x9E\x1E\x0A\x38\x19\xAF\x00\x9E\x14\x0C\x38\x19\xC5\x00\x9E\x14\x09\x38\x19\x3E\x7A\x70\xAF\xA1\x9B\x6C\x91\x00\x9E\x15\xA2\x9B\x6C\x93\x00\x9E\x19\x09\x38\x19\x9A\x02\x8A\xAC\xA2\xAE\xA8\x1B\x6D\x8B\xAB\xB1\x4E\x3C\x12\x07\x1B\x08\x67\x36\xA8", "\x1B\x6D\x88\xA5\x9C\x87\x01\x78\x18\xE9\x93\x9E\x80\x00\x3E\xAA\x6C\xA1\xA4\xB5\xA6\x7B\x94\x9E\x1B\x04\x38\x19\x4C\x00\x9E\x1D\x0B\x38\x19\xBC\x00\x9E\x10\x7D\x43\x06\x4F\xAA\x44\x02\x08\x38\x19\xA1\x00\x9E\x1B\x00\x38\x19\x0A\x00\x96\xA8\x67\x2B\x32\x83\x04\x97\xA2\x11\x11\x46\x1B\x6C\xE8\x97\x84\x60\xA9\x5D\xA6\x98\xAF\x2A\xA4\xA9\xC2\xA7\x0B\x08\x67\x21\xA2\x83\x04\x9B\xA2\x11\x37\x98\xC2\xA4\x9C\xA5\x9C\xB2\xA9\xD9\xA6\x41\x04\xA7\x9F\xA7\x0A\x06\x46\xAD\x95\xBA\xA9\xC2\xA4\x9F\xA5\x9C\xBE\xA9\x75\xA9\x41\x05\x03\x38\x19\x83\xAB\xC6\x62\x03\x38\x19\x87\xAA\xA1\xA8\xA8\x8B\xAA\x8A\xA9\xA3\xAD\x95\x89\xAA\x8F\xA8\x9E\x14\x0A\x12\xAA\x78\x1A\x29\x08\x67\x23\x02\x97\xA8\x9E\x1F\x84\x83\x06\xE3\x1B\x60\x08\xE3\x41\xAA\x00\x01\x4C\x3D\x95\xB0\xA5\x70\x8B\x07\x2C\x06\x38\x19\xA7\xAB\xC6\x69\xAA\x9D\xA5\x6E\x00\x9E\x1D\xAA\x9B\x6C\x68\x00\x9E\x1B\x06\x38\x19\xB1\xAB\xC6\x63\xAB\xB0\xAA\x6A\x04\x3E\x01\xA0\xAD\x97\xBC\xA9\xAF\xAE\xAB\xBF\xAA\xC0\xA9\xB0\xAC\x95\xAA\x76\xD5\x98\xB1\xA3\xAC\xB0\x93\xC5\xA8\xB2\xA7", "\xAC\x88\x98\xC9\xA8\xB3\xAB\xAC\xBC\x98\xCF\xA9\xB8\x9E\x7C\x92\xA4\xD3\xAA\x41\x09\x6E\x95\xAB\xFF\x96\x42\x07\xAD\x9A\xAB\xEB\x91\xB7\xA8\xAD\x80\x00\xDB\xA9\x53\x9F\x10\x0C\x07\xE4\xAA\x44\x05\xAE\xA3\xAB\xE6\xA9\xBA\xA8\xAE\xAB\xAB\xC5\x8E\xBA\xAD\xAE\xAC\xAB\xE2\xAA\x49\x22\x53\x0A\x0E\xF4\xAA\xBC\xA5\x6E\x17\x1B\xF8\xA8\xC2\x33\xAF\xB6\xAB\x7A\x0D\xBF\xAA\xB1\x76\xAB\x5E\x0D\xC0\xA3\xE2\x4A\x68\xD5\x2C\xC1\xAE\x6C\x86\xAC\x06\x06\xC0\xA8\xB0\xB0\x50\x05\xAD\xC3\xA7\xB0\x8A\x9B\x12\x07\x3D\x62\xB1\x91\xAC\x14\xAE\xA7\x86\xB1\x90\xAC\x17\xAF\x41\x03\xB1\x99\xAC\xD7\x99\xC5\xA8\xB1\x8A\x04\x87\x0D\xC8\xA2\x11\x22\xAC\x0F\x04\xC9\xA0\xB2\xA3\xAC\x28\xAD\xC9\xA9\xB2\xA7\xAC\x2A\xAD\xCB\xAC\xB2\x8A\x04\x19\x17\x60\x09\xA5\x8F\x04\x57\xAA\x51\x3A\x2F\x46\xA7\x3C\x04\xAC\x11\x37\x12\x04\x89\x95\xD8\x2F\xA9\x80\x00\x31\xAE\x44\x03\xB3\x8A\x04\x35\xAE\xEE\x91\x4F\x26\x66\xA8\x64\xBB\x6E\x9D\xBD\xAC\x41\x5A\x44\x01\xB4\x8F\x04\x43\xAF\x41\x05\xB4\x86\x4C\x37\xAC\xD2\xAA\xB3\x8F\x04\x4B\xAC\xBC\x8A\x10\x3F\xAC\xA2", "\xAB\x41\x0F\xB4\x8A\x04\x51\xAE\x41\x03\xB5\x9A\x1B\xC8\x93\xA1\x5E\x19\x17\x1A\x3B\xAF\x43\x0C\xB4\xB7\x78\x2B\x36\xD3\xA2\x11\x32\xAC\x12\x07\xD8\xA2\x20\x86\x3F\xCA\xA4\x47\x07\xB5\x8A\x04\x59\xAF\xC2\x9B\xB5\xAD\xAD\x0F\x07\xD7\xA7\x10\x21\xAD\x05\x06\xDC\xA4\x5C\xA5\xAD\x38\xAD\x62\x07\xB7\x87\x04\x79\xAC\x1C\x9D\xB4\x8F\x04\x5D\xAE\x41\x0E\xB7\x86\x04\x80\xAC\x00\x02\xB8\xB6\x14\x47\xAF\xD9\xAE\x6B\x18\xAD\x3C\xAE\xD6\xA7\x10\x3F\xAC\x8F\xAD\x41\x01\xB9\x93\xAE\xEB\x2A\xD5\xAF\x26\xB8\xAD\x99\xAE\xDE\xAB\xB9\xBC\xAD\x30\xAF\xDB\xA2\xB4\xB1\xAD\xAE\x19\xE5\xA6\xB7\xA3\xAE\x88\xAD\xE9\xAA\xB8\xAC\xAD\x8C\xAE\xDB\xAF\x10\x30\xAD\x34\xAD\xEB\xAF\x9B\x86\xAE\xB0\xAD\xD6\x02\xBB\x8F\x25\x7B\xAD\xED\xAD\xB7\xAA\xAE\x50\xAC\xEB\xA6\xB3\xB7\x27\x10\x17\xEB\xA8\xB6\x98\xAE\x6A\xAE\xE6\xA6\xB2\x28\xAE\x5E\xAC\xF1\xA0\xB6\x86\xAF\x46\xAF\xEE\xA6\x10\x09\xAD\x69\xAE\x42\x0B\xB6\x81\xAF\x0A\x05\xE3\xA5\x6E\x92\xAF\x7F\xAC\xF5\xA4\xB5\x88\xAF\x75\xAD\xCE\xAD\xBB\xA2\x0D\xBF\xAE\x19\x87\xBA\x82\xAF\xA9\xAF\xED\xAB\xBA", "\xB9\xAE\xC7\xAE\xEB\xA6\xBE\x8B\xAF\xA4\xAD\xF3\xA6\xBA\x8F\xAF\xEC\xAF\x41\x06\x01\x36\xAE\x21\xA3\xFB\xA4\xB4\xBA\xAE\xC9\xAF\xFC\xA7\xB9\xB5\xAF\xDA\xAE\xF3\xA5\x10\x1C\xAD\xFC\xAF\x41\x08\xBB\xBF\xAF\xF1\xAE\xF5\xA5\x10\x18\xAF\xCC\xAD\x01\xB7\xBF\x87\xB0\xD0\xAE\xE3\xA0\xBE\x90\xAE\xE2\xAC\xD9\xAF\x8C\x70\xA6\x96\xAE\x41\x0A\xB4\xA9\xAF\x38\x3F\xE2\xAD\xBE\xBD\xAF\xC5\xAC\xFC\xA5\xBD\x81\xB0\xBC\xAC\xFD\xA1\xBB\xB6\xAF\xB3\xAC\xF7\xA1\xBD\xAE\xAF\x25\xB0\x03\xB7\xC2\xA5\xAF\x29\xB3\x00\xBB\xC2\x92\xB0\x2D\xB3\xFA\xAD\xBD\x92\x04\x3C\x7B\x41\x01\x83\x9D\xAE\x00\x03\xE7\xA0\xC0\xB4\xB0\xD7\xAF\xE1\xAE\xBB\xAC\xB0\xC0\xAE\x0E\xB7\x10\x1E\xAF\x00\x01\x0F\xBE\x7B\x09\xB0\xEC\x86\xFF\xA2\xB5\x83\xB1\xB9\xA6\xF2\xA6\xC3\x87\xB1\x38\xB1\x12\xB8\xBF\xBB\xB0\xC3\xAC\x0C\xB3\xBD\xA6\xB0\xE3\xAE\xFC\xA5\xC3\x9E\xB0\xD9\xAF\x7D\x86\xC0\x80\x00\x08\xB1\x17\xB4\xC2\x9F\xB1\x32\xB1\x18\xBE\xC0\x85\x5A\xE7\xAD\xE0\x00\xC2\xA8\x5B\xB4\xAC\x17\xBA\x10\x3B\xAF\x6A\xB2\x02\xB2\xC5\xA2\xAD\x54\xB0\x07\xB6\xC5\xA4\xB1\x11\xB2", "\x19\xB3\xC1\xA8\xB1\x15\xB3\xF7\xAE\xC5\xA1\xAF\x60\xB2\x06\xB4\xB7\x95\xB1\x02\xB0\x20\xB4\xC0\x82\xB2\x39\xB3\x16\xBB\xC4\x90\xB1\xD8\x9F\x1E\xB1\xB8\xBD\xB1\x66\xAF\x1F\xB5\x10\x1F\xB0\x48\xB2\xFA\xA2\xC9\x86\x04\x4C\xB2\x13\xB5\x10\x3F\xB0\x17\xB2\xE7\xA9\xC1\xB3\xAD\x55\xAD\x07\xBB\xC9\xA5\xB1\x06\x07\xF6\xAA\xC4\xA0\xB2\x3C\xB3\x0A\x9F\xC2\xAB\xB1\x88\xB1\x1B\xBA\xC8\xA9\xB2\x9A\xB0\x00\x0C\xC9\x99\xB1\x9E\xB0\x05\xB9\xBF\x86\x04\xA2\xB0\x00\x04\xCA\x87\xB2\x18\xB1\x22\xB8\xCA\xA4\xAF\x8C\xB3\x18\xBB\xCA\x81\xB2\xAD\xB3\x19\xB9\xC6\x8A\x04\xC1\xB3\x32\x30\xC4\x82\xB1\x0D\xB0\x0A\xB5\xC4\xB1\xB1\x89\xAE\x16\xBE\xCB\xB6\xB1\xFA\xAC\x25\xB5\x22\x96\xB2\x92\xAC\x26\xB5\xB8\x97\xB3\x2A\xB0\x16\xB0\xC9\x9A\xB3\x84\xB3\x2F\xB5\x10\x38\xB1\x23\xB2\x1E\xB1\xC3\x93\xB1\xD5\xB0\x11\xBF\xC0\x86\xB1\xE8\xAD\x27\xB1\xC2\xB5\xB1\x93\xB1\x1E\xB1\xC5\xAF\xB3\x7C\xB1\x3C\xB9\xCC\xA4\xB3\x57\xB1\x3D\xBC\xCB\xB7\xB3\x2E\xB0\x2C\xBA\xCF\x95\xB2\xFC\xB3\x25\xBE\xCF\xBE\xB1\x8D\xB3\x32\xBF\xC8\x8D\xB3\x83\xB3\x33\xB3\xCB\xAE", "\xB3\x6C\xB0\x3C\xB3\xC3\xBF\xB3\xF3\xB0\x36\xB3\xC7\xBE\xAC\x85\xB0\xD0\xA5\xCA\x81\xB1\xA7\xB3\xE0\xAB\xC1\x99\xB2\x0D\xB6\x2E\xBC\xCA\x87\x96\x11\xB5\x47\xB3\xCD\xA1\xB4\x94\xAF\x1B\xB0\xC1\x8F\xB4\x28\xB5\x24\xBB\xCD\xB9\xB3\x77\xB0\xEF\x94\xCC\xA6\xB2\xC6\xB2\x48\xBB\xC8\x8C\xB4\xCA\xB2\x49\xBC\xCC\xB1\xB4\xE8\xB3\xCF\xA9\x5C\x8B\xB0\x16\xB6\x1B\xB6\xCD\x99\xB4\xE5\xB2\x40\xB7\xCE\xBD\xB2\xE9\xB0\x81\x8F\xD1\x94\xB3\x17\xB4\x4F\xB0\xD0\x8E\xB2\x37\xB3\x52\xB4\xD0\xAF\xB2\x05\x04\x13\xB3\xD4\xA0\xB3\xA0\xAC\x56\x42\xBA\x89\xB5\x72\xB2\x3D\xB4\xC7\x85\xB4\x59\xB6\x4D\xB4\xCB\x85\xB3\xB6\xB3\x31\xB2\xC6\x93\xB5\x0E\xB5\x55\xB0\xD1\xB2\xB4\x4D\xB4\x4D\xB7\x10\x1B\xB5\x09\xB5\x38\xBB\xD0\xA4\xB4\x3D\xB7\x2E\xB6\xD5\xA3\xB5\x58\xB5\xA8\xA6\xD6\x94\xB4\xB5\xB1\x51\xB7\xCB\x88\xB3\x52\xB4\x52\xB1\xD0\xA1\xB5\x03\xB4\x5F\xBF\xC9\x85\x04\x74\xB5\x45\xBD\xCF\x91\xB5\x78\xB4\x5B\xBE\xD3\xB0\xB4\x00\x02\x2B\xBB\xD8\xBE\xB5\x0F\x05\x63\xB1\xD8\x8F\xB6\x46\xB6\x3C\xB0\xC7\xA0\xB5\xD9\xB0\x53\xB2\xD1\x98\x96\x4F\xB4\x4B", "\xB1\xBA\xAA\xB2\x93\xB6\x5B\xB0\xD4\xA2\xB6\x1D\xB6\x66\xB8\xD6\x82\xB6\x6A\xB6\x4B\xB4\xCF\x88\xB6\x7B\xB4\x47\xBA\xCE\x87\x88\xA5\xB5\x4E\xBD\xD2\x87\xB5\x9F\xB7\x61\xB1\xDA\x97\xB5\x97\xB6\x56\xB9\xDB\xA9\xB5\x3A\xB4\x2E\xB5\xD2\xBA\xB5\x6F\xB5\x50\xBD\xDA\x83\xB7\xB0\xB5\x71\xB4\xD8\x91\xB6\x86\xB4\x55\xB6\xCE\x89\xB7\xAC\xB7\x6D\xBC\xCE\xB3\xB5\xCC\xB4\x67\xB3\xD8\xAB\xB5\xD1\xB5\x5B\xB3\xDD\xAB\xB6\xC0\xB7\x4C\xB6\xD0\x8E\xB5\x37\xB4\x48\xBA\xDB\xA7\xB6\xB9\xB0\x72\xB0\xDE\x8A\xB6\xE2\xB5\x59\xB9\xD9\x99\xB7\x0A\xB4\x64\xB3\xCE\x9D\xB7\xA9\xB7\x77\xB5\xD9\x8E\xB3\x7F\xB7\x3E\xBE\xD8\xB1\xB7\x9D\xB4\x46\xBD\xDB\x92\xB7\x4A\xB4\x75\xB1\xDE\xB1\xB5\xA4\xB5\x79\xB0\xD5\xBD\xB7\x85\xB7\x7F\xBE\xDD\x81\xB8\xEB\xB6\x6D\xBC\xCD\x80\xB3\x53\x97\x7B\xB6\xE0\xA6\xB6\x5E\xB4\x6A\xBA\xDE\xB7\xB7\x29\xB7\x6D\xB1\xCD\xB9\xB7\x08\xB7\x7E\xB6\xD7\xB2\xB7\x5F\xB6\x6F\xBB\xD1\xA2\xB0\x72\xB5\x81\xB7\xD6\xB8\xB4\xC4\xB7\x6E\xBE\xD9\xAF\xB4\xAA\xB4\x86\xB0\xD7\xA3\xB6\x8C\xB4\x7C\xBF\xE1\x88\xB8\xD0\xB6\x82\xB5\xDF\x8C\xB8", "\x2E\xBA\x72\xB6\xDD\x9C\xB8\xDF\xB1\x5D\xBD\xD5\x84\xAE\x21\xB8\x80\xB4\xDB\x82\xB8\xEC\xB4\x81\xBE\xDE\xA4\xB7\x27\xBA\x79\xB9\xE2\xA8\xB7\xC7\xB7\x49\xB9\xE3\x95\xB7\x0F\xB9\x8C\xB3\xE1\xA7\xB7\x15\xB9\x7A\xBE\xE4\x96\xB6\xED\xB4\x66\xB0\xCD\x91\xB8\x48\xB8\x60\xBF\xDA\x9A\xB7\xB1\xB4\x6F\xBC\xE2\xB6\xB7\x58\xBA\x91\xBA\xE5\x87\x04\x1B\xBA\x84\xB9\xE4\x87\xB8\xDB\xB6\x6C\xBA\xD1\xA2\xB5\x0E\xB9\x89\xB5\x10\x01\xB3\x31\xA2\x6B\xB8\xE2\x8D\xB7\x2A\xBA\x7F\xB3\xE6\xB8\xB8\x65\xB8\x8C\xBD\xC4\xB2\xB2\x26\xBA\x97\xB7\xE7\xA0\xB9\xCE\xB4\x77\xB6\xE3\x97\xB8\x7D\xB9\x47\xB7\xDD\x81\xBA\xFA\xB7\x66\xBC\xDF\xAD\xB9\x62\xBB\x6C\xBF\xDB\x85\xB9\x7E\xBB\xA2\xB2\xE5\xAB\xB9\x14\xB8\x90\xB6\xE1\x97\xB9\xF8\xB7\x6D\xB6\xE7\x8A\xB9\x78\xB8\x93\xB9\xD7\x9C\xBA\x19\xB9\x94\xB8\xDB\x93\xB9\x4B\xB9\x95\xBD\xE4\xBF\xB4\x4F\xBB\x80\xBE\xE7\x9F\xBA\x6C\xB9\x98\xBB\xE2\x92\xBA\x23\xB8\x3E\xB3\xDE\x98\xB7\xA8\xB9\xA8\xBA\xEA\xA3\xBA\xAC\xB9\xA2\xBE\xE9\xB2\xB8\x3F\xBB\x48\xB3\xDF\x87\xBA\xA4\xBB\x8B\xBA\xE8\x92\x04\x2B\x98\x51\xB4", "\xE8\xB9\xB9\x09\xBB\x9E\xB3\xE4\x8D\xB8\x24\xB9\x93\x90\xEC\xA2\xB3\x41\xBB\x82\xBF\xEC\xAD\xBA\x94\xB8\xB2\xB3\xED\xB7\xB5\xC3\xBA\xB3\xB3\xE9\xB1\xB9\xB7\xBA\xB4\xB9\xEB\x8B\xBB\xA2\xBA\x64\xB8\xE8\x9D\xBA\xA6\xB9\xB2\xBC\xD5\x94\xBB\x9B\xB9\xAF\xB8\xEE\xB2\xB9\x7C\x9B\xB6\xB0\xE2\xAD\xBB\x94\xB6\xAF\xB9\xEE\xB2\xBB\x34\xB9\xB7\xB4\xEB\xB0\xB9\xD1\xB8\x9E\x98\xEF\x90\xBA\xB3\xBB\x9B\xB9\xD8\xA0\xBB\x47\xBA\x8A\x9F\xEF\xB2\xBA\x7A\xBB\xBE\xB3\xF0\xBD\xBB\x67\xBA\xB8\xB8\xE9\x94\xB9\x9A\xBA\x95\xBE\xEE\xA5\xBA\xF0\xBA\xBA\xBE\xE3\xAC\xBB\x12\xBD\xBD\xBF\xEE\xA1\xBB\xFE\xBB\xB8\xBF\xE8\x88\xBC\xCD\xBA\xC2\xB5\xDB\x8C\xBC\x4C\xB2\xC5\xBE\xE1\x81\xBB\x3B\xB5\x8D\xBE\xED\xB5\xBA\x64\xB5\xC3\xBD\xF1\x8F\xBC\xA9\xB9\xC4\xBB\xEA\x9A\xBC\x14\xBC\xC7\xB0\x00\x16\xBA\xF1\xBA\xC7\xB3\xE3\x80\xBC\x09\xBE\xC0\xB3\xF2\xB6\xBA\x05\xBE\xC3\xB2\xE8\xA0\xBA\xE4\xBB\xAE\xB6\xEE\x85\xBB\x3A\xBB\xBD\xBA\xF3\xA8\xBC\xC6\xB4\xAF\xB4\xF3\x86\xBB\x0A\x9B\xC1\xB5\xE8\xAE\xB9\xA0\xB4\xCB\xBD\xD7\xA6\xBC\x8E\xBB\xCE\xB0\xF2\xAA\xBC\x22", "\xBC\x91\xB4\xF0\xAE\xBC\x7F\xBB\x43\x01\x83\x98\xBD\x5F\xBB\xC7\xB3\xF5\x91\xBA\x3E\xBE\xD7\xB4\xF2\xB1\xB2\x35\x5E\x42\x04\xF6\x83\xBA\x66\xBC\xB3\xBC\xF5\xA9\xBD\xD0\xB8\xD0\xB0\xF6\xAF\xBD\x44\xBD\xDC\xB5\xEE\xB4\xB7\xE7\xB9\xCD\xB1\xF4\xAF\xBC\x43\xBD\xAC\xB7\xF6\x81\xBC\x55\xBC\xBF\xB6\xF7\x8C\xB1\x38\xBC\xDE\xB2\xF8\xB2\xBD\xFA\xB8\xDD\xB8\xED\x9F\xBD\x25\xBE\xD4\xBC\xF8\x95\xBB\x37\xBB\xB5\xB6\xEF\x95\xBC\x92\xBF\xDE\xB4\xEC\x93\xBC\x50\xBE\xA9\xB4\xE7\x9A\xBB\x4B\xBC\xC6\xB3\xF3\xAD\xB8\x97\xBE\xCD\xB9\xE6\xAE\xBD\x99\xBE\xD1\xBC\xF7\x88\xBD\x50\xB8\xBC\xBF\xF9\x91\xBD\xA1\xBC\xB7\xB4\xF9\xBD\xBD\x9D\xBE\xEB\xB0\xE8\x80\xBE\x8D\xB9\xD9\xBA\xF5\x83\xBE\x3D\xBD\xE1\xBB\xF0\x87\xBE\x12\x05\xE2\xB9\xFA\xB2\xBC\x4E\xBC\xE9\xBB\xF1\xBF\xBD\x37\xBC\xE8\xB0\xF3\xBA\xBA\xC4\xBF\xD1\xBC\xF9\x89\xBD\x98\xBD\xEC\xB3\xEF\x99\xBC\xC6\xBE\xDF\xB7\xF7\x83\xBF\xC2\xBB\xEC\xBC\xFA\xAE\xBA\x1D\xB6\xE2\xB9\xE9\x99\xBF\xF4\xB9\xF5\xB5\xFB\xB6\xBC\xDE\xBC\xC4\xB0\xFE\x94\xBF\x64\xBB\xF1\xB7\xFD\x92\xBF\xF9\xBA\xF6\xBF\xFC", "\xAD\xBE\x36\xBC\xCE\xB7\xA7\x86\x98\x07\x07\x03\xAA\xEC\xBA\xBD\xAA\xBF\xE6\xBF\xF4\x90\xBF\x06\x06\xFD\xBB\xEE\xB2\xBE\xE1\xBD\xFA\xB6\xFD\xBE\xBF\x17\xBC\x00\xC8\xFE\xBC\xB9\xEA\xBC\x13\xB4\x00\xE7\xBC\xA2\xBD\xF1\xB2\x00\xE3\xBF\xC8\xBF\x02\xC9\xF5\x8C\xBD\xCF\xB5\xE3\xBE\xFB\xBF\xBC\x2D\xBE\x02\xC8\xFD\xA9\xBC\x16\xC2\x88\xB6\xF8\x99\xC0\x12\x06\x04\xCA\xFB\x94\xC0\x86\xBB\xCA\xBF\x01\xFD\xB5\x22\xC0\xDC\xBB\xFB\x93\xBE\x01\xC0\x02\xC6\xFD\x9A\xC0\xEC\xBC\xCF\xB1\xF2\x8E\xBE\xA5\xBD\x04\xCB\x01\xCD\xBD\xCE\xBF\xFE\xB0\xFF\xB6\xC0\x31\xC3\xD6\xBD\x01\xC2\xB9\xDF\xBB\xDA\xBF\x10\x29\xC0\x79\xBF\x0A\xCA\xF9\xA6\xC0\xBF\xBC\x08\xC3\x04\xF7\xC0\x15\xC2\xFB\xBA\x03\xDC\xBF\xB7\xB4\x11\xCB\xF8\x87\xC1\x5D\xBD\xDD\xBA\x04\xF5\xB4\x4B\xC1\x0F\xCC\xFB\xB3\xC0\x17\xC2\xDA\xB0\xFC\x99\xC1\xCB\xBD\xD1\xBD\xFC\xAB\xBE\xEF\xBC\x14\xC6\xEA\x92\xC1\xDF\xBC\x07\xCE\x04\xE2\xBF\xFC\xBD\x41\x08\x06\xE6\xBF\x6A\xC1\x0B\xC6\xF9\xAA\xBF\x6F\xC1\xCC\xB7\xFE\xA3\xBE\x0F\xC1\x1B\xC0\xF6\xAF\xBE\x0A\x05\x1D\xCC\xFC\xB7\xC1\x0E\xC2", "\x0B\xC0\x01\xFB\xC1\xB7\xBC\x76\x8C\x04\xE5\xC0\x55\xC3\xE3\xB2\x04\xFD\xC1\x87\xC0\xD5\xBE\x01\xC9\xC1\x7D\xB4\x0C\xC1\x06\xF8\xBF\x63\xC2\xFE\xBC\x06\xFB\xC0\x60\xBC\xCE\xBE\x07\xE2\xC1\x80\xC1\x0E\xC7\x09\xE6\xC1\xF0\xBB\x26\xC4\x09\xDD\xC2\x64\xC3\x13\xC9\xED\x91\xC1\x8D\xC0\xDA\xBD\x05\xD6\xC1\x91\xC0\xDB\xBA\x10\x31\xA0\xA2\xC2\x11\xC9\xFF\x88\xC1\x18\xC1\x2B\xCF\x10\x27\xBE\xF5\xBD\x2A\xC4\xF8\x8F\xC2\xB5\xC1\x70\xBE\x0A\xFE\xB0\x21\xC2\x2E\xCD\xFB\xBC\xC2\x5E\xC3\x15\xC8\xE6\x85\xC2\xB1\xC0\x09\xCE\x08\xC0\xC1\x56\xBE\x2F\xCF\x10\x1A\xC2\xC2\xC0\x17\xC4\x0C\xEC\xC2\xCE\xC0\x16\xCC\x08\xDA\xC1\x2C\xC3\x01\xC3\x07\xEF\xC0\xC1\xC0\x36\xC4\x05\xF4\xC0\x09\xC1\x37\xC3\x09\xF2\xC2\x95\xC0\x2D\xC5\x0C\xF6\xC2\xD7\xC3\x38\xCA\x0C\xEA\xC2\xD3\xC2\x22\xCF\x05\xE9\xC3\x81\xBD\x1A\xC8\x03\xE5\xC2\x9F\xC3\x29\xC7\x06\xD1\xC3\x73\xBF\x2A\xCE\x0E\xC6\xC3\x06\x04\xCE\xB9\xDA\x3F\xC3\x6B\x84\xFE\x76\xE8\x01\xC4\x2F\x9D\x41\x00\x10\xCF\x04\x07\xC6\x40\xC6\x10\xC4\xC4\x03\xC7\x43\x09\x9B\x71\xC3\x70\xC3\x3C\xC6\x09\xF9", "\xC1\x98\xC3\x43\xC9\xFB\xAA\xC0\xEB\xC3\x2E\xCC\x0C\xE7\xC0\x97\xB6\x45\xCD\xE1\x93\xC0\x0D\xC2\x27\xC4\x11\xE0\xC2\x36\xBE\x47\xCD\xE3\x8C\xC0\x06\xC0\x1E\xC2\x08\xFA\xC1\x4C\xB2\x49\xC7\xFF\xA4\xC3\xA4\xC3\x44\xCB\x12\xD8\xC2\x2D\xC4\x3E\xCF\x03\xD6\xBB\x41\xC3\x3B\xC7\x10\x2E\xC4\xFF\xBF\xF4\xBA\x12\xDB\xC3\x83\xC0\x4F\xC5\x00\xFE\xC4\x81\xC0\x50\xCC\x12\xD2\x04\x42\xC4\x4A\xC4\x14\xE2\xC4\x33\xC4\x49\xC8\xFC\x89\xC5\x20\xC5\x4A\xC5\x14\xF9\xC4\xFC\xC1\x41\x00\x15\xE3\xC0\x21\xC4\x3D\xC3\x12\xF6\xC3\xF0\xBB\x55\xC8\x11\xD9\xC5\x32\xC6\x51\xC4\x13\xC8\xC5\x36\xC7\x1A\xCB\x15\xD0\xBE\x64\xC6\x37\xC3\x0B\xC9\xC2\x35\xC1\x26\xC9\x16\xEA\xC3\x60\xC6\x39\xC4\x0D\xD9\xB9\x35\xC6\x5A\xC5\x0E\xEC\xC5\xE1\xC2\x43\xC5\x16\xF2\xC1\x54\xC5\x5F\xBE\x15\xC5\xC1\x19\xC7\x30\xCB\x11\xD0\xC2\x1D\xC7\x5E\xCA\x0D\xFD\xC5\xD5\xC3\x31\xC2\xF6\xAF\xC5\x10\xC6\x1D\xC1\x07\xC7\xC6\xCD\xC0\x5D\xCF\x0B\xCF\xB1\x7A\xC6\x5D\xC1\x13\xF2\xC5\xFB\xC0\x3A\xCB\x13\xC6\xC6\x3F\xC4\x62\xC2\x19\xD5\xC6\x70\xC6\x54\xCC\x14\xE2\xC5\x4E\xC6\x5B", "\xC0\x1A\xCD\xC6\x7F\xC3\x63\xCD\x19\xD1\xC6\x66\xB9\x5D\xC1\x1A\xCB\xC5\x5A\xC5\x53\xCC\x15\xE5\xC4\x9C\xC7\x54\xCC\x1A\xFE\xB9\x7C\xC3\x66\xC6\x19\xEA\xC6\xB6\xC4\x47\xCF\x19\xDB\xB9\x6D\xBE\x6E\xCF\x1A\xED\xBF\x7C\xC7\x6D\xCD\xD1\xB9\xC6\xB8\x65\x6D\xC3\x1A\xDE\xC6\xAD\xC7\x64\xCA\x7F\x67\xC6\x17\xC4\x60\xC1\x17\xF8\xC5\xDC\xC3\x33\xCC\x18\xD1\xC7\x53\xC3\x5A\xC0\x0E\xD5\xC7\xD6\xC2\x70\xC8\x1A\xDC\xC2\xBC\xC7\x72\xC6\x1C\xF7\xB6\x7F\xC5\x76\xC7\x17\xDB\xC7\x83\xC2\x6B\xCF\x1D\xE3\xC2\xE1\xC5\x6C\xC4\x1A\xF3\xC6\x4F\xC6\x72\xCE\x1E\xCC\xC7\x7E\xB9\x79\xC2\x0F\xCD\xC1\xC5\xC6\x6F\xCD\x1C\xD0\xC7\x1F\xC4\x56\xC2\x1A\xF3\xC7\xE3\xC6\xA9\xB8\xF3\xB8\xBC\xC8\xC7\x9C\xB5\x08\xC4\xC8\x5C\xBA\x62\xCD\xE2\x77\xC2\x09\xC8\x84\xB1\x1C\xFD\xC3\xC1\xBD\x84\xCB\xE7\x43\xC7\x32\xC1\x3E\xCD\x0E\xED\xC5\xAF\x53\x4B\xC1\x18\xD2\xC3\x83\xC5\x2F\xC9\xE5\x99\xC8\x3D\xC4\x71\xC0\x19\xFA\xC7\x7E\xB8\x88\xC3\x14\xE2\xC8\xAB\xC4\x89\xCD\xD1\xA6\xC8\x4A\xC4\x8A\xCD\x1B\xC4\xC6\xBF\xC7\x41\x0C\x22\xD1\xC5\xB0\xC5\x58\xC4\x1F\xEB\xC8", "\xF2\xC6\x8D\xC1\x20\xF2\xC8\x39\xC8\x66\xCD\x16\xCC\xB1\x33\xCA\x7F\xC5\x23\xFE\xC8\x79\xC5\x79\x7D\x23\xD4\xC7\xE9\xC5\x8A\x78\x1D\xF7\xC7\x88\xC0\x7A\xC7\x14\xD3\xC8\xEB\xC4\x4C\xCD\x1E\xFA\xC8\x2A\xCB\x6D\xB1\x24\xDF\xC5\xFF\xC4\x95\xC0\x23\xFB\xC7\x46\xCB\x6E\xC2\x11\xC4\xC9\xDC\xC5\x37\xB0\x25\xCB\xC9\x11\xC4\x7E\xC3\x22\xDB\xC9\x25\xCB\x91\xCE\x24\xE3\xC5\x63\xC9\x7F\xC8\x25\xC3\xC9\x48\xCA\x1E\xC7\x25\xD2\xC7\x59\xC8\x98\xC3\x08\xF3\xC9\xE6\xC7\x65\xC1\x27\xEC\xC9\xC0\xC7\x2B\xCA\x24\xEE\xC9\x74\xC8\x9C\xCB\x26\xE5\xC6\xA1\xB1\x21\xC8\x27\xCC\xC9\xCB\xC0\x4E\xCB\x23\xF6\xBC\x87\xC9\x99\xCD\x24\xFA\xC3\x3F\xCB\x9F\xC7\x12\xF4\xC8\x2E\xCA\x78\xC5\x25\xC2\xC8\x92\xCA\x86\xC3\x1D\xC3\xCA\xF0\xC4\xD8\xBD\x28\xCE\xC6\x5F\xCB\x9E\xC4\x28\xD9\xCA\x21\xC9\x85\xC7\x13\xD5\xBE\x37\xCA\x86\xBD\x20\xF8\x56\x5E\xCA\x99\xC9\x22\xE8\xC9\xC7\xC6\xA1\xCA\x26\xD0\xCA\x45\xCA\x82\xC0\x0C\xED\xC9\x93\xCA\x90\xC5\x29\xC0\xC8\x97\xCA\xED\xBF\x20\xEC\xCA\x14\xCA\x0F\xC6\x16\xF2\xC6\x68\xC6\x75\xC8\x2B\xDA\xCA\x75\xCA\xA8\xCD", "\x29\xC8\xBE\xA4\xCB\x89\xC6\x2A\xC3\xCB\xEF\xC5\xB1\xCD\x25\xC1\xCB\x5B\xC2\x85\xCD\x21\xE7\xC3\x89\xC5\x3E\x53\x2B\xD7\xC8\xB5\xCA\xB6\xCD\x2A\xCF\xCA\xDC\xC9\x98\xCE\x2D\xD4\xCB\xD9\xC3\xAB\xCE\x21\xDC\xC9\x3C\xCB\xB7\xC9\x28\xE8\xCA\x8B\xC8\xF2\xB8\xF3\xAC\x45\xC8\xCA\xA0\xC4\x2B\xD6\xBF\xF0\xC9\xA9\xC2\x2C\xF9\xC7\xB0\xCB\xDB\x91\x2F\xFB\xCA\x5A\xCB\xB9\xCE\xE7\xB5\xCB\xCE\xCB\xBD\xC7\x26\xFE\xCB\x1D\xB4\xC0\xCD\x22\xCF\xCB\xF8\xC8\xC1\xC7\xDB\x86\xCC\x94\xC8\xC2\xC3\x30\xD8\xCB\x31\xC8\x8F\x6A\x2E\xEC\xC3\xD7\xCB\x5C\xC6\xE6\x8C\xCC\xBA\xCA\xC3\xC6\x2E\xD0\xCC\xE8\xCA\xC4\xC4\x2E\xDF\xC3\xF3\xC9\x92\xCA\x2F\xF6\xCB\xD5\xCB\xA9\xC4\xFB\x8F\xC9\x0A\x04\xC6\xCF\x26\xFC\xCB\x76\xC8\xCA\xCB\xEE\x13\xCC\x1A\xC6\xA2\xCD\x2B\xF6\xBC\x2A\xCD\xA0\xCC\x32\xCA\xCB\xD2\xCB\xCB\xCF\x31\xDA\xC7\x21\xCE\xCB\xC0\x21\xE3\xCC\x01\xCD\xC9\xC0\x2D\xE9\xCA\xA6\xB9\xCD\xC9\x27\xD3\xC9\x2D\xCC\x9F\xCA\x33\xD1\xC9\x1B\xCA\xB5\xC2\x33\xF9\xCB\x29\xCF\xB6\xC5\x31\xD9\xC6\x97\xB6\xD1\xC8\x28\xD4\xCC\x4F\xCE\xC2\xCE\xF9\xAB\xCA\x38", "\x80\xCC\xC2\x18\xD9\xCD\x1C\xCC\x6E\xC5\x08\xD6\xCD\x8E\xCB\xBA\xC7\x32\xCA\xCD\x1E\xCC\xD3\xCB\x29\xFD\xCC\x68\xCD\xAA\x5A\x36\xC9\xCB\x9C\xC9\xCE\xCF\x33\xD1\xCD\x5E\xCC\x87\xC0\x36\xD6\xCC\xFF\xCA\xD4\xC7\x37\xD4\xCD\x11\xCE\xDB\xC4\x26\xE0\xCA\xAE\xCB\x8B\xCA\x35\xFE\xCA\x7E\xC8\xD0\xC7\x30\xC2\xCC\x1B\xCC\xDE\xC1\x2B\xFF\xCA\x5D\xCF\xCE\xC7\x1E\xEC\xCD\xA3\xC8\x83\xCB\x18\xC6\xCE\x0D\xCC\xE2\xC2\x38\xE1\xCD\x8B\xCF\x82\xC4\x37\xCE\xCE\x7A\xC9\xDC\xCB\x08\xE2\xC9\x9B\xCF\xDB\xC2\x2F\xE1\xCB\x22\xCD\x77\xC9\x36\xFF\xCD\xA9\xC5\xA8\xCE\x39\xFA\xC4\xA7\xCC\xA0\xC7\x34\xEA\xCE\x90\xCF\xB2\xC1\x45\xA2\xCE\x37\xCF\xEA\xC5\x15\xCD\xCE\xB4\xCE\xC6\xC7\x39\xCA\xCE\x0B\xCE\xDE\xCC\x2E\xF3\xCC\xC8\xBC\xD9\xC0\x38\xE0\xCB\x53\xCD\xA4\xC6\x2C\xF6\x54\xBE\xCF\xD9\xC5\x1A\xED\x89\xB9\xCB\xCA\xCA\x3B\xD6\xCA\x50\xCD\x94\x59\x3C\xDB\xBF\xB2\xCF\x43\x0C\x3C\xFB\xCB\xCF\xCC\xAF\xC1\x3D\xF6\xBC\xD7\xCC\xC9\xC5\x2E\xFB\xCE\x7C\xCD\xC7\xC5\x10\x1D\xCF\x41\xCF\xF7\xC0\x3D\xC3\xCE\xDC\xCF\xF4\xC5\x06\xDD\xCA\xE4\xCF\xE1\xC2\x34", "\xC9\xCC\x98\xCF\x6D\xBD\x3E\xD5\xCE\xEF\xCF\xC3\xCC\x3B\xE6\xBA\xF3\xCD\xC6\xC6\x39\xE7\xCF\xF1\xCC\xFE\xCA\x3E\xE6\xC2\x72\xCF\xF8\xCF\x3F\xF5\xC3\x01\xD0\x00\x09\x3F\xCE\xCF\xFB\xCE\xF6\xC8\x3E\xC8\xBF\x07\xD2\xCD\xC9\x3D\xFD\xCB\xFD\xCC\xBC\xB8\xF3\x8D\xD0\xAF\xCD\xE0\xCC\x3F\xF7\xCF\xF0\xB8\x05\xD7\x35\xF1\xCC\xBF\xCF\xF6\xCC\x40\xC3\xD0\x67\xC4\xC3\xBA\x41\xE5\xCD\x58\xCD\x07\xDB\x40\xC6\xD0\x20\xD0\xB1\xCF\x39\xCE\xC8\x85\xCC\xF2\xC5\x37\xCE\xCD\x26\xD1\x04\xD6\xFA\x85\xC2\x23\xD3\xF0\xC6\x36\xD4\xCF\x05\xD1\x0D\xD9\x3A\xD6\xD0\x0A\xD2\x0C\xDF\x41\xEF\xD0\x26\xCC\x0E\xDB\x42\xEB\xB3\x12\x06\x0E\xD0\x1E\xF0\xCE\xA4\xCE\xCF\xC2\x40\xC0\xD1\x43\xCD\xBB\xC0\xF6\x86\xD1\xEC\xC4\x12\xD5\x3C\xDD\xCB\x06\xCB\xE4\xCE\x42\xDC\xCE\x48\xCC\xCE\xC3\x44\xE1\xBD\x9A\xCE\xF4\xCC\x44\xF0\xCF\x18\xD3\x0C\xD6\x45\xDE\xD1\x58\xD2\x14\xDB\x37\xC6\xCF\x7D\xCA\x05\x86\x3D\xE9\xD0\xD1\xCB\x16\xD3\x41\xEC\xD1\x44\xCE\x04\xD5\x44\xF0\xD1\x4E\xD0\x13\xB0\x45\xD2\xC9\x66\xD1\x0C\xD1\x46\xFF\xD0\x65\xD0\x0F\xD0\x41\xFB\xD1\x4F\xD0", "\x1D\xD0\x3C\xC1\xD2\x5F\xD2\xFD\xC1\x3E\xFE\xB9\x77\xD1\xD3\xC1\x44\xEB\xCF\x05\xD0\xCE\xB3\xC4\x18\xCF\x09\xD3\x1F\xD7\x48\xDE\x91\xA8\xCF\x11\xDE\x47\xC9\xCD\xA5\xC7\x23\xDE\x3D\xE0\xCC\x49\xD1\xDB\xC6\x04\xB9\xCE\x91\xD0\x26\xD5\x3D\xE6\x13\x82\xD2\x07\xD0\xF6\x9A\xD2\xE5\xCC\x27\xD3\x45\xE2\xCB\x05\x04\x2A\xDE\x3E\xE6\xCF\x3D\xD0\x20\xDE\x4A\xF4\xCF\xB0\xD2\x24\xD8\x46\xD3\x24\xA5\xD3\x09\xDC\xC4\xB3\xD2\xFA\xCD\xFD\xC9\x38\xD3\xD2\xB7\xB4\x2F\xD8\x40\xFE\xD2\xE0\xCF\x2D\xD6\xDA\x7D\xD1\xC4\xCF\x19\xD4\x45\xDF\xD2\x95\xD1\x14\xD7\x49\xDA\xD1\xAC\xCD\x2B\xD9\x4B\xFE\xD0\xA6\xC4\x29\xD5\x48\xFF\xD2\xC6\xD2\x34\xD7\x4D\xC5\xD3\xCB\xD2\x30\xDE\x40\xE1\xD2\xD0\xD1\xCB\xBE\x4D\xD5\xD0\xC9\xD2\x1E\xD0\x4C\xD6\xD3\xC8\xD3\x0D\xDC\x48\xDB\xD1\x05\xC8\x33\xDE\x3A\xDB\xD0\x5F\xCE\x39\xD9\x4D\xDC\xD1\x6A\xD0\x3A\xD0\x4A\xC4\xD3\x17\xD3\x39\xD0\xEF\xA3\xD3\xF0\xD2\xDD\xC2\x4F\xDD\xD3\xD3\xD0\x20\xDC\x2C\xDB\x83\xF7\xD1\x2D\xD2\x4A\xC5\xD0\xFC\xD0\x09\xDC\x41\xCA\xCF\xA3\xD0\x2E\xDB\x4D\xF9\xD3\xF3\xD1\x3B\xD9\x50\xF6", "\xD0\x25\xD0\x43\xD5\x40\xF8\xC2\xC7\xD1\x41\xDA\x4A\xCA\xD3\xAC\xD0\x3D\xD6\x10\x31\xA0\x13\xD7\x0E\xD5\x4E\xD6\xD4\xEC\xD1\x21\xC1\x52\xD6\xD2\x23\xD6\x10\xD1\x4D\xC9\xBF\x04\xD5\x33\xD8\x47\xCF\xD3\xB6\xCE\x66\xC3\x37\xCE\xD4\xE9\xD1\x45\xDA\x52\xF7\xCE\x27\xD6\x33\xD9\x52\xEB\xD3\x2B\xD5\x4E\xDF\x52\xFB\xD4\x00\xD3\x16\xDE\x53\xCA\xD2\x4D\xD3\x20\xDB\x4B\xC1\xD4\xFA\xD2\xCD\xB3\x54\xEB\xCD\x9D\xD1\xE4\xC6\x3A\xC5\x04\x29\x88\x24\xD8\x4F\xF1\xD2\x49\xD4\x54\xD8\x54\xED\xC5\x51\xD7\x26\xDC\x33\xCD\xD5\x0D\xD6\x97\x87\x55\xCB\xD3\x59\xD5\x2A\xDB\x55\xEB\xD2\xA5\xCF\x41\x01\x56\xEF\xD2\x1B\xD7\x3F\xDD\x51\xE7\xD5\xB4\xD1\x5A\xD4\x52\xF6\xBD\x6C\xD5\x2F\xD6\x50\xE1\xD3\x32\xD6\x55\xDF\x50\xD4\xD5\xF3\xD1\x5C\xD3\x4C\xF3\xD5\x31\xD5\xB6\xC6\x57\xF5\xD4\x0B\xD7\x4D\xD5\x57\xC0\x00\x7A\xD7\x37\xD3\x55\xF6\xD2\x60\xD7\x57\xDB\x56\xCA\xD6\x65\xD7\x4C\xDE\x55\xF7\xD5\x88\xD7\x62\xD0\x59\xC7\xD4\x5B\xD1\x61\xD4\x4E\xEA\xD3\x41\xD4\x5C\xDC\x58\xFA\xC1\x96\xD5\x3F\xD0\x43\xEF\xD5\xB7\xCD\x3B\xDD\x59\xCA\xD4\xF1\xD0\x68", "\xD3\x58\xD8\xD4\x7F\xD6\x46\xD3\x56\xDC\xD4\x8D\xD5\x6A\xDE\x52\xC4\xD5\x60\xD1\x55\xD0\xF6\xA3\xD6\x14\xD5\x60\xDC\x53\xF7\xCE\x38\xBC\x6D\xD2\x52\xD8\xD6\x04\xD1\x65\xDB\x59\xDE\xD2\xBA\xD4\x4A\xDC\x5B\xE1\xD0\x2B\xD6\x68\xDF\x5B\xCE\xD5\xB6\xC8\x65\xCC\x4F\x87\xD7\x5D\xD5\x15\xDD\x42\xE6\xD5\xCC\xD7\x45\xD5\x08\xC1\xD7\x3A\xD7\x70\xDA\x42\xEB\xD4\xB9\xD5\x74\xDE\x46\xDB\x89\x93\xD4\x5D\xDE\x57\xC4\xD6\xDA\xD7\x4A\xD4\x5D\xFF\xD4\xD6\xD5\x1B\xD2\x5E\xE1\xD7\xB7\xCF\x78\xD0\x5B\xC6\xD2\x79\xD4\x7A\xD3\x58\xF8\xBC\xE0\x1D\xE5\x10\x7A\x92\xD5\x7C\xD5\xEC\xCF\xF5\xB3\xD7\x5A\xD7\xE3\xCC\x55\xF7\xD7\xEE\xD7\x77\xD8\x5F\xE2\xD5\xFA\xD4\x59\xDA\x44\xC0\x00\xFF\xD4\x5A\xDB\x5A\xEA\xD5\xAD\xD4\x81\xDD\x5F\xFD\xCD\x0A\xD9\x77\xDD\x57\xD9\xB9\x05\xD9\x5B\xD7\x60\xE6\xD6\xFE\xD7\x82\xD2\x3E\xCD\xD8\x80\xD5\x69\xD2\x58\xD5\xD8\x0E\xDA\x7D\xDB\x45\xD1\xD8\x72\xD6\x5B\xDB\x61\xCC\xD8\x20\xDB\x5E\xD2\x62\xF7\xD6\x83\xD5\x89\xD6\x58\xF5\xD7\xFB\xD7\x76\xDF\x10\x2A\xD8\x97\xD6\x4D\xD8\x62\xDC\xD8\x19\xDA\x3F\xD4\x61\xE4\xD8", "\x16\xDB\xCF\xA0\x63\xDE\xD6\x8B\xD1\x66\xDD\xF2\xBB\xD8\xA4\xD6\x8D\xD3\x62\xD7\xD8\xED\xD0\x90\xD5\x5B\xDA\xD8\x33\xD8\x83\xD8\x5A\xD8\xD8\xAA\xD5\x80\xDC\x5A\xC3\xD8\x46\xDB\x6E\xD2\x63\xFE\xD8\x29\xD9\x8E\xD7\xEC\xAF\xD8\x56\xDB\x6D\xB1\x65\xC2\xD7\x53\xD9\x6F\xDB\x52\xDB\xD9\xD5\xD5\x97\xD4\x5C\xE1\xD6\x5C\xCC\x98\xD4\x5E\xE2\xD9\xD7\xD4\x99\xDC\x38\xE6\xD9\xEB\xD4\x36\xDB\x4C\xC5\xD9\x59\xDB\xD6\xCB\x66\xF1\xD9\x72\xD0\x96\xDD\x61\xED\xD8\xD8\xD6\x44\x0C\x66\xCC\xD5\x02\xDA\x27\xDB\x67\xF0\xCD\x1E\xDB\x97\xD4\x67\xF6\xBC\x7F\xDB\xE8\xCD\x67\xC8\xD7\x06\x05\xA1\xD5\x3B\xC1\xDA\xB7\xCE\xA2\xDF\x40\xD4\xD6\x79\xDB\x43\x03\x4F\x86\x04\x93\xD9\x41\x05\x69\xC0\x00\x97\xD9\xA6\xD2\x4F\x9B\xDA\x92\xD8\xA7\xDA\x10\x1A\xDA\x9D\xD9\xA8\xDF\x69\xDE\xDA\x07\x04\x9A\xA6\x10\x26\xDA\x05\x04\xAA\xD0\x00\x2A\xDA\xAC\xDB\x97\xAE\x6A\xCF\x04\xAD\xD8\xAC\xDF\x6A\xCA\x04\xB1\xD8\xAD\xD3\x6B\xC7\x04\x80\xA5\xF3\xCB\x62\xE7\xD8\x54\xDB\x65\xB9\x6B\xF4\xD7\xBC\xDA\x97\xDD\xF2\xBF\xDA\xF9\xD5\xE7\xCC\x68\xC3\xD6\xC4\xD8\x80\xD6", "\x6C\xF8\xD9\xB7\xCD\xB2\xD6\x60\xCE\xD9\x08\xDB\x80\xDE\x6C\xD2\xD8\xD0\xDB\x8D\xD7\x61\xD3\xDB\x21\xDB\x84\xD3\x64\xFF\xAC\xD8\xDA\x89\xDA\x6D\xC9\xD9\xD7\xDB\xA0\xD8\xFC\x9D\xDB\xBB\xDB\xB7\xDD\x6B\xCC\xD8\xE4\xD9\x8C\xD6\x5B\xE7\xDB\xE1\xDB\x9D\xD7\x68\xCD\xD7\x00\x01\xBA\xDC\x63\xC5\xD5\xA6\xD0\x13\xB2\x6F\xC1\xD9\x9F\xD7\xB6\xD7\x65\xCA\x04\xF7\xDB\x91\xD2\x64\xE0\xDB\x7E\xB9\xBF\xD2\x65\xEB\xDB\xC2\xD8\xB2\xD2\x6E\xF1\xDB\x07\xDE\xC0\xDC\x65\xC4\xDC\x63\xDB\x69\xDC\x35\xCA\xDC\x61\xD8\xC3\xD9\x66\xCE\xDC\x8C\xCC\xC4\xD7\x66\xD2\xDC\xE6\xD5\xB3\xD7\x70\xF6\xDB\x1B\xDE\x84\xCC\x6F\xDD\xDC\x82\xA6\xBB\xDF\x64\xDE\xD2\x16\xDD\x9B\xDC\x4D\xDD\xD4\xED\xD1\xC9\xDC\x67\xE3\xDC\x88\xDA\x73\xD5\x4F\xF8\xDA\x20\xDD\x1A\xDF\x51\xC0\x61\x35\xD9\xBE\xD0\x70\xD9\xCE\x2F\xDE\x41\x0A\x72\xC0\xDA\xCC\xDB\x7B\xD4\x73\xCD\xD9\xCB\xDB\xBB\xDD\x48\xFF\xDC\xAF\xD7\xCA\xD1\x6D\xE4\xDC\x31\xDC\xCC\xD2\x72\xC7\xDD\x2D\xDC\xC2\xDB\x74\xD6\xDB\x01\xDD\xD2\xDA\x73\xD2\xDD\x44\xD3\x43\x04\xAA\xB5\xDC\x3D\xD9\xC1\xD7\xD9\x97\xDD\x40", "\xDD\x16\xDF\x60\xE6\xB9\x5C\xDD\xD1\xDC\x73\xC2\xDD\x5B\xD1\xD8\xDF\x4E\xF8\xDB\x59\xDD\xC3\xDF\x5D\xE6\xDD\xBA\xDA\xBA\xD8\x64\xEC\xDB\x7E\xB8\xDB\xD0\x6C\xE6\xDB\x5A\xDC\x83\xD2\x77\xC5\xDB\x5E\xDF\xB1\xDB\x75\xD4\xDD\x00\x03\xDD\xDA\x6C\xF9\xDD\x3D\xDF\xDA\xDC\x77\xFE\xDD\xCF\xD9\xD0\xDC\x72\xF0\xDB\x84\xDC\xB5\xD6\x78\xCC\xDD\x88\xDF\xE0\xDC\x77\xF8\xBC\x89\xDD\xB6\xD5\x6D\xFA\xDB\xB7\xB5\xE4\xDE\x6D\xD3\xDE\x37\xDD\xE5\xD7\x70\xD6\xDE\xE5\xD8\xE6\xD0\x77\xD2\x04\x9C\xDE\xDB\xDF\x6F\xDF\xDE\xAA\xCB\x18\xD6\x10\x21\xDE\xF3\xD9\x6C\xD1\x51\xC5\xC2\xA8\xDC\xDA\xD4\x6F\xFA\xD2\xA0\xDE\xE3\xDF\x74\xD4\xDE\x98\xCA\xD5\xD2\x7B\xD8\xDD\xAF\xDC\x35\xDC\xC4\xAD\xDE\xFE\xDA\xCD\xD4\x7A\xF2\xD9\xCF\xD7\xE9\xDC\x77\xCB\xD9\xBC\xDF\xC0\xDF\x76\xF5\xDD\x44\xD8\xD7\xC5\x7C\xCB\xDC\xC7\xDE\xDA\xDA\x64\xEC\xDE\x8F\xDD\xEC\xD3\x7B\xD9\xDE\xB5\xDE\x42\x0B\x7C\xD1\xDC\xCD\xDF\xC4\xD2\x78\xD3\xDF\xBF\xDC\xBC\xB7\x7D\xD7\xDC\xD9\xDD\xC6\xD3\x58\xDF\xDF\x26\xDC\x44\xDB\x4C\xE4\xDF\x46\xDC\xD4\xDD\xD1\xA8\xDF\x63\xDF\xE1\xD3\x74", "\xF2\x7E\x07\x13\xD4\x87\x10\x2A\xA9\x7A\x92\x44\x32\x11\x34\xDF\x73\x6B\x44\x38\x7F\xC7\x04\x47\x94\xA4\xA6\x45\x86\x04\xFB\xDE\x41\x0D\x7F\xF2\xDF\x00\xE0\xC9\x93\xCA\x84\xE0\x05\x05\x00\xE5\x10\x37\x39\xCB\x32\xFE\xD2\x11\x00\xAA\xDB\x93\xFC\xD2\x11\x05\xAA\x75\x9E\x42\x0A\x80\xDE\xA5\x11\xE1\x01\xEF\x10\x02\xA2\x19\xE1\x02\xEB\x85\xB0\xDF\x12\xE3\x43\x06\x66\x8E\xE0\x0F\x07\x39\xA6\x7F\xCF\x04\x17\xE0\x1E\xAF\x81\xA4\xE0\x0A\x05\x25\x3C\x82\xDC\x99\xB7\xC9\x05\xE1\x82\xF7\x6D\x39\xDD\x41\x0F\x82\xD0\x3B\x20\xE2\x06\xEA\x10\x2A\xE0\x08\xE0\x00\x07\x81\xF7\x39\x31\xA3\x0D\xEB\x80\xC5\xC2\x42\xE0\x00\x0C\x83\xF9\xE0\x1E\xE3\x03\x58\x84\xFE\xE0\x12\x07\x76\xA3\x8E\x5D\x9C\xAC\x58\x0A\xEC\x26\x68\x30\x17\xE0\x9A\x24\x85\xE0\xA5\x0A\x06\xFF\xD2\x2E\x52\xE1\x9D\x9E\x44\x0A\x85\xC2\x74\x5C\xE0\x0D\xE3\x73\xCF\xE1\x16\xE2\x01\xE6\x8B\x5E\x3F\x65\xE3\x43\x00\x81\xD7\xE1\x0F\x04\x05\xE1\x85\xE9\xE1\x73\x68\x1B\xEA\x10\x1C\xE0\x72\xE3\x41\x04\x87\xF7\xDF\x12\x06\x99\x95\x87\xC6\x04\x26\xE0\x18\xE0\x87\xF9\x98\x12\x07", "\x07\xAB\x87\xEB\x67\x68\xE3\x0C\xE0\x83\xE3\xE1\x85\xE2\x0E\xE7\x88\xCF\xC7\x89\xE1\x12\xE0\x81\x4D\xE2\x4C\xE3\x43\x07\x84\xD0\xE2\x3F\xE0\xD7\xC3\x88\xC0\x00\x0C\xE3\x14\x9F\x87\xC6\x04\x93\xE3\x1B\xE6\x88\xD9\x70\x94\xE1\x13\xE2\x11\x2B\xA7\x0F\x04\x29\xED\x2E\xB8\xDE\xAA\xDE\xFA\xB7\xE4\x33\xDD\x9E\xDC\xF2\xDF\xB3\xAB\xE2\x78\xDD\x1E\xDA\x7E\xF7\xB6\xB0\xE3\xDF\xD2\x8B\xF4\xDE\xF0\xB9\x2D\xE5\x78\xC0\xDE\x64\xDF\x4A\xDA\x8B\xCA\xDE\xBC\xE2\xFB\xDB\x45\xFF\xE2\x92\xDF\xE2\xD3\x8B\xE7\xE2\x5D\xDF\x2D\xE4\x7D\xF9\xE2\x7C\xDC\x31\xE7\x79\xC6\xE3\xB8\xE2\xCD\xBE\x8C\xDD\xDE\xD0\xE3\x32\xE2\x8D\xCD\xE3\xD8\xE0\xF7\xDE\x8A\xFB\xDB\x5B\x32\x36\xEE\x7C\xD7\xD8\xD3\xE2\xE8\xDE\x7B\xDB\xE3\xB4\xE3\xC1\xD1\x8E\xE9\xDE\xEC\xD6\x2A\xE3\x7C\xDC\xCD\xE7\xE2\xEB\xD9\x8A\xE8\xDC\x85\xC1\x3B\xED\x7B\xE9\xDD\xDA\xDC\x83\xD2\x8F\xC6\xDF\xA3\xDC\x39\xE6\xEA\xB7\xE3\xCC\xDD\x3E\xEF\x8D\xD5\xBA\x40\x85\x32\xE0\x53\xFA\xDD\xF6\xE1\x36\xE8\x8A\xE9\xE3\xF0\xE2\xE9\xDC\x25\x5E\xE3\xF5\xE1\xF2\xDC\x38\xFC\xE3\xD8\xDE\x3F\xED\x90\xE2", "\xCD\x0A\xE7\x71\x77\x90\xEE\xD9\x09\xE5\x17\xD3\x86\x42\xE4\x40\xD6\x3E\xE5\x67\xC8\xE3\x62\xDE\xA1\xD2\x8C\xD1\xDA\x20\xE7\xD9\xD3\x8F\xF9\xDE\x02\xD5\x40\xE1\x92\xCB\xDA\x81\xDD\x41\xEC\x90\xE2\xDF\xDF\xD4\x44\xE0\x7E\xD2\xE4\x30\xE6\x4B\xE7\x91\xE7\xDC\x09\xDA\x4C\xE5\x7E\xF8\xD5\xCB\xD0\xCE\xB3\xEE\x2C\xE2\xD5\xE1\xF7\xD4\x16\x5C\xE4\xE5\xD5\x1C\xD3\x94\xEB\xE4\x8F\xDA\x77\xDC\x60\xFF\xE4\xB1\xE3\x40\xED\x92\xD7\xD8\x4C\xE6\x2D\xEE\x94\xFD\xE2\xB7\xCD\x54\xEB\x8B\xCA\xE3\x42\xE4\xF2\xB6\x95\xC0\xE3\x58\xE6\x47\xE7\x94\xE6\xE4\xF8\xE3\x38\xEF\x8F\xDD\xB4\x5B\xE5\x31\xE1\x8C\xCC\xDE\x05\xD1\x59\xEF\x8C\xE7\xE5\xC7\xE0\xBC\xBA\x96\xD4\xE3\x6C\xE5\x34\xEA\x95\xFC\xDD\x6F\xE6\x38\xE4\x8F\xF5\xE4\x50\xE5\xF4\xD1\x6A\x77\xE4\xE6\xDD\x47\xD5\x97\xE8\xE3\x18\xE5\x82\xDF\x97\xEE\xE3\x08\xE7\x20\xC3\x98\xE7\xE4\xEF\xE2\x61\xEB\x8E\xD5\xE4\x87\xE5\x58\xE7\x97\xC6\xE5\xC8\xBF\x92\xDD\x98\xFD\xE3\x62\xE7\x44\xE4\x96\xF4\xE5\x7A\xE5\x8D\x6C\x97\xFC\xE4\x7E\xE4\x66\xEF\x92\xD0\xE6\x84\xC0\x63\xEB\x98\xDA\xE4\xFA\x73\x66", "\xE1\x59\xC9\xD8\xED\xD3\x64\xE1\x91\xD5\xE6\x78\xE4\x45\xE4\x9A\xC6\x28\x99\xE5\x34\x9D\x76\xC0\xE6\x38\xE7\x80\xDE\x93\xDE\xE6\xA6\xE4\xA4\xD5\x95\xF8\xE6\x44\xE4\x9A\xDD\x9A\xD7\xE6\x9F\xE5\x1D\xD9\x8D\x71\xE6\xCC\x8F\xEF\x82\x7C\x88\xE5\xE0\xD3\xD7\xDF\xB3\x84\x4F\x40\xE5\x5C\xE6\x8D\xC9\x81\x7C\xDC\x73\xED\x94\xDD\xE4\x63\xE7\x6D\xB2\x9D\xD2\xE5\xD4\xE6\x65\xE6\x9D\xD1\xE7\x07\xDF\x75\xE7\x95\xD3\xE5\x23\xE7\xED\xCE\x9D\xDC\xE5\xE0\xE4\x5A\xEB\x45\xE3\xE7\x66\xE5\x57\xE5\x9D\xE6\xBA\xE8\xE7\x5A\xEA\x9E\xDA\xE7\xEC\xE4\x77\xE1\x9C\xC6\xD5\x0B\xA0\x72\xE7\x58\xFA\xE6\x3E\xDC\xC9\x29\x9B\xCA\xE5\x17\xD9\x7B\xE0\x97\xEF\xE7\xBF\xE7\x76\xE3\x9F\xE6\xD2\xFE\xE6\x5D\xE8\x92\xF2\xD6\x05\xE8\x6D\xED\x97\xE8\xE6\x5C\xCD\x82\xE4\x98\xC1\xE6\x03\xDB\x92\xDE\xA0\xC8\xE6\x85\xE7\x80\xD3\xA1\xCE\xE6\x07\xEB\x3C\xD7\xA1\xD4\xE6\x8F\xE6\x70\xE7\x3C\xC7\xE7\x60\xE4\x87\xE9\xA1\xCB\xD3\x1B\xEB\x6A\xED\xA1\xF4\xE7\xFA\xE5\x6F\xE8\x71\xE0\xE6\x85\xC9\x45\xE5\xA2\xF3\xE4\xAC\xE4\x8B\xEE\x1C\xE7\xE1\x20\xEB\x6C\xEF\xA0\xF5\xE6", "\x9E\xD1\x3B\xDF\xA2\xFB\xE4\xA7\xE5\x84\xE5\x08\xFB\xE8\xE9\xDE\x5C\xE5\x4D\xF5\xE8\xCD\xE4\x80\xE2\xA3\xDF\xE8\x61\x92\x7C\xEB\x9F\xCA\xE7\x1D\xB4\x90\xED\x7E\xE6\xE7\x2B\xD6\x93\xE2\x92\xD0\xE9\xE2\xE6\x92\xEA\xA2\xE1\xDF\x47\xEB\x53\xD0\x00\x3A\xA8\x05\x04\x97\xEB\xA5\xD2\x04\x5E\xE9\x98\xE0\xA6\xE3\xE9\x0F\x06\x98\xE5\xA6\xE4\xE9\x0A\x06\x99\xE9\xA6\xE8\xE9\xD6\x53\x41\xB6\xA3\xD4\xE8\x10\xE8\x26\xC8\xA7\x2B\xB4\x37\xEB\x82\xEA\x07\xF3\xE9\x7C\xDC\x9E\xE3\xA0\xF0\xDE\x26\x67\x44\xB6\x9F\xEC\xD8\x54\xE7\x60\xDA\xA7\xCB\xE9\x04\xE7\x85\xD3\xA8\xD7\xE9\x34\xE4\x68\xE7\xA8\xFF\xE9\xC1\xDB\x7A\xE0\xEF\x8B\xEA\x21\xEA\x89\xE3\xA2\xDD\xD4\x90\xEB\x9B\xE8\xA1\xC9\xE6\x03\xD9\xA5\xE5\xA4\xE5\xE7\x6D\xE6\xCD\xBA\xA9\xD3\xE7\x45\xE6\x87\xEC\x07\x96\xB0\x7B\xEA\xEE\xDE\x33\x6E\xE9\x9B\xE9\x76\xE1\xA0\xD5\xDF\x6D\xE9\x3B\xBC\xA8\xF4\xDD\x8E\xEA\xA7\xEE\xCD\xA9\xEA\xA1\xE8\x8A\xE3\xAA\xC6\xB2\x84\xEB\x53\xEF\xB3\x9F\xEA\xD8\xE5\xAD\xE6\x4A\xFC\xEA\xDF\xE6\xAA\xE9\xA5\xC9\xD7\x07\xE1\x9F\xE4\xAA\xF9\xEA\x81\xEB\x77\xDB", "\x64\xC0\xEB\xE4\xE6\xB0\xE2\xAA\xED\xEA\x7E\xE9\xA4\xE0\xA3\xE7\xE8\xF5\xDB\xA9\xEE\xAA\xD2\xEB\x3C\xE8\x7E\xEF\x5D\xF8\xBC\xCC\xE9\x7A\xEC\xA9\xC2\xE9\x4C\xB1\xB7\xEE\x9E\xDF\xEB\xCF\xE4\xD8\xB2\xAE\xFF\xE7\xE4\xE9\x56\xE1\x9A\xC1\xDF\x7F\x68\xAA\xE0\xAA\xFE\xE6\xC3\xE8\x0B\xD5\x83\xC5\x94\xC7\xE8\xA2\xE1\xA3\xCF\xEB\xF2\xE8\x22\xE0\xAD\xF5\xEB\xAF\xE9\x2B\xE1\xAB\xD1\xE6\x85\xC3\xB9\xE6\xA0\xD8\xEA\x9E\xD0\xB7\xE3\xAB\xEF\xEB\x2B\xE8\xBE\xE5\x75\xF7\xEA\x1E\xB5\xA9\xE9\x92\xC6\xEB\xB8\xEA\xBD\xE4\xAD\xFC\xE9\x0C\xEC\x9D\xE0\xA7\xF8\xE8\x4D\xDE\xC0\xEA\xA0\xDC\xE6\x09\xDA\xC6\xE5\xA7\xDC\xEC\x99\xEB\xC1\xED\xAB\xF0\xEB\x0A\xEC\x4B\xDA\x10\x3C\xA8\xEE\xEB\xC8\xE9\xB0\xC3\xD2\x28\xEF\xB5\xE6\xA9\xE2\xE8\x04\xED\x69\xCD\xB2\xD1\xEB\x2F\xEE\xA4\xE1\xB3\xF0\xDB\x33\xEC\xBF\xE8\xAD\xC1\xE9\xE5\xE8\x13\xB9\xB3\xD1\xEC\xFD\xE9\x50\xEE\x95\xC8\xBF\x3F\xED\xC3\xE8\xAC\xE1\xE7\x83\xD5\xD1\xE6\xB1\xD7\xEA\x15\xE8\x26\xCA\xB4\xFC\xDD\x4F\xEE\xC3\xE2\x5B\xFE\xEC\x22\xED\xB0\xEE\xAB\xD4\xEC\x07\x05\xD4\xE7\xB4\xD4\xE9\x49", "\xED\xD5\xED\xAC\xD7\xED\xA6\xEB\x43\x0A\xB5\xD2\xEC\x93\xE9\x82\xD3\xB6\xC1\xED\xCE\xE6\xBA\xE3\x50\xE7\xEC\x5E\xEE\xB7\xEE\xAC\xF6\xEA\x59\xED\xDB\xE3\xAE\xEF\xED\xD5\xEA\xD8\xE2\xB7\xE8\xEB\x74\xEF\x09\xD7\xB6\xFB\xEC\x4F\xE9\xA7\xE5\x10\x3B\xED\x35\xEF\xB4\xE5\xB6\xFE\xE8\x15\xE4\xE0\xE4\xAB\xE4\xEC\x70\xED\xBE\xEC\x88\xF1\xED\x29\xEE\xD5\xE8\xB8\xF5\xED\x6C\xED\xE3\xEF\xB5\xCF\xEE\x58\xEE\x41\x06\xB8\xC8\xEC\x58\xE9\xC9\xE8\xF3\x97\xEE\x2A\xED\xE6\xE9\xB8\xFF\xED\x77\xEF\xC0\xED\xB4\xCD\xDD\x9C\xEE\xE3\xEB\xB2\xD0\xEE\xC4\xEA\x30\xB2\x11\x25\xEE\x93\xEF\xE9\xE5\xB9\xEE\xDC\xCA\xD4\xE3\xEE\xB2\xC7\xEE\xAE\xED\xD8\xE2\x73\xC5\xEB\x91\xEF\xEC\xE8\xB9\xC9\xEA\x25\xEF\x92\xDC\xBA\xEE\xED\x60\xEF\xC3\xEA\xA5\xFF\xEE\x73\xED\xF0\xE3\xB5\xDE\xDC\xB2\xEC\xCD\xE4\xBB\xDE\xEE\xA8\xEE\xE5\xE1\xBA\xDB\xEC\x3D\xEA\x27\xD4\xBC\xF8\xED\xC6\xEF\x3C\xD3\xBD\xE2\xEE\x71\xE8\xE9\xEF\xBC\xDF\xEC\xD1\xEE\xF6\xE2\xB9\xC0\xEF\x94\xEE\xED\xE0\x3A\xFF\x6E\xDF\xED\xF1\xE1\xBE\xC0\xD2\xCB\x3F\xD2\xE0\xB3\xE3\xEE\x9D\xC9\xFA\xEC\x77", "\xEE\xEF\x52\xEF\x3C\xD0\xBF\xDB\xED\x7E\xEC\xD8\xB3\xBF\xE4\xED\x37\xED\x01\xD7\xBF\xE8\xED\x46\xEA\x13\xDB\xBF\xFC\xED\x53\xE9\xFD\xEC\xC4\xBF\xEF\x81\xED\xB6\xEC\x9F\xFE\xB9\x04\xF3\xF2\xEC\xBB\xDF\xEE\x46\x92\xF2\xEB\xBB\xF7\xEB\x0C\xF1\x02\xFF\xC0\xD3\xEC\xE2\xEF\x5F\x5B\xBD\xD7\xEC\x76\xEA\x27\xD2\xC1\xDD\xEE\x0B\xF1\xF3\xEB\xB0\xE4\xEF\xBA\xEC\x07\xF0\xC1\xDE\xF0\x0D\xF2\xCE\xE5\xC0\xFC\xEC\x6A\xEF\xD0\x85\xBE\xD4\xEF\xE7\xEE\x6C\xDB\xC1\xE6\xEE\xCC\xEF\x09\xDF\xC2\xED\xEE\x31\xF1\x05\xF0\xBB\xF8\xEE\x20\xF2\x03\xF2\xC2\xD4\xF0\xC2\xED\xEA\xEB\xCC\x33\xF0\xE0\xED\xED\xED\xC3\xD6\xF0\x2B\xF0\xF6\xE8\xB1\xF0\xDB\x40\xF2\xF9\xE2\xC4\xC7\xEF\x48\xE8\x0C\x85\xC4\xD0\xEF\xDA\xE8\x83\xD9\xC4\xEC\xF0\x4B\xF2\xFC\xE7\xC1\xCC\xED\xD9\xEC\xBC\xDD\x4E\xD3\xF1\x46\xF1\x06\xFD\x74\xCB\xD9\x5C\xF0\x14\xF7\xC0\xF8\xDC\xFA\xE8\x11\xF1\xC2\xF0\xF0\x1D\xF3\xEB\xEE\x51\xCB\xEE\x66\xF2\x0E\xF8\xC6\xE3\xF0\x6A\xF0\xCE\xB1\xC6\xDC\xEF\x51\xF3\x85\xD2\xC7\xD7\xF1\xEB\xED\x16\xFA\xBF\xF8\xF1\x36\xEC\xFB\xEB\xC7\xCF\xF1\x74\xF3", "\x18\xF7\xDB\xB3\xF1\x18\xF0\xC8\xEA\xC1\xFC\xF1\x82\xED\xFE\xEB\x45\xC4\xF2\x58\xF3\x11\xFF\x7E\xF7\x8D\x88\xF2\x01\xFC\xA4\xDB\x8B\x91\xF0\x0A\xF3\xB4\xC0\xA9\x95\xF1\xDF\xE0\xAE\xD7\x8A\x99\xF1\x00\xFB\xC9\xD4\xF2\x80\xF1\x21\xFD\xBD\xF0\xDB\xDE\x8E\xFA\xED\xC7\xFA\xF1\x5B\xD1\x29\xF7\x70\xEA\xF2\xF1\xEF\x32\xDC\xCA\xF4\xEF\x9F\xF0\x24\xF1\xCA\xCD\xF2\x5E\xF0\x29\xFD\xC9\xEC\xE4\xC9\xE8\x83\xDF\xCA\xF8\xEF\x7E\xF1\x2A\xF7\xCB\xC9\xE5\x93\xF2\xA9\xBB\xCB\xFC\xEF\xE9\xEB\x25\xFB\xB6\xC7\x04\xC3\xF0\x00\xF8\xCB\xC8\xED\xDF\xD5\x32\xF7\xC2\xDA\xF2\x3D\xEC\x27\xF3\xCB\xF9\xF1\x8E\xF0\xC3\xBE\xCC\xCA\xF0\x70\xF0\x35\xD7\xCD\xD3\xF0\x83\xED\x8E\xEC\x35\xDB\xF3\x3B\xF1\x37\xFF\xC5\xC5\xC2\xE0\xF3\x1B\xFC\xC3\xCC\xF1\xB2\xF3\x19\xF4\xC3\xE9\xF1\x36\xF0\x26\xF3\xCD\xE7\xF2\xD5\xF0\x49\xE8\xCC\xFF\xF2\xC9\xE5\xA1\xEE\xE7\xA5\xF3\xEB\xF1\x36\xF3\xC4\xE3\x9E\xF4\xF3\x7D\xE2\xC8\xC0\xDF\x31\xE3\x3C\xFF\xCE\xC9\xF2\xBD\xF1\x71\xD4\xCE\xFD\xF3\x80\xE8\x33\xFF\x7C\xD5\xE4\xF8\xF1\x10\xF5\xC3\xFB\xF3\x6B\xF0\x8D\xE5\xA4\x83", "\xF4\x92\xF2\x3D\xFC\x8D\xD3\xF4\xEA\xF2\x43\xFC\xCE\xD0\xF4\x38\xBD\x43\xFA\xC4\xCF\xF4\xE8\xF2\x40\xF9\xD1\xDF\xF4\x1B\xF5\x48\xF8\xD1\xEE\xF1\xF9\xF3\x39\xF3\x4F\xDE\xF4\x54\xF0\x48\xFB\xD2\xC8\xF4\x8D\xE8\x7C\xE0\xEF\xAC\xF4\x5D\xF2\x21\xFD\x74\xF8\xBC\xB1\x8B\x33\xFE\xC9\xE5\xEB\x39\xF4\x36\xFA\xD2\xEA\xBF\x3D\xF4\x37\xFA\xC8\xEB\xD4\x41\xF5\x38\xF3\xD4\xF7\xCE\x45\xF6\x39\xF2\xCE\xF0\xDB\x49\xF5\x4A\xFB\xD4\xC5\xD0\x4D\xF6\x46\xFA\xCF\xF2\xD6\x51\xF4\x49\xF3\xD5\xF3\xD3\x55\xF5\x4B\xF5\xD2\xD8\xF5\x7C\xDD\x56\xF5\xD3\xE3\xF2\x50\xF5\x57\xF2\xD6\xED\xF2\x1D\xD4\x4E\xF3\xD6\xF0\xF2\xD1\xF3\x43\x0E\xD5\xE2\xF1\xC1\xF3\x41\x0B\xD6\xC1\xF2\x6D\xF6\x41\x0F\xD6\xE2\xF2\x75\xF2\x6B\xE1\xD0\xF2\xF5\xA3\xE7\xBC\xE3\xD7\xF4\xF2\x36\xF4\x53\xF7\xD6\xFC\xF2\xA8\xF2\x3C\xF8\xD7\xE4\xF5\x09\xDB\x5E\xF4\xCD\xF5\xF2\x61\xF4\x61\xF4\xB8\xEC\xEB\xB0\x89\x5E\xF1\xBB\xC3\xF6\x68\xF5\x0A\xF2\x39\xCC\xF6\x86\xF4\x3C\xF8\xD8\xE5\xD4\x8C\xCD\x65\xF4\xD0\xC1\xF6\xB8\xD6\x44\x0A\xD9\xD5\xF4\xBA\xEB\x45\xF5\x10\x1F\xF6\x96\xF3\xBF", "\xE0\xF6\xA4\xF6\xD0\xF2\x64\xFA\x10\x28\xF6\x3B\xF6\x6A\xFE\xD6\xFF\xF5\xC4\xF1\xDE\xED\xCE\xEC\xF6\xCB\xF0\xD7\xEB\xAD\xD2\x04\x47\xAA\x62\xF8\x09\xF9\xF6\x91\xF7\x25\xFC\xDB\xC0\xF6\xF1\xF3\xED\xCF\xDB\xF1\xF6\xD5\xEF\x32\xD3\xDC\xCA\xF3\xC0\xF2\x45\xF7\xDB\x87\xF7\x3A\xF5\x6D\xF2\xC0\xF8\xF6\x07\xDC\x73\xFE\xD3\xCF\xF5\x5B\xD2\x74\xF2\xD4\xC5\xF4\xC2\xF4\xDF\xD6\xDD\xC6\xF5\xD8\xF7\x60\xDB\xDD\xCA\xF5\x47\xF6\x77\xFA\xDD\xC4\xE7\x05\x07\x77\xFE\xD4\xE1\xF7\xDF\xD6\x79\xF2\xD5\xFF\xF4\x1D\xD6\x7A\xF6\xD5\xEC\xF7\x83\xC2\x7B\xFA\xD5\xD7\xF5\xEA\xBE\x7C\xFF\xD5\xF5\xF5\x64\xF0\x0E\xF6\x10\x36\xF7\x6C\xF6\x72\xF0\xD0\xCF\xF6\xE5\xF7\x78\xFA\xDB\xCD\xDD\xFC\xF4\x5C\xFE\xDF\xDF\xE4\x07\x05\x81\xF4\xD7\xFF\xF3\xF0\xBA\x82\xFC\xD7\xE0\xF5\xD5\xF6\x63\xFA\xDF\xC1\xF8\x03\xFA\x16\xF5\x08\xCE\xF8\x87\xF5\x5F\xF2\x5D\xD5\xE4\x18\xFA\x65\xFA\xE1\xD8\xF6\xAF\xE5\x87\xFB\xD9\xC1\xF7\xF9\xE6\x42\x02\xE2\xE0\xF6\xB9\xF2\x1D\xF0\xDD\xD5\xF8\x05\xD3\x89\xF5\xDA\xF2\xF4\x36\xBE\x8B\xF9\xDA\xC6\xF3\x2B\xF9\x6F\xF6\xDA\xCC\xB1", "\x32\xF9\x6B\xF4\xE3\xCF\x04\x39\xFA\x73\xF1\xCB\xE3\xEF\x06\x05\x92\xAC\xE2\xCC\xBC\x42\xFA\x8D\xF0\xE3\xC5\x04\x45\xF8\x70\xF7\xD9\xEB\xD4\x49\xF8\x71\xFD\xC2\xF3\xD3\x4D\xF8\x72\xF5\xCF\xE1\xF6\xB7\xB5\x94\xFD\xDC\xC9\xF7\x54\xFA\xA9\xB6\xE5\xD3\xF7\xE8\xF5\x96\xBB\xE5\xD7\xF7\x9C\xF7\x60\xDF\xE5\xDC\xF7\x61\xFB\x77\xD3\xE6\xE0\xF7\xDD\xF6\x99\xFC\x77\xE7\xF9\xE7\xF5\x9A\xFC\x60\xEC\xF9\xEB\xF4\x75\xFC\xE4\xE4\xF7\x00\x00\x9C\xFF\xDE\xF2\xF9\xB7\xCE\x9D\xF3\xDF\xF0\xF7\x03\xDA\x9E\xF7\xDF\xCC\xF8\x41\xFB\xC1\xDE\xE7\xFD\xF7\x59\xF8\xE1\xC7\xD7\xC8\xF9\x12\xFA\x44\xF8\xE8\xC3\xF9\x73\xF8\xA3\xF9\xE7\xF4\xF9\x83\xFA\x81\xF5\xE8\xF6\xBC\x91\xFB\x82\xF1\xD7\xC8\xBF\x95\xFB\x83\xF8\xDF\xE5\xDE\x8C\xF5\xA6\xF9\xE1\xD0\xF8\x06\xF4\xE3\xCE\xE9\xDE\xF8\xA0\xFA\x9A\xDD\xE9\xC9\xFA\xCB\x33\xA8\xF3\xE2\xCB\xF9\x9D\xF7\x43\x0A\xEA\xE8\xF8\x0A\xF6\x8A\xFE\xEA\xEB\xF9\xB4\xFA\xA3\xF2\xE6\xF5\xFA\x46\xFB\xAA\xE0\xEF\xAF\xFA\x2F\xFA\xAE\xF1\xFF\x92\x04\x45\xA6\x94\xFE\xCF\xD7\xFA\x00\x01\xB0\xF7\xE5\xD3\xF9\x29\xFB\xCF\xA6", "\xEC\xDC\xF9\x6E\xFB\x85\xDB\xEC\xE0\xF9\x24\xFB\x77\xDF\xEC\xE4\xF9\xD1\xF8\x83\xD3\xED\xE8\xF9\x65\xFA\xB5\xF7\x70\xD7\xFB\x6D\xF9\xB6\xFE\xEC\xFC\xDD\xDC\xF9\x9C\xFD\xE5\xDF\xFB\xB6\xFA\xB4\xF0\xEE\xE7\xFB\xE5\xF8\x83\xD8\xF3\xA1\xFB\x77\xFB\xB8\xFE\xE7\xAC\xFB\x7B\xF8\x9E\xF3\x58\xF0\xFB\x7F\xF8\xB1\xF4\xEF\xC4\xFA\xC9\xF8\xB0\xF9\xE8\xF1\xA0\xF7\xFA\xA4\xF9\xEF\xDC\xFA\xF3\xE9\xBF\xF6\xE9\xC7\xF8\x36\xBE\xC0\xFA\xE9\xC0\xFA\xC8\xBE\xC1\xFF\xE9\xDB\xFA\xAC\xEA\x41\x0A\xF0\xE4\xFA\x0C\xFC\xBC\xBF\xF0\xEB\xFA\x1F\xFB\x4A\xD3\xF1\xF0\xFA\xB6\xF7\x42\xFC\xD8\xD7\xFC\xBD\xF9\xBC\xE7\xC3\xCA\xFA\xC5\xFB\xBE\xFA\xEF\xE9\xFB\x0E\xE7\x6B\xEC\xF1\xF3\xF8\x37\xF8\xF2\xEE\xF0\xF4\xF9\x27\xFE\x8E\xF9\xF2\xCF\x04\x2D\xFE\x8F\xF9\xD6\xCA\x04\x31\xFC\x96\xFF\xEF\xE6\xBA\x35\xFC\xB2\xF1\xEB\xEF\xFB\xE8\xF9\xAE\xFE\xF1\xE6\xEC\x07\x05\x4C\xA2\xEC\xC9\xF4\x19\xFE\x99\xB2\xF4\xC7\xFB\xC3\xF8\xC1\xF5\x10\x07\xFD\xCC\xFA\xB7\xFE\xE7\x8C\xFD\xD0\xF8\xAB\xF3\x58\xD0\xFD\xD4\xFA\xD4\xFF\x5D\xD4\xFD\xD8\xF9\xB5\xF7\x61\xD8\xFD\xDD", "\xFA\xD6\xFF\xB3\x9C\xFD\xE2\xF9\xB3\xFF\xF4\xFC\xDD\x60\xFD\xBB\xF2\xF6\xDD\xB4\x65\xFD\xBC\xFE\xEE\xE8\xFD\x64\xFD\xDB\xF4\xF2\xC0\xE4\x0F\x05\xDA\xF5\xEF\xCA\xFD\x60\xBE\xDC\xF8\xEF\xFB\xFC\x6C\xFF\xDB\xF2\x11\x36\xFD\xFE\xF8\xDE\xF1\xF7\xE2\xFC\x7F\xFE\xDE\xF0\xF0\xC0\xF8\x00\x00\xDF\xF3\xF0\xD3\xFA\xC8\xBE\xE1\xF7\xF0\xC4\xFB\x4C\xB2\xE2\xFB\xF0\xC8\xFC\x43\xEA\x41\x0E\xF8\xD0\xFC\x90\xFD\xE3\xFE\xF6\xFE\xFC\xBD\xEC\xD7\xC3\xF9\xD4\xFC\xA5\xF8\xC5\xDF\x9A\xDB\xFE\x18\xFF\x73\xF3\xD9\xC7\xFA\x85\xFC\xAA\xFB\xF7\xF4\xF9\xA0\xFD\xC7\xFA\xB9\xE7\xFE\x82\xFE\xA9\xB9\xFA\xE8\xFC\x47\xF9\xDD\xF7\xF9\xCA\xF9\x15\xFF\xED\xCF\xFA\xEE\xFC\xB1\xFE\xE5\xFD\xFA\xC8\xF8\x6A\x7B\xEE\xFD\xFB\xD8\xFE\x83\xD0\x9B\x78\xF4\xC4\xFD\xA2\xFE\x42\x02\xFC\xCD\xFD\x5E\xFD\x47\xB7\xFC\xD1\xFD\xB5\xFF\x60\xDB\xFC\xD5\xFD\xCD\xFF\x77\xDF\xFC\xD9\xFD\x56\xFD\x96\xB3\xFD\xDD\xFD\xD5\xFF\x85\xD7\xFD\xE1\xFD\x4E\xFE\xF2\xFC\x77\xDB\xFF\x66\xFD\xF7\xF7\xDB\xA0\xFF\x6A\xFF\xD9\xF3\xFE\xDF\xFF\x74\xF8\xF9\xF3\xF7\xC8\xFE\x60\xBE\xFA\xF7\xF7", "\xC5\xFD\x7E\xBA\xFB\xFD\xF7\xF0\xFF\x12\x06\xFC\xF7\xF8\xF7\xFC\x33\xA6\xEF\xF0\xB0\xD5\xE4\xF6\xFF\xE2\xF4\xF7\xED\xE8\xAF\x73\xFE\x7F\xE3\x7C\xF1\x75\xFF\x68\xFF\x7A\xFF\x11\x7F\x05\x02\x01\x80\xE5\x7C\x00\x8F\x10\x0A\x00\x9C\xFE\x11\x7E\x36\x5E\x07\x81\xE8\x7F\xC7\x7A\xB8\x6A\xDD\x4D\x00\xA6\x7F\x17\x81\x03\x80\x00\x84\xF4\x72\x01\x8A\xFD\x4C\xF0\x4B\x6C\x1D\x80\xD8\x7E\xAF\x7E\x5D\x65\x00\x9A\x00\xAA\xFC\x09\x80\x06\x80\xE0\x7C\x09\x79\x04\x88\xFB\x63\x01\xAD\xFF\x29\x80\xB4\x7F\xCE\x7E\xF4\x7C\xCE\x72\x5E\x4E\xF2\x55\xF1\x6A\x5F\x35\x81\xA1\x7D\x4C\x7E\x05\x89\x03\x83\xFE\x7B\x00\xBF\x7E\x3D\x80\xE4\x7D\xF6\x7E\xCF\x51\x04\x8C\xFE\x72\x00\x8C\x6C\x45\x80\xE8\x7F\x11\x87\xC2\x69\x04\x94\xFE\x51\xFF\x59\x5C\x4D\x80\xEC\x7F\x13\x84\x09\x8C\x77\x71\x02\x9C\xFF\x49\x7F\xB7\x5A\x2B\x81\xF8\x78\x0B\x86\xEA\x5A\x02\xA5\xFF\x62\x7F\x5D\x81\x2A\x80\x0D\x82\x0C\x86\x02\x8F\x08\x1E\x01\xEB\x7F\xF8\x7E\x83\x03\x19\x87\xFD\x75\xBF\x6B\x03\xB3\xFF\x45\x7F\xA9\x77\x18\x52\x1B\x87\xFE\x7E\xF7\x7F\xEF\x6C\xF1\x35\x3E\x64", "\x80\x15\x82\x1A\x7B\x0E\x8E\xFF\x6C\xFF\x47\xF3\x6A\x80\x79\x81\x18\x80\x04\x80\xF9\x5C\x07\x83\x00\xBF\xFF\x33\x74\x72\x80\x0C\x82\x42\x05\x10\x8B\x00\x87\x04\xA3\xFE\x65\x78\x78\x81\x32\x83\xED\x70\xE4\x7C\x08\x8F\x00\x95\xFE\x27\x80\x00\x01\x4A\x83\x04\x83\xE6\x70\xE4\x71\x04\xBA\x01\xED\x79\x9A\x80\x0F\x80\x09\x79\x14\x82\x02\x80\x02\x81\x02\xB6\x80\x2E\x7B\x65\x68\x29\x85\x05\x8F\xF3\x78\x79\x55\x46\x07\x80\xAF\x81\x4F\x80\x20\x69\x16\x82\x08\x97\x04\x8F\x04\x34\x81\xA8\x81\xAD\x7B\x32\x68\x17\x8A\x03\x90\xD5\x79\xFE\x12\x02\xBC\x80\x1F\x82\x2F\x86\x05\x8C\xC4\x41\x06\x82\x01\xD3\x80\x3F\x56\x63\x82\x11\x83\x10\x80\xF6\x4A\x06\x8A\x01\xCC\x81\xC5\x80\xBE\x6E\x33\x86\x09\x8B\x04\x9E\x73\x53\x03\xD2\x80\xD5\x81\x8E\x5B\x35\x87\x0A\x83\x04\x9A\x06\xB4\xF9\x5B\x81\x5B\x81\x6E\x83\x6D\x58\x1C\x8F\x05\x9C\x02\xB0\xBB\x64\x81\x68\x81\x3A\x80\x65\x27\xE0\x68\x0E\x8C\x03\x94\x00\x9F\x7E\x31\x51\x76\x83\x1B\x87\x1D\x81\xD1\x6B\x66\x32\x03\xF4\x80\xF4\x7F\x71\x82\x34\x87\x1B\x8B\x0F\x92\x04\xAB\x03\xFE\x81\x15\x81", "\x78\x82\x22\x87\x1F\x82\x0B\x86\xE9\x70\x03\xC0\x81\x03\x82\x83\x03\x3D\x85\x0F\x89\x06\x84\x01\xB7\x02\xFC\x81\x00\x83\x82\x03\x42\x86\x10\x8E\x07\x88\x08\x91\x04\x80\x00\x13\x83\x46\x81\x45\x87\x21\x87\x11\x99\x08\x96\x02\x8C\x80\x5A\x74\xE8\x51\x2E\x84\xBE\x76\xFD\x42\x09\xBD\x02\xFE\x75\xB1\x7E\x93\x82\x30\x80\x25\x84\x0C\x92\x08\x2A\x04\xC7\x81\xD9\x81\xDB\x5B\x4B\x83\x19\x86\x0B\x8A\x08\x33\x04\xCF\x81\x35\x83\x83\x03\x4D\x84\x1A\x8C\x0C\x9B\x09\x98\x03\xD0\x81\x2E\x82\xBE\x6E\x4F\x84\x1B\x88\x0C\x9D\x68\x43\x05\xE1\x81\x45\x82\x99\x82\x50\x83\x29\x87\x11\x98\x79\x47\x05\xE5\x81\xE2\x80\x53\x5F\x53\x81\x1D\x89\x0F\x92\x0A\x87\xDC\x53\x82\xEE\x81\x72\x74\x56\x83\x1E\x8C\x09\x81\x08\x81\x05\x97\x82\x4B\x6D\xAD\x80\x3E\x80\x0E\x86\x10\x02\x0B\x8C\x04\xEA\x81\x36\x5E\xB3\x80\x45\x85\x21\x88\x00\x80\x00\x2A\x05\x9A\x82\x6C\x82\x26\x5B\x5B\x87\x23\x8E\x08\x96\x09\x80\xFE\x76\x82\x60\x83\x42\x63\x5C\x83\x13\x8E\xDA\x7E\x0A\x8F\x04\x7B\x82\xA2\x80\x35\x79\x58\x84\xCE\x70\x18\x85\x05\xAB\xFE\x7F\x82\x4C\x83\x82", "\x83\x3C\x6D\x30\x8C\x0A\x85\xD9\x4C\x06\xB2\x7E\x7D\x83\x82\x03\x63\x86\xE6\x78\x16\x88\x7E\x53\x06\xBA\x7E\x55\x82\xDE\x7D\x41\x06\x39\x56\x10\x1C\x0C\x9B\x06\xCD\x53\xA0\x83\x87\x02\x67\x80\x00\x03\x1A\x85\x0D\xA1\x06\x8A\x02\xA6\x82\xD1\x83\x69\x87\x20\x09\x1A\x97\xB3\x26\x79\x2E\x83\xE0\x52\x31\x3D\x6C\x84\xCC\x30\x1B\x95\x0D\xB2\x06\xB6\x83\xB4\x83\xDB\x82\x6E\x81\x37\x8C\x1B\x85\x08\x29\xA7\x0F\x02\xBF\x82\x85\x01\x70\x87\x20\x03\x1C\x86\x08\x05\x07\xBE\x83\x12\x03\xE3\x80\x00\x02\x39\x8C\x1C\x89\x0E\x8E\x07\xC0\x83\xCF\x82\xE1\x81\x74\x87\x20\x0C\x7C\x55\x0E\x92\x04\x56\x83\x0F\x02\xEC\x82\x42\x02\x3B\x84\x1D\x97\x0E\x9E\x07\xD9\x83\xDF\x83\xED\x81\x78\x80\x8E\x32\x83\x3B\x2C\x47\xDC\x09\x50\x30\x82\x66\x80\x7A\x84\x26\x80\x12\x87\x08\x2B\x07\xB8\x82\xED\x82\x05\x44\xDF\x6F\x3D\x8C\x13\x99\x09\xB2\x07\x87\x80\xF4\x83\x9F\x82\x7D\x85\x20\x09\x1F\x84\x0A\xB1\x04\xA6\x5D\xFD\x82\xA4\x83\x7F\x80\xDE\x51\x20\x90\x0A\x89\x05\x80\x84\xF3\x83\x04\x85\x53\x86\x3C\x87\x11\x85\x10\x94\x05\xE4\x82\xFC\x83\xF3\x82", "\x84\x81\x2F\x85\x91\x6E\x10\x99\x05\x91\x83\xF5\x80\x06\x86\x62\x83\x99\x66\x21\x9C\x0A\x98\x08\x9D\x84\x63\x82\x7A\x80\xCE\x58\x44\x87\x16\x99\x0C\xB6\xBC\x24\x84\x6B\x83\xCA\x80\xD8\x58\x45\x80\x17\x8A\x11\x9B\x00\x90\x81\x00\x00\x16\x84\x5D\x83\x23\x83\x09\x8B\x66\x32\x08\xFC\x82\x3B\x7D\x49\x81\x0C\x57\x46\x81\x18\x8D\xE7\x4B\xD9\x3C\x84\x86\x82\x06\x7B\x88\x84\xCE\x70\x24\x8D\x0C\x8C\xF0\x45\x84\x90\x83\x1C\x86\x7B\x82\x41\x8B\x21\x9D\xA8\x48\x09\x94\x83\x26\x84\xE4\x5F\x93\x80\x33\x80\x21\x80\xFA\x46\x04\x3F\x4D\x27\x82\xA1\x76\x69\x78\x4B\x8B\x12\x9A\x12\xB1\xFE\x5C\x84\xE9\x83\xFD\x80\x00\x00\x4C\x8C\x1E\x95\x0B\x87\x04\x64\x84\xF0\x82\x33\x87\x95\x84\xEF\x68\x26\x95\x0F\x84\xFB\x6D\x84\xFA\x83\xF8\x81\x41\x00\x4E\x8E\x1F\x80\x0A\xB3\x9A\x6C\x84\x78\x85\x8B\x80\x9D\x82\x40\x86\x27\x8A\x08\x3B\x09\x86\x84\x03\x85\x5F\x7F\x9D\x82\x4F\x89\x27\x8D\x12\x83\xC2\x7F\x84\x0F\x84\x21\x74\xA2\x87\x42\x8A\x24\x9E\x0B\xBE\x09\x89\x82\x73\x85\x42\x85\x2D\x82\x4E\x83\x26\x94\xF3\x4B\x0A\x9E\x84\x8D\x85\x48\x84\xA1", "\x84\x42\x8C\xD8\x77\x14\xA1\x08\xDD\x82\x1F\x7F\x65\x1A\xA7\x85\x44\x85\x25\x8D\xA7\x63\x0A\xA9\x84\x51\x85\x75\x77\xBC\x77\x54\x8D\x22\x89\x15\xBF\x01\x9A\x85\x86\x84\xDB\x72\x44\x04\x55\x83\x23\x91\x0B\xB3\x0A\x92\x85\x23\x82\x3E\x7E\x27\x6C\x56\x88\x23\x8F\xF9\x4F\x0A\x9B\x85\xB1\x85\x82\x75\x47\x5C\x89\x54\x2C\x83\x16\x86\x0B\xB7\x5B\xC5\x85\x26\x78\xD8\x59\x59\x8A\x23\x99\xEF\x60\xFC\x4C\x85\x9A\x83\x65\x86\xB3\x81\x06\x5F\x22\x97\x03\xAA\x0A\xB0\x84\xD5\x85\x67\x84\x26\x87\x55\x82\x2D\x88\x16\x87\x0B\xDA\x74\x9B\x52\x83\x01\xB8\x85\x20\x03\x2E\x80\x7B\x65\x0B\xCC\x58\xE7\x84\x89\x01\xBA\x87\x21\x05\x2E\x8B\x17\x8A\x04\x6E\x85\x07\x02\x78\x86\xB8\x85\xA3\x52\x2F\x84\x17\xB4\x0B\xA2\x7B\x00\x01\x7A\x85\xBE\x87\x5E\x8C\x2E\x8A\x17\x93\x0B\xFE\x85\x83\x7E\x6B\x86\xBE\x83\x60\x88\x2F\x84\x18\xB7\xB6\x7A\x85\xED\x68\x84\x85\x21\x62\x61\x85\x91\x6C\x18\xAF\xE6\x7A\x85\x38\x5E\x88\x84\xC0\x86\xD4\x56\x30\x94\x18\xBC\x0B\x96\x86\x3B\x5D\x6E\x49\x16\x4A\x63\x80\xF6\x52\x61\x0C\xB1\x1E\x86\xB5\x2C\x53\x5E\x0C\x18", "\x64\x8C\x31\x9F\x18\x9D\xB4\x24\x86\x2E\x30\x91\x87\xC9\x80\x5F\x88\x32\x96\x1A\x77\xB6\x23\x86\x21\x86\x43\x7C\x8C\x85\x65\x85\x01\x8B\x66\x34\x0C\x9B\x86\x2A\x87\x8C\x85\xCA\x80\xDE\x57\x33\x80\x41\x3F\x0B\xA5\x86\x33\x74\x9B\x87\xCF\x83\x67\x82\x46\x6F\xCD\x7D\x0C\xB8\x5E\x47\x87\x98\x86\xCD\x5D\x67\x8C\x34\x8B\x19\xAF\x0C\xF8\x85\x74\x19\xA8\x85\x47\x5C\x8E\x1C\xC4\x54\x1A\xA5\xA5\x70\x5D\x52\x87\xDB\x5A\xD5\x84\x65\x28\x35\x93\x1A\x9E\x0D\xDA\x86\x50\x87\xAF\x86\xA9\x59\x6B\x8F\xFD\x36\x03\x96\x00\xE5\x86\x32\x86\x6B\x87\xD6\x80\x6D\x86\xF3\x4B\x1B\x9D\x02\x80\x00\x6E\x86\x83\x01\xDC\x82\xF7\x26\x36\x91\x41\x73\x0D\x99\x84\x5C\x87\xA2\x84\xE9\x7F\x6E\x8B\x64\x77\x1B\xB8\xBC\x7E\x86\x57\x87\xB6\x86\xD8\x85\x6B\x80\x36\x85\x1C\x8D\xFC\x60\x30\xEA\x45\x35\x49\xE2\x80\x6A\x3C\x38\x83\xBD\x0B\x0E\x8E\x87\x8A\x87\xC8\x85\xE3\x80\x71\x82\x39\x90\x1C\x93\x0E\x80\x00\x09\x4B\xCC\x85\x47\x59\xA1\x4C\xC4\x5C\x1C\x98\x8E\x1B\x87\x9F\x87\xDB\x5A\xE7\x87\x21\x03\x3A\x8A\x08\x25\x0E\xB5\x44\xA0\x86\xD1\x84\xBE\x87\x74", "\x86\x10\x0C\x1D\x85\x04\x1A\x87\xA4\x87\xA1\x84\xEA\x81\x60\x80\xF2\x6E\x1D\x98\x0E\xA9\x87\x87\x87\xDB\x86\xEA\x83\x77\x85\x37\x81\x1D\xA6\x0D\xCB\x19\xB6\x87\x76\x69\xF0\x85\x10\x66\x3B\x98\x79\x45\x0F\xBE\x87\xF0\x5C\xDB\x86\xF2\x80\x77\x89\x3C\x98\x17\x8A\xA5\x49\x52\x12\x03\xE7\x84\xF2\x5A\x7A\x80\xF6\x54\x1E\x8C\xB1\x56\x87\xD1\x87\xEC\x87\x6D\x58\x7B\x8F\x10\x1C\x1E\x8A\x04\x5E\x87\x07\x02\xF0\x84\xF4\x83\x7B\x8E\x3C\x9D\x68\x62\x0F\x85\x02\xD4\x87\xF4\x86\xEC\x83\x7C\x8F\x3B\x9A\x1E\xA6\xBA\x67\x87\x00\x00\xF8\x84\xCE\x58\x7E\x84\x3F\x8B\x1F\xA8\x0F\xCE\x85\xCB\x18\xF8\x85\x3B\x6A\x7F\x85\x08\x72\x1F\xAE\x0F\xD1\x85\xF5\x86\xF2\x86\x00\x8F\x7D\x86\x3E\x98\x17\xBF\xAC\x07\x88\x1D\x5A\x3F\x5E\x02\x89\x81\x8B\x45\x6B\x20\xB7\xB6\x0E\x88\xA6\x5C\x08\x89\xB4\x82\x82\x86\xF3\x48\x20\xA1\xFA\x0C\x7B\x76\x7A\xC2\x7C\x05\x88\xF9\x50\xF7\x77\x9D\x5B\x10\xD7\x85\x13\x7D\x92\x7F\xBC\x71\x83\x81\x42\x84\x21\xA0\xFC\x1D\x88\x25\x7D\xC1\x6B\x07\x8C\x89\x5B\x42\x8E\xB1\x4A\x04\x60\x00\x12\x02\x18\x8B\x43\x02\x86\x86", "\xEA\x54\x21\xB0\xBB\x36\x88\x36\x5E\x1C\x88\xF2\x5A\x87\x80\x00\x1C\x21\x8C\xB1\x3E\x88\x31\x89\x8E\x58\x10\x8B\x86\x82\x44\x85\x22\xBA\x0C\x87\x02\x43\x89\x17\x8A\x11\x8A\x89\x84\x44\x94\x1D\xB1\xA0\x49\x88\x3E\x79\x20\x8B\x6D\x58\x8A\x86\x10\x14\x22\x9F\xF0\x55\x88\x4B\x89\x1B\x8A\xFD\x85\x87\x88\x3F\x92\x22\xBD\x0E\xCD\x88\xED\x86\x30\x89\xB4\x86\x8A\x86\x25\x85\x08\x24\x11\xE7\x88\x59\x89\x1C\x89\x1A\x8E\x21\x83\x08\x7F\x7A\x45\xD0\x6F\x88\x5B\x68\x38\x8A\xDD\x5A\x8E\x87\x3B\x74\x23\x83\xD6\x76\x88\xDF\x6B\x47\x7B\x80\x68\x8F\x89\xE5\x4E\x23\xA0\xF8\x24\x7F\x1B\x7D\xD7\x70\x1F\x8F\xC2\x6A\x47\x9E\xA4\x43\x12\xA6\x88\x31\x51\x40\x8B\xBC\x72\x91\x80\x23\x8C\x24\x96\x0B\x85\x89\x37\x7B\x65\x6B\x21\x8D\xA3\x53\x49\x97\x6D\x50\x12\xA1\x38\x76\x5E\x4A\x17\xCF\x52\x93\x8D\xD1\x5C\x24\xB7\xB6\x1E\x89\xA6\x5C\x50\x88\xBC\x5A\x94\x83\x73\x57\x9D\x64\x12\xC8\x5F\xA7\x88\xB0\x5D\x2A\x8C\x89\x5B\x4A\x9A\x13\x1B\xD1\x2D\x89\xCA\x84\x58\x88\xA5\x23\xA5\x69\x4A\x95\x25\xBF\x11\xB0\x84\xB2\x89\x28\x89\xDB\x3F\x95\x8C\x4B", "\x82\xEC\x5A\x5C\x34\x89\xBD\x88\x53\x7C\xE9\x79\x97\x85\x33\x8E\x25\x97\x10\xC3\x89\xB7\x88\x6B\x84\x31\x8F\x8A\x8F\x4B\x8D\xF5\x73\x12\xA6\x89\xC1\x89\xC1\x6B\x32\x88\x93\x80\x4D\x9E\x25\xB0\x5F\x76\x5E\x92\x1F\x9F\x55\x36\x8D\xA3\x5B\x4D\x97\x6D\x5D\x13\xA6\x5D\xDF\x88\x78\x5D\x38\x8A\x25\x5B\x52\x63\x27\x88\xBF\x66\x89\x60\x5E\x74\x88\x13\x5A\x9D\x88\x45\x05\x27\xAE\x10\xA9\x49\xEE\x89\x78\x89\xCB\x58\x9D\x8C\x4E\x8F\x04\xA1\x10\xF5\x89\x35\x85\x76\x8B\xED\x60\x9F\x80\x4F\x8E\x26\xBD\x13\x83\x6B\xFC\x88\x72\x8A\x30\x88\x46\x81\x50\x81\x15\xBA\x13\x9E\x7F\xA4\x7F\x82\x88\xDE\x81\xE5\x26\x4D\x8A\x28\xB8\xBC\x0A\x8A\x10\x8B\x2D\x69\x44\x8A\x9E\x89\x42\x86\x89\x36\xBD\x38\x19\x3F\x56\x8C\x89\x47\x5A\xA3\x87\xDB\x5C\x28\xA6\xBA\x1E\x8A\xF0\x5C\x90\x8A\x45\x8F\x76\x62\x52\x88\x7E\x65\x14\xE0\x5E\x27\x8A\x26\x59\x4A\x8E\xE7\x4B\x52\x6B\x29\x8A\x0B\xAE\x8A\xA5\x30\x92\x88\xC3\x5F\xA4\x80\x53\x91\x03\xAC\x14\x83\x8A\xD6\x85\x9A\x8B\x48\x8B\xB0\x6A\x53\x8C\x26\xA8\x4D\x5B\x68\x3D\x8B\x9F\x8B\x31\x88\x46\x81\x54\x8B", "\xB2\x45\x15\xDC\x66\x47\x8A\xC6\x65\x50\x88\xE7\x5B\x54\x97\x29\xBC\x14\xC0\x8A\x50\x8B\x96\x89\x54\x8E\x9F\x84\x4D\x6D\x8B\x73\xD3\x57\x8A\xCB\x68\xAC\x8A\xF5\x5A\xAB\x89\x60\x7C\x2A\x83\xD8\x5E\x8A\x9E\x69\x79\x68\xCE\x58\xAC\x8D\x74\x76\x2A\xAA\xBF\x2B\x6F\x15\x72\xB4\x8B\x6B\x74\xAC\x80\x6F\x62\x2B\xA5\xEC\x6C\x8A\x8E\x89\xB3\x86\x60\x85\x10\x6A\x56\x84\xFD\x75\x15\x84\x7F\x6E\x8A\x21\x87\x5B\x89\xAB\x8C\x57\x9D\xA8\x70\x15\xEF\x89\x06\x02\x32\x02\xFA\x5A\xB0\x86\xFD\x44\x2C\x89\xD8\x06\x8B\x03\x6C\xC4\x8A\x27\x6A\xB1\x8D\x74\x6C\x2C\x9D\xCA\x0E\x8B\x05\x68\xC8\x8B\x16\x6A\xB2\x8B\x52\x74\x2C\xB7\xCE\x16\x8B\x83\x6A\xCC\x8B\x77\x6A\xB3\x8A\xEE\x72\x08\x1C\x16\x97\x6C\x9F\x8A\x3F\x5D\x68\x8E\xB3\x83\x58\x8F\xB3\x5C\xCD\x23\x8B\xB4\x87\x65\x18\x6A\x8E\xD4\x5B\x5A\x90\x77\x6D\x16\x82\x85\x0A\x03\xD7\x88\xF2\x5A\xB6\x80\xF6\x54\x2D\x99\x0B\xB1\x50\xB6\x8B\xA0\x84\x69\x89\x23\x74\xFA\x79\x2D\xB6\x13\xA0\x7E\xBE\x8A\x2D\x75\x70\x8F\x6D\x83\x5C\x81\x2C\x8B\xD3\x45\x8B\x05\x02\xE4\x88\x00\x02\xB9\x8A\x5C\x98\x79", "\x7D\x1B\x5F\x5E\xCF\x8A\x86\x5D\x74\x8B\xA5\x63\x5D\x97\x9D\x55\x17\x83\x6B\xD7\x8B\xEF\x69\x76\x89\xCB\x5B\x5D\x97\xB0\x5D\x17\xFE\x5C\xDF\x8B\x8E\x59\x78\x8F\xB6\x53\x5E\x86\x75\x65\x17\xF0\x5D\xE7\x8A\xD8\x8A\x6D\x2D\x80\x69\x5E\x88\x7E\x6D\x17\xEC\x40\x7A\x61\xF7\x8B\x6D\x8C\xE7\x31\x57\x8B\x66\x32\x17\xF4\x8B\x5B\x69\xFB\x8A\xB2\x82\xBF\x8C\xB5\x2C\x2F\xA6\x16\x95\x72\xFC\x8A\x5D\x89\x7F\x89\x99\x82\x57\x83\xDF\x1E\xF3\x0C\x67\x01\x8C\xC7\x69\xF9\x41\x92\x82\xF2\x1E\x2F\x9D\xD4\x09\x8C\x0B\x8C\x78\x6C\x84\x88\xBE\x82\x2C\x8F\x08\x0F\x96\x5F\x5E\x17\x8C\x86\x5D\x86\x8B\xA5\x6B\x61\x97\x9D\x5D\x18\x83\x6B\x1F\x8D\xEF\x69\x88\x89\xCB\x53\x62\x97\xB0\x65\x18\xFE\x5C\x27\x8D\x8E\x59\x8A\x8F\xB6\x5B\x62\x86\x75\x6D\x18\xF0\x5D\x2F\x8C\xF5\x89\x55\x53\x99\x61\x63\x88\x7E\x75\x18\x80\x00\x37\x8D\x1B\x8F\x7C\x8E\xC2\x8F\x5F\x8F\xCD\x7A\x18\x92\x02\x3F\x8C\x1E\x8D\x59\x78\xC8\x84\x63\x85\x32\xBC\x16\xB0\x84\x41\x8D\x7C\x8A\x90\x8C\x41\x75\x91\x69\x32\x82\x18\xF6\x51\x3D\x72\x22\x8F\x90\x8B\xC9\x83\x60\x6E\x32\xB3", "\x18\x9D\x6A\x56\x8D\x82\x01\x96\x88\xC7\x81\x65\x8F\x08\x13\xA5\x18\x61\x5F\x8D\xD2\x61\x98\x88\xDE\x63\x66\x85\xA0\x65\x19\xDB\x68\x67\x8D\x95\x69\x9A\x8D\xE5\x5B\x66\x83\xAC\x6D\x19\xDF\x6B\x6F\x8C\x06\x6D\x9C\x8F\xC2\x63\x67\x9E\x73\x75\x19\x9D\x5A\x77\x8D\x23\x8A\x41\x01\xCF\x86\xEA\x5C\x33\xB0\xBB\x7E\x8C\x7B\x8C\xF5\x5C\xA0\x8B\xFF\x7C\xD8\x63\x34\xA0\x10\xA0\x7E\x86\x8C\x26\x59\xA2\x8A\x22\x0B\x68\x8A\x16\x8D\x1A\x8A\x02\x8F\x8D\x83\x01\xA4\x8E\x51\x82\x69\x9D\x31\xB3\xEB\x13\x8D\x07\x82\x2F\x8E\xA5\x8C\xF0\x78\x69\x85\x23\x80\x00\x1D\x8D\x38\x5F\x4E\x8E\xA8\x8B\x99\x63\x6A\x9D\xA8\x60\x1A\xC2\x74\xA0\x73\x9F\x7E\xAA\x8D\x64\x7B\x6A\x83\xA4\x6D\x1A\xA4\x78\xAF\x8C\x35\x79\xAC\x8D\x9D\x7D\x0A\x94\x07\xB3\x1A\x80\x69\xA9\x8D\xCC\x7D\x45\x77\xE7\x7B\x64\x77\x35\x86\x04\xAD\x82\xCA\x84\x5F\x8F\x3C\x6C\xD7\x8C\x35\x64\x36\x8C\xCE\x46\x8D\x8C\x7A\x64\x8F\xBC\x75\xD6\x80\x2A\x9E\x34\x82\x1B\xCB\x69\xCF\x8D\x8E\x69\xB4\x89\xC1\x68\xF3\x55\x55\x66\xD2\x56\x8D\x27\x68\x6C\x8D\x3B\x7A\xDB\x80\xD1\x7C\x36\xBF\x1A", "\xDE\x8D\xF3\x68\x70\x8E\xFA\x5A\xDC\x8D\x51\x64\x37\x89\xD8\x66\x8D\x03\x6C\x74\x8E\x27\x6A\xDD\x8D\x74\x6C\x37\xB0\xDB\x6E\x8D\x97\x88\x78\x8F\x16\x6A\xDE\x8B\x52\x74\x37\xAD\xBC\x76\x8D\x7D\x5A\x7C\x8E\xB2\x74\x6B\x6A\x6F\x9A\xF8\x73\xEB\x7D\x8D\x17\x6C\x80\x8E\x9F\x5A\xE0\x88\x2F\x84\x38\xB7\xB6\x06\x8E\xA6\x5C\x84\x8D\xDA\x85\xC0\x85\x10\x0A\x38\xBA\x0D\x84\x7F\x0E\x8E\x42\x8C\xE9\x79\xE2\x87\x68\x8B\x66\x14\x1C\xDC\x85\x17\x8E\x4C\x81\xC6\x8F\x21\x0B\x71\x8A\x08\x1D\x1C\x87\x02\x1F\x8E\x83\x01\xC8\x8D\xE1\x87\x18\x86\x49\x4E\xD1\x27\x52\xA6\x68\x94\x8E\x1A\x7A\xE5\x8D\xCE\x6C\x39\x90\xF4\x2E\x8E\xBF\x8C\x98\x8D\x5B\x62\xE6\x8B\x4C\x74\x39\x9D\xD4\x36\x8E\x09\x6C\x9C\x8F\x80\x6A\xE7\x8E\x49\x7C\x39\x8D\xDD\x3E\x8E\xF0\x6C\x9C\x5C\xD0\x8D\x80\x63\x74\x9B\xA2\x45\x1D\xF6\x5E\x47\x8F\x96\x5D\xD2\x88\xA1\x80\x23\x8B\x3A\xBB\x1B\x8C\x67\x4E\x8E\x06\x6D\xD4\x8F\xC2\x63\x75\x88\x21\xA0\xA4\x25\x76\x55\x8F\x8E\x59\xD6\x8E\x89\x82\x11\x1B\x3A\xA1\x11\xA6\x8E\x1F\x80\xAE\x66\xD7\x8B\xE1\x8B\xCC\x03\x3B\xB2\x18\x85", "\x02\x66\x8E\x36\x8B\x41\x01\xED\x80\xF6\x4C\x3B\x8C\xB1\x6E\x8E\x5D\x8E\xAC\x8E\xDC\x8A\xAF\x84\xEC\x75\xDF\x55\x09\xF7\x8E\xF4\x80\xBC\x8D\xB9\x72\xEF\x88\x21\x9C\x3B\x99\x0A\xAE\x85\x62\x85\x2A\x84\xCE\x5E\xEF\x8E\x2B\x8C\xFF\x76\x1D\xF4\x81\xED\x69\x52\x85\x21\x64\xF0\x8F\x0B\x94\x14\x83\x1E\xF9\x8E\x90\x8F\x66\x8D\xE2\x88\xF1\x8B\x78\x94\x3C\x95\xE4\x0A\x8F\x8C\x66\xC1\x8E\x98\x87\xF1\x8D\x6C\x8C\x3C\x80\x1B\xEA\x84\x2E\x85\xCD\x8E\x44\x04\x23\x5A\xAE\x64\x3D\x97\xF2\x26\x8F\x85\x8E\x83\x00\xEA\x8D\xF1\x8A\x10\x0B\x3D\x9F\x1E\x87\x02\xAE\x8F\x9F\x7D\xEC\x8E\x89\x63\x7B\x8C\xE0\x75\x1E\xA4\x78\xB7\x8E\x35\x79\xEE\x8D\x9D\x7B\x7B\x90\xE8\x7D\x1E\xBF\x8D\xBF\x8F\xBC\x89\xEB\x8C\x1E\x81\x7C\x8B\xA6\x45\x1F\xD6\x5F\xC7\x8F\x41\x61\xF2\x8B\xB1\x74\xFA\x6B\x3E\x87\x18\xAF\x73\xCE\x8F\xA6\x6D\xF4\x88\xDE\x63\x7D\x97\x24\x95\x1F\xDB\x68\xD7\x8F\x95\x69\xF6\x88\xA7\x8C\x70\x80\x00\x1B\x1F\xCC\x8E\xD6\x85\xEF\x8F\xD3\x8C\xB1\x72\x7E\x9E\x37\x84\xFE\x65\x8F\xB2\x7D\xE1\x8D\xB3\x88\xE7\x58\x7E\x9E\x73\x6D\x1F\x9D\x5A", "\xEF\x8F\xDB\x59\xFC\x8E\xD4\x53\x7F\x90\x77\x75\x1F\xE7\x8E\x00\x01\x5B\x56\xBA\x72\xFF\x87\xC9\x7C\x3F\xA9\x1E\x85\x02\xFE\x8E\xD6\x8F\x41\x01\x00\x9F\x7A\x86\x08\x04\x20\xBF\x7E\x07\x90\x27\x69\x02\x94\x81\x7B\x80\x84\xE1\x4D\x20\xEA\x78\x0F\x91\x76\x79\x04\x90\xA2\x73\x81\x9F\x35\x95\x20\xC2\x8F\x03\x90\x7A\x83\x05\x93\x99\x6B\x81\x96\x7E\x5D\x20\x83\x61\x1F\x90\xE6\x8C\x8C\x81\x04\x9F\x7C\x93\xD7\x64\x20\xCD\x6E\x27\x90\x78\x6D\x0A\x97\x92\x8B\x82\x9B\xA2\x6D\x20\xAB\x6A\x2F\x90\xEE\x8D\x0C\x51\x06\x90\x7E\x80\xF9\x74\x20\xE3\x8F\xA4\x7F\x1B\x92\xF9\x8E\x5A\x8A\x83\x89\x3F\x99\x20\xEB\x8F\x12\x03\x1E\x92\x9F\x5A\x08\x9D\xD1\x44\x42\xB7\xB6\x46\x90\xA6\x5C\x24\x90\xBC\x5A\x09\x98\x7F\x8B\x55\x57\xF2\x4E\x90\xA6\x7A\x28\x92\x00\x96\x20\x02\x85\x85\x40\x85\x04\x55\x90\x3F\x7E\x2C\x91\xC9\x72\x0B\x93\x48\x7C\x42\xA4\xF0\x5E\x90\x6A\x78\x30\x91\x3B\x7A\x0C\x90\xD1\x64\x43\xBF\x1A\xE6\x90\xF3\x68\x34\x91\x97\x8A\x21\x0A\x86\x9D\xA8\x6D\x21\x89\x6C\x6F\x90\x3D\x61\x1C\x90\x13\x63\x87\x83\xE7\x55\xE4\x75\x90\x16", "\x7C\xC6\x64\x1E\x95\x80\x6B\x87\x9B\xA2\x7D\x21\xD6\x89\x7F\x91\xDB\x65\x20\x93\xB0\x63\x88\x98\x41\xB0\x08\x85\x91\x3B\x90\x90\x7C\x22\x92\x84\x87\x88\x96\x3C\xAF\xE6\x0B\x91\x56\x8F\x2B\x92\x88\x82\x22\x00\x89\x9D\x68\x55\x22\xB7\x5B\x97\x90\x53\x5D\x26\x90\xDE\x5B\x89\x96\x79\x5D\x22\xEA\x8E\x06\x02\x3F\x50\x68\x72\x14\x9E\x44\x64\x45\x8C\xF0\x26\x91\x24\x78\x54\x92\x1A\x7A\x15\x9D\xCE\x6C\x45\x80\xD2\x2E\x91\xBF\x8C\x58\x93\x3C\x6A\x16\x9B\x4C\x74\x45\x9D\xD4\x36\x91\x09\x6C\x5C\x93\x80\x6A\x17\x95\x61\x8A\x08\x3C\x22\xCD\x6E\xBF\x90\x78\x6D\x30\x97\xEB\x53\x8C\x8C\x78\x45\x23\xC3\x8A\x21\x89\x63\x90\xF7\x8B\x99\x1A\x8C\x83\xAC\x4D\x23\xDF\x6B\xCF\x91\xCE\x8B\x43\x01\x1A\x97\x61\x74\x46\xBE\xB9\x56\x91\x5B\x88\x6C\x91\x6A\x8A\x22\x0A\x8D\x9F\x22\xBE\x22\x8E\x91\xF3\x75\x6E\x91\xB4\x82\x1C\x98\x7F\x84\x47\x88\xBF\x66\x91\x60\x5E\x74\x90\x13\x5A\x1D\x9C\x8D\x94\x07\xAC\x23\xCA\x85\xAF\x54\x75\x75\x3C\x97\x92\x73\x8F\x9F\x3F\x80\x00\x75\x91\x53\x91\x82\x00\x3E\x96\x0A\x97\x8F\x94\x07\xBB\x23\xA0\x73\xFF\x91", "\x92\x75\x40\x94\x81\x73\x90\x84\xE1\x45\x24\xEA\x78\x07\x93\x76\x79\x42\x90\xA2\x7B\x90\x9F\x35\xB8\xBC\x0D\x92\xF3\x68\x88\x93\x32\x6A\x22\x96\xFD\x54\x48\x83\xC2\x16\x92\x22\x91\x10\x88\x46\x95\x04\x94\xF8\x7B\x48\x8D\xDD\x1E\x92\xF0\x6C\x90\x93\x25\x8A\x24\x9B\x45\x64\x49\xAB\xD4\x26\x92\x32\x90\x89\x00\x4A\x95\x06\x9B\xCC\x0B\x49\x86\x22\x9A\x92\xE0\x91\x8E\x93\x24\x97\x21\x0E\x92\x92\x46\x8A\x04\x35\x92\x17\x6C\x9C\x92\x9F\x5A\x27\x9D\xD1\x5C\x49\xB7\xB6\x3E\x92\xA6\x5C\xA0\x91\xB4\x80\x47\x5A\xAE\x64\x4A\x97\xF2\x46\x92\xF6\x90\xA4\x91\x3E\x90\x00\x0A\x94\x9C\x47\x8D\x25\xBF\x7E\x4F\x92\x27\x69\x54\x94\x81\x73\x95\x84\xE1\x55\x25\xEA\x78\x57\x93\x76\x79\x56\x90\xA2\x7B\x95\x9F\x35\x9D\x25\x98\x90\x06\x03\xAF\x93\x32\x6A\x2C\x9D\x51\x64\x4B\x83\xC2\x66\x92\x7A\x60\xB4\x90\x47\x91\x84\x8A\x96\x96\x43\xAF\xE6\x6D\x92\xF0\x6C\xB8\x91\x01\x6A\x2E\x90\x58\x85\x08\x34\x25\xAB\x6A\x77\x93\xDB\x65\x5E\x95\x06\x91\x83\x5B\x4B\xAF\x24\xA0\x7E\x7E\x93\x44\x91\x5F\x91\x26\x96\x2D\x81\x4C\xBE\x20\xE1\x92\x33\x92\x85", "\x02\x61\x96\xCF\x5B\x98\x9D\x68\x4D\x26\xB7\x5B\x8F\x92\x53\x5D\x64\x90\xDE\x53\x99\x98\x3F\x8C\x03\x97\x93\x62\x85\x3E\x86\x39\x86\xE6\x5A\x99\x91\x0A\x9B\x26\xC8\x5F\x9D\x93\x03\x84\xBC\x59\x34\x91\x28\x80\x4D\x99\x26\xA2\x8F\xE6\x7E\x53\x5C\x69\x90\x33\x94\xEC\x64\x4D\xAD\xD3\x2E\x93\x85\x61\xD5\x93\x69\x96\xF1\x8B\xF6\x77\x6D\x72\x26\x94\x85\xAF\x92\x31\x87\x92\x68\x36\x95\x91\x7C\x4D\xAF\xE6\x24\x93\x38\x5E\xE0\x91\x6D\x92\x35\x93\x9B\x80\x3D\xA5\x26\xE0\x5E\xB7\x92\xE3\x90\xCE\x5B\x2D\x54\xEC\x6C\x4E\xB4\xFD\x4E\x93\x34\x85\x83\x00\x74\x96\x56\x8F\x10\x13\x4E\xA1\x1E\xD5\x93\x62\x84\xEB\x91\xAA\x82\x3B\x95\x25\x9C\x4E\xB4\x03\xDE\x93\xCD\x8C\xF0\x90\x86\x82\x3C\x9F\x77\x84\x4F\xB6\x23\xE6\x93\x4B\x93\xE5\x91\x76\x93\x3D\x9D\x9C\x90\xFC\x68\x27\xFC\x91\xED\x69\xF7\x92\xB2\x8C\xF0\x72\x9F\x85\xD9\x75\x27\x8C\x78\xF7\x92\x12\x7A\x7A\x94\x52\x89\x9F\x8A\xE3\x7D\x27\xBE\x84\x5C\x67\xFF\x90\x44\x7B\xC9\x62\xA0\x9F\x35\xB1\x27\xBA\x93\x85\x61\x02\x94\x58\x95\x20\x0A\xA0\x8B\x43\x92\x27\xEC\x93\xC6\x93\x06\x95", "\x47\x6A\x42\x99\x60\x74\x50\x83\xD8\x16\x94\xBD\x91\x54\x82\xF5\x5A\xDE\x77\xD9\x5C\x50\x8C\xD8\x1E\x94\x17\x6C\x10\x96\x9F\x5A\x44\x9D\xD1\x44\x51\x8F\xF9\x4B\x69\x26\x94\x53\x5D\x8A\x90\xDE\x5B\xA2\x96\x79\x6D\x28\xC8\x5F\x2F\x94\xB0\x5D\x8C\x94\x5B\x83\xA3\x85\xEE\x5D\xD4\x31\x94\x38\x95\xE1\x93\xC2\x89\x06\x55\xA3\x9F\x2D\x8B\x33\x3D\x94\x37\x81\x1B\x96\x8E\x90\xFF\x80\xA4\x9A\x50\x89\xD8\x45\x94\x94\x8C\x5D\x83\x91\x8E\x5A\x88\xA4\x99\x34\x81\x29\xCC\x8C\xAF\x73\x26\x96\xA7\x8A\x4A\x98\xF3\x52\x52\x96\x29\xC3\x94\x30\x94\x2C\x96\x8C\x92\x4B\x9C\xC4\x54\x52\x92\x04\x67\x52\xA9\x93\x83\x00\x98\x90\x0C\x82\xA6\x9C\x52\x9F\x29\xE6\x94\x0F\x03\x31\x97\x67\x90\xEC\x5A\xA6\x9E\x4C\xB6\xBC\x6D\x94\xA2\x92\x83\x00\x9C\x97\x38\x9C\xC4\x53\x53\xA4\x26\xF6\x94\x62\x84\x3C\x94\xA5\x82\x4F\x96\x9C\x9C\x53\x91\x27\xF2\x94\x68\x94\x2D\x76\x9F\x94\x3A\x9A\x10\x03\x54\x97\x27\x85\x95\x5A\x94\x43\x95\xAA\x82\x51\x98\x79\x8C\xEC\x4C\x2A\x84\x93\x20\x7F\x47\x95\xB3\x8A\x52\x98\x21\x94\x54\xBF\x1D\xB8\x5E\x96\x94\x7B\x91\xA6", "\x93\x29\x9B\xA9\x90\x4F\x9C\xCD\x1D\x95\xF3\x92\x6B\x84\xA8\x92\xD7\x8E\xA8\x81\x54\x8F\x19\x80\x95\x61\x94\xFC\x8F\xA8\x94\xEE\x88\xA8\x89\x55\x88\xBF\x2B\x95\x24\x78\x58\x96\x1A\x7A\x56\x9D\xCE\x74\x55\x90\xF4\x36\x95\x0E\x93\x1F\x82\x13\x6A\xB6\x70\x48\x7C\x55\xBF\x1A\xBE\x95\xF3\x68\x60\x97\x32\x6A\x58\x9D\x51\x64\x56\x83\xC2\x46\x95\x03\x6C\x64\x96\x27\x6A\x59\x9D\x74\x6C\x56\xB0\xDB\x4E\x95\x05\x68\x68\x97\x16\x6A\x5A\x96\x4D\x94\x56\xB7\xCE\x56\x95\x83\x6A\x6C\x97\x65\x5A\x5B\x99\xE5\x5C\x56\x8C\x22\xA1\x88\xDE\x94\x13\x8B\x32\x19\x5C\x9D\xD1\x44\x57\xB7\xB6\x66\x95\xB9\x86\x74\x94\xBC\x5A\x5D\x96\xF3\x4C\x57\x92\x1C\xB0\x84\xEE\x95\x8A\x8E\xAE\x91\xEC\x85\x91\x71\x57\x99\x0B\xE3\x95\x36\x94\x6A\x8F\xBC\x92\x3F\x9B\xAF\x8A\xE3\x76\x2B\xFD\x95\xED\x79\x7F\x97\x30\x87\xE7\x72\xB0\x9A\xD2\x72\x01\x79\x95\x7A\x61\x83\x97\x89\x96\xFA\x5A\xB0\x8F\x52\x83\xD8\x0D\x96\x46\x95\x87\x94\xC2\x96\x93\x60\xB1\x8A\x52\x89\xD8\x15\x96\x24\x83\x41\x60\xC6\x92\x57\x8D\x74\x7B\x58\x92\x29\x9E\x96\xA6\x94\x83\x00\xC8\x96", "\x55\x90\xF6\x43\x59\xA4\x29\xB6\x5E\x26\x97\x35\x94\x13\x59\x65\x9E\xA6\x80\x45\x85\x04\x2C\x96\x71\x94\xE4\x5C\xCC\x94\x4E\x92\x11\x13\x59\x8C\x03\xB6\x96\x90\x7E\x9C\x94\x6E\x94\x6B\x6A\xB3\x86\x4E\x8B\xD9\x3D\x96\x7F\x95\x97\x97\xC4\x95\x63\x93\xB4\x81\x3A\xB5\x2C\xC5\x96\x05\x68\xA0\x94\xA1\x97\x20\x0A\xB4\x87\x54\xB6\x14\x8F\x02\x4D\x96\xC0\x8E\x8F\x97\x68\x9B\xB0\x90\x52\xA4\xFE\x51\x96\x8D\x95\x79\x74\xD6\x91\x31\x9C\xB4\x88\x5A\xB5\x25\x80\x00\x5B\x97\x66\x8D\xD8\x90\x43\x83\xB6\x9F\x3B\xA5\x2D\xF6\x91\x67\x97\xA5\x91\xDA\x94\x1F\x98\xF3\x44\xFE\x42\xE9\x6E\x96\xE5\x74\xB8\x94\x86\x82\x6E\x9F\x77\x94\x5B\xB6\x23\xF6\x96\x4B\x92\xBC\x96\x0B\x82\x6F\x9F\xF3\x7C\x5B\xA5\xEC\x7E\x96\x0C\x78\xC0\x94\x09\x7A\x70\x9A\xC6\x64\x5C\xAD\xF3\x06\x97\x1C\x7B\x1E\x84\x44\x78\x71\x9F\x6B\x8C\x5C\xAD\xC5\x0E\x97\xEA\x5E\xC8\x97\x92\x95\xFB\x82\xB9\x96\x5A\x84\xFE\x15\x97\x03\x6C\xCC\x96\x27\x6A\x73\x9C\x60\x86\x12\x83\x2E\x80\x96\x8B\x96\xD0\x96\x81\x94\x6B\x6C\xB9\x99\x43\xAF\xE6\x25\x97\x71\x8B\x18\x50\xEA\x94\xC0", "\x8B\xCC\x0B\x5D\x96\x13\xAE\x97\x54\x8A\x2A\x84\x3D\x80\x76\x93\x58\x74\x5D\x9F\xD7\x36\x97\x0C\x6C\xDC\x97\x85\x6A\x77\x91\x89\x80\x00\x0F\xA5\x2C\x82\xA0\x73\xDF\x96\x97\x86\x05\x82\xBC\x89\xDB\x7F\x1D\xC5\x97\xFD\x76\x06\x78\xF2\x95\x98\x76\x8F\x8B\x5E\x85\x2C\xCC\x52\xA2\x97\xB6\x62\xF3\x96\x6B\x9B\x52\x73\x5E\x95\x2D\x83\x6C\xD6\x96\x87\x96\x27\x69\x7B\x91\xB1\x9B\x5E\x91\x2F\xCB\x69\xDC\x96\x8B\x94\xF6\x97\x7B\x93\x65\x8A\x08\x21\x2F\x99\x96\xE3\x97\x81\x95\xC9\x77\x7C\x9C\xB1\x9D\x94\x6C\x2F\xB1\x94\xEF\x97\x90\x96\x93\x90\x7A\x9A\xBE\x94\x57\xAF\xE6\x71\x97\x24\x96\x26\x58\xFE\x97\x64\x98\xFC\x5B\x5F\xAA\x2C\x98\x81\xFE\x97\x96\x94\xD8\x59\x80\x91\xB3\x83\x60\xA4\x2F\x96\x97\x21\x88\x02\x98\xCD\x93\x6A\x9F\x10\x0A\x60\xBE\x26\xA4\x7F\x0E\x98\x04\x94\xE3\x61\x82\x94\x9B\x8D\x60\x87\x30\xB2\x85\x16\x99\xFA\x94\x09\x7C\x82\x96\x9C\x9C\x60\x81\x2D\xBE\x97\x17\x98\xEF\x96\x06\x9A\x8D\x7E\xC1\x8B\x5A\x8A\x18\xB5\x85\x2A\x85\x5E\x85\xEC\x7A\x85\x9C\x8F\x8C\x61\xBF\xFC\x2E\x98\x25\x76\x18\x98\x03\x7A\x86\x96", "\x4A\x74\x61\xAA\xF1\x36\x98\xED\x78\x1C\x98\x44\x7A\x87\x9F\x6B\x9C\x61\xB3\xD3\x3E\x98\xCB\x68\x20\x99\xF9\x94\x54\x84\x0F\x82\x62\x89\xD8\x46\x98\x7A\x60\x24\x98\x26\x62\x89\x9E\x96\x84\xFD\x4C\x31\xA6\x97\xF3\x75\x27\x99\x01\x6A\x8A\x9B\x45\x74\x62\x96\x13\xD6\x98\xB7\x66\x2C\x9B\x60\x6A\x8B\x9F\x97\x91\x41\x5C\x31\x89\x91\xCB\x19\x2F\x9B\xB7\x95\xFB\x82\xC6\x82\x57\x8C\x0A\xF6\x91\x38\x5F\x32\x98\xBE\x82\x8D\x97\xDB\x4C\x63\xA6\xBA\x6E\x98\xF0\x5C\x38\x9A\xCD\x5A\x8E\x98\xFC\x54\x63\xAD\x05\xF3\x52\x9F\x84\x75\x74\x1E\x9C\x88\x95\xAE\x7B\x63\xA8\x0A\xD5\x84\x7E\x99\x56\x84\x20\x9F\x8C\x9B\x94\x81\x64\xA8\x30\xD2\x96\x0A\x02\x43\x9A\x1D\x9A\x91\x9A\xB8\x9F\x35\x8C\x32\xC1\x84\x24\x79\x47\x9A\xE7\x92\x8D\x72\xC9\x89\x12\xB6\x23\x95\x99\x50\x85\x41\x98\xA6\x87\x92\x94\xC8\x8C\x5B\x92\x04\x18\x99\xB2\x97\x66\x8C\x28\x99\xE9\x7F\xC1\x83\x65\xBC\x2E\x9F\x99\x9D\x98\xD0\x72\x29\x99\x84\x9D\xC4\x90\x11\xAB\x32\xA3\x98\x00\x94\xC6\x67\x2B\x98\x78\x95\xB2\x73\x65\x83\x2F\xBF\x7E\xB6\x98\xE3\x94\x1A\x98\x95\x9B\xC9", "\x85\x64\xA9\x32\xB5\x99\xBF\x98\xFB\x94\xE9\x79\x97\x99\xBC\x84\xE1\x4B\xD9\x44\x99\xCC\x97\xA5\x91\x3B\x68\x99\x9F\xBC\x85\x26\x8F\x04\x4C\x99\xD4\x97\xD8\x94\x00\x00\x9A\x97\xBD\x99\x50\x86\x04\x54\x99\xDA\x97\xA6\x6C\x36\x9D\x7B\x9A\xCD\x81\x66\x91\x32\xDE\x99\x94\x98\x70\x99\x3B\x7B\x9B\x92\xBE\x96\x66\x85\x04\x69\x52\xBD\x98\x17\x80\x3A\x99\x8F\x97\xC9\x6B\x67\xBC\x31\x98\x84\xEE\x99\x3F\x98\x3D\x81\x9E\x92\xC8\x93\x67\xA2\x33\x90\x7A\xF4\x99\x43\x99\xFD\x71\x9F\x96\xC7\x8C\x62\x7C\x33\x8D\x99\xF3\x69\x7F\x98\x24\x9A\x8D\x72\xD0\x93\x64\xAD\xF3\x05\x9A\x96\x99\xA5\x90\x42\x99\x93\x96\xCF\x89\x67\x8C\x1B\x8A\x02\x0B\x9B\x50\x98\x3C\x9F\x9E\x9F\x6B\x91\x68\xA4\x32\xEC\x82\x16\x9B\x53\x9B\x43\x01\xA3\x9C\xCA\x90\x62\xB0\x08\x9C\x9A\xB0\x99\x01\x95\x21\x60\xA4\x94\xCB\x8C\xE0\x64\x34\xB7\x99\x25\x77\x93\x9A\x2E\x99\x3D\x92\x11\x0A\x69\x85\x33\x84\x9A\x14\x9B\x80\x99\x4C\x9B\xD3\x81\x42\x8E\x69\x89\x33\x9E\x95\x8C\x66\x9B\x99\x33\x9B\x7E\x96\x10\x1A\x69\x91\x33\xAC\x92\x2D\x9B\x99\x9B\x10\x9D\xA7\x92\xD4\x9A", "\x57\x9B\x34\xC5\x9A\x03\x6C\x9F\x99\x35\x9D\xE9\x6A\xD4\x99\x66\xB0\xDB\x4D\x9A\xDC\x99\xA7\x98\x52\x9E\x93\x60\xD5\x85\x67\x9D\x2E\xF1\x84\x74\x7F\x44\x85\xB9\x72\xAB\x98\x21\x9C\x6A\xBF\x1D\xDE\x9A\xF6\x90\xB0\x9B\x52\x92\xAC\x9E\x02\x84\x6B\xBF\xFC\x66\x9A\x25\x76\xB4\x98\x03\x7A\xAD\x94\xC2\x6C\x6B\xAA\xF1\x6E\x9A\xED\x78\xB8\x99\xE2\x91\x4D\x8F\xC1\x92\x6B\xBF\x1A\xF6\x9A\x6D\x62\xBC\x9A\xFA\x5A\xAF\x93\xB9\x91\x41\x7C\x35\x88\x98\x20\x7F\xBF\x9B\x80\x6A\xB0\x9E\x49\x64\x6C\x97\x35\xF5\x84\x62\x84\xC3\x98\xBC\x6A\xB1\x99\xBA\x85\x13\x9F\x30\xCB\x6C\x8C\x9A\x02\x8E\x5F\x9B\xAA\x9D\xCA\x96\x16\x91\x36\xD6\x89\x97\x9A\x69\x99\x66\x9B\xB0\x6B\xD9\x9F\xAE\x5D\x36\x8C\x6C\x9F\x9B\x0B\x6D\x68\x9E\xCF\x53\xDA\x98\x17\xB6\x01\x0E\x9B\x6C\x83\xD3\x98\x5D\x99\xB5\x98\xDA\x8E\x5A\x86\x04\x2A\x9B\x6E\x84\xE3\x90\x6C\x98\xAB\x9F\xC1\x93\x6D\x88\x36\x94\x85\xB6\x9A\x3E\x84\xE4\x79\xB7\x90\x28\x84\x4D\xBC\x36\xA5\x9B\xB7\x5B\xDF\x98\x65\x98\xDE\x62\xDC\x8E\x68\xA5\xEC\x45\x9B\xEC\x98\x7B\x90\x72\x9F\x9D\x9F\x77\x8B\x6E", "\xB2\x33\xC0\x90\x0F\x02\xE7\x99\x3D\x9D\xD9\x82\xDD\x9A\x67\xB4\x03\xD5\x9B\x76\x98\xEC\x98\x40\x9A\xFD\x5A\xDD\x83\x68\xB1\x32\x8C\x7B\xDD\x9A\x83\x9A\x48\x9C\x71\x61\xDE\x89\x68\xBC\x23\xE5\x9B\x0C\x9A\xEA\x99\x6B\x98\x91\x9F\x36\x88\x6F\x92\x34\xCD\x9B\xEB\x9B\x2A\x86\x7B\x9F\xA2\x9E\xDA\x9C\x69\x85\x04\x73\x9B\x1A\x9B\xAF\x8F\x41\x00\xBF\x9D\xD1\x8D\x6C\x91\x37\xF1\x9B\x90\x95\x65\x18\x7F\x99\xA4\x99\xAB\x9F\x6F\xAB\x36\xF5\x9B\x9E\x8D\x01\x9D\x49\x9C\x84\x7A\xE0\x88\x69\x8C\xF0\x0D\x9C\x2B\x9B\xF3\x98\x80\x9A\xBD\x97\xE0\x8C\x6F\xAF\x36\x93\x9C\x18\x84\x9C\x5D\x98\x84\xD8\x7B\xE1\x94\xFB\x5D\x38\x9F\x98\x1F\x9C\x13\x99\x96\x81\xC2\x9F\xF3\x61\x71\x88\x38\xA6\x9C\xA9\x84\x14\x9D\x95\x82\xC5\x94\x0F\x8C\x71\x8D\x1B\xAE\x9C\x18\x84\x18\x9F\xDF\x8A\xC6\x96\x8F\x94\x71\xAC\x34\x97\x82\x36\x9C\x7E\x91\x8E\x98\x34\x7B\xE3\x8E\xA2\x7D\x38\xC2\x99\x30\x85\x1F\x9E\x31\x9D\x10\x62\xE4\x8A\xE3\x45\x39\xED\x79\x47\x9D\xB9\x99\xB0\x85\xE9\x69\xE4\x9F\x35\x8D\x39\xF7\x8A\x21\x89\x27\x9C\x4D\x98\xE4\x72\xE5\x9D\x6B\x90", "\x0A\xDD\x84\x24\x9D\x92\x8F\xA4\x82\x39\x9C\x77\x75\x72\x89\xD8\x5E\x9C\x03\x6C\x30\x9E\x27\x6A\xCC\x9C\xE4\x98\x70\x97\x2A\x92\x02\x35\x53\x03\x81\x9A\x9B\xC9\x9D\x29\x6B\x73\x9B\x39\x9F\x98\x6E\x9D\x5C\x86\x94\x91\xCE\x93\xE2\x8F\x69\xAD\xF3\x74\x9C\x58\x9C\x3B\x9C\x44\x78\xCF\x94\xE6\x8D\x73\xBC\xDD\x7C\x9C\x66\x9C\x7B\x90\xA0\x9D\xC2\x95\x25\x83\x74\xB1\x36\xF0\x9C\x7F\x9D\x44\x9F\x82\x87\x21\x06\xE8\x94\x6D\xA2\x38\x80\x00\x8D\x9D\xDB\x9A\x71\x91\xD2\x9A\xDB\x84\xF6\x54\x3A\xBD\x9B\x90\x7F\x4B\x9C\x70\x9E\x1B\x97\x10\x1A\x74\x83\x37\xF5\x8B\x68\x9C\x45\x9C\x9B\x9D\x80\x6E\xE9\x86\x6E\xAC\x2A\x9D\x9D\xA2\x9D\x37\x9F\xA3\x9D\xD4\x99\xDC\x8A\x66\x9C\xCD\x2C\x9D\xCC\x9A\x7B\x93\x92\x68\xD6\x9F\xDC\x98\x10\xAD\xD3\x34\x9D\xD3\x9A\x5B\x9D\x21\x60\xD7\x96\xDD\x90\x6E\x8A\x04\x3C\x9D\xFD\x98\x4C\x80\xB0\x9B\xBB\x9D\x51\x63\x76\x9E\x37\xFB\x9C\xA9\x9C\x39\x9E\xFC\x90\xD2\x99\xEC\x95\x73\xB7\x34\x8F\x9A\x07\x02\xC8\x52\x42\x06\x31\x5A\x10\x1A\x03\x07\xDC\x54\x9D\x07\x02\x6B\x9F\x01\x80\xDB\x96\x10\x1A\x76\xA3\x3A", "\xDB\x68\xDC\x9D\x82\x02\xB7\x9A\xD5\x98\xE0\x81\x77\x80\x00\x63\x9D\xCA\x9D\xFC\x94\x62\x52\x22\x0B\x07\x0B\x77\x8F\x04\x68\x9D\xCE\x9D\x9D\x98\x00\x06\xDC\x90\xEF\x99\x73\x8F\x3B\xCE\x68\xF4\x9C\xBE\x6D\xBE\x9F\x22\x8B\xEF\x9F\x76\xAB\xD4\x7D\x9D\xE4\x9C\x0B\x9D\x41\x00\xE0\x99\xEE\x9C\x5F\xA0\xBD\x04\x9E\xF1\x9D\x9F\x9B\x77\x68\xE1\x96\xEF\x92\x77\xB8\xBC\x0C\x9E\x7D\x9D\x02\x68\xC4\x99\xD0\x9B\x94\x93\x78\x84\x3A\xC2\x74\x16\x9F\x43\x9C\x5B\x81\xE3\x9E\xE8\x88\x70\xAD\xD3\x1C\x9E\x92\x9D\xC7\x99\x21\x60\xE4\x95\xE9\x86\x4E\xA4\x3C\x98\x9D\x94\x85\x93\x9F\xA6\x99\x5A\x8A\xF2\x9F\x74\xA0\x3B\x92\x02\xF5\x9D\x88\x9F\xCB\x9F\x21\x06\xEE\x9C\x03\x2E\x3B\x8A\x02\x59\x52\x9A\x9F\xCD\x9F\x20\x06\xEE\x9D\x79\xBB\x3C\xE2\x28\xD3\x9C\x89\x03\x1F\x07\xE7\x93\xF0\x82\x7A\x84\x3D\xF3\x9D\x30\x9F\xBB\x80\xCF\x99\xE9\x9C\x29\x93\xD7\x6D\x3C\xA6\x9D\x43\x9D\x8A\x73\xD3\x9D\xD5\x98\xD3\x8F\xCD\x66\x3B\xAB\x47\x0F\x03\xD6\x46\xCE\x9F\x21\x08\xF5\x8A\x08\x1A\x3D\xC1\x9E\x5C\x9E\x89\x03\xD7\x9B\xE9\x91\xF6\x99\x7A\x87\x3D\xDD", "\x9E\x07\x03\xB1\x9E\x41\x07\xEA\x97\xF6\x87\x7A\xB1\x3C\x94\x9E\x9E\x99\xAD\x9E\x42\x06\xE6\x92\xF7\x87\x08\x34\x3D\xE0\x9E\xD5\x9C\x3A\x7F\xD4\x99\xD6\x95\xF1\x8C\x7A\xBE\x3B\xB7\x67\x7B\x9F\x5A\x9F\xDF\x89\xF0\x99\xEB\x83\x7C\xBE\x3D\x81\x9E\x55\x84\xC2\x9D\xAF\x99\xC3\x92\xA5\x47\x7C\x85\x3C\xEB\x94\x53\x55\x77\x9F\xC1\x69\xF2\x99\xF7\x97\x08\x94\x3E\xD9\x9D\x7C\x6F\xCB\x9D\xB7\x99\xF3\x9C\xEE\x8D\x7C\x92\x3E\x96\x9F\x8E\x9F\x84\x9F\x52\x9D\x53\x6A\xF9\x82\x77\x9C\x3E\x9F\x9F\x7F\x9F\xC1\x69\xE9\x9F\xDC\x97\xFA\x95\x7C\xA9\x3E\xDF\x6B\xAB\x9F\xB7\x9F\xC5\x9D\xD9\x81\xFB\x8D\x7D\x98\x3E\x8B\x9D\x0A\x03\xDA\x9C\xE8\x98\xF5\x98\xF8\x94\x07\xBA\x3E\xAF\x9F\x59\x5D\xDF\x9D\xEF\x9D\x5C\x72\xFC\x8F\x7C\x82\x30\xBB\x8C\xB9\x9F\xD0\x9D\xC3\x9A\xE1\x90\xC6\x9E\x7C\xAE\x3E\xC3\x9F\x18\x85\xE2\x9E\xE8\x9E\xA9\x95\x40\x72\x7E\x8B\x3F\xA3\x9F\x97\x88\xEB\x9E\xCC\x9B\xA5\x6A\xFD\x90\x7B\xBF\xFC\x2B\x9F\xAB\x9F\xBB\x9F\x41\x03\xF5\x99\xF3\x89\x7E\x8F\x04\x60\x9F\xCE\x9F\xF1\x9D\xFA\x98\xE8\x9A\xFE\x8F\x08\x03\x3D\xE7\x9F", "\xEB\x9F\x82\x03\xFB\x9E\xFC\x94\xFF\x97\x7D\x80\x3F\xE3\x98\x31\x51\xEE\x9F\xEC\x9A\xD7\x9C\x38\x7A\x7F\x9A\x3C\x9E\x9E\x5C\x66\xFF\x9D\xC7\x9A\xE0\x9B\x50\x8D\x7F\x8A\x04\x68\x9E\x06\x02\xB5\x9D\x41\x03\xF5\x98\x00\xA5\x08\x0A\x40\x80\x00\x0C\xA0\xB1\x9D\xFC\x98\x00\x0D\x00\xA0\x00\x0F\x40\x91\xA0\x66\x9E\xF8\x9D\xD9\x9D\xFE\x96\x10\x15\x80\x82\x40\xA1\x9E\x8F\x9C\x9C\x5D\xF8\x9B\x02\xA2\xFE\x86\x08\x1F\x40\xA5\x9E\x1F\x98\x11\xA2\xF2\x9B\xFB\x97\x3B\x67\x81\xA8\x3C\xC6\x93\x2E\xA1\x95\x9E\xCD\x59\x06\xAE\xF2\x9C\x7E\xAB\x40\xDE\x9F\x25\x76\x1A\xA0\xD4\x99\x8E\x72\x11\x0F\x1D\x4F\x04\x11\x54\x0F\x03\xBA\x53\x01\x82\x08\xA7\xFF\x9F\x59\x44\x41\xD0\x9F\x7F\x8F\x23\xA2\xF1\x9D\x80\x9C\xC4\x4A\x82\x93\x3F\xD1\x9A\x05\x68\x27\xA3\xF5\x9C\xFA\x9B\x45\x72\x82\xAC\x40\xFD\x5A\x56\xA0\x1C\xA0\x03\x79\x0B\xAB\xFF\x89\x82\xBC\xDD\x5C\xA0\xFF\x9E\x02\xA0\x18\xA3\x00\xA5\x25\x83\x83\xA0\x40\x88\x9C\x66\xA0\x14\xA1\x08\xA2\x22\x09\x06\xAF\x81\x9F\x30\xED\xA0\x32\xA0\xE4\x5C\x1C\xA5\x06\xAD\xF2\x53\x83\xBB\x40\xD4\x69\x76", "\xA0\xAA\x9D\xA8\x95\xFB\x89\x07\xBC\x7B\x95\x3D\xF3\x75\x7D\xA0\xC1\x9E\x3D\x91\x10\xA5\xF8\x83\x84\xB4\xF9\x04\xA1\x8B\x9E\x2F\xA3\x45\x80\x11\xA1\xEC\x9F\x2D\xB1\xA0\x0C\xA1\xC4\x9C\xC0\x9B\x32\x18\x12\xA7\xEC\x83\x5D\x95\xE4\x14\xA1\xE2\x9A\x4B\xA3\x6B\x70\x13\xA6\xDE\x90\x76\x86\x04\x1C\xA1\xE9\x9A\xC6\x9D\x10\xA7\x0B\xA4\x0A\xAB\x84\xA5\x42\xC5\xA0\x1D\x5A\x50\xA3\x7B\x9B\x97\x9F\x10\x06\x04\x12\x04\x2E\xA1\xAD\xA1\x57\xA2\x2C\xA1\x16\xA4\x0B\xAA\x08\x30\x42\xB6\xA1\xB3\xA0\x5C\xA1\x2D\xA7\x20\x07\x0B\xBC\x85\xB9\x42\xBE\xA1\x0F\x03\xBB\x53\x01\x82\x18\xA8\x0A\xA1\x86\xBC\xDD\x44\xA1\x48\xA0\x7B\x90\x32\xA3\x09\xAB\xC0\x8A\x08\x0B\x43\xCF\xA0\x56\x9A\x78\x6F\x33\xA3\x0A\xA0\x05\xAC\x78\x53\x43\xD7\xA0\xDF\x6B\x6B\xA2\x16\xA4\x84\x7A\x0D\xBD\x82\x8A\x43\xC7\xA1\xE0\xA1\x8B\x81\x37\xA1\x0C\xAA\x79\x86\x86\xA2\x43\xE1\xA1\xC5\xA0\x67\xA3\xC1\x6B\x1C\xA4\x06\xB0\x54\xB1\xA0\x6C\xA1\x67\xA0\x02\xA3\x92\x68\x1E\xAA\x06\xA8\x70\xB4\x43\xEE\xA0\x8F\x9D\x7B\xA1\x1C\xA5\x2D\x8A\x0F\xB4\x83\x83\xD6\x7D\xA1\x77\xA0", "\x88\x78\x40\xA2\x0F\xA4\xAA\x84\xFD\x43\x44\xFE\xA0\x7B\xA1\x65\x1B\x41\xA2\x10\xAE\xEA\x95\xC8\x4B\x44\x85\xA1\x0D\xA3\xD7\x73\x43\xA1\x11\xAC\x0A\xAA\x87\xB8\x3E\x87\x02\x13\xA3\x46\xA2\x45\xA1\x1D\xA0\xEF\x59\x88\x91\x42\x83\x6C\x1E\xA3\x4A\xA3\x3C\x69\x24\xA9\x09\xA3\x89\xB4\xF9\x08\x01\x12\x03\x44\x01\x0F\xA1\x25\xA2\x11\x00\x82\x9C\x71\x70\x11\x0F\x03\xF0\x44\x36\xA1\xCB\x52\x13\xBB\x86\xA7\xD0\x35\xA2\xDE\xA1\xA5\x90\x4E\xA4\x1C\xA4\x0F\x9B\x89\xAD\x43\xCD\x8D\x3E\xA3\x78\xA1\x95\x81\x28\xA5\x0F\xA9\x15\x84\x45\xF8\xA1\x08\x9D\xA3\xA3\x3E\xA4\x89\x5A\x14\xBE\x87\x9F\xD7\x4D\xA2\x01\xA3\x5F\x8C\x54\xA4\x20\xAC\xC0\x73\x8A\x88\x44\xA5\x76\x56\xA2\x86\xA1\xDC\x9A\x21\x09\x15\xB0\x88\xBC\x23\xDD\xA2\x14\xA2\x9D\xA3\xC1\x68\x2C\xA6\xC7\x84\x8B\x9F\x44\xEB\x92\xDD\x8E\xB3\xA2\x48\xA3\xCA\x9B\xCC\x0A\x8B\xA5\x44\xCB\x69\x6E\xA3\x4E\xA0\x56\xA4\xCE\x71\x17\xA1\x85\xBF\x1D\xF5\xA2\xAB\xA0\xB1\xA1\xD3\x98\x46\x88\x17\xB4\x6F\xB2\x43\x85\x61\x7D\xA3\xFC\x9B\x8E\x92\x22\x01\x18\xBD\x6F\xAC\x2E\x84\xA3\x74\xA3\xC4", "\xA3\x45\x85\x30\xA4\xE0\x93\xA7\x4C\x46\x8B\x9C\x6A\x79\xC7\xA2\x83\x9C\x84\x72\x19\xB9\x72\x95\x45\xF4\x7C\x13\x55\x87\x02\x67\x57\x00\x8B\x19\xBC\x88\x86\x04\x1D\xA3\xC9\xA1\xA5\x90\x68\xA4\x19\xA4\x9A\x83\x8D\x90\x43\xE8\x97\x9E\x68\xD3\xA0\x35\xA1\x1A\xA5\x40\x6A\x8D\xB3\x44\xE6\x5C\xAE\xA2\x9B\xA1\x3B\x79\x36\xA9\x13\xBC\x47\xB4\x46\xBC\xA2\xCD\x8D\xDB\xA3\x4F\xA0\x43\x8A\x1B\xA2\x8A\xB4\x03\xBD\xA3\x45\xA3\x2A\x84\x70\xA0\x29\xA4\x00\xB8\x79\x43\x47\xCB\xA2\x12\x03\xE3\xA2\x53\xA4\xC1\x6A\x1C\xB1\x8A\xAD\xC5\x4D\xA3\x54\xA2\x53\x68\x74\xA7\x2A\xA0\xE4\x81\x21\x93\x47\xDA\xA2\x09\xA3\xE4\xA0\xDF\x6F\x3A\xAE\x15\xBF\xF9\x5C\x47\xE1\xA2\x5B\xA3\x83\x03\x77\xA2\x23\xA2\x1E\xBB\x8E\x8A\x3D\x9F\xA3\x57\x9D\xF1\xA3\x59\xA5\xB2\x9D\x7D\x8A\x8F\xAB\x45\x93\x97\xCB\x18\xF7\xA3\x5B\xA3\xA8\x9D\x99\x54\xF3\x72\x47\xF2\xA2\x0C\x79\xFB\xA2\x5D\xA6\x1E\x9A\x1F\xB9\x8B\xB6\x46\xE6\xA3\x17\x83\xFE\xA2\x5F\xA5\x1C\xAA\x10\x0E\x04\x12\x04\x0F\x01\x12\x02\x48\x02\x44\x07\x44\x5A\x10\x1D\x08\x47\x00\x8E\xA4\x9E\xA3\x82\x00", "\x84\xA1\x34\xAC\x8F\x93\x90\xA4\x46\xE2\x84\x16\xA5\xD3\xA1\xFB\x95\x80\x69\x21\xAB\x8D\xA8\x46\xCD\x6E\x1D\xA5\xD7\xA3\xCF\x51\x44\xA2\x1B\xB0\xE8\x64\x48\xB5\xA3\x3F\x7F\x13\xA4\x6E\xA0\x43\x8A\x22\xBB\x8D\xBF\x1D\xAD\xA4\xBE\xA3\x66\x8C\x8C\xA1\x38\xA4\x0F\x93\x91\x84\x47\x84\xA4\x07\x02\x1B\xA4\x72\xA7\x21\x0A\x23\xAB\x8E\x97\xD8\x3D\xA4\xCE\xA2\xF5\x5C\x90\xA1\x3A\xA7\x42\x63\x92\x94\x47\xD1\x9E\x8C\x7A\x23\xA4\x76\xA5\x20\xA4\xF8\x6A\x92\x9D\x47\xA5\x76\x4E\xA4\xF0\xA1\x8A\xA4\xCE\x71\x25\xA4\x8F\x86\x04\x55\xA4\xEB\xA2\x78\x6C\x96\xA7\x3D\xA0\xD8\x91\x41\x5B\x49\xF3\xA3\x92\xA0\x89\x03\x97\xA0\x3F\xA8\x24\xA4\xFD\x63\x49\xFB\xA3\x11\xA3\x79\x77\x99\xA6\x3F\xAE\x09\xB2\x90\x94\x49\xFC\x6E\x6B\xA5\x01\xA5\x8D\xA0\x4E\xA4\x27\xB7\x08\xB1\x49\x82\xA3\xF8\x8F\x14\x57\x01\x82\x4F\xA1\x21\xA0\x00\x3C\x49\x94\xA4\x3F\x7F\x3F\xA7\x85\xA4\x52\x82\x28\xBA\x90\x92\x29\x85\xA5\x1E\xA5\x0D\xA7\x16\x68\x51\xA2\x22\xB2\x08\x0C\x4A\xA5\xA4\xBF\x8D\x47\xA4\x8A\xA5\x64\x72\x29\xAB\x91\xBF\x1D\x95\xA5\x2E\xA4\x7B\x90\xA6", "\xA1\x46\xA8\x21\x9B\x94\xB4\x48\xCD\x8D\x9E\xA5\x1B\xA4\xD7\x96\x20\x01\x2A\xBB\x91\x8A\x04\x25\xA5\x3E\xA4\x3F\x5C\xAA\xA1\x48\xA6\xFD\x4B\x95\x84\x49\xD4\x69\xAE\xA5\x23\xA7\x5C\x8D\x22\x71\x2B\xAB\x92\x95\x47\xA0\x7E\xB5\xA5\x27\xA4\x03\x79\x57\xA2\x25\xB4\x94\xB4\xF9\x3C\xA5\x56\xA5\x82\x00\xB0\xA1\x4B\xA5\x40\x63\x96\x9C\x49\x99\x92\xDD\x8E\x63\xA4\x98\xA0\x59\xAB\xCC\x0A\x96\xA4\x49\xB3\xA5\x8C\x7A\x67\xA4\x9A\xA7\x0F\xA4\xF8\x72\x96\xAC\x49\xDA\x9C\xA4\xA5\x5F\xA4\xDF\x6E\x5A\xA2\x27\xA0\x95\x9B\x4B\xDF\xA5\x17\x82\x6E\xA4\x9E\xA6\x65\x90\x00\x03\x51\x4A\x04\x75\x41\x0F\x03\x04\x56\x42\x02\x90\x3D\xDA\x32\x80\x99\x40\xDE\x9E\xEE\xA4\x78\xA7\x43\x03\x45\x57\x00\x94\x97\xBD\x49\xF6\xA5\x80\xA5\x92\x74\xBE\xA3\x50\xA6\x9C\x9B\x97\x86\x4A\xCB\x9D\xFE\xA5\x44\xA6\x94\x91\x60\xAD\x28\xB3\x97\xBC\xDD\x04\xA6\x90\xA5\x79\x68\xC2\xA3\x52\xAC\xC0\x6B\x98\x96\x4A\xF6\x91\x0E\xA7\x4C\xA7\x52\x91\x62\xAC\x29\xBF\x3B\x94\x4C\x9F\xA5\xA2\xA0\x85\x03\xC5\xA2\x54\xAD\x6C\x9B\x98\xA6\x4A\x87\x02\x1E\xA7\x54\xA6\x44\x01", "\x64\xAC\x2A\xA3\x84\x64\x4C\xAF\xA5\xE3\x9A\xC6\x7B\xC9\xA2\x56\xAF\xDD\x93\xD7\x6B\x4C\xB6\xA5\x24\x79\x97\xA6\xAE\xA1\x66\xA4\xE7\x72\x99\xBD\x4A\x8D\xA6\x07\xA7\xF3\xA1\x41\x06\x66\xA1\x2C\xA5\x80\x86\x04\x3C\xA6\xC4\xA4\xC9\x9B\xC8\xA7\xCA\x90\x34\xA7\x96\xA6\x33\x80\x00\x45\xA7\x65\xA7\xD1\xA1\x69\xAF\x2C\xAD\xE7\x4C\x4D\xD3\xA5\x3F\x7F\xA7\xA7\xB5\xA0\x67\xA7\x11\x92\x9A\x9D\x4B\x98\x84\x56\xA7\x71\xA5\x5B\x82\x46\x5D\x27\xBC\x9A\xB9\x4B\x83\x69\x5E\xA6\x7E\xA7\x07\x99\x6C\xAF\x2F\xAA\x77\x8F\x04\x64\xA6\x02\xA7\x65\x9C\xDA\xA5\x60\xA6\xEA\x4B\x9B\x89\x4C\xEA\x5F\x6E\xA6\x86\xA4\x09\x79\x6E\xAF\x30\xAB\x4A\xB4\x4D\x92\xA6\xFC\x91\xBB\xA5\xC5\xA6\x1E\x9A\x37\xB8\x98\xBF\x1D\xFD\xA6\x1C\xA6\x0C\x84\xE0\xA7\x63\xA7\xC2\x83\x9C\xA2\x4C\xB7\x5B\x86\xA7\x92\xA7\x80\x69\x71\xA8\x32\xB2\xAD\x4C\x4E\xAC\xA6\x80\x69\xC7\xA4\xCC\xA0\x5A\xA4\xFA\x72\x9C\xB3\x4C\x94\xA7\x84\x7E\xCB\xA7\xCD\xA3\x6E\xAC\x77\x7A\x9C\xBD\x4C\xB8\x5E\x9E\xA7\xA0\xA7\x4A\x69\x74\xA6\x34\xAD\xBA\x64\x4E\xCA\xA6\xEC\xA3\x18\x53\xE9\xA5\x69", "\xA9\x32\xB3\xD7\x6B\x4E\xD0\xA6\x4C\xA5\x10\x8B\xEB\xA3\x6A\xA5\x26\xB9\x9C\xB4\xF9\x33\xA7\x57\xA7\x33\x9F\xD9\xA5\x73\xAC\x3B\xB7\x08\xB8\x4E\xDA\xA6\x4C\x59\xDF\xA6\x61\xA3\x74\xA4\xE7\x72\xD9\x1F\x4D\xA6\x69\xC6\xA6\xB1\xA4\x5B\x81\x79\xA5\x36\xA6\x78\x8C\xB1\x4C\xA7\x69\xA6\xB3\xA6\x42\x00\x7A\xAC\x36\xB0\x77\x54\x4F\xEF\xA6\x1D\x6B\xEB\xA6\xDC\xA7\x84\x6A\x3D\xB5\x9B\xBC\x23\xDD\xA7\x78\xA7\x9F\x7C\xF8\xA3\x6F\xAB\x94\x83\x9F\xBE\x4D\xF6\x91\xE6\xA7\xC0\xA7\xDF\x89\x7D\xA4\x38\xA5\x08\x2C\x4F\x87\xA7\xB9\x87\xF7\xA6\xE2\xA6\x93\x62\x3F\xAD\x9C\xB3\xD3\x75\xA7\x90\xA6\xD9\x68\xFE\xA3\x72\xA4\x4D\x7B\x9F\x97\x4E\xAD\xA6\x30\x84\xFF\xA7\xE6\xA0\x73\xA6\x2D\x82\xA0\xBD\x4C\x86\xA8\xA2\xA7\xDB\x64\x02\xAD\x74\xA6\xB4\x8F\x08\x0B\x50\xA8\xA7\xF0\x6D\x07\xA8\xEB\xA7\xD7\x82\x41\xB0\x9D\xB7\x4A\xB1\x50\x15\xA8\xDA\xA4\x01\xA8\xE4\x79\x41\xB9\x9D\xB2\x3A\xDC\x66\x1D\xA8\xE0\xA6\x6E\x8E\x81\xA5\x3C\xA5\xA1\x97\x04\xA1\xA8\xC3\xA6\x05\xA8\xDF\x68\x85\xAD\x18\xAB\xA6\x6C\x50\x90\xA3\xED\x79\x17\xAB\x64\xA4\x07\xAF", "\x10\x1B\x55\x47\x4F\xA7\x68\x36\xA8\xE5\xA6\x8A\x81\x87\xAD\x3C\xBF\x5F\xB5\x50\xFC\x6E\x3C\xA9\xE8\xA6\xF3\xA6\x3F\x50\x44\xA7\xB8\x41\x51\xD5\xA7\x36\x5F\x23\xA8\xF6\xA1\xC1\x6A\x44\xBB\x9E\xAD\xF3\x4D\xA8\xDE\xA7\x9F\x7C\x14\xA9\x7C\xA5\xB2\x73\xA2\xA4\x4F\xFC\x91\x56\xA9\xF3\xA7\x8D\x9A\x21\x09\x45\xAA\x9F\xB6\x23\xDD\xA8\xED\xA6\x00\x00\x18\xA8\x7E\xA7\x10\x03\xA3\xB3\x4F\xA5\x63\x66\xA8\xFB\xA7\x94\x99\x06\x59\x46\xB9\x9F\x90\x39\xA0\x7E\x6D\xA8\xFE\xA4\x44\x79\x8E\xAF\x3F\xB3\xA3\xB4\xF9\x74\xA8\x03\xA9\x27\xA9\x11\xAB\x2F\xA1\x42\x98\xA3\xBD\x4C\xCB\x6C\x7E\xA9\x04\xA8\x5F\x94\x88\xAC\x47\xB0\xA3\xB7\x51\x87\xA9\x17\x83\x40\xA8\x03\xAD\x80\x6A\x48\xB0\xA0\x8C\x52\xFB\xA8\x7D\xA4\x26\x59\x23\xAB\x82\xAB\xA0\x80\x00\x27\x6C\x0F\x02\x03\x54\xDE\x9E\x0E\xA9\x55\x82\xFB\x91\xA2\x8E\xD1\x1D\xA9\x54\xA8\x06\x78\x28\xAF\x8A\xAF\xF3\x63\xA5\x9A\x51\xFC\x91\xED\x9C\x4D\xA9\x0F\xAF\xF8\x97\x03\xAE\xA2\x80\xD2\x26\xA9\x5E\xA9\xA5\x90\x2C\xA9\x8C\xA3\x4B\xA4\xA3\xB6\xBC\x35\xA9\x67\xA8\x78\x6C\x2E\xAA\x8D\xAD\x51", "\x7B\xA5\xAE\x51\xCB\x69\xBE\xA8\x39\xA9\x81\x9F\xF9\x9B\x49\xB5\x12\x81\x53\xF5\xA8\xBF\x8D\x63\xA9\x1E\xAF\x95\xA7\x70\x6A\xA6\xBF\x51\xDC\x66\xCE\xA8\x41\xAB\x5F\x93\x99\x11\x4D\xAB\xA4\x9B\xD1\x55\xA9\x8E\xA9\x6B\xA8\x9D\x78\x9B\xA4\x49\xA0\xA6\xBC\xDD\x25\xA0\x58\x53\x7E\x16\xD1\x9E\xFD\x9D\x4A\xBE\xA4\x97\x50\xE5\xA9\xA1\xA9\xDA\xA6\xB5\x84\x9B\xA6\x41\xAA\xA7\x9D\x1F\xEC\xA9\x1A\xA8\x00\xAA\xB5\x85\x02\xAF\x00\xB4\xA7\x92\x04\x76\xA9\x1B\xA1\xB4\x9F\x3D\xA9\x5E\xA7\x10\x15\x80\x95\x40\xF0\xA9\x1E\xA9\x2D\xAA\xDD\x9A\x22\x00\x4E\xAC\x7D\x97\x44\x9B\x9F\x17\x82\x80\xAA\x08\xAA\x95\xA2\x44\xBE\xA1\x84\x53\xAB\xA9\x4C\xA0\x74\xA8\x29\xAD\x64\x7A\x50\xA9\xA1\x95\x14\x85\x02\x0D\x55\x3E\xA5\x46\xAF\x86\xA4\x4D\x7B\xA8\x85\x53\xF4\x81\x1E\xAA\x88\xA9\x33\xA7\x20\x01\x52\xAD\xA8\xAC\x52\x8F\x02\x25\xAA\x24\xA8\xF2\x59\xA5\xAB\x44\xBA\x83\x6C\x54\xAE\xA9\xBF\x8D\x97\xAA\x39\xAC\x84\x72\x53\xA9\xA7\xAA\xF1\x35\xAA\x13\xAA\x06\x78\x4E\xAF\x94\xAF\xF3\x7B\xA9\xB1\x52\xFC\x91\x3E\xAB\x30\xA8\xCE\x59\xA8\xA6\x4B\xAB", "\xA9\xBC\xDD\x44\xAA\xB9\xA9\xAF\x5C\x52\xAC\x97\xA3\x08\x6B\xAA\xBF\x52\xD6\x9C\x28\xAB\x2B\x9E\x53\xAA\x98\xA3\x4F\x73\xAA\x88\x53\xD5\xAA\x74\x7C\xAB\xAB\x32\xA9\xA6\xA7\x54\xBA\x99\x80\x00\x5A\xAA\xCF\xA8\xC6\x64\x58\xAA\x9A\xA2\x98\x92\x08\x23\x55\xD6\xA9\xC8\x90\x90\x7F\x59\xA9\x9B\xA6\x4D\x8B\xAB\x9D\x53\xF4\xA3\x5F\xAB\xAE\xAB\x45\x86\xAD\xAD\x4E\xB7\xA9\xB2\x55\x91\xA9\x66\xAA\x3A\x7D\xC7\x32\xA4\xAC\x0C\x9B\xAB\xA6\x54\x85\x98\x7E\xAA\x95\xA8\xD8\x59\xB0\xAD\x52\xBE\xA4\x44\x56\xB0\xAA\xF3\x69\xC3\xAB\x4C\xAA\x8D\x7A\x58\xB6\xA9\x94\xD3\x0D\xAB\x39\xAA\x12\x78\x64\xAC\xA7\xA5\xB2\x73\xAC\xBF\x54\xBF\x7E\x96\xAB\x30\xA9\x66\xAD\xA8\xA3\x58\xBC\xBB\x5B\x56\xC9\xAA\x5F\x97\xCF\xA8\x53\xAB\xC0\x62\x5A\xAF\xAA\x89\xD8\x25\xAB\x54\xAA\xF5\x5C\x6A\xAF\xAA\xAA\x5A\xBE\xAA\xAB\x56\xDB\xAA\x6F\xA9\x65\x1B\x6B\xAD\x67\xA3\x5B\xA4\xAB\x97\xD8\x35\xAB\x68\xAA\x69\x98\x6E\xAC\xAD\xA7\x3B\x7B\xAD\xAF\x55\xA7\xAB\xAE\xAB\x2B\x9E\x6F\xAD\xAE\xA2\x4F\xBD\x3E\x83\x57\xF1\xA9\xAD\xA6\xC2\x7F\x71\xA9\xA0\xA1\x1E\xAB\xD8", "\x3A\x55\x9E\xAB\xD0\xAB\x8B\x83\x72\xAB\xA1\xAA\x10\x13\xAE\x96\x54\xDF\x6B\xD6\xAB\x16\xA8\x5C\xAD\x4A\x57\x00\x9C\xAE\xBD\x49\xDE\xAB\x1C\xAA\x88\x78\x78\xAF\xA3\xAD\x6C\x83\xAF\xBC\x55\xE2\x84\xE6\xAB\xBF\xAB\x48\xAE\x20\x09\x5E\xA2\xAC\xAD\x57\x85\xAB\x4D\x6F\xF7\xA8\x62\xAB\x99\x62\x5F\xAB\xAC\xAD\xF3\x75\xAB\x8E\xAA\xF1\xA8\xDF\x68\xBF\xA1\x59\xAA\xE3\x7C\x57\x94\xAB\xA7\x9C\xF6\xAB\x7E\xAB\xC0\xAD\x5D\xA7\xB8\x7F\x57\x97\xAB\xB1\xA7\xEE\x8F\x81\xA9\x8C\xAB\x64\x6B\xB0\x9C\x56\xCC\x58\x0E\xAC\xD0\xAB\x4A\x69\xC2\xA3\x5A\xA7\x9A\x94\x58\xA6\xAB\x03\x6D\x0B\xAD\x6A\xAD\xA3\x6A\x61\xAC\xAD\x90\x55\x8A\x02\x1D\xAC\xD8\xA8\x5B\xA2\x22\x01\x62\xA1\xAB\x8C\xF6\x25\xAC\xB6\xAA\x33\x9B\x43\x00\xC5\xA9\x5B\xB7\xA8\x80\x00\x2C\xAC\xBC\xAA\x17\xAC\x8C\xAF\xB7\xA9\x61\xA4\xB0\xB8\x55\xAB\xAC\x36\xAD\xF0\xAB\xAF\x8B\xC6\xA4\x5C\xAA\x72\x98\x83\x0A\x02\x98\x55\x87\x03\xA4\x57\x21\x0B\x6B\x5A\xB1\xAD\xC5\x45\xAC\xE4\xAA\x75\x74\x92\xAF\xBC\xA4\x29\x8B\xB2\xAA\x57\xA4\x93\x4E\xAC\xC1\xA8\x13\x59\xCA\xA0\x5F\xB0\xB7\x54", "\x59\xF3\xAB\xD6\x5F\x2B\xAE\x7D\xA8\xA2\x7A\x65\xB9\xAF\xBF\x1A\xDD\xAC\xFD\xAB\x76\x78\x98\xA8\xC0\xA4\xC2\x63\xB3\x88\x58\x8C\x78\x66\xAD\x30\xA9\x9A\xAF\xC1\xA8\x09\x8B\xB3\x92\x58\xB7\x67\x6E\xAD\x0A\xAD\xD3\x69\xCE\xA8\x61\xB8\x84\x74\x59\x9B\xAC\x83\x61\x3B\xAE\x87\xAD\x4B\xA2\x11\x1A\xB3\xA2\x58\xF0\xA3\x7D\xAC\xBE\x6E\x9F\xAD\x67\xA3\x68\xA9\xB1\xB8\x0B\x85\xAD\x2D\xAD\xEF\x68\xA2\xA9\xC6\xAA\x68\xBE\xAA\x8B\x5A\xB4\xAC\x68\xA3\x65\x1B\xA3\xAD\xC7\xAA\x09\xA4\xFD\x53\x5A\xC8\xAB\x95\xAC\xC2\x7F\xA5\xAC\xB9\xAD\x26\xA2\x36\x47\x54\x9A\x4D\x82\xAD\x50\xAF\x45\x83\xD3\xA4\x5D\xA7\x08\x24\x5A\xD7\xAB\x0C\x6D\x53\xAE\x76\xAE\xA8\x9A\x10\x16\x54\x53\xA7\x12\x02\xD6\x53\x57\xAF\x43\x01\x3E\x5F\x10\x11\xB5\x8A\x04\x34\xAD\x0A\x02\xFA\x51\xAD\xAA\x22\x0A\x6B\xAA\x08\x2F\xA7\x3B\xAD\x0F\x03\x5F\xAE\x42\x04\x15\x02\x11\x0D\x05\x12\x04\x17\x54\x0F\x03\x0C\x57\x43\x00\x0A\x4F\x10\x15\x50\x4F\x04\x29\x53\x0F\x03\x59\x03\xC1\x6A\xDA\xA7\x00\x94\xB6\xB7\x58\x8A\x02\xD6\xAC\x23\xAF\x32\x69\xDB\xA9\x64\xBF\x3B\x9C\x5B", "\xCC\xAC\xC6\x93\x6F\xAF\x93\xA8\xF2\x72\x6E\xB2\xB2\x92\x04\x65\xAD\x55\xAD\x02\x68\xBA\xA8\xCB\xA9\x60\x6B\xB7\x9B\x59\xBF\x8D\xEE\xAC\x2F\xAF\x3C\x69\xDE\xA1\x66\xB0\xE8\x74\x5B\xE4\xAC\x34\xA8\x6C\xAC\xDF\x6F\xDE\xA7\x66\xA4\xE1\x7C\x5B\xFB\xA1\xFF\xAC\xCE\xA9\xC0\xAF\xCD\xA3\x48\xB1\xB6\x97\x39\x83\xAE\x72\xAC\x78\x6C\xC2\xAD\xCE\xAD\x74\x6B\xB8\xB8\x59\x98\x98\xFA\xAD\x8B\x82\xC3\xAB\xCF\xA3\x60\x73\xB8\xBF\x59\xFC\xAC\x06\xAF\x42\xAB\x32\x1E\xE2\xA6\x62\xA4\xFD\x5C\x5C\x86\xAD\xDB\x91\x8C\xAF\xB5\xAF\x6D\x8F\x71\xA9\xB4\xB6\x24\x87\x02\x25\xAE\x46\xAC\x83\x69\xE5\xA0\x69\xAD\xB8\xBB\x5B\xAF\xAE\x12\xAE\x3A\x7F\x69\x51\xFE\x6F\x10\x13\xB9\x9F\xE2\x7F\x37\x00\x00\x9B\xAE\x22\x77\x7E\x39\x73\xB8\xC3\x5D\xE1\x0F\x02\x5F\x71\x9E\xAD\x18\x74\xFF\x6E\x85\x72\x08\x3A\x5C\x8E\x71\x8B\x71\xEE\x8F\xD1\xA9\x12\x72\x86\x76\x16\x8B\x5D\x97\x70\x10\x71\xA7\xAF\x04\x76\xE8\xAE\x73\xB3\xD3\x12\x5D\x9B\x70\x54\xAF\xA1\xAE\x41\x04\x03\x77\x75\xBD\x30\x59\x5D\x9B\x71\x05\x03\x3E\x72\xD0\xA8\xEC\xA6\x84\x61\xC4\x5F\x5D\xB7", "\xAE\x48\x3B\x9A\xAD\xD5\xA9\xE9\xA1\x83\x5D\xBA\x89\x5D\xCB\x19\x6E\xAE\x1C\x72\x42\x01\xEE\xA5\x10\x1D\xC4\x46\x04\x74\xAE\x98\x70\xAE\x64\xDE\xA9\x13\x7A\x76\xBA\xBA\xB5\x5D\xE6\xAE\x7D\xAE\xB2\xAF\xE9\x10\xEF\xAE\x84\x6A\x08\x39\xA5\x50\x70\x06\x03\xC3\xAC\xD9\xA8\x4D\x1A\x78\xA8\xBB\x8C\x5E\xEB\xAE\x02\x71\xA2\xAF\x43\x05\xF1\xAB\x73\xA5\x08\x03\xE0\x13\xAF\x90\xAF\x21\x71\x45\x74\xF2\xA8\x74\xA5\x44\x0C\xCE\x1C\xAF\x4C\xAF\x83\x00\x04\x70\xF4\xA7\x81\x6E\xC3\x49\x5E\x99\xAF\x18\x70\xD2\xAF\x07\x76\xF0\xA8\x7A\xBC\xC0\x6A\x5E\xA2\x70\x12\x03\xD7\xAE\x42\x02\xEC\xA2\x7B\xA0\xC4\x4F\x04\x1F\x50\xB5\xAF\xD8\x08\xE6\xAE\xEF\xA9\x77\xBB\xBC\xA8\x5E\xFC\xAE\xAC\xAE\xDE\xAF\x3B\x19\xF7\xAF\x77\xB7\xBD\xB1\x5E\xBF\xAF\x5C\x66\xE2\xAD\xEF\xAF\x35\x7A\x7C\xB6\xBB\x85\x04\x4A\xAF\xA7\x16\xE5\xAD\xE1\xAF\x20\x06\x6B\xA7\x08\x3B\xA5\x0F\x02\xB7\x00\x89\x01\xF6\xA8\xFB\xAA\x7D\xBD\xBE\x9C\x5F\xDF\xAF\x0A\x03\xED\xAD\xF8\xAE\xFB\xA3\x7E\xA0\xBF\x87\x04\x62\xAF\xE7\xAE\xF2\xAD\xFA\xAF\x21\x08\x0B\x10\xB5\x92\x04\x6D\xAF", "\x0F\x02\xCC\x50\xB0\xAA\x21\x02\x7F\xAA\x08\x3A\x02\x12\x02\xA3\x52\x85\x01\xFE\xAF\x20\x0D\xA4\x53\xBF\xBC\x5F\x92\x02\x4B\x54\xFF\xAE\x41\x01\x00\xBA\x10\x04\x07\x4F\x04\x06\xB0\x05\xB0\x89\x00\x02\xB7\x20\x0B\x80\xA6\x08\x0D\x60\x85\x02\x0F\xB0\x00\x01\x04\xB3\x02\xBA\x80\xB5\xC0\x87\x60\x96\xB0\x09\xB1\x0B\xB3\x43\x07\x17\x02\x11\x17\xBF\x9B\x60\xF8\xAF\x12\x02\x0E\xB3\x43\x03\xFF\xA0\x23\x8B\x66\x31\xA0\x26\xB0\x85\x60\x60\x02\x44\x01\x18\x02\x11\x02\x06\x2D\x60\xAF\xB0\x0F\x02\x17\xB1\x0C\xB0\x06\xBA\x10\x12\xC1\xB5\x60\xB4\xB0\x07\x02\x1B\xB1\x0E\xB0\x07\xB6\x10\x1A\xC1\xBD\x60\xBC\xB0\x05\x02\x1F\xB1\x41\x03\x18\x07\x70\x64\xC2\x87\x00\xC6\xB0\x23\xAE\x83\x00\x12\xB2\xDB\xAD\x51\x6B\xC2\x9D\x5B\xF6\x91\x4E\xB0\x70\xAF\x07\x99\x0A\xB3\x6E\xA4\xF6\x54\x61\xE6\xAD\x0F\x03\x2B\xB1\xBA\xAB\x8B\x6A\x85\xAC\xB7\x83\xD8\x5D\xB0\xEF\xAD\x79\x68\x18\xB2\xDE\xAB\x4C\x63\xC3\xB5\x5B\xBF\x8D\x66\xB0\x7C\xAD\x3B\x78\xE7\x59\x86\xBD\xB7\xAA\xF1\x6D\xB0\x61\xA8\x38\xB0\x67\xAA\x0E\xB4\x70\xB7\x6C\x74\x61\x89\xAE\xFE", "\x9A\x85\x03\x1D\xB4\xE1\xAE\xD1\x96\x16\xBB\x61\x8F\xAE\x9E\x69\x3F\xB0\xC5\xA9\x10\xB4\xE7\x62\xC4\x97\x5C\xDF\xB0\x7C\x6E\x43\xB1\xC7\xA8\x46\x8A\x88\xA0\xB9\xBA\x37\xCA\xB0\x5E\xAB\x46\xB2\xC9\xAB\x8C\x9B\xCC\x12\xC4\xAA\x5C\x87\x93\x43\xB1\x42\xB1\x22\xB3\x13\xB7\x11\x96\xC4\xAD\x5C\xF0\x6D\x9E\xB0\x4A\xAE\x18\xB4\xCE\x7B\xA1\x4F\x08\x25\x62\x8A\x02\xA7\xB1\x83\x01\x2A\xB6\x20\x0B\x8A\xA5\x08\x2D\x62\x80\x00\xAF\xB1\x58\xB2\x44\x02\x16\xB6\x8A\xB3\xC5\xB6\x62\xB5\xB1\xB8\xB0\x85\x01\x87\x57\x21\x0B\x8B\xBA\xC5\x92\x04\x3D\xB1\x07\x02\x60\xB2\x41\x02\x18\xB5\x10\x04\xC6\x80\x00\x46\xB1\xC8\xB1\x5F\xB2\x32\xB4\x17\xBB\x8C\xBE\xC5\x8C\x63\x8F\x02\xC6\x00\x89\x01\x34\xB0\x1A\xB2\x8D\xB5\xC6\x94\x63\xD7\xB1\x0A\x03\x69\xB1\x36\xB6\x1A\xBB\x8D\xB8\xC6\x87\x04\x5A\xB1\xDF\xB0\x6E\xB1\x38\xB7\x21\x07\x0C\x12\x08\x08\x03\x66\xB1\xE8\xB1\x87\x03\x39\xB2\x1D\xB9\x8E\xAA\x08\x2B\x63\xEE\xB1\xED\xB1\x83\x03\x3B\xB2\x1E\xB1\x8F\xA6\x08\x33\x63\xF6\xB1\xF5\xB1\x82\x03\x3D\xB5\x20\x09\x0C\x07\xB8\x7D\x63\x87\x80\xFF\xB1", "\x24\xB0\x3F\xB4\xEF\x61\x90\xAC\xC2\x89\xD8\x05\xB2\x4F\xB1\xA5\x90\x42\xB2\x0A\xBC\x16\x8B\xC8\x95\x61\xC6\x93\x0E\xB2\x2C\xB2\x42\x01\x22\xBB\x85\xAB\xA9\x54\x64\xDE\xB0\x9E\x69\x8B\xB1\x18\xB3\x99\x6A\x91\xA4\xC3\x9D\xD4\x1D\xB2\x67\xB1\x4A\xA8\x48\xB2\x0D\xB0\xD1\x63\xC9\xAE\x61\xED\x79\x26\xB3\x7D\xA1\x4A\xB4\xB3\xAB\x92\xB5\xC3\xA5\x55\x8F\x02\x2D\xB2\x3C\xB3\x61\xA0\x26\xB4\x90\xB5\xC9\x9F\x5A\x80\x00\x31\xB2\x3E\xB1\x01\x69\x27\xB0\x88\xAD\xBA\x7C\x64\x83\xB1\xA9\xA6\x89\x03\x4F\xB7\x10\xB1\x69\xA2\xCA\x9E\x55\xC3\xB2\x8B\xB0\x6B\x84\x52\xB6\x11\xB1\x2D\x8B\xCA\x93\x62\xBD\x97\x4E\xB3\x4B\xB2\x9F\x59\x2A\xBF\x89\xBB\xC9\xB6\x64\x82\xB2\x38\xB3\xAB\xB2\x41\xB0\xE2\xA7\x10\x0A\x06\x07\xDC\x5E\xB2\x07\x80\xB0\xB0\x56\xB2\x2C\xBB\x95\xBE\xA4\x64\x65\x89\xB2\xFC\x91\xB3\xB0\x43\xB0\xC1\x9A\x96\xAF\xC8\xAC\xFF\x6D\xB2\x12\xB3\xAE\xB0\xDF\x68\x2E\xB5\x91\xB7\x9D\x74\x65\x98\xB2\x4D\x6F\xBB\xB3\x46\xB5\xA3\x6A\x97\xBE\xC8\x89\xD8\x7D\xB2\x21\xB2\x07\x96\x41\x00\x30\xB4\x92\xBF\x35\x84\x66\xA7\xB2\x10\x7B\xC3", "\xB3\x3E\xA2\x31\xBC\x59\xAC\xCC\xAE\x64\xF8\x9F\x12\x02\xC7\xB2\x4C\xB1\xAD\xAB\xCC\x12\xCC\xBA\x64\xDB\x68\x96\xB3\x9E\xB0\xBC\x69\x33\xB0\x94\xAD\xA0\x8A\x04\x1C\xB3\x44\xB3\xBC\xB3\x5C\xB6\xAB\xA0\x9A\xA9\xCA\xA0\xFC\x25\xB3\x4C\xB3\x87\x8D\x08\x88\x35\xBF\x94\xBD\x22\x8F\x04\x2C\xB3\x52\xB2\x7C\x84\x6C\xB5\x2A\xBF\xB5\x93\xCD\xA2\x62\xCB\x69\xB6\xB2\x4C\xAF\x3C\x69\x37\xBC\x69\xA5\xD9\x7C\x66\xA5\xAD\x83\xB3\xD1\xB3\x4D\xB1\xE8\xA1\x74\xAB\x06\x2E\x5F\x8F\x02\xC6\xB3\x87\x00\x33\x07\x38\xBA\x10\x0B\xCE\x8F\x04\x4D\x01\x12\x02\x67\x01\x3E\xB0\x00\x0F\x0C\x11\xCE\x93\x67\xD2\xB3\xEC\xB1\x87\x00\x76\xB0\x1E\xBA\x9D\xB7\xCE\x9E\x67\xD9\xB3\x0A\x03\xED\xB0\x3D\xB5\x3B\xB0\x9E\xA7\x08\x22\x67\xF8\xB1\xE4\xB2\xEE\xB1\x78\xB7\x3B\xBA\x9E\xA6\xCF\xAC\x67\xE3\xB3\xEB\xB3\xF2\xB2\x41\x00\x1A\x03\x9D\xB4\xCF\xB2\x67\x85\x02\xF6\xB3\xF6\xB3\x7C\xB5\x3E\xBC\x9F\xB7\xCF\x80\x00\x79\xB3\xF0\xB3\x83\x00\x80\xB0\x3D\xBA\x10\x03\xD0\xBA\x63\x92\x02\x06\xB4\x00\x03\x3E\xB7\x3F\xBD\x9F\xBA\xCF\xB8\x67\x8D\xB4\x01\xB5\xFD\xB2", "\x7F\xB1\x41\xBB\xA0\xB1\x06\x12\x04\x52\x01\x12\x03\x69\x01\x86\xB3\x43\xBF\x10\x1A\xD0\x9D\x68\x9C\xB4\x0A\x02\x0F\xB5\x88\xB0\x44\xB7\x10\x02\xD1\xA5\x68\xA4\xB4\x06\x02\x13\xB5\x8A\xB0\x45\xB5\x10\x0A\xD1\x85\x04\x54\x01\x12\x02\x18\xB7\x43\x02\x46\xBA\x10\x14\xD1\x87\x04\x36\xB4\x06\x02\x1C\xB7\x8B\xB1\x46\xBC\xA3\xB3\xD1\xBD\x68\xB5\xB4\x3F\xB5\x1B\xB5\x90\xB1\x47\xB2\x11\x15\x06\x29\x7F\x06\x02\x46\xB4\xDE\xAC\x9A\x11\x49\xBB\x78\xA5\xD2\xA8\x5E\x97\xAF\x0A\x02\x26\xB4\xDA\xA8\x4A\xB7\x10\x12\xD2\x95\x5E\xCB\xAF\xA4\x7E\x2B\xB5\xE7\xAA\xF3\xAF\x9A\x7A\xD2\xA1\x5E\x86\x02\x10\x70\x2F\xB5\xE9\xAE\x49\xBA\xA4\xA4\xD3\xA4\x5D\x9C\x70\x62\xB5\xD5\xAD\x95\xB0\xF5\xA6\x66\x49\xD3\xA5\xE0\x66\xB4\x68\xAE\xE7\xAC\x00\x06\x4D\xBD\x82\x70\xD3\x97\x69\xC0\x70\x76\xB5\x2D\xB4\x96\xB4\xF0\x74\xA7\xB8\x6F\x39\x69\xDF\xB4\xC5\xAE\x85\x03\x07\x55\x4F\xBE\x79\xAC\xEC\x44\x6A\xDC\xB4\xF3\x75\x43\xB5\xD9\xAE\xF8\xAF\x10\x0A\xD4\xA7\x2E\x56\x01\x7F\xB5\x0B\x73\xF4\xAE\x20\x07\x0D\x07\xD2\x85\x04\x15\xB5\x65\xB5\x87\x00\xA6", "\xB5\x49\xBA\xA9\xAF\xD2\x92\x5E\x8A\x02\x9B\xB5\x29\xB7\xA7\xB7\x20\x01\xAA\xB7\xD3\x9C\xCD\x25\xB5\x7A\xB4\xE0\xAC\xA9\xB0\xF5\xA0\x81\x68\xD5\x80\x6A\x80\x00\xA6\xAF\x4B\xB4\xEA\xA8\x4D\x1E\xAA\xB7\xC0\x5C\xE0\x35\xB5\x6A\xB4\x4A\xB4\x9B\xB2\x22\x08\xAB\xAF\xD3\x9D\x6A\xBC\xAF\x72\xB5\x5E\xB5\x9D\xB7\x57\xB4\x76\xB8\xD3\x84\x6B\xE8\xAE\xAA\xB4\x5D\xB6\xF0\xAC\x57\xB8\x7A\xA1\xD6\x88\x5F\x95\x72\xC2\xB5\xB7\xAC\xB3\xB0\x58\xB0\x78\xA0\xD5\xA8\x5E\xA7\x17\xD8\x01\x69\xB4\xD9\xAB\x52\xB5\x10\x19\x06\x12\x04\x5E\xB5\x0F\x02\x6D\x02\x44\x02\x5C\xBF\x10\x1B\x06\x12\x04\x66\xB5\x0F\x02\x6E\x02\x44\x05\x1B\x02\x11\x1E\x06\x12\x04\x5F\x01\x12\x02\x70\x02\x44\x01\x1C\x02\x11\x02\x07\x12\x04\x6A\xB5\x0F\x02\x7B\xB7\x43\x03\x1C\x07\xAF\xB2\x08\x3C\x6B\x8F\x02\xE4\x01\x7E\xB4\xC0\xB2\x22\x05\x0E\x02\xD8\x8A\x04\x05\xB6\x0F\x02\x73\x02\xC1\xB7\x20\x07\x0E\x0D\xD7\x92\x04\x0A\xB6\x0F\x03\x86\xB7\x43\x00\x1D\x0B\xB0\xA6\x08\x29\x03\x0E\xB6\x13\xB6\x89\x03\xC5\xB7\x21\x0A\x0E\x18\xD8\x8A\x04\x1D\xB6\x0F\x03\x75\x02\x44\x04", "\x1D\x02\x11\x0D\x07\x25\x6C\xA7\xB6\x0F\x02\x93\xB5\xCA\xB0\x65\xBA\x10\x0A\xD9\xAD\x6C\xAC\xB6\x07\x02\x97\xB5\xCC\xB0\x66\xB6\x10\x12\xD9\xB5\x6C\xB4\xB6\x05\x02\x9B\xB5\x41\x06\x1D\x02\x11\x02\xD9\x8F\x04\x3C\xB6\x0F\x03\x77\x01\xCF\xB2\x22\x02\xB4\xAC\xD4\x82\x6A\xD5\xB5\x07\x02\x78\x02\x44\x02\x69\xBF\x10\x0C\xDA\x8A\x04\x4E\xB6\x49\xB7\xA5\xB6\xD4\xB5\x69\xB3\xB5\xAF\xDA\x95\x6D\xD1\xB6\x54\xB7\xAC\xB6\xD5\xB2\x6B\xB7\x10\x11\x07\x12\x04\x5E\xB6\x0F\x02\xB0\xB6\x42\x02\x6C\xB7\x10\x12\x07\x07\xDC\x66\xB6\x07\x80\xB4\xB4\x56\xB2\x6D\xB5\x96\xAD\xBA\x6C\x6D\xE8\xB2\x3F\x7F\xB7\xB7\x5A\xB4\x00\xA2\xB7\xAE\xCB\xAC\x05\xF5\xB6\x71\xB2\x83\x00\xDE\xB5\x2E\xB3\x58\x7B\xDB\xB8\x65\xF0\x6D\x7E\xB7\xBD\xB1\x82\x69\x70\xBE\x97\xA3\xB0\x44\x6E\x81\xB3\x1D\x6B\xC3\xB5\x61\xB5\x92\xAA\xB8\xA8\xCC\xBF\x1A\x8D\xB7\x61\xA8\xC8\xB4\x67\xAA\x72\xBF\x98\xBF\x59\x54\x6E\x93\xB3\x29\x93\x87\x03\xE5\xB7\x32\xB4\x99\xB2\x08\x1B\x6E\x9A\xB3\x05\x69\xCF\xB5\x67\xB1\x74\xB4\xE7\x62\xDD\xA1\x66\x80\xB7\x7C\x6E\xD3\xB6\x69\xB1\x06", "\x5A\xBA\xA9\xCD\xAF\x2B\xD6\x85\xAD\xB7\xD6\xB0\xD7\x8A\x73\xB7\xE5\x91\xDD\xB1\x66\xFA\x8C\x05\x02\xDB\xB4\x6D\xB6\x9A\x8A\xBB\xB7\xCD\x89\x6E\xA9\xB7\xC0\xB7\x8B\x81\xEF\xB2\x37\xBB\x4C\x63\xDE\xBD\x66\x81\xAC\x05\x03\x79\x02\x44\x02\x79\xBF\x10\x0C\xDE\x8A\x04\x4E\xB7\x07\x02\x7A\x02\x44\x02\x7A\xBF\x10\x14\xDE\x8A\x04\x56\xB7\xD1\xB7\xE9\xB6\xF6\xB5\x7A\xBB\xBD\xB7\xDE\x9D\x6F\xD9\xB7\xDC\xB7\xF0\xB6\xF7\xB2\x7C\xB7\x10\x15\x07\x12\x04\x66\xB7\x0F\x02\xF4\xB6\x42\x02\x7D\xB5\xBE\xA7\xDF\xAE\x6F\xE9\xB7\xEF\xB7\xF5\xB5\xFC\xB5\x7D\xB0\xBF\xB5\xDF\xB2\x6F\xF6\xB7\xF5\x27\x39\x34\x95\xB1\xF2\xA0\x74\xA6\xC3\x71\xA0\x49\xB5\x05\x02\x08\x71\xAC\xB0\x03\x7C\x81\x7C\xC0\x66\x99\x62\xAE\x72\xB5\x4A\x1A\xB1\xB5\xE9\xA0\xF2\x6F\x67\x32\x69\x8B\xB8\xD2\xB4\x49\x70\xD2\xB0\x14\x7A\x9D\x56\xD4\xAF\x6A\xE8\x14\x55\x70\x4F\xB5\xFF\xB4\xF7\xAB\xBF\xA9\xD5\x9C\xCD\x15\x71\x8C\x66\xA8\xAC\xEA\xAB\x80\xB9\xC1\xBC\xBD\x9C\xE0\x36\xB5\xBB\xB4\xDE\xAE\xD8\xA9\x05\x73\xC1\xBA\xD3\x95\x32\x20\xB8\x8C\x7A\x18\xBB\xBC\x77\x02\x7F", "\xCE\x0C\xE1\x86\x6D\xC8\xB5\x1F\xB8\x33\x73\x32\x1E\x86\xB7\xB4\xBC\xBD\xA7\x2E\x12\xB5\x12\x02\x7B\x02\x44\x07\x1E\x0C\x26\x24\xE2\xB5\xDF\x05\x02\x46\xB8\x85\x01\x07\xB8\x00\x09\xC4\xA4\xBA\x9B\x70\x8A\x02\x4D\xB9\x42\xB4\xE9\x79\x8A\xB8\xA8\xA4\xFC\x54\x71\x80\x00\x10\x71\x2B\xBB\x00\xBF\x8A\xB8\xA6\x17\xE2\x9C\xE0\x5E\xB8\x43\xB9\x3C\x71\x18\xBE\x57\xB0\xC5\xB2\x08\x32\x69\xD7\xB8\x95\x19\x2B\xB8\x04\xBE\x20\x0A\xC6\xA5\x84\x57\x71\xEF\x19\x57\xB9\x33\xBA\xFF\xB3\x8C\xBC\xC0\xAB\x66\x31\x71\xAD\xB8\x4C\xB8\xEA\x2F\x41\x07\x8A\xBC\xAD\xA0\x00\x38\x03\x12\x02\x7F\xB9\x87\x01\x3E\x02\x22\x03\xC8\xAF\x08\x3A\x03\x12\x02\x87\xB9\x87\x03\x3E\x00\x90\xB2\x11\x0B\xE4\x8F\x04\x01\xB9\x0A\x02\x7E\x00\x23\xBF\x21\x02\xC9\xAF\xE4\x92\x04\x7D\x01\x16\xB8\x4C\xB9\xA6\xB2\x21\x0A\xC9\xBC\xD4\x9C\x72\x9A\xB8\x59\x71\x4B\xB8\x28\xBF\x20\x01\x74\xBD\xE4\xB8\x70\x95\x72\xA6\xB8\x53\xB4\xE3\x61\x95\xBA\xA7\xB0\xC0\x6C\x72\xAF\xB5\x03\xB9\x57\xB9\x09\xBF\x93\xB6\xC2\xA2\xE5\xB5\x72\x8F\x02\xB2\xB8\x31\xB8\x2E\xB8\xF5\xA2\x76", "\xB9\xE5\x92\x70\xB7\xB8\x06\x02\x5F\xBB\xB0\xB4\x96\xB5\xAC\xBC\x9A\x42\x73\x91\xB8\xC4\xB8\xB4\xAF\x3B\x1F\x98\xBC\x89\x78\xE3\x8C\x73\xD5\xB8\x21\x89\x67\xBB\x9E\xB6\x5A\x82\xCD\xB2\xD3\xBE\x03\x36\xB9\x82\xAE\x6C\xB8\xDA\xAD\x8F\xBA\x86\x5A\x7A\x33\x6A\x97\x02\xDF\xB8\x8F\x03\x28\xBE\x20\x01\x74\xAA\x43\x57\xE0\x4B\xB8\xE6\xB9\x39\xBA\x38\xBC\xF7\xA0\xC0\xB3\x08\x2C\x6A\xE0\xB9\xBC\xAF\x01\xB9\x3A\xBF\x88\xBE\xCE\xB7\xE5\xBE\x04\x2D\xAF\xF0\xB8\xB2\xAE\x9B\x4C\x97\xB9\xCF\xB1\xD3\xB8\x71\xF3\xB9\xC3\xB9\xAC\x03\xB3\xB4\xB1\x70\xD0\xA8\xE6\x82\x74\xCB\xB5\xEB\xB8\xB2\xAE\x9C\xB5\xA0\xB2\xC5\xB0\x11\x8C\x74\xD0\xB9\x20\x7F\x87\xBB\xA2\xB5\x87\xBB\xAC\x52\xE8\x9B\x32\x28\xAF\x7D\xB9\x00\x01\xD8\x05\x90\x1A\xD1\xBB\xE4\xAA\x76\x61\x06\xB3\xB9\x8F\xB8\x07\xBB\x54\xB0\x4F\x40\xE9\x98\xE1\x24\xB9\xA9\x44\x93\xBB\x0D\x24\x6B\x6D\xD1\xA5\xE6\x8C\xCE\x2D\xBA\x68\xAE\x08\x70\x4C\xBF\x4A\xB3\xC0\xB3\xE9\xBA\x69\xE8\x14\x36\xBB\x57\xB4\x07\x71\xA7\xB8\xC2\xA5\xC2\x2A\x74\xDE\xAE\x3E\xBA\x15\xB9\x4A\xBC\x5A\xB0\xCC\xA8", "\x30\x7F\x74\x8E\x49\x43\xBA\x97\xB8\x63\x7C\xA7\xBA\xC3\xA9\xEA\x8A\x73\xCE\xBA\x57\xB4\x39\xB4\x53\xBB\xA5\xB5\x91\x73\xEA\xB5\x71\xD0\xBA\x7A\xB4\xA9\xBB\x51\xBC\x82\xB5\xD2\xBC\xBD\xBD\x71\x82\x00\x61\x07\x01\x01\xD8\x04\x00\x0C\x6C\x5A\x7D\x7C\xAA\x36\x00\x43\xAC\x63\x55\x74\x19\xA3\x0C\xAB\x57\x01\x29\x75\xCA\x55\xD1\x1B\xC4\x48\xAF\x50\x07\x0F\xD6\xAE\x56\x71\x75\xC2\x55\x46\x71\xBA\xB8\xB4\x51\xBA\x1C\xAE\x3C\x55\x7A\x00\x7A\xBA\x65\xBA\x46\x5E\xAF\x53\x07\x00\xD8\xAD\x2F\x43\x31\x3C\x55\x3C\x01\xC2\xBA\x1E\x38\x4D\x1C\x2B\x0C\x0E\x3D\x00\x0A\xBB\x2D\x5E\x08\x70\xAF\x56\x07\x00\xD9\xA8\x67\x5D\x01\x01\xBB\x00\x01\xFA\x00\xAF\x01\xB1\x4A\x05\x18\xEC\x9A\x76\xCE\x5C\x54\x00\xCF\xB8\x99\x0C\x5D\x3C\x04\x02\xED\x9A\x38\x15\xBB\x92\x5A\x23\x02\x69\xBA\x21\x00\x04\x08\xED\xB5\xB8\x40\x00\xAB\xBA\x8B\x0E\x6B\xBD\x02\x6A\x03\x11\xED\x80\x19\x33\xBB\x36\x0A\x1A\x02\x6D\xB8\x47\x43\xDB\xA2\x5C\x5F\x00\x3B\xBB\x37\x11\xD9\xB9\xE4\x56\x02\x00\xDC\xA5\x02\x33\x76\x9C\x55\xC0\xBA\x23\x03\x6C\xB9\xA3\x0E\xC8\xB1\x6E", "\x0C\x07\x47\x00\xB3\xBB\xC3\x04\xFB\xB2\x38\x1F\xD9\xB0\x57\x46\x04\x7F\xB5\xCE\xBB\x69\x27\x6C\xBC\xED\x6A\xAF\xA1\x56\x49\x01\x33\xBB\xB9\x6D\x2A\x01\xC9\x46\xAE\xB0\x98\x39\xB5\x56\x01\x63\xBB\x7B\xBA\xC0\x33\xCF\x54\x03\x7C\xAB\x4A\x02\x33\x76\xBF\x56\x1F\x50\x5E\x57\x12\x03\xB6\xB8\xF3\x44\x9E\x3C\xAA\x4C\x00\xF4\xBB\xFA\x72\xAF\x55\x09\x0F\xDE\xAA\xE1\x41\xAB\x4E\x00\xB3\xBA\x5E\x06\xF0\x7C\x57\x5F\x04\x1D\xEF\xB0\xFC\x78\xBA\x50\x00\x03\xBD\x6C\x88\xAF\xB1\x05\x0A\xF0\xAB\x1D\xF8\xBA\x52\x00\x07\xBE\xC8\x88\xAF\xB3\x05\x12\xF0\xB6\x25\xF8\xBA\x54\x00\x0B\xBD\x3F\x92\x58\x55\x05\x13\xED\x82\x07\x4B\x97\xBC\x54\x2B\x02\x87\xB9\xA8\x92\xAC\x57\x02\x1A\x78\xD2\x9D\xC0\x54\x2C\x01\x80\xBB\x25\xA2\xAC\x59\x02\x2B\x78\xBF\xA0\x78\xBA\x2D\x02\x86\xBB\xFE\x90\xAC\x5B\x02\x33\x78\xF8\xBA\x5C\x01\xD9\xBB\xB8\x1F\x01\xAC\xAB\x5D\x02\x33\x76\xA9\x44\x1A\x00\xE6\x01\x7B\x4E\x0B\x03\xDB\xA7\x72\x1B\x00\x42\xBC\xD6\xBA\xF4\x87\x6C\xBC\x03\x7D\x00\x08\xF2\xAF\xAB\x28\x21\x77\x1C\x07\x02\x93\xB9\x5E\x50\x98\x21\xBA\x94", "\x02\x68\xBB\x32\x44\xE9\x6E\xF6\x53\xCA\xBD\x53\x44\x33\x13\x34\x17\x00\x5C\xBD\xA0\x48\x99\x08\x02\x7F\x00\x01\xF3\x99\x76\xE4\x0C\x1F\x50\x08\x02\x99\xBD\xBA\xBF\x88\x7A\x5F\x6B\x79\xE4\x0C\x17\x70\x0A\x03\x9B\xBB\x43\x18\xC2\x0B\x00\x33\x79\xA8\x21\x7D\xB8\x7C\x00\x96\xBC\xCC\x05\xC8\x11\x00\x37\x79\x80\x33\x68\x15\x0A\x03\x9F\xB8\x5B\x30\x7E\x13\x00\x03\x7A\x99\x30\xA6\x71\xA9\x03\xA1\xBD\x5D\x3B\xE3\xB8\xEB\xA0\x01\x33\xBB\x7A\x07\x69\xA0\xAF\x01\xCB\xB6\xF7\x41\x1F\x7C\xAA\x61\x00\x1A\xBC\x95\xA2\xB0\x52\x0C\x03\xDB\xBE\x1A\x1D\x3B\x13\xBD\x64\x0D\x9F\x56\x82\xA2\x58\x53\x06\x0F\xF1\x8A\x04\x66\xA5\xC0\x54\x32\x03\x6C\xB8\x70\x01\x44\xBC\x55\x65\x01\x2B\xBD\x12\x02\x76\xA4\xB0\x56\x0C\x00\xEB\xA6\x98\x82\xAB\x67\x00\xB5\xBD\x75\xA4\x5E\xB8\x0D\x0A\xE1\xA1\xB2\x81\xAB\x69\x00\x1A\xBC\x27\xAC\xAF\x52\x0D\x0A\xE1\xB5\xBE\xBF\xAA\x6B\x00\x1A\xBD\x5E\xAC\xB0\x54\x0D\x0A\xE1\xA4\xB6\x82\xAB\x6D\x00\x1A\xBC\x66\xAD\xB0\x56\x0D\x0A\xE1\xB0\xB6\x81\xAB\x6F\x00\x1A\xBD\xA5\xAC\xAF\x50\x0E\x0A\xE1\xAC\xC1\x82\xAB", "\x71\x00\xA6\xBD\x60\xB0\x5E\xBA\x0E\x01\xEE\xA6\x08\x0E\x64\xBC\x55\x73\x01\x72\xBD\x41\x05\x3A\xB2\xAC\x54\x03\x2A\x7B\x80\x00\x16\xB4\x61\x55\x1D\x03\xB6\xB7\x8F\x32\xD7\xBA\x71\x14\xBD\x2D\x5E\x7A\xB6\xB0\x56\x0E\x0A\xE1\xA8\xD8\x99\x77\x8C\x9D\xCB\xBA\x89\x00\xC8\xB1\x58\x58\x07\x01\xF8\x8F\x04\x24\xB6\xC2\x55\x3C\x02\xC1\xBA\x21\x00\xB4\xA1\x56\x7A\x01\x6F\xBD\x64\xB7\x5F\x57\x1E\x03\xE1\xB5\xB6\xB8\xEB\xBC\x01\x14\xBE\x06\x02\xEC\xB7\xAF\x55\x0F\x08\xF1\xA5\x08\x05\x72\xC1\x55\x7E\x01\xE3\xB9\x3F\xBF\x57\x5F\x07\x02\xF9\x81\x75\xC1\x55\x80\x00\x93\xBD\xF1\x40\xB3\xBC\x2B\x01\x04\x02\x77\xF1\x56\x2C\xBE\x29\x57\xCB\xB9\x24\x01\xF3\xAF\x08\x03\x02\x33\xBE\x3C\x03\x9A\xBE\x42\x04\x10\x08\xF3\xA8\x5C\x7A\x7C\x87\x02\x85\x01\xDE\xB8\x72\x4F\xE7\xB6\x10\x06\x04\x02\x7D\x8F\x02\x1C\x00\xA2\xBD\x41\x07\x10\x08\xDB\xA5\xA2\x4A\x7D\x80\x00\x88\x01\xA6\xBE\x98\x47\xE9\xB9\x08\x12\xFA\x99\x0B\x4F\xBE\x8A\x00\xAB\xBF\x41\x01\x05\x0F\xF4\xAB\x04\x1A\x7D\xBA\x6E\x4F\xBE\x46\x03\xD7\xBE\x06\x7F\xF4\xAD\x04\x33\x76\xF1", "\x09\x38\x01\xA7\xBE\x23\x03\xB6\xB6\x9A\x3E\x01\x0F\x7D\x8F\x01\xB3\xBA\xD4\x30\x11\x07\xE9\xB0\x09\x13\xED\xAC\x6B\x4A\x00\x4F\xBF\x48\x03\x6C\xB9\xB1\x42\x05\x0F\xFA\x92\x02\x7B\xBE\xC0\x81\xA7\xBF\x24\x03\xB6\xB1\xB6\x18\x02\x0F\x7D\x94\x01\x1A\xBD\x31\x03\xD3\xBD\x12\x09\xDF\xAD\x9B\x0F\x7D\x96\x01\xB3\xBB\x57\x2B\x19\x07\xE9\xB7\x09\x1A\xF0\x81\x00\x68\xBB\xBC\x04\x4C\x01\xE3\xBD\x78\x48\xDE\xAC\xF3\x86\xBC\x4B\x02\x9D\xBE\x2F\xBF\x3A\x48\xF3\xB4\x66\x11\x41\x45\x00\x21\xBF\x1B\x15\xE4\x4B\x01\x00\xF5\xB8\x0A\x26\x89\x46\x00\x2C\xBF\x80\x32\xFA\x5E\x41\x07\x1B\x00\xDC\xB9\x04\x11\x7E\x8C\x8D\x4F\xBE\x4D\x03\xE6\xBF\x20\x0E\x06\x00\xEE\xAE\x88\x7D\x92\xBE\xBF\xD9\x33\xCF\x52\x0F\x0F\xF4\xBB\x04\x2F\x7B\xFB\x00\x4F\xBE\x4E\x02\x86\xBC\xF8\xB2\xAC\x5D\x04\x3B\x7E\xEB\x9E\x4F\xBE\x4F\x03\x6C\xB9\x98\x58\x07\x0F\xFA\x9F\x02\x33\xBB\x0A\xA2\xCC\xB8\xBE\xBD\xAF\x5A\x08\x0F\xFA\xA0\x02\x4F\xBF\x05\x03\x44\x03\xD3\xB9\x14\x0A\xE1\xB4\x04\x0F\x7D\xA2\x01\xB3\xBA\x26\x5A\x23\x07\xE9\xB3\x0A\x09\xFF\x92\x04\x6B\xBF", "\xC2\x54\x52\x00\xF8\xB8\x00\x00\x09\x0F\xFA\xA5\x02\x73\xBF\x99\x01\xA7\xBE\x29\x02\xC3\xB0\x0A\x0F\xFA\xA7\x02\x7C\xBF\x4F\xBE\x54\x03\xFC\xBD\x14\x0F\xF4\xA9\x05\x03\x80\xCF\xBE\xAA\x01\xD9\xBB\x03\x55\x18\x0F\xF4\xAB\x05\x0A\x80\x92\x02\xC7\x01\xA7\xBC\x2B\x03\xFE\xB9\x0C\x0F\xFA\xAD\x02\x1A\xBC\xD3\x01\xA7\xBE\x2B\x00\x03\xCF\xF4\xAF\x05\x1A\x78\xDA\x01\x4F\xBE\x58\x03\x07\xC7\xE9\xB1\x0B\x13\xED\xA9\x36\x5D\x01\x4F\xBE\x59\x02\x09\xC3\x5D\xBF\xF4\xB3\x05\x1A\x78\xE8\x01\x4F\xBE\x5A\x02\x86\xBD\x1D\x0F\xF4\xB5\x05\x1A\x78\xF0\x01\x4F\xBE\x5B\x03\xFC\xBB\x1E\x0F\xF4\xB7\x05\x33\x7F\xF6\x01\x4F\xBE\x5C\x03\xFC\xB8\x1F\x0F\xF4\xB9\x05\x1A\x78\xFE\x01\x4F\xBE\x5D\x03\xFC\xBD\x1F\x0F\xF4\xBB\x05\x33\x76\x95\x0F\x0F\x00\xD2\xBF\x43\x04\x17\x0F\xE3\xAF\xC0\x52\x81\x8A\x02\xBD\x01\x27\xC3\x55\x07\x0A\xCC\x80\xBA\x02\xE2\xBD\x5C\xC0\x06\x03\x5F\x02\x17\xC7\x15\x60\x06\xC5\x08\x00\x03\x73\xBF\x17\x01\x32\xC0\x00\x01\x18\x03\xDB\xAC\x8B\x1E\x00\x6A\xC0\xC2\x01\xD9\xB8\xF3\x60\x04\x0A\x06\xC3\x06\x2D\x81\xA1\x60\x6A", "\xC0\x62\x02\x1C\xC0\x29\x6A\x06\xC5\x06\x37\x81\xC3\x60\x6A\xC0\x63\x03\x1E\xC6\x21\x6A\x06\xC7\x06\x1A\x78\xA9\x00\x6A\xC0\x64\x02\x8E\xBF\xFE\x6A\x06\xC9\x06\x0B\x82\xA8\x70\x6A\xC0\x65\x01\x15\xC2\x0D\x7A\x06\xCB\x06\x2F\x7B\xB6\x00\x6A\xC0\x66\x03\x18\xC7\xB6\x0A\x06\xCD\x06\x1B\x82\x89\x15\x6A\xC0\x67\x03\xFC\xB8\x08\x00\xFB\xB8\xD6\x37\xA9\x41\x00\xA5\xC1\x0C\x31\xE5\x0B\x09\x0A\x06\xCF\x06\x1F\x82\xE5\x7B\x6A\xC0\x68\x03\xBB\xB9\x09\x0A\x06\xD1\x06\x33\x76\x97\x6D\x47\x00\x35\xC2\x34\x03\xB6\xBA\x6A\x79\x02\x3B\x79\x9B\x14\xAA\x6C\x2C\x03\x2F\xC0\x15\x2C\x2B\x1F\x02\x2A\x81\xD3\x01\x1A\xBC\x31\x02\x1A\xC4\x1A\x0F\xEE\xAA\x03\x2A\x81\xD5\x01\xCD\xC0\x35\xC2\x35\x07\xDD\xB7\x07\x0A\x03\xD7\x03\x73\xBF\x7C\x00\x35\xC0\x36\x07\xDD\xB4\x08\x0A\x03\xD9\x03\x1A\xBC\x80\x00\x35\xC2\x36\x02\xC3\xB2\x08\x0A\x03\xDB\x03\x2F\xC1\x7E\xA4\x35\xC0\x37\x00\x1D\xC3\x09\x0A\x03\xDD\x03\x73\xBF\x91\x00\x35\xC2\x37\x03\xB6\xB7\x54\x52\x04\x2A\x81\xDF\x01\xF0\xC0\x35\xC0\x38\x04\x1E\xC2\x26\xAA\x03\xE1\x03\x79\xC1\xC2\x54", "\x71\x03\xFC\xB8\x13\x0A\x06\xC3\x07\x2F\x7B\xA1\x01\x6A\xC0\x72\x03\x41\xC2\x0D\xC5\x0E\x0F\x04\xCA\x04\x1E\x01\x6A\xC0\x73\x03\x6C\xBB\x88\x1F\x09\x0A\x03\xE7\x03\x0E\xC2\x07\x02\x88\xC2\xB0\x50\x1D\x03\x11\xC6\xAB\xAA\x81\xE9\x01\xB3\xBB\x01\xBA\x29\x03\x18\xC0\x98\x23\xE0\xAA\x02\x24\xC2\xD8\x35\x01\xB9\x2B\x00\x25\xC9\x81\x29\x11\x73\x02\x6A\xC0\xEA\x01\x49\xC0\xB6\xAA\x0D\xCB\x0E\x12\x09\xC7\x04\x3A\x01\x6A\xC0\x76\x02\x4D\xC6\x20\x08\x13\xC2\x56\x6D\x03\x33\xBB\x66\x4C\x5E\x02\x1A\xC6\x1D\x00\x14\xCA\xC0\xAA\x81\xEF\x01\xB3\xBA\xB1\xAD\x31\x02\x0D\xC0\x0F\x09\x0A\xD2\x63\xEA\xC0\xF1\x00\xA7\xC0\x34\xB2\x0D\xC2\x0F\x12\x0A\xCA\x04\x4B\x01\x6A\xC1\x79\x02\x55\xC7\x20\x0C\x0C\x0A\x03\xF4\x03\x33\xBB\x78\x51\x66\x02\x1A\xC5\x1E\x0B\x15\xC6\x08\x1D\x85\xC2\x55\xF6\x00\xB0\xC2\x44\x02\x2C\xC2\xAC\x57\x07\x2A\x85\xCF\xB3\x6A\xC0\x7C\x03\x4E\xC5\x20\x02\x0D\x0A\x03\xF9\x03\x73\xC2\x00\x01\xBA\xC2\xB0\x52\x1F\x0F\xEE\xB5\x06\x2A\x81\xFB\x01\xB3\xBB\x4A\x1B\x36\x02\x0D\xCC\x0F\x01\x0C\xE7\x6B\xEA\xC0\xFD\x01\x77", "\xBE\x3E\x02\x0D\xCE\x0F\x13\xED\xA7\x2E\x7D\x01\x2C\xC3\x76\x37\xCF\x54\x1F\x0A\x06\xDF\x07\x0E\x86\x97\xB9\x91\xC2\x17\x44\xAF\x07\x00\x06\xE6\xA7\x23\x0B\x59\xAC\xBE\x06\x01\xCE\xC1\xAA\x47\x33\xCC\x5D\x64\x10\x62\x86\xA9\x4B\xA4\xC3\x87\x02\x91\xBB\xD1\xB3\x00\x09\x0D\xC2\x8F\x29\x66\xA7\xC2\xB3\x02\x6B\xC7\x78\x46\x3D\x71\x0D\xF6\x2A\x33\xC3\xC5\x72\x9B\x2A\x6D\xC7\xDA\x48\x1B\xD0\xCE\x44\x0A\x3B\xC3\x05\x03\x03\x01\x6F\xC7\x06\x12\x4F\x40\x0E\xC0\xAD\x43\xC3\xE3\x1D\x17\x02\x71\xC1\x01\x03\x1C\xDE\xD2\x6E\x00\x46\xC3\x0A\x00\xE4\xC3\xFD\x6E\x38\xCB\x00\x0D\x0E\xC1\x09\x46\xC3\x0C\x00\xE9\xC0\x0A\x76\x38\xCD\x00\x03\x0E\xF8\x29\x34\x00\x66\xBD\xED\xBE\x9F\x46\x0E\x71\x1E\xC4\x33\x05\x02\x41\x59\xDE\x54\x62\xC1\x7B\x4A\x3C\xC9\x81\x3C\x15\x1E\x9E\x21\x45\xA0\xBD\x67\x54\x92\x48\x3E\xC2\x11\x12\xFD\xAD\x87\xE9\xC3\x6A\xBA\x5C\x4C\xAF\x50\xE7\x5A\x19\xCE\x57\x79\x87\xC0\x4D\x6A\x51\x33\x08\x13\x5D\x3F\xC5\xAF\x5F\x0F\xD8\x9A\x01\xC4\xBC\x05\x9F\x54\x81\xC6\x61\x50\xD7\xBA\x0F\xED\x97\x77\x54\x0B\xC4\x8D\x55", "\xB3\x50\xEE\x48\x2B\x5C\x15\x14\x96\x3C\x55\x87\x06\xF6\xC1\xBB\x34\x57\x02\xB8\x51\x10\xE6\xF0\x1A\xC4\x1E\xC4\xDC\x5F\x7D\xC5\xBC\x50\x22\xD3\xCD\x3C\x0A\x0E\x0D\xBC\x55\xC8\x55\x89\xC4\x3E\xC5\x20\xD8\xD6\x1C\x88\x93\xC4\xF3\xC3\x0A\xC6\xC7\x50\x30\x36\x21\xD0\x11\xCF\x99\x71\x4C\xBC\x05\xEF\x24\xAF\x51\x9E\x0B\x22\xD2\x11\xFF\x16\xA1\xC4\xC3\x5D\x1E\xC6\xE0\x4C\x57\x07\x90\x43\x12\xE8\xB6\x0A\x0D\xDF\x54\x17\x44\x43\x4C\xCC\x05\xC4\x1B\xEC\xB8\x87\xD8\x35\xCC\x02\x0D\xC5\x82\xC6\x46\xCD\x57\x53\xCD\x0C\x07\x17\x6D\x40\xC4\x26\x5A\xDE\x03\x99\x1A\x21\xCC\x0E\x2A\xDA\x40\xC4\xC9\x4A\xBD\x07\x03\x55\x4B\xC4\x74\x63\x11\xCA\xC4\x77\x55\x06\x02\xE6\x64\x99\xC6\xF6\x6B\xA1\x1C\x15\x03\x31\x7A\x06\xA0\x4F\x35\xC6\x0C\x76\x45\xC4\x6A\x7A\x57\x5D\xE0\x69\xBB\x50\xC4\x0B\xB8\x90\xC5\x90\x1A\x37\x01\xBA\x9A\x88\xFA\x06\x52\xC4\x33\x72\xE7\xB8\x5B\x3A\x37\x18\x12\xE6\x88\xB9\xB5\x05\x03\x7B\x33\x3B\x1F\x4F\xC7\x6B\x74\x13\xCA\xE1\x1F\x56\xB4\xC2\x6F\x4F\x86\x12\x6F\x09\x6B\x60\x12\xC4\x4F\x77\x31\x39\x7A\x46\xC4\x9B", "\xC2\x3D\xCC\xE3\x73\x11\xCA\x04\xD4\xC4\xB8\x44\xBD\x04\x34\x44\x57\x0A\x12\x97\xC7\x09\xA0\x1A\xC5\x34\xAE\x4E\xC7\xAF\x80\x52\xCC\x3E\x86\x10\xED\x6B\x5E\x06\x81\xC4\x31\x89\x97\xBF\x44\x27\x22\xD5\x13\xE6\x89\xEC\x2F\xAC\xC4\xB4\x8C\xA8\xC2\xF0\x4E\x35\x1F\x12\xC7\x8A\x8F\x02\xAE\x8F\x7B\x32\x76\x92\x43\xCE\x35\x15\x14\xFF\x8A\xAD\x95\xB9\xC4\x66\x9E\x7C\xC3\x36\x3E\x35\x0C\xBB\x40\x89\xA8\xBC\x1D\x57\xE2\x35\x83\xC0\x5B\x3E\x35\x03\x15\xE3\x53\xC9\xC5\x52\xA0\x62\xC6\x9E\xC7\x58\xC0\x0C\xA9\x16\xD9\x46\x92\xC5\xA8\x21\x7B\x33\xBA\x4D\xBD\x4A\x1A\xB1\x15\xE0\x8B\x92\xC4\x3F\xAE\x55\xC7\x41\x06\x40\xAB\x2C\xC1\x15\x48\x9B\x68\xC5\x0A\x02\xFB\xC3\x86\xC7\x40\xAB\x2B\xD1\x33\x46\x9A\x1E\xC5\x3E\x8A\x20\xC7\xA8\xBF\x5C\xC9\x27\xCF\x56\x77\x63\x03\xC4\xDC\xC4\x83\x00\x83\xA6\x55\xCE\x22\x40\x14\xF8\x8B\xE6\x5C\x40\xC5\x0E\xA6\xB6\xC6\x5F\xCF\xA6\x4C\x12\xCE\x4A\xF5\xC5\x62\x51\x7B\x30\xE0\x07\x1E\x37\x21\xCD\x2F\x68\x7A\xD3\xC5\x19\x31\x0C\xC7\xC1\xC5\x43\xC1\x30\xC5\x08\x28\x4B\xFC\xC5\x19\x31\x8C\x0B\xC4\xC2", "\xF9\x54\x23\xD2\x08\x2A\x4B\x84\xC6\xB3\x33\xC1\x03\xC8\xC3\x61\x53\x2F\xCF\x08\x32\x7A\x98\xC6\xED\x34\x15\xC7\xC1\xC2\xA8\x1C\xAB\x4E\xED\x20\x8C\xED\x35\x82\x57\x95\xC5\xB2\xC0\x48\xC1\x30\xBA\x10\xF6\x14\x3A\xC6\xE8\x58\x20\xC4\xDA\xA2\x43\xCC\x23\xC7\x18\xC1\xB3\x40\xC4\xD0\xA6\x0D\xC6\x69\x30\x68\xCD\xFF\x4E\x18\xFF\x50\xCF\x55\x97\xA8\x6E\x55\x2E\x58\x70\x07\x38\x03\x17\xFA\x71\x25\xAA\x1A\xC4\x76\x34\xD5\xC7\xA3\x50\x24\xD1\x11\xC2\x9E\x2E\x44\x87\x07\xF7\xC2\x8F\xC5\xBA\xA0\x31\xC1\x10\xDE\xA7\x5B\xC6\x0F\x02\x79\xC4\x90\xC1\xBD\xAA\x21\xC9\x2C\x68\x8D\xDA\x74\x40\xC4\x1E\x1A\x86\xC1\x6C\x1F\x36\xD0\x77\x40\x89\xBE\xBD\x28\xC7\x50\x47\xCF\x55\x6E\xC7\xD9\x40\x12\xFA\x75\xF8\xC4\x19\x30\x26\x58\xDF\xC5\x20\x00\x21\xDD\x18\xDE\x5A\xB7\xC6\x2E\x44\x9C\x5F\xE0\xC6\xB9\x50\x24\xCE\xB5\x88\x8E\xB3\x33\xC1\x59\xC5\xC4\xC7\xC4\x45\xCA\x10\x14\x4E\x6D\x8B\xB8\x45\x31\x51\xC5\xC4\xA2\x49\xBA\x16\xEC\xA4\xEF\x98\x6B\x5C\xC4\x2B\x57\x87\x55\xC9\xC3\xD6\xA5\x36\xDC\x15\x09\x97\x0B\xC7\x34\xC7\xF6\x4A\xB2\xB8\x66", "\xCE\x22\x4B\x31\x4B\x8E\x99\x42\xBC\x54\x61\xAD\xDE\xC0\x57\x47\xA7\x4B\x1C\xFA\x88\xED\x4B\xCE\xBD\xC7\xC5\xA8\x42\x5E\xCB\x38\xC7\x1A\xC6\x8E\xC6\xAD\x97\xC6\xC1\x4F\x98\xC1\x74\xCD\x34\xCD\x13\xC7\x5B\x93\xC4\xCA\xAC\xA9\xC7\x99\xC0\x70\x00\xC4\x5D\x1A\xF7\x88\xE2\x50\x2E\x44\x95\xC6\xD3\xC2\x21\x0E\x6C\xAF\xF2\x8E\x88\xE5\x5B\x86\xC4\xCA\xC7\x41\x03\xE9\xA7\x8F\x3E\xC0\xBA\x8E\xB8\x45\x83\x02\x5F\xC6\xF6\xC6\x20\x04\x82\xA9\x14\xEB\x60\xA5\xC7\x1F\x5A\x63\xC7\xF8\xC1\x08\xB7\x30\xCB\xD0\x9A\x88\x83\x03\xCE\xC4\xC3\xC6\x43\xB7\x1E\x3C\xEE\xBF\x1E\xC2\x9E\x03\x03\xD6\xC5\x87\x01\x82\xB7\x1E\x30\xA9\xA1\x1E\xF1\x99\x03\x03\x7B\x34\x5E\x56\xAB\xB7\x1E\x3C\xAE\xBE\x1F\xE2\xA1\x11\x57\xE3\x0C\x5E\x56\xD7\xC5\x0A\x53\x9B\x39\x19\xD3\x8F\x87\x02\xEE\xB5\x24\xBC\x85\xC2\xF0\x42\xB8\x59\x1E\xE3\x8D\x87\x02\xFA\xBD\x64\xC6\xC4\xB6\x7E\xC1\x67\x42\x5C\x62\x8F\x97\xC8\x06\x02\x8A\xB4\xC7\x53\x67\xB8\x3E\xD9\x69\x6A\x8F\xA0\xC8\x05\x03\xA2\xB5\xB2\xC3\xBA\xBE\x39\xD9\xC0\x02\xAE\x71\xC7\xEB\xC6\x00\x02\x10\xBB\x84\xC0", "\x00\x15\xE4\x9C\x90\xE2\x50\x82\x57\xFC\xC5\x32\xB9\x5A\xCB\xF2\xA6\x20\xC1\x88\x82\x57\x01\xC9\xF6\x48\x59\xBC\x86\xCA\x00\x01\x1B\x3E\x8C\xA5\xC8\xD1\x1B\x05\x01\x58\xBA\x64\x15\x23\xC2\xB5\x63\x8E\x9D\x0A\x61\x07\x7B\x30\x05\x06\x88\xC4\x66\x16\x29\x1F\x90\xC6\xC4\x8C\x57\x28\xC8\xB2\x5C\x8A\xCB\xA1\x16\x29\x27\x90\xD8\xC8\x0A\x03\xA4\xBC\x0D\xCA\x04\x0C\x45\xC8\x85\x36\x14\x30\xC8\x28\xC8\x03\x6A\x16\xCA\xD2\x65\x46\xC0\xCC\x36\x14\x3A\xC8\xA5\x6D\x35\xCA\x5C\x1D\x8D\xC8\xAD\x36\x29\x01\x91\xFA\x38\x31\x00\x39\xCB\x41\x07\x06\x04\x47\xD9\xC0\x31\x13\x56\xC6\xD1\x1B\xB4\xBE\x0F\xCC\x57\x06\x12\x60\x1C\x31\x13\x62\xC6\x60\xC9\x1C\x4D\x1F\xCD\x5D\x3F\x4A\x26\x24\xCE\xB9\x4E\xC7\x55\xC5\x48\xC8\xAE\x41\x9E\x0A\x36\xC6\x1C\xF5\x76\x83\xC9\xB3\x66\x98\xC5\x3C\x0C\x3F\xC6\x38\xDB\x01\x0B\x92\xAE\x44\x6A\xC5\x75\x14\xC0\xC1\x86\xCC\x03\x1F\x24\xF3\x66\x43\x18\x8E\xC8\xBB\x5C\x90\xC5\x07\x06\x4A\xC1\x15\x69\x88\x29\xC9\x61\xC9\x07\xCA\x41\x06\xED\xB8\x49\xC1\x4F\x30\x92\xE3\x57\x40\xC5\x1F\x01\x2B\xC8\x57\x45\x79", "\x17\x25\xC4\xBA\x40\xC4\xB0\xBB\x5A\xCA\x42\x01\x4E\xCB\xAE\x1B\x1C\xDA\x2F\x41\x00\xBB\xC8\xC1\x4F\xA5\x6E\x97\xCC\xB0\x4F\x22\xF6\x12\x49\xC9\x71\x4C\x55\x6C\x33\xC8\x4D\xC7\x2B\xCA\x14\x50\x93\xE2\x50\xB9\x6D\x69\xC8\xEC\xC5\xBD\x43\xF7\xA2\x26\xC7\x04\x6C\x6E\xD3\xC9\xDB\xC6\x1E\x3D\x08\x07\x4D\xC1\x10\xD3\x34\x53\xC9\xBE\xC7\x18\xCA\x6A\xBE\x9B\xCE\xDE\x33\x10\xF1\x13\x45\xC4\x38\xC5\xD5\x77\x22\xC8\x09\x01\x36\x02\x0E\x17\xE0\x38\x0A\x49\xC4\xC3\xC4\xDE\xBC\x9D\xC8\x73\xB8\x27\xCA\x71\xB2\xC9\xE5\x7B\x72\xCA\x7B\xC3\x42\xC6\x9A\x35\x24\xF1\x90\xA5\xBB\xFC\xC8\x00\x02\x9F\xC7\x8D\x5C\x49\xD1\x21\xCD\x01\x02\xCA\x66\x70\x7F\xCA\xDD\xC6\x70\xCE\x04\x10\x28\xEA\xE1\x04\xCA\x0C\x5E\x20\xC7\x13\x06\xA2\xCA\x10\x15\xE9\xAF\xB1\x05\xC7\x31\xC8\x28\x00\x47\xCE\x0E\x78\x51\xC7\x5E\x40\x89\xD1\x00\x23\xCB\x2B\x4D\x49\xCC\xB8\x50\x24\xDD\xFB\x89\x94\xE2\xAE\x12\xCA\xA1\x5E\xA3\xC0\x35\x89\x52\xC1\xD4\xAE\x8A\xA6\x33\x28\xC5\xF6\x49\x68\xB9\xA1\xCF\x81\x51\x29\xFB\xAB\x4E\xC9\xC6\x83\x9A\xC9\xDA\xAF\x66\xC6\x9A\x3B", "\x26\xFA\x71\x56\x00\x42\xCB\x45\xC7\x1B\x5A\x9C\xC1\xDD\x17\x02\x02\x95\xA7\x17\x3E\xCB\x88\x78\x90\xC6\xF0\xB9\x50\xD9\xE8\xAF\xB1\x70\xC9\x62\x50\x5E\x05\x16\x03\x91\xCD\xD9\xBF\x56\x68\x30\x00\x07\xA8\x32\x40\xCA\xF6\x14\x0B\x02\x54\xC9\xF4\xB0\x8C\xA8\x33\x88\xC9\x78\xCB\xD4\x12\xA8\xC7\xE4\x00\x2B\xF5\x87\x80\xCA\x98\x86\xA1\xCB\xB8\x1E\xAD\xCA\x2C\x80\x12\xDF\x01\x42\xCA\x8A\x2E\xBA\xCA\xA9\x58\x48\xC0\x06\x02\x2A\xC4\x4F\x7A\xCA\x7D\x5A\x20\xC5\x18\x02\xA8\xCE\xA5\x60\x2C\xF6\xA9\x70\xCA\x62\x00\xA1\xC8\x9E\x16\xB0\xC7\xCC\x40\x12\xCA\x7E\x89\xCA\x45\x76\xC6\xCB\xEE\x58\x48\xC4\x06\x02\x2A\xCB\x3F\x12\xCB\xC6\xC8\xE1\x11\x19\x02\xA8\xCE\x3D\x52\x2C\xF9\x94\xFA\x38\x66\x00\xA1\xC9\xA6\xC0\xB5\x59\x3A\xDA\xE3\x13\x7E\x89\xCA\xCC\x7A\xC9\xCA\x51\xC9\xBA\x18\x06\x02\x2A\xD6\xF9\x12\xCB\x4C\xCA\xED\x15\x1A\x02\xA8\xC6\xEC\x72\x2C\xE9\x93\xE9\xC8\x6A\x00\xA1\xCB\xD1\x7A\xB2\xC8\x55\xC8\x10\xC1\x21\x8B\xC9\x6C\x01\x7A\xC9\x09\x87\x66\xCA\x35\xD0\x2B\xFD\x7E\x89\xCA\x2E\x44\x76\x36\x05\xC9\x91\xC1\x96\x83\xEB", "\x92\x04\x73\x00\x42\xCA\x76\x37\x15\xCA\xAD\xC9\xC8\x8E\x2E\xCF\x04\x55\xBF\x09\xCA\x76\x37\x17\xCC\xBA\xCC\xF3\x96\x2E\xF8\x3C\xD1\xCB\x5A\xBC\xA0\xCA\x60\x36\xBB\xC3\xFE\x80\x2F\xCB\xE1\x40\xC4\x83\x00\xF2\xCA\x41\x07\x10\x06\x5E\xC9\x15\xE2\x97\xD0\xBE\xEA\xCB\x82\x00\x23\x02\xA8\xCE\x9D\x51\x4A\x71\x90\x8B\xC8\xD0\xC7\xD9\x31\x62\x4F\x36\x5A\x40\xCF\x1E\xC1\x88\xAE\x44\x89\x4A\xEF\x50\x24\xCD\xF4\x42\x49\xC2\x3C\x61\x2D\x21\x24\xFD\xCB\x02\xCC\x03\xCA\x6F\xC8\x44\xDA\x5E\x0D\x02\x4B\xC8\xB4\xC4\x86\x5F\x72\xCC\xBB\xC6\x10\x15\xFF\xB4\x90\x96\x01\x42\xCB\x9F\x57\x74\xC9\xAB\xC1\xEB\xBA\x23\xC6\x04\x1D\x01\x19\xCD\x32\xC5\xCB\xC7\x21\xCE\x61\xC5\x08\x24\x02\x21\xCC\x9B\xC5\xF7\xC8\x01\xC4\x86\xCB\x0A\x08\x31\xF3\x89\xD5\xC9\x05\x02\x56\x01\x89\xC8\x00\x02\x0B\x0E\x31\xC2\x90\x6F\xCB\xB3\x01\x19\xCD\x2E\x02\xA8\xC2\x38\xD0\x2B\xFA\x02\x10\xCC\x00\x3A\x5E\x04\x13\x5B\xC2\xCC\x61\xCF\x08\x3D\x02\x33\xCC\xC3\x00\x1E\xCD\xA3\xC0\xC6\xC0\x8B\xB3\x31\xCA\x03\x4A\xCC\x21\x6E\x75\xC6\x41\x03\x19\x03\x63\xD1\x06\x10", "\x99\xD6\x6F\x70\xCA\x69\x03\x8C\xC8\x1B\x07\x65\xDF\xBF\x4C\x99\xD9\x01\x33\xCC\xDA\xBD\x42\xCC\x89\x57\x47\xD1\x6E\x20\x03\x33\xCC\xE6\x00\xA1\xCA\xE2\xC0\xAE\xC7\x0E\x00\x32\xD7\x8F\xDA\x74\x44\xCC\xDF\xC8\xC7\xB3\xC6\xC8\x03\xC9\x28\xF8\xBC\x1B\xCC\x72\xCD\xB1\xB7\x8C\xCF\x1E\x0A\x66\xC2\x31\xC0\x89\xC4\xC0\x34\xC8\x24\xC2\x9D\xC9\xBC\xC3\x53\xD9\x0A\x33\x98\xA7\xBF\x83\xCD\xF3\xCA\xE1\xC7\xF5\xB4\x43\xCC\x00\x2A\x06\x1A\xC4\x38\x5F\x32\xCE\xF6\x15\x01\x0A\x1A\x17\xC7\x13\x00\x0F\xCD\x64\x0D\x60\x5A\x58\xCA\x38\x14\x01\x18\x34\xDB\x28\x3D\x80\x80\x07\x60\x59\x5A\xCD\xC8\xCD\xBD\x5E\x34\xE8\x42\x41\x81\xA1\xCD\xB7\xCA\xF1\xC7\x19\x66\x6A\xC0\xCC\x2A\x04\xA9\xCD\x75\xCA\xC3\xC5\x1A\xC1\xA1\xC3\x1A\x90\x35\xFB\x95\x86\xC7\x18\x01\x56\xCC\xB6\x32\x5F\x36\x6B\xC1\x2C\xC6\x8E\x99\x00\xBA\xCD\x0C\x32\x72\x85\xD7\xC7\x58\xCB\x35\xC4\x88\x41\xCD\xED\x34\xE6\x4C\xB1\xCD\xB1\xC6\x38\xDB\x00\x08\x9B\xAE\x44\x1B\x1B\x65\xCF\x64\xCE\x70\xCC\x01\x0F\x36\xF3\x66\x27\xC5\x33\x75\xCC\xCB\x7C\x0D\x03\x06\x6D\xC1\x15\x5C\x09", "\xD2\xCD\x9F\xCB\xE8\x1B\x1B\xC1\xA1\xC5\x2E\x92\x36\xE5\x96\xD1\x1B\x1F\x01\x6E\xCC\xAE\x42\x86\x12\x6D\xCB\x2D\xDA\x2F\x74\xC0\x09\xCA\x3A\x1A\xB4\xC9\xB6\xC2\x9C\x01\x01\x2A\x9B\x82\x4F\x42\x14\x69\xCF\x6D\xCC\xB9\xCC\x64\x17\x37\xF1\x99\x09\x4A\xD2\xCD\xDE\xC8\xAF\x53\x04\x08\x6C\xC4\x01\x2A\x06\x42\x03\xD4\x86\xC0\x05\xE6\xC0\xAE\xC6\x02\x1E\x37\xF9\x97\xA1\x45\x31\x51\x38\xCC\xAF\x57\x04\x0A\x1A\x14\x14\xCE\x9C\x81\xC4\x31\x50\x3C\xCC\xAF\x54\x05\x05\x71\xCD\x11\x17\x9C\xBC\x05\x31\x51\xED\xC8\xA9\xCC\xFF\x6D\x71\xCD\xC3\x5F\x9C\xCA\x6F\x70\xCA\x4C\xC1\x8B\xC5\x20\x0A\x03\x07\x39\xD5\xE4\x70\xC8\x20\x09\x92\xCC\x94\x0E\xE5\xCC\xD8\x72\x34\xC2\x27\x24\xC1\x2B\xCF\x1B\x10\xCD\xCB\x5E\x79\x8F\x49\x23\xF8\x97\xFF\xCB\xB3\x33\xE4\x48\x84\x31\xC1\xC4\x60\xC5\x3A\xC2\x9E\x2E\xC7\x70\xCB\x22\x02\x6A\x03\x50\xC9\x81\x2B\x31\x52\x9C\xED\x4B\x48\x01\x4A\xCF\xDE\x7B\xE7\xC2\x53\xC9\xB5\x70\x95\xCF\x00\x52\xCE\xE0\x80\xD5\xCA\x44\xCE\x74\x72\x32\xC5\x04\x67\xBB\x34\xC8\x2E\x03\xD6\xC9\xE7\x58\x65\xC6\x36\xD6\x15\x59", "\xCE\xC7\x17\xB1\xCF\x8A\x48\xE6\xC9\x5C\x88\x3B\xF0\x1E\xEA\xCE\xDB\xC5\x18\xCB\x1A\x06\xED\xC2\xA7\x83\x3B\xF5\x8E\xF0\xCA\x72\x01\xA5\xCC\x13\xCD\x61\xCE\x44\xC5\x34\xFD\x34\xF4\xCE\x05\x03\x3D\x02\xDD\xCB\xC9\xC3\x62\xD6\x7B\x80\x9E\x90\xA0\x83\xCF\x28\xCF\x7B\xCB\x10\x07\x78\xC9\x04\x09\x9E\xE5\xCE\x5E\xCE\x6E\x1F\xE1\xC8\x12\x0F\x78\xDE\x32\xC5\x9E\x82\xC6\x87\xCF\x4B\x01\xE5\xCD\x9D\xC6\x76\xC6\x08\x04\x84\xB4\xC8\x1A\xC3\x1B\xC9\x80\xC4\x77\xC0\x57\xD5\x08\xD2\x90\xBF\xCE\xBC\x04\x79\xC7\xD3\xCA\x8F\x32\x0A\x07\x3C\xE8\x02\x63\xCE\xF2\xC4\x8D\xCD\x7B\x49\x15\x07\x78\xCF\x05\x30\x9E\xFE\xCC\x86\xC6\x58\x03\xE1\xCE\x16\x07\x7B\xC9\x31\xFE\x9D\x85\x02\xB7\x01\xC3\xCD\x2F\x05\xF7\xCF\x62\xD7\x3C\xD0\x60\x87\xCF\xC4\x00\xE2\xCF\x8D\xCF\xF7\xC7\x8C\xA7\x3C\xD8\x85\x89\xCA\xC3\xC7\xCE\xCD\x41\x07\x2C\xC2\x7A\xCD\x12\xE2\xC3\x5B\xBE\x70\xCA\xB6\xC2\xBD\x51\x1A\x03\x76\xCF\x40\x72\x9E\xFA\x38\x7A\xC2\x7B\x56\x35\x05\xFB\xC8\x7B\xD1\x21\xD7\x03\x32\xCE\x07\x03\xC1\xC0\xF4\xCC\xD0\xCC\x64\xDC\x06\x28\x9F\x86\x02", "\xE0\x00\xF2\xCE\xA2\xC9\x86\xC1\x0E\x0F\x3F\xC5\x04\x65\x01\xF2\xCE\xF7\xC8\xF3\xCE\x1C\x06\x7F\xC0\x00\x2A\x03\x63\xCE\xA9\x1A\x73\xC7\x41\x03\x1D\x03\x76\xCE\x11\x69\x36\x2B\xCF\xD1\x1A\x76\x01\xFF\xC8\x1E\x00\x80\xC4\x3C\xC0\x89\xF1\x01\xFD\xCF\x7A\x01\x03\xD2\xF1\xCC\x7C\xD6\x07\x3D\x9F\x8B\xC3\x09\xCB\xD4\x18\x1A\xCC\xDF\xC0\x00\x1B\x07\x3D\x9F\xF5\x0F\x1A\xC5\xD4\x18\xDB\xCA\xCC\xBC\xAF\x49\x0E\x21\xA0\xF1\xCE\x69\xC9\x02\x01\x72\x02\x6F\x09\x00\x06\x41\xE4\x19\x26\x62\x4E\x2A\xA2\xCE\xE0\x4A\x01\x09\x1C\x1B\x34\xC0\xCB\x33\xC7\x1C\xD0\x06\x02\x0B\xD1\xC2\xC8\x2B\x68\x40\xD3\x9A\xAB\xD0\x71\x07\x1D\xD0\x2A\x27\x95\x2F\x7D\xD1\xEB\x80\xA1\xCF\x61\x42\xD0\xC0\x33\x2B\x2A\xE4\xC9\x67\xC8\x73\x47\xA1\xEE\x5E\x49\xD0\x6C\x37\x2B\x2B\x03\xD4\x61\xC4\x1C\xCF\xA1\xBB\x62\x51\xD1\x0C\x33\x2B\x2B\x04\xD1\x02\x17\x42\xDE\x89\x59\xD0\x8C\xC8\x14\xD0\x07\xD6\x04\x0E\x85\xC9\xB5\x60\xA1\xAE\x44\x6C\x22\x01\xD2\xCE\x6F\x0C\xDE\x5F\xDC\x15\x2C\x45\x3E\xD0\xC2\x12\x16\x01\x19\xD3\xE9\x0C\x86\xC1\x15\x6C\x45\x45\xD0\xDA", "\x17\x18\x03\x1C\xD5\x06\x05\x87\xD8\x15\x6C\x45\x4C\xD0\x67\xBB\x39\xD2\x0E\x05\x0F\xD2\x78\x4C\x8B\x14\xA1\xA3\xCE\x20\x09\x39\xD3\x0F\x04\x10\xD1\x67\x4C\x8B\x23\xA0\xC0\x00\x73\xD0\x22\x00\x23\xD2\x0C\x5C\x16\x36\x39\xF3\x17\x45\x00\x73\xD1\x24\x03\x24\xD1\x40\xCC\x3C\x76\x41\xE7\x11\x4A\x00\x9B\xD0\x5E\x04\x0F\x88\x70\x0C\x3C\x79\x49\x4D\xA1\x80\xC4\xD6\xCF\x35\x69\xBA\xC7\xBD\xCB\x04\x01\x45\xC6\x13\xB7\xC6\xCC\x66\x83\xC9\x1A\xCC\x09\x0E\x8A\xCD\x9B\x13\x88\xCC\x67\x0D\xCB\x34\xC9\x13\x05\x16\xD1\x53\x8E\x15\xCC\xCF\x23\xC9\x69\xC8\x27\x00\x2F\xD7\x20\x0E\x58\x84\x45\xD9\x94\x86\xC7\x4F\x01\x61\xD2\x81\x8D\x85\xC8\x42\x68\xFA\xB0\x95\xD0\x00\xCA\xD0\x2D\x8F\x2D\xD1\xBD\x41\x43\xD1\x02\x11\xA3\x9F\x8D\xD3\xD1\x9C\x59\x4B\xCF\x1A\xDE\x6D\x86\x46\xF0\xBE\x11\xCF\x53\x01\x6B\xD0\xCC\x8E\x1B\xDC\x20\xCC\x32\xD4\x01\x57\xD1\xAE\x8E\x72\xD1\xBE\x54\xC9\xC5\x05\x17\x46\xC4\x20\xEA\xD1\x3C\xC9\xF7\xCA\x15\x07\x1A\xD5\x85\x90\x47\xC3\xB8\x40\xC4\x57\x01\x6B\xD2\x1F\x56\x1E\xD2\x55\xC6\x1C\xD8\x01\x57\xD1\xFB\x90", "\x7E\xD2\xC0\xCD\xBD\x49\x05\x00\x43\xDA\x01\x35\xD0\x35\x55\x09\xC7\x10\x1E\x14\xD2\x83\xCB\x30\xC6\x9D\xF1\x4C\xAF\xC8\xB8\xC8\x17\x01\x39\x0C\x74\xCD\xD7\x29\x88\x70\xD0\xF3\x0B\x2F\x01\x72\x07\x1E\x35\x06\x17\x46\xE9\x88\x78\xD0\xC2\x12\x33\x03\x46\xD4\x12\x9E\x91\xC5\x3F\xE9\x91\xED\x00\x23\xD3\x06\x99\x49\xD6\xF7\xCC\x64\xD4\x03\x29\xA4\xD5\x9D\x2B\xD3\xE2\xCC\x90\xC3\x0F\x0F\x92\xC9\x7B\xB1\xA4\xCB\xCF\x4C\xCC\x41\x01\x4D\xD6\x20\x08\x08\x17\x46\xE0\x1F\x6A\xD0\xE1\xBF\x6B\xD2\x8B\x40\xFC\x08\x91\xC7\x23\x0A\x02\x73\xD0\x8E\x00\x9F\xD2\x03\xD6\x70\xCF\x08\x13\x43\xD3\x02\x4A\xD2\x14\xD0\x26\xCC\x25\x03\x0E\xD8\x09\x10\x4A\xD0\x9E\xEF\xCB\x99\x01\x39\xD1\x27\x06\x2A\xD6\x79\xC0\x12\xDE\x02\x73\xD0\xA2\x00\xAE\xD0\xE7\xC9\xF2\xC3\x0A\x13\x43\xE7\x02\x57\xD1\xBD\xC8\xB8\xC8\x2A\x02\x28\xD3\x9B\x35\x3C\x05\xA5\xBC\x05\xA9\x01\x39\xD1\x2B\x00\x2D\xDB\x94\xD1\x21\xEE\x02\x73\xD0\xB2\x00\xBA\xD1\x54\xD6\xF8\xC0\x00\x13\x05\x33\xA1\xB7\x01\x7A\xD3\xAB\xD0\xF3\xC8\x17\x03\x87\xDC\x05\x01\xA6\xDD\xD2\x86\xC7\x5E", "\x03\x1C\xD1\x18\x07\x98\xC3\x4B\xEF\x97\xC2\x01\x73\xD0\x63\x03\x35\xD0\xF4\x4B\xCA\x0D\x48\xCF\x9C\x8F\xD2\x62\x51\x4B\x6E\x4D\x36\x32\xD0\x74\xCA\x30\xE2\xA1\x2A\x6D\x26\x63\x01\xCF\xD7\xC5\x0D\xD2\x62\xD7\x26\x6A\x6A\x18\xD3\x9D\xD2\x5C\x44\xDB\x6C\x79\x62\x9A\xCE\x48\xE3\xA6\xA1\x45\x13\x1B\x74\x18\x67\xD1\x15\xD8\x0A\x25\x64\x26\xA9\x77\xCB\xA4\xD3\x0D\x17\x3D\xC8\xAE\xC7\x0C\x0C\x4B\xE1\x8A\x17\x70\x6F\xD2\x73\xB3\x1C\xD4\x19\x07\x8D\xD7\xC0\x60\xA4\xF3\x0B\xCD\x01\x39\xD1\x34\x05\x38\xD6\x92\xDC\x40\xD2\x03\x73\xD0\xD6\x00\xE6\xD0\x4B\xD4\x2F\xD7\x0D\x13\x43\xDB\x03\x52\xD3\x32\xD2\xC3\xC4\x37\x03\x0E\xD0\x0E\x18\x4E\xF8\xA4\xFC\xD2\xE1\x01\x39\xD1\x39\x07\x1A\xD8\xC1\xB0\x2B\xE8\x9E\xE4\x0C\x47\x4A\x4F\xD0\xAF\x06\x1C\x07\x8D\xC3\x16\xE7\x74\xFC\xB7\x91\xCF\x73\x03\x35\xD3\x4E\x90\x38\x07\x2A\x72\xA2\x9C\xD0\xE8\x01\x6B\xD3\xC6\x95\x3E\xD8\x09\x80\x12\xE9\x03\x57\xD1\xCB\x96\xFE\xD3\x6D\x58\x48\xCA\x0E\x17\x46\xC6\x32\x82\xD4\x2D\x5E\x20\xC7\x3A\x07\x1A\xD9\xCF\x88\x50\xC7\x04\x20\xCA\x69\xC8\x76\x03", "\x35\xD4\xB7\x9E\xA0\xC3\x6C\x40\x89\xED\x01\xD7\xD0\x3C\x9D\x85\xD6\xEC\x50\x24\xCE\x07\x17\xA3\xD0\xC5\xCC\xD1\xA3\x4A\xB6\xCF\x8C\x0F\x0E\x17\x46\xE6\x3B\x9B\xD4\x96\x37\xC8\xCC\x3C\x07\x1A\xD5\xEF\x88\x51\xE7\x9B\xDA\x17\xF1\x01\x6B\xD1\x2A\xAF\x66\xC7\x54\x4E\x37\xC2\x27\x72\x01\xD7\xD1\x82\xA8\x8A\xD4\xDE\xC3\x5F\x13\x07\x17\xA3\xE5\x9F\xAE\xC5\xA3\x4B\xBE\xCD\x0A\xD0\x00\x14\x07\x17\xA3\x85\x1A\x28\xD5\x81\xD2\x1E\x3D\x1E\x00\x86\xD6\x07\x08\xA4\xE4\xA9\xCF\x55\xA0\xAF\xC6\xB1\xF2\xC8\x0F\x09\x0E\x15\x8C\xF9\xA9\x1C\x61\xA0\xAE\xCF\xB1\xF2\xC4\x00\x0C\x0D\x17\xA9\x8A\x02\xAA\xA3\x78\x09\xD0\xAC\x87\x80\x24\xD0\x00\x2C\x06\x08\xCC\x12\x02\xB4\xA6\x69\x31\xE8\xA9\x8A\x3C\x55\x5D\x00\x67\xD4\x64\x0D\xCE\xC7\xB0\x59\xE8\xA7\x32\xCC\x3E\xEA\x00\x70\xD4\x1B\x15\xEB\xAE\x67\x59\xE8\xA0\xB1\xB1\x3C\xF7\x00\x78\xD4\xA8\x21\x57\xB3\x9A\xD3\x79\xB0\x57\xC4\x02\x1E\xA9\xE4\x0C\x18\xB4\xAC\x21\xD0\xAA\x0A\xA0\x24\xD0\x02\x00\xAA\x80\x33\xF0\xB4\xDE\x59\xD0\xAF\x5B\xCF\x5E\xDD\x02\x0F\xAA\xD8\x35\x3A\xB7\x39\xD6\x76", "\xA2\xFA\xCE\x7D\x97\x54\xD9\x60\x4D\xBB\xFE\x5B\xA0\xAF\x9C\x90\x48\xC7\x07\x1E\x54\xED\x6B\x09\x00\x61\x07\x41\xD4\xD4\x90\xAE\xC4\x08\x06\x55\xEE\x88\x17\x00\xA9\xD4\x92\xB9\x41\x05\x17\xAC\x7C\xD1\x04\x2E\xAA\xB3\x33\x25\x01\x58\xD7\x13\xBF\xB5\x7C\xA9\xDE\x04\x2C\x06\x7C\xCB\x76\x1D\xB0\x04\x6A\x31\xE8\xA5\xEF\x80\x12\xEC\x02\x37\xD5\xA1\x44\x21\x02\xAE\xD1\x94\xBF\x10\x13\x51\xEF\x97\xB9\x01\xC8\xD4\x5C\x46\x48\xCA\x52\xD4\xB4\xB0\x2B\xC6\x03\x07\xD5\x1B\x14\x2F\x01\xD8\x02\x4C\xD7\xB5\xAC\x3E\xD2\x03\x58\xD5\xA8\x21\x35\x03\xB6\xD2\x56\xD5\xF8\x6A\x0D\x00\x89\xDE\x01\xBF\xD4\x32\x0C\x76\xC8\xAC\x51\x74\xAE\x02\x26\xAB\x86\xC7\xEC\x01\x74\xD7\x86\x10\x11\x01\x36\x0C\xD7\x01\x5D\x9F\xC6\xEF\xCA\x7D\x01\xB4\xD2\xF0\x48\x09\x0B\x56\xE8\x74\x8F\x02\x03\xC6\xE6\xCF\x01\x01\x56\x08\xA6\xCF\x08\x26\x02\x7E\xD5\xE4\xB8\x69\x79\xE4\xCC\x02\x01\x2B\x00\x56\xF5\x5C\xC2\xD5\xE4\xD4\xD7\x8C\x90\xC2\x04\x04\xB0\xC4\x33\x09\x99\xD4\xD5\xD8\x92\x4E\xD7\x0B\x05\x62\xDB\xA1\x16\x32\xD8\xAC\xB6\x82\xEF\xD4\x52\xC9\xC3\xD4", "\xCC\x02\x66\xCC\x57\xEE\x04\xA1\xD6\x69\xC8\x25\x03\xC8\xD3\x43\x1F\x0E\x15\x57\xE4\xAB\xD0\x00\x28\xD6\x0E\xD0\x16\x03\x65\xD5\x16\x2E\x59\xFB\xAA\xEA\x80\x31\xD6\x22\xD6\x19\x04\x66\xD0\x98\x31\x02\xF1\xB1\x41\xAE\x49\x30\x5E\x54\x1D\x04\x67\xD8\xAD\x29\x37\xF9\xB2\x41\xAE\x66\xCB\x9C\xD0\xD1\xD1\x03\x3E\x02\x0A\x0D\x03\xAB\xF9\xAA\x9C\xD4\x48\x00\xC7\xD2\x21\x0D\x09\x11\x15\x28\x10\x2A\x03\xAA\xD4\xB2\xC4\xA7\xD7\x13\x03\xB5\xC7\x08\x2C\x02\x56\xD6\xB8\x7A\xAC\xD4\xB9\xD1\x6A\xCF\x5E\xCE\x05\x1D\xAD\xE4\xC7\x60\xD7\x59\x4E\xD8\xD7\x66\xD5\x10\x19\xA4\x91\x9E\xBD\x01\x67\xD7\x82\x02\x32\x01\x6D\xD0\x69\x8B\x5B\xCC\xAB\xA0\xAC\x70\xCA\x66\x01\xDC\xD0\x00\x09\x0D\x14\x5B\xC7\x04\x75\x00\x76\xD7\x7F\xD7\x22\x80\xAE\xCB\x0D\x0B\x5A\xC0\x00\x69\x01\x7E\xD6\x83\x00\xE3\xC9\x97\x50\x81\x79\xEF\x3C\xAA\x6B\x01\xB1\x04\x21\xC5\x9C\x4A\x80\xB6\x9E\xD9\x4D\xE8\x42\x03\xB8\x53\xD5\xF7\xC8\x3B\x01\x56\x03\x39\xD8\x15\x76\x83\xD8\x22\x03\xB9\x2D\xD7\x7B\xCF\x1E\x0C\xB9\xC4\x33\x26\x9E\x84\x57\x03\xB8\x32\xD6\xE1\xC2\x00", "\x0E\x83\x3F\x52\xDE\xAD\x81\xD7\x06\x03\x01\xB9\x9B\xD5\xBD\x4E\x00\x0D\x5D\xE4\x19\x3D\xC2\x9E\x5B\x01\xB9\x9D\xD4\xC9\xCA\x01\x16\x5D\xDB\x28\x48\x01\xB0\xD6\x41\x57\xC3\xB4\xE1\xCE\xBB\xC8\x85\x23\x9F\xBC\x5B\x03\xB8\xE8\xB4\xF3\xCA\x06\x0E\x83\x3D\x5C\xC2\x9E\x64\x01\xAA\x03\x78\x0B\x00\xBC\x51\xD6\x38\xDD\x01\x05\xAF\x80\x33\x10\xD0\xE4\xD6\x44\x04\x52\xDC\x7C\xC9\x02\x17\xAF\xC4\x36\xC1\xD6\x58\xB7\xA6\xD1\xF2\xC5\x05\x1F\x5E\xFE\x91\xC9\x03\xA6\x33\x01\xBB\xA8\xD6\x70\xC1\x06\x06\x5F\xED\x6B\x47\xBC\xDA\xD7\x55\xD4\xA7\xD5\x0D\x0E\xBE\xCE\x11\x69\x00\x68\xD7\x53\xAF\x5D\xA0\xF3\xC9\x0F\x05\xBF\xD3\xCD\x37\x00\x78\xD7\x6D\x70\xCF\x78\x5C\xCD\x10\x0E\x83\x25\x58\xE9\xE9\x49\x03\xA8\x33\x01\xB9\xB1\xD6\x70\xC2\x09\x1D\x5F\xE1\x8A\x67\xD1\xF1\xD6\x85\x02\xB3\xD4\xF9\xCE\x09\x0E\x60\xF8\x8A\x62\x00\x00\xD9\x8E\xC9\xB5\xD4\x53\xDA\x0A\x0D\x5E\xE4\x19\x70\x00\xC9\x02\xE9\xD5\xB7\xD4\xC9\xC5\x0B\x1E\x60\xDB\x28\x7D\x00\x21\xD9\xFC\xD4\x4C\x51\x67\xD8\x88\xC6\x03\xC5\xB0\xE4\x0C\x47\xD3\x38\x5B\x00\xBE\x5D\xDC", "\xA9\xCD\x06\x2F\xB0\x9B\x14\x9A\x01\xE4\x00\xBB\x33\x80\xB8\xAF\xCC\x3E\xDA\x03\x16\xD8\x82\x4E\x55\x01\x06\xDF\x20\x03\xC0\xA1\x58\xCC\x99\xE6\x01\x40\xD9\x38\x4C\x61\xD1\x82\xD2\xD2\x6F\x2F\xF2\x03\x37\xD8\xA8\x20\xC9\xD1\x2E\x5B\x80\xB2\xB1\xC6\x1C\xFF\x03\x49\xD8\x62\x51\x6A\x03\x10\xD9\x76\xD2\x11\x1A\x4E\x80\x89\x8B\x00\x77\x06\xD7\xD7\x75\xBB\x8B\xD2\xBC\xDF\x0B\xAC\xB0\xA7\xD1\x73\x5D\xBB\x06\x01\xDD\x6B\xBA\xC3\xCA\x61\xFA\x04\xE7\xD8\xBC\x54\x12\x02\x1A\xDC\xCC\x01\x00\x0C\x0D\x3B\xB0\x92\x02\x30\xD6\x4E\xD5\x0C\x03\x8E\xDB\xA1\x11\x00\x36\xB1\xEE\xD8\x38\xD6\x4E\xD6\x0F\x04\x8F\xD3\x84\xDF\x63\xC1\xB0\xAA\xC3\x70\xCB\x25\x00\x21\xD8\x30\x31\x03\x0C\x0D\x09\xB0\xA3\x71\x70\xCA\x2C\x03\x22\xD8\x5B\x30\x04\x0E\x64\xC0\xB2\x98\xAA\x70\xCB\x32\x01\x18\xDF\x4B\x97\x37\x02\xAB\x32\xAB\x9A\xD8\x0F\x02\xBF\xA8\x90\xC3\x0E\x0B\xC9\xCE\x7F\x9D\xB2\xC1\x14\x9F\xD8\x22\xDA\x44\x04\x6C\xDC\x7C\xC1\x04\x25\xB2\xE0\xD4\xA7\xD9\x87\x03\x1A\x01\x95\xDC\xC5\xD8\xA4\xB0\x95\x8F\x01\xAF\xD9\x98\x35\x2C\xDB\xDA\x94\xCB", "\xC5\x63\xF8\xAD\x9C\xD5\x9D\x01\x5C\xDA\x41\x01\x15\x0B\xCB\xD8\x88\xBD\xB2\xE2\xD7\x66\x80\xB8\xCB\x2A\x03\x92\xD5\x10\x18\x05\x05\xB3\x86\x02\x95\x00\x4B\xD8\xD6\xAC\xAA\xB1\x79\xDA\x05\x37\x0D\x12\xD7\x62\x50\x33\x4C\xF4\x2C\x57\x5B\x0B\x17\x66\xD2\x04\x3C\x01\xCF\xD9\x0C\x30\x1E\x51\x73\xDC\x7C\xDE\x05\x37\x0D\x4E\xD7\x71\x4C\x52\x02\xA9\xD0\x0F\x52\xBA\xCC\x3E\xC9\x03\x67\xD9\x64\x0D\x58\x03\x3A\xDE\x8B\x8F\x5E\xD4\x06\x02\xB3\x99\x30\xBE\x01\x63\xD8\x1E\x53\x76\xDA\xC7\x20\x07\x37\xB3\xED\x35\xCC\x00\x7D\xDA\xC9\xC0\xAE\xCC\x0E\x1F\x67\xEE\x88\x5A\x01\x02\xDB\x84\xB4\x5C\xC8\x1F\x06\xD0\xD3\xCD\x28\x03\x09\xDA\xCF\xB6\xB8\xC8\x01\x06\x75\x08\xCE\xC2\x43\x76\x03\x73\xD9\xA3\xA0\x4E\xD7\x03\x06\x75\x02\xC6\xC1\x2A\x46\xAE\xF8\x50\xDC\xD6\x26\xCF\x06\x04\xA3\xD4\x66\x11\x00\x1F\xB4\xE3\xD7\xEF\xCB\x13\x00\x49\xDB\x43\x1F\x01\x07\x69\xE9\x29\xF0\xCA\x33\x01\x95\xD8\x2A\x25\x05\x0E\xD2\xCA\x08\x1B\x2C\xB9\xC9\x32\xDA\xC0\x33\x0E\x05\xA6\xDD\x2D\xCC\x45\xF9\xB4\xD8\x35\x49\x00\x9E\xD8\x64\x7F\xBD\xC7\x05\x0E", "\x1D\x2B\xB1\xD4\x37\xB1\x04\xD4\x30\x1E\x53\x81\xD1\x43\xC4\x03\x3F\xB4\x99\x30\x3B\xD6\xDE\x58\x1E\x53\x82\xDC\x64\xD0\x03\x0F\xB5\xED\x35\x43\xD6\xA9\xDB\x06\xD9\xF2\xCC\x07\x14\x68\xE4\x19\x02\x01\x7B\xD6\x3C\x50\xD4\xB4\xF9\xC7\x08\x1E\x6A\xDB\x28\x0F\x01\x61\xDB\xA9\xCC\xA7\xD2\x12\x06\xD4\xC4\x33\x1C\x02\x31\x05\xEC\x34\x3C\x50\x0D\xD9\xF2\xCF\x09\x0D\x6B\xDB\x28\x5F\xD6\x71\x58\x3C\x51\x0F\xDC\xC9\xCC\x0A\x17\x6A\xEE\x88\x3C\x01\x42\xDB\x82\x02\x11\xDC\x2F\xD8\x0B\x1E\x6B\xF3\x66\x73\xD6\x5A\xDA\x50\x79\xE4\xCC\x18\x06\xD7\xC8\x85\x18\x03\x49\xDA\x66\xB9\xD1\x8C\x5C\xC9\x1A\x06\xD8\xC1\x15\x67\x03\x01\xDB\x00\x00\x2F\xDA\xE1\xC5\x1B\x05\xD9\xD8\x15\x75\x03\x18\xDB\x52\x00\x38\xD9\x7B\x49\x1D\x0D\xD8\xC0\xCC\x03\x00\x3E\x30\x71\xDB\x93\xD4\xA7\xD6\x1E\x05\xDA\xD8\xD6\x13\x00\x28\xDB\x91\xDA\x33\x82\x68\xDA\x8F\x33\x00\x13\x0B\x07\xB5\xE3\x67\xB0\xDB\x5F\xBB\x22\x83\xB6\xDC\xD7\xB6\x6D\xE4\x19\x33\x00\xB9\xDB\x1D\x72\x4A\x74\xC9\xCD\x01\x1E\x6D\xDB\x28\x43\x00\x3E\x30\xA5\xD8\x24\xDC\x53\xDA\x02\x06\x6E", "\xE8\x42\x52\x00\xC9\xDB\xD8\xDA\x42\x05\xA4\xA0\x24\xD7\x01\x33\x05\x36\x0A\x43\x01\xB9\x00\x66\x16\x07\x36\x9A\x38\x43\x62\xB2\x86\xC7\x45\x01\xEB\xD8\x30\x82\xBB\xD5\xA3\x5C\x6E\xD2\xB7\x87\x02\xAC\xD8\x26\xCF\x14\x02\xBC\xDD\x3D\x84\x6F\xCF\x04\x7D\x00\xE6\xDA\xDD\xD9\x46\xC0\xAE\xC1\x06\x0C\x6F\xFE\x22\xEE\xDB\x5C\xA3\xF8\xDA\x70\xD8\xC7\xAC\xA9\xCF\x03\x36\xB7\x87\x02\x7B\x00\xFC\xD8\xC8\xA2\xBF\xD6\x7B\xA3\x5C\xDC\xAA\xFD\x00\xCE\xDB\x09\x1A\x80\xDE\x20\x07\x0A\x11\x6E\xC5\x75\x80\x00\x62\xAE\x20\xC4\x23\x03\x2E\x08\xCD\xC1\x10\xD5\x32\x78\x50\xAD\xD3\xCB\xD3\x6B\xD0\x57\x4F\xCE\x19\xE9\x40\x89\x8D\x01\x14\xDD\xBD\xCF\x43\x07\x9D\x13\xA4\x48\x63\xC0\x00\x0E\x01\x21\xDC\x1E\xD1\x9B\xBB\x23\x7C\x7C\xCF\x04\x29\xB8\xC1\xCC\x8E\x21\x52\x70\x5C\xC8\x12\x0F\xE2\xCF\x33\xFE\x69\xC9\xD9\x9C\xD5\x48\x01\x8D\xDF\x4A\xAB\xE0\xD9\xC0\x3D\x71\xDA\x35\xB3\xD2\x89\x00\x25\x05\xC7\xDD\xAE\x28\x61\x3A\x72\x3C\x55\x96\x01\x1D\xDF\x81\xC4\x57\x09\xB4\xC0\x00\x1C\x73\xD6\xD8\x96\xD6\xC0\x33\x91\x19\xB4\xCC\xA9\xD7\x04\x0A", "\xB9\xED\x35\xB6\x00\x1F\x30\xE0\x07\xC8\x18\x34\x54\x4D\xF6\xB8\xDF\x72\x5F\x74\x4E\xD6\x8B\x40\x13\x04\xE4\xCE\x11\x4A\x5E\x54\xDC\x91\xCE\x4D\x03\x95\xDE\x45\x47\x0B\x1A\x72\xFA\x77\x93\x31\x91\xCF\x4D\x03\x9A\xD9\xCA\xD6\x10\x1E\xD2\x47\x89\x41\xDC\x2A\xDD\x7D\x75\x41\x04\x9C\xDC\x64\xDC\x04\x33\x05\x15\xDA\x01\xC4\x5C\x00\x14\xDA\xCF\xD0\x00\x0D\x67\xCC\x99\xA7\x01\x7F\xDC\x32\x0D\x31\x03\xD0\xD3\x1E\xD8\x22\x9C\xAA\xB2\x01\xFF\xDA\x6C\x36\x34\x04\xC0\xDD\xE8\xD6\x4D\x11\x9E\xBE\x01\x91\xDD\x0C\x30\x38\x04\xD2\xDD\xAE\x6A\x08\x3B\xAE\xFC\xD2\xCA\x01\x4C\xDD\xBB\x36\x1D\x0C\xE9\xD4\xD7\x45\x04\x7D\xD4\xEF\xCA\x6B\x02\xA8\xDE\x45\x4C\x0F\x05\x75\xF8\x29\x4A\xD7\x4C\xCC\x71\x01\xA2\xDB\x43\x1A\x00\x0C\x66\xE6\xBA\x80\x00\xD4\xD7\x18\xC9\x3B\x03\xD5\xD0\x39\xD7\x1B\x26\x66\x78\x14\x21\xDA\xBE\xD1\x3E\x04\xD7\xDE\x4A\xDE\x75\xD6\xEB\x65\xA3\x9C\xD5\x02\x00\xE0\x55\xA3\xD8\x89\x66\x76\xD0\xEC\x00\x00\xEB\xD7\x18\xC9\x04\x03\xD9\xD4\x66\x01\x02\x0E\xBB\x8C\x76\x37\xDA\xC3\xC5\x07\x04\xDA\xDB\xA1\x0F\x02\x17\xBB", "\x84\xDD\xB4\xD4\x26\xCD\x0A\x04\xDB\xD8\x0A\x3D\x02\x1F\xBB\x95\xDD\x8D\x7A\x4E\xD5\x0D\x00\x70\x57\xDB\xD9\x3F\xB7\x0D\x28\x33\x78\x14\xA6\xD9\x1A\xCA\x08\x04\xEE\xC0\xCC\x3A\x01\x67\xDD\x9D\xDC\x00\xDC\x5C\xCE\x09\x05\xEF\xD8\xD6\x08\x02\x78\xDD\xB7\xDC\x15\xCB\x7B\xCA\x0B\x00\xB8\x40\x74\xFC\x0A\x16\x01\xB6\xDC\x3C\x17\x58\xDC\xC9\xC5\x06\x05\x78\xE4\x19\x23\x01\x09\xDE\xB5\xD9\xE4\xC8\x0E\x0C\xEE\xC4\x33\x30\x02\x77\x06\xEC\x34\x3C\x17\x5C\xDF\xBD\xCD\x07\x15\x78\xDB\x28\x40\x01\x18\xDF\x63\xDC\x34\xD8\xAE\xCA\x08\x1D\x77\xD9\x60\x50\x01\x00\xDE\x3C\x17\x60\xD8\x48\xC6\x09\x06\x79\xED\x6B\x5E\x01\x29\xDE\x85\xD7\x7B\xCA\x14\x0E\xF1\xC8\x85\x05\xB4\xB9\x59\x78\x15\x2A\xD9\x0C\xCF\x15\x0E\xF2\xCE\x11\x7B\x03\x31\xDE\x19\xD7\xC8\xCF\x2E\x05\xE7\xD9\x32\xCE\x1D\x3F\xBA\xAA\xDB\x91\xCF\x63\x01\xCD\xD8\x30\x37\x01\x0E\x1D\x19\xBC\xC8\xDE\xF5\xD9\xA5\xDC\xB6\x32\xA5\xD1\xC7\x58\x53\x39\xB1\x91\xCF\xE1\x00\xA9\xDD\x06\x37\x06\x0E\xF4\xC2\x79\xF5\x7C\x3C\xDB\xDA\x16\x77\x02\xD6\xDD\x5D\x37\x04\x1D\x7A\xCF\xBB\xC1", "\xD6\xED\x4B\x7D\x03\xD8\xD8\xDA\xCE\x3A\x10\x77\xCB\xB7\x91\xCF\x08\x00\xB9\x55\xBB\xDE\x0C\x0D\xF6\xDE\x7A\xF1\x55\x9C\xD5\x15\x00\xB9\x56\x4D\x09\x04\x02\xB7\x42\x0E\x35\x01\x46\xDE\x76\xDF\xEF\xD9\x0C\xCB\x04\x0A\xF7\xD7\xBF\x7D\xBD\xBD\xA0\x80\xDF\x67\xDD\x7A\xDC\x2F\xD1\x03\x05\x7C\xCF\x22\x07\xDF\x00\xD7\xC4\xDC\xC3\x76\x6D\xDF\x5E\xDF\x01\x0E\xBE\xA6\x7C\x90\xDF\xE9\xDA\xE4\xDC\xD0\xD9\x5E\xA0\x12\xCD\x01\x17\xDF\x67\x85\xCC\xDF\x41\x05\x15\x0B\xF9\xC8\x77\xFD\x00\xC0\xC4\x5B\x00\xB9\xDE\x44\x00\x0D\x02\xFA\xC4\x1F\xF5\xBD\xF6\x76\x8F\xC5\xF7\xCA\x1A\x02\x6E\x55\xE1\xDC\x15\x0B\x3F\x45\x76\x19\xDD\xD4\xD3\x86\xDA\xF0\x4E\x3D\x4D\xE0\x38\xB9\xB0\xDC\x6A\x7B\x27\xC4\x93\xCB\x0D\x04\xFB\xC4\x33\x0A\x03\x2E\x07\x80\x07\x9C\x7B\xA8\xCE\xC4\xDC\x06\x05\x7E\xDB\x28\x4B\x01\xC8\xDE\x01\xD9\xDA\xC0\xAE\xCD\x06\x0E\x7E\xE8\x42\x4C\x01\xD1\xDF\xE0\xDD\xAC\xC9\x86\xCE\x06\x16\x7E\xC0\x66\x4D\x01\xD9\xDF\xD5\x79\x47\x58\x48\xCF\x06\x1E\x7E\xD8\x6B\x4E\x01\xE1\xDE\x5E\xD5\x82\xD6\x70\xC0\x07\x06\x7F\xD9\x60\x4F\x01", "\xE9\xDF\xA1\xD9\xB1\xC9\xF2\xC1\x07\x0E\x7F\xED\x6B\x50\x01\xF1\xDF\xD1\x78\x35\xD1\x8D\xC2\x07\x16\x7F\xEE\x88\x14\xDB\xCF\x55\x9C\x7A\xC1\xDD\xBD\x43\x07\x1E\x7F\xF3\x66\x52\x01\xF9\xDF\x74\xDC\xEA\x5C\x53\xD4\x07\x06\x80\xE1\x8A\x53\x01\x09\xE1\x9C\x79\xB8\xCA\x7B\x15\x07\x0E\x80\xF8\x8A\x54\x01\x11\xE1\x7F\x57\x7B\xCE\x0E\x06\x01\xE2\x3C\x55\x03\x19\xE0\x34\xC8\x52\xD5\x07\xE1\xCE\x46\x0D\x00\x81\xF0\xB5\x4F\xC5\x23\xE0\x31\x53\x35\x06\x04\xE9\xBA\x60\x12\xF9\x01\x29\xE0\x01\xC4\x6C\x00\x0B\xE5\x78\xC1\x79\xDA\x03\x36\xBF\xFB\x00\xAD\xDF\x6E\xB5\x02\xE4\xB9\x7C\xE7\xDC\x4B\xFD\x01\x72\x56\x03\xE1\x70\xB5\x6B\xDC\xC2\x7A\x10\x06\x74\xFC\xA5\x88\x01\x40\xE0\x32\x0F\x39\x03\x08\xE0\x00\x0C\xEE\x6A\xAE\xB1\xC8\x93\x00\xD0\xDC\xB6\x34\x1E\x05\xFA\xC4\x82\xFF\x13\xCC\xCF\x9F\x00\x29\xE1\x06\x32\x00\x03\x17\x06\xCD\x0C\xF7\x1F\xDD\x40\xC5\x55\x02\x16\xE5\x5D\x30\x01\x1D\x82\xF5\xF8\x07\x02\xA8\xDC\xE6\xCF\x2D\x03\x0C\xEE\x22\x5E\x00\x26\xC1\x9D\xC5\xCD\xB6\xB8\xCB\x30\x01\x09\xEB\xA1\x0C\x01\x09\xB8\xFB\x7B\x6C", "\xA0\xB8\xCA\x33\x04\x0D\xE3\x9B\x39\x01\x2F\xC1\xA6\x7C\xDB\xD6\xB8\xCA\x36\x04\x0F\xE1\x2A\x47\x02\x3F\xC1\x89\x7C\x28\xDB\xFD\xCC\x21\xE0\x57\x45\x05\x07\x84\xF8\xC1\xAF\xDA\x9C\xD4\x79\x03\x22\xE2\xF0\x43\x06\x0E\x84\xD6\xC1\xA2\x96\x70\xCA\x7F\x03\x24\xE1\xCE\x41\x07\x16\x84\xCD\xC1\xBF\xA1\xCC\xCE\x05\x03\x6C\x04\xD9\xDF\x07\x1E\x84\xCC\xF7\x1E\xDC\x86\xC6\x0B\x03\x6C\x05\xDD\xD0\xE2\xD9\x65\x4C\xF7\x72\xDD\x1C\xD1\x11\x03\x28\xE6\xAD\xD6\x0A\xFD\x7C\x9A\xAC\xB3\xE1\x1B\x14\x55\x01\x2D\xE1\x68\xB0\x57\xDB\x01\x33\x06\x41\xE0\x0A\x02\x5C\x03\x1D\xE7\x12\xE5\x10\x0B\x78\xFC\xA5\xC6\x00\xBF\xE0\x45\xDF\x30\xE7\x13\xE1\xF7\x60\x7B\xC2\x27\x51\x00\xAB\xE0\x44\xD7\x5C\x04\x5D\x3C\xDC\x7B\x78\xCC\x9F\xDE\x00\xD1\xE1\x0D\x16\xAC\xD9\x8E\x5C\xDC\x7B\x6B\xFC\xA5\xEB\x00\xB8\xE0\x54\x22\x3C\x03\x17\xEA\x10\x0B\x79\xC6\x8E\xF7\x00\xE1\xE0\x1A\xC4\xE0\x56\x0B\xE2\xF3\xCC\x3E\xC3\x02\x59\xE1\xA8\x20\x07\x00\xE0\x50\x35\x3C\xDC\x7A\x79\xE9\x91\x90\x01\xE9\xE0\x6C\x37\xB6\xDC\xB7\x5C\xDC\x7A\x6C\xF1\x90\x9C\x01\xF9\xE1", "\x0C\x33\x0A\x03\x1D\xE7\x06\xE5\x0B\x8E\xC3\xF3\x0B\xA8\x00\x78\xE0\x60\x31\x07\x00\xB8\x54\x86\xD0\xBD\xCC\xCF\xB5\x00\x85\xE0\x50\xDD\x21\xE5\x10\xFF\x7A\xDC\xAA\xC2\x01\x12\xE3\x0C\x31\x16\x04\x22\xE0\x07\xFB\x6D\xDC\xAA\xCF\x01\x19\xE3\x76\x35\x1A\x04\x23\xE0\x08\xE8\x64\xDC\xAA\xDC\x01\x21\xE2\x17\x45\x1E\x03\x1E\xE5\x11\xE0\x00\x0D\xB9\xFE\xD3\x29\xE3\xD9\x30\x22\x04\x25\xED\x11\xE4\xA9\xB0\x95\xF6\x01\x01\xE2\x70\x54\x29\x0A\x38\x07\x09\x04\x88\xF5\xC4\xCE\xAB\x9C\xD4\x02\x00\x29\x0E\xA6\x00\x01\x1B\x89\xFD\x59\xBE\xE2\x25\xE2\xAA\xD4\x5C\xCA\x02\x03\x14\xE1\x81\x46\xC5\xD1\xAD\x48\xE2\x44\xE2\x2D\xDC\x53\xD0\x02\x0D\x8A\xD6\xDD\x4F\xE2\x0A\x03\x60\x01\x54\xE7\x11\xEF\xCB\xD1\x3C\xEE\x00\x56\xE2\x82\xB4\xAC\xE3\x41\x07\x19\x0B\x15\xE4\x86\xD9\x02\xF0\xCA\x3C\x00\x52\x09\x3C\x09\x09\x02\x16\xE6\x08\x1D\x03\x34\xE2\x0A\x02\x2B\x7F\x91\xDD\xBD\x4B\x04\x04\x25\x35\xBE\xA3\x7E\x71\xE3\xCA\xD6\x67\xD2\xF7\xD1\x67\x47\xFA\x4C\xF7\x39\xDF\x5E\xDC\x6C\x36\xF0\x7F\xE8\x70\x18\xE2\x71\xC6\xB8\xB3\x32\x9C\xD4\x26", "\x02\x5D\xE6\x30\xE4\x10\x9B\x0D\x8C\x99\xE7\xD3\x1B\x15\x60\x83\x68\x85\x30\xE9\xE7\xDD\x0C\x9F\x05\x91\xCF\x4D\x01\xB6\xE3\x92\xDF\x35\x8A\x13\x97\x3A\xDA\xC6\x93\xC8\x71\x4C\xE5\x82\x78\x54\x48\xD0\x19\xE8\x85\x0A\x07\xD8\x46\x6B\x3A\x3A\xDD\x06\x33\xA3\x1C\x90\x44\x52\xD1\x01\x1F\xE3\xA5\xE3\x25\x84\x78\x84\x53\xD3\x05\x10\x8D\xEA\xC6\x95\x85\x8F\x87\xC7\xE3\x6D\xE6\x45\x4C\x25\x96\xF4\x3F\xBE\xDF\xDC\x38\x87\x78\x84\x5C\xCD\x0A\x06\x1B\xFB\x8B\xFC\x0A\x74\x18\xE5\x84\x7C\xD1\x71\xE0\x35\xDC\x2B\x02\x52\x2F\x69\x3F\xE3\xA8\xD0\xE4\x86\xA3\xD9\xF2\xC9\x05\x0B\x8C\xD5\xC6\xAF\x87\x07\x8A\xE6\xCE\x16\x06\x3A\xE0\xFC\xC6\x1D\x83\xB4\x9C\xD5\x5B\x00\xEE\xE0\x70\xE2\x77\x8A\x10\x09\x83\xCC\x99\xDC\x00\xE2\xE3\xE8\xE1\xEC\x81\xA3\xD1\x79\xDD\x02\x29\xC7\x9B\xE3\xEB\xE2\x85\x01\xB0\xD8\x48\xCE\x05\x0F\x8F\xE0\xC6\xE2\x50\x09\x4A\xD5\xA2\x5D\xCE\x3E\xE1\x1B\xED\x1D\xA7\x29\x9C\xD5\x60\x00\xFE\xE3\x6D\xE1\xA1\x49\xED\xD1\x21\xE1\x01\x02\xE4\xC6\xE2\xE9\xE3\xAC\xD0\xB1\xC8\x20\xEC\x8E\xCA\xC8\x8A\xE0\xEF\xCB\x31\x03", "\x72\xE2\xF0\x4C\x0E\x00\x5C\x40\x0E\x09\x4A\xB0\xE0\x22\xD5\x19\x05\x41\xEB\xFB\xDF\x37\xF6\xC2\x91\xCF\x66\x00\x0E\xE6\x6B\xD6\x43\xED\x0C\xFC\x54\xE7\x01\x13\xE4\x71\x4D\x76\x00\xE0\x57\x76\x45\x22\xF1\x3C\xE9\x01\x28\xE4\x62\x51\x77\x03\x8A\xE7\x41\xEE\x0D\xE0\x12\xEB\x01\x22\xE4\x1A\xDC\x12\xE5\x39\xE0\xAE\xCC\x06\x18\x91\xFC\xC5\xF8\xE3\xED\xE0\x26\xCD\x1B\x00\x46\xE1\x20\xD1\x07\x16\xC8\x8F\xE4\xF6\xE0\x0E\xD3\x1B\x06\x47\xE1\x18\xF8\x8E\xC1\xBD\xEF\xCB\x70\x00\x26\xE4\x99\x09\xA1\x41\xDA\xDC\x54\xF1\x01\x44\xE4\xBC\x04\x79\x03\x8C\xE1\x3E\xEF\xC6\xDC\x54\xF3\x01\x58\xE4\xD3\xB7\x2D\xE6\x77\xE2\xB6\xDC\xA9\xD5\x03\x20\xC9\x8F\x02\xF6\x00\x31\xE7\xEC\x86\x23\xE1\x79\xD7\x03\x27\xC9\x8A\x02\xF8\x00\x35\xE6\x7F\xE6\x24\xE1\x79\xD9\x03\x2F\xC9\x87\x02\xFA\x01\x23\xE4\x97\xE6\x20\x0F\x12\xE6\x1C\xFB\x01\x77\xE4\x06\x02\xB5\xDF\xB3\x51\xA1\x44\xDD\xC6\x1C\xFD\x01\x76\xE3\x7E\x00\x40\xE6\x93\xE2\x6B\xD1\x79\xC0\x04\x36\xC7\x81\x01\x8A\xE4\xF2\xE0\x7A\xD8\xAE\xC3\x08\x16\x8F\xC4\x02\x11\xE5\x09\x4A\xCA\xDC\xF3", "\xCE\x10\x06\x1F\xE7\x04\x18\xCA\xA4\xAC\x70\xCB\x44\x02\x7D\xE2\x11\x0F\x29\xF8\x71\xD1\x9E\x8C\x01\x9F\xE2\x47\x03\x67\xE4\x1F\x0A\x27\xEC\x22\x8F\x13\xEF\xCB\x2E\x44\x48\x01\xA4\xE4\x52\x14\x3D\x89\x18\xD2\xC9\x9B\x14\x94\x15\x44\xD5\xE4\xCB\x12\x04\x4A\x1A\x1B\x17\x02\x37\xE5\xAF\xE5\x15\xB4\xA7\xD0\x13\x0D\x2B\xFE\x4F\x40\xCB\x93\x46\x3E\xB4\x60\xD9\xB1\xE3\xC5\xA7\x2C\xE5\x25\xAB\x69\x9C\xD5\xA2\x01\x65\xE5\xAB\xAD\x59\xED\x4C\x87\x08\x3D\x8F\x91\xCF\xA7\x00\x69\xE7\x41\x03\x15\x04\x2D\xF4\x26\xAB\x6A\x9C\xD5\xAC\x00\x6D\xE6\x41\x00\x16\x0D\x2D\xF4\x54\x19\x6B\x9C\xD5\xB1\x00\x71\xE7\xF3\xAD\x5C\xEF\xAD\xB0\x2B\xF6\x02\x6A\xE5\x00\x00\x5D\x00\xBB\xE1\x5C\xB0\x57\xDB\x05\x30\xCB\xBF\x01\xF3\xE4\x85\x00\xBA\xB1\xF2\xC0\x0C\x10\x97\xC4\x03\x79\xE5\x07\x02\x7C\xB5\xE4\xCD\x18\x00\x2F\xE9\x06\x00\xCC\xEE\xE2\x70\xCA\x65\x00\xBC\xE6\x19\x07\x30\xE5\x08\x11\x90\x91\xCF\xCF\x00\x78\xE7\x34\x05\x61\xE0\x00\x11\x54\xD1\x9E\xD4\x01\xF0\xE4\x6C\x01\xB7\xE2\xF2\x1D\x03\xE0\x12\xD9\x03\x24\x09\xC0\xE1\x83\x01\x3F\x03", "\xEC\xD2\xF9\x06\x82\xC0\x89\xE4\x01\x20\xE6\x32\x0E\x02\x02\xF5\xD6\x8B\xD2\x15\xCC\x99\xEF\x01\x60\xE2\xA6\xDE\xDC\x56\x34\x32\xF9\x1C\x67\xD1\x37\x7B\x01\x31\xE6\x6C\x35\x09\x03\x66\xE9\x1D\xE5\x08\x20\xC1\x86\xC7\x07\x00\x44\x2C\xB3\xDB\x06\x0C\x33\xED\x99\xE5\xC7\xF0\xCA\x13\x00\xA1\xE5\xB5\xDD\x68\xEC\x50\x91\x68\xDC\xAA\x9F\x00\x88\x2D\x90\xE4\x9F\x2C\x65\xED\x34\xE0\xFA\xB0\x95\xAA\x00\x4A\xE7\x0D\x14\x17\x04\x69\xE7\x05\xF2\x2F\xE9\x9C\xD9\xE6\xA8\x21\xD9\xDC\x6F\x5A\xF2\x1A\x1F\xE6\x1C\xC2\x01\x60\xE6\x80\x32\x3C\x00\xD7\xE2\xA0\x85\xA6\x9C\x54\xCE\x01\x68\xE6\xD8\x34\x43\x03\xDA\xE6\xD2\xDD\xB5\x9C\x54\xDA\x01\x70\xE6\x19\x30\x4A\x03\xDC\xE7\x9A\x8A\x0B\xA0\x91\xF8\xCD\xED\x35\xA2\x01\xBD\xE6\xE4\x18\x15\xE1\x43\xD2\x03\x08\x5A\x6D\xDD\xB0\x00\xB9\x54\x6A\x32\xF2\x19\x21\xED\x61\xC0\x00\x7F\x00\x7F\xE6\x17\x47\x2F\x02\x70\xEF\x21\xEF\x2F\xCB\x02\x11\xE7\xB3\x33\x66\x00\xE5\xE4\x17\xE5\xE5\xD1\x9A\xE4\x19\x5B\x01\x54\xE7\xAE\xE4\x00\x06\x18\xE1\x37\xDE\x9C\xDB\x28\x68\x01\xA1\xE6\xB6\xE6\xE4\x7F\x20", "\xE7\x46\x0D\x05\x07\xCE\xE4\x0C\xF5\x00\xB9\x54\xBB\x32\xF2\x16\x0D\xEC\x32\xFA\x02\x2F\xE7\x1B\x15\x02\x03\x6C\x03\x76\xE2\x11\x15\x91\xC6\x8E\xC7\x01\x98\xE7\x50\x45\x05\x03\x36\x04\x33\xEB\x90\xB0\x95\xD3\x01\xC1\xE6\x5C\x46\x2C\xE3\x6C\xE1\x24\xFC\x4B\xDF\x03\x38\xE7\xA8\x21\x18\x03\x6C\x03\x71\xE2\xD9\xDC\x54\xEC\x03\x49\xE7\x82\x4E\x20\x00\xF1\xE5\x67\xE9\xD9\xCB\x68\xD8\xCF\xFD\xE2\xDB\xE6\xA3\xE5\x97\xE4\x4B\xDE\x56\x2D\x77\xDC\x01\x3B\xE7\xDC\xE7\x2A\xE5\xE4\xC9\x02\x05\x3E\xE4\x33\x2C\x01\x68\xE7\xE2\xE7\x40\xD9\xE4\xCE\x03\x0D\x3E\xFB\x50\x3C\x01\x70\xE7\x55\xE6\xF9\xE7\x7B\xCB\x05\x05\x3F\xE8\x85\x0C\x02\x78\xE7\xA2\xE6\xB4\xDE\x1E\x38\x07\x0D\x3F\xE0\xCC\x00\xC4\xB9\x59\x92\x1F\x3E\xE5\x0C\xCD\x08\x05\x40\xF8\xD6\x2B\x02\x53\xE7\xDC\xE7\x42\xE5\x0C\xCA\x0A\x0E\x56\x36\x29\x1E\x01\x6E\x2A\xC2\x02\x5D\x01\xF8\xE1\x7F\xE5\x10\x02\x7C\xE9\x91\xE0\x00\x15\xE8\x4A\x90\x06\xEE\x1C\xBB\x41\xE2\x9D\xCB\xBE\xC0\xC4\x6E\x01\x10\xEB\xBB\x9B\x84\xEF\x10\x16\x06\x25\xD0\xAA\xE7\x6D\xD6\xB8\xC8\x1F\x02\x85\xEA", "\x10\x08\x04\x2C\xD0\x8A\x02\xE4\x01\x17\xE8\xDD\xE2\xC0\xAC\xA9\xCA\x04\x34\xD0\x87\x02\x96\x01\x1B\xE9\xD9\xB2\x87\xEC\x37\xE7\x08\x27\xBE\x86\xC7\x98\x01\x06\xEA\xA6\x4A\x88\xE3\xD2\x48\xCD\x38\x32\x35\xE5\x86\xC7\x53\x02\x5B\x2F\x2E\xEF\x5D\x0F\x08\x3A\xCA\xEF\xCB\xA8\x00\xB7\x2A\xDE\x04\x15\x03\x45\xE4\x33\x38\x32\x2E\xB4\x7C\xD3\x56\x02\x16\xEA\x22\x01\x0B\x1D\xA2\xDB\x28\x38\x19\x3A\xB4\xBE\xD2\x2C\x03\x8C\xEF\x10\x16\x05\x26\xD1\xA8\x21\xB8\x18\x2F\xB4\x90\xC7\x16\x0C\x46\xFA\xBF\xAF\xD1\x80\x33\xB8\x19\x6B\xE7\x7B\xCC\x17\x05\x47\xE7\x08\x00\x03\x77\xE8\xD8\x34\x5C\x1A\xAB\xB0\x48\xC1\x0C\x1D\xA3\xC3\x63\x80\xE9\x19\x30\x5C\x1B\xB9\xE1\xF2\xC6\x0C\x06\xA4\xF2\xAD\x88\xE9\xED\x34\x5C\x18\xB8\xB1\xF2\xCB\x0C\x0E\xA4\xD4\x67\x90\xE9\x2E\x44\x5C\x18\xB9\xB1\xF2\xC0\x0D\x16\xA4\xD4\x03\x18\xE9\xB3\x32\x5C\x1B\xBE\xE7\xBD\xC5\x0D\x16\xA4\xD9\x03\x20\xE9\xA1\x44\x5C\x1A\xC0\xE7\xBD\xCA\x0D\x16\xA4\xDE\x03\x28\xE9\xB8\x44\x5C\x19\x01\xC9\xF2\xCF\x0D\x16\xA4\xE3\x03\x30\xE9\x94\xE0\x8F\xB7\x7B\xCC\x1C\x06\x49", "\xE8\x07\x38\xD2\xF1\x4C\xB8\x18\x8B\xE7\x7B\xC9\x1D\x06\x49\xED\x07\x3F\xD2\xE2\x50\x8E\x8A\xC8\x34\x74\xE0\x3E\xEC\xB5\x3D\x98\xC6\x8E\xEE\x01\x6E\x2A\xA9\xE7\x03\x5A\x2D\xEC\xF3\x26\x99\xC6\x8E\xF9\x01\xD1\xE8\x32\x0C\x07\x04\x9A\xE2\xF2\x0F\x82\xE9\x91\x84\x00\x84\x2A\x66\xDD\x0A\x04\x94\x06\x9A\x3D\x37\x36\xCC\xDA\x17\x10\x01\x70\xE8\x99\x0F\x06\x04\x4E\xFC\xF9\x3F\xCC\xB1\xC8\x1C\x00\x75\xEB\x86\x15\x08\x0D\x4E\xE2\x79\x26\xC7\xFC\xD2\x28\x00\x79\xE8\x2A\x25\x36\xEC\xDB\x5D\x37\x30\xBA\xFC\xD2\x34\x00\xC2\x2A\x34\xEB\x52\x1C\x4D\xFC\xDA\x39\xBA\xE9\xC8\x3F\x00\x7D\xE8\x60\x36\x0D\x05\x4F\xFC\xDA\x33\xC7\x86\xC7\x4B\x00\x85\xE8\xB6\x34\x0F\x0D\x50\xF6\xAD\x25\xCD\xB1\xC8\x57\x00\x89\xE9\x06\x34\x54\xED\x4F\xFF\x8F\xD1\x9E\xE3\x00\x1A\xEB\x76\x34\xB1\xE5\xA3\xE2\xBF\xD1\x3C\xEF\x01\x21\xEA\x2E\x44\x53\x01\x45\xEB\x19\xD0\x00\x01\x77\xFC\xA5\xFB\x00\x28\xEB\xD9\x30\x2D\x03\xA5\xE1\x61\x84\x9C\xE9\x91\x87\x01\x84\x2B\x76\xDE\x30\x04\x94\x08\x9A\x3D\x37\x0D\xCE\xA6\xDC\x94\x01\x98\xE9\xA8\x41\x1A\x04\x53\xF4", "\x30\x81\x9E\xF0\xCA\xA0\x00\xA1\xE8\xAE\x47\x1B\x05\x54\xFD\x37\x02\xBC\xCC\xCF\xAC\x00\x81\xE8\x99\x0D\x1D\x05\x50\xF6\xAD\x24\xCE\x86\xC7\xB7\x00\xA9\xEB\x86\x12\x1F\x05\x55\xEC\xA9\xF5\xCE\xFC\xD2\xC2\x01\x9C\xE8\x99\x09\x68\xE1\xC7\x5D\x37\x1F\xD5\xC0\xC4\xCF\x00\xB1\xEB\x86\x17\x02\x08\x68\x2C\xD7\x3D\x1B\x3E\xE7\x31\xC8\x6E\x02\x52\xEA\xF0\x47\x02\x08\xB4\x25\xD3\xC6\xE7\x9C\xD4\x74\x03\x5C\xE9\xCE\x45\x03\x16\xAB\xFC\x7C\x25\xDC\xBC\x54\x7A\x02\x5A\xE8\x15\x23\x04\x08\xB4\x3D\xD4\xD5\xE7\x91\xCF\x00\x00\x76\x54\xD9\xD2\x05\x1E\xAB\xE2\x3C\x7E\xE1\x69\xC9\x06\x03\x62\xEC\xCC\x00\x06\x0E\xAC\xDC\x6D\x6A\xE7\xEF\xCB\x0C\x00\x76\x55\xDD\xDE\x06\x0D\xAB\xFC\x7C\x18\xEB\xCC\xCE\x13\x03\x66\xEC\xCC\x0E\x07\x1E\xAC\xE2\x3C\x57\xDE\xEF\xCB\x19\x03\x68\xEB\x43\x1E\x08\x06\xAD\xDC\x6D\x28\xEB\xCC\xCE\x20\x03\x6A\xE8\x15\x2E\x09\x0E\xAD\xF6\x56\x02\xE8\xD1\x1B\x26\x03\x6C\xE8\x30\x3E\x0A\x06\xAC\xFC\x7C\x0A\xE8\x69\xC8\x2D\x03\x6E\xE8\x5B\x3D\x0B\x1E\xAD\xE2\x3C\x12\xE8\x69\xC9\x33\x03\x64\xED\x81\x98\x9D\x42\x0E", "\x0C\x03\x16\xEB\xB6\x2A\x0F\xE8\x07\xD5\x0E\x0B\x5C\xFE\x7A\x8D\xD7\xE3\xB5\xD0\xEA\x96\xEB\x09\xEE\x70\xC3\x08\x15\xAE\xC7\x04\x0F\x01\xD7\xEB\x89\xB5\x76\xE9\xC2\x8A\x29\xEC\x32\xD1\x02\x5E\xEB\x1F\xCD\xF0\xEA\x42\x06\x1E\x03\x5E\xE6\xAA\xEF\x58\xA5\xCF\xE8\xEB\x82\x03\x2A\x02\xBD\xED\x17\x0E\xAB\x37\xD5\xA6\xE5\xEF\xCB\x56\x03\x70\xED\x20\x0A\x0B\x14\xAF\xED\xB2\x6E\x2A\xA8\x33\xC7\x4A\x33\xE9\x86\xCC\x0B\x18\x4E\x43\xD4\xA1\x00\x4A\xE8\x2E\x8D\xC8\xB4\x37\xD6\x60\xFC\xF3\x89\xD8\x8F\x4B\xDE\xE8\xE7\xD1\x7C\xED\x5D\x3B\x03\x16\xAF\xD2\x19\x9C\xE8\x7C\xD2\x6F\x03\x84\xEE\x45\x49\x04\x16\xB0\xD4\x19\x86\x02\xEF\xE9\x34\xCA\x3A\x03\xC3\xE3\x9B\x37\x02\x1E\xD8\x8A\x02\x8F\x4B\x7B\xE8\x90\xC6\x1E\x04\x62\xE1\x15\x65\x01\x27\xEC\x50\x8D\x38\xE0\xA7\xD2\x00\x07\x4F\x43\xA8\xF3\x01\x0F\xEC\x79\xE0\x4E\xD5\x03\x07\x9E\x4C\xEC\xC0\x04\x30\xD8\xD7\x8C\xF2\xE2\xB8\xC9\x06\x04\xC7\xE4\x66\x0E\x04\x3F\xD8\xD2\xD1\x9A\xA2\xB8\xC9\x09\x04\xC8\xEB\xA1\x1C\x04\x07\xD9\x8A\xEC\xC8\xC5\xF7\xC9\x0C\x04\xC9\xE8\x0A\x2A\x05\x0F", "\xD9\x8F\x4B\x05\xE5\x34\xC9\x0F\x04\xCA\xE0\x98\x38\x05\x17\xD9\xA0\xE1\x4C\xCD\x24\x00\x97\xE8\x5B\x3D\x48\xFC\x6D\x4F\x96\x36\xEA\x1C\xD1\x2A\x03\x3D\x4D\xDD\xDF\x49\xF9\x65\x4F\x96\x3F\xEA\xBC\x54\x31\x03\x98\xE9\x03\x37\x4B\xE6\xB3\xD5\xCE\xCC\xCF\x6E\x01\x39\xED\xBB\x31\x1E\x0F\x65\xFC\x9C\xF5\xC0\xB5\xEC\xFD\x0E\x1C\xEC\xD7\xB4\xF9\xC5\x08\x00\xB4\xDD\x91\x83\xEB\x31\xED\x15\xD9\xD4\xD3\xCD\xE4\x66\x19\x00\x04\x56\x6C\x35\x8F\x4B\xB3\xEA\xE1\xC5\x13\x0C\x68\xFB\x50\x29\x00\x0F\xED\x17\xED\x83\x00\x5C\xE9\x8D\xCA\x0A\x1A\xB3\xEE\x88\x39\x00\x84\x2A\xD3\x33\x63\x4E\x1C\xE1\x43\xD6\x05\x1E\xDA\xB3\x33\x47\x01\x50\xED\xA6\xEF\xA4\x7C\x7C\xC2\x06\x15\xDA\xA6\xE3\x84\x2B\x00\xEC\x62\xEF\xBD\xCF\x0C\x07\xB5\xE1\x8A\x64\x00\xAA\xED\x0F\xEC\x83\x94\x70\xD6\x6B\xF8\x15\x72\x01\x39\xED\x28\xED\x87\xE0\x93\xCF\x1C\x0F\x6A\xE0\xCC\x00\x02\x18\xED\xBA\xEC\xB7\x80\xEB\xE4\x57\x04\x0F\x05\xB6\xD8\x6B\x10\x01\xC8\xED\x60\xEC\x99\xE1\xB1\xEE\xA4\x0D\x77\xC9\xD5\xF1\x58\x8F\x4A\xD8\xE8\x93\xCE\x01\x05\x6D\xF6\x78\xD1\xDB", "\x89\xED\xDD\x71\xC8\xCF\x06\x05\xDB\xEF\xF1\xD1\xB5\xEB\xDA\x85\x02\xC0\xEA\x0E\xD0\x0A\x04\xDC\xE8\x0A\x29\xAB\xEE\xD9\xD0\xD6\x91\xCF\x1A\x02\x93\x16\xA6\x01\x04\x0E\x52\x02\x07\x5E\x01\xC0\xEC\x70\xEC\x50\xE1\xF2\xC3\x04\x13\xB7\xF5\xFF\x76\xED\x23\xB7\x7C\xEC\x90\xEB\x52\xEC\xA9\xD1\x02\x3E\xDB\xD3\x16\x00\xEE\x43\xBA\xC0\xE8\xC9\xEF\x10\xD0\x2B\xDF\x01\x07\xEE\x0A\x03\x35\x01\xC2\xE8\x66\x58\x9D\x42\xB5\xE0\xCA\xF3\xD7\x10\xEE\x9E\x9F\xC4\xEA\x7F\x55\x71\xE7\xB7\xE7\xC5\x9C\xD5\x7B\x00\x76\xEF\x41\x00\x11\x0B\x71\xE2\x62\x18\xA7\x28\x33\x63\x8C\x28\xE9\x0C\xCA\x11\x0E\xA4\x14\xA2\xD0\x1A\x97\xB4\x70\xCB\x45\x02\x93\x12\x6F\x0F\x08\x0D\xB9\xE4\x19\x63\x8C\x60\xE8\x7D\xC7\xCC\xEA\xC8\xD6\x73\xFB\x50\x23\x19\xE9\xE8\x40\xC5\x4A\x03\xCE\xEB\x5E\xAD\x73\xE8\x85\x23\x19\xF2\xE8\x86\xC6\x4D\x03\xD0\xEF\x21\xC5\x74\xE0\xCC\x23\x19\xFA\xE8\x58\xE1\xA5\xEF\x41\x03\x14\x0D\x74\xF8\xD6\x23\x19\x83\xE9\x86\xC6\x52\x02\xD4\xEE\x20\x08\x0A\x15\xBA\xD9\x60\x63\x8C\x8B\xE9\xF7\xC9\x2A\x03\xEB\xE5\x10\x0D\x05\x1E\xDD\xED", "\x35\x63\x8D\x49\xE9\xD9\xD4\xEC\xE4\x63\xC7\xBB\xEE\x88\x63\x8C\x9B\xE8\x1C\xCC\xDB\xEF\x16\x0E\x76\xF3\xCD\x23\x19\xA3\xE9\x83\xD2\xB6\xEC\x2F\x05\xEE\xE1\x2A\x43\x33\xAB\xD2\xCC\xCF\xBD\x00\xB6\xED\x30\x04\xEF\xE8\x2B\x43\x33\xB3\xD2\x8F\xD3\x6C\xEE\x63\x00\xE1\xEA\xF0\x43\x66\x8F\x98\xEF\x97\xC7\x01\x6C\xEF\x65\x03\xE2\xE9\xCE\x43\x66\x82\xA6\xCC\x9F\xCC\x01\x6C\xEE\x68\x03\xE4\xEA\x0C\x5E\x6D\x83\x33\x94\xC6\xDD\xE3\x0F\xBD\x64\xEF\xE7\xEB\x3C\xEE\x7A\x8B\x86\x0B\xD3\xF7\xE3\x01\xC4\x02\x93\x80\xE9\x8D\xC1\x0D\x0E\x52\x03\xD4\xAA\xEB\x58\x22\x02\x92\x35\xE9\xAE\xEE\x7A\xE4\x33\x32\xD6\xB1\xEF\xF4\xD8\xE6\xCF\x39\x01\xE3\xE8\xAD\x3A\xAD\xFC\xB6\x04\x90\xE7\xE8\xE1\x13\x3C\x04\xF7\xE9\x81\x3B\x02\x1D\xDC\xB2\xD9\xDF\xE3\xC8\xCF\x3F\x04\xF8\xE2\x12\xE7\xBE\xD1\xDC\xC3\xD7\x9C\xD5\x05\x03\xA7\x54\xD9\xD7\x07\x0E\xBE\xFF\x20\xCE\xE6\x91\xCF\x0B\x03\xA7\x53\xA0\xE5\x08\x1B\xAF\xF9\x1F\xB9\xEC\x91\xCE\x11\x03\xF4\xEC\xCC\x02\x09\x16\xBE\xC6\x20\x81\xE1\x9C\xD4\x17\x03\xF8\xEB\x43\x10\x0A\x06\xBF\xC0\x20\x89\xE1", "\x4C\xCC\x1D\x03\xFA\xE8\x15\x2E\x0A\x0E\xBF\xDF\xDF\x90\xE1\x91\xCE\x23\x03\xFC\xE8\x30\x35\x60\xFF\xBD\xD4\x2D\x91\xCF\x52\x01\xFD\xEC\xB6\x32\x19\x06\x7F\xE4\x40\xAE\xD4\xF4\xE3\x02\xF1\x0C\x30\x36\x05\x00\xF2\xFD\xD1\x3C\xEA\x01\x1F\x55\xED\xDC\x73\x03\xC9\xE9\x08\x9A\xFC\x84\x55\xC9\xE0\xED\x35\xF5\x00\x06\xF1\xB3\xD4\x52\xE7\x81\xEE\x11\x43\x00\x77\x49\xA6\x32\x02\x93\x53\xEC\xC9\xCF\x08\x1B\xBE\xE5\xB4\xCE\xED\xEF\xEF\x41\xEC\x93\xCA\x13\x06\x82\xFB\x50\x1E\x00\x28\xF0\xF7\xEE\x45\xED\xE4\xCD\x14\x00\x81\xE4\x33\x2B\x00\x77\x49\xEC\x34\x02\x92\xA4\xE9\x86\xC2\x0B\x15\xC1\xDB\x28\x3B\x00\x38\xF0\x0A\xF3\x43\x03\xD3\xEC\x81\xDF\x05\x1D\xE0\xB3\x33\x4B\x00\x10\xF2\x10\xF3\x47\xEC\xA9\xCB\x06\x07\xE1\xDE\xCD\x4A\xF0\xE4\xEE\x62\xDF\xBD\xC7\x0D\x1E\xC1\xC6\xDD\xF7\x49\xA8\x32\x02\x91\x92\xE4\x48\xD4\x0E\x0F\xC2\xF8\x8A\x76\x00\x51\xF1\xE7\xEF\x93\xE4\xF9\xC0\x0F\x1E\xC2\xC2\x9E\x04\x01\x61\xF1\xEB\xEF\xF8\xE7\xBD\xCC\x0F\x16\xC2\xC0\x66\x12\x01\x41\xF0\x29\xF0\xC8\xD4\x53\xD9\x00\x1E\x5E\x6D\xBB\xA2\x01\x71", "\xF0\x31\xF0\x9B\xE7\xBD\xC6\x01\x16\xC3\xE4\x19\x32\x01\x79\xF0\x35\xF2\xFE\xE4\xF9\xC3\x02\x1E\xC3\xDB\x28\x2E\xED\x71\x58\x02\x90\x6E\xEA\x7B\x10\x03\x06\xC4\xE8\x42\x52\x01\x58\xF1\x25\xF3\x41\x01\xDD\xE4\xA4\xDD\x01\x0E\xE2\x80\x33\xE1\x01\x48\xF2\x1C\xF6\x26\xEC\xA9\xCA\x02\x1E\xAF\x36\x0A\x56\x00\xEF\x56\x70\x00\x1E\x09\x86\xE7\xBF\xE1\xB2\x91\xD9\x9F\xF0\xCF\x8A\x28\xF2\x22\x0E\x0F\x05\xC5\xE9\xE0\xCA\xE2\x9C\xD4\x33\x01\x2A\xF0\x6A\x9B\x8A\xF5\x29\x0E\x29\x21\xF0\x12\x03\xF2\xE8\x5F\xD4\x0E\x03\x8B\xE7\x80\xB5\xE2\x84\x44\xB7\xF0\x49\xF0\x0F\xE9\xF2\xC2\x08\x1D\xC5\xEB\x8B\xBF\xF1\x07\x03\x75\xEE\xFF\xE8\xBF\xEC\x7C\xD0\x04\x17\xE2\x9F\xCC\xC8\xF1\xAD\xAE\x93\x10\x35\x35\x85\x8B\xBD\xDC\xA0\x9F\x01\xDE\x57\x81\xE9\x11\x02\xE4\xE4\x85\x83\xDA\x9C\xB0\xD9\xF1\x64\x0C\x29\x00\x37\xF2\x12\x9E\x32\xFC\x4B\xF5\x02\x46\xF1\xD8\x35\x87\xEC\x6F\x5D\x0A\x91\x7C\xF3\x2F\x01\x03\x68\xF1\x19\x31\x36\x01\x30\xF7\x21\x05\x85\x81\xB1\xDC\xA0\xCD\x01\xF0\xF1\x76\x35\xC8\xEB\x1D\xF0\x7D\xF1\x3C\xD9\x03\x79\xF1\x2E\x45", "\x44\x03\x3C\xF4\x0D\x94\xA8\xDC\x54\xE5\x03\x60\xF1\x1B\x15\x4B\x03\x38\xF0\x00\x05\x85\x87\xA8\xDC\xA0\xF0\x01\x00\xF3\xD9\x32\xD6\xEC\x1F\xFF\x10\x0F\xA8\xF1\x90\xFC\x01\x11\xF3\x50\x46\x2C\x03\x20\xF7\x10\x15\x42\x97\xD4\xE9\xC8\x08\x00\x4B\x5C\xB3\xD8\x18\x0C\x91\xFD\xC6\xF8\xDF\xEF\xCB\x14\x00\x91\xF0\x99\x0E\x19\x05\x92\xE4\xC7\xF6\xB4\xF0\xCA\x20\x00\x95\xF3\x86\x14\x1B\x0D\x92\xEC\xC8\xE0\xD9\xFC\xD2\x2C\x00\x99\xF0\x2A\x22\x1D\x05\x93\xF5\x42\xA8\xD9\xC4\xD4\x38\x00\x4B\x5D\xBB\xD8\x1F\x03\x8D\xF4\x44\x95\xE0\xE0\xDB\x3A\xF2\xC0\x33\x01\x07\x53\x56\x9A\x35\x42\x94\xB5\xFC\xD2\x51\x01\xA4\xF0\xB6\x35\x02\x0C\x94\xE6\xCA\xFE\xD9\x95\xD5\x96\x5D\x81\xEB\x08\x06\x0D\xF6\x92\xFB\xDA\x91\x9E\xE8\x00\x59\xF2\x32\x0C\x0C\x04\x2B\xFE\x92\xE1\xFA\x4B\xDB\xCF\xCB\x42\xF2\x32\x0D\x0F\x07\x53\x5C\xAE\x35\x42\xBB\xE0\xE9\xC8\x80\x01\xB4\xF3\x86\x15\x09\x0C\x96\xF6\xCA\xE7\x4B\xF0\xCA\x8D\x00\xA9\xF1\x06\x35\x0B\x05\x95\xF4\xC7\xF8\xD5\x91\xCF\x99\x00\xBD\xF1\xBB\x33\x0D\x0D\x97\xE4\xC8\xD3\xE1\xCC\xCF\xA5\x00\xB9", "\xF0\x2A\x21\x0F\x0F\xA9\x54\xC6\xF3\xDA\xCC\xCF\xB2\x00\xC1\xF2\x8B\x40\x11\x05\x98\xFD\xC8\xDD\xB1\xF0\xCA\xBE\x00\xC9\xF3\x6C\x36\x12\x05\x99\xFD\xCA\xEB\xE1\xCC\xCF\xCA\x00\xC5\xF0\x60\x34\x14\x05\x97\xFE\xCB\xE6\xB1\x9C\xD5\xD7\x00\xD1\xF0\xB6\x34\x16\x05\x9A\xE6\xCC\xFB\xE1\xCC\xCF\xE4\x00\xD5\xF1\x06\x34\x18\x0D\x9A\xF6\xCC\xD3\xDB\xEF\xCB\xF1\x00\xD9\xF1\xBB\x34\x1A\x05\x9B\xFE\xCC\xEC\xB8\xCC\xCC\xFE\x00\xDD\xF2\x8B\x45\x0B\xF9\xCB\x55\x42\x94\xE2\x8E\xE7\x0B\x00\x51\x59\xBB\xDB\x1E\x0D\x98\xF6\xCB\xDC\xE2\x91\xCF\x18\x00\x51\x5A\x4D\x0C\x04\x02\xCA\x47\x37\x5E\xAF\x4D\xF2\x12\x02\xE9\xE8\x91\xD6\x04\x02\x9D\xFE\xC2\x55\xE7\xB0\x0D\xD7\xF2\xE7\xF3\x87\xC8\xAE\xC4\x03\x1D\xCE\xE5\xE2\x5F\xF3\x43\x61\xF0\xF2\x69\xF5\xE1\xEC\xA9\xC2\x02\x26\xE7\xB0\x52\xE8\xF2\xEB\x6E\x7A\xF6\x35\xF7\x10\x1D\x7C\xC6\x8E\xD0\x00\xEF\xF2\xBC\x15\x7C\xF7\x20\x0A\x03\x13\xCF\xF6\xE6\x87\xE3\xEF\xCA\x2F\x02\x72\xF1\x08\x9B\x9F\xFF\xAB\x1E\xAF\x28\x33\x7E\x50\x95\xEF\x49\xD2\x94\x5E\x72\xE7\x08\x3E\xA1\x57\xE8\x78\xEC\x51\x5A", "\xDE\x02\x0E\x0C\xA0\xE4\x33\x3E\xA1\x39\xEE\x86\xC7\x39\x02\x84\xF0\xCD\x95\xA1\xFB\x50\x3E\xA1\x40\xEE\x86\xC6\x3C\x03\x86\xF7\x21\x0C\x07\x1D\xD0\xE8\x42\x7E\x50\x48\xEF\x18\xC9\x1F\x03\x44\xFE\xF5\x86\xD1\xC0\x66\x7E\x50\x50\xEF\x9C\xD0\x8B\xF4\x17\xAE\xA2\xF8\xD6\x3E\xA1\x58\xEE\x31\xC9\x43\x03\x8C\xF7\x5B\x45\xA3\xF1\xC7\xD2\x04\x61\xEE\xCC\xCE\x46\x03\x8E\xF5\x20\x00\x09\x1D\xD1\xED\x6B\x7E\x50\x6A\xEF\x5A\xD7\x90\xF0\x00\x05\x09\x06\xD2\xEE\x88\x7E\x50\x71\xEE\xE6\xCE\x25\x03\x49\xFA\x09\x0E\xD2\xF3\x66\x7E\x50\x78\xEE\x26\xCF\x26\x03\x49\xFF\x09\x16\xD2\xE1\x8A\x7E\x50\x7F\xEE\x26\xCC\x28\x03\x49\xF4\x0A\x1E\xD2\xF8\x8A\x7E\x50\x87\xEE\xC4\xF3\x92\xF1\x15\x06\xA6\xE2\x3C\x7E\xA1\x0E\xEF\xCC\xCE\x55\x03\x92\xF6\x15\x0D\xA6\xF1\x33\x7E\xA1\x16\xEF\x4C\xCD\x57\x03\x92\xF3\x16\x05\xA7\xE2\x43\x7B\x23\x85\x51\x50\xDD\x04\xE7\x86\x15\x29\x95\x85\x83\xBD\xEA\xC7\x8A\x02\xDA\x92\x02\x92\xA1\xF4\x99\xED\x36\xFF\x1E\xB0\x95\xB4\x01\xA2\x59\x8A\xD2\x8B\x43\x4E\x90\xA1\xEC\x32\xF7\x02\x22\x59\xF7\x31\x5E\x01\x9F", "\xF1\x40\xC3\xA7\x98\xD0\xF1\x90\xBE\x01\x98\xF5\x59\xB3\xA6\xF4\x57\x03\xA7\x80\xD1\xF1\x90\xC5\x01\xA1\xF4\xE4\xB3\xA8\xF6\xA3\xEF\x2C\xF1\x3C\xCC\x03\x29\xF5\x0A\x02\x69\x03\xAA\xF7\x24\xF6\x10\x11\xD1\xFC\xA5\xD3\x01\xB0\xF5\x83\x01\x36\x03\x56\xF1\x65\xEA\xD6\x91\x9E\xDA\x01\xB9\xF4\xF8\xCC\xAF\xF5\x51\xF7\x10\x00\xD2\xCC\x99\xE1\x01\xC1\xF5\x82\x03\x39\x03\x58\xF8\xAA\x8A\x08\x09\xE9\xCC\xCC\xE8\x01\x64\xF4\x00\x06\x1D\x0C\xAC\xE5\x08\x33\x29\xD1\xF4\x2F\xE6\x69\xF5\x3D\x05\x5A\xF0\xED\xC7\xD7\xB7\xC4\xD2\xF5\xFC\x00\x6E\xF7\x9C\x91\x4C\xFC\x97\xDD\x07\x12\xEB\x83\x00\x01\x50\x0D\xC7\x9C\x91\x4D\xFC\x64\xC4\x00\x01\xA0\x77\x31\x0A\x01\x74\xF4\x99\x0B\x4E\x90\xA7\xEC\x32\xCB\x00\x6F\xF5\x71\x06\x79\xF7\x86\x13\x4E\x98\xA7\xFC\x4B\xD2\x00\x78\xF5\x62\x5E\x7D\xF4\x2A\x23\x63\x9B\xCD\xCD\x2F\x59\x00\x02\xF6\x73\x5B\x00\x51\x36\x0E\x7B\x50\x38\x0B\x5E\x86\x32\x8B\xF5\xA8\xEE\x5E\x07\xF2\x96\xDC\x90\xB1\xFD\x8F\xC5\x04\x06\x99\x05\xF6\x3D\x38\x07\x00\x61\xF6\x10\x1D\x00\x0A\xEC\x9B\x4B\x0C\xF6\x12\xBD\x22\x9A", "\x2F\xEE\x20\xFB\x50\x39\x33\x94\xF6\x81\xF5\x92\xF4\x2A\x24\xB7\x96\x8D\xE4\x52\xDF\x00\x01\x50\x03\xEB\x2C\x03\x33\xF7\xBE\x9E\x8D\xF1\x3C\xEA\x00\x30\xF6\x64\x0C\x59\xF0\x56\x24\xB7\x91\x61\xE4\x52\xF5\x00\x01\x50\xCC\xDD\x39\x02\x7F\xF7\xC2\x91\x3F\xEC\x32\xC1\x01\x40\xF6\x64\x0D\x40\x03\xD0\xF4\x66\xF9\x2E\xB0\x2B\xCD\x01\x48\xF6\x67\xDB\xA5\xF4\x00\x04\xB7\x9A\x62\xE6\x1C\xD9\x01\x50\xF6\xA8\x21\x4E\x02\xD4\xF4\xB7\x9F\x4F\xE0\x12\xE5\x01\x38\xF6\x1B\x15\x55\x03\xCC\xF3\x6A\xF0\x7E\xF0\x92\xD8\xED\xDD\xEC\x5B\xF6\xF4\xEC\x57\xDF\x6C\xF4\x66\xE9\xDB\xC9\xD9\x9C\xD5\x88\x00\xB6\xF5\x06\x34\x1A\x0E\xB6\xFD\xD5\xD2\xA5\xF2\xF6\xED\x34\x71\x01\xDD\xF5\x6E\xE1\x79\xC0\x05\x38\xED\xAE\x44\x10\xF2\xDE\x58\x6F\x9F\x00\xF6\x38\xCC\x05\x3F\xED\xB3\x33\xFE\x01\xBD\xF6\xFC\xDC\xC9\xC8\x0B\x01\x40\x6D\xBB\x8C\x00\x96\x5C\xD4\x30\x6F\x98\xCE\xED\x5E\x45\x06\x07\xEE\xA1\x45\x1B\x00\x4B\x5E\x69\x34\xB7\x9F\x94\xE0\x12\xD1\x03\x17\xF7\xB8\x45\x14\x02\xE6\xF2\x22\x0C\xDB\x83\xC1\xFC\xA5\xDD\x01\x60\xF6\x54\x23\x0D\x02\x37", "\xFC\xDB\x97\xAA\xF1\x90\xE8\x01\xA9\xF6\xC0\x30\x11\x04\x75\xF2\xF1\xCF\x2F\xF3\x03\x0E\xF7\x64\x0D\xA8\xF1\x1C\x5C\xB7\x9F\x96\xFC\x40\xCA\xFA\x6D\xDD\x61\x00\x4B\x5C\xBB\x34\xB7\x94\x84\xE4\x52\xCD\x00\x42\x15\xCC\xDD\x38\x03\xE8\xF6\xC0\x9C\x84\xF1\x3C\xD9\x00\x48\xF7\x64\x0D\x3F\x03\xF2\xF2\x21\x0C\xDB\x80\xAC\xED\x97\x25\x00\xC2\x14\x56\xE1\xE4\xF4\x74\xFF\x98\xEC\x32\xF2\x00\x50\xF7\x4D\xED\xE9\xF7\x7E\x9F\x32\xF2\xC8\xC0\xDF\xD5\xD9\xE2\xF7\x44\xF7\x39\xF1\xE4\xCA\x09\x09\xBD\xE4\x33\x38\x02\x42\xF7\xDC\xF7\xD3\xF1\xE4\xCF\x0A\x0D\xBE\xFF\x5D\xF0\xEF\xCC\xF7\x46\xE9\xB3\xF3\x43\x04\x0C\x05\xBF\xEE\x6C\xF7\xEF\xD4\xF7\x78\xD8\xFD\xF5\xA1\x95\x7F\xF0\x98\x28\x07\x3F\xEF\xE3\xF7\x74\xE5\xF7\xCA\x1F\x04\x80\xF8\xAD\x38\x07\x1B\xEF\xF8\xF7\x7C\xE5\x98\xEC\x03\xF9\x63\xC2\xCA\x52\xDC\xF0\xDB\xEF\xCB\x98\x00\xF3\xF7\x41\x04\x14\x02\xAC\x02\x0E\x16\x00\x22\x59\x9B\xF7\xEC\xF0\x5C\xCE\x14\x0A\xC1\xE6\x08\x32\x02\x1D\xF8\x33\x10\x10\xF9\xFC\xF0\x16\xF1\x79\xD4\x05\x25\xF0\xE6\xC0\x28\xF8\xA0\xAE\x0A\xF8\x82\xF1", "\x43\xF7\x88\xEF\xF0\x80\x00\xCE\x01\x18\xF8\x6B\xBB\x86\xF0\xC0\xFC\x6F\xDC\xD2\xB7\xF8\xDC\x00\x1D\xF9\xD0\x7C\x87\xF8\xC0\xE0\xD0\xCC\x9F\xDE\x01\x13\xF9\x42\xDE\x10\xFA\x6E\x85\xC1\xE1\x75\x9D\x0F\xF0\xCA\xED\x00\x61\x15\x83\xF6\x20\x08\xE7\x95\xD4\xFC\xA5\xEE\x01\xC2\x14\xBD\x06\x3C\x02\x8A\xF4\x66\x18\x73\x9E\xEA\xE9\xC8\xF3\x01\x2C\xFB\x10\xBC\x8B\xFB\xA1\x18\x73\xA6\xEA\xE9\xC8\xF8\x00\x31\xF8\x25\xBC\x8C\xF8\x0A\x38\x73\xA9\xE8\xE9\xC8\xFD\x00\x35\xF9\x8C\x46\xB8\x4A\x21\xD8\x73\xB6\xEA\xC0\xC4\x02\x00\xE3\x4A\xDE\x06\x00\x04\xC7\xFD\xE2\xDA\x6B\xEF\xCB\x07\x00\x3D\xF9\xDC\x55\x8F\xF5\xC6\xFF\xD1\xF0\x95\x8C\x00\x82\xF8\x3B\x0C\x21\xFD\x8D\xFD\x2E\xFC\x54\xD1\x00\x09\xF9\xDD\x57\x45\xF8\x60\x30\xCF\x98\xAD\xFC\x4B\xD6\x00\x10\xF9\x73\x5A\x49\xF8\xB6\x30\xCF\x99\xA5\xFC\x4B\xDB\x00\x18\xF9\x86\x1C\x4D\xF9\x06\x30\xCF\x94\xAE\xE0\x12\xE0\x00\x20\xF9\xAD\x68\x51\xF9\xBB\x30\xCF\x9C\xAE\xFC\x4B\xE5\x00\x28\xF9\x98\x6C\x55\xFA\x8B\x40\xCF\x95\xAF\xFC\x4B\xEA\x00\x30\xF9\x2E\x00\x59\xFB\x6C\x30\xCF\x9D\xAF", "\xE0\x12\xEF\x00\x30\xF9\x33\x00\x5D\xF9\xA8\x40\x44\xDA\x2C\xCA\xBE\xFB\xC6\xB3\x33\xE6\x9C\xDE\x99\xC5\xF7\x36\xE5\xEF\x8A\x4F\xCF\xE0\x42\xF9\xB8\x45\x35\x02\x91\xF5\xDE\x9B\xFC\xDC\x55\x75\x00\x50\xF9\x82\x4E\x36\x03\x34\xFA\xD5\xC1\x79\xD6\x01\x18\xF3\xF6\xF4\xDB\xF9\xED\xDD\x1A\xCF\x06\x0F\xCD\xFE\xD3\xE1\xF3\xB7\xCD\x31\xC8\x1C\x01\x39\xF9\x40\xCF\x06\x07\xE7\xFE\x9A\xB1\xC8\x39\x01\x75\xF8\xAF\x00\x0E\x0E\xCE\xF3\x7F\xEF\x97\xBA\x00\xF2\xF9\x2F\x95\x3D\xFC\xD9\xC1\x43\xDB\x01\x39\xF3\xD0\x96\xFB\xF9\x69\xCC\x29\xCF\x9F\xF6\xBE\x81\xE8\xE3\xA8\xBC\x05\x3D\x00\x82\xFB\x41\x04\x0E\x01\xD0\xF3\x80\xC2\x27\x3E\x00\x0A\xFB\x9E\x99\x40\xFF\x45\xD2\x9C\x1F\x01\x11\xF4\xF7\x9B\x01\xFA\x1B\xD7\x7C\x08\x08\x07\xD1\xF0\x74\x81\xF4\xBC\xD4\x67\x09\x20\x01\x47\xFA\x44\xFF\xAC\x55\x77\x83\xA9\x8E\xE7\x42\x01\x8E\xF9\x1E\x01\xA0\xFA\xA4\xD1\x6E\x03\x01\x2A\xF9\x44\x00\xE3\x4A\x70\x02\x0F\x06\xA4\xEF\xCA\xCE\xF3\x8F\x08\x1D\xFB\x3D\x01\x4D\xFF\x3D\xDC\x64\xC7\x02\x1D\xF4\xA5\xF4\xCF\x55\xA7\xF3\x7D\xD4\x48\xD8\x04\x1D", "\xE8\xEB\xE8\xC1\xFA\xFD\xD2\xC3\xC5\x12\x05\xA3\xFE\x07\x1B\xE9\xC3\xA8\xFA\xC9\x1D\xFB\x3F\x02\x53\xFB\xFD\xD1\x43\xCB\x02\x1D\xF4\x80\x01\x53\xFB\x07\xD4\x5C\xCC\x09\x0D\xD1\xE1\x04\x19\xF5\x96\xD4\x86\xC7\x26\x01\x47\xFA\x10\x0F\xD5\xFC\x50\xD4\x94\x9D\xFA\x83\x01\xB2\xF8\xD9\xCF\xBD\xCF\x04\x1D\xE8\xC4\x02\x6A\xFA\x0E\xFB\xF9\x08\x14\x05\xA3\xF7\x1E\xC8\xEA\xF9\x9C\xA7\xCA\x1D\xFA\x43\x02\x5A\xFA\xA3\xF7\x46\x12\x02\x1D\xF4\xBA\xF4\x76\xFB\x13\xE2\xE1\xC3\x0A\x0D\xD1\xE8\x04\x2A\xF5\xA7\xFA\x26\xDC\x2A\x01\x47\xF9\x11\x0A\xD6\xED\xE9\xDA\x2F\x55\x00\xAA\xF8\x2B\x02\x4C\xFB\x13\x26\xA4\xE5\xA8\xAD\xEC\x8E\xE7\x58\x00\xE3\x4B\x40\xEB\x11\x03\xA0\xE4\xD1\xF5\xEC\x91\xE4\x9A\xFA\x32\x0C\x26\x05\xB3\xF3\xF7\x99\xBD\xCC\x99\xEE\x00\xC6\x4A\x66\xDD\x29\x04\x88\xF6\x10\x05\xA8\xAD\xE3\xE7\x08\x7A\x01\xD4\xF8\x99\x0C\x4F\xFC\xDB\x45\xA8\xB6\xE3\xC4\xD4\x86\x00\xD9\xFB\x86\x11\x18\x0C\xDA\xE5\x08\x05\x54\xD5\xF6\x31\xC8\x49\x02\x6E\xFD\xDD\xED\xDB\xE0\x00\x05\x54\xCA\x46\xA7\xEE\x8B\xF6\x71\xFD\x20\xF1\x79\xDE\x04", "\x21\xF6\x9B\x14\xDD\x00\xD2\xFB\x40\xAC\x3D\xE2\x76\xE3\xEE\xC0\x66\x6A\x01\xC5\xFB\x82\xAA\x45\xF1\x8D\xC5\x0B\x16\xEE\xCD\xF0\xD9\xFB\xF0\xEE\xBE\xD1\x30\x06\xBB\xF9\x81\x26\x00\x01\xA0\x26\x33\x05\xAB\x68\xDD\x1A\xCD\x19\x04\xDE\xF2\x0C\xE7\xF7\x84\xAA\xFF\xEF\xF7\xC9\x36\x05\xBD\xF8\x86\xCF\xEF\xDE\xF6\xFA\xD7\x4C\xCD\x72\x00\x7D\xFB\x36\x30\x03\x16\xEF\xE5\xF6\xDA\xDF\x91\xCF\x78\x02\x71\x4D\xDD\xDE\x03\x01\x40\x68\x66\x05\xAA\x94\xF6\x3D\x3A\x3F\x03\xBF\xF1\x2A\x4F\xDA\xF5\xF6\xF7\xEC\x4C\xCC\x05\x03\x89\x4C\xD9\xDB\x05\x1E\xEF\xD3\xF7\x8A\x02\xA6\xF6\x20\xC6\x05\x07\xC4\x43\x50\xE9\x03\x38\xEE\xF7\xFB\x5E\xF3\xF7\xC9\x08\x04\xC3\xF4\x66\x16\x03\x1F\xF8\xFF\xFB\x32\xF1\xF7\xC8\x0B\x07\xC4\x4D\xEE\xC3\x04\x01\xA0\x6C\x35\x05\xAB\xDE\xF4\x91\xD1\x07\x0C\xE2\xE4\x33\x13\x02\x2F\xFC\xF0\xFB\x21\xF0\x5C\xCE\x08\x03\xE1\xEF\x78\xD6\xF8\xAD\xFB\x7F\xF3\xF7\xCA\x14\x05\xC7\xFB\xA1\x11\x05\x3F\xF8\xBE\xFB\xCD\xE6\xFA\xE1\x8D\xFB\x43\x1F\x0B\x06\xF0\xF9\xF8\xEA\x8F\x91\xCF\x35\x00\x91\xF8\x15\x2E\x0C\x07\xF2\xCB", "\xF7\xE3\xF0\x4C\xCD\x3B\x03\x94\xF8\x30\x3C\x0D\x16\xF2\xC5\x54\xA0\xEB\x4C\xCD\x41\x03\x92\xFB\x27\xF8\xE3\xE0\xF1\xDF\xE6\xCC\xCC\x90\x01\x31\xFC\x60\x32\x1F\x05\xE6\xE8\xF1\xF9\xEF\xC0\xD9\x6A\xFC\x6C\x36\x02\x02\x58\x10\xE3\xE1\xE0\xDC\xB0\xF1\xFC\x19\x30\x0D\x00\x9D\xFF\xC9\xF1\x6E\xEF\x2F\xF7\x02\x78\xFC\xED\x34\x15\x02\xB0\x17\xC0\xFF\xF6\xCF\x2F\xC4\x03\x00\xFD\x9F\xED\x41\xFC\x9F\xFE\x20\x08\x5C\xFC\x40\xD1\x03\x5B\xFC\x6E\xE3\x13\x4E\xC3\x02\x58\x18\xDE\xE2\xE1\xDC\xAA\xDF\x01\x90\xFD\x82\x03\x3A\x02\xD2\xF7\x1D\x94\xF4\xCB\xFA\x85\x02\xDB\xEA\x5D\xDD\xA6\xF8\x00\x09\x0F\x1C\xF4\xFB\xEF\x9E\xFD\x66\xFC\x83\x02\x2E\xF0\x48\xCB\x0F\x03\xF5\xC7\x00\x74\x54\xC2\x02\x39\x00\xAA\xFE\xCD\xF3\x8C\xEF\x2F\xC9\x00\x74\x54\x36\x0B\x0A\x00\xAC\xFF\x9E\xA3\xEB\xF7\xF0\xC6\xD1\xF0\xCA\x17\x00\x3A\x55\x3C\x0C\x04\x0B\xEB\xEF\x08\x0E\x02\x0A\xFD\xEF\xDA\x8D\xB4\xC3\xCC\x4E\x53\x50\xFD\x04\x09\xF1\xC0\xD4\x06\x03\xD9\xED\x1A\xC9\x06\x0C\xEC\xE4\x33\x2A\x02\x4F\xFD\xA6\xFA\xBE\xD0\x0F\x00\xD7\xF4\x66\x17\x05\x3D\xFA", "\x86\x02\xD0\xFD\x1D\xE8\x93\xC8\x09\x0C\xED\xFB\x50\x05\x03\x5F\xFD\xE1\xA9\xA6\xF4\xA7\xD4\x0A\x05\xEE\xE8\x85\x13\x03\x68\xFD\x00\x01\x70\xFC\x00\x00\xB8\xFF\x41\xED\xF7\xD8\xE2\xF0\xFD\xF2\xFD\xAE\xF6\xE1\xC4\x0D\x05\xED\xEC\x59\xD8\xFB\xD4\xFB\xCC\xCF\x3B\x02\xBD\xF8\x5B\x3C\x0F\x18\xF7\xEA\xED\x8B\xCF\x03\xFF\x0C\x32\x02\x06\xB8\x46\x9A\x32\xF7\xDF\xE4\x9C\xD0\x8F\x01\x84\xFD\xBB\x30\x03\x0C\xF0\xF2\x08\x32\xFB\xEA\xFB\x1C\xD1\x4D\x02\xC4\xFB\x28\xD5\xF1\xE9\xF6\xE5\xD4\xEF\xCB\xA7\x01\x8D\xFF\x6C\x34\x06\x0D\xF1\xF8\x79\xB7\xE4\xC0\xC4\xB3\x00\x91\xFD\xB2\xD5\xE4\xF7\x10\x12\xF7\xFF\xE4\x8E\xE7\xBF\x00\x61\xFC\x99\x0B\xAE\xF9\xCB\x52\xF7\xC9\xF8\xD1\x1B\xCC\x00\x95\xFC\xAE\x47\x0B\x0C\xF2\xE0\xF7\xD0\xF8\xFC\xD2\xD8\x00\x9D\xFE\x9B\xF5\xE7\xF9\xEE\xF8\xF0\xF0\x95\xE4\x01\xFD\xFC\x54\x23\x1E\x03\xC0\xF6\xF1\xE3\x61\xFC\xA5\xEF\x01\x49\xFE\xC0\x30\x22\x04\xE9\xFE\xF1\xE9\xF1\xCC\x9F\xFA\x01\x32\xFF\x0D\x15\x25\x06\xB8\x4C\xAE\x32\xF7\xF2\xF8\x8E\xE7\x07\x00\xFB\xC1\xBB\xDD\x14\x0C\xF5\xED\xFA\xFA\xF8\x9C", "\xD5\x14\x00\xFB\xC0\xB3\xDD\xBB\xFC\xDB\x52\xF7\xE4\xDA\xE9\xC8\x20\x00\xB5\xFE\xC5\xD4\xE8\xF1\xEF\xE9\xF2\xC6\x8E\xAC\x00\x62\xFE\x32\x0D\x34\x06\xB8\x48\x9A\x32\xF7\xDB\xE1\x8E\xE7\x39\x00\xB9\xFF\x86\x10\x1C\x04\xF7\xF2\xF7\xD0\xD6\x9C\xD0\x45\x00\xC1\xFC\x2A\x26\x1D\x05\xF8\xE2\xB6\xD0\xE5\xF9\xFE\x1B\x14\x7E\x01\xD9\xFD\xEA\xF7\xE6\xFC\x4B\xDE\x01\x10\xFF\x66\xC9\x13\x4D\xD7\xFE\xCE\xF1\xE5\xF8\xFC\xC0\x66\x1C\x00\x9A\xFE\xB3\xFF\x6B\xF4\xC9\xC8\x07\x1E\xFC\xD8\x6B\x2B\xFC\x71\x58\x79\xFF\x22\xF2\x38\x15\x08\x06\xFD\xD9\x60\x3C\x00\x27\x4D\xBE\xFD\xA1\xFC\xF9\xC2\x09\x0E\xFD\xED\x6B\x4B\x00\xB1\xFE\xD1\xFF\x73\xF7\xBD\xCF\x09\x0A\xFC\xDB\xCB\xF6\xC3\xC2\x02\x2D\x03\x89\x4D\xE1\xF6\xE9\xF1\x3C\xED\x02\x3E\xFF\x06\x03\x5C\x00\xF0\xFB\xF5\xD3\xFC\xFA\xFD\xE3\xE7\x9C\xD5\xBB\x00\xE4\xFD\x41\x07\x18\x0B\xFC\xF1\x6E\x8D\xFF\x94\xFF\xAA\xFC\xB8\xC9\x32\x02\xFA\xF3\xA7\xB5\xFE\xFB\x7C\xD7\xFF\x26\xFE\x1F\xF8\x15\xF4\xFB\xF3\x0E\x1E\xFE\xF9\x48\xE0\xFF\x2D\xFE\x3C\xD8\x5C\xCD\x1C\x06\xFB\xF2\x07\x26\xFF\x8B\x36", "\xB9\xFE\x69\xC7\xFD\x84\x53\xD4\x0F\x16\x0F\xD3\xF1\xD4\x49\xB1\xF4\xB8\xC9\x3D\x06\x3E\xCA\x37\x19\x07\x36\xFF\xA4\xEB\x2C\x5A\x7C\x69\xFA\x00\xFC\x7F\xAC\x78\xFF\x7F\x1B\x0A\x05\x0D\x67\x7C\x1C\x68\xFF\x00\x04\x80\xE3\x2A\xC6\x27\x1A\x62\x05\x0D\x6F\x7C\x1C\x68\x04\x00\xC6\x27\x7A\x03\x08\x00\x0E\x80\x00\x80\x2D\x74\x70\x65\x09\x00\x14\x80\x40\x01\x17\x80\x07\x80\x7F\x7C\xCC\x67\x0E\x00\x1C\x80\x6A\x2B\x1E\x80\xA8\x10\x05\x0D\xC6\x7A\x7C\x69\x13\x00\x23\x80\xD0\x2C\x25\x80\x80\x19\x05\x0D\xCF\x7A\x7C\x69\x18\x00\x2B\x80\x0F\x6A\x2D\x80\xD8\x1A\x05\x0D\x95\x7C\x40\x62\x1D\x00\x33\x80\xF9\x14\x35\x80\x19\x18\x05\x0D\x9D\x7C\x13\x6B\x3B\x80\xDF\x07\x3D\x80\xED\x1A\x05\x0D\xA5\x7C\x86\x63\x27\x00\x42\x80\xF1\x36\x44\x80\x2E\x22\x05\x0D\xAD\x7C\x40\x62\x2C\x00\x4A\x80\x30\x00\x4C\x80\xB3\x19\x05\x0D\xB5\x7C\x40\x62\x31\x00\x4A\x80\x35\x00\x54\x80\xA1\x22\x05\x0D\xBD\x7C\x86\x63\x36\x00\x4A\x80\x3A\x00\x5C\x80\xB8\x22\x34\x5E\x3E\x7F\x62\x6E\xC7\x7C\xA1\x22\x66\x80\xF8\x7F\xB0\x72\x69\x80\xB8\x22\x1E\x50\x24\x7B", "\x1D\x72\x39\x72\x62\x28\x15\x50\x06\x67\x9C\x6A\x3B\x00\xC6\x27\x9E\x68\xAF\x00\xA6\x7E\x07\x50\x12\x01\xA7\x00\x02\x7C\xB7\x05\xC6\x27\x15\x69\xB1\x00\x27\x26\xCC\x01\x15\x50\xAF\x67\x9C\x6A\x40\x00\x82\x80\x64\x06\xB4\x00\x85\x80\xFB\x54\x0F\x01\x88\x00\x80\x80\x8A\x22\x8B\x80\x1B\x0A\x7F\x7E\x39\x67\x15\x50\x8E\x67\x9C\x6A\x46\x00\x94\x80\xA8\x10\xBB\x00\x27\x26\x7A\x03\x15\x50\x5F\x7F\x26\x6E\x49\x00\x9C\x80\x80\x19\xBF\x00\x9F\x80\x8F\x80\x56\x7F\x4C\x66\x4C\x00\xA5\x80\xD8\x1A\xC3\x00\xA8\x80\x58\x6A\xEB\x10\x92\x80\x09\x40\xAD\x80\x19\x18\xC7\x00\x8E\x80\xB1\x80\x46\x1B\xB3\x80\x6E\x41\xB5\x80\xED\x1A\xCA\x00\xB8\x80\x7D\x80\x42\x56\xBB\x80\x55\x00\xBD\x80\x2E\x22\xCD\x00\xC0\x80\xFD\x54\x12\x01\xC3\x00\xBB\x80\x58\x00\xC5\x80\xB3\x19\xD0\x00\xC8\x80\x1D\x50\x42\x59\xBB\x80\x5B\x00\xCE\x80\x0F\x70\xD1\x80\x05\x01\x15\x50\xD9\x00\xBB\x80\x5E\x00\xD6\x80\xB8\x22\xD6\x00\xD8\x80\x14\x50\x2A\x49\xBB\x80\x61\x00\xDE\x80\x82\x27\xD9\x00\xE1\x80\x15\x50\xF3\x00\xBB\x80\x64\x00\xE6\x80\x71\x26\xDC\x00\xB0\x80", "\xC1\x80\x4E\x05\xBB\x80\x67\x00\xEE\x80\x62\x28\xE0\x00\xE9\x80\x8E\x7F\x40\x62\x6A\x00\xF6\x80\x01\x62\xE3\x00\xF1\x80\xC9\x80\xF2\x7B\xEF\x65\x6D\x00\xFD\x80\xBC\x02\xE7\x00\x00\x81\xD2\x80\xCD\x6A\xBB\x80\x70\x00\x05\x81\x3D\x5B\xF9\x80\xE9\x5B\xBB\x80\x73\x00\x0D\x81\x3F\x5B\x08\x81\xD9\x80\x9C\x7F\x1B\x70\x13\x81\x0A\x01\xF2\x00\x15\x81\xE2\x80\xB7\x79\xFB\x6B\x19\x81\x07\x01\xF6\x00\x1C\x81\x15\x50\xF2\x00\xBB\x80\x7C\x00\x20\x81\x06\x01\xFA\x00\x23\x81\xCD\x04\xBB\x80\x7F\x00\x28\x81\x05\x01\xFE\x00\x0F\x81\x31\x22\xC9\x01\x40\x62\x82\x00\x2F\x81\x80\x25\x74\x2A\xCC\x01\x17\x50\x71\x80\x23\x72\x73\x80\x01\x62\x0F\x50\x76\x80\x91\x67\x85\x00\x79\x80\x64\x06\x04\x00\xC5\x7E\xF2\x52\x95\x63\xBB\x80\x87\x00\x37\x81\x06\x00\x39\x81\xFC\x54\x5C\x77\xBB\x80\x8A\x00\x37\x81\xB7\x7E\x12\x64\x0F\x50\x91\x80\x9C\x6A\x8D\x00\x37\x81\x0C\x00\x74\x2A\x7A\x03\x0F\x50\x99\x80\x91\x67\x90\x00\x37\x81\x10\x00\x5C\x81\x4F\x81\x4B\x3F\xBB\x80\x93\x00\x37\x81\x14\x00\x64\x81\xEF\x52\x66\x79\x9C\x6A\x96\x00\x37\x81\x18\x00", "\x6B\x81\x48\x81\x78\x0B\xBB\x80\x99\x00\x37\x81\x1C\x00\x4E\x81\x6C\x81\x06\x01\x9A\x67\x9C\x6A\x9C\x00\x37\x81\x1F\x00\x79\x81\x73\x81\x06\x01\xA4\x00\xBB\x80\x9F\x00\x37\x81\x22\x00\x81\x81\xFA\x54\x59\x58\xBB\x80\xA2\x00\x37\x81\x25\x00\x89\x81\x09\x50\xD3\x80\x9C\x6A\xA5\x00\x37\x81\x28\x00\x90\x81\x0E\x50\xDF\x5A\xBB\x80\xA8\x00\x37\x81\x2B\x00\x97\x81\x16\x50\xE3\x80\x9C\x6A\xAB\x00\x37\x81\x2E\x00\x9E\x81\x0F\x50\xEB\x80\x9C\x6A\xAE\x00\x37\x81\xD4\x7E\x39\x67\x0F\x50\x65\x00\xBB\x80\xB1\x00\x37\x81\x35\x00\xA5\x81\xFA\x80\x86\x63\xB4\x00\x37\x81\x38\x00\x72\x81\x8A\x81\xEA\x7B\x7E\x7E\x37\x81\xDB\x7E\xAC\x81\xEC\x4E\xBB\x80\xBA\x00\x37\x81\x40\x00\xB3\x81\x10\x81\x9C\x6A\xBD\x00\x37\x81\x43\x00\xB9\x81\x91\x81\x1E\x81\x4C\x66\xC0\x00\x37\x81\x47\x00\xCB\x81\x98\x81\xCD\x81\x7C\x69\xC3\x00\x37\x81\x4B\x00\xD2\x81\x9F\x81\x9A\x5B\xBB\x80\xC6\x00\x37\x81\x4F\x00\xD9\x81\x0F\x50\x2D\x00\xBB\x80\xC9\x00\x37\x81\x53\x00\xC5\x81\x33\x81\x9C\x6A\xCC\x00\x37\x81\x56\x00\x9E\x81\xAB\x4F\x0A\x7A\x1C\x68\xCF\x00", "\x64\x80\x72\x80\x01\x62\xAB\x4F\x56\x7C\x40\x62\xD0\x00\x4A\x80\xD4\x00\xF2\x81\x71\x26\xAB\x4F\x5F\x7C\x1C\x68\xD5\x00\x4A\x80\xD9\x00\xFB\x81\x62\x28\xAB\x4F\x09\x80\x44\x6A\xDA\x00\x4A\x80\xDE\x00\x03\x82\xF4\x81\x7F\x5A\x40\x62\xDF\x00\x4A\x80\xE3\x00\x0B\x82\xBC\x02\xAB\x4F\x77\x7C\x86\x63\xE4\x00\x4A\x80\xE8\x00\x12\x82\x13\x50\x38\x7A\x69\x64\xE9\x00\x4A\x80\xED\x00\x1A\x82\x1A\x50\x0A\x01\x28\x80\x1D\x6A\x4A\x80\xF2\x00\x21\x82\x1C\x50\xDD\x5A\x70\x65\xF3\x00\x4A\x80\xF7\x00\x28\x82\x06\x50\x07\x01\x38\x80\x86\x63\xF8\x00\x4A\x80\xFC\x00\x2F\x82\x26\x50\xDE\x7A\x9C\x6A\xFD\x00\x4A\x80\x01\x00\xA0\x0C\x1A\x62\xAB\x4F\x47\x80\x31\x64\x02\x00\xA0\x0C\x7B\x7C\x3E\x82\x5F\x6D\xEB\x5A\x70\x65\x07\x00\x44\x82\x71\x2B\x46\x82\x1B\x0A\xAB\x4F\x57\x80\x86\x63\x0C\x00\x4B\x82\x76\x06\x4D\x82\xA8\x10\xAB\x4F\x5F\x80\xD2\x6E\x53\x82\xDD\x2B\x55\x82\x80\x19\x3E\x50\xB4\x7E\xBA\x71\x82\x7A\xA8\x10\x2E\x51\x01\x81\xC6\x7C\x61\x82\x80\x19\x52\x50\xEF\x81\x44\x6A\x16\x00\xA0\x0C\x92\x7A\xB3\x19\x52\x50\xF6\x81\xBF\x66", "\xA0\x0C\xF7\x18\x1F\x00\x5C\x82\xD8\x1A\x52\x50\xFE\x81\x44\x6A\x20\x00\x72\x82\xCF\x02\x75\x82\x19\x18\x52\x50\x06\x82\x8E\x73\x27\x00\x7B\x82\x37\x03\x7D\x82\xED\x1A\x52\x50\x11\x80\x44\x6A\x2E\x00\x83\x82\x79\x2A\x85\x82\x2E\x22\x52\x50\x15\x82\x31\x64\x35\x00\x8B\x82\x8E\x24\x8D\x82\x6E\x82\x20\x80\x4C\x66\x3C\x00\x93\x82\x40\x06\x95\x82\xA1\x22\x52\x50\x24\x82\x86\x63\x43\x00\x9A\x82\xA3\x27\x9C\x82\xB8\x22\x52\x50\x30\x80\x40\x62\x4A\x00\xA2\x82\x99\x40\xA4\x82\x82\x27\x52\x50\x32\x82\xD5\x68\xAA\x82\x57\x00\xAC\x82\x71\x26\x52\x50\x40\x80\xFE\x68\xAA\x82\x5E\x00\xB3\x82\x62\x28\x52\x50\x41\x82\x69\x64\x5F\x00\xAA\x82\x65\x00\xBA\x82\x01\x62\x52\x50\x4F\x80\x86\x63\x66\x00\xAA\x82\x6C\x00\xC2\x82\xBC\x02\x52\x50\x50\x82\x31\x64\x6D\x00\xAA\x82\x73\x00\xCA\x82\x65\x7B\xB3\x5F\x70\x65\x74\x00\xAA\x82\x7A\x00\xD2\x82\xF8\x7D\x00\x00\x3F\x1B\xC9\x7D\xB3\x19\x59\x00\x74\x2A\x80\x03\x2E\x75\x93\x71\x29\x7B\xF3\x81\xBC\x02\x5A\x00\xE0\x82\x12\x01\xD3\x50\x97\x7D\x26\x6E\x7B\x00\xA0\x0C\x03\x75\x5B\x00\x59\x7F", "\x1B\x51\x03\x68\x70\x65\x86\x00\xEE\x82\x64\x06\x68\x00\xF1\x82\x18\x51\xD9\x7E\x40\x62\x91\x00\xA0\x0C\xCC\x6E\x75\x00\x74\x2A\xA6\x19\xD3\x50\xAF\x7D\xBC\x02\x9D\x00\xFE\x82\x64\x06\x83\x00\x01\x83\xE9\x82\xC9\x77\x62\x77\x07\x83\x1B\x0A\x91\x00\x0A\x83\xE6\x50\x47\x73\x9C\x6A\xB5\x00\x0E\x83\xA8\x10\x9F\x00\x11\x83\xF2\x82\x06\x01\xFA\x7E\x31\x64\xC1\x00\xF6\x82\x1B\x0A\xAD\x00\xF9\x82\xEB\x65\xD3\x82\x4C\x66\xCC\x00\x16\x83\x80\x19\xBA\x00\x19\x83\xFA\x82\x15\x79\x70\x65\xD8\x00\x27\x83\xD8\x1A\xC8\x00\x2A\x83\x23\x83\x6F\x7B\x91\x67\xE4\x00\x2F\x83\x19\x18\xD6\x00\x32\x83\x4B\x5F\xAC\x7A\x64\x78\x37\x83\xED\x1A\x48\x7F\xBC\x2D\xD3\x50\x59\x76\x1C\x68\xFC\x00\x3E\x83\x2E\x22\xF2\x00\x3A\x83\x00\x00\xD3\x50\x84\x7B\x31\x64\x08\x00\x1E\x31\xCC\x6E\x00\x00\xF6\x61\x02\x83\x0D\x78\x28\x79\x1E\x31\xED\x6E\x0E\x00\xF6\x61\xA8\x19\xD3\x50\x37\x7F\xDA\x0B\x21\x00\x4F\x83\x64\x06\x1D\x00\x52\x83\x0B\x83\x1B\x78\x9C\x6A\x2D\x00\x5F\x83\x1B\x0A\x2B\x00\x62\x83\x12\x83\x07\x01\x19\x7E\x86\x63\x39\x00\x1E\x31\x03\x75", "\x81\x7F\x58\x11\xD3\x50\xAE\x7B\x69\x64\x44\x00\x70\x83\x64\x06\x46\x00\xB6\x7F\xD3\x50\xA2\x80\x04\x5E\x56\x83\x64\x06\x53\x00\xF6\x61\xEC\x1A\x7C\x83\xBB\x80\x5C\x00\x7F\x83\x67\x74\x82\x83\x63\x83\x77\x79\x9C\x6A\x69\x00\x67\x83\xA8\x10\x73\x00\x6A\x83\x1A\x83\x82\x6D\x70\x65\x75\x00\x8E\x83\x80\x19\x81\x00\x91\x83\x2B\x83\xE9\x3C\xEF\x65\x81\x00\x87\x83\xA8\x10\x8F\x00\x59\x83\x8A\x83\xB0\x47\x70\x65\x8E\x00\x96\x83\xD8\x1A\x9E\x00\x99\x83\x33\x83\x88\x7A\x70\x65\x9A\x00\xA6\x83\x19\x18\xAC\x00\xA9\x83\x3B\x83\x02\x81\xCC\x67\xA6\x00\x9E\x83\x28\x83\x89\x83\x6B\x83\x06\x71\x9C\x6A\xB3\x00\xB6\x83\x03\x78\xB8\x83\x92\x83\x99\x40\xBB\x80\xC0\x00\xBD\x83\x19\x18\xDA\x00\xBF\x83\x9A\x83\x6F\x7E\x91\x67\xCD\x00\xC4\x83\xED\x1A\xEA\x00\xC7\x83\xAA\x83\x7D\x7E\x3E\x6C\xCC\x83\x2E\x22\x03\x80\xB9\x2C\xD3\x50\xC7\x79\x26\x6E\xE7\x00\xD3\x83\x29\x63\xC6\x27\x5A\x83\x17\x7C\xCC\x67\xF4\x00\xAE\x83\x37\x68\xD9\x2A\x3E\x2C\xC6\x27\x53\x83\xA7\x78\x33\x76\xA9\x14\x36\x05\x0E\x00\xA9\x14\x87\x02\xE6\x83\xA2\x83\xCF\x7F", "\x91\x67\x10\x00\xEA\x83\x6F\x2A\xED\x83\x0F\x38\xEF\x83\xB9\x83\x35\x7C\xF3\x73\xF4\x83\xB0\x36\xF6\x83\x06\x08\xF8\x83\xC0\x83\xF6\x79\x31\x64\x2C\x00\xFC\x83\xB3\x57\xFE\x83\x8B\x40\x00\x84\xC8\x83\x80\x40\x9C\x6A\x3A\x00\xA9\x14\xF1\x04\x47\x00\x07\x84\x35\x22\xDD\x83\x12\x01\x28\x51\x0F\x01\xEB\x82\xBC\x2A\x49\x00\xA9\x14\x03\x75\x04\x81\x58\x11\x15\x84\x45\x70\x70\x65\x54\x00\x1A\x84\x64\x06\x7A\x00\xC6\x27\xF1\x04\x1E\x84\x48\x44\x0E\x77\x05\x84\x80\x19\x4B\x81\xBC\x2D\x27\x84\x30\x74\xDF\x70\x2A\x84\xD8\x1A\x95\x00\x09\x84\x3C\x69\x0C\x83\x01\x7F\x31\x84\x19\x18\xA3\x00\x34\x84\x05\x01\x2E\x84\xA7\x6E\x94\x72\x38\x84\xED\x1A\xB0\x81\x2D\x84\xCC\x7D\xEF\x65\x8F\x00\x22\x84\x4C\x7E\x25\x84\x14\x84\x24\x83\x7C\x69\x9A\x00\x40\x84\x2E\x22\xEA\x81\x43\x84\x2C\x83\x9C\x6A\xA6\x00\x4E\x84\xB3\x19\x08\x82\x51\x84\x60\x6A\x70\x65\xB2\x00\x55\x84\xA1\x22\x19\x82\x58\x84\xC4\x7A\xE5\x6C\x5C\x84\xB8\x22\xF6\x00\x3B\x84\x50\x5F\xF1\x7D\xA0\x79\x62\x84\x82\x27\x04\x00\xA0\x0C\xA6\x19\x3D\x84\x2D\x75\x70\x65\xD6\x00", "\x69\x84\x71\x26\x12\x00\x6C\x84\x4A\x84\x00\x7E\xEF\x65\xE2\x00\x0E\x84\x2F\x68\xA0\x0C\xA8\x19\x6E\x84\x5C\x83\xC2\x09\xEF\x00\x72\x84\x62\x28\x2F\x00\x75\x84\x90\x80\x3F\x7F\xAC\x7E\x82\x84\x01\x62\x3D\x00\x85\x84\x35\x74\x5B\x6D\x80\x7C\x25\x0C\x03\x75\x4B\x00\xA0\x0C\x26\x84\x4E\x7F\x40\x62\x12\x00\x90\x84\x64\x06\x58\x00\x93\x84\x76\x84\xAA\x80\x7C\x69\x1D\x00\x25\x0C\xED\x6E\xC1\x82\x71\x2C\x6E\x84\x7D\x83\xED\x25\x2A\x00\xA0\x84\x64\x06\x75\x00\xA0\x0C\xEC\x1A\x6E\x84\xC5\x7B\x8E\x73\x37\x00\x25\x0C\xCC\x6E\x85\x00\x8C\x84\x23\x77\x41\x7E\xCC\x67\x43\x00\xB1\x84\x36\x7E\xB4\x84\x35\x84\x87\x79\x4C\x66\x4F\x00\xA8\x84\x1B\x0A\xA1\x00\x7C\x84\x9C\x84\xA3\x83\x9C\x6A\x5C\x00\xB9\x84\x1B\x0A\xB0\x00\xBB\x84\x3C\x84\xE4\x7B\x5F\x79\xC8\x84\xA8\x10\xBE\x00\xCB\x84\x66\x84\xB3\x83\x2D\x69\xC0\x84\xD7\x6F\xAB\x84\xC4\x84\xBA\x83\x91\x67\x81\x00\xD6\x84\x5C\x7E\xD8\x84\x86\x84\xD4\x81\x40\x62\x8E\x00\xDD\x84\xD8\x1A\xEC\x00\xDF\x84\x8D\x84\xE1\x84\x86\x63\x9B\x00\xE4\x84\x19\x18\x45\x83\xA3\x84\xC3\x6D\x7C\x69", "\xA8\x00\xEC\x84\xED\x1A\x0C\x00\x1E\x31\x7D\x84\xB3\x7F\x24\x6C\xF3\x84\xAD\x63\xF6\x84\xD9\x84\x98\x6C\x17\x71\xCF\x84\xE6\x59\x25\x0C\xC2\x01\x2A\x00\x1E\x31\x6D\x84\xC5\x7F\xEF\x65\xD0\x00\x00\x85\x06\x01\xDC\x00\x02\x85\xB8\x28\x05\x85\xFD\x84\x96\x54\x70\x65\xDE\x00\x0A\x85\x05\x01\xEA\x00\x0D\x85\x0F\x04\x0F\x85\xE0\x84\xEC\x79\x91\x67\xEC\x00\x14\x85\x7E\x5C\x17\x85\x77\x16\x19\x85\xE8\x84\x5D\x71\xF9\x6A\x1E\x85\x06\x00\x6D\x22\xB0\x08\x22\x85\xB5\x84\xCC\x78\x4C\x66\x08\x00\x6D\x22\xF1\x04\x15\x00\x28\x85\x5D\x6C\xFC\x84\x0F\x01\x9A\x5E\x0A\x01\xA3\x71\x8E\x73\xCA\x7D\x7F\x00\x1E\x31\x80\x03\x36\x85\xE4\x41\x7C\x69\xCA\x7D\x80\x00\x3C\x85\x9B\x10\xFF\x43\xCC\x67\x17\x00\x6D\x22\xF7\x7F\xDC\x0E\x30\x77\x9C\x6A\x18\x00\x6D\x22\x7A\x03\x1C\x00\x48\x85\x30\x6C\x01\x80\x39\x80\x4E\x85\xC4\x14\x51\x85\x1B\x0A\xDD\x0E\x80\x82\x26\x6E\x22\x00\x55\x85\xE7\x02\x57\x85\xA8\x10\xDD\x0E\x88\x82\x81\x82\x5D\x85\xFC\x36\x5F\x85\x80\x19\xDD\x0E\x90\x82\x69\x64\x2C\x00\x64\x85\x59\x0E\x66\x85\xD8\x1A\xDD\x0E\x1C\x82", "\x1C\x68\x31\x00\x6C\x85\xB1\x6B\x6E\x85\x1B\x75\x86\x7C\x9C\x6A\x36\x00\x74\x85\x2C\x67\x76\x85\xED\x1A\xDD\x0E\xA7\x82\x9D\x64\x7B\x85\x13\x0A\x7D\x85\x2E\x22\xDD\x0E\xAF\x82\x69\x64\x40\x00\x82\x85\x44\x00\x84\x85\xB3\x19\xDD\x0E\xB6\x82\x0B\x74\x82\x85\x49\x00\x8C\x85\xA1\x22\xDD\x0E\xBD\x82\x1C\x68\x4A\x00\x82\x85\x4E\x00\x93\x85\xB8\x22\xDD\x0E\xC5\x82\x31\x64\x4F\x00\x82\x85\x53\x00\x9B\x85\x82\x27\xDD\x0E\xCD\x82\x69\x64\x54\x00\x82\x85\x58\x00\xA3\x85\x71\x26\xDD\x0E\x58\x82\x69\x64\x59\x00\x82\x85\x5D\x00\xAB\x85\x62\x28\xE1\x23\x6E\x84\xCB\x7C\x66\x82\x06\x01\xC1\x6E\x69\x82\x8E\x73\x5E\x00\xB3\x85\x3F\x72\x01\x62\xC1\x6E\x70\x82\x31\x64\x5F\x00\x82\x85\x63\x00\xBE\x85\xBC\x02\xC1\x6E\x78\x82\x8E\x73\x64\x00\x82\x85\x68\x00\xC7\x85\x07\x7F\x44\x5A\x8C\x83\x82\x85\x6D\x00\xCF\x85\x52\x84\x51\x5A\xC6\x65\x82\x85\x72\x00\xD5\x85\x41\x76\x19\x80\x5E\x72\x82\x85\x77\x00\xDB\x85\x07\x01\xC1\x6E\x71\x85\x44\x6A\x78\x00\x82\x85\x7C\x00\xE1\x85\xB9\x85\x78\x85\x91\x67\x7D\x00\x82\x85\x81\x00\xE9\x85\x5E\x73", "\x0F\x01\x80\x85\x31\x64\x82\x00\x82\x85\x86\x00\xF0\x85\x00\x00\xC1\x6E\x87\x85\x1C\x68\x87\x00\x82\x85\x8B\x00\xF8\x85\xC1\x6E\x8F\x85\x69\x64\x8C\x00\x82\x85\x90\x00\x00\x86\x15\x5B\xE6\x75\x82\x85\x95\x00\x07\x86\x0F\x01\x9E\x85\x69\x64\x96\x00\x82\x85\x9A\x00\x0C\x86\x0A\x01\xA6\x85\x19\x7F\x82\x85\x9F\x00\x13\x86\x07\x01\xAE\x85\x1C\x68\xA0\x00\x82\x85\xA4\x00\xF8\x85\xAA\x51\xBB\x85\x26\x6E\xA5\x00\x6D\x22\x6D\x82\xA1\x22\xAA\x51\xC2\x85\x69\x64\xA8\x00\x6D\x22\xF7\x18\xAE\x00\x20\x86\x53\x85\x86\x63\xAF\x00\x2C\x86\xB1\x57\x2F\x86\xC9\x72\x91\x67\xB6\x00\x33\x86\x53\x60\x35\x86\xD7\x85\xC7\x81\x39\x86\x7A\x58\x3B\x86\xD6\x72\x70\x65\xC4\x00\x3E\x86\x5D\x59\x40\x86\xBE\x7A\xEF\x65\xCB\x00\x44\x86\x06\x01\xD1\x00\x46\x86\x05\x01\x9F\x82\x31\x64\xD2\x00\x4A\x86\x4E\x86\x4D\x86\x7C\x6B\x70\x65\xD9\x00\x52\x86\x15\x73\x54\x86\xFB\x85\x44\x6A\xE0\x00\x58\x86\xE6\x00\x54\x86\x02\x86\x1C\x68\xE7\x00\x58\x86\xED\x00\x54\x86\x96\x85\x44\x6A\xEE\x00\x58\x86\xF4\x00\x54\x86\x0E\x86\x1C\x68\xF5\x00\x58\x86\xFB\x00", "\x54\x86\x15\x86\x44\x6A\xFC\x00\x58\x86\x02\x00\x30\x0A\x1A\x62\xAA\x51\x1B\x86\x44\x6A\x03\x00\x30\x0A\xF7\x18\x09\x00\x78\x86\x45\x76\xCA\x7E\x9C\x6A\x0A\x00\x30\x0A\x03\x75\x9D\x83\x58\x11\xEC\x62\x1F\x84\x78\x6F\x86\x86\x45\x76\xCC\x83\x8A\x86\x28\x84\x54\x71\x30\x0A\xCC\x6E\x9B\x00\x2A\x85\x06\x01\x90\x86\x2F\x84\x50\x80\x93\x86\x64\x06\xA9\x00\x96\x86\x05\x01\x98\x86\x3E\x73\x70\x65\x38\x00\x9B\x86\x95\x80\x9E\x86\x27\x6E\xFD\x78\xEF\x65\x44\x00\xA4\x86\xA8\x10\xC5\x00\xA6\x86\xA0\x86\x00\x00\x1C\x83\x69\x64\x50\x00\x8D\x86\x1B\x0A\xD3\x00\x8F\x86\x4B\x84\xA8\x6F\xAB\x86\x80\x19\xE0\x00\xAE\x86\xD0\x85\x4C\x66\x67\x00\xBA\x86\xD8\x1A\xEE\x00\xBD\x86\x34\x83\xEF\x65\x73\x00\xC1\x86\xED\x84\xC4\x86\x76\x7B\x7C\x69\x7F\x00\xC8\x86\x31\x63\xA9\x14\xA6\x19\xAF\x86\x43\x83\x44\x6A\x8B\x00\xCE\x86\xBF\x5F\xD0\x86\xEF\x5F\x27\x7F\x86\x63\x97\x00\xD6\x86\xB3\x19\x26\x00\xD8\x86\xC6\x7E\x54\x83\xCC\x67\xA3\x00\x30\x0A\xED\x6E\x34\x00\xA9\x14\xA8\x19\xAF\x86\x7F\x84\xF3\x05\xB0\x00\xDD\x86\xA1\x22\x43\x00\xE0\x86", "\x05\x52\x87\x84\x86\x63\xBC\x00\xEE\x86\xB8\x22\x51\x00\xF1\x86\xEB\x62\x8E\x84\xCC\x67\xC8\x00\xB4\x86\xA8\x10\x5F\x00\x7A\x84\xE1\x86\x2A\x78\xB7\x7A\xFE\x86\x80\x19\x6C\x00\x01\x87\xF2\x86\x2D\x72\xEF\x65\xDE\x00\xE5\x86\x64\x06\x79\x00\xA9\x14\xEC\x1A\xAF\x86\xA5\x84\x7A\x1C\xEB\x00\x0D\x87\x1B\x0A\x89\x00\x10\x87\xD9\x86\x67\x7F\x54\x6A\xF6\x86\x82\x27\x99\x00\xF9\x86\x97\x86\xB6\x84\xED\x7A\x14\x21\xCC\x6E\xA7\x00\x20\x87\x9F\x86\x76\x7F\x31\x64\x10\x00\x14\x21\xED\x6E\xB5\x00\xE8\x86\x1A\x87\x50\x7E\xEF\x65\x1D\x00\x24\x87\x64\x06\xC4\x00\x27\x87\xA7\x86\x58\x7E\x7C\x69\x29\x00\x34\x87\x1B\x0A\xD2\x00\x37\x87\xAF\x86\x60\x7E\x7C\x69\x35\x00\x2C\x87\x64\x06\xE0\x00\x19\x87\x02\x87\xBB\x81\xCC\x67\x42\x00\x44\x87\x1B\x0A\xF0\x00\x47\x87\x09\x87\xA3\x7F\x7C\x69\x4F\x00\x4C\x87\xC4\x60\x25\x0C\x11\x87\x17\x81\xCC\x67\x5C\x00\x54\x87\x80\x19\x10\x00\x56\x87\x30\x87\xD1\x83\x4C\x66\x69\x00\x5B\x87\xD8\x1A\x20\x00\x25\x0C\xE9\x86\xF8\x84\x7C\x69\x76\x00\x63\x87\x19\x18\x2F\x00\x66\x87\x5F\x87\x8C\x7E\x94\x72", "\x3C\x87\x0A\x01\x8F\x00\x14\x21\xC2\x01\x3E\x00\x25\x0C\xD1\x86\x07\x85\xB5\x6A\x72\x87\xE8\x6D\x75\x87\x12\x01\x4C\x00\x78\x87\x6F\x87\xA0\x7E\xA5\x67\x7C\x87\x06\x01\xAB\x00\x7E\x87\xEC\x42\x81\x87\x48\x87\xF3\x6D\x9C\x6A\xAD\x00\x85\x87\x05\x01\xB9\x00\x88\x87\x1E\x47\x8A\x87\x50\x87\xF5\x79\xF5\x72\x8F\x87\x00\x00\xC7\x00\x92\x87\xFB\x4D\x94\x87\xFA\x86\x2C\x85\x7C\x69\xC9\x00\x6B\x87\x00\x00\xD6\x00\x9B\x87\x06\x01\x84\x00\x6E\x87\x0F\x01\x08\x52\x4F\x7C\x9C\x6A\xD8\x00\x14\x21\x49\x85\xAA\x87\xF9\x7F\x9C\x6A\xD9\x00\x14\x21\x7A\x03\xDD\x00\xAE\x87\x64\x06\xB0\x87\x27\x5A\x9C\x6A\xDE\x00\xB4\x87\xF5\x5A\xB7\x87\x67\x6D\x43\x5A\x4C\x66\xE3\x00\xBD\x87\x11\x5B\xBF\x87\x9F\x83\x0D\x82\x86\x63\xE8\x00\xC4\x87\x0A\x01\xEC\x00\xC6\x87\x80\x19\xB9\x87\xB5\x7A\x50\x7C\xCB\x87\x5D\x5B\xCE\x87\xD8\x1A\xD0\x87\xB2\x5A\x91\x70\xD3\x87\x06\x01\xF6\x00\xD5\x87\x19\x18\xD7\x87\x00\x00\x4F\x86\x69\x64\xF7\x00\xDA\x87\x05\x01\xFB\x00\xDD\x87\xED\x1A\xDF\x87\xF3\x85\x69\x64\xFC\x00\xE4\x87\x52\x10\x1A\x62\xDF\x87\x5B\x86", "\x8E\x73\x01\x00\xCA\x07\x7A\x03\x05\x00\xCA\x07\xEF\x87\x39\x82\x91\x67\x06\x00\xF4\x87\x42\x2B\xF7\x87\xB8\x87\x08\x86\x7C\x69\x0B\x00\xFC\x87\x1C\x01\xFE\x87\xC0\x87\x0D\x86\x70\x65\x10\x00\x03\x88\x5B\x2B\x05\x88\xC7\x87\x0F\x01\x73\x86\x8E\x73\x15\x00\x0A\x88\xC1\x0A\x0C\x88\xCF\x87\xEF\x5A\x70\x65\x1A\x00\x12\x88\xFD\x2F\x14\x88\xCF\x76\xF4\x62\x68\x80\xB8\x85\x19\x18\x83\x6D\xAF\x86\xB7\x85\x2A\x7B\x39\x52\xC2\x6F\x7C\x69\x1F\x00\x1B\x88\x19\x18\x93\x00\x25\x0C\x80\x03\x1D\x52\xD5\x7C\xED\x25\x20\x00\x29\x88\xED\x1A\x94\x00\x2C\x88\x62\x52\xDC\x7C\x22\x7E\x32\x88\x2E\x22\x95\x00\x35\x88\x3C\x52\x49\x7D\x31\x64\x22\x00\x39\x88\x9B\x79\x3C\x88\x0D\x52\xE3\x6F\x86\x63\x23\x00\x41\x88\xA1\x22\x97\x00\x43\x88\x25\x88\xAA\x64\x86\x63\x24\x00\x48\x88\xB8\x22\x98\x00\x4B\x88\x57\x52\x7C\x67\x91\x67\x25\x00\x50\x88\x1E\x87\x53\x88\x6E\x52\x26\x65\x86\x63\x26\x00\x58\x88\x71\x26\x9A\x00\x5A\x88\x00\x00\x1D\x52\x03\x75\xBC\x02\x27\x00\x5F\x88\x62\x28\xEB\x84\xCF\x2A\x1D\x52\x07\x7D\x7A\x36\x68\x88\x01\x62\x9C\x00", "\x62\x88\x1D\x52\x71\x7D\x67\x04\x29\x00\x6F\x88\x05\x83\x72\x88\x1A\x70\x76\x6A\x77\x88\xB9\x78\x79\x88\x21\x70\x86\x63\x2B\x00\x7C\x88\x28\x55\x7E\x88\x82\x7D\x03\x84\x82\x88\xD5\x55\x84\x88\x2D\x70\x86\x63\x2D\x00\x87\x88\xF5\x79\x89\x88\x34\x70\xEF\x65\x2E\x00\x32\x88\x2F\x00\xCA\x07\xC2\x01\xA2\x00\x62\x88\x88\x52\x22\x86\xBC\x2A\x31\x00\x8D\x88\xD8\x1A\x88\x52\x29\x86\x1C\x68\x32\x00\x19\x88\x05\x01\x36\x00\x9D\x88\xC2\x52\x30\x86\x31\x64\x37\x00\xA3\x88\x7B\x1B\xA6\x88\x7E\x52\xC1\x87\xDA\x7E\xAB\x88\x40\x00\xAD\x88\x88\x52\x62\x85\x26\x6E\x41\x00\xAB\x88\x45\x00\xB3\x88\x12\x01\x69\x85\x1C\x68\x46\x00\xAB\x88\x4A\x00\xBA\x88\xC7\x5A\xCC\x67\x4B\x00\xAB\x88\x4F\x00\xC1\x88\x23\x82\xCF\x68\xAB\x88\x54\x00\xC7\x88\xBA\x7A\xC3\x71\xAB\x88\x59\x00\xCC\x88\x06\x01\xF1\x87\x26\x6E\x5A\x00\xAB\x88\x5E\x00\xD1\x88\x05\x01\x61\x86\x44\x6A\x5F\x00\xAB\x88\x63\x00\xD8\x88\x00\x00\x67\x86\xCB\x85\xAB\x88\x68\x00\xDF\x88\x6D\x86\x44\x6A\x69\x00\xAB\x88\x6D\x00\xDF\x88\x0F\x88\x26\x6E\x6E\x00\xAB\x88\x72\x00\xDF\x88", "\x7B\x86\x8E\x73\x73\x00\xAB\x88\x77\x00\xAD\x88\x17\x63\xA7\x88\x1E\x88\x24\x88\x32\x84\x36\x88\xFA\x88\xE5\x82\x64\x06\x9F\x6E\x17\x84\xED\x25\x78\x00\xCA\x07\xCC\x6E\xA3\x00\x9D\x87\x20\x76\x9F\x7D\xCC\x67\x84\x00\x05\x89\xF1\x6C\x08\x89\xA1\x86\xE5\x78\xFA\x62\xCA\x07\xED\x6E\xBF\x00\xA8\x87\x9E\x6E\xDC\x73\x40\x62\x9D\x00\x13\x89\x2B\x79\x16\x89\x40\x74\x36\x84\x4C\x66\xAA\x00\x1B\x89\xD0\x7D\x1D\x89\x09\x89\xBB\x53\xFE\x88\x3D\x81\xBF\x85\x07\x6F\xA8\x86\x6A\x70\x22\x89\x36\x6F\x24\x89\x10\x89\xD8\x77\x86\x7E\x0D\x89\x1B\x0A\xFB\x00\x0F\x89\x00\x00\x9F\x6E\x0E\x79\x44\x6A\xD0\x00\x2D\x89\x80\x19\x09\x00\x6D\x22\xA8\x19\x9F\x6E\xDB\x7D\x1C\x68\xDD\x00\x3C\x89\xD8\x1A\x4D\x85\xB9\x2C\x9F\x6E\x0F\x7F\x44\x6A\xEA\x00\x45\x89\xAA\x60\x3F\x89\x1F\x89\xDD\x7A\x9C\x6A\xF7\x00\x4D\x89\xED\x1A\x7A\x85\x48\x89\x67\x84\xED\x7A\x0B\x06\xED\x6E\x45\x00\x4F\x89\xEA\x7E\x7D\x73\xEF\x65\x11\x00\x5A\x89\x64\x06\xA8\x85\x57\x89\x77\x84\xCC\x67\x1E\x00\x0B\x06\x0E\x6B\xC7\x0B\x6D\x22\xEC\x1A\x9F\x6E\xEB\x86\x67\x04\x2C\x00", "\x62\x89\x1B\x0A\x73\x00\x5D\x89\x17\x89\x64\x83\x91\x67\x39\x00\x72\x89\x56\x82\x75\x89\x1E\x89\x57\x79\xCC\x67\x46\x00\x0B\x06\xCC\x6E\x91\x00\x6D\x22\xA6\x19\x9F\x6E\x75\x83\x1C\x68\x52\x00\x81\x89\xA6\x6B\x84\x89\x50\x89\x13\x87\xD1\x0D\x5E\x00\x69\x89\x64\x06\xAD\x00\x6D\x22\xDE\x29\x9F\x6E\x8E\x89\xDA\x0B\x6C\x00\x91\x89\x1B\x0A\xBE\x00\x94\x89\x50\x89\xAE\x84\x26\x6E\x7A\x00\x7A\x89\x80\x19\xCF\x00\x7C\x89\x25\x89\xCD\x7B\xEF\x65\x87\x00\xA2\x89\xD8\x1A\xDE\x00\xA5\x89\x30\x89\x4D\x6C\xCC\x67\x94\x00\x9A\x89\xA8\x10\x65\x86\x71\x2C\x9F\x6E\x7F\x7F\x26\x6E\xA2\x00\xAA\x89\x19\x18\xFD\x00\xAD\x89\x37\x89\xCD\x84\xEF\x65\xAF\x00\xBA\x89\xF4\x84\x30\x0A\x40\x89\xB4\x81\x04\x76\xB2\x89\x80\x19\x1B\x00\x30\x0A\x95\x89\xC6\x89\x69\x64\xCA\x00\xC8\x89\xA7\x7F\xCB\x89\x50\x89\xDA\x76\x40\x7F\xD0\x89\x19\x18\x3D\x00\xD2\x89\x5E\x89\xC9\x83\xEF\x65\xE6\x00\xD6\x89\xED\x1A\x4E\x00\xD9\x89\x76\x89\x25\x39\x7C\x69\xF4\x00\xDE\x89\x2E\x22\x5F\x00\x30\x0A\x6D\x89\x68\x87\x78\x7C\x78\x25\x6A\x89\x07\x01\x6F\x00\xE9\x89", "\x50\x89\x8D\x7E\x44\x6A\x10\x00\x78\x25\x94\x64\x78\x25\xC2\x01\xCD\x86\x65\x89\x8C\x72\xEF\x65\x1F\x00\xF6\x89\xA0\x37\xF8\x89\xEF\x5F\xC4\x89\x50\x89\xA1\x7E\x69\x64\x2E\x00\xFF\x89\x87\x09\x01\x8A\x0F\x01\x9D\x00\x03\x8A\xDA\x89\xD9\x7F\x9C\x6A\x3D\x00\x08\x8A\xAB\x3D\x0A\x8A\xC3\x56\x0D\x8A\xE2\x89\x96\x87\x89\x71\x12\x8A\x67\x42\x14\x8A\x07\x01\xBB\x00\x16\x8A\x7D\x89\x46\x7C\x4C\x66\x5B\x00\xED\x89\x5D\x47\x1C\x8A\x83\x59\xF1\x89\x2E\x63\x83\x86\x51\x7E\x78\x25\xCC\x6E\xDA\x00\x30\x0A\xA6\x19\x2F\x63\x9A\x7E\x70\x65\x77\x00\x2C\x8A\x64\x06\xE8\x00\x2F\x8A\xB1\x5E\xFB\x82\xDC\x75\x1A\x8A\xD8\x1A\xF6\x00\x1F\x8A\x7B\x81\x18\x89\x86\x63\x90\x00\x3C\x8A\x19\x18\x05\x00\x14\x21\xA8\x19\x31\x8A\xBE\x89\xC0\x6C\x44\x8A\x92\x61\x47\x8A\x39\x8A\x26\x89\x65\x82\xFB\x88\x19\x18\x49\x8A\xF4\x7E\x1C\x68\xAA\x00\x4C\x8A\xA0\x64\x4E\x8A\x29\x8A\x32\x76\x91\x67\xB7\x00\x35\x8A\x1B\x0A\x32\x00\x14\x21\x30\x8A\xB8\x86\x86\x63\xC3\x00\x58\x8A\xB3\x19\x40\x00\x5A\x8A\xBA\x5E\xD6\x85\x08\x85\x67\x8A\xA1\x22\x53\x87\xB9\x2C", "\x49\x8A\x4A\x89\x8E\x73\xDD\x00\x6E\x8A\xB8\x22\x5E\x00\x6A\x8A\x81\x1C\x3C\x83\x4C\x66\xEA\x00\x76\x8A\x6E\x7A\x79\x8A\x40\x8A\x1F\x7F\xCC\x67\xF7\x00\x7E\x8A\x71\x26\x7C\x00\x80\x8A\x05\x01\x49\x8A\x4C\x83\xDF\x74\x95\x36\xED\x6E\x8B\x00\x88\x8A\x46\x1B\xE2\x86\x4C\x66\x11\x00\x95\x36\xEE\x89\x06\x01\x9A\x00\x14\x21\xEC\x1A\x49\x8A\x6F\x89\xBC\x02\x1F\x00\x8D\x8A\xD6\x7E\x90\x8A\x49\x8A\x9D\x7B\x77\x7F\x9F\x8A\x1B\x0A\x91\x87\x71\x8A\xFB\x86\x4C\x66\x39\x00\x95\x36\xCC\x6E\xC8\x00\x62\x8A\x4F\x8A\x21\x7E\xCC\x67\x45\x00\xAC\x8A\x64\x06\xA4\x87\xBC\x2D\x49\x8A\x97\x89\xCF\x70\x95\x8A\x64\x06\xE4\x00\x14\x21\xDE\x29\xB8\x8A\xBB\x80\x5F\x00\xBB\x8A\x1B\x0A\xF5\x00\xBE\x8A\xB0\x8A\x9A\x76\xD4\x6F\xA5\x8A\xE1\x62\xCA\x07\x48\x8A\x22\x87\x7C\x69\x7A\x00\xCA\x8A\x80\x19\x11\x88\xA8\x8A\xBD\x84\x7C\x69\x87\x00\xC3\x8A\xA8\x10\x4F\x88\x71\x2C\x49\x8A\xB7\x89\xBC\x2A\x95\x00\xD1\x8A\xD8\x1A\x34\x00\xCC\x8A\xC7\x8A\x06\x01\x87\x7F\x44\x6A\xA2\x00\xE0\x8A\x19\x18\x43\x00\xE3\x8A\x5B\x8A\x49\x87\x79\x7A\xD8\x8A\xAE\x66", "\xCA\x07\xBF\x8A\xCD\x89\x1C\x68\xBD\x00\xF0\x8A\x81\x74\xF2\x8A\xE4\x8A\x16\x71\x94\x74\xF7\x8A\x19\x18\x74\x00\xF9\x8A\xED\x8A\xDB\x89\xCC\x67\xD9\x00\xFD\x8A\x86\x82\x00\x8B\x6B\x8A\xE3\x89\x40\x62\xE7\x00\x05\x8B\x2E\x22\x96\x00\xCA\x07\x9A\x8A\xEB\x89\x86\x63\xF5\x00\x0C\x8B\xB3\x19\xA6\x00\x0F\x8B\xFA\x8A\x77\x6F\x91\x67\x03\x00\xA8\x36\xF1\x04\x10\x00\xA8\x36\xC2\x01\xB6\x00\xEC\x8A\x08\x8B\x07\x01\xDA\x79\x8E\x73\x12\x00\x1C\x8B\x71\x02\x1F\x8B\xBF\x58\x22\x8B\x7A\x8A\x0B\x8A\x70\x65\x21\x00\x28\x8B\x01\x17\x2A\x8B\x33\x5A\x2C\x8B\x81\x8A\x1B\x85\xEF\x65\x30\x00\x31\x8B\xA6\x0B\x33\x8B\x0A\x01\xE3\x00\x35\x8B\x89\x8A\x17\x77\x91\x67\x3F\x00\x3A\x8B\x07\x01\x4C\x00\x3C\x8B\x65\x5B\x3F\x8B\x91\x8A\x9F\x87\x40\x62\x4E\x00\xA8\x36\xA6\x19\x5C\x00\x47\x8B\xF0\x24\x0B\x06\xEC\x1A\x36\x63\x07\x01\x02\x89\x7A\x1C\x5E\x00\xA8\x36\xCC\x6E\x61\x89\xBC\x2D\x55\x8B\xD1\x7E\x70\x65\x6A\x00\x5A\x8B\x64\x06\x1F\x00\xDE\x89\x5E\x8B\x66\x44\x70\x65\x76\x00\x44\x8B\xD8\x1A\x2D\x00\x0B\x06\xA8\x19\x66\x8B\x45\x74\xEE\x70", "\x6A\x8B\xAF\x7F\x6D\x8B\x12\x01\x6F\x8B\xB7\x7D\x8E\x73\x90\x00\x72\x8B\xB7\x7F\x74\x8B\x0F\x01\x6F\x8B\x55\x8A\x44\x6A\x9D\x00\x7A\x8B\x2E\x22\x5A\x00\x7C\x8B\xED\x52\x5C\x8A\xEF\x65\xAA\x00\x62\x8B\x1B\x0A\x69\x00\x65\x8B\x64\x8A\xA5\x76\x82\x8B\xBB\x7C\x85\x8B\x07\x01\x6F\x8B\x42\x89\x44\x6A\xC3\x00\x90\x8B\xA1\x22\x86\x00\x92\x8B\x9E\x67\xE1\x7D\xF7\x81\x98\x8B\xB8\x22\x95\x00\x9B\x8B\x05\x01\x6F\x8B\x18\x7F\x44\x6A\xDD\x00\x9F\x8B\x82\x27\xA4\x00\xA2\x8B\x00\x00\x6F\x8B\xD3\x86\x8E\x73\xEA\x00\xA8\x8B\x71\x26\xB3\x00\xAB\x8B\x6F\x8B\x8B\x8A\x1C\x68\xF7\x00\xB1\x8B\x62\x28\xC2\x00\xB4\x8B\x92\x8A\x7C\x69\x04\x00\x80\x29\x96\x8A\x05\x01\xD1\x00\x53\x8B\x75\x8B\x47\x79\x31\x64\x12\x00\x80\x29\xED\x6E\xE1\x00\xBC\x8B\x77\x89\xFD\x89\xC9\x8B\x64\x06\xF0\x00\xCC\x8B\x46\x7F\x9C\x6A\x2C\x00\x80\x29\xCC\x6E\xFF\x00\x8D\x8B\x03\x87\x40\x62\x38\x00\xD6\x8B\x64\x06\x0D\x00\x24\x8A\x7D\x8B\xB5\x7B\xCC\x67\x44\x00\xC0\x8B\x64\x06\x1B\x00\x78\x25\xDE\x29\x6F\x8B\xB9\x8A\xF3\x05\x52\x00\xE5\x8B\x75\x70\xE8\x8B\xC5\x8B", "\x1B\x87\xEF\x65\x60\x00\xCF\x8B\x1B\x0A\x11\x8A\xB9\x2C\x6F\x8B\x6F\x7F\x1C\x68\x6D\x00\xF5\x8B\xA8\x10\x4C\x00\x78\x25\x6E\x8B\x29\x87\x69\x64\x7A\x00\xEE\x8B\xA8\x10\x23\x8A\x71\x2C\x6F\x8B\xDD\x8A\xED\x25\x88\x00\xFD\x8B\x80\x19\x6B\x00\x00\x8C\xF1\x8B\xAB\x83\x9C\x6A\x95\x00\x0D\x8C\xD8\x1A\x7A\x00\x10\x8C\xE1\x8B\xD4\x84\x7C\x69\xA2\x00\x05\x8C\x80\x19\x89\x00\xF0\x8B\x19\x8C\xEE\x8A\x7C\x69\xB0\x00\x1D\x8C\xD8\x1A\x9A\x00\x20\x8C\x86\x8B\x51\x87\x40\x62\xBE\x00\x25\x8C\x19\x18\xAB\x00\x28\x8C\x93\x8B\x58\x87\x25\x83\x2D\x8C\xED\x1A\xBC\x00\x30\x8C\x9C\x8B\x09\x7C\x3E\x6C\x34\x8C\xC6\x80\x78\x25\x54\x8B\x11\x8B\xAF\x7B\x3B\x8C\xB3\x19\x75\x8A\x08\x8C\xDF\x83\x4C\x66\xF6\x00\x15\x8C\x41\x25\x66\x37\xC2\x01\xED\x00\x18\x8C\x29\x8C\x24\x8B\x70\x65\x05\x00\x66\x37\xF1\x04\x12\x00\x4A\x8C\x12\x01\xFC\x00\x4D\x8C\x31\x8C\x2E\x8B\x68\x7F\x52\x8C\xC4\x14\x55\x8C\x34\x2B\x95\x36\x01\x8C\x53\x71\x91\x67\x23\x00\x5C\x8C\xFF\x03\x5E\x8C\x04\x22\x60\x8C\x11\x8C\x18\x8A\x91\x67\x32\x00\x65\x8C\x50\x06\x67\x8C\x5B\x5F", "\x69\x8C\x21\x8C\xBF\x7E\x9C\x6A\x41\x00\x66\x37\xA6\x19\x4F\x00\x70\x8C\x7C\x38\x95\x36\xEC\x1A\x01\x53\x6F\x8B\x23\x88\xFF\x88\xB6\x5E\xD3\x53\x3C\x81\x3E\x81\x4D\x72\x00\x00\x68\x53\x9A\x88\xED\x25\x51\x00\x66\x37\x49\x85\x68\x53\xA0\x88\x44\x6A\x52\x00\x66\x37\x7A\x03\x56\x00\x8C\x8C\x64\x06\x68\x53\xCA\x85\x26\x6E\x57\x00\x92\x8C\x78\x11\x95\x8C\x38\x6C\xAF\x88\x40\x62\x5C\x00\x9B\x8C\x33\x44\x9D\x8C\xA8\x10\x68\x53\xB5\x88\x97\x5E\xA2\x8C\x4E\x05\xA4\x8C\x80\x19\x68\x53\xBC\x88\x3A\x6B\xA9\x8C\xB0\x47\xAB\x8C\x26\x8C\x97\x82\xDF\x70\xB0\x8C\x61\x49\xB2\x8C\x19\x18\x68\x53\xE1\x87\x1C\x68\x70\x00\xB6\x8C\x17\x7B\xB8\x8C\xED\x1A\x68\x53\xEA\x87\xD3\x75\xBE\x8C\xF3\x4E\xC0\x8C\x2E\x22\x68\x53\xD3\x88\xBC\x2A\x7A\x00\xC5\x8C\x7E\x00\xC7\x8C\xB3\x19\x68\x53\xDA\x88\x8E\x73\x7F\x00\xC5\x8C\x83\x00\xCF\x8C\xA1\x22\x68\x53\xE1\x88\x26\x6E\x84\x00\xC5\x8C\x88\x00\xD7\x8C\xB8\x22\x68\x53\xE6\x88\x8E\x73\x89\x00\xC5\x8C\x8D\x00\xDF\x8C\x82\x27\x68\x53\xEC\x88\xBC\x2A\x8E\x00\xC5\x8C\x92\x00\xE7\x8C\x60\x88\x16\x88", "\x9C\x6A\x93\x00\xC5\x8C\x97\x00\xEF\x8C\x69\x88\x69\x6A\x84\x8C\x29\x89\x6E\x6D\x2A\x8A\x18\x7C\x66\x37\xCC\x6E\x48\x00\x05\x8B\x41\x54\xD2\x7E\x1C\x68\xA4\x00\xFE\x8C\x64\x06\x56\x00\x01\x8D\x3A\x8A\x31\x64\xB0\x00\x6E\x8C\x80\x19\x64\x00\x72\x8C\x5C\x54\x6A\x8C\xCC\x67\xCA\x7D\x2E\x22\x41\x54\xD0\x53\x80\x8C\x28\x89\xBC\x02\x41\x54\x04\x83\x00\x58\x0D\x8D\xD8\x1A\x73\x00\x10\x8D\x65\x54\x50\x89\x40\x62\xCA\x00\x1E\x8D\x19\x18\x82\x00\x21\x8D\x06\x01\x41\x54\x68\x53\x18\x8D\x85\x8C\x84\x54\x13\x83\x91\x67\xD7\x00\x26\x8D\xED\x1A\x91\x00\x29\x8D\x05\x01\x41\x54\xB1\x86\x1C\x68\xE4\x00\x06\x8D\xEC\x77\x09\x8D\x00\x7F\x4C\x66\xF0\x00\x33\x8D\x2E\x22\xAE\x00\x36\x8D\x62\x54\xBE\x86\xE5\x7A\x42\x8D\xB3\x19\xF6\x8A\xB9\x2C\x41\x54\x73\x8A\x26\x6E\x0A\x00\x2F\x0C\xED\x6E\xCC\x00\x45\x8D\x41\x54\xA5\x8B\x8E\x73\x17\x00\x51\x8D\x9F\x73\x54\x8D\x58\x89\x7C\x69\x24\x00\x59\x8D\x1B\x0A\xEA\x00\x5B\x8D\xDA\x82\x58\x80\x5F\x8D\xA8\x10\xF9\x00\x62\x8D\xE2\x6F\x82\x6C\x2F\x0C\xC1\x8B\x40\x2B\xA8\x36\xEC\x1A\x41\x54\x9C\x8A", "\x7F\x87\x65\x8D\x80\x19\x18\x00\xA8\x36\xA8\x19\x41\x54\xA3\x8A\x31\x64\x59\x00\x73\x8D\x53\x6F\x76\x8D\x2F\x8D\x6C\x83\x70\x65\x66\x00\x2F\x0C\xCC\x6E\x36\x00\x4E\x8B\x7F\x8D\x06\x01\x87\x89\x44\x6A\x72\x00\x83\x8D\x64\x06\x44\x00\x86\x8D\x4F\x63\x9D\x84\x40\x62\x7E\x00\x6B\x8D\xE1\x78\xA8\x36\xDE\x29\x41\x54\xEB\x8B\x67\x04\x8C\x00\x94\x8D\x67\x74\x96\x8D\x87\x8D\x1E\x63\xAC\x83\x7C\x8D\xFE\x8A\x7E\x8D\x90\x8D\x07\x01\xFA\x8B\x44\x6A\xA7\x00\xA2\x8D\xED\x1A\x83\x00\xA4\x8D\x11\x8D\xD5\x8A\x40\x62\xB4\x00\x9C\x8D\xA8\x10\x92\x00\x6E\x8D\x9F\x8D\xDE\x47\x70\x65\xC2\x00\xAA\x8D\x2E\x22\xA2\x00\xAD\x8D\x22\x8D\x39\x87\x68\x75\xBA\x8D\xB3\x19\xB1\x00\xBD\x8D\x2A\x8D\xF4\x8A\x44\x6A\xDC\x00\xB2\x8D\x80\x19\xC0\x00\x9E\x8D\xA5\x8D\xDA\x84\xEF\x65\xEA\x00\xC9\x8D\xD8\x1A\xD1\x00\xCC\x8D\xAE\x8D\x2A\x8C\x33\x82\xD1\x8D\x19\x18\xE2\x00\xD4\x8D\xBE\x8D\xD6\x8D\x31\x64\x06\x00\x8D\x0B\x6C\x8D\xF3\x00\xDB\x8D\xC5\x8D\x39\x8C\x4C\x66\x14\x00\xE0\x8D\x45\x81\x80\x29\x6F\x8D\x3F\x8C\x69\x64\x22\x00\xE8\x8D\x1B\x0A\x14\x00", "\xEA\x8D\xB6\x8D\xF3\x89\x8E\x73\x30\x00\x8D\x0B\xF1\x04\x3D\x00\x8D\x0B\x38\x18\x80\x29\x77\x8D\x7A\x87\x4C\x66\x3F\x00\xF7\x8D\x7F\x87\xFA\x8D\x76\x0E\xFC\x8D\xB6\x8D\x05\x8A\x1C\x68\x4E\x00\x01\x8E\xD1\x04\x03\x8E\x06\x08\x05\x8E\xCD\x8D\xFA\x83\x95\x6A\x0A\x8E\xAD\x47\x0C\x8E\x0A\x01\x51\x00\x0E\x8E\xD5\x8D\x6B\x8C\xEF\x65\x6C\x00\x12\x8E\x3C\x4F\x14\x8E\x48\x44\x17\x8E\xDC\x8D\x74\x8C\x91\x67\x7B\x00\xEF\x8D\x0A\x01\x89\x00\x1E\x8E\x61\x49\xF2\x8D\x5A\x8C\x8E\x7A\x9C\x6A\x8B\x00\x8D\x0B\x49\x85\x8B\x6F\x8F\x8C\x8E\x73\x8C\x00\x8D\x0B\x7A\x03\x90\x00\x2F\x8E\x64\x06\x8B\x6F\x98\x8C\xBC\x2A\x91\x00\x35\x8E\xBD\x73\x38\x8E\x1B\x0A\x8B\x6F\x5A\x85\x48\x6E\x3E\x8E\x67\x53\x40\x8E\x59\x7B\xC8\x87\x31\x64\x9B\x00\x45\x8E\xD3\x6D\x47\x8E\x80\x19\x8B\x6F\xAE\x8C\x8E\x73\xA0\x00\x4C\x8E\x1B\x7C\x4E\x8E\xD8\x1A\x8B\x6F\xE4\x85\x8E\x73\xA5\x00\x54\x8E\xC3\x6C\x56\x8E\x19\x18\x8B\x6F\xBB\x8C\x44\x6A\xAA\x00\x5C\x8E\x05\x01\xAE\x00\x5E\x8E\xED\x1A\x8B\x6F\xC3\x8C\x44\x6A\xAF\x00\x64\x8E\x7D\x69\x67\x8E\x2E\x22\x8B\x6F", "\xCA\x8C\xED\x25\xB4\x00\x6D\x8E\xB8\x00\x6F\x8E\xB3\x19\x8B\x6F\xD2\x8C\x26\x6E\xB9\x00\x6D\x8E\xBD\x00\x77\x8E\xA1\x22\x8B\x6F\xDA\x8C\xBC\x2A\xBE\x00\x6D\x8E\xC2\x00\x7F\x8E\xB8\x22\x8B\x6F\xE2\x8C\x26\x6E\xC3\x00\x6D\x8E\xC7\x00\x87\x8E\x82\x27\x8B\x6F\xEA\x8C\xED\x25\xC8\x00\x6D\x8E\xCC\x00\x8F\x8E\x71\x26\x8B\x6F\xF2\x88\x26\x6E\xCD\x00\x6D\x8E\xD1\x00\x97\x8E\x62\x28\xBA\x78\x89\x8C\xE0\x67\x9F\x8E\xFA\x8C\x62\x8C\x07\x01\x32\x8E\x26\x6E\xD3\x00\x6D\x8E\xD7\x00\xA4\x8E\xBC\x02\xBA\x78\x3B\x8E\xED\x25\xD8\x00\x6D\x8E\xDC\x00\xAD\x8E\xB9\x78\x9F\x8C\x9B\x6D\x6D\x8E\xE1\x00\xB5\x8E\xA6\x8E\x48\x5A\x70\x65\xE2\x00\x6D\x8E\xE6\x00\xBB\x8E\x37\x8B\xD1\x87\x9C\x6A\xE7\x00\x6D\x8E\xEB\x00\xC2\x8E\x8C\x87\xD6\x5A\xD6\x73\x6D\x8E\xF0\x00\xC9\x8E\x0F\x8A\xC8\x88\x9C\x6A\xF1\x00\x6D\x8E\xF5\x00\xCF\x8E\x10\x8E\x06\x01\x6A\x8E\x8E\x73\xF6\x00\x6D\x8E\xFA\x00\xD6\x8E\x00\x00\xBA\x78\x72\x8E\x7A\x1C\xFB\x00\x6D\x8E\xFF\x00\xDE\x8E\xBA\x78\x7A\x8E\xBD\x2A\x0A\x38\xFD\x2A\x0A\x38\x1A\x62\xBA\x78\x82\x8E\xED\x25\x05\x00", "\xEA\x8E\x6F\x2B\xEC\x8E\x64\x06\xBA\x78\x8A\x8E\x29\x62\xF2\x8E\x02\x05\xF4\x8E\x1B\x0A\xBA\x78\x92\x8E\x7A\x1C\x0F\x00\xF9\x8E\x70\x24\xFB\x8E\xB4\x75\xF1\x8C\x0B\x6B\x01\x8F\x3E\x2C\x03\x8F\x80\x19\x25\x55\xA2\x8E\xD1\x0D\x19\x00\x09\x8F\x87\x7A\xBB\x7F\x06\x01\xA8\x8E\xBC\x2A\x1A\x00\x07\x8F\xFD\x2F\x0F\x8F\x19\x18\x25\x55\xB0\x8E\x7A\x1C\x1F\x00\x16\x8F\xE3\x33\x18\x8F\xED\x1A\x25\x55\x43\x8E\x86\x5D\x1E\x8F\x04\x36\x20\x8F\x2E\x22\x25\x55\xA7\x8C\xED\x25\x29\x00\x25\x8F\x2D\x00\x27\x8F\xB3\x19\x25\x55\x51\x8E\x26\x6E\x2E\x00\x25\x8F\x32\x00\x2F\x8F\xA1\x22\x25\x55\x59\x8E\x26\x6E\x33\x00\x25\x8F\x37\x00\x37\x8F\xB8\x22\x25\x55\x61\x8E\x8E\x73\x38\x00\x25\x8F\x3C\x00\x3F\x8F\x82\x27\x25\x55\xD9\x8E\x26\x6E\x3D\x00\x25\x8F\x41\x00\x47\x8F\x71\x26\x25\x55\xE1\x8E\xD1\x0D\x42\x00\x25\x8F\x46\x00\x4F\x8F\x62\x28\x25\x55\xE8\x8E\xED\x25\x47\x00\x25\x8F\x4B\x00\x57\x8F\x01\x62\x25\x55\xEF\x8E\x7A\x1C\x4C\x00\x25\x8F\x50\x00\x5F\x8F\xBC\x02\x25\x55\xF7\x8E\x8A\x8C\x25\x8F\x55\x00\x67\x8F\x45\x8C\x00\x00\xFE\x8E", "\xD1\x0D\x56\x00\x25\x8F\x5A\x00\x6E\x8F\x51\x55\x0F\x01\x9A\x8E\xBC\x2A\x5B\x00\x25\x8F\x5F\x00\x76\x8F\xFC\x89\xAD\x62\xCC\x67\x60\x00\x7E\x8F\x80\x19\x7E\x55\x13\x8F\xED\x25\x61\x00\x25\x8F\x65\x00\x83\x8F\xFB\x76\xBA\x87\x20\x72\x25\x8F\x6A\x00\x8B\x8F\x1D\x74\xB7\x8E\x72\x67\x25\x8F\x6F\x00\x91\x8F\x1C\x1B\x49\x8E\x69\x64\x70\x00\x25\x8F\x74\x00\x97\x8F\x7E\x55\x32\x8F\xBC\x2A\x75\x00\x25\x8F\x79\x00\x9E\x8F\xB4\x8C\x40\x62\x7A\x00\x25\x8F\x7E\x00\xA5\x8F\x0F\x01\x42\x8F\x26\x6E\x7F\x00\x25\x8F\x83\x00\xAB\x8F\xCE\x7A\xAC\x6A\x25\x8F\x88\x00\xB2\x8F\x31\x82\xA1\x72\x25\x8F\x8D\x00\xB7\x8F\x06\x01\x5A\x8F\x7A\x1C\x8E\x00\x25\x8F\x92\x00\xBC\x8F\x05\x01\x62\x8F\xD1\x0D\x93\x00\x25\x8F\x97\x00\xC3\x8F\x00\x00\x6A\x8F\x7A\x1C\x98\x00\x25\x8F\x9C\x00\xCA\x8F\x71\x8F\xDA\x0B\x9D\x00\x25\x8F\xA1\x00\xCA\x8F\x79\x8F\xED\x25\xA2\x00\x25\x8F\xA6\x00\x97\x8F\xE9\x55\x0C\x8F\xDA\x0B\xA7\x00\x97\x8F\x2E\x22\xE9\x55\x86\x8F\x7A\x1C\xA8\x00\x25\x8F\xAC\x00\xDD\x8F\xA8\x88\x69\x64\xAD\x00\x25\x8F\xB1\x00\xEA\x8F\x36\x86", "\xEF\x65\xB2\x00\x25\x8F\xB6\x00\xF0\x8F\x3C\x86\x5D\x8A\x25\x8F\xBB\x00\xF6\x8F\x41\x86\x9C\x6A\xBC\x00\x25\x8F\xC0\x00\xFB\x8F\x47\x86\xCC\x67\xC1\x00\x25\x8F\xC5\x00\x01\x90\x4E\x86\xD6\x6A\x25\x8F\xCA\x00\x07\x90\x55\x86\x4D\x78\x25\x8F\xCF\x00\x0C\x90\x52\x8F\xDA\x0B\xD0\x00\x25\x8F\xD4\x00\x0C\x90\xBE\x8F\xD1\x0D\xD5\x00\x25\x8F\xD9\x00\x0C\x90\xC5\x8F\xDA\x0B\xDA\x00\x25\x8F\xDE\x00\x0C\x90\xCC\x8F\xD1\x0D\xDF\x00\x25\x8F\xE3\x00\x0C\x90\xD2\x8F\xC2\x09\xE4\x00\x25\x8F\xE8\x00\x0C\x90\xD8\x8F\x7A\x1C\xE9\x00\x25\x8F\xED\x00\x97\x8F\x3C\x0C\x57\x8B\xD1\x0D\xEE\x00\x0A\x38\x03\x75\x7F\x00\x48\x8C\x73\x1C\x0B\x76\x9C\x6A\xF9\x00\x3A\x90\x64\x06\x8C\x00\x3D\x90\x3C\x0C\x3D\x7B\x8E\x73\x04\x00\x4C\x07\xCC\x6E\x99\x00\x34\x8C\x3C\x0C\x1C\x8D\x76\x06\x4A\x90\x64\x06\xA7\x00\x4D\x90\x23\x8D\xD4\x66\x51\x90\x1B\x0A\xB5\x00\x54\x90\x0A\x6D\x9C\x6A\x28\x00\x57\x90\xA8\x10\xC3\x00\x5A\x90\xAD\x56\xF9\x8C\x86\x8C\xBB\x8D\x44\x84\xCC\x67\x34\x00\x4C\x07\x03\x75\xD1\x00\x45\x90\x8E\x8B\x08\x75\x5E\x90\x80\x19\xDE\x00", "\x61\x90\xE2\x85\x89\x6C\x6F\x90\xE5\x84\x72\x90\xE8\x51\x9C\x6A\x57\x00\x75\x90\x19\x18\xFA\x00\x77\x90\xD6\x7A\x70\x65\x63\x00\x7B\x90\xED\x1A\x08\x00\x77\x8C\xEE\x0F\x2F\x79\xFD\x6D\x82\x90\x89\x63\x85\x90\xF0\x12\x63\x8D\x7E\x72\x89\x90\xA7\x64\x8B\x90\xBA\x10\x69\x8D\x91\x67\x87\x00\x4C\x07\xED\x6E\x6D\x8C\xB9\x2C\x3C\x0C\x71\x8D\x0F\x01\x94\x00\x8F\x90\xA1\x22\x76\x8C\xBC\x2D\x3C\x0C\x79\x8D\x69\x64\xA0\x00\x9E\x90\xB8\x22\x79\x8C\xA1\x90\xA9\x8A\x7C\x69\xAC\x00\x69\x90\x64\x06\x5D\x00\x33\x8D\x3C\x0C\x89\x8D\x8E\x73\xB7\x00\xAD\x90\x1B\x0A\x6A\x00\xB0\x90\xE2\x8B\x4C\x66\xC2\x00\x96\x90\x5D\x7C\x66\x37\xEC\x1A\x3C\x0C\x99\x8D\xBC\x02\xCF\x00\xBC\x90\x1B\x0A\x87\x00\xBE\x90\x86\x90\xC8\x8A\x27\x71\xA6\x90\x82\x27\xF5\x8C\xA9\x90\x00\x6B\x70\x65\xE8\x00\xCB\x90\x71\x26\xA5\x00\x91\x90\x3F\x56\xAF\x89\x4C\x66\xF4\x00\xC4\x90\xA8\x10\xB3\x00\x66\x37\xA8\x19\x3C\x0C\x0A\x8C\xF7\x5E\xD7\x23\xCC\x6E\xC2\x00\xD5\x90\x0D\x1D\x12\x8C\x91\x67\x0D\x00\xE2\x90\x64\x06\xD0\x00\xE5\x90\xBA\x1F\x22\x8C\x40\x62\x19\x00", "\xD7\x23\xED\x6E\xDE\x00\xC7\x90\x8C\x90\xEF\x90\x5D\x88\xF2\x90\x64\x06\xEE\x00\xF5\x90\x92\x90\x02\x8B\x4C\x66\x33\x00\xF9\x90\x1B\x0A\xFE\x00\xFC\x90\xD6\x90\x83\x78\x4C\x66\x40\x00\x01\x91\xF1\x70\x2F\x0C\xBF\x90\xF0\x84\x9E\x6F\x09\x91\x80\x19\x1E\x00\x2F\x0C\xDE\x90\xEC\x8D\x1C\x68\x5A\x00\x0F\x91\x6B\x8B\x12\x91\xC8\x90\x70\x87\x26\x72\xEA\x90\x0D\x4C\xD7\x23\xFB\x02\xD8\x8D\x3E\x90\x7F\x8F\x4C\x66\x75\x00\x1D\x91\x5E\x4F\x1F\x91\x9E\x3D\x21\x91\x3C\x0C\x07\x8E\x44\x6A\x83\x00\x26\x91\xDF\x75\x28\x91\x0F\x01\x58\x00\x2A\x91\xB6\x8E\x39\x6E\x2F\x91\x1F\x66\x31\x91\x28\x76\x34\x91\xE2\x7F\x58\x70\x37\x91\xF2\x75\x39\x91\x0B\x7D\x3B\x91\x21\x8A\x61\x74\x17\x91\xFC\x75\x40\x91\x26\x50\x19\x91\x0F\x01\x78\x63\x83\x81\x63\x90\x8C\x71\x06\x01\x4B\x91\x05\x01\x8E\x63\x6D\x80\x1F\x88\xED\x1A\x7F\x63\x37\x90\xDA\x0B\xBC\x00\xD7\x23\x03\x75\x91\x00\xAA\x8D\x7F\x63\x03\x8D\x44\x6A\xC7\x00\x5A\x91\xF5\x8E\x5D\x91\x0A\x8D\x69\x64\xD2\x00\x3E\x91\xED\x1A\xAB\x00\x21\x91\x7F\x63\x4F\x90\x14\x86\x68\x91\x2E\x22\xB9\x00", "\x6B\x91\x55\x90\x31\x64\xEA\x00\x6F\x91\xB3\x19\xC7\x00\x72\x91\x5B\x90\x91\x67\xF6\x00\x76\x91\xA1\x22\xD5\x00\x79\x91\x31\x89\xCC\x67\x02\x00\x5F\x38\x03\x75\xE3\x00\x64\x91\x3F\x8D\x7C\x69\x0D\x00\x5F\x38\xCC\x6E\xF0\x00\x80\x91\x73\x90\x9C\x6A\x19\x00\x8B\x91\x64\x06\xFE\x00\x8E\x91\x78\x90\x56\x88\x92\x91\x5D\x64\x25\x8E\x1B\x7C\x7B\x8A\x8C\x6F\x98\x91\xA8\x10\x1A\x00\x9A\x91\x4C\x91\x82\x8A\x4C\x66\x3D\x00\x9E\x91\x80\x19\x28\x00\xA1\x91\x26\x66\xDA\x86\x31\x64\x49\x00\xA6\x91\xD8\x1A\x36\x00\xA9\x91\x00\x00\x7F\x63\x2F\x7F\x26\x6E\x55\x00\x5F\x38\xED\x6E\x44\x00\x8D\x0B\xA8\x19\x7F\x63\x9B\x90\x91\x0F\xAE\x91\x19\x18\x53\x00\xB1\x91\x7F\x63\xA3\x90\x1C\x68\x6E\x00\xBF\x91\xED\x1A\x61\x00\xC2\x91\xAA\x90\xA7\x8F\x84\x91\x64\x06\x6F\x00\x1C\x8E\xA2\x91\xB1\x8A\x4C\x66\x85\x00\xCD\x91\xF6\x73\xD0\x91\xAA\x91\x0A\x87\xCD\x78\xB7\x91\x64\x06\x27\x8E\x71\x2C\x7F\x63\xC1\x90\xAB\x6C\xDB\x91\x1B\x0A\x99\x00\x8D\x0B\xEC\x1A\x7F\x63\x9F\x89\xBC\x2A\xAA\x00\xC7\x91\x2E\x22\xA9\x00\xCA\x91\xCF\x90\x9C\x6A\xB6\x00", "\xEB\x91\xB3\x19\xB7\x00\xEE\x91\x9B\x83\xAD\x76\xE2\x91\xAC\x86\xBA\x91\x12\x01\x7F\x63\xE0\x90\xD1\x0D\xCF\x00\xF2\x91\xA1\x22\xD4\x00\xF5\x91\x0F\x4A\x9C\x6A\xDB\x00\x00\x92\xB8\x22\xBF\x8E\xBC\x2D\x7F\x63\x41\x87\x0A\x8B\xF8\x91\x80\x19\xCE\x8E\xDE\x91\xC6\x8D\x8E\x73\xF4\x00\x0E\x92\x2E\x62\x0A\x38\xE6\x91\x32\x8C\x7C\x69\x01\x00\x97\x0D\xED\x6E\x10\x00\x17\x92\xFB\x91\x19\x92\x40\x62\x0E\x00\x1C\x92\x2F\x68\x1F\x92\x42\x56\x0D\x91\xCD\x66\x24\x92\x1B\x0A\x30\x00\x0A\x38\xBB\x91\x14\x91\x44\x6A\x28\x00\x2A\x92\xA8\x10\x3F\x00\x2D\x92\x20\x92\x77\x8F\xF1\x76\x97\x0D\xF4\x76\x97\x0D\xC2\x01\x4E\x00\x0A\x38\xA6\x19\x7F\x63\x25\x8B\x26\x6E\x43\x00\x39\x92\xF5\x3F\x3B\x92\xF0\x03\x3E\x92\x36\x92\x2C\x7C\xEF\x65\x51\x00\x44\x92\x53\x0B\x46\x92\xC0\x62\x48\x92\x27\x92\xBC\x8E\x4C\x66\x5F\x00\x4D\x92\x11\x77\x4F\x92\x0A\x01\x78\x00\x51\x92\x0A\x01\x7F\x63\x02\x84\x27\x69\x56\x92\x3C\x4F\x58\x92\xBC\x50\x5B\x92\x9B\x91\x4B\x8B\x7E\x72\x32\x92\x23\x77\x62\x92\x06\x01\x94\x00\x35\x92\x44\x56\x49\x92\x53\x91\x52\x8A", "\xED\x1A\x4E\x56\x52\x91\x13\x8D\x6E\x80\x82\x27\x74\x92\xF3\x7F\x91\x67\x8A\x00\x97\x0D\x49\x85\x78\x92\x79\x61\x31\x77\x97\x0D\x34\x77\x7C\x92\x64\x06\x7E\x92\x1B\x8F\xD1\x0D\x90\x00\x81\x92\x42\x6E\x83\x92\x1B\x0A\x7E\x92\x23\x8F\x7A\x1C\x95\x00\x89\x92\xF3\x52\x8B\x92\xA8\x10\x7E\x92\x2A\x8F\x7A\x1C\x9A\x00\x91\x92\x0F\x61\x93\x92\x80\x19\x7E\x92\xA0\x8F\xED\x25\x9F\x00\x99\x92\x53\x77\x9B\x92\xD8\x1A\x7E\x92\x3A\x8F\xBC\x2A\xA4\x00\xA1\x92\x5C\x77\xA3\x92\x19\x18\x7E\x92\xAD\x8F\xBC\x2A\xA9\x00\xA9\x92\x65\x77\xAB\x92\xED\x1A\x7E\x92\x4A\x8F\xBC\x2A\xAE\x00\xB1\x92\x34\x66\xB3\x92\x29\x75\xE3\x5A\x70\x65\xB3\x00\xB9\x92\xB7\x00\xBB\x92\x15\x8B\xF9\x87\xEF\x65\xB8\x00\xB9\x92\xBC\x00\xC2\x92\xA1\x22\x7E\x92\x1E\x90\xC2\x09\xBD\x00\xB9\x92\xC1\x00\xC9\x92\xB8\x22\x7E\x92\x24\x90\xDA\x0B\xC2\x00\xB9\x92\xC6\x00\xD1\x92\x77\x92\xBA\x74\xCC\x67\xC7\x00\xB9\x92\xCB\x00\xD9\x92\x71\x26\x7E\x92\x30\x90\x38\x7F\xB9\x92\xD0\x00\xE0\x92\x62\x28\x96\x63\x0A\x01\x57\x91\xC2\x09\xD1\x00\x97\x0D\x03\x75\xA3\x00\x0A\x38", "\xF1\x04\xE9\x92\xF3\x82\x27\x71\xEE\x92\x16\x6F\xF1\x92\x7E\x80\x65\x91\x62\x86\x60\x92\xC4\x75\x64\x92\x0C\x6E\x41\x8A\x31\x64\xF3\x00\xFC\x92\x19\x18\xCB\x00\xFE\x92\x05\x01\xF3\x92\xA6\x89\xB0\x72\x03\x93\xED\x1A\x1C\x90\xBC\x2D\x08\x93\x3E\x84\xD1\x77\x80\x2A\xCC\x6E\xE7\x00\x06\x93\x00\x00\x0F\x93\xB0\x86\xC0\x7E\x80\x2A\x03\x75\xF5\x00\xF8\x92\xB2\x56\x0A\x01\x39\x89\x8E\x73\x22\x00\x12\x93\x64\x06\x02\x00\x4C\x07\xA6\x19\x17\x93\x95\x8B\x8E\x73\x2E\x00\x23\x93\x1B\x0A\x10\x00\x26\x93\xF9\x92\xC5\x86\xCC\x67\x3A\x00\x2C\x93\xA8\x10\x1E\x00\x2F\x93\x1E\x93\x60\x84\x4C\x66\x46\x00\x34\x93\x80\x19\x2C\x00\x37\x93\x95\x63\x5C\x8D\x2D\x65\x3C\x93\xD8\x1A\x3A\x00\x3F\x93\x07\x01\x17\x93\xB6\x8B\x44\x6A\x5E\x00\x43\x93\x19\x18\x48\x00\x46\x93\xFF\x92\x66\x89\x4C\x66\x6A\x00\x80\x2A\xED\x6E\x56\x00\x4C\x07\xA8\x19\x17\x93\xBD\x91\x9D\x4E\x4C\x93\xED\x1A\x65\x00\x4F\x93\x07\x93\xF3\x86\x31\x64\x83\x00\x5C\x93\x2E\x22\x73\x00\x5F\x93\x16\x93\xCB\x91\x4C\x69\x1A\x93\x49\x7B\xDA\x90\x47\x93\x95\x84\x49\x77\x6B\x93", "\xAC\x75\x6D\x93\x50\x93\x91\x8D\x86\x63\xA5\x00\x54\x93\x64\x06\x9B\x00\x4C\x07\xEC\x1A\x17\x93\xE0\x91\xCF\x56\x78\x93\x61\x7B\x7B\x93\x30\x93\x8B\x83\x91\x67\xBF\x00\x64\x93\xB3\x19\xBB\x00\x67\x93\x17\x93\xA7\x8D\x8E\x73\xCB\x00\x87\x93\xA1\x22\xC9\x00\x8A\x93\x02\x8C\x1C\x68\xD7\x00\x80\x93\xA8\x10\xD7\x00\x57\x93\x83\x93\xC5\x84\x35\x83\x8F\x93\xB8\x22\xE6\x00\x92\x93\xBF\x8D\x86\x63\xF0\x00\x9D\x93\x82\x27\xD9\x90\x0E\x93\x12\x92\x26\x6E\xFC\x00\x96\x93\x80\x19\x02\x00\xD7\x23\x7C\x93\xA8\x93\xBC\x2A\x09\x00\xB1\x5A\xED\x6E\x12\x00\xAE\x93\x9A\x93\x06\x91\x96\x7C\xB3\x93\x64\x06\x22\x00\xB6\x93\x38\x93\xB8\x93\x40\x62\x23\x00\xBA\x93\x60\x8A\xBD\x93\x40\x93\xE5\x8D\x7C\x69\x30\x00\xC2\x93\xA8\x10\x42\x00\xD7\x23\x58\x93\x2F\x92\x8E\x73\x3D\x00\xC9\x93\x80\x19\x51\x00\xCC\x93\xB7\x93\xFE\x84\xEB\x7B\xB1\x5A\xA0\x78\xB1\x5A\xC2\x01\x60\x00\xD7\x23\x27\x93\xFE\x8D\x7C\x69\x58\x00\xD8\x93\x9E\x45\xDA\x93\x2A\x49\xDD\x93\xD5\x93\x11\x85\xB1\x78\xE2\x93\x50\x4B\xE4\x93\x24\x7A\xE6\x93\xBE\x93\xD7\x8E\x2D\x69", "\xEA\x93\x07\x50\xEC\x93\xFF\x09\xEE\x93\xC5\x93\x24\x85\xCC\x67\x82\x00\xF2\x93\xEB\x62\xF4\x93\x93\x8B\xF6\x93\x6E\x93\x66\x92\x31\x64\x90\x00\xD1\x93\x1F\x66\xFD\x93\x06\x01\xA6\x00\xD4\x93\x02\x58\x65\x77\x4D\x91\xD7\x71\x00\x00\x72\x6A\xB8\x56\x70\x92\x81\x8C\xA8\x10\x10\x94\x16\x5B\xA5\x67\xB1\x5A\x03\x75\xB5\x00\x45\x91\x00\x00\x14\x94\x32\x8A\x1C\x6C\x17\x94\x64\x06\xC2\x00\x1A\x94\x1C\x94\x5C\x44\x14\x83\xFB\x93\xD8\x1A\xCF\x00\xFF\x93\xC3\x6C\x00\x93\x69\x64\xC1\x00\x26\x94\x19\x18\xDD\x00\x29\x94\x05\x01\x23\x94\x77\x8B\x9B\x8E\x2E\x94\xED\x1A\xEB\x00\x31\x94\x1B\x94\x2B\x89\x5F\x66\x36\x94\x2E\x22\xF9\x00\x39\x94\x23\x94\x39\x8D\x44\x6A\xE5\x00\x1F\x94\x1B\x0A\x07\x00\x15\x92\x32\x94\x6D\x90\x0F\x79\x3D\x94\xC2\x5F\x5F\x38\xA6\x19\x23\x94\x29\x93\xA9\x93\x4C\x94\x76\x68\x4E\x94\x12\x01\x23\x94\x4E\x8D\xBC\x2A\x08\x00\x82\x28\xCC\x6E\x30\x00\x55\x94\xA4\x63\xB4\x7A\xE6\x8D\x5B\x94\x64\x06\x3E\x00\x5E\x94\xB7\x56\x41\x93\x86\x63\x20\x00\x62\x94\x1B\x0A\x4C\x00\x65\x94\x07\x01\x23\x94\x49\x93\x8E\x73", "\x2C\x00\x6A\x94\xA8\x10\x5A\x00\x6D\x94\x2A\x94\x51\x93\x7C\x69\x38\x00\x82\x28\xED\x6E\x68\x00\x5F\x38\xA8\x19\x23\x94\x5A\x93\x75\x6E\x73\x94\x93\x7C\x76\x94\x49\x94\xCD\x8B\xCC\x67\x51\x00\x83\x94\x76\x82\x85\x94\x3A\x94\x7E\x89\x4C\x66\x5D\x00\x82\x28\x03\x75\x93\x00\x48\x94\x8D\x94\xD2\x91\x7C\x69\x68\x00\x91\x94\x64\x06\xA0\x00\x94\x94\x23\x94\x7E\x93\xE6\x4B\x7B\x94\x92\x89\x5F\x38\xEC\x1A\x9D\x94\xBB\x80\x80\x00\xA0\x94\x1B\x0A\xBD\x00\xA2\x94\x56\x94\xBD\x73\x78\x79\x8A\x94\x19\x18\xCD\x00\x8C\x94\x23\x94\x8C\x93\x26\x6E\x99\x00\xAE\x94\xED\x1A\x06\x92\xBC\x2D\x23\x94\xD6\x7B\x7A\x1C\xA5\x00\xA7\x94\xA8\x10\xE9\x00\x7E\x94\xAB\x94\xC0\x62\x5A\x84\xB6\x94\x2E\x22\xF8\x00\xB1\x94\xBF\x89\xE5\x6C\xC5\x94\xB3\x19\x06\x00\x97\x0D\x4F\x94\xB0\x93\xED\x25\xCA\x00\xBE\x94\xEA\x5D\x97\x0D\xA3\x94\xD0\x94\x7A\x1C\xD7\x00\xD3\x94\xD8\x1A\x24\x00\xD5\x94\xC2\x94\xDD\x8D\x69\x64\xE4\x00\xDA\x94\x19\x18\x34\x00\xDD\x94\x5F\x94\xDF\x94\x1C\x68\xF1\x00\xE2\x94\xED\x1A\x44\x00\xE5\x94\x66\x94\xC6\x93\x40\x62\xFE\x00", "\xEA\x94\x2E\x22\x54\x00\x97\x0D\x7F\x94\xCE\x93\x26\x6E\x0B\x00\x58\x26\xED\x6E\x63\x00\xF5\x94\xDE\x94\x11\x8F\x4C\x66\x18\x00\x58\x26\xD3\x79\x58\x26\xB1\x7E\xCE\x94\xFE\x94\x8C\x8F\xA1\x75\x02\x95\x5E\x38\x04\x95\xF7\x54\x06\x95\xE6\x94\x04\x77\x91\x67\x34\x00\x0A\x95\xA5\x38\x0C\x95\xC6\x7E\x0E\x95\xEE\x94\xC3\x8E\x4C\x66\x42\x00\x13\x95\x30\x29\x15\x95\x5C\x54\x17\x95\x6E\x94\x41\x8B\xEF\x65\x50\x00\x1C\x95\x78\x0B\x1E\x95\x07\x01\xAA\x00\x20\x95\x77\x94\x43\x91\xF4\x71\xFA\x94\x41\x48\x27\x95\x06\x01\xC6\x92\xB9\x2C\xAB\x63\xF2\x75\x0C\x94\xA0\x77\x06\x01\x34\x95\x00\x00\xC0\x63\x51\x8A\x12\x94\x80\x19\xB2\x63\x15\x94\xF3\x6B\x58\x26\x03\x75\xDD\x92\x58\x11\x3F\x95\x1D\x94\x91\x67\x78\x00\x42\x95\x64\x06\xD4\x00\x68\x92\x86\x87\xFA\x92\x2D\x91\x25\x95\xD8\x1A\xE1\x00\x2A\x95\x35\x95\x45\x7B\x7C\x69\x8F\x00\x51\x95\x19\x18\xEF\x00\x54\x95\x00\x00\x46\x95\x4A\x8A\x71\x6E\x59\x95\xED\x1A\xFD\x00\x5C\x95\x5E\x95\x7F\x8B\x8E\x73\xA7\x00\x61\x95\x2E\x22\x0B\x00\x80\x2A\xA6\x19\x5E\x95\x42\x94\x8E\x73\xB3\x00", "\x4A\x95\x1B\x0A\x19\x00\xAB\x93\x4E\x95\x88\x91\x2B\x8C\x69\x95\xDE\x86\x6C\x95\x12\x01\x5E\x95\x51\x94\xBC\x2A\xCA\x00\x79\x95\xA1\x22\x34\x00\x7B\x95\xC1\x56\x9D\x8B\x86\x63\xD6\x00\x81\x95\xB8\x22\x42\x00\x84\x95\xBE\x56\x9C\x91\x40\x62\xE2\x00\x89\x95\x82\x27\x50\x00\x8C\x95\xDB\x72\x67\x94\x31\x64\xEE\x00\x91\x95\xFF\x66\x94\x95\x76\x95\x5F\x89\x57\x7F\x99\x95\x62\x28\x6C\x00\x9B\x95\x55\x95\x93\x90\xEF\x65\x06\x00\x7D\x38\xED\x6E\x7A\x00\x80\x2A\xA8\x19\x5E\x95\x81\x94\x38\x0F\x7D\x38\xCC\x6E\x89\x00\xA2\x95\x5D\x95\x61\x93\x69\x64\x1F\x00\xAF\x95\x64\x06\x97\x00\xB2\x95\x5E\x95\x6D\x83\x31\x64\x2B\x00\x7D\x38\x03\x75\x77\x93\x45\x95\x6F\x93\x31\x64\x36\x00\xBF\x95\x7F\x78\x75\x95\xA3\x95\x6D\x81\x91\x67\x41\x00\xA7\x95\x64\x06\x86\x93\x71\x2C\x5E\x95\x9E\x94\x41\x3F\xCD\x95\x1B\x0A\xCF\x00\x80\x2A\xEC\x1A\x5E\x95\xE8\x91\xED\x25\x5B\x00\xB7\x95\x1B\x0A\xDF\x00\xBA\x95\xCE\x8A\x40\x62\x67\x00\xDD\x95\xB3\x89\xE0\x95\xAF\x8D\x19\x7A\xD4\x95\xA8\x10\xFB\x00\xAA\x95\x7C\x95\xDD\x7B\x7C\x69\x80\x00\xE4\x95", "\x80\x19\x0A\x00\xB1\x5A\x6D\x95\xC9\x94\x4C\x66\x8C\x00\xF1\x95\x46\x89\xF4\x95\xED\x95\x1A\x8C\x40\x62\x98\x00\xE9\x95\x80\x19\x26\x00\xB1\x5A\xD8\x95\xD7\x94\xD1\x0D\xA5\x00\x00\x96\xAF\x91\x03\x96\xFC\x95\xE7\x94\x44\x6A\xB2\x00\x08\x96\x19\x18\x46\x00\x0A\x96\x85\x95\xE9\x84\x31\x64\xBF\x00\x0F\x96\xC9\x66\x12\x96\x8D\x95\xEF\x94\x86\x63\xCC\x00\x17\x96\x2E\x22\x66\x00\xB1\x5A\xAB\x95\xF7\x94\xBC\x2A\xD9\x00\x1E\x96\xB3\x19\x75\x00\x21\x96\x0B\x96\xFF\x94\x7C\x69\xE6\x00\xF9\x95\xB9\x5B\x7D\x38\xC2\x01\x84\x00\xFB\x95\x13\x96\x23\x91\xE4\x89\x2E\x96\x36\x65\xE4\x83\x57\x52\x33\x96\x1A\x96\x4A\x92\x82\x91\x67\x28\xEB\x83\x67\x28\xC2\x01\xA0\x00\x3B\x96\x95\x95\x53\x92\x7C\x69\x10\x00\x3F\x96\x6F\x2A\x41\x96\xC7\x56\x44\x96\x9C\x95\x19\x8E\x67\x89\x49\x96\xB0\x36\x4B\x96\x53\x60\x4D\x96\xC9\x95\x0B\x84\x91\x67\x2C\x00\x67\x28\xF1\x04\x39\x00\x53\x96\x9F\x59\x29\x96\x0F\x01\xB9\x63\x45\x96\x3C\x95\x19\x8D\x64\x06\x61\x96\x06\x01\x3B\x95\x11\x94\x64\x96\x20\x83\x45\x85\x4C\x66\x3B\x00\x67\x28\x26\x86\xB8\x22", "\x68\x96\x12\x8F\x70\x65\x3E\x00\x67\x28\xF7\x18\x44\x00\x67\x28\x1A\x62\x72\x96\x2D\x5A\x49\x67\x76\x96\xB8\x3D\x79\x96\x92\x89\x93\x8F\xB3\x68\x7E\x96\x7F\x41\x80\x96\x6B\x96\x8D\x5A\x70\x65\x53\x00\x84\x96\x7E\x42\x86\x96\xA8\x10\x7B\x96\xA3\x87\x70\x65\x5A\x00\x8B\x96\x48\x44\x8D\x96\x80\x19\x8F\x96\xA6\x92\x87\x8F\x93\x96\x7B\x46\x95\x96\xD8\x1A\x8F\x96\xAE\x92\xED\x25\x68\x00\x9A\x96\xFA\x48\x9C\x96\x19\x18\x8F\x96\xB6\x92\xED\x25\x6F\x00\xA2\x96\x00\x00\x75\x00\xA4\x96\xED\x1A\x8F\x96\x12\x90\xC2\x09\x76\x00\xAA\x96\x7C\x00\xAD\x96\x2E\x22\x8F\x96\x18\x90\xDA\x0B\x7D\x00\xAA\x96\x83\x00\xB5\x96\xB3\x19\x8F\x96\xCC\x92\xF3\x05\x84\x00\xAA\x96\x8A\x00\xBD\x96\xA1\x22\x8F\x96\xD4\x92\xC2\x09\x8B\x00\xAA\x96\x91\x00\xC5\x96\x71\x96\xDB\x92\x4C\x66\x92\x00\xAA\x96\x98\x00\xCD\x96\x82\x27\x8F\x96\xE3\x92\xDA\x0B\x99\x00\xAA\x96\x9F\x00\xD4\x96\x71\x26\xC8\x56\x0A\x01\x7A\x6A\x69\x96\x62\x28\xA0\x00\x5D\x96\x80\x19\xC9\x63\x56\x8B\x70\x65\xA2\x00\x67\x28\x03\x75\xD9\x00\x04\x94\x05\x01\xE6\x96\x5F\x8B\x8D\x87", "\xEA\x96\x64\x06\xE6\x00\xED\x96\x00\x00\xEF\x96\x67\x8B\x9C\x6A\xB8\x00\x51\x96\xA8\x10\xF3\x00\x55\x96\xF6\x96\x2B\x94\x1C\x68\xC4\x00\xFB\x96\x80\x19\x01\x00\x82\x28\xA6\x19\xF7\x96\x5F\x95\x08\x85\x03\x97\xD8\x1A\x0F\x00\x06\x97\x12\x01\x08\x97\x66\x95\x26\x6E\xDC\x00\x0B\x97\x19\x18\x1D\x00\x0E\x97\xC9\x56\x66\x90\xD0\x7A\xF2\x96\x68\x83\xEA\x94\x08\x97\x20\x93\x26\x6E\xF3\x00\x14\x97\xED\x1A\x7A\x94\xBC\x2D\x08\x97\x7E\x95\xC5\x26\x22\x97\x2E\x22\x46\x00\x17\x97\x0A\x01\x08\x97\x58\x94\xED\x25\x0B\x00\xD6\x27\xCC\x6E\x54\x00\x2C\x97\x07\x01\x08\x97\x56\x8D\x26\x6E\x17\x00\x32\x97\x64\x06\x62\x00\x35\x97\x06\x01\x08\x97\xAE\x8B\x26\x6E\x23\x00\x3B\x97\x1B\x0A\x70\x00\x3E\x97\xEE\x96\xAB\x91\x69\x64\x2F\x00\x44\x97\x26\x80\x47\x97\xFF\x96\x78\x94\x40\x62\x3B\x00\xD6\x27\xED\x6E\x8C\x00\x82\x28\xA8\x19\x08\x97\xAD\x95\xD8\x0E\x4C\x97\x80\x19\x9B\x00\x4E\x97\x08\x97\xC4\x91\x44\x6A\x54\x00\x5B\x97\xD8\x1A\xA9\x00\x5E\x97\x69\x93\x31\x64\x60\x00\xD6\x27\x03\x75\xB7\x00\x1D\x97\xC3\x95\x69\x64\x6B\x00\x6A\x97", "\x35\x87\x6D\x97\xD9\x91\x4C\x66\x76\x00\x53\x97\x7A\x7F\x82\x28\xEC\x1A\x08\x97\xD2\x95\x8A\x6B\x77\x97\x1B\x0A\xE1\x00\x79\x97\x0F\x97\xAC\x94\x51\x6B\x63\x97\x19\x18\xE9\x94\x25\x97\xE1\x95\x86\x63\x9C\x00\x85\x97\xDF\x23\x66\x97\xE7\x95\x31\x64\xA8\x00\x7E\x97\xA8\x10\x0D\x00\x58\x26\x57\x97\xEE\x95\x40\x62\xB5\x00\x8C\x97\x2E\x22\x1C\x00\x58\x26\x07\x97\xF6\x95\xE2\x7D\x9A\x97\xB3\x19\x2A\x00\x9D\x97\x82\x97\xFD\x95\x86\x63\xCD\x00\x92\x97\x80\x19\x38\x00\x58\x26\x7A\x97\x05\x96\x1F\x90\xA9\x97\xD8\x1A\x48\x00\xAC\x97\xA5\x97\x0C\x96\x8E\x73\xE7\x00\xB0\x97\x19\x18\x58\x00\xB3\x97\x18\x97\x14\x96\x69\x64\xF4\x00\xB8\x97\xED\x1A\x68\x00\xBB\x97\x2D\x97\x28\x92\x31\x64\x01\x00\x83\x0A\xED\x6E\x49\x95\xB9\x2C\x08\x97\xD8\x83\xBC\x2A\x0E\x00\xC8\x97\x64\x06\x87\x00\x95\x97\xB4\x97\x2B\x96\x40\x62\x1B\x00\x83\x0A\x36\x05\x27\x00\x83\x0A\xC2\x01\x96\x00\xA4\x97\xBC\x97\x35\x96\x40\x62\x29\x00\xD8\x97\x13\x38\xDB\x97\xFB\x91\xDE\x97\xC4\x97\x2B\x8E\xEF\x65\x37\x00\xE3\x97\x84\x22\xE5\x97\xCF\x56\xE7\x97\x36\x97", "\x35\x91\x91\x67\x45\x00\xEC\x97\x15\x8E\xEE\x97\x0A\x01\xC0\x00\xF0\x97\x3F\x97\x22\x95\xCC\x67\x53\x00\xF5\x97\xE1\x43\xF7\x97\xE6\x59\xFA\x97\x48\x97\x01\x94\x69\x64\x61\x00\xD0\x97\x34\x49\x01\x98\x0B\x85\xD3\x97\xCB\x56\xC7\x57\x27\x89\x2E\x8D\xC9\x84\x64\x74\x36\x95\xE3\x71\xD5\x63\xE7\x96\x9C\x6A\x70\x00\x83\x0A\x03\x75\xEB\x00\x2E\x95\xCD\x56\x0A\x89\x4C\x66\x7B\x00\x19\x98\x64\x06\xF8\x00\x1C\x98\xD4\x63\x4F\x95\x8E\x73\x86\x00\xFF\x97\xD4\x62\x7D\x38\xA6\x19\x15\x98\x99\x86\x0C\x6C\x29\x98\x19\x18\x13\x00\x2B\x98\x12\x98\x0E\x8A\x4C\x66\x9E\x00\x30\x98\x8C\x64\x33\x98\x1D\x98\x7A\x91\x88\x8B\x38\x98\x2E\x22\x2F\x00\x3A\x98\x25\x98\x87\x8B\xCC\x67\xB6\x00\x21\x98\xF6\x8B\x17\x96\x2D\x98\x05\x01\x1F\x97\xBC\x2A\xC1\x00\x3E\x98\xB3\x19\x4A\x00\x41\x98\x07\x01\x49\x98\xF9\x85\xD9\x67\x4E\x98\xA1\x22\x58\x00\x51\x98\x06\x01\x53\x98\x2F\x97\x7A\x1C\xD9\x00\x56\x98\xB8\x22\x66\x00\x59\x98\x05\x01\x53\x98\x38\x97\xBC\x2A\xE5\x00\x5F\x98\x82\x27\x74\x00\x62\x98\x00\x00\x53\x98\x41\x97\xBC\x2A\xF1\x00\x68\x98", "\xFC\x81\x6B\x98\x53\x98\x70\x94\x26\x6E\xFD\x00\x71\x98\x62\x28\x90\x00\x73\x98\xBD\x8B\x40\x62\x09\x00\xE5\x0A\xED\x6E\x9E\x00\x7D\x38\xA8\x19\x53\x98\x59\x97\x16\x00\xE5\x0A\xCC\x6E\xAD\x00\x7B\x98\x87\x94\x4C\x66\x22\x00\x87\x98\x64\x06\xBB\x00\x8A\x98\xD3\x8B\x5E\x71\xE5\x0A\x03\x75\xC9\x00\x48\x98\x6E\x97\x1C\x68\x39\x00\x94\x98\xB5\x8A\x97\x98\x74\x97\x7C\x69\x44\x00\x7F\x98\x64\x06\xE3\x00\x7D\x38\xEC\x1A\x53\x98\x7C\x97\x12\x41\xA1\x98\x1B\x0A\xF3\x00\xA4\x98\x34\x98\x84\x93\x01\x7A\x8E\x98\x1B\x0A\x03\x00\x67\x28\x2C\x98\x89\x97\x31\x64\x6A\x00\xB0\x98\xA8\x10\x11\x00\xB3\x98\xAD\x98\xD7\x90\x69\x87\xA9\x98\xA8\x10\x1F\x00\x67\x28\x83\x98\x97\x97\xDC\x75\xB8\x98\x80\x19\x2E\x00\xBB\x98\x3B\x98\xE7\x90\x45\x84\xC6\x98\xD8\x1A\x3C\x00\xC9\x98\x42\x98\xF7\x90\x4A\x8E\xBF\x98\x80\x19\x4A\x00\x67\x28\xA5\x98\xAE\x97\xC2\x09\xA8\x00\xD4\x98\xD8\x1A\x92\x96\x71\x2C\x53\x98\xD4\x89\x98\x97\xDC\x98\x19\x18\x6A\x00\xD7\x98\xBC\x98\xBF\x93\x86\x63\xC2\x00\xE3\x98\xED\x1A\x7A\x00\xE6\x98\xCA\x98\x60\x87\x7C\x69", "\xCF\x00\xEB\x98\x85\x85\xC2\x98\xE7\x98\xE8\x76\x70\x65\xDC\x00\xF3\x98\xB3\x19\xD9\x96\xB9\x2C\x53\x98\xF4\x8D\x26\x6E\xE9\x00\xCD\x98\x05\x01\xF5\x00\xE5\x0A\xC2\x01\xA8\x00\xD0\x98\x52\x98\xDF\x93\x40\x62\xF7\x00\x02\x99\x99\x5D\x8A\x0A\x20\x8B\x08\x99\x5A\x98\xAB\x6C\x50\x8C\x8A\x0A\x36\x05\x11\x00\x0F\x99\xB3\x58\x11\x99\x63\x98\xF2\x97\xEF\x65\x13\x00\x15\x99\x71\x02\x18\x99\x56\x74\x1A\x99\x6C\x98\xFC\x97\x4C\x66\x21\x00\x1F\x99\x37\x03\x21\x99\x0A\x01\xE0\x00\x23\x99\xE0\x98\x70\x65\x2F\x00\x8A\x0A\xF1\x04\x3C\x00\x2A\x99\x07\x01\xEE\x00\xF5\x98\xCF\x56\xE7\x56\x13\x98\x10\x8F\x26\x7C\x0E\x98\x63\x96\x10\x98\xDB\x90\xFC\x8C\xCC\x67\x3E\x00\x8A\x0A\x03\x75\xFD\x00\x5A\x96\x39\x99\x3F\x90\x91\x67\x49\x00\x44\x99\x2A\x73\xC0\x97\xE2\x56\x47\x90\x89\x7D\x28\x99\xA8\x10\x3A\x97\xBC\x2D\xE2\x56\x6D\x91\x48\x44\x52\x99\x80\x19\x25\x00\xD6\x27\xA6\x19\xE2\x56\x34\x94\xBC\x2A\x6C\x00\x59\x99\xD8\x1A\x33\x00\x5C\x99\x48\x99\x30\x8D\xEF\x65\x78\x00\x62\x99\x19\x18\x41\x00\x65\x99\x22\x57\x07\x01\x6F\x95\xDB\x8C", "\x4C\x99\xDD\x6E\x4E\x99\x4A\x94\x44\x6A\x8F\x00\x6A\x99\xED\x1A\x5C\x00\x6D\x99\x11\x57\xDC\x85\x71\x6E\x78\x99\x2E\x22\x6A\x00\x7B\x99\x28\x57\x86\x95\x31\x64\xA7\x00\x7F\x99\xB3\x19\x78\x00\x82\x99\x06\x01\xE2\x56\x65\x98\xED\x25\xB3\x00\x87\x99\x99\x8B\x8A\x99\x05\x01\xE2\x56\x6E\x98\xED\x25\xBF\x00\x90\x99\xB8\x22\x94\x00\x92\x99\x7D\x69\x49\x97\x1C\x68\xCB\x00\x98\x99\x82\x27\xA2\x00\x9B\x99\xE2\x56\xB4\x91\x02\x64\x31\x99\x16\x6F\xD6\x27\xA8\x19\xE2\x56\x59\x97\xE4\x00\xA0\x99\x71\x26\xBF\x00\xA3\x99\xB4\x95\x0F\x79\xAE\x99\x62\x28\xA8\x97\x55\x99\x67\x97\xEB\x87\x72\x99\xA8\x10\xDB\x00\x74\x99\xDA\x8B\x40\x73\xDC\x5A\x03\x75\xE8\x00\xBD\x99\x75\x93\xC7\x8B\xDC\x5A\xED\x6E\xF5\x00\xD6\x27\xEC\x1A\xE2\x56\xA7\x98\x7D\x07\xC6\x99\x64\x06\x05\x00\x83\x0A\xCA\x99\x83\x97\x58\x96\xDC\x5A\xCC\x6E\x15\x00\x83\x0A\x5D\x99\xB5\x98\x69\x64\x38\x00\xD5\x99\x64\x06\x23\x00\xD8\x99\x66\x99\xBD\x98\x96\x62\xCE\x99\x1B\x0A\x31\x00\x83\x0A\xAA\x99\xC4\x98\xD5\x68\xDD\x99\x1B\x0A\x40\x00\xE0\x99\x6E\x99\xE5\x8A\x70\x65", "\x5D\x00\xEB\x99\xA8\x10\x4E\x00\xEE\x99\x7C\x99\x95\x7F\x40\x62\x69\x00\xE4\x99\xA8\x10\x5C\x00\xD1\x99\xE1\x99\xCE\x8D\xCC\x67\x76\x00\xFB\x99\x06\x87\xFE\x99\xEF\x99\xFB\x8A\x8B\x67\x03\x9A\x13\x75\x05\x9A\xF7\x99\xE8\x98\x02\x94\x09\x9A\x19\x18\x8C\x00\x0B\x9A\x83\x99\x1B\x96\x31\x64\x9D\x00\x0F\x9A\xED\x1A\x9C\x00\xE7\x99\xFF\x99\xF7\x98\x1C\x6C\x17\x9A\x2E\x22\xAB\x00\x1A\x9A\x06\x9A\x19\x8B\x7E\x7E\xF3\x99\x07\x01\xC3\x00\xDC\x5A\x19\x74\xF6\x99\x13\x9A\xE0\x97\x86\x63\xC5\x00\x25\x9A\x4B\x86\x28\x9A\xE6\x58\x2A\x9A\x8B\x99\x13\x99\x9C\x6A\xD3\x00\x2F\x9A\x05\x01\xDF\x00\x31\x9A\x2D\x74\x33\x9A\x93\x99\x1C\x99\xCC\x67\xE1\x00\x38\x9A\x00\x00\xED\x00\x3B\x9A\x38\x74\x3D\x9A\x9C\x99\x3C\x91\x2F\x73\x42\x9A\xFB\x00\x45\x9A\x65\x5B\x47\x9A\xE2\x56\x47\x74\x31\x64\xFD\x00\x17\x9A\x0A\x00\x07\x0B\xBB\x02\xE5\x0A\xA8\x19\x4B\x57\xE2\x56\x2D\x8D\xA5\x8E\x73\x57\x3D\x99\xE1\x96\x5D\x9A\x80\x19\xA0\x57\xDF\x8F\xC2\x09\x0C\x00\x07\x0B\x70\x96\x82\x27\xA0\x57\xE5\x8F\xD1\x0D\x0F\x00\x07\x0B\xFF\x62\x07\x0B\x1A\x62", "\xA0\x57\x86\x92\xDA\x0B\x16\x00\x6E\x9A\x6F\x2A\x70\x9A\x64\x06\xA0\x57\x8E\x92\xD1\x0D\x1D\x00\x76\x9A\xD6\x33\x78\x9A\x58\x90\x99\x8F\x1C\x68\x24\x00\x7E\x9A\xB4\x36\x80\x9A\xA8\x10\xA0\x57\x9E\x92\x7A\x1C\x2B\x00\x85\x9A\xFC\x37\x87\x9A\x62\x9A\xA6\x8F\x86\x63\x32\x00\x8D\x9A\x7C\x38\x8F\x9A\xD8\x1A\xA0\x57\x9F\x96\x7A\x1C\x39\x00\x94\x9A\x8A\x19\x96\x9A\x19\x18\xA0\x57\xA7\x96\x7A\x1C\x40\x00\x9C\x9A\x8F\x0D\x9E\x9A\xED\x1A\xA0\x57\xB0\x96\xF3\x05\x47\x00\xA4\x9A\x4D\x00\xA6\x9A\x2E\x22\xA0\x57\xB8\x96\xC2\x09\x4E\x00\xA4\x9A\x54\x00\xAE\x9A\xB3\x19\xA0\x57\xC0\x96\x67\x04\x55\x00\xA4\x9A\x5B\x00\xB6\x9A\xA1\x22\xA0\x57\xC8\x96\xF3\x05\x5C\x00\xA4\x9A\x62\x00\xBE\x9A\xB8\x22\xA0\x57\x2A\x90\xF3\x05\x63\x00\xA4\x9A\x69\x00\xC6\x9A\x69\x9A\x05\x8F\xB2\x6F\xA4\x9A\x70\x00\xCE\x9A\x71\x26\xE0\x96\xFB\x97\x0F\x98\x61\x9A\xD8\x1A\xE8\x57\x74\x93\x60\x9A\x64\x90\xB3\x19\xF0\x57\x0A\x01\xDE\x96\xDD\x9A\x4E\x91\x90\x87\xEA\x57\x75\x92\x54\x91\x2E\x22\xDE\x63\x07\x01\xE0\x9A\xE3\x9A\x0D\x94\xE5\x63\x00\x00\xFD\x57", "\x3E\x99\x9C\x7A\x56\x9A\x64\x06\xF1\x9A\xE1\x43\x70\x65\x73\x00\xD4\x9A\x3F\x99\xFF\x57\x56\x74\xD5\x82\x07\x0B\x7A\x03\x78\x00\xFA\x9A\x01\x62\xF6\x9A\xC2\x72\x75\x72\xFF\x9A\x16\x7F\x02\x9B\xBC\x02\x04\x9B\x3B\x5A\x9C\x6A\x7E\x00\x07\x9B\xE7\x4F\x09\x9B\xDF\x6C\x82\x9A\x2D\x91\x0F\x9B\xCE\x50\x11\x9B\x53\x60\xBB\x88\x70\x65\x88\x00\x15\x9B\xE2\x85\x17\x9B\x0A\x01\x0B\x9B\x00\x00\x98\x96\x7A\x1C\x8D\x00\x1C\x9B\x02\x63\x1E\x9B\xFC\x9A\xD1\x8E\x91\x67\x92\x00\x25\x9B\x3E\x73\x27\x9B\x06\x01\x20\x9B\xA1\x9A\xD1\x0D\x97\x00\x2C\x9B\x00\x00\x9B\x00\x2E\x9B\x05\x01\x20\x9B\xA9\x9A\x67\x04\x9C\x00\x34\x9B\xA0\x00\x37\x9B\xF0\x9A\xC4\x92\xCC\x67\xA1\x00\x34\x9B\xA5\x00\x3F\x9B\x20\x9B\xB9\x9A\xBC\x02\xA6\x00\x34\x9B\xAA\x00\x46\x9B\x48\x82\xA1\x81\x34\x9B\xAF\x00\x4D\x9B\x0E\x88\x70\x65\xB0\x00\x34\x9B\xB4\x00\x52\x9B\x0A\x01\xD7\x96\xC2\x09\xB5\x00\x34\x9B\xB9\x00\x3F\x9B\x04\x58\x0C\x58\x3A\x99\xFC\x75\xF4\x9A\x9B\x89\x6C\x96\x7C\x69\xBC\x00\x3F\x9B\x2E\x22\x11\x58\x6B\x9A\xDA\x0B\xBD\x00\x34\x9B\xC1\x00\x3F\x9B", "\x11\x58\x73\x9A\xC2\x09\xC2\x00\x34\x9B\xC6\x00\x71\x9B\x82\x96\x1C\x68\xC7\x00\x34\x9B\xCB\x00\x78\x9B\x88\x96\xE9\x81\x34\x9B\xD0\x00\x7E\x9B\x0A\x01\x8A\x9A\xD1\x0D\xD1\x00\x34\x9B\xD5\x00\x83\x9B\xDF\x72\x91\x67\xD6\x00\x34\x9B\xDA\x00\x8A\x9B\x06\x01\x99\x9A\xD1\x0D\xDB\x00\x34\x9B\xDF\x00\x90\x9B\x2A\x82\x9C\x6A\xE0\x00\x34\x9B\xE4\x00\x97\x9B\x00\x00\x3A\x9B\xBC\x02\xE5\x00\x34\x9B\xE9\x00\x9D\x9B\xB1\x9A\xF3\x05\xEA\x00\x34\x9B\xEE\x00\x9D\x9B\x48\x9B\x44\x5B\x34\x9B\xF3\x00\x9D\x9B\xC1\x9A\x67\x04\xF4\x00\x34\x9B\xF8\x00\x9D\x9B\xC9\x9A\x67\x04\xF9\x00\x34\x9B\xFD\x00\x9D\x9B\x5A\x9B\xF3\x05\xFE\x00\x34\x9B\x02\x00\x49\x6B\x1A\x62\x22\x58\xEA\x92\x70\x65\x03\x00\x49\x6B\x03\x75\x0F\x00\xEB\x98\xC3\x9B\xF4\x92\x91\x67\x0E\x00\xC7\x9B\xDA\x74\xCA\x9B\x26\x98\x26\x6E\x19\x00\x49\x6B\xE2\x74\xE5\x0A\xA6\x19\xCB\x9B\x2E\x98\x31\x64\x25\x00\xD5\x9B\xEB\x74\xD7\x9B\x21\x58\x73\x91\xD3\x7E\xDD\x9B\xF3\x74\xDF\x9B\x1F\x58\x3C\x98\xCC\x67\x3D\x00\xE3\x9B\xFB\x74\xE5\x9B\x0A\x01\xD9\x9B\xC9\x5B\x70\x65\x49\x00", "\xCF\x9B\xB8\x72\xD1\x9B\x77\x95\x86\x63\x54\x00\xEA\x9B\x0B\x75\xEC\x9B\x07\x01\xEE\x9B\x54\x98\x00\x72\xF8\x9B\x13\x75\xFA\x9B\x61\x60\x84\x99\x69\x64\x6C\x00\xFF\x9B\x1B\x75\x01\x9C\x05\x01\xFC\x9B\x8D\x99\x7A\x1C\x78\x00\x06\x9C\x22\x75\x08\x9C\x00\x00\xFC\x9B\x95\x99\x7A\x1C\x84\x00\x0E\x9C\x29\x75\x10\x9C\xFC\x9B\x75\x98\xBC\x2A\x90\x00\x16\x9C\x32\x75\x18\x9C\x7C\x98\x8A\x97\x49\x6B\x3A\x75\x58\x9A\xE0\x9B\x0C\x55\x40\x62\xA9\x00\x1D\x9C\x43\x75\x1F\x9C\x8B\x98\xE6\x78\x29\x9C\x4B\x75\x2B\x9C\x92\x98\xEF\x65\xC1\x00\xF2\x9B\xB3\x89\xF4\x9B\x96\x94\x40\x62\xCC\x00\x34\x9C\x6B\x7E\x36\x9C\xCA\x95\x54\x78\x22\x9C\x63\x75\x8A\x0A\xEC\x1A\xFC\x9B\xCC\x99\xE4\x00\x3F\x9C\x6B\x75\x41\x9C\x25\x9C\xAE\x98\xCC\x67\xF1\x00\x2E\x9C\x74\x75\x8A\x0A\xD8\x9B\xDA\x99\x1C\x68\xFD\x00\x4D\x9C\x7C\x75\x4F\x9C\x49\x9C\xE2\x99\x86\x63\x09\x00\x5D\x0D\xED\x6E\x43\x00\x8A\x0A\xA8\x19\xFC\x9B\xFD\x91\x74\x9A\x5D\x0D\x8C\x75\x56\x9C\xE6\x9B\xCB\x98\xCC\x67\x22\x00\x63\x9C\x94\x75\x65\x9C\xED\x9B\xD9\x98\xF3\x05\x2E\x00\x5B\x9C", "\x64\x06\x6E\x00\x48\x9C\x66\x9C\xF8\x99\x9D\x64\x71\x9C\x07\x80\x74\x9C\x6D\x9C\xBD\x97\x1C\x68\x48\x00\x78\x9C\xA8\x10\x8E\x00\x7A\x9C\xFB\x9B\x21\x92\x86\x63\x55\x00\x7F\x9C\x80\x19\x9E\x00\x82\x9C\x02\x9C\x14\x9A\x69\x64\x62\x00\x87\x9C\xD8\x1A\xAE\x00\x5E\x9C\x57\x9C\x11\x7C\xFD\x6D\x8F\x9C\x19\x18\xBD\x00\x92\x9C\x75\x9C\x1B\x91\x5C\x6D\x6A\x9C\x90\x80\x5D\x0D\xCE\x75\x6C\x9C\x83\x9C\xE8\x83\x7A\x92\x9D\x9C\x9E\x6E\x9F\x9C\xE3\x5A\xA1\x9C\x8B\x9C\x3D\x96\x4C\x66\x98\x00\xA5\x9C\x1B\x7C\xA7\x9C\x13\x5B\xA9\x9C\x09\x9C\x3F\x9A\x4C\x66\xA6\x00\xAE\x9C\x26\x7C\xB0\x9C\xEB\x75\xB2\x9C\x11\x9C\x25\x99\x7C\x69\xB4\x00\xB7\x9C\x66\x60\xB9\x9C\x7D\x01\xDC\x5A\x50\x9C\x05\x98\x1C\x68\xC2\x00\x96\x9C\xD4\x59\xC2\x9C\xAD\x2C\xDC\x5A\xA8\x19\x2A\x58\xAB\x87\x91\x67\xD1\x00\x5D\x0D\x68\x9A\x71\x26\xCF\x9C\xB1\x87\x17\x73\x5D\x0D\xF7\x18\xDA\x00\x5D\x0D\x1A\x62\xD6\x9C\x8D\x8F\xEF\x65\xDB\x00\xD9\x9C\xF3\x5A\xDC\x9C\x64\x06\xDE\x9C\xD1\x85\x91\x67\xE2\x00\xE2\x9C\x13\x5B\xE4\x9C\x1F\x6F\x13\x9B\x8E\x73\xE9\x00\xEA\x9C", "\x18\x7E\xEC\x9C\xA8\x10\xE6\x9C\x05\x01\x85\x9B\xDA\x0B\xF0\x00\xF1\x9C\x21\x81\xF3\x9C\xCA\x8D\x91\x9A\x31\x64\xF7\x00\xFA\x9C\xC1\x5C\xFC\x9C\xD8\x1A\xF5\x9C\xE0\x87\x99\x70\x01\x9D\xAB\x01\x0F\x0E\xDD\x9C\x8D\x7C\x91\x67\x05\x00\x0F\x0E\xF7\x18\x0B\x00\x0A\x9D\xE5\x9C\xBD\x92\x9C\x6A\x0C\x00\x0F\x9D\x3C\x2B\x12\x9D\xED\x9C\xE5\x5A\x48\x73\x17\x9D\xBF\x08\x19\x9D\xF4\x9C\x00\x88\x60\x62\x1D\x9D\x0A\x01\x20\x00\x1F\x9D\xFD\x9C\x07\x88\x9C\x6A\x21\x00\x23\x9D\x7D\x04\x26\x9D\x04\x9D\xCF\x96\xF8\x74\x2B\x9D\xEE\x1D\x2D\x9D\x19\x18\x05\x9D\xBC\x9B\x67\x04\x2F\x00\x31\x9D\x82\x2A\x33\x9D\xED\x1A\xDE\x5E\xF8\x97\x62\x9B\x11\x7B\x40\x58\xF1\x43\x29\x67\x0F\x0E\xD4\x9C\xBA\x8B\x4B\x85\x78\x89\x39\x9D\x13\x0A\x3B\x9D\x2E\x22\x42\x58\x00\x00\x73\x9B\x1B\x7D\x49\x9D\x46\x00\x4B\x9D\xB3\x19\x4D\x9D\x7B\x9A\xDA\x0B\x47\x00\x49\x9D\x4D\x00\x53\x9D\xA1\x22\x4D\x9D\x96\x92\xD1\x0D\x4E\x00\x49\x9D\x54\x00\x5B\x9D\xB8\x22\x4D\x9D\xF7\x9C\xC2\x09\x55\x00\x49\x9D\x5B\x00\x63\x9D\x82\x27\x4D\x9D\x22\x9B\xD1\x0D\x5C\x00\x49\x9D", "\x62\x00\x6B\x9D\x71\x26\x4D\x9D\x92\x9B\xDA\x0B\x63\x00\x49\x9D\x69\x00\x73\x9D\x46\x9D\xF2\x85\x60\x8B\x49\x9D\x70\x00\x7B\x9D\x01\x62\x4D\x9D\x9F\x9B\x5F\x4A\x49\x9D\x77\x00\x81\x9D\xBC\x02\x4D\x9D\xA5\x9B\x67\x04\x78\x00\x49\x9D\x7E\x00\x88\x9D\x41\x9D\xAB\x9B\xEE\x4F\x49\x9D\x85\x00\x90\x9D\x33\x58\x28\x9D\x91\x67\x86\x00\x49\x9D\x8C\x00\x96\x9D\x37\x58\x53\x9B\x58\x81\x49\x9D\x93\x00\x9D\x9D\x3B\x58\x78\x8F\x70\x65\x94\x00\x49\x9D\x9A\x00\xA3\x9D\x90\x58\x97\x9D\xF2\x9A\xDE\x9A\xA1\x22\xAF\x58\x37\x7D\xD3\x53\xAA\x9D\x8B\x14\xDC\x5A\x80\x03\xAF\x58\x2F\x88\x7A\x1C\x9C\x00\xB3\x9D\x61\x17\xB5\x9D\xB7\x58\xF1\x62\x70\x65\x9D\x00\xBB\x9D\x23\x00\xBD\x9D\xB9\x58\x6F\x43\x5E\x69\xBB\x9D\x24\x00\xC4\x9D\xA8\x58\x45\x88\x31\x64\x9F\x00\xBB\x9D\x25\x00\xCA\x9D\xAA\x58\xC7\x68\x31\x64\xA0\x00\xBB\x9D\x26\x00\xD1\x9D\xAC\x58\x55\x88\xEF\x65\xA1\x00\xBB\x9D\x27\x00\xD8\x9D\xAE\x58\xFB\x6F\x1C\x68\xA2\x00\xBB\x9D\x28\x00\xDF\x9D\xB0\x58\x21\x2D\x77\x63\xBB\x9D\x29\x00\xE6\x9D\xAF\x58\x6D\x88\x42\x56\xBB\x9D\x2A\x00", "\xEC\x9D\x03\x2B\x33\x78\xBB\x9D\x2B\x00\xF2\x9D\x77\x7D\x86\x63\xA6\x00\xBB\x9D\x2C\x00\xF7\x9D\x3B\x63\x51\x74\xBB\x9D\x2D\x00\xFD\x9D\x41\x63\x86\x63\xA8\x00\xBB\x9D\x2E\x00\x02\x9E\x15\x40\x27\x9C\xBB\x9D\x2F\x00\x08\x9E\x6E\x30\x70\x65\xAA\x00\x3B\x9D\xAB\x00\x0F\x0E\x16\x02\xE6\x9D\xC6\x58\x64\x9A\xF3\x05\xAD\x00\x44\x9D\xE4\x9A\xC7\x58\x47\x9D\xEF\x65\xB0\x00\x49\x9D\xB6\x00\xBB\x9D\xC6\x58\x4F\x9D\x67\x04\xB7\x00\x49\x9D\xBD\x00\x22\x9E\x79\x9B\x44\x6A\xBE\x00\x49\x9D\xC4\x00\x29\x9E\x7F\x9B\x03\x73\x49\x9D\xCB\x00\x2F\x9E\x84\x9B\x79\x6B\x49\x9D\xD2\x00\x34\x9E\x8B\x9B\xEF\x65\xD3\x00\x49\x9D\xD9\x00\x39\x9E\x91\x9B\x82\x70\x49\x9D\xE0\x00\x3F\x9E\x98\x9B\x58\x6F\x49\x9D\xE7\x00\x44\x9E\x9E\x9B\xD0\x90\x49\x9D\xEE\x00\x49\x9E\x8B\x9D\xBC\x02\xEF\x00\x49\x9D\xF5\x00\x49\x9E\x92\x9D\xEB\x75\x49\x9D\xFC\x00\x49\x9E\xB0\x9B\xBC\x02\xFD\x00\x49\x9D\x03\x00\x88\x17\x1A\x62\xC6\x58\xB6\x9B\xBC\x02\x04\x00\x88\x17\xF0\x7A\x5F\x9E\x8A\x6E\xD0\x9A\xCC\x67\x0B\x00\x65\x9E\x71\x03\x67\x9E\x1B\x0A\xE0\x58\x80\x8F", "\x4C\x66\x12\x00\x88\x17\x45\x9D\x01\x62\x70\x9E\x74\x61\x70\x65\x15\x00\x6C\x9E\x0A\x26\x6E\x9E\x51\x6C\xEB\x8F\x1C\x68\x1C\x00\x7B\x9E\x29\x33\x7D\x9E\x80\x19\x77\x9E\x00\x00\x56\x9D\xC2\x09\x23\x00\x82\x9E\x5B\x5F\x84\x9E\x64\x76\xEE\x9C\x26\x6E\x2A\x00\x8B\x9E\x90\x05\x8D\x9E\x19\x18\x86\x9E\x66\x9D\xF3\x05\x31\x00\x92\x9E\x05\x01\x37\x00\x94\x9E\xED\x1A\x86\x9E\x6E\x9D\xDA\x0B\x38\x00\x9A\x9E\x4E\x6E\x9D\x9E\x2E\x22\x86\x9E\x76\x9D\x15\x7D\xA3\x9E\x45\x00\xA5\x9E\xB3\x19\x86\x9E\x31\x9B\xDA\x0B\x46\x00\xA3\x9E\x4C\x00\xAC\x9E\xA1\x22\x86\x9E\x84\x9D\x30\x3F\xA3\x9E\x53\x00\xB4\x9E\xB8\x22\x86\x9E\x4F\x9E\x5D\x15\xA3\x9E\x5A\x00\xBB\x9E\x82\x27\x86\x9E\x55\x9E\x5C\x06\xA3\x9E\x61\x00\xC2\x9E\x71\x26\x86\x9E\x5A\x9E\xA5\x02\xA3\x9E\x68\x00\xC9\x9E\x62\x28\x86\x9E\x62\x9E\x5D\x47\xA3\x9E\x6F\x00\xD0\x9E\x76\x9E\x69\x9E\x55\x6D\xA3\x9E\x76\x00\xD7\x9E\xBC\x02\xE5\x58\xDE\x58\xE7\x9A\x71\x92\x2E\x22\x0B\x5A\xB1\x9D\x9D\x4E\xDD\x9E\x4C\x22\xE6\x9D\x0B\x5A\xB8\x9D\xD1\x0D\x78\x00\xE7\x9E\x40\x57\xE9\x9E\x37\x88", "\xFB\x6B\xEE\x9E\x18\x04\xF0\x9E\xE2\x7C\x1C\x68\x7A\x00\xF3\x9E\xA2\x57\xF5\x9E\xE8\x7C\x69\x64\x7B\x00\xF9\x9E\xB1\x6B\xFB\x9E\xEF\x7C\x69\x64\x7C\x00\xFF\x9E\xA4\x88\x01\x9F\xF6\x7C\xCC\x67\x7D\x00\x05\x9F\x19\x26\x07\x9F\xFC\x7C\x69\x64\x7E\x00\x0B\x9F\xDC\x99\xCF\x2A\x0B\x5A\x65\x88\x42\x4F\x0B\x9F\x39\x00\x0D\x9F\x6B\x7D\xCC\x67\x80\x00\x0B\x9F\x3A\x00\x19\x9F\x74\x88\x2D\x5F\x0B\x9F\x3B\x00\x19\x9F\x14\x7D\xF3\x05\x82\x00\x0B\x9F\x3C\x00\x19\x9F\x7C\x7D\xBC\x02\x83\x00\x0B\x9F\x3D\x00\x19\x9F\x20\x7D\xBC\x02\x84\x00\x0B\x9F\x3E\x00\x19\x9F\x88\x7D\xBC\x2A\x85\x00\x0B\x9F\x3F\x00\x19\x9F\x8E\x7D\xC2\x09\x86\x00\x9D\x9E\x87\x00\x88\x17\xC2\x01\x40\x00\xE6\x9D\x0E\x59\x17\x9E\x67\x04\x89\x00\x74\x9E\x1B\x9E\x0E\x59\x6C\x9B\xC2\x09\x8C\x00\xA3\x9E\x92\x00\x0B\x9F\x0E\x59\x24\x9E\xBC\x02\x93\x00\xA3\x9E\x99\x00\x52\x9F\x2A\x9E\x8E\x73\x9A\x00\xA3\x9E\xA0\x00\x59\x9F\x30\x9E\xDB\x9D\xA3\x9E\xA7\x00\x5F\x9F\x35\x9E\x9C\x6A\xA8\x00\xA3\x9E\xAE\x00\x64\x9F\x3A\x9E\xCC\x67\xAF\x00\xA3\x9E\xB5\x00\x6A\x9F\x40\x9E", "\xF0\x91\xA3\x9E\xBC\x00\x70\x9F\x45\x9E\xEF\x65\xBD\x00\xA3\x9E\xC3\x00\x75\x9F\x4A\x9E\x9C\x6A\xC4\x00\xA3\x9E\xCA\x00\x7B\x9F\xBE\x9E\xC8\x59\xA3\x9E\xD1\x00\x7B\x9F\xC5\x9E\x12\x8F\xA3\x9E\xD8\x00\x7B\x9F\xCC\x9E\xF2\x85\xA3\x9E\xDF\x00\x7B\x9F\xD3\x9E\x0F\x01\xE0\x00\xA3\x9E\xE6\x00\x7B\x9F\x36\x9D\x06\x81\xA3\x9E\xED\x00\x0B\x9F\x6D\x59\x47\x9F\xBC\x02\xEE\x00\x4A\x9F\x0D\x94\x6D\x59\x4D\x9F\xF3\x05\xF1\x00\xA3\x9E\xF7\x00\x9B\x9F\x7F\x9E\x44\x6A\xF8\x00\xA3\x9E\xFE\x00\xA8\x9F\xF1\x8F\x13\x8D\xA3\x9E\x05\x00\x29\x0D\x1A\x62\x6D\x59\x5E\x9D\xDA\x0B\x06\x00\x29\x0D\x14\x63\xB3\x9F\xC6\x6F\x19\x9B\x3A\x76\xB9\x9F\x66\x05\xBB\x9F\x1B\x0A\x6D\x59\xA0\x9E\x9C\x66\xBF\x9F\x99\x2D\xC1\x9F\xA8\x10\x6D\x59\xA8\x9E\xF3\x05\x1B\x00\xC6\x9F\xE5\x1D\xC8\x9F\x80\x19\x6D\x59\xAF\x9E\xC2\x09\x22\x00\xCE\x9F\xC9\x78\xD0\x9F\x03\x78\x14\x9D\x91\x67\x29\x00\xD6\x9F\x00\x38\xD8\x9F\x19\x18\x6D\x59\x82\x9F\x72\x0D\xDD\x9F\xA4\x88\xDF\x9F\xBE\x80\x21\x9D\x86\x63\x37\x00\xE4\x9F\xA3\x0D\xE6\x9F\x2E\x22\x6D\x59\x8C\x9F\x0A\x01", "\x3E\x00\xEB\x9F\x44\x00\xED\x9F\x87\x6D\x2F\x9D\x40\x62\x45\x00\xEB\x9F\x4B\x00\xF5\x9F\xA1\x22\x6D\x59\x97\x9F\x7F\x87\xEB\x9F\x52\x00\xFC\x9F\xB8\x22\xC9\x59\x0A\x01\xDF\x9E\xAD\x9D\x1B\x9E\xCE\x59\x0E\x5A\x40\x85\x76\x92\x71\x26\xD0\x59\xAF\x59\x3F\x9D\xCA\x7D\xE7\x59\x39\x96\xEA\x6D\x03\xA0\x82\x27\x41\x00\xE6\x9D\x13\xA0\xD6\x23\x20\x84\x16\xA0\x71\x26\x42\x00\x19\xA0\xF1\x9E\xEC\x68\x1D\xA0\x62\x28\x43\x00\x20\xA0\xF6\x9E\x44\x6A\x56\x00\x23\xA0\x01\x62\x44\x00\x26\xA0\xFC\x9E\x1C\x68\x57\x00\x2A\xA0\xBC\x02\x45\x00\x2D\xA0\x02\x9F\x32\x6B\x31\xA0\x4B\x02\x34\xA0\x08\x9F\x4C\x66\x59\x00\x37\xA0\x62\x3B\x39\xA0\x0E\x9F\x15\x91\x3D\xA0\xAB\x04\x3F\xA0\x02\x7D\x69\x64\x5B\x00\x42\xA0\xC8\x3C\x44\xA0\xEE\x9D\x61\x0A\x48\xA0\x72\x3D\x44\xA0\x20\x9F\x41\x0A\x4D\xA0\xE5\x3D\x44\xA0\x25\x9F\x67\x04\x5E\x00\x52\xA0\x75\x3E\x44\xA0\x2B\x9F\xD1\x43\x58\xA0\x4D\x00\x44\xA0\x31\x9F\x31\x44\x58\xA0\x4E\x00\x44\xA0\x37\x9F\x87\x8F\x58\xA0\x4F\x00\x44\xA0\x3D\x9F\xF3\x05\x62\x00\xE6\x9F\x63\x00\x29\x0D\xC2\x01\x50\x00", "\xE6\x9D\xF5\x63\xF7\x9A\x9C\x6A\x65\x00\x29\x0D\x75\x9E\xC2\x90\x1D\x9E\xCC\x67\x68\x00\xEB\x9F\x6E\x00\x58\xA0\x73\xA0\x05\x9B\xEF\x65\x6F\x00\xEB\x9F\x75\x00\x7F\xA0\x5A\x9F\x26\x6E\x76\x00\xEB\x9F\x7C\x00\x86\xA0\x60\x9F\x09\x9F\xEB\x9F\x83\x00\x8C\xA0\x65\x9F\x91\x67\x84\x00\xEB\x9F\x8A\x00\x91\xA0\x6B\x9F\x4C\x66\x8B\x00\xEB\x9F\x91\x00\x97\xA0\x71\x9F\x2A\x9B\xEB\x9F\x98\x00\x9D\xA0\x76\x9F\xCC\x67\x99\x00\xEB\x9F\x9F\x00\xA2\xA0\x7C\x9F\x7D\x7B\xEB\x9F\xA6\x00\xA8\xA0\xE2\x9F\x47\x93\xEB\x9F\xAD\x00\xA8\xA0\x87\x9F\x65\x8E\xEB\x9F\xB4\x00\xA8\xA0\xF0\x9F\x07\x01\xB5\x00\xEB\x9F\xBB\x00\xA8\xA0\x91\x9F\x1F\x9B\xEB\x9F\xC2\x00\xA8\xA0\xFF\x9F\x59\x58\xEB\x9F\xC9\x00\x58\xA0\x09\x5A\xE5\x9E\x83\x59\x58\xA0\x51\x00\xE6\x9D\x09\x5A\xEB\x9E\xDA\x0B\xCB\x00\x58\xA0\x52\x00\xCD\xA0\x21\xA0\x7C\x69\xCC\x00\x58\xA0\x53\x00\xD4\xA0\x27\xA0\x8E\x73\xCD\x00\x58\xA0\x54\x00\xDA\xA0\x2E\xA0\x44\x6A\xCE\x00\x58\xA0\x55\x00\xE0\xA0\x35\xA0\x44\x6A\xCF\x00\x58\xA0\x56\x00\xE6\xA0\x3A\xA0\x7C\x69\xD0\x00\x58\xA0\x57\x00", "\xEC\xA0\x40\xA0\x44\x6A\xD1\x00\x58\xA0\x58\x00\xF2\xA0\x45\xA0\xCE\x69\x58\xA0\x59\x00\xF8\xA0\x4B\xA0\x25\x5A\x58\xA0\x5A\x00\xF8\xA0\x50\xA0\x33\x5A\x58\xA0\x5B\x00\xF8\xA0\x55\xA0\xBC\x02\xD5\x00\x58\xA0\x5C\x00\xF8\xA0\x5B\xA0\x2D\x74\x58\xA0\xF2\x99\xCF\x2A\x09\x5A\x60\xA0\x9A\x5A\x58\xA0\x5E\x00\xF8\xA0\x65\xA0\x7A\x1C\xD8\x00\x58\xA0\x5F\x00\xF8\xA0\x6A\xA0\x67\x04\xD9\x00\xE6\x9F\xDA\x00\x6F\xA0\x31\x44\xE6\x9D\xF1\x5E\x2C\x8E\x91\x67\xDC\x00\x58\xA0\xFF\x6F\x7A\xA0\x4C\x66\xDD\x00\x29\x0D\x7A\x03\xE1\x00\x58\xA0\x27\xA1\xDF\x9C\xCC\x67\xE2\x00\x30\xA1\x0F\x5B\x33\xA1\x87\xA0\xBC\x2A\xE7\x00\x38\xA1\x21\x5B\x3A\xA1\x8D\xA0\x4C\x66\xEC\x00\x3E\xA1\x4F\x5B\x40\xA1\x92\xA0\xB8\x79\x44\xA1\xE5\x5B\x46\xA1\x98\xA0\x7C\x69\xF6\x00\x49\xA1\x29\x81\x4B\xA1\x9E\xA0\xEF\x65\xFB\x00\x4F\xA1\xAD\x01\x51\xA1\xA3\xA0\x4C\x66\x61\x6E\xEB\x68\x3E\x05\x5C\x3A\x1A\x62\x34\xA1\xD2\x88\x50\x8C\x5C\x3A\x2C\x68\x5D\xA1\x7A\x7F\x41\x9B\x11\x7E\x62\xA1\xED\x04\x64\xA1\x1D\x6B\xE8\x9F\x31\x64\x0F\x00\x68\xA1\x60\x0B\x6A\xA1", "\xA8\x10\x5F\xA1\x05\x01\xB8\xA0\x26\x0B\x6F\xA1\xAF\x30\x71\xA1\x80\x19\x73\xA1\x70\x8F\x42\x76\x77\xA1\x07\x01\x1D\x00\x79\xA1\xD2\x8D\xD9\x9E\x7C\x69\x1E\x00\x7E\xA1\x25\x18\x81\xA1\x19\x18\x56\x7C\xE3\x24\xDD\x82\x54\x91\x60\x74\xF5\x57\xED\x9A\x37\x95\x0C\x9B\xF6\x57\x11\xA0\xB7\x71\x5E\x5A\xEF\x9A\x5C\x9A\x86\x8C\xB6\x7A\x60\x9B\xE1\x9E\x3D\x95\xD8\x1A\xAE\x5A\xFC\x9B\x98\xA1\x64\x06\x28\x80\x54\x58\xA1\xA1\x1B\x0A\x30\x80\xAF\x58\xA5\xA1\xA8\x10\x95\x7C\x05\xA0\x90\xA1\xE3\x71\x9D\x7C\x0A\xA0\xAD\xA1\x3B\x99\xC4\x8F\x6B\x61\x94\xA1\x54\x91\xAD\x7C\x1A\xA0\xA9\xA1\x70\x90\x08\x5A\xB5\xA1\x71\x92\xFD\x7A\xBC\x15\x8C\xA1\xB8\x22\x61\x00\xE6\x9D\xFD\x7A\xBE\x71\xC5\x26\xB7\x71\x62\x00\xE6\x9D\xF6\x5E\xC4\x9B\x9C\x6A\x23\x00\x5C\x3A\x03\x75\x63\x00\x17\x9A\xCA\xA1\xCC\x9B\x91\x88\xCE\xA1\x1F\x6C\xD1\xA1\xD2\x9B\xBC\x2A\x39\x00\x5C\x3A\xCC\x6E\x7D\x00\xC4\x9C\xF1\x5A\x00\x97\x44\x6A\x45\x00\xDB\xA1\x64\x06\x8B\x00\xDE\xA1\x92\x9F\xE1\x9B\x1C\x68\x51\x00\xE3\xA1\xE3\x91\xE6\xA1\x2B\x99\x3B\x94\x7C\x69\x5D\x00", "\xEB\xA1\xA8\x10\xA7\x00\xED\xA1\x07\x01\xD2\xA1\x1B\x83\x70\x65\x69\x00\xD5\xA1\x58\x90\xD7\xA1\xF5\x9B\x31\x64\x74\x00\xF2\xA1\x80\x19\xC2\x00\xF5\xA1\xF0\x67\x47\x8D\x40\x62\x80\x00\x01\xA2\xD8\x1A\xD0\x00\x04\xA2\x05\x01\xF7\xA1\xF5\x51\x9C\x6A\x8C\x00\x09\xA2\x19\x18\xDE\x00\x0C\xA2\x00\x00\x0E\xA2\x51\x89\x91\x67\x98\x00\x12\xA2\xED\x1A\xEC\x00\x15\xA2\x17\xA2\x13\x9C\xD1\x0D\xA4\x00\x1B\xA2\xD4\x83\x1E\xA2\x9D\x99\x44\x6A\xB0\x00\x23\xA2\xB3\x19\x08\x00\x07\x0B\xA6\x19\x17\xA2\xA5\x99\xED\x25\xBC\x00\x5C\x3A\xED\x6E\x75\x9A\xB9\x2C\x17\xA2\x59\x97\xC9\x00\x29\xA2\xAE\x64\x2C\xA2\xDF\xA1\x2C\x9C\x40\x62\xD5\x00\x39\xA2\xB8\x22\x33\x00\x3B\xA2\xE7\xA1\x8E\x94\xE0\x69\xFB\xA1\xA8\x10\x41\x00\x07\x0B\xF1\x04\x17\xA2\xB2\x90\x26\x6E\xEC\x00\x47\xA2\x80\x19\xB3\x9A\x58\x11\x17\xA2\xCC\x99\xF7\x00\x32\xA2\x64\x06\xBD\x9A\x71\x2C\x54\xA2\xBB\x80\x04\x00\x7B\x09\xED\x6E\x6B\x00\x07\x0B\xEC\x1A\x17\xA2\xDA\x95\x7A\x1C\x11\x00\x7B\x09\xCC\x6E\x7B\x00\x43\xA2\xEE\xA1\xEF\x91\x91\x67\x1D\x00\x67\xA2\xDC\x91\x6A\xA2", "\xF6\xA1\x93\x93\x44\x6A\x29\x00\x5E\xA2\xB8\x95\x07\x0B\xA8\x19\x17\xA2\x61\x9C\xC2\x09\x36\x00\x6F\xA2\x8C\x92\x71\xA2\x05\xA2\xA1\x93\x31\x64\x42\x00\x7E\xA2\xA8\x10\x57\x9B\xBC\x2D\x17\xA2\x0C\x92\x14\x65\x76\xA2\x87\x78\x61\xA2\x3C\xA2\xD2\x98\x46\xA0\x8C\xA2\x8F\x78\x8E\xA2\x44\xA2\xB5\x97\x26\x6E\x68\x00\x92\xA2\x80\x19\xE2\x00\x94\xA2\x6B\xA2\x96\xA2\xA1\x8F\x99\xA2\xD8\x1A\xF2\x00\x9C\xA2\x72\xA2\x8C\x9C\x1C\x68\x82\x00\xA0\xA2\x5B\x70\x49\x6B\x79\xA2\x23\x96\xED\x25\x8F\x00\xA8\xA2\xED\x1A\x11\x00\xAA\xA2\x8F\xA2\xD5\x97\x8A\x97\x85\xA2\xD4\x57\x7B\x09\xC2\x01\x20\x00\x49\x6B\x2D\xA2\x0A\x99\x86\x63\xAA\x00\xB6\xA2\x06\x01\xB6\x00\xB8\xA2\x41\x02\xBB\xA2\xB3\xA2\xF1\x83\xC5\x92\xC0\xA2\xAE\x58\xC3\xA2\x23\x6E\xC5\xA2\x95\xA2\xCA\x8E\xEF\x65\xC6\x00\xC9\xA2\x79\x61\xCB\xA2\xAB\x3D\xCD\xA2\x9D\xA2\x4F\x96\x4C\x66\xD4\x00\xD2\xA2\xE0\x00\xD4\xA2\xEE\x41\xD6\xA2\xA4\xA2\x2C\x95\x86\x63\xE2\x00\xAF\xA2\xEF\x00\xDD\xA2\x55\x29\xB2\xA2\x0F\x01\x19\x64\x74\xA0\x01\x7E\x7B\x09\x49\x85\xEA\xA2\x73\x96\x91\x70", "\x7B\x09\x7A\x03\xF6\x00\xED\xA2\x64\x06\xEF\xA2\x7C\x96\x52\x89\xF2\xA2\x8D\x5C\xF5\xA2\x7F\x97\x3B\xA1\xED\x25\xFC\x00\xFA\xA2\xAB\x3B\x09\x65\xF7\xA2\x73\x5A\x70\x65\x01\x00\x3F\x3B\xF5\x87\x3F\x3B\x1A\x62\x04\xA3\x97\x9E\x67\x04\x06\x00\x08\xA3\x42\x2B\x0A\xA3\xF6\xA2\xFE\x9C\x69\x64\x0B\x00\x10\xA3\x1C\x01\x12\xA3\xFD\xA2\xAC\x8F\x08\x88\x17\xA3\x5B\x2B\x19\xA3\xA8\x10\x04\xA3\xD3\x9F\xF3\x05\x15\x00\x1D\xA3\xC1\x0A\x1F\xA3\x98\x78\xDA\x9F\xEF\x65\x1A\x00\x25\xA3\xFD\x2F\x27\xA3\x52\x95\x66\xA1\x27\x88\x2C\xA3\xE3\x33\x2E\xA3\x19\x18\x04\xA3\xB3\xA0\x6F\x06\x32\xA3\x04\x36\x34\xA3\xED\x1A\x04\xA3\x75\xA1\x96\x36\x39\xA3\x2D\x00\x3B\xA3\x2E\x22\x04\xA3\xBE\xA0\x98\x05\x39\xA3\x32\x00\x42\xA3\xB3\x19\x04\xA3\xC3\xA0\x18\x04\x39\xA3\x37\x00\x49\xA3\xA1\x22\xDD\x5D\xEB\xA2\xEF\x65\x38\x00\x50\xA3\x71\x92\x52\xA3\xF0\xA2\x78\x89\x39\xA3\x3D\x00\x56\xA3\x82\x27\x58\xA3\xF8\xA2\x91\x67\x3E\x00\x39\xA3\x42\x00\x5D\xA3\x71\x26\x5F\xA3\x87\x9E\x70\x65\x43\x00\x39\xA3\x47\x00\x65\xA3\x62\x28\x67\xA3\xB6\x9F\xC2\x09", "\x48\x00\x39\xA3\x4C\x00\x6D\xA3\x01\x62\x67\xA3\x0D\xA3\xBC\x02\x4D\x00\x39\xA3\x51\x00\x75\xA3\xBC\x02\x67\xA3\xC4\x9F\xEC\x8B\x39\xA3\x56\x00\x7D\xA3\xF5\x5A\xEB\x85\x44\x6D\x39\xA3\x5B\x00\x84\xA3\xF9\x5A\x0C\x9D\xEF\x65\x5C\x00\x39\xA3\x60\x00\x8A\xA3\x0A\x01\x67\xA3\xB7\x9E\x36\x04\x39\xA3\x65\x00\x91\xA3\x07\x01\x67\xA3\xAE\xA0\x55\x29\x39\xA3\x6A\x00\x98\xA3\x06\x01\x67\xA3\x37\xA3\x6B\x00\x39\xA3\x6F\x00\x9F\xA3\x05\x01\x67\xA3\x3E\xA3\x99\x6D\x39\xA3\x74\x00\xA6\xA3\x00\x00\x67\xA3\x45\xA3\x3D\x4D\x39\xA3\x79\x00\xAD\xA3\x67\xA3\x4C\xA3\xD9\x4E\x39\xA3\x7E\x00\xAD\xA3\xD8\x5D\x53\xA3\xCC\x67\x7F\x00\xAD\xA3\x2E\x22\xBB\xA3\x59\xA3\xEF\x65\x80\x00\x39\xA3\x84\x00\xBA\xA3\xA9\x9F\x8E\x73\x85\x00\x39\xA3\x89\x00\xC7\xA3\xAF\x9F\x4C\x66\x8A\x00\x39\xA3\x8E\x00\xCD\xA3\xF7\x8F\x45\x84\x39\xA3\x93\x00\xD3\xA3\xFC\x8F\x91\x67\x94\x00\x39\xA3\x98\x00\xD8\xA3\x02\x90\x4C\x66\x99\x00\x39\xA3\x9D\x00\xDE\xA3\x08\x90\xBD\x6A\x39\xA3\xA2\x00\xE4\xA3\x0D\x90\x64\x69\x39\xA3\xA7\x00\xE9\xA3\x94\xA3\xD4\x57\x39\xA3", "\xAC\x00\xE9\xA3\x9B\xA3\x65\x77\x39\xA3\xB1\x00\xE9\xA3\x37\xA3\xB2\x00\x39\xA3\xB6\x00\xE9\xA3\xA9\xA3\xB7\x00\x39\xA3\xBB\x00\xE9\xA3\xB0\xA3\x38\x9B\x39\xA3\xC0\x00\xE9\xA3\xB6\xA3\x06\x01\xC1\x00\x39\xA3\xC5\x00\xAD\xA3\x01\x5B\xD0\x9C\xD0\xA2\xBF\xA3\xB3\x19\x0E\xA4\xD7\x9C\x8F\x77\x39\xA3\xCB\x00\x0D\xA4\xC8\xA3\x26\x6E\xCC\x00\x39\xA3\xD0\x00\x18\xA4\xCE\xA3\x7C\x69\xD1\x00\x39\xA3\xD5\x00\x1E\xA4\xD4\xA3\xCC\x67\xD6\x00\x39\xA3\xDA\x00\x24\xA4\xD9\xA3\xE0\x9C\x39\xA3\xDF\x00\x2A\xA4\xDF\xA3\x7C\x69\xE0\x00\x39\xA3\xE4\x00\x2F\xA4\xE5\xA3\x91\x67\xE5\x00\x39\xA3\xE9\x00\x35\xA4\xEA\xA3\xCF\x8D\x39\xA3\xEE\x00\x3B\xA4\xEF\xA3\x06\x01\xEF\x00\x39\xA3\xF3\x00\x3B\xA4\xF4\xA3\x45\x6A\x39\xA3\xF8\x00\x3B\xA4\x37\xA3\xF9\x00\x39\xA3\xFD\x00\x3B\xA4\xA9\xA3\xFE\x00\x39\xA3\x02\x00\xD9\x0E\x1A\x62\x13\xA4\x10\x64\xC5\x9B\xD9\x0E\x7A\x03\x07\x00\x55\xA4\xBC\x8A\x83\xA1\x40\x62\x08\x00\x5A\xA4\x9A\x01\x5D\xA4\x1B\x0A\xFE\x5E\x07\x01\x57\xA4\x9C\xA1\x6A\x96\xA8\x10\xF7\x74\xEB\x92\xF3\x05\x0D\x00\xD9\x0E\x03\x75", "\x75\x00\x46\x9C\x67\x99\xF0\x96\xD0\x79\x70\xA4\x5F\x6D\x73\xA4\x68\x70\xD8\xA1\xED\x25\x23\x00\xD9\x0E\xCC\x6E\x8F\x00\xDF\xA2\x06\x01\xF7\x74\x57\x99\x00\x38\x7E\xA4\x39\x8E\x81\xA4\x10\x93\x17\x8A\xCC\x67\x3B\x00\x86\xA4\x61\x7B\x88\xA4\xF3\x7E\xEF\xA1\x40\x62\x47\x00\x8D\xA4\xA8\x10\xB9\x00\x8F\xA4\xF7\x74\x70\x99\xBC\x2A\x53\x00\x77\xA4\x1B\x0A\xC7\x00\x79\xA4\x82\xA4\x75\x99\xBC\x85\x94\xA4\x80\x19\xD4\x00\x97\xA4\x06\xA2\x86\x63\x6A\x00\xA3\xA4\xD8\x1A\xE2\x00\xA6\xA4\x31\x93\x75\x97\xAA\xA4\x19\x18\xF0\x00\xAD\xA4\xCB\x86\x35\x81\xB0\xA4\xED\x1A\xFE\x00\xB3\xA4\x7C\x7B\xEF\x65\x8E\x00\xB6\xA4\x2E\x22\x0C\x00\x5D\x0D\xA6\x19\xF7\x74\x1A\x9C\xED\x25\x9A\x00\xBD\xA4\x41\x67\xC0\xA4\xEF\xA1\x2F\xA2\x7A\x1C\xA6\x00\xD9\x0E\xED\x6E\x28\x00\x5D\x0D\xA8\x19\xF7\x74\x59\x97\xB3\x00\xC6\xA4\xA1\x22\x37\x00\xC8\xA4\xE7\x9B\x47\x75\x9C\x6A\xBF\x00\xD5\xA4\xB8\x22\x45\x00\xD8\xA4\x74\xA4\x29\x64\x70\x65\xCB\x00\x9C\xA4\xFB\x74\xC9\x9C\xF7\x74\x4D\xA2\xBC\x2A\xD6\x00\xE5\xA4\x80\x19\x60\x00\xE7\xA4\xB9\x90\xE0\x69", "\xCD\xA4\x16\x7A\x5D\x0D\xEC\x1A\xF7\x74\xCC\x99\xEE\x00\xF2\xA4\x27\x6C\xF4\xA4\xEF\xA1\x64\xA2\x37\x73\xDD\xA4\x82\x27\x8D\x00\xE0\xA4\x7A\xA4\x6C\xA2\x80\x7C\x8E\x23\x94\x86\x02\xA5\xA0\xA4\x8F\x97\x69\x64\x13\x00\x8E\x23\xED\x6E\xA9\x00\xD0\xA4\xEF\xA1\x7B\xA2\xF3\x05\x20\x00\x06\xA5\xEE\x7B\x08\xA5\x89\xA4\x04\x92\x58\x96\x15\xA5\x6F\x9E\x17\xA5\x90\xA4\xA6\x97\xE9\x7C\x0D\xA5\x4B\x95\xFB\xA4\xD9\xA4\xCA\x76\x9C\x6A\x45\x00\x21\xA5\x1B\x0A\xE4\x00\x23\xA5\xE1\xA4\xC1\x83\x9C\x6A\x52\x00\x28\xA5\xA8\x10\xF4\x00\x2B\xA5\x03\xA5\x9E\xA2\xED\x25\x5F\x00\x30\xA5\x80\x19\x04\x00\x0F\x0E\xF5\xA4\xC5\x97\x04\x9C\x38\xA5\xD8\x1A\x14\x00\x0F\x0E\xD1\xA4\xAC\xA2\x7A\x1C\x79\x00\x3F\xA5\x19\x18\x23\x00\x42\xA5\xEF\xA1\xFF\x98\xBC\x2A\x86\x00\x1B\xA5\x0D\x52\x8E\x23\xC2\x01\x32\x00\x0F\x0E\xC1\xA4\xBD\xA2\x31\x64\x94\x00\x4F\xA5\x24\x8B\x51\xA5\xA3\x38\x54\xA5\xEF\xA1\x2C\x91\x8E\x73\xA2\x00\x59\xA5\x06\x01\xAE\x00\x5B\xA5\x71\x3F\x5D\xA5\x24\xA5\xAB\x7E\xB9\x67\x62\xA5\x38\x9B\x65\xA5\x61\x0A\x67\xA5\x2C\xA5\x5E\x92", "\x1C\x68\xBE\x00\x6B\xA5\x00\x00\xCA\x00\x6D\xA5\xB0\x47\x6F\xA5\x34\xA5\x22\x8E\xEF\x65\xCC\x00\x47\xA5\x7C\x6B\x77\xA5\x06\x01\x8D\x9D\xB9\x2C\x1B\x64\x16\x98\x91\x67\xDB\x00\x8E\x23\x49\x85\x84\xA5\x75\xA4\xEF\x65\xDC\x00\x88\xA5\x1B\x9E\x8A\xA5\xF8\x96\x91\x67\xDD\x00\x80\xA5\x19\x18\x87\x00\x3B\x9D\x90\xA5\x70\x8B\x4C\x66\xDF\x00\x94\xA5\xED\x1A\x88\x00\x97\xA5\xE8\xA1\x44\x6A\xE1\x00\x9C\xA5\x01\x79\x9F\xA5\x24\xA5\x40\x62\xE3\x00\xA3\xA5\x8D\x85\xA5\xA5\x81\x91\xF9\x7D\x8E\xA5\x0D\x94\x98\xA5\x4B\x98\xED\x25\xE6\x00\xA9\xA5\xA1\x22\x8B\x00\xAB\xA5\x8F\x91\x91\x67\xE8\x00\xB4\xA5\xB8\x22\x9C\x9D\xCF\x2A\x98\xA5\x5C\x98\xD1\x0D\xEA\x00\xBB\xA5\x00\xA5\xB7\xA5\xCD\x7A\x9A\x6B\xC3\xA5\x71\x26\x8E\x00\xC5\xA5\x42\x4B\x9C\x6A\xEE\x00\xC8\xA5\x62\x28\x8F\x00\xCB\xA5\x6F\x84\x9C\x6A\xF0\x00\xCF\xA5\x01\x62\x90\x00\xD2\xA5\xCA\xA4\xD1\x0D\xF2\x00\x8E\x23\x15\x69\x91\x00\x13\x9E\x12\x01\x98\xA5\x59\x97\xF5\x00\xD6\xA5\x55\x9F\xD2\xA5\x60\x97\x8E\x73\xF7\x00\xE5\xA5\x42\x6E\xD2\xA5\xBC\x95\x69\x64\xF9\x00\xAE\xA5", "\x91\xA1\x00\x00\x98\xA5\xE9\xA4\xED\x25\xFA\x00\xF1\xA5\xE3\x71\x98\xA5\xCC\x99\xFB\x00\xDD\xA5\x64\x06\x95\x00\x1A\x9E\x11\x5B\xF0\xA4\xF0\x94\xFD\xA5\x1B\x0A\x98\x00\x00\xA6\x0A\x01\x98\xA5\xFD\xA4\xDA\x0B\x01\x00\xB1\x22\x9E\x68\x9B\x00\xD2\xA5\xB3\x94\xBC\x2A\x03\x00\x0D\xA6\x6E\x6D\xD2\xA5\xBB\x94\xD1\x0D\x05\x00\xB1\x22\x15\x69\xC1\x9D\xDF\x2A\x98\xA5\x12\xA5\x67\x04\x08\x00\x14\xA6\x1B\x0A\xCE\x9D\xBE\xA5\x9F\x97\x40\x62\x0A\x00\x22\xA6\xA8\x10\xD5\x9D\x25\xA6\x1F\xA5\x69\x64\x0C\x00\x1A\xA6\x64\x06\xDC\x9D\x12\x64\x98\xA5\x8A\xA2\x6D\xA1\x30\xA6\x1B\x0A\xA4\x00\x07\xA6\x0C\x5B\x84\x9C\xC7\x8B\x37\xA6\xF3\xA1\x3A\xA6\x06\x01\x98\xA5\xE1\x98\x86\x63\x15\x00\x3E\xA6\x80\x19\x10\x9E\x33\xA6\x3D\xA5\x1C\x68\x18\x00\x46\xA6\x9D\x96\xE0\xA5\x01\xA6\x32\x6E\x9C\x6A\x1B\x00\x4D\xA6\x19\x18\xAF\x00\x4F\xA6\x08\xA6\x6F\x8F\x40\x62\x1E\x00\x29\xA6\x3B\x31\x5C\xA6\x5A\x98\xD2\xA5\x41\x92\xBC\x2A\x22\x00\x5E\xA6\xAD\x34\x64\xA6\x34\x66\xD2\xA5\x5F\xA5\x26\x6E\x26\x00\x66\xA6\x28\x00\x66\xA6\xB3\x00\xD2\xA5\x69\xA5", "\x31\x64\x2A\x00\x66\xA6\x2C\x00\x66\xA6\xB4\x00\xD2\xA5\x71\xA5\x89\x82\x66\xA6\x30\x00\x66\xA6\xB5\x00\xD2\xA5\x51\x9A\x69\x64\x32\x00\x54\xA6\xB0\x5A\x66\xA6\x21\x9E\xDF\x2A\x3D\x70\x6D\xA4\x67\x04\x37\x00\xB1\x22\x1A\x62\xB8\x00\x3B\x9D\x3D\x70\x5F\x91\x43\x8F\x8C\xA6\x64\x06\xB9\x00\x8F\xA6\x7B\xA4\x9A\x9A\x66\xA6\xE9\x9A\x57\xA6\x85\xA5\xA2\x73\x51\x97\x99\xA6\xB3\x19\xBC\x00\x9B\xA6\x40\x95\x8A\xA4\xA4\x91\x9F\xA6\xA1\x22\x2C\x9E\x87\xA6\x91\xA4\x86\x63\x3F\x00\xA6\xA6\xB8\x22\xC0\x00\xA2\xA6\x7B\x6E\x19\x97\x7C\x69\x41\x00\x93\xA6\x87\x78\x96\xA6\xFE\xA1\xF3\x6E\xAD\xA6\x82\x27\xC3\x00\xB0\xA6\x87\x6B\xA7\xA4\x31\x64\x44\x00\xBA\xA6\x71\x26\xC5\x00\xBD\xA6\x3D\x70\xC0\xA5\xB0\x9E\xC2\xA6\x62\x28\xC7\x00\xC5\xA6\x8E\x95\x86\x63\x48\x00\xC9\xA6\x01\x62\xC9\x00\xCC\xA6\xA3\x91\x7C\x69\x4A\x00\xD0\xA6\xBC\x02\x33\x9E\xA9\xA6\x8D\x90\x07\x65\xD7\xA6\x6B\x61\xD3\xA6\xA4\x95\xCC\x67\x4E\x00\x83\xA6\x2E\x22\xCF\x00\x40\xA6\xB1\xA6\x26\x9C\x86\x63\x51\x00\xDD\xA6\x56\x74\xDF\xA6\xFA\x6E\xB4\x71\xEB\xA6\x35\x5A", "\xED\xA6\x42\xA4\xC3\x71\xB5\xA6\xC6\x6B\xB7\xA6\x37\x9C\x86\x63\x56\x00\xF5\xA6\x80\x19\xD7\x00\xF7\xA6\x3D\x9C\xCC\x67\x57\x00\xE3\xA6\xB3\x19\xD8\x00\x0F\x0E\x7A\x03\x3D\x70\xCC\x99\x5A\x00\x02\xA7\xA1\x22\xDC\x00\x05\xA7\x41\x99\xA0\x8D\x9C\x6A\x5D\x00\xF0\xA6\xF6\xA1\xF2\xA6\x93\x83\x9C\x6A\x5F\x00\x12\xA7\xA0\xA3\x14\xA7\xEE\x3C\x91\x67\x61\x00\x0A\xA7\xB8\x22\xE4\x00\xE6\xA6\xBE\xA6\xC3\x94\x9C\x6A\x64\x00\x18\xA7\xCA\x7A\x1A\xA7\xE6\x8A\x8E\x73\x66\x00\x26\xA7\x87\x6B\x1A\xA7\x35\xA6\x69\x64\x68\x00\x1E\xA7\x82\x27\xEB\x00\x0D\xA7\x16\x84\x6E\x9C\x67\x04\x6B\x00\x32\xA7\x71\x26\x51\x9E\x39\x67\x3D\x70\x43\xA6\xDC\x6F\x3A\xA7\x62\x28\xF3\x00\x35\xA7\xCB\xA1\x35\xA5\x7A\x1C\x71\x00\x41\xA7\x01\x62\xF7\x00\x44\xA7\x9C\xA6\xBF\x79\xBB\x78\x49\xA7\xBC\x02\xFB\x00\x21\xA7\x3D\x70\xCD\x97\xED\x25\x77\x00\x50\xA7\xAC\x78\x53\xA7\x59\xA6\x86\x63\x7A\x00\x66\xA6\x7C\x00\x66\xA6\x01\x00\x42\x9F\x0E\xA7\x98\x8F\x0D\x9B\x66\xA6\x80\x00\x66\xA6\x5E\x9E\xDA\xA6\xAB\x9C\x7C\x69\x82\x00\x66\xA6\x84\x00\x66\xA6\x05\x00", "\x62\xA7\x36\xA7\x46\x96\x40\x62\x86\x00\x66\xA6\x88\x00\x66\xA6\x07\x00\x72\xA7\x45\xA7\xD8\xA2\x7C\x69\x8A\x00\x66\xA6\x8C\x00\x66\xA6\x09\x00\x7B\xA7\x4D\xA7\x9E\x40\xBB\xA4\x83\xA6\x91\x00\x66\xA6\x6B\x9E\x12\x64\x03\x5F\x07\x01\x22\x64\xBB\x72\x58\xA7\x1B\x0A\x46\x70\x89\xA6\x07\x6F\xFB\xA6\xD8\x1A\x0E\x00\x9D\x9E\x46\x70\x91\xA6\x26\x6E\x97\x00\x96\xA7\x19\x18\x0F\x00\x99\xA7\x97\xA6\xD1\x0D\x98\x00\x2C\xA7\x10\x00\x84\xA7\x8B\xA5\xDA\x9B\x69\x64\x9A\x00\x2C\xA7\x73\x9E\xDF\x2A\x46\x70\x5F\x99\xED\x25\x9C\x00\x2C\xA7\x14\x00\xA7\xA7\x47\x95\x7A\xA5\x14\x6C\x2C\xA7\x16\x00\xB5\xA7\x85\x6E\xB2\xA6\x40\x62\xA0\x00\x9E\xA7\x13\x7F\xA1\xA7\xB8\xA6\x1C\x68\xA1\x00\x2C\xA7\x19\x00\xBB\xA7\x46\x70\x27\x97\x7A\x1C\xA3\x00\x2C\xA7\x1B\x00\xC8\xA7\x03\x9C\x1C\x68\xA5\x00\x2C\xA7\x1D\x00\xCF\xA7\x60\x94\x7C\x69\xA7\x00\x2C\xA7\x1F\x00\xD5\xA7\x87\x90\x91\x67\xA9\x00\x2C\xA7\x21\x00\xDB\xA7\x3D\x6D\xCC\x67\xAB\x00\x2C\xA7\x8A\x9E\xAE\xA7\x20\x9C\x31\x64\xAD\x00\x91\xA7\xFC\x24\xA0\x9F\x8B\x86\x0F\x55\x23\x8C\x2C\xA7", "\x28\x00\xE1\xA7\x06\x01\xE8\xA5\x26\x6E\xB2\x00\x2C\xA7\x91\x9E\xE7\xA7\x45\xA2\xB0\x8D\xC0\xA7\x2E\x22\x2C\x00\xC2\xA7\xF8\xA6\x31\x64\xB5\x00\xFD\xA7\xB3\x19\x2D\x00\x00\xA8\xFF\xA6\x4C\x66\xB6\x00\xEB\xA7\x98\x05\x88\x17\x7A\x03\x46\x70\xCC\x99\xB9\x00\x0B\xA8\xE4\x5C\x0D\xA8\x1E\x98\x4C\x7A\x70\x65\xBC\x00\x2C\xA7\x36\x00\xF3\xA7\x15\xA7\x97\x6E\x2C\xA7\xA2\x9E\xFA\xA7\xF6\x91\xCE\x81\x12\xA8\x2C\x67\xED\xA7\xD3\xA1\xAA\x47\x72\x70\x2C\xA7\x3D\x00\x1B\xA8\xDD\x73\x9C\x6A\xC5\x00\x2C\xA7\x3F\x00\x2B\xA8\x2F\xA7\x7A\x9B\x23\xA8\x48\x18\x14\xA8\x49\x99\x76\x9C\x31\x64\xCA\x00\x34\xA8\xAB\x9E\x39\x67\x46\x70\x3F\xA7\xEB\x7D\x34\xA8\x49\x00\x36\xA8\xEE\xA7\xFE\x90\xEE\xA0\x34\xA8\x4D\x00\x43\xA8\x26\xA8\x0B\x39\x91\x67\xD3\x00\x34\xA8\x51\x00\x25\xA8\xA8\xA7\x1C\x9A\x8C\x9B\x34\xA8\x54\x00\x50\xA8\xB6\xA7\x9B\x9C\xF2\x7D\x66\xA6\xDB\x00\x66\xA6\x57\x00\x2B\xA8\x61\xA6\xED\x25\xDD\x00\x66\xA6\xDF\x00\x66\xA6\x59\x00\x2B\xA8\x69\xA6\xBC\x2A\xE1\x00\x66\xA6\xE3\x00\x66\xA6\x5B\x00\x2B\xA8\x71\xA6\x69\x64\xE5\x00", "\x66\xA6\xE7\x00\x66\xA6\x5D\x00\x2B\xA8\x79\xA6\xEF\x9C\x66\xA6\xEB\x00\x66\xA6\x5F\x00\x2B\xA8\x80\xA6\x1C\x68\xED\x00\x83\xA6\xF0\x00\x66\xA6\xC8\x9E\x12\x64\x08\x5F\x0A\x01\x8F\xA7\x4E\x6C\x34\xA8\x2E\x22\x99\x6A\x94\xA7\xE7\x5B\x04\xA8\xB7\x76\x9D\x9E\x99\x6A\x9B\xA7\xBC\x2A\xF6\x00\x8F\xA8\xB8\x22\x65\x00\x91\xA8\xA2\xA7\xDA\x0B\xF7\x00\x2C\xA7\x66\x00\xBB\xA7\x99\x6A\x84\xA4\x1E\x5F\x2C\xA7\xCF\x9E\xDF\x2A\x99\x6A\xB0\xA7\xE2\x8E\x2C\xA7\x6A\x00\x9F\xA8\xAA\xA6\x52\x9A\x2C\xA7\x6C\x00\xAB\xA8\x43\x98\x8F\x71\x96\xA8\x82\x27\x6E\x00\x99\xA8\xC3\xA7\x44\x6A\xCC\x70\xD4\x2A\xA8\x10\xD6\x9E\xA5\xA8\xBF\xA6\x69\x64\x02\x00\xC7\x3D\x9E\x68\x71\x00\xB0\xA8\x59\x84\x41\x71\xC1\xA8\x64\x06\x73\x00\xC4\xA8\x39\x93\x7C\x69\x06\x00\xC7\xA8\x26\x7B\xCA\xA8\x98\x70\x9C\x6A\x08\x00\xCE\xA8\x6D\x7C\xD0\xA8\x0B\x72\x84\x86\xD4\xA8\x80\x19\x79\x00\xD6\xA8\x10\x72\xCC\x67\x0C\x00\xC7\x3D\x15\x69\xFE\x9E\x12\x64\x99\x6A\x59\x97\x0F\x00\xD9\xA8\x36\x80\xDC\xA8\xF5\xA7\xBC\x2A\x11\x00\xE7\xA8\x19\x18\x1C\x9F\xBD\xA8\xFB\xA7", "\x86\x63\x13\x00\xC7\x3D\x3F\x82\xB6\xA8\x01\xA8\x69\x64\x14\x00\xF4\xA8\x08\x83\xF6\xA8\x08\xA8\x7C\x69\x15\x00\xE0\xA8\x64\x06\x33\x9F\x39\x67\x99\x6A\xCC\x99\x18\x00\x00\xA9\xF3\x6A\x49\xA8\x37\x5B\xF2\x8B\xCC\x67\x1B\x00\xED\xA8\xED\x1A\x4F\x9F\xF0\xA8\xA7\x89\xCC\x67\x1D\x00\x0E\xA9\x2E\x22\x8E\x00\xDC\xA8\x17\xA6\xDA\x0B\x1F\x00\x07\xA9\xA8\x10\x90\x00\x56\xA8\x43\x9A\xE9\x99\xED\x8D\x15\xA9\xB3\x19\x56\x9F\x11\xA9\x19\xA5\xEF\x65\x24\x00\x23\xA9\xA1\x22\x95\x00\xDC\xA8\x32\xA8\xDB\x79\x1C\xA9\x80\x19\x97\x00\x09\xA9\x39\x5B\x37\xA7\xBC\x02\x29\x00\x30\xA9\xD8\x1A\x9B\x00\x33\xA9\x20\xA9\x7C\x9C\x44\x6A\x2C\x00\x38\xA9\x19\x8F\x3B\xA9\x99\x6A\x3F\xA8\x1C\x68\x2F\x00\x40\xA9\xED\x1A\xA3\x00\x42\xA9\x4A\xA6\x44\x6A\x32\x00\x47\xA9\x2E\x22\x63\x9F\xE3\xA8\x44\xA5\xD1\x0D\x35\x00\x4E\xA9\xB3\x19\xAA\x00\x1F\xA9\x99\x6A\x4C\xA5\xED\x25\x38\x00\x0E\xA9\x3A\x00\x0E\xA9\xAD\x00\xDC\xA8\x5F\xA8\x7A\x1C\x3C\x00\x0E\xA9\x3E\x00\x0E\xA9\x6D\x9F\x26\xA9\xC7\xA2\xB1\x75\x0E\xA9\x42\x00\x0E\xA9\xB1\x00\xDC\xA8\x6F\xA8", "\x1C\x68\x44\x00\x0E\xA9\x46\x00\x0E\xA9\xB3\x00\xDC\xA8\x77\xA8\x26\x6E\x48\x00\x0E\xA9\x4A\x00\x0E\xA9\x6F\x9F\x69\xA9\x86\xA7\xCC\x67\x4C\x00\x47\xA9\x4F\x00\x0E\xA9\xB7\x00\x1F\xA9\x0D\x5F\x8E\xA7\x70\x65\x51\x00\x55\xA9\x54\x91\xA6\x7B\x99\x6A\xB9\xA1\xD8\x1A\xC6\x70\xC9\xA0\xE4\x29\xFA\xA8\x1B\x0A\xBA\x00\x9D\x9E\xC6\x70\xCF\xA0\x67\x9D\x96\xA9\x9D\x80\x99\xA9\xD5\xA0\x40\x62\x56\x00\x9D\xA9\xFC\x77\x9F\xA9\xDB\xA0\x99\x8C\xA3\xA9\xC4\x75\xA5\xA9\xE1\xA0\x98\x7D\xA8\xA9\xF8\x6C\xAA\xA9\xE7\xA0\x8E\x73\x59\x00\xAD\xA9\xED\x1A\xBF\x00\xAF\xA9\xED\xA0\x40\x62\x5A\x00\xB3\xA9\x2E\x22\xC0\x00\xB6\xA9\xF3\xA0\x8E\x73\x5B\x00\xBA\xA9\xB3\x19\xC1\x00\xBD\xA9\xF9\xA0\x44\x6A\x5C\x00\xC1\xA9\x5C\x9D\xC4\xA9\xFE\xA0\x2C\x0F\xC8\xA9\xB8\x22\x7A\x9F\xCF\x2A\xC6\x70\x03\xA1\xA6\x43\xCD\xA9\x82\x27\x7E\x9F\xD0\xA9\x7A\x88\x54\x92\xD4\xA9\xC3\xA6\xC4\xA9\x0E\xA1\x2F\x44\xDA\xA9\xD1\x9E\xC4\xA9\x14\xA1\x36\x04\xDF\xA9\x01\x62\xC7\x00\xC4\xA9\x19\xA1\xD1\x0D\x62\x00\xE4\xA9\xBC\x02\xC8\x00\xC4\xA9\x1F\xA1\xBC\x02\x63\x00", "\xB3\xA9\x64\x00\x0E\xA9\xC9\x00\x9D\x9E\x11\x5F\xE7\xA6\x20\x72\xEB\xA9\x91\x59\xF6\xA9\x15\xA8\xE2\x95\xFA\xA9\x83\x9F\xCF\x2A\xF7\xA9\x24\x94\x5F\x79\x2A\xA9\xB8\x22\xCC\x00\xBB\xA7\x02\xAA\xA1\xA8\xDE\x47\x05\xAA\x82\x27\xCE\x00\x08\xAA\xA0\xA5\x8E\x73\x6C\x00\x0C\xAA\x71\x26\xD0\x00\x0F\xAA\xA6\xA5\x86\x63\x6E\x00\x13\xAA\x62\x28\xD2\x00\x16\xAA\xAC\xA5\x7C\x69\x70\x00\xFF\xA9\x35\x5A\xFC\xA9\xB7\xA8\x8E\x73\x71\x00\x1A\xAA\x01\x62\xD5\x00\x1D\xAA\xB8\xA5\xC6\x86\x27\xAA\xBC\x02\xD7\x00\x2A\xAA\x96\x91\xEF\x65\x75\x00\x2D\xAA\xDF\x5A\x30\xAA\x7F\x90\x9C\x6A\x77\x00\x34\xAA\xE5\x5A\x36\xAA\x60\x4B\x70\x65\x79\x00\x3A\xAA\x0A\x01\xDD\x00\x3C\xAA\xC3\xA4\x7A\x1C\x7B\x00\x40\xAA\x1A\x86\x3C\xAA\xDA\xA5\xB9\x96\x8D\xA9\xB8\x22\xE1\x00\x1F\xA9\x02\xAA\x59\x97\x80\x00\x47\xAA\x06\x01\xE4\x00\x3C\xAA\xEA\xA8\xED\x25\x82\x00\x53\xAA\xA7\x6E\x3C\xAA\xEE\xA5\x1C\x68\x84\x00\x21\xAA\x8E\xA7\x23\xAA\xF7\xA8\x1C\x68\x85\x00\x60\xAA\x16\x5B\x62\xAA\xFD\xA8\x75\xA7\x4C\xAA\x82\x27\xEA\x00\x3B\xA9\x02\xAA\xCC\x99\x89\x00", "\x6B\xAA\x71\x26\x9F\x9F\x39\x67\x02\xAA\x0A\xA6\x4E\x9F\x5A\xAA\x00\x00\xF2\x00\x3C\xAA\x11\xA6\xED\x25\x8E\x00\x79\xAA\xF4\x00\x3C\xAA\x19\xA9\xC2\x09\x90\x00\x72\xAA\x16\x6D\x4F\xAA\x21\xA9\x1C\x68\x93\x00\x79\xAA\xF9\x00\x3C\xAA\x29\xA7\x26\x6E\x95\x00\x79\xAA\xFB\x00\x3C\xAA\x2E\xA9\x8E\x73\x97\x00\x86\xAA\x01\x62\xFD\x00\x6E\xAA\x35\xA9\x69\x6A\x98\xAA\x93\x5E\x55\xA1\x00\x00\x02\xAA\x44\xA9\x80\x8B\x9E\xAA\x5F\x04\xA0\xAA\xA2\xAA\xBB\x80\xA0\x00\xA5\xAA\xB7\x2B\xA7\xAA\x4B\xA9\x8E\x73\xA3\x00\xAB\xAA\xF0\x04\x77\xA0\x5F\x5B\x52\xA9\xDA\x0B\xA6\x00\xB1\xAA\xA3\x06\xB3\xAA\x61\x5B\x5B\xA7\x31\x64\xA9\x00\x0E\xA9\xAB\x00\x0E\xA9\x13\x00\x24\xA1\xBB\xAA\xA3\x9C\xF9\x75\x67\xA9\x0E\xA9\x15\x00\xC3\xAA\x63\x5B\x35\x9A\x91\x67\xB1\x00\x76\xA9\x0E\xA9\x17\x00\xCA\xAA\x5D\x5B\xB4\x9C\xE6\x78\x86\xA9\x0E\xA9\x19\x00\xD2\xAA\x06\x01\x02\xAA\x79\xA9\xBC\x2A\xB9\x00\x0E\xA9\xBB\x00\x0E\xA9\xCD\x9F\xDF\x2A\xA2\xAA\x70\x65\xBD\x00\x47\xA9\xC0\x00\x0E\xA9\x1D\x00\xBA\xAA\x1A\x81\x12\x01\x88\xA8\xAD\x76\xB8\xAA\xD8\x1A", "\xFF\x74\x8D\xA8\xBC\x58\x66\xAA\x56\x31\xE6\x9F\xFF\x74\x93\xA8\xED\x25\xC6\x00\xF5\xAA\xCB\x14\xF7\xAA\x9A\xA8\xC2\x09\xC7\x00\x79\xAA\xD5\x9F\xDF\x2A\xFF\x74\x0A\xAA\xC9\x00\x79\xAA\x24\x00\xD9\xAA\xEF\x9B\x35\x98\x7C\x69\xCB\x00\x79\xAA\x26\x00\x0A\xAB\x18\x93\x17\xAA\x31\x64\xCD\x00\x79\xAA\x28\x00\x11\xAB\xFF\x74\x99\xA4\xED\x25\xCF\x00\xFC\xAA\x2A\x00\xFE\xAA\x24\xAA\x26\x6E\xD0\x00\x79\xAA\x2B\x00\x18\xAB\xBE\xA8\xCE\x69\x79\xAA\x2D\x00\x25\xAB\xAE\xA4\x7C\x69\xD4\x00\x79\xAA\x2F\x00\x2A\xAB\xB4\xA4\x87\x95\x79\xAA\x31\x00\x30\xAB\xBA\xA4\xCC\x67\xD8\x00\x79\xAA\x33\x00\x35\xAB\x45\x5F\x82\x70\x79\xAA\x35\x00\x3B\xAB\xFA\x6F\x27\x71\xF0\xAA\x9B\x9E\xEB\xAA\x6F\x99\xC6\x8B\x69\x64\xDF\x00\x79\xAA\x3A\x00\x40\xAB\x00\x00\x57\xAA\x7A\x1C\xE1\x00\x79\xAA\x3C\x00\x4C\xAB\x5D\xAA\x44\x6A\xE3\x00\xFC\xAA\xF2\x9F\xCF\x2A\xFF\x74\xF5\xA5\x7A\x1C\xE4\x00\xFC\xAA\x3F\x00\x1F\xAB\xC4\x99\x70\xA8\x43\xAB\x2E\x71\xA0\xAA\xFF\x74\xCC\x99\xE8\x00\x63\xAB\xF4\x9F\x39\x67\xFF\x74\x77\xAA\xF3\x05\xEB\x00\x79\xAA\x48\x00", "\x4C\xAB\x7D\xAA\x7A\x1C\xED\x00\x79\xAA\x4A\x00\x4C\xAB\x83\xAA\xF3\x05\xEF\x00\x63\xAB\x4C\x00\x45\xAB\xF8\xA1\x23\xA7\x91\x67\xF2\x00\x79\xAA\x4F\x00\x4C\xAB\x8F\xAA\x81\x75\x79\xAA\x51\x00\x4C\xAB\x95\xAA\x26\x6E\xF6\x00\x63\xAB\x53\x00\x65\xAB\x9C\xAA\x82\x5C\x63\xAB\x30\xA0\x6B\xAB\x3C\xA6\xEB\x87\x63\xAB\x47\xA0\x95\xAB\x3D\xA9\x39\x85\x63\xAB\x5F\x00\x90\xAB\xA5\xA2\x44\x6A\x02\x00\x51\x3E\x15\x69\x6E\xA0\x12\x64\xFF\x74\x55\xA7\x7A\x1C\x05\x00\xA3\xAB\x39\x7B\x7E\xAB\x0B\xAB\xD3\x6D\x70\x65\x08\x00\x51\x3E\xC2\x01\x0A\x00\xB2\xAB\x5D\x47\x4C\xAB\x62\xA9\xD1\x0D\x0C\x00\xB5\xAB\x02\x05\xBB\xAB\x11\x77\x4C\xAB\x67\xA8\xED\x25\x10\x00\xBD\xAB\xF7\x21\xC3\xAB\xA1\x48\x4C\xAB\x71\xA9\x44\x6A\x14\x00\xC5\xAB\xEB\x2C\xCB\xAB\x4C\x49\x4C\xAB\xDC\xAA\xED\x25\x18\x00\xCD\xAB\x1A\x00\xCD\xAB\x71\x00\x4C\xAB\x7E\xA8\x44\x6A\x1C\x00\xAB\xAB\x08\x31\xCD\xAB\x73\x00\xAD\xAB\x45\x6A\xED\xAA\x2F\x8B\xDB\xAB\xF2\xA5\x2C\x64\x00\x00\xEE\xAA\x4C\x66\x24\x00\xCD\xAB\xCA\x7D\x33\x64\x7C\xA7\xA1\x75\xEA\xAB\xB3\x19\x89\xA0", "\xCF\x2A\xEC\xAB\x4A\xA8\xF8\x74\xEF\xAB\xA1\x22\x77\x00\xE6\x9F\xF3\xAB\xD3\x71\xEF\x65\x2A\x00\xE3\xAB\x69\x73\x11\xAB\xFA\xAB\xE2\x7E\x7C\x69\x2D\x00\xFE\xAB\x16\x8C\x00\xAC\x10\xAA\x26\x6E\x30\x00\x05\xAC\x19\x18\x8B\xA0\xDF\x2A\x01\xAC\x1E\xA5\x91\x67\x33\x00\x0B\xAC\x45\x80\x07\xAC\xB1\xA8\x7C\x69\x36\x00\xF6\xAB\x6F\x80\xF9\xAB\xA1\xA4\x26\x6E\x38\x00\x13\xAC\x2E\x22\x81\x00\x15\xAC\x7D\x99\xEF\x65\x3B\x00\x1F\xAC\xB3\x19\x90\xA0\x0E\xAC\xD0\xA7\x44\x6A\x3E\x00\x26\xAC\x9D\x82\x22\xAC\xCB\xA8\x40\x62\x41\x00\x2D\xAC\xB8\x22\x87\x00\x2F\xAC\xD1\xA8\x91\x67\x44\x00\x33\xAC\x82\x27\x89\x00\x36\xAC\xD7\xA8\x91\x67\x47\x00\x3A\xAC\x71\x26\x9A\xA0\x29\xAC\x50\x97\xFA\x64\x51\x3E\x55\xA0\x8D\x00\xDF\xAB\x0F\xAC\x59\x97\x4E\x00\x41\xAC\x79\x98\x3D\xAC\x4D\xAB\x8B\xA9\x4E\xAC\x01\x62\x92\x00\x50\xAC\x54\xAB\x8E\x73\x54\x00\x19\xAC\x82\x27\x94\x00\x1B\xAC\xBE\x99\x31\x64\x56\x00\x5A\xAC\x71\x26\x95\x00\x5D\xAC\x61\xAB\x32\x6B\x47\xAC\x00\x89\xA0\xAA\x0F\xAC\xCC\x99\x5C\x00\x67\xAC\x38\x6C\x69\xAC\xD3\x99\xF3\x8B", "\x53\xAC\xAE\x8E\x50\xAC\x73\xAB\xD1\x0D\x63\x00\x72\xAC\xD9\x79\x50\xAC\x79\xAB\x67\x04\x66\x00\x6D\xAC\xA8\x10\xA2\x00\x4A\xAC\x89\xAA\x44\x6A\x6A\x00\x78\xAC\x44\x56\x50\xAC\x86\xAB\xED\x25\x6D\x00\x85\xAC\x95\x63\x50\xAC\x8B\xAB\xDB\x5E\x7E\xAC\x80\x19\xA9\x00\x6F\xAC\x2D\xA6\x1C\x68\x74\x00\x90\xAC\x9D\x96\x93\xAC\x46\xA7\xEC\x9E\x97\xAC\x19\x18\xB1\x00\x99\xAC\x45\xA8\x40\x62\x7C\x00\x9C\xAC\xA7\x9A\x9F\xAC\x4E\xA7\x07\xA2\xA3\xAC\x70\x91\x81\xAC\x51\xA6\x93\xA0\xA8\xAC\xA0\xA6\xAA\xAC\xAF\xAB\x70\x7B\x13\xAC\x8B\x00\xCD\xAB\xBF\x00\x50\xAC\xB8\xAB\x0E\x66\x13\xAC\x90\x00\xCD\xAB\xC1\x00\x50\xAC\xC0\xAB\x7A\x1C\x92\x00\x13\xAC\x95\x00\xCD\xAB\xC3\x00\x50\xAC\xC8\xAB\x96\xAA\x13\xAC\x9A\x00\xCD\xAB\xC5\x00\x50\xAC\xD0\xAB\xB9\x9D\x13\xAC\x9F\x00\xCD\xAB\xC7\x00\x50\xAC\xD8\xAB\x8E\x73\xA1\x00\xA3\xAC\xA5\x00\xCD\xAB\xC6\xA0\x12\x64\x90\x5C\x85\xA7\xD7\xA7\x51\x3E\x1A\x62\xD7\xA0\xCF\x2A\xDC\xAC\x51\xA8\xF1\x84\xDF\xAC\x64\x06\xDD\xA0\xE2\xAC\xFF\xAA\xF3\x05\xA9\x00\x61\xAC\x62\x28\xE3\xA0\xDF\x2A\xE3\xAC", "\x02\xAC\x61\x70\xED\xAC\x01\x62\xEF\xA0\xF0\xAC\x08\xAC\xBC\x2A\xAD\x00\xF4\xAC\xBC\x02\xD2\x00\x11\xAB\xF1\xAC\x10\xAC\xC0\x89\xFB\xAC\x31\x5A\xFE\xAC\xBD\xA7\x86\x63\xB1\x00\xE6\xAC\x1B\x0A\xD6\x00\xE6\x9F\xFF\xAC\xB1\xA5\x7A\x1C\xB2\x00\x02\xAD\x15\xA1\xF7\xAC\x6C\x8A\xCC\x67\xB4\x00\x10\xAD\xCE\x7A\x04\xAD\x2B\xAB\x40\x62\xB6\x00\x16\xAD\xE9\x67\x18\xAD\x31\xAB\x31\x64\xB8\x00\x1C\xAD\x6E\x71\x1E\xAD\x36\xAB\xB6\x73\x22\xAD\x39\x9A\x24\xAD\x3C\xAB\xFD\x8F\x27\xAD\x00\x00\x32\xA1\x12\xAD\xE0\xA6\x4C\x66\xBE\x00\x8B\xAC\x07\x01\xE3\x00\xDF\xAB\xFF\xAC\x59\x97\xC1\x00\x2C\xAD\xE6\x00\x29\xAD\xDA\xA4\x91\x67\xC3\x00\x2C\xAD\xE8\x00\x3C\xAD\x00\x00\x57\xAC\x26\x6E\xC5\x00\x08\xAD\x3B\x79\x0B\xAD\x98\x98\x44\x6A\xC6\x00\x47\xAD\x80\x19\xEB\x00\x49\xAD\x9E\x98\x40\x62\xC7\x00\x33\xAD\x06\x01\x43\xA1\x39\x67\xFF\xAC\xCC\x99\xCA\x00\x54\xAD\xC5\x70\xA0\xAA\xFF\xAC\x6D\xAB\x67\x04\xCD\x00\x2C\xAD\xF4\x00\x42\xAD\x75\xAC\xDA\x0B\xCF\x00\x2C\xAD\x4E\xA1\x2F\xAD\x58\x9C\x31\x64\xD1\x00\x5B\xAD\x7E\x5C\x36\xAD\x82\xAC", "\x8E\x73\xD4\x00\x2C\xAD\x54\xA1\x6A\xAD\xF0\x99\x9C\x6A\xD6\x00\x2C\xAD\xFD\x00\x42\xAD\x8E\xAC\xB1\x8E\x6E\xAD\xFF\x00\x5D\xAD\x91\xAB\xFA\x72\x6E\xAD\x03\x00\x86\xA1\x05\x01\xFF\xAC\xA3\xAA\x8E\x73\xDE\x00\x6E\xAD\x07\x00\x86\xAD\x7E\x5C\x96\xAB\x1C\x68\xE1\x00\x6E\xAD\x0B\x00\x8E\xAD\xFF\xAC\xAB\x7F\xF3\x05\xE4\x00\x6E\xAD\x6E\xA1\xDB\xAC\xB5\xAA\xC2\x09\xE7\x00\x6E\xAD\x12\x00\x5C\x3A\xCC\x01\xFF\xAC\x5A\xA9\x7A\x1C\xEA\x00\xCD\xAB\xEC\x00\xCD\xAB\x15\x00\x5C\x3A\xC2\x01\xFF\xAC\xB7\xAC\xC2\x09\xEE\x00\xCD\xAB\xF0\x00\xCD\xAB\x17\x00\xAC\xAD\x93\x5C\x6B\xA7\x40\x62\xF2\x00\xCD\xAB\xF4\x00\xCD\xAB\x19\x00\xB6\xAD\x96\x5C\x74\xA7\x86\x63\xF6\x00\xCD\xAB\xF8\x00\xCD\xAB\x1B\x00\xBF\xAD\x70\x72\xBD\x9C\x40\x62\xFA\x00\xCD\xAB\xFC\x00\xCD\xAB\x80\xA1\x76\xAD\x81\xA9\xC0\x79\x13\xAC\x01\x00\xC1\x3E\xE0\x1E\xA2\xAD\x84\x5C\x74\x5C\xEF\x65\x03\x00\xC1\x3E\x78\xA0\xD9\xAD\x86\x5C\x70\x65\x06\x00\xC1\x3E\x14\x63\xC1\x3E\x1A\x62\x89\x5C\xC9\xAD\xD8\x9A\xAE\x9D\xB8\x22\xA0\x6A\x6C\x5C\x70\x65\x0D\x00\xE5\xAD\x1B\x9E", "\xEC\xAD\x05\x01\xE7\xAD\xEF\x65\x0E\x00\xC1\x3E\x7A\x03\x12\x00\xF0\xAD\x91\x7F\x63\xA7\x40\x62\x13\x00\xDD\xAD\xBB\x93\xC8\xAD\x07\x01\x36\x64\xF4\xAB\x1A\x7E\xFF\xAD\x1B\x0A\x24\x00\x01\xAE\x06\x01\x03\xAE\xFB\xAB\xCC\x67\x19\x00\xF7\xAD\x64\x06\x26\x00\xD8\xAD\x94\x5C\xE0\xA1\x8E\x73\x1D\x00\x0F\xAE\x96\x76\x12\xAE\x91\x5C\xF8\xAC\xED\x25\x21\x00\x17\xAE\xA8\x10\x2C\x00\x19\xAE\x02\xAE\xAC\xA8\x69\x64\x25\x00\x1E\xAE\x80\x19\x2F\x00\x21\xAE\x0A\xAE\x05\xAD\x31\x64\x29\x00\x06\xAE\xA8\x10\x32\x00\x09\xAE\x05\x01\x0B\xAE\x4A\x98\x70\x65\x2C\x00\x26\xAE\xE1\x8A\x29\xAE\x32\xAE\x26\xAB\x44\x6A\x30\x00\x37\xAE\x5B\x6F\x39\xAE\x35\x64\x2A\xAC\x8E\x73\x34\x00\x3E\xAE\xED\x1A\x3A\x00\x40\xAE\x33\xAE\x18\xA2\x54\xA3\x45\xAE\x2E\x22\x3D\x00\x48\xAE\x96\x95\x69\x64\x3C\x00\x4C\xAE\x68\x8A\x4F\xAE\xDB\xA6\x88\x85\x53\xAE\xEF\x86\x55\xAE\x30\xAD\x9F\x98\xC1\x3E\x74\x88\x46\x00\x8E\xAD\x49\xAE\x59\x97\x49\x00\x58\xAE\xB8\x22\x4A\x00\x5A\xAE\xEE\xA6\x98\x71\x64\xAE\x82\x27\x4D\x00\x67\xAE\xF3\xA6\x05\x77\x2E\xAE\x80\x19", "\x50\x00\x31\xAE\x41\xAE\x5E\xAC\xA7\x85\x70\xAE\xD8\x1A\x52\x00\x73\xAE\x49\xAE\xCC\x99\x57\x00\x5D\xAE\x63\x89\x5C\x3A\x5E\x03\x7B\xAE\x85\x83\x7E\xAE\x1B\x0A\x59\x00\x80\xAE\x56\x8C\x70\xAC\xCC\x67\x61\x00\x6A\xAE\xFF\x66\x6D\xAE\x1C\xA8\xEF\x65\x65\x00\x8C\xAE\x62\x28\x61\x00\x8E\xAE\x1B\xA7\xEF\x65\x69\x00\x84\xAE\xA8\x10\x64\x00\x60\xAE\x71\xAD\xED\x88\x92\xAE\x01\x62\x68\x00\x95\xAE\x88\xAC\x7A\x1C\x72\x00\x9F\xAE\xBC\x02\x6B\x00\x95\xAE\x7D\xAD\x7A\x1C\x76\x00\x99\xAE\x0B\x75\x87\xAE\x13\xAE\x94\xAC\x44\x6A\x7B\x00\xAD\xAE\x1F\x8D\xAF\xAE\x1A\xAE\x9B\xAB\x26\x6E\x80\x00\xB4\xAE\x19\x18\x78\x00\xB6\xAE\x22\xAE\xB8\xAE\x38\x9F\xBB\xAE\xED\x1A\x7D\x00\xBE\xAE\x2A\xAE\xA0\xAB\x8E\x73\x8A\x00\xC2\xAE\x2E\x22\x82\x00\x9C\xAE\xAB\xAC\x45\x84\xCA\xAE\xB3\x19\x86\x00\xCD\xAE\xB0\xAC\xDA\xA3\x45\xAE\x98\x00\xD6\xAD\x9B\x10\x95\xAE\xAF\xAD\xF3\x05\x9A\x00\x45\xAE\x9E\x00\xD8\xAE\x9A\x51\x95\xAE\xBE\xAC\xD1\x0D\xA0\x00\x45\xAE\xA4\x00\xE0\xAE\x0A\x01\x90\x00\x95\xAE\xC6\xAC\x26\x6E\xA6\x00\x45\xAE\xAA\x00\xE8\xAE", "\x07\x01\x93\x00\x95\xAE\xCD\xAC\xD1\x0D\xAC\x00\x45\xAE\xB0\x00\xF1\xAE\x20\x76\x95\xAE\xD4\xAC\xF6\xA7\xC2\xAE\xB7\x00\xFA\xAE\x3B\x53\x8E\xAD\xD7\x5C\x73\xA7\x91\x67\xB9\x00\x01\xAF\x68\x8E\x73\xAE\x04\xAF\x44\xA8\xCC\x67\xBB\x00\x08\xAF\x28\x8F\x0A\xAF\xEA\xAC\x67\x04\xBD\x00\x77\xAE\x19\x18\xA1\x00\x40\xAE\x0B\xAF\x9D\xA6\x86\x63\xC0\x00\x15\xAF\x55\x91\x18\xAF\x1B\xAE\x7A\x1C\xC3\x00\x1D\xAF\x4F\xA9\x1F\xAF\x13\xAB\x69\x64\xC6\x00\x23\xAF\x56\xA9\x25\xAF\x1E\xAA\x40\x62\xC9\x00\x0F\xAF\xBE\x96\x11\xAF\x20\xAB\xBC\x2A\xCB\x00\x29\xAF\xA1\x22\xAF\x00\x2B\xAF\x2B\xAA\xCC\x67\xCE\x00\x35\xAF\xB8\x22\xB2\x00\x38\xAF\x31\xAA\xCC\x67\xD1\x00\x3C\xAF\x69\x9A\x3F\xAF\x37\xAA\x17\x73\x43\xAF\x4A\x6C\x45\xAF\x3D\xAA\xA8\x79\x48\xAF\x62\x28\xBB\x00\x4A\xAF\x44\xAA\xD1\x0D\xDA\x00\x4D\xAF\x01\x62\xBE\x00\x4A\xAF\x4A\xAA\xC2\x09\xDD\x00\xA6\xAE\x2B\x58\x03\xAF\x47\xAB\x91\xAD\x54\xAF\xBC\x02\xC5\x00\x4A\xAF\x4E\xAB\xD1\x0D\xE4\x00\x60\xAF\xE6\x58\x4A\xAF\x44\xAD\x3C\xA1\x2F\xAF\xA1\x22\xCB\x00\x31\xAF\x63\xAA\x44\x6A", "\xE9\x00\x6C\xAF\xB8\x22\xCD\x00\x6F\xAF\x69\xAA\x86\x63\xEB\x00\x5B\xAF\x0F\x01\xCF\x00\xC5\xAE\x30\x81\x02\xA6\x86\x63\xEF\x00\x7A\xAF\x35\x5A\x7D\xAF\x00\x00\x19\xAF\x23\x6F\x9C\x6A\xF3\x00\x67\xAF\xF2\x85\x4A\xAF\x65\xAD\xC2\x09\xF6\x00\x8A\xAF\x0A\x01\xDC\x00\x4A\xAF\x7B\xAC\xBC\x02\xF9\x00\x82\xAF\x1A\x86\x5D\xAF\x80\xAB\xEF\x65\xFD\x00\x90\xAF\x34\xAD\x4A\xAF\xA3\xAE\x7A\x1C\x42\x3F\x15\x69\xE6\x00\x4A\xAF\xAA\xAE\xCE\x5D\x42\x3F\x55\xA0\xE9\x00\x84\xAF\x86\xAF\x92\x41\xBB\x80\x07\x00\xA8\xAF\xFA\x90\xAB\xAF\x90\xAD\x44\x6A\x0B\x00\xB0\xAF\xAA\x98\xB2\xAF\xC0\xAE\xED\x25\x0F\x00\xB6\xAF\xA8\x10\xF8\x00\xB8\xAF\x09\x8B\xF2\xA8\xBC\xAF\x80\x19\xFD\x00\x99\xAF\xAC\x5D\xC0\x7E\xC2\xAF\xD8\x1A\x01\x00\x01\xA3\x0A\x01\xAC\xAF\x23\x9A\x0C\xA9\xA2\xAF\x21\x30\x42\x3F\xAE\x07\x7B\x09\xCC\x01\xCD\xAF\xDB\xAE\x67\x04\x20\x00\xD0\xAF\xD6\x33\xD2\xAF\x4E\x2B\xD4\xAF\xAC\x78\xCC\xAA\xEF\x65\x25\x00\xDA\xAF\xC3\x64\xDC\xAF\x34\x2B\xDE\xAF\x0F\x01\xCD\xAF\xEC\xAE\xBC\x2A\x2A\x00\xE3\xAF\xE3\x0F\xE5\xAF\x1D\x05\xE7\xAF", "\xCC\xAF\xCA\xAD\x86\x63\x2F\x00\xED\xAF\xE4\x5C\xEF\xAF\x88\x2B\xF1\xAF\x07\x01\xCD\xAF\xFD\xAE\xBC\x2A\x34\x00\xC8\xAF\x61\x57\xF8\xAF\x26\x0B\xCB\xAF\x07\x5D\x3B\x64\xF1\x77\xF6\xAF\x8C\x7A\x0B\x01\x2E\x01\x61\x03\xAB\x64\x42\x3F\xF7\x18\x43\x00\x42\x3F\x20\x62\x5F\x04\x0C\xB0\x86\x63\x44\x00\x0E\xB0\x9E\x3D\x11\xB0\xFD\x07\x11\x2B\x14\xB0\x55\x7D\x17\xB0\xB7\x40\x19\xB0\x6D\x62\x61\x03\xF3\xAA\x36\x41\x02\xB0\x19\x18\x18\x00\xE6\xA2\x18\x63\xF9\xAA\x7A\x1C\x54\x00\x25\xB0\xED\x1A\x1A\x00\x28\xB0\x2D\x64\x50\x99\x21\x5E\x08\xB0\xED\x1A\x1C\x00\xFA\xAF\x06\x62\x0A\xAA\x59\x00\x34\xB0\x06\x68\x37\xB0\x18\x63\xA7\xA8\x6F\x9D\x3B\xB0\xB3\x19\x22\x00\x3D\xB0\x2D\x64\x11\x97\xBC\x2A\x5F\x00\x41\xB0\xAE\x64\x44\xB0\x80\x63\x1A\xAB\x7A\x1C\x62\x00\x2D\xB0\x2E\x22\x28\x00\x30\xB0\x80\x63\x0D\xAD\xD1\x0D\x64\x00\x49\xB0\xB8\x22\x2A\x00\x4B\xB0\x61\x03\xCA\xA7\xD1\x0D\x67\x00\x58\xB0\x82\x27\x2D\x00\x5B\xB0\x19\xAD\xA8\xA4\x60\xB0\x71\x26\x30\x00\x63\xB0\x1F\xAD\x27\x69\x66\xB0\x62\x28\x33\x00\x69\xB0\x25\xAD\x1F\xAA", "\x6C\xB0\x01\x62\x7D\xA2\x12\x64\x80\x63\x51\xAF\xDA\x0B\x73\x00\x72\xB0\xBC\x02\x39\x00\x6F\xB0\x8B\x7B\x69\x87\x00\xB0\xED\x1A\x3C\x00\x04\xB0\x06\x62\x59\x97\x7A\x00\x7A\xB0\xA3\x38\x7D\xB0\x3D\xAD\x1C\x6F\x87\xB0\x84\x22\x89\xB0\x43\xAD\x70\x65\x80\x00\x50\xB0\xB3\x19\x46\x00\x53\xB0\x61\x03\x5B\xAB\xD1\x0D\x82\x00\x92\xB0\xA1\x22\x48\x00\x95\xB0\x51\xAD\x86\x63\x84\x00\x80\xB0\x2E\x22\x4A\x00\x7B\x09\x5E\x03\x80\x63\xCC\x99\x88\x00\xA1\xB0\xB3\x19\x4F\x00\xA4\xB0\xF1\x61\xC9\x90\xA7\x72\x8C\xB0\x77\x16\x8E\xB0\x8D\xAF\xF3\x05\x8F\x00\xB0\xB0\x43\x03\x8E\xB0\x94\xAF\x62\x52\xA9\xB0\xA1\x22\x5A\x00\x83\xB0\x18\x63\x1F\xA6\x07\x6F\xB6\xB0\xAD\x43\x8E\xB0\xA0\xAF\xD8\x96\xC2\xB0\xC5\x05\x8E\xB0\xA6\xAF\xDA\x0B\x9C\x00\xBB\xB0\xB8\x22\x64\x00\xAC\xB0\xCD\x2A\xCA\xB0\xC2\x09\xA0\x00\xCD\xB0\x82\x27\x69\x00\xD0\xB0\xCB\x2A\x89\xAD\x26\x6E\xA4\x00\xD5\xB0\x71\x26\x6E\x00\xD8\xB0\x20\x63\xDA\xB0\xBC\x2A\xA8\x00\xDD\xB0\x62\x28\x73\x00\xE0\xB0\x06\x62\x97\xAD\x67\x04\xAC\x00\xE5\xB0\x01\x62\x78\x00\xBE\xB0\x2D\x64", "\xA8\xAB\xD1\x0D\xB0\x00\xED\xB0\xBC\x02\x7C\x00\xF0\xB0\x80\x63\xA5\xAD\xD1\x0D\xB4\x00\x34\xB0\xB7\x00\x2D\xB0\x80\x00\x8E\xB0\xD7\xAF\xBC\x02\xB9\x00\x34\xB0\xBC\x00\x2D\xB0\x83\x00\x8E\xB0\xE3\xAE\xDA\x0B\xBE\x00\x34\xB0\xC1\x00\x2D\xB0\x86\x00\x8E\xB0\xEA\xAF\xED\x25\xC3\x00\x34\xB0\xC6\x00\x2D\xB0\x89\x00\x8E\xB0\xF5\xAE\xDA\x0B\xC8\x00\x34\xB0\xCB\x00\x2D\xB0\x8C\x00\x8E\xB0\xFD\xAF\xED\x25\xCD\x00\x80\xB0\xD1\x00\x2D\xB0\xAE\xA2\x39\x67\x39\x5D\xAF\x5C\x40\x62\xD3\x00\xC7\xB0\xED\x1A\x39\x5D\x43\x64\x8C\x9B\x1E\xB0\x91\xAF\x20\xB0\xA8\x10\x39\x5D\x05\x00\x1C\xB0\x69\x64\xDD\x00\x33\xB1\x34\xAD\x35\xB1\x04\x97\x51\x64\x39\xB1\x3A\x8D\x3C\xB1\x06\x01\xEA\x00\x3E\xB1\xD8\x1A\x60\x5D\x05\xAF\xEF\x65\xEB\x00\x9A\xB0\xB8\x22\x93\x00\x30\xB0\x48\xB1\x0C\xAF\x4C\x66\xED\x00\x4C\xB1\x82\x27\x95\x00\x4F\xB1\x61\x03\x32\xB0\xED\x25\xEF\x00\x2E\xB1\x97\x00\x44\xB0\x50\xB1\x1A\xAF\x31\x64\xF2\x00\x2E\xB1\x9A\x00\x5E\xB1\x61\x03\x3F\xB0\xDA\x0B\xF5\x00\x2E\xB1\x9D\x00\x65\xB1\x26\xAF\x1C\x68\xF8\x00\x2E\xB1\xA0\x00", "\x6C\xB1\x2C\xAF\x86\x63\xFB\x00\x54\xB1\x71\x26\xA3\x00\x57\xB1\x32\xAF\xED\x25\xFD\x00\x2E\xB1\xA5\x00\x72\xB1\x39\xAF\x59\xA1\x6C\x1E\x15\x69\xA8\x00\x7F\xB1\x40\xAF\x4C\x66\x03\x00\x82\xB1\x64\x06\xAB\x00\x85\xB1\x46\xAF\xA5\x95\x89\xB1\x1B\x0A\xAE\x00\x8C\xB1\x4B\xAF\x91\x67\x09\x00\x8F\xB1\xA8\x10\xB1\x00\x92\xB1\x77\xB0\x65\x9A\x96\xB1\x80\x19\xB4\x00\x92\xB1\x58\xAF\xF3\x05\x0F\x00\x6C\x1E\x55\xA0\xB7\x00\xF0\xB0\x5F\xB1\x08\x55\x91\x67\x13\x00\x9C\xB1\xD8\x1A\xBB\x00\x92\xB1\x64\xAF\x74\x9A\xAB\xB1\xF8\x6C\x92\xB1\x6A\xAF\x06\x7B\x6C\x1E\x9E\x68\xC1\x00\x79\xB1\x70\xAF\x8E\x73\x1B\x00\xB6\xB1\x16\x6B\xB9\xB1\x77\xAF\x31\x64\x1D\x00\xA3\xB1\x8A\x6E\xE8\xB0\x19\x22\x61\x03\xCC\x99\x21\x00\xC3\xB1\xC2\x9F\xC5\xB1\xE0\x2A\x61\x03\x5F\xAD\xBC\x02\x25\x00\xB1\xB1\xED\x1A\xCF\x00\x92\xB1\xB3\xB0\x67\x04\x28\x00\xD2\xB1\x2E\x22\xD2\x00\x92\xB1\xB9\xB0\x4A\x16\xCA\xB1\xA8\x10\xD5\x00\xA6\xB1\x61\x03\xC0\xB0\xF7\x37\xD9\xB1\xB3\x19\xD9\x00\x92\xB1\xC5\xB0\xC2\x09\x32\x00\xE6\xB1\x0B\xA7\x92\xB1\xD2\xB0\xF3\x05", "\x35\x00\xDF\xB1\x90\x6A\xCC\xB1\xA7\xB1\xAD\xAF\x9C\x6A\x39\x00\xF3\xB1\xD8\x1A\xE4\x00\xF5\xB1\x61\x03\xE2\xB0\xED\x25\x3D\x00\xFA\xB1\x19\x18\xE9\x00\xFD\xB1\xB9\xAF\x7A\x1C\x41\x00\x02\xB2\xA3\x6E\x05\xB2\xC0\xAF\x0B\x74\x09\xB2\x2E\x22\xF3\x00\xE2\xB1\xCE\xAE\xDD\x6B\x0E\xB2\xB3\x19\xF7\x00\x11\xB2\xD4\xAE\xEF\x65\x4D\x00\xD2\xB1\x50\x00\xBD\xB1\x8A\x5C\x92\xB1\x02\xB1\x2E\x41\xD2\xB1\x55\x00\x1D\xB2\xCC\xAF\x92\xB1\x0A\xB1\xC2\x09\x57\x00\xD2\xB1\x5A\x00\x24\xB2\xAA\x1D\x3F\x3B\xCC\x01\xF6\xB1\xDF\x8E\x12\x69\xD2\xB1\x5F\x00\x2C\xB2\x94\x01\x2E\xB2\xEB\x24\x61\x03\x1A\xB1\xC2\x09\x61\x00\xD2\xB1\x64\x00\x35\xB2\xC1\x61\x37\xB2\xA9\x25\xFE\xB1\x81\x8D\x09\xB2\x6A\x00\x3F\xB2\x41\x2C\x39\xA3\x62\x5D\xBB\x5C\x9C\x6A\x6C\x00\xED\xB1\x71\x92\x4A\xB2\x66\x01\x41\xB1\x44\x6A\x6F\x00\x6C\x1E\xF7\x18\x75\x00\x6C\x1E\x5D\x62\x61\x03\x38\xB1\x9C\x6A\x76\x00\x55\xB2\x04\x55\x58\xB2\x64\x06\x50\xB2\x1A\x2B\x52\xB2\x8E\x73\x7D\x00\x5E\xB2\x36\x5F\x60\xB2\x93\x62\x61\x03\xCD\xAF\x91\xA9\x45\x8A\xEF\x62\x60\x82\xE2\x9E", "\xCC\x94\xF5\x64\x64\xB2\x26\x6E\x14\x8D\xB3\x19\x07\x00\x61\x03\x2B\xB1\x9F\xB0\x69\xB2\xF2\xA5\x78\xB2\x4B\x01\x74\xB2\x38\x9F\x09\xB2\x89\x00\x7C\xB2\x4A\x79\x5A\xB2\x80\xB2\xED\x25\x8A\x00\x09\xB2\x8E\x00\x84\xB2\xD8\x1A\x7E\xB2\xCA\x26\x87\xB2\x7A\x1C\x8F\x00\x09\xB2\x93\x00\x8C\xB2\x21\x63\x22\xB0\xA6\x9D\x14\xB2\xA1\x22\x0E\x00\x41\xB2\x30\x2B\x61\x03\x2A\xB0\xA3\xA7\x99\xB2\xB8\x22\x11\x00\x9C\xB2\x5E\x2B\x58\xB1\x70\x65\x9C\x00\x6C\x1E\x74\x88\x14\x00\x39\xA3\x08\x00\x61\x03\x0A\xAA\xA1\x00\xA9\xB2\xA5\x5F\xAC\xB2\x66\xB1\x23\x7C\xB1\xB2\x1B\x0A\x1C\x00\xB3\xB2\x6D\xB1\x44\x6A\xAB\x00\xB6\xB2\xAD\x5F\xB9\xB2\x73\xB1\x0B\x8D\xA1\xB2\x82\x27\x24\x00\xA4\xB2\x8E\x2B\x61\x03\x55\xB0\xDA\x0B\xB4\x00\xBD\xB2\x80\x19\x27\x00\xBF\xB2\x80\xB1\x7C\x69\xB9\x00\xCB\xB2\xD8\x1A\x2B\x00\xCE\xB2\x86\xB1\x7C\x69\xBE\x00\xD2\xB2\x6C\x87\xD5\xB2\x8D\xB1\xCC\x67\xC3\x00\xD9\xB2\xED\x1A\x33\x00\xDB\xB2\x93\xB1\xEF\x65\xC8\x00\xDF\xB2\x2E\x22\x4F\xA3\x39\x67\xAD\xB2\x56\xAE\xF7\x78\xE6\xB2\xB3\x19\x3B\x00\xE2\xB2\xA0\xB1", "\x67\x04\xD2\x00\x67\xB2\x33\x92\x3F\x3B\x5E\x03\xEA\xB2\xEF\xA7\x40\x62\xD8\x00\xED\xB2\xA1\x22\x44\x00\xE2\xB2\xAF\xB1\x59\xAF\xFC\xB2\xB8\x22\x72\xA3\xE9\xB2\x61\x03\xB4\xB1\x7A\x1C\xE2\x00\xC2\xB2\x71\x26\x74\xA3\x12\x64\xF8\xB2\x58\x5B\x91\x67\xE6\x00\x0A\xB3\x62\x28\x4F\x00\xC5\xB2\xE5\x26\xC7\xB1\xBB\x80\xEA\x00\xF4\xB2\xAE\x66\x3F\x3B\xF7\x18\x0E\xB3\xAB\x73\xD4\xA5\x1A\xB3\xD8\x1A\x58\x00\x1C\xB3\x4E\x2B\xCE\xB1\x37\x71\x02\xB3\x82\x27\x5E\x00\xE2\xB2\xD6\xB1\x51\xA7\x28\xB3\x71\x26\x62\x00\xE2\xB2\xDD\xB1\x2C\x85\x7C\x7D\x66\x00\xF6\xB2\x25\xB3\x9A\xAF\xCC\x67\x06\x00\x39\x40\x74\x88\xA3\xA3\x05\xB3\x82\xA2\x15\xA3\x3B\xB3\xCE\x91\xE2\xB2\xF0\xB1\x67\x04\x10\x00\x39\x40\x7C\x7D\x73\x00\x24\xB3\x7D\x2B\x61\x03\x44\xB3\xBC\x02\x16\x00\x47\xB3\x0E\x87\x4A\xB3\x9D\xB2\x06\xB2\xD1\x0D\x1C\x00\x50\xB3\x1B\x0A\xBE\xA3\x34\x64\x1E\xB3\x07\x9A\x68\x9C\x57\xB3\xA8\x10\xCA\xA3\x5A\xB3\x61\x03\xEA\xB0\xBC\x02\x28\x00\x5E\xB3\x80\x19\x8B\x00\x36\xB3\x4B\xB3\x12\xB2\x4C\x66\x2E\x00\x66\xB3\xCF\x76\x69\xB3\x53\xB3", "\x18\xB2\x67\x90\x41\xB3\x92\x38\x39\x40\xC2\x01\x95\x00\xE2\xB2\x20\xB2\x87\x09\x74\xB3\xAC\x5D\x76\xB3\x23\x53\xE2\xB2\x27\xB2\xF3\x05\x42\x00\x7C\xB3\x59\x3B\x7E\xB3\x0B\x8A\xE2\xB2\x12\xB1\x7A\x1C\x49\x00\x84\xB3\x92\x3F\x86\xB3\x20\x56\xE2\xB2\x3A\xB2\x72\x7D\x8C\xB3\xBE\x41\x8E\xB3\xA6\x56\xE2\xB2\x22\xB1\x7A\x1C\x57\x00\x6E\xB3\x55\x0C\x95\xB3\xC3\x6C\x70\xB3\x7F\x2B\x97\xB2\x16\xA7\x39\x40\x15\x69\xAE\x00\x15\xB3\x41\x2C\x9E\xB2\x88\x65\xA3\xB3\xF1\x6C\xA6\xB3\x45\x64\x11\x89\x86\x63\x65\x00\x39\x40\x55\xA0\xB4\x00\x39\xA3\xAD\xB3\x18\x76\xF9\x99\xB1\xB3\xEE\x7B\xB4\xB3\xB4\xB2\xF3\x6B\xB8\xB3\x1B\x0A\xBC\x00\xBA\xB3\xBA\xB2\x25\xAA\xBD\xB3\xF4\x9C\xC0\xB3\xC0\xB2\x69\x64\x75\x00\xAA\xB3\x1B\x0A\xC4\x00\xAC\xB3\xC7\xB2\x70\x65\x78\x00\xC3\xB3\x80\x19\xC7\x00\xC5\xB3\xCF\xB2\xA1\xAC\xD0\xB3\xD8\x1A\x17\xA4\x39\x67\xB5\xB3\xC8\x6E\x8D\x72\xD6\xB3\xEF\x6F\xD3\xB3\xC6\xA5\x0B\x89\xDD\xB3\xED\x1A\xD3\x00\xDF\xB3\xCC\xA5\x91\x67\x88\x00\xE2\xB3\x2E\x22\xD7\x00\xE5\xB3\xD3\xA5\xA7\x72\xE9\xB3\xB3\x19\xDB\x00", "\xEC\xB3\xF1\xB2\xBC\x02\x90\x00\x93\xB3\xED\x1A\x2E\xA4\x2C\x63\xDA\xB3\xA8\xB1\xEF\x65\x95\x00\xEF\xB3\xA1\x22\x34\xA4\xD9\xB3\x61\x03\x00\xB3\xF3\x05\x99\x00\xFE\xB3\xB8\x22\xE8\x00\xEC\xB3\x07\xB3\xD1\x0D\x9D\x00\xC9\xB3\x36\x6F\xCC\xB3\x75\xAE\x1C\x86\x0D\xB4\x80\x19\x43\xA4\x12\x64\xFA\xB3\x66\x81\x9C\x6A\xA3\x00\xF6\xB3\x47\x83\x52\xB3\xA0\xB3\x9E\xB0\x90\x97\x1A\xB4\xB3\x19\x4A\xA4\x44\x64\x26\xB3\x8D\x87\x06\xB4\x82\x27\x52\xA4\x01\xB4\x04\xA5\xCC\x67\xB1\x00\x26\xB4\xF6\x62\x62\xA4\x50\x2B\x61\x03\x32\xB3\xB9\xA0\x20\xB4\xA1\x22\x06\x00\xD9\x0E\x5E\x03\x16\xB4\xB7\x8D\x9C\x6A\xBA\x00\x2D\xB4\x38\x64\x2F\xB4\x60\x2B\x61\x03\xEA\xB1\xF3\x05\xBE\x00\x3D\xB4\x01\x62\x0F\x00\x3F\xB4\x1D\xB4\x90\xA2\x1C\x68\xEF\x62\x04\x00\x76\xAC\x00\x00\xC2\x50\x00\x02\x83\x85\x03\x82\x83\x7F\x08\x89\x88\x86\x86\x83\x08\x24\x86\x00\x06\x10\x80\x0A\x01\x00\x88\x29\x02\x10\x8A\x8A\x83\x8D\x8C\x01\x63\x01\x8C\x85\x9A\x8B\x8B\x87\x89\x0C\x0F\x8C\x92\x90\x85\x88\x88\x29\x8C\x0C\xA5\xA6\x9E\x8C\x84\x65\x90\x83\x23\xB1\xB2\x9D", "\x8F\x09\x96\x83\x95\x0C\xAD\x8C\x8F\x94\x95\x90\x9A\x88\xD1\x37\x84\x93\x82\x9F\x7D\x8F\x12\x3E\x83\x80\xA6\x82\xA6\x81\x20\xA6\x3B\xC7\x86\x96\x6A\xA2\x81\x9D\x83\x59\x90\xAB\x11\xAE\xAB\x89\xAB\x81\x40\x58\x86\xBA\xA3\x83\x6D\xAE\x00\x5F\x83\x8D\xBD\x80\x1C\xB0\xB8\xB3\x16\x8C\x9F\x4A\xBB\x8C\xB7\x80\x70\x6F\x84\x13\x84\x7F\xB0\x98\x87\x1A\x76\x82\xEC\x99\xB6\x80\x50\xBE\x8E\x7E\x80\x26\x61\xC3\x8A\x75\xC3\x89\x39\x09\xF8\xB0\x8D\x4F\xC5\x85\xC8\x00\x6C\x54\xD0\x80\x7F\xC8\x89\x1E\x9A\x8B\xD0\x9E\x4E\xCB\x98\xB6\x79\xA3\x8C\xB6\x66\xDC\x81\x21\xD5\xA0\x8C\x83\xA1\x4D\xDE\xA1\xC8\x7D\xD8\x06\xFC\x74\xC6\x85\x27\xD8\xAB\xDC\x02\xEF\x80\x13\xB1\xCE\x7F\xB7\xB8\x02\x83\x11\x30\x86\xC6\x81\x24\xBB\xD0\x80\x0B\x08\xE0\x01\x04\xEE\xE6\x7E\x85\x13\xEC\x83\x04\xDD\x8E\xF0\x0C\xDB\xD0\x92\x0F\xE9\xB0\xB6\x04\xE3\xBF\x93\x8E\x01\xFB\x80\xEF\xE5\xEE\x86\xAA\xEC\x83\x0D\xF7\xB4\xBF\x0F\x35\x72\x43\x54\x03\x55\x02\x80\x00\xF7\x68\x7A\x7C\x77\x14\x3E\x7D\x5D\x64\x16\x07\x84\x82\x40\x1C\x07\x89\x81\x7E\x03\x7B\x76\x41\x05", "\x0E\x90\x6E\x5D\x07\x12\x93\x43\x0A\x85\xE6\x53\x4C\x00\x77\xE9\x25\x8E\x5C\x09\x07\xA5\x75\x53\x83\x10\x4E\x16\x5E\x8B\x0C\x67\x80\x47\x3A\x2A\xAC\x57\x09\x8B\x39\x86\x41\x17\x8C\x26\x9C\x70\x19\x8F\x47\x6A\x07\x82\x62\x3A\x7F\x7C\x40\x15\xC6\x43\x46\x8C\x43\x62\x04\x94\x4E\x0B\x47\x92\x90\x00\x16\x4D\x82\x4F\x92\x41\x96\x16\x9D\x46\x0C\x55\xAF\x8E\x84\x43\x5C\x19\x90\x03\x96\x03\x66\x3E\x97\x44\x36\x21\x99\x90\x8C\x0C\x60\x16\x98\x9A\x02\x73\x3B\x98\x44\x3A\x3C\x82\x9B\x67\x13\x64\x10\x90\x44\x74\x80\x05\x23\x9D\x0C\x7D\x0E\x98\x58\x4A\x86\x47\x1B\x9C\xDC\x4C\x24\xA2\x55\x87\xB2\x58\x86\x40\x6B\x0C\xA0\x45\x23\x8F\x83\x45\x11\xA4\x02\x4A\x83\x43\x1B\x96\x8C\x41\x1D\xA6\x02\x49\x1C\xA4\x7E\x89\x83\x43\x1D\xA8\x06\x72\x14\xA8\x00\x4D\x27\xAE\xA6\x40\x77\x2C\xA3\x42\x21\xAF\x91\x12\xAF\xA4\x00\x3B\x16\xAE\x40\x4A\x2F\xA5\x17\x81\xD9\x73\xA0\x03\x1F\xD8\x41\x90\x46\x1E\xAF\x9A\x1B\xAD\xAA\x02\x44\x2F\xAD\xAF\xAF\x9E\x1F\xB0\x9C\x06\x48\x23\xB7\x3B\xAF\xA2\x1A\x9F\x9B\x63\x86\x4C\x23\x9F\x35\x9C\x70\x3F\xAB\x65", "\x1F\xB8\xA0\xB6\x03\x4F\x24\xBA\x41\x81\x8E\x15\x75\xA7\xBC\x9D\x48\x18\xB1\x56\x92\x26\x5F\x84\x67\x9C\x72\xBF\x9E\xAE\x5A\x5D\x18\xBE\x00\xFD\x60\x44\x26\xFB\x8A\xBC\x41\x25\xAF\xB2\x17\xB5\xB8\x03\x5E\x23\xB5\x24\xAF\xB6\x1F\xC0\x9F\x10\x62\x23\xB5\x12\xAF\xBA\x14\xC0\xB8\x18\xCC\x46\x29\xB2\x80\x9C\x7A\x1B\xAB\x7F\x17\xC1\xC3\x40\xAB\x13\xB0\x1F\xAB\x83\x2A\xC6\xC0\x43\xAF\x13\xB8\x45\xC1\xA0\x47\x2F\xC7\xBA\x10\xC2\x43\x2D\xC2\x25\xD7\x43\xBC\xAA\xEC\xB4\x4C\x23\xCE\x92\x90\xB0\x01\x2E\x40\xE5\xBE\x4B\xD0\xC6\x9D\x41\x24\xD2\xF4\x8A\xDF\x2D\xD3\xF0\x9C\x74\x50\xC8\x2B\xF4\x46\x24\xD5\x44\xFD\xC0\x01\x31\x58\xCE\x9C\x77\x55\x38\xD1\x6B\x24\xD8\xC6\x8B\x34\xCA\xD3\x0C\x69\x59\xDA\x5F\xA0\x2C\xDC\xAC\x34\x6F\xD9\xD0\x47\x5E\x73\xEC\x55\x2B\xA9\xA9\x07\x83\xD0\x00\xD5\x13\xBE\x61\xDF\x5A\x6B\x27\xAB\x2B\x82\xD3\x49\x37\xB4\x9D\x48\xE7\x51\x2C\xA7\xB5\x2D\xE0\x44\xDD\x13\xBC\x6A\xE4\x34\x77\x27\xAB\x2E\x97\xCC\x41\x3B\xB4\xBB\x5C\xEE\x45\x2F\xA7\x81\x31\xEA\x41\xE5\x13\xBA\x71\xD4\x13\x43\x30\xD8\x32\xAB\xC3", "\x49\x39\xDE\x03\x4D\x0C\x76\x77\xA6\xDD\x4A\x32\xBA\x49\xC5\xD1\xD9\xC8\x06\x7A\xEB\x79\x87\xC4\xC7\x5D\x31\x88\x10\x53\x34\x8A\xE9\xC6\xFC\x78\xF1\xD7\x1E\x54\x3C\xF0\x43\xDA\x0F\xFC\xD7\xCC\xC5\xCC\x83\xF4\xF7\x47\x5B\x37\xF6\x41\xE1\x1A\xFC\xCD\xF2\x02\x51\xFB\x87\xF7\xA0\x62\x33\xFB\x40\xE8\x26\xF1\xF2\xD8\x0E\x28\x8F\xA9\x3A\xC0\xD5\xD2\xF2\x3B\xEF\x83\x45\xFF\x8D\xAF\x4C\x1D\xFE\x43\x74\x7B\x78\x3D\x7A\x20\xFF\x71\x4F\xAB\x6F\x12\x67\x8E\x34\x1E\x4C\x09\x86\x21\x94\x3D\x73\x23\x79\x0D\x83\x22\xF8\x10\x80\x77\x5D\x44\x82\x88\x37\x1F\x82\x10\x3C\x1E\x06\x90\x2A\x4D\x0E\x8C\x23\x1F\x20\x90\x20\xC7\x0C\x28\x48\x83\x11\x83\x20\x76\x46\x87\x41\x03\x86\x58\x02\x2B\x86\x20\x34\x4E\x84\x77\x03\x52\x87\x81\x02\x02\x0A\x10\x2D\x87\xFC\x68\x70\x01\x03\x37\x83\x20\x42\x88\x81\xA3\x2F\x56\x00\x20\xAC\x86\x4A\x0B\x07\x8A\x40\x49\x80\x01\x17\x82\x20\x53\x3D\x82\x22\x02\x4E\x86\x20\x2A\x86\x5F\x01\x52\x80\x00\x15\xD6\x80\x01\x51\x59\x8D\x8A\x5C\x88\x8A\x95\x13\x01\x8D\x31\x9C\x3E\x55\x67\x92\x01\x1A\xD3\x86\x4B\x0B\x2D", "\x8B\x3E\xDC\x38\x57\x19\x96\x03\x8E\x31\x96\x4B\x03\x77\x90\x20\x19\xC1\x57\x8C\x0D\x3D\x8D\x58\xBC\x5F\x01\x18\xD9\x34\x8C\x66\x67\x8F\x03\x7D\x9E\x88\xAF\x24\x01\x90\x86\x24\x8B\x0F\xAF\x43\x05\x24\xD6\x48\x05\x4A\xBA\x80\x22\xDC\x47\x8F\x09\x7D\x89\x87\x21\x94\x7C\x05\x61\x85\x96\x12\xA4\x3F\x54\x15\x24\x96\x4A\x2F\x09\x94\x1E\xB1\x40\x6B\x7A\x53\x25\x05\x87\x96\x4A\x0C\x61\x8C\x5E\x32\xBF\x5B\x7B\xA0\x32\x05\x2E\xA6\x78\x06\x5E\xB3\x93\x61\xAF\x57\x07\x26\xA6\x7E\x06\x4F\xBE\x7C\x3B\x14\x67\x8F\x0E\x4B\x90\x99\x89\x02\x0E\x99\xAB\x8C\x21\x18\x84\x80\x7C\x9A\x3F\x03\x98\xD5\x90\x22\x11\x0B\x97\x98\x83\x27\x67\x8C\x44\x14\x9B\xF9\x54\x7B\x08\x6C\x95\x8C\x3B\x2F\x67\x8C\x12\x6A\x96\x95\x6E\x80\x07\x09\xEE\x84\x8F\xCD\x61\x9C\x2C\x26\x20\x9B\x9D\xF6\x93\x0A\x31\x82\x9C\x3B\x7D\x80\xA0\x34\x51\x1F\x9D\x3D\x9D\x29\x0B\x81\x96\x92\x6B\xB5\x8A\x69\x47\x56\x0A\xA0\xFD\x62\x6F\x0B\x0E\xBF\x93\x50\x11\xA2\x79\x8E\x1B\x0D\xA2\xDC\x9D\x21\x19\x19\xAF\x98\x88\x28\x6C\x9F\x5A\x20\x0C\x48\xC6\x5B\x0C\x72\x84\xA0\x22\x72", "\x68\xA7\x51\x65\x0B\xA4\x5E\x70\x0E\xA5\x0F\xBB\x6F\xAB\x6A\x04\x9E\x81\x2E\x0D\x8F\x83\x75\x0D\x3E\xDC\x37\x70\x99\xB4\x20\x0E\x3D\xA0\x00\x1D\x40\xA3\x23\x3C\x03\xAC\x33\x15\x69\xAA\x1E\x4C\xA0\x23\x3E\x0F\xAC\x21\x9B\x66\xAA\x47\x7C\x09\xA8\x40\x14\xAC\x21\x81\x17\xAA\x41\x25\x7A\xAB\x8E\x02\x11\xA9\x86\x1F\xAA\x41\x05\x12\xAD\x81\x2F\x76\x96\x10\x28\x10\x48\x8D\x1A\xAD\x81\x09\x10\xA7\x06\x2F\x03\xEE\x6C\x71\x33\x47\x2F\x96\x74\x5F\x9C\x38\x7B\x67\x82\x13\x3E\xBC\x58\x13\x7D\x97\x42\xD2\x7A\xA0\x23\xFE\x27\x89\x13\x86\xB3\x23\x27\x09\xB6\x4A\xC6\x8C\x25\x41\x67\x80\x15\x64\x90\x26\x14\xCA\xA6\x76\xB2\xEB\x67\x8F\x29\x1B\xBC\x21\x56\x1E\xB2\xAB\x10\x16\x7F\x19\xAE\x1F\xAE\xAD\x8E\x12\x96\x10\x29\xB4\x00\xE7\x81\x17\xD6\x87\xA3\x22\x91\x10\xB4\x43\x32\xBA\x81\x33\xB4\x11\xA9\xC6\x54\x12\x3B\xBC\xB2\x83\x57\x78\x10\xB8\xBC\x58\x13\x70\x9B\x8F\x54\x5E\x08\xBA\x69\x9C\x0B\xB8\x09\xAF\x50\x19\xE7\x82\x78\x14\xD2\xAC\x21\x0C\xE5\xA3\x22\x62\x36\xB3\xA1\x13\x24\x16\x6E\x86\x24\xB9\x81\x3C\x84\xBB\x10\x27\x1A\x75", "\xE2\x67\x15\xEC\xA2\x5F\x55\xCB\x0B\xBC\x11\xAB\x1E\xBD\x81\x18\x88\xBD\x0C\x2F\x1A\x7C\xD4\x7F\x15\xFA\x82\x26\x8C\xF8\xA6\x23\x34\x7B\xB6\x9F\x59\x3E\xB8\x00\x70\x81\xC3\x40\x57\x14\xC1\x8E\x37\x17\xC0\x7A\x8A\xC2\x40\x5B\x1D\xC1\x89\x3B\x17\xC0\x84\x92\xC0\x00\x5F\x15\xA6\xAB\x78\xAB\x20\xE5\xA2\x22\x23\x9A\xC4\x1D\x0A\xD0\x24\x18\x07\xD8\x93\x19\xE8\x16\xC4\x86\x08\x1F\xC0\xA1\x9A\xC0\x3B\x5F\xB6\xA2\x22\x8C\x1B\xBC\x20\xC6\x5F\x02\xB4\xC1\xA5\x89\x0F\x18\xC7\x02\x21\xC4\x00\x3F\x97\xB6\xBF\x32\x1D\xC3\xC2\x72\x18\x49\xC1\xCE\x5E\x8E\xA2\x6D\x23\xF7\x08\xCA\xD8\x58\x1B\xC8\x00\x02\xCC\x61\x67\x9C\x1D\x8B\x86\x2E\x1B\x03\xD1\x9A\xC3\x00\x13\x09\x10\xD6\x42\x1D\x03\xDB\x98\x76\x41\x82\xCE\x48\x56\x46\x1D\x0F\xCC\xC8\x22\xE7\x9A\xC1\x02\x6A\xCD\x8A\x2B\x6B\x1F\xC0\xF1\x9A\xC1\x03\x74\xCA\x8C\xD3\x6F\x1F\xC0\x06\xA0\xBE\x5F\x11\x0C\xCF\xB2\x26\x73\x1E\x55\xC2\xC9\xA0\xB5\xC4\x7B\x8E\x16\x05\xD0\x77\x26\x75\x3E\x09\xD0\xA3\x33\x9B\x00\xD2\x88\x8A\x6B\x3F\x14\xDF\x69\x33\xA0\x00\xD3\x56\x45\x01\x86\xD2\x23\x22", "\x21\xE7\xA5\xC8\x6C\x25\x04\xA8\xA6\x7B\x01\x51\xC6\xD3\xB7\xDC\x31\xA4\xAA\xDA\x2A\x05\x55\xE8\xB6\xD5\x91\xD0\xD6\x4E\xE7\x8F\x04\x48\xD4\x8B\x06\x90\xC3\x71\x05\x38\xD4\x8A\x21\xC5\xAB\xD6\x47\x35\x06\xAF\x98\x31\xD9\x93\x04\xDD\xD4\xDC\x31\x72\x86\xBB\x0B\xD8\x88\x3F\x05\xD9\x10\x3D\x03\xB3\xB1\xBC\x3B\xAC\x88\xDC\x26\x41\x15\xD8\x43\x45\x08\xDA\x86\x21\x03\xDB\xBA\xCC\x20\x59\xDF\xDE\x23\x23\x22\xDE\x20\x4B\x05\xDE\x41\x25\x08\xDC\xF2\x9A\x6F\x55\x4D\x16\xD6\x41\x52\x02\xDF\x81\x29\x00\xD7\xD9\x31\x03\x5E\xE7\x84\x0A\x48\xEA\x95\xC7\xA6\x62\xE3\xF1\x67\x87\x0A\x48\xFC\x5D\x0B\x90\xCA\xB2\xF0\x0A\xE2\x7B\x33\x9E\x0E\xE1\x7D\x51\xE2\x95\x14\xE6\x20\xCC\x9A\xC5\x0C\x18\xF0\x23\x1A\x1A\xE9\xE0\xEE\x1C\x47\x8C\x6C\x01\xE4\x43\x72\x04\xE4\xAD\x83\xB0\x37\x67\x86\x5A\xCC\xBC\x5E\xB0\xB8\x6C\xDF\x3C\xBC\x53\xE6\xD2\x1E\xEA\xA3\x9B\xD6\x4A\xE7\xC2\x67\xE5\xBA\xBE\xE0\xB1\x9C\xFC\x56\x02\x03\xFA\xC3\x1C\x2D\xEC\xDC\x63\x48\xEB\xE1\x1A\xD4\x0F\xBB\x83\x28\x0E\xA6\xC2\xD4\x21\x4F\xF5\xE2\x86\xF9\x03\xEA\x81\x3D\x0E", "\xEA\x8C\xD6\x9D\xD6\x9D\xEC\xAE\xBF\x3E\x0D\xEB\x00\x02\x10\xD8\x88\xE8\xEA\x93\xE5\xEC\x2D\x83\x08\xEF\x21\x6B\xE6\x59\x0B\x2A\xB2\xC3\x88\x1A\xDF\xD5\x86\x2E\x05\x7A\xC3\x26\xEE\xB3\xBA\xC1\x23\x7A\xE1\xED\x2F\x7E\xEA\x20\x80\xFD\xB6\x86\x92\x1A\xE4\x76\xF6\x00\xE0\x13\x29\xF1\x71\xE7\x88\x13\xC6\xFB\xEB\x20\x3B\x10\xF0\x44\x12\xF3\x20\x0E\x9A\xC6\x13\x96\xE5\xF3\x44\x40\x0A\xF2\x86\x1C\xF2\x20\x25\x9A\xC0\x29\x21\xFC\xEC\xE2\x25\xF6\x20\xA7\xE0\x03\x76\xC4\xEC\x20\x55\x04\xF5\xF5\x03\x2A\x0B\xE1\x80\x01\xF7\xF3\xB4\xF6\x20\xAF\x0C\xF6\xB1\x4E\x0F\xF5\xBF\xCB\x8F\x8C\xB5\x02\xF8\xAF\x53\x05\xF8\xC4\xDC\x3F\xBE\xBF\xE3\x23\x2E\x4A\xFA\x68\x2C\x0D\xFC\xF7\xDC\x20\xC1\xF4\x82\x21\x18\xEA\xC2\x7D\x0B\xD7\xF1\xF5\x82\xDB\xFF\x22\xEF\xE2\x6A\x0C\xE1\xF9\x8F\xAB\x4D\x16\xFC\x22\xA7\x09\xFD\x10\x38\xD4\xEE\xB4\x23\x1A\x48\xC7\x06\x4A\x6C\x18\xD4\xBF\x31\xF3\xC4\xF2\xDA\x1D\xFD\xD4\x32\x07\xF0\x7C\x10\x2A\x6A\x61\xE0\x00\x80\xF6\x47\x07\x03\x86\x10\x31\x64\x7E\xE6\x07\x7B\xC6\x2C\x07\xBB\x71\x7B\xE7\x27\x46\xEB\x00", "\x81\xBC\x20\x08\x13\x8D\x64\x67\x40\x0F\xF6\x76\x25\x84\x08\x6B\xF7\x7B\x79\x1C\x8A\x61\xF7\x0F\x81\xA6\x3B\x08\x22\x81\x79\xDC\x18\x65\x1A\x6E\x0F\x08\x8D\x11\x92\x0B\x80\x03\x1F\x65\xE4\x74\x00\x54\x00\x11\xFC\x26\x2C\x97\x04\x83\xA5\x2F\x2A\x0A\x09\x83\x0C\x13\x82\x5A\x5C\x09\xFA\x7C\x82\x70\x6F\x2A\x11\x02\x84\xF2\x16\x3A\xA2\x0E\x83\x00\x09\x67\xE4\x77\x01\x4C\x84\x6A\xA6\x37\x0A\x50\x8B\x68\xF3\x7E\x11\x1D\x05\x85\x02\x14\x84\xEC\x6C\x0A\x2B\x84\x82\x42\x37\x46\x24\x0E\x85\x45\x46\x25\xB3\x03\x86\xA6\x75\x69\x1A\x6B\x02\x68\x80\x86\x97\x72\x10\xBA\x0C\x86\xB0\x7E\x86\xE4\x72\x03\x71\x86\x25\xC1\x06\x87\xC6\x76\x52\xAF\x29\x03\x7B\x86\x3A\xC8\x07\x84\x64\x81\x37\xAF\x20\x04\x83\x8A\x55\xCE\x06\x88\x6D\x8B\x6B\x1A\x67\x04\x68\x8C\x2F\x4D\x08\x86\x83\x34\x0D\x50\x87\x6C\x73\x8E\x11\x4F\x03\x89\x13\x15\x05\x96\x8E\x38\x50\x82\x6D\xE4\x77\x05\x9E\x80\x11\x5D\x01\x8A\x10\x1E\x0D\x50\x8E\x6D\x9B\x8D\x11\x5F\x07\x8A\x0C\x15\x06\xAA\x8C\x10\xE3\x00\x85\xEB\x6F\x8A\x13\x17\x06\xB2\x86\x10\x6D\x05\x8B\x06\x18\x0E", "\x50\x8F\x56\x12\x53\x11\x6F\x0B\x88\x06\x16\x07\xC0\x83\x10\xED\x0E\x88\x06\x19\x01\x77\x74\x7E\x78\x08\x86\x92\x4A\x34\xF3\x0B\x7B\xD0\x81\x78\xE4\x7C\x07\xD4\x86\x25\xF7\x08\x8D\x42\x2F\x2A\x80\x08\x86\x99\x62\x3C\xFB\x07\x7D\xD9\x80\x25\xAF\x25\x08\xE4\x8E\x25\x4B\x00\x11\xD9\x19\x8E\x5C\x2F\x2A\x8A\x0D\x8E\xA6\x35\x00\xEF\x8B\x66\x10\x12\x8F\x69\x2F\x2A\x8F\x06\x8F\x5A\x5A\x00\xF9\x88\x13\x27\x1C\x1D\xB3\x7A\x8B\x10\x14\x09\xDD\x8F\x59\x03\x9D\x67\x0C\x1C\x8F\x02\x1E\x7B\x08\x9C\x10\x98\x00\x90\xEC\x63\x01\x0D\x9F\x6A\xCF\x87\x7C\x1A\x6D\x09\x16\x9B\x89\x18\x09\x91\xB9\x6B\x91\x97\x2F\x2A\xA2\x0F\x91\xA2\x79\x6D\x22\x91\x8F\xD9\x7F\x2A\xA7\x08\x92\x5B\x82\x02\x2B\x95\x90\x10\x13\x7E\x13\x96\x10\xAC\x00\x93\xC6\x27\x02\x33\x9B\x8F\xEA\x74\x5B\x3A\x9C\x2B\x2C\x0D\x93\x0F\x9C\x1D\xF2\x78\x66\x0C\x16\x0B\xBD\x8B\x89\x31\x02\x92\xFC\x20\x91\x00\x0D\x7F\x37\x93\x10\xBC\x01\x94\x4A\x37\x03\x44\x94\x92\x04\x8F\x2A\xC1\x06\x95\xC2\x3C\x03\x59\x93\x10\x50\x9D\x80\x53\x92\x10\xC6\x0B\x90\x5A\x51\x04\x22\x94\x45\x50", "\x95\x81\x1A\x6A\x0C\x68\x9C\x6E\x45\x0B\x96\x34\x9C\x10\x44\x65\x96\x00\x0E\x0C\x4B\x99\x92\xDA\x42\x92\x72\x82\x10\x50\x97\x97\x7C\x9A\x15\xD4\x0B\x97\x5B\x80\x05\x7E\x95\x97\x06\x1E\x82\xFE\x7E\x95\x62\x37\x05\x61\x90\x98\xD0\x4F\x2A\xDF\x0E\x98\x44\x4C\x05\x91\x90\x00\x50\x97\x66\x70\x5C\x10\xE4\x06\x98\xC6\x21\x06\x4E\x9A\x98\x03\x11\x67\xE4\x7A\x0E\x96\x94\x3D\x67\x09\x99\x50\x92\x85\x78\x9F\x0E\xA9\x96\x4F\x6C\x0C\x9A\x05\x5E\x64\x44\x4E\x40\xA0\x9C\x2B\x71\x09\x98\x3E\x95\x86\x1A\x6A\x0F\xB9\x9A\x34\x78\x0C\x9B\x45\x9D\x69\x60\x65\x05\x3A\x86\x25\x7F\x04\x9C\x5A\x96\x10\x5B\x34\x7E\x06\x08\x9C\x2A\x16\x25\x86\x0C\x9C\x62\x97\x36\xAF\x2C\x00\xD2\x9D\x84\x5A\x5D\x08\xA3\x9D\x9B\x88\x81\x47\xDB\x96\x85\x5A\x53\x09\xDF\x95\x9C\x7A\x1F\x2A\x18\x03\x9E\x1A\x93\x10\x1D\x0C\x9E\x00\x03\x38\x99\x04\x9B\x10\x1A\x89\x83\x97\x14\x1F\x00\x9F\xD9\x14\x02\xF0\x93\x38\x9E\x04\x9F\x0C\x14\x8A\x78\x96\x02\xFA\x93\x11\x2B\x0D\x9F\x13\x13\x0A\x00\xA6\x10\xAE\x87\x9F\x34\x1D\x02\x05\xA0\x11\x32\x08\xA0\x10\x18\x0A\x0B\xAA", "\x1B\xAF\x24\x03\x11\xAC\x10\x39\x04\xA1\xA5\x57\xA1\xC9\x1F\x2A\x3B\x00\x9F\xFC\x21\x04\x1E\xA6\x10\xB2\x07\x9E\x06\x1A\x01\xDC\x18\x01\x6F\x7A\x15\x43\x00\x9F\x07\x70\x74\x62\x3C\xA2\xD9\x6F\xA2\x47\x16\x04\x24\xA3\x11\x4C\x00\x9F\x12\x75\xA3\xDC\x1E\x01\x38\xA4\x13\x4D\x0B\xA3\x10\x13\x05\x3E\xAF\x47\xD1\x88\x97\x54\x00\x9F\xD5\x82\x3C\xB8\x04\x97\x10\x1B\x01\xDC\x18\x23\x67\x48\x05\x4E\xA6\x25\xBC\x02\xA5\x0C\x14\xA5\x10\x13\x24\x67\x4C\x05\x1B\xAC\x6E\xC0\x09\x99\x5E\xAA\x8E\x67\x41\x06\x63\xAB\x89\xC5\x06\xA6\xCC\x57\x46\x66\x0B\xA6\x0E\xA0\x00\xCA\x0E\xA6\xD3\x57\x46\x6B\x02\xA7\x5B\x8F\x0C\x76\xAA\x5D\xAF\x20\x07\x59\xA6\x3A\xD4\x0C\xA5\x06\x17\xA6\x6B\x5F\x2A\x74\x0A\xA7\xC6\x28\x0D\x7D\xAF\x5E\x67\x49\x07\x8A\xAC\x2B\xDD\x0D\xA8\xF6\x5F\x2A\x7E\x01\xA9\x4A\x32\x0E\x94\xAF\x5F\x30\x38\xA9\xC2\x37\x0E\x9B\xA8\x60\xAF\x28\x08\x9E\xA2\x36\xEC\x01\xAA\x11\x64\x7E\x8D\x05\xAA\x44\x41\x0F\xA1\xA7\x94\x9D\x96\x10\x92\x06\xA4\x5A\x56\x0F\x2A\xA3\x10\x86\xA3\x10\x52\x93\xA7\x1D\x18\x09\xAC\xA4\x3D\xFC\x01\xAA", "\x05\x84\x7E\x9D\x0F\xAB\xF6\x41\x00\x4C\x00\x8F\x13\x19\xAB\x02\x14\x96\xBC\xA3\x11\xA2\x01\xA8\x5A\x56\x00\xC9\xAF\x44\x53\xAA\x63\x67\x46\x0A\xD2\xAC\x6E\x0A\x05\xAD\x75\x67\xAD\xB4\x47\x46\xAA\x04\xAB\xEC\x6E\x00\xDE\xA3\x10\x7F\x90\x00\xCC\xA3\x64\xB6\x9D\x68\x13\x10\x0B\xE4\xAB\x89\x15\x07\xAE\x5F\x8B\xAC\x2D\x8F\x2A\xB6\x06\xAC\x1D\x1C\x01\xF4\xA3\x92\xB8\xA3\x99\x67\x4B\x0B\xFA\xA3\x11\x21\x0D\xAF\xD9\x1B\xAE\x9C\x95\x8C\x10\x10\x0C\xF1\xA3\xA7\x26\x0D\xAF\xFC\x2B\xAE\xA6\x98\x97\xC6\x03\xB0\x10\x1C\x02\x06\xB6\xAF\x10\x1E\x9A\xCF\xA0\x11\xCB\x06\xB1\x0C\x11\x03\x19\xB0\xAE\x0C\x1A\x85\x48\x96\x10\xD0\x0D\xB0\x5B\x86\x03\xFD\xA9\xAE\xEB\xA6\xB2\xB1\xA3\x10\xD6\x0A\xB2\xC6\x2D\x03\x2D\xBA\xB1\x1B\x57\x46\xDC\x04\xB3\xBC\x24\x04\x37\xB4\xB2\xCE\x9D\xAE\xF6\x4D\x11\xE2\x0C\xB3\x4A\x3B\x04\x3F\xBD\xA5\xD8\x9B\x62\x46\xB2\x3C\x52\x00\xB1\x38\xB6\x10\xB2\x68\x97\xEE\x0D\xB4\x62\x38\x05\x50\xB0\xB4\x03\x1C\x37\x1A\x64\x0F\x7A\xA9\x0F\x27\xA3\x10\x5E\x03\xB2\x4A\xB5\x9F\xAF\x2B\x0F\x7A\xA0\x00\x56\x04\x1D\x13", "\x13\x06\x64\xB5\xA8\xD1\x6F\x2A\x02\x0B\xB6\xFA\x83\x84\x74\xB6\x10\x83\x38\x06\x6F\xBF\xAF\xAB\x1F\x2A\x09\x07\xB7\x4B\x12\x48\x80\xB2\x10\x83\x3D\x06\x7B\xB2\x10\xEB\xA9\x8B\x1D\xBB\x5B\x83\xBE\xAF\x02\x15\x01\x8D\xB3\x38\x72\x07\xB8\xEA\xA7\x6F\x67\x47\x01\x8D\xBC\x2F\x1D\x01\xB9\x13\x17\x07\x59\xBC\x10\x1C\x0D\xA2\x43\xAE\x11\x1F\x0D\xB8\x33\xA6\x74\x4A\x31\xBA\x37\xA7\x46\x22\x09\xB9\x13\x18\x02\x8D\xBF\xA3\x44\x4A\xBA\x0C\x12\xA4\x67\x49\x02\xAE\xB0\x11\x2F\x01\xBB\x56\x2D\x01\xDC\x10\x95\x27\xBB\x89\x34\xA4\x44\xB6\xB5\xB6\x1A\x63\xBC\xD4\x36\x2C\x1F\x02\xBA\x67\x40\x03\xBC\xB5\x74\x4A\x3B\xBC\xAB\xBA\x61\x31\x0D\xB8\x54\x45\x03\xCF\xBA\x55\xD2\xB5\xBB\xA3\xBD\x11\x36\x06\xBD\x13\x1A\x03\xD9\xBC\x6E\x20\x0B\xA4\x8B\xB6\x10\x3B\x09\xBB\x5A\x5D\x07\x94\xB5\xBE\xDA\x88\x97\x41\x0A\xBE\xEC\x62\x08\xED\xB1\x8E\x67\x47\x04\x8D\xB9\xAE\xC6\x27\x08\x9F\xB6\x10\xEE\xB8\xA6\x1A\x6E\x04\xF9\xB6\x25\x8D\x0D\xBF\x03\x1F\xBF\xF3\x87\x46\x55\x03\xC0\xA6\x33\x09\x06\xC2\x10\x08\xCD\x8F\x61\xAC\xC0\x5A\x59\x09\x0F\xC0", "\x00\x11\xC5\x27\xAF\x23\x06\xF2\xBB\x89\x9F\x05\xBF\x10\x12\x91\xE7\xB3\x10\x69\x04\xC1\xEC\x64\x0A\x17\xC9\xC1\x00\x0E\x28\x67\x40\x07\x26\xCB\x89\xAA\x09\xC2\xCF\x7F\x2A\x77\x0F\xC2\x73\xA0\x0B\x32\xC0\x11\xDA\x78\x97\x7E\x06\xC3\x5B\x86\x0B\x39\xCB\x72\xEB\x8E\xC3\xC6\x2C\x0B\x41\xC6\x10\xA9\xA8\x97\x8C\x04\xC4\xBC\x22\x0C\x47\xC9\x7B\xAF\x23\x09\x8D\xB8\x00\x56\x28\x0C\x49\xBE\xBF\xDC\x1B\xAB\x5B\x8D\x11\x9B\x0C\xC4\x4A\x3F\x0C\x4F\xC2\x10\xC3\xA8\x97\xA2\x0E\xC5\xC2\x35\x0D\x61\xC0\x00\xCE\xAB\xC5\x13\x19\x0A\x1D\xC3\xA7\xDB\x00\xC2\x0C\x1E\x96\xE4\x7F\x0A\x6F\xCB\x85\xE0\x02\xC7\x06\x12\x98\x6C\xC0\x11\xB5\x03\xC5\x56\x25\x0E\xFD\xA4\xC5\x10\x1A\xC2\x7C\xC1\xBC\x02\x1D\x0B\x80\xC6\x3A\xED\x03\xC8\x13\x1A\xC2\x8C\x98\x97\xC5\x06\xC6\x62\x35\x0F\x69\xC6\x83\x78\x9C\x0C\x94\xC4\x44\xFB\x09\xC6\x09\xBD\x51\x13\x13\x0D\x8B\xCA\x55\x01\x0D\x04\x10\x19\xAE\x2A\xC3\xB1\x23\xC3\x61\x9B\xC4\x3D\x08\x06\xCA\xD3\x95\xC8\xF0\x4F\x2A\xE2\x0D\xCA\xF6\x4E\x00\xB0\xCC\x9D\x58\xCE\x9B\xE4\x79\x0E\xA3\xCC\x6E\x14\x09\xCB", "\x03\x14\xC8\x0C\x1A\xC2\x30\xBA\xB0\x0C\x11\x0F\xBF\xCB\x89\x1C\x02\xCC\x02\x14\xCC\xBB\xC9\xB3\x1A\x69\x0F\xCB\xC3\xA7\x24\x0E\xCC\x00\x00\xCD\x07\xC8\x87\x78\x91\x00\x57\x00\x11\xDA\xC3\xA7\x2C\x08\xCD\xE1\xC8\xC1\x4B\xB2\x67\xDF\xCC\x10\xE5\xC6\x2C\x34\x08\xCD\xA8\xC1\x6B\x4A\x89\xCE\x06\x1B\xCE\xBC\x2B\x03\xEE\xCF\xC8\xDC\x1C\xB5\xE4\x79\x01\xF2\xC8\xAE\x8F\xCD\xCF\x84\xB6\x4D\xD8\xCC\x2F\x2A\xC6\x9F\x7D\xCC\x10\x22\x00\xD0\x69\x80\x11\x29\x0A\xD0\x83\x38\x04\x03\xD8\xCF\x50\x57\x46\x2B\x0A\xD0\xE9\xA2\x03\x0E\xD3\x11\x4E\x01\xD1\xB2\xCD\xB7\x67\x44\x03\x16\xD3\x11\x3B\x09\xD1\x10\x14\x05\x1C\xD5\xCC\xDC\x1A\xB8\x07\xD6\x10\x3D\x01\xD2\x10\x14\x04\x24\xDC\x10\x5A\x07\xD2\xD1\xCE\x9C\xAF\x26\x04\x0A\xD5\xCE\x4E\x01\xD3\x06\x10\x06\xF7\xC0\x11\x22\x06\xBE\x2B\xDE\x56\x0A\xD5\x8E\x62\x37\x06\xD8\xC9\x1D\x41\xDF\xBE\xAB\xC0\x00\x55\x05\xD4\xF8\x79\xD4\x13\x1B\xD4\x8A\x74\x7E\x5A\x0A\xD0\x3B\x8A\x9B\x34\xD3\x10\x54\xD3\x79\x1A\x60\x06\x58\xD6\x25\x77\x0B\xD5\x02\x1D\xD5\x9D\x7F\x2A\x66\x01\xD6\xA6\x3D\x07\x64", "\xD0\x00\x66\xD8\x7A\xAF\x2C\x06\x6A\xDA\x55\x83\x0D\xD6\x6F\xD2\x7B\x0D\x30\xD5\xA6\x39\x08\x52\xD0\xD4\x3B\x44\xC3\x73\xDC\x6E\x8E\x06\xD7\x1C\x94\x7E\x7D\x01\xD8\x9B\x84\x09\x84\xD5\x92\x67\x43\x08\x88\xD3\xA7\x9A\x0B\xD8\xA2\x2F\x2A\x89\x0F\xD8\x5B\x80\x0A\x92\xDD\x2A\xFE\x86\xD9\xC6\x26\x0A\x99\xD7\x2B\xAF\x25\x09\x9C\xDC\x2B\xAC\x0F\xD9\xC0\x2F\x2A\x9B\x0E\xD2\x5A\x52\x0B\x3F\xD8\xD0\x59\xC6\x92\xA3\xDA\x34\xB9\x06\xDA\xD4\x27\x46\xA8\x01\xDB\xC2\x3F\x0B\xB4\xDB\xC6\x88\xC0\x00\xAE\x0A\xD7\x5A\x55\x0C\x7D\xDE\xDA\xAC\x47\x46\xB3\x00\xDC\xEC\x6A\x0C\xC3\xD6\x10\x77\xD7\xC8\x31\xB2\x10\xB8\x0A\xDA\xEC\x6F\x0C\xE4\xC3\xD5\x25\x84\x7E\xBF\x02\xDD\x9B\x87\x0D\xD5\xDE\xD7\x10\x11\xC9\x4D\xD6\x0C\xB8\xD2\x36\xDF\x04\xDB\x98\xCD\xD4\xCC\x03\xDE\x44\x45\x0E\xB4\xDF\xC9\x4F\x63\x11\xD2\x0A\xDD\x73\xAB\x0E\xAD\xDC\xDC\x26\x3F\x2A\xD9\x0A\xDE\xD4\x32\x0F\xB4\xDC\xB1\x43\xD2\x10\xDF\x0A\xDF\xF6\x48\x0F\xB4\xD7\xCC\xA0\xC0\x11\xE5\x02\xDF\x5B\x8E\x0F\xDD\xD4\xDC\x25\xB2\xB4\xA0\x1C\x0E\x0A\xE6\x2C\x06\x0E\x04\xE0\xC6", "\xDD\xC6\x94\x7E\xF3\x03\xE1\xBC\x2E\x00\x16\xEA\xCE\x18\xE2\xCD\xE4\x7A\x0F\x1C\xEA\x34\x16\x0F\xE1\xF3\xC1\xE2\x56\x1F\x2A\x01\x08\x05\xA7\xC6\x25\x1E\x08\xE2\xFE\xCE\xDD\xE1\x9A\x61\x08\x0E\xE2\x43\x86\x25\x25\x02\xE3\xF5\xA4\xE3\x06\x1A\xCF\x78\x9F\x00\x38\xEA\xCB\x05\x23\xE4\x3E\x43\x11\x2C\x0C\xE3\x11\x1A\xE2\x03\x16\xD0\xBD\xD7\x01\x46\xE3\x20\x13\x1D\x01\x51\xE1\x9F\x13\x12\x03\x4A\xEC\x2F\x77\xD2\xA0\x4D\xDF\x01\x55\xEC\x2F\x25\x05\xE5\x83\x38\x03\x59\xEC\xE4\x02\x1D\xA0\xFF\xD0\x00\x27\x0F\xE5\xB7\x42\xE6\x13\x1E\x03\x65\xEE\xE3\x18\xAC\x6B\x6C\xE0\x11\x35\x0E\xE6\x2F\xD1\xE7\x0E\xE6\xD3\x67\x47\x03\x55\xE9\xAE\x3E\x08\xE7\x0C\x1A\x04\x4A\xE9\xAE\x23\x0C\x1D\x21\x0D\xBD\xA3\x75\xE5\xA7\xBA\x69\xBC\x27\xE8\x10\x1E\x02\x8A\xE0\x11\x43\x05\xE7\xDA\x45\xE5\xB2\xB4\x3D\x90\xEC\x10\x2F\x03\xE9\x83\xE6\xE9\xCE\x98\xE9\x56\x2B\xE9\x06\x10\x03\x9E\xEE\x23\xA0\xE3\x10\x57\x02\xEA\xA6\x34\xEA\x03\x11\x03\xA7\xE3\x10\x58\x09\xEA\x02\x1E\x05\xAC\xEA\x55\xAE\xE2\x10\x32\x01\xEB\x02\x1F\x05\xB4\xE0\x00\x65\x07\xEB", "\xEC\x69\xEB\x00\x03\x03\xBC\xE0\x00\x66\x0F\xEB\x6C\x02\xEC\x9B\x84\x02\x42\xDD\xDB\x6D\x05\xE5\x46\xD4\x44\x51\x0A\xE4\xFB\x95\xA5\x0D\x32\xED\x56\x26\x05\xD6\xE3\x11\xCE\xEF\xA5\x34\xCF\xEB\xC6\x2B\x05\x7A\xE6\x10\xDF\xE0\xC0\x86\xD2\xEE\xBC\x21\x06\xE5\xE3\x10\xE7\xE9\xC0\x1A\x63\x08\xEA\xEA\x34\x67\x0D\xEE\x02\x1F\xEE\x12\xCA\x61\x89\x03\xEF\xC2\x3D\x06\xF6\xE0\x00\xF8\xEA\xC1\x67\x4F\x08\xDA\xE6\x3A\x73\x0D\xED\x10\x11\xF0\x82\x2F\x2A\x94\x0C\xEF\x62\x38\x07\xFF\xEA\xF0\x2C\xCA\x61\x9A\x0E\xF0\x44\x4E\x07\x11\xF3\xC3\x99\x56\xF1\xD4\x34\x08\x19\xFA\xC3\xAF\x26\x0A\x1C\xF6\x4F\x8A\x0F\xF1\x42\xC7\x46\xAC\x03\xF2\x1D\x10\x09\x26\xF8\xC4\xAF\x22\x0B\x2A\xF3\x11\x96\x0D\xF2\x50\xC7\x46\xB8\x0F\xE7\x56\x2C\x09\x85\xEE\xED\xAF\xD7\x46\xBF\x01\xF3\x10\x13\x0A\x34\xF2\xC6\xAF\x25\x0C\x40\xFC\x10\xA9\x03\xF4\x6A\xC0\x5F\x05\xFA\x55\xAF\x08\xF0\x0C\x1A\xF0\x74\xC8\x97\xD0\x0D\xF4\xEC\x64\x0B\x50\xF6\xEE\xD7\xD8\x97\xD5\x08\xF3\xA6\x39\x0B\x4A\xE5\xCE\x0A\xFE\xDC\xC8\xC6\x10\xDC\x0E\xF5\x5A\x51\x0C\x61\xFC\xF3\xDF", "\xDF\x2A\xE3\x07\xF4\x06\x19\x0C\x4A\xF7\xDE\x69\xE9\x0E\x70\xF3\x10\xCF\x0A\xF4\xEE\xD7\x9B\x13\x1F\x0E\x68\xFC\x6E\xD5\x0B\xF3\x09\xF7\xDF\x67\x46\x0F\x77\xF2\x10\xDC\x0A\xF4\xFE\xDD\xDB\xFC\x07\xF8\x00\x02\x0E\x4A\xF6\xE0\xEF\xD4\x1D\x59\x0F\xE2\xA6\x38\x0E\x6B\xF3\xF8\xBC\xC8\x97\x09\x05\xF9\x39\xE6\x3A\xF0\x09\xF9\x51\xFC\xCD\x4D\xD0\x01\x9E\xF6\x10\xFA\xBC\x2B\xF8\x02\xFA\x5A\xF9\xE1\x78\x97\x01\xA7\xF3\xE3\x65\x5F\x04\x17\xEA\xF9\xB5\x1F\x2A\x1E\x01\xFB\x3D\xEA\x55\x08\x04\xFB\x9F\xF3\xFA\x30\x5F\x2A\x25\x0A\xFB\x0B\xDA\x55\x0F\x0E\xFB\xA8\xFC\xF6\xE9\x97\x46\x2C\x04\xFC\xFC\x22\x03\xC4\xF3\x38\x16\x08\xFC\xE4\x9D\xFA\x0C\x1E\xE4\xCF\xD0\x00\x34\x0E\xFC\xE1\xB1\xFD\x13\x1C\x01\xD4\xF2\xE5\xB6\xF6\x10\x5C\xE9\xE6\x3C\x0C\xFD\x10\x12\x04\xDE\xF0\xD4\xE1\xFB\xE4\xE3\xF1\x31\xAF\x24\x04\xE8\xF3\xE8\xEB\xFC\x10\x28\x0D\xFE\xFC\x2A\xF0\x2A\xDD\xDB\x4C\x03\xFF\xFB\x65\xFF\x7C\x38\xFF\x4A\x7E\x3E\x7A\x61\x54\x00\xF1\x69\x57\x5B\x00\x00\x83\x08\x1A\x0D\xFE\x69\x55\x09\x08\x74\xC7\x75\x0B\x04\x7F\x46\x72\x3C\x46", "\x17\x03\x91\x74\xC7\x70\x0C\x3E\x7F\x81\x06\x06\x44\x7D\xA6\x76\x27\x17\x84\xD3\x47\x77\x33\x0B\x01\x82\x09\x1B\x1E\x80\x3A\x74\x3B\x26\x75\x33\x2E\x06\x25\x82\x52\x28\x81\xA6\x19\x04\x86\x08\x58\x77\x46\x75\x02\x0B\x9B\x03\x30\x82\xAB\x32\x81\x81\x0B\xEB\x67\x20\x1F\x0E\x81\x82\x01\x07\xAC\x37\x1D\x82\x10\x46\x75\x63\x6E\x81\x89\x02\x08\x9B\x44\x13\x0F\xEC\x59\x7E\x22\x04\x7E\xD3\x74\x7A\x3B\x01\xF6\x79\x1D\x4C\x80\x53\x69\x73\x8F\x00\x0A\x96\x12\x20\x04\x05\x93\x0A\x15\x95\x6A\x78\x4C\x12\x2E\x80\x63\x15\x04\x02\x80\x44\x1F\x82\x5E\x6C\xFC\x1A\x05\x31\x8C\x2B\x4B\x02\x19\x8C\x08\x68\x87\xAC\x59\x2C\x36\x8A\x34\x51\x03\x1B\x86\x08\x71\x80\xAE\x59\x56\x3A\x82\x3C\x57\x03\x1D\x83\x08\x79\x80\xAF\x68\x78\x2D\x86\x3A\x5D\x01\x17\x87\x83\x7F\x6C\xB6\x3C\x83\xF3\x3F\x07\x82\x09\x20\x93\x78\xE4\x3F\x16\x0B\x84\x22\x28\x06\x0D\x84\x00\x01\x84\xD0\x38\x2F\x7D\x05\x49\x84\x3D\x6E\x02\x25\x81\x84\x3B\x65\xA9\x43\x06\x4E\x86\x4F\x74\x03\x27\x8F\x23\xAF\x11\x19\x24\x85\x8E\x0A\x07\x27\x84\x44\x09\x62\x4D\x6F\x19\x2B\x85", "\x89\x00\x08\x2E\x87\xA0\x6F\x15\xD5\x07\x00\x94\x4F\x06\x8E\x05\xBD\x7A\x86\x3C\x06\xB3\x87\x52\x36\x84\x83\x03\xC6\x4D\x6A\x38\x01\x86\x0C\x0B\x12\x03\x87\x81\x0C\xDB\x59\x7C\x3A\x04\x84\x15\x67\x10\xB0\x82\x6C\x5A\x61\x6D\x04\x34\x8C\x37\x9E\x02\x1A\xB8\x83\xAD\x7D\xD4\x72\x06\x2E\x86\x1D\xA3\x05\xFD\x65\x67\x40\x84\xF6\x07\x70\x43\x19\x07\xDF\x82\xAB\x2B\x04\x71\x8D\x0B\xED\x7B\x19\x20\x00\x5A\x01\x39\x66\x1D\x59\x0B\x0C\x82\x08\xDD\x7D\x6D\x06\x01\x1E\xB1\x64\xAD\x29\x0B\x75\x84\x00\x1B\x7B\xEE\x50\x50\x3A\x87\xE4\x76\x3A\x3F\x04\x2F\x88\x84\x49\x47\x8C\x13\x01\x81\x85\xFD\x1B\x46\x31\x1E\x87\x8B\x79\xFB\x59\x00\x86\x82\xFE\x5A\x28\x33\x1E\x87\x92\x7C\xEF\x50\x09\x0F\x04\x11\xC5\x7C\xBB\x32\x06\xEC\x80\x21\x8F\x71\x33\x26\x02\x1D\x89\xEA\x6A\x1A\xDA\x01\x24\x93\x86\xD7\x7D\xD4\x2D\x02\x49\x84\x33\x2A\x8B\x1B\xAC\x89\x34\x74\x03\x2F\x8A\xE9\x0A\x07\x31\x88\x10\xA7\x66\xF2\x3B\x03\x36\x8A\x56\x32\x07\x07\x8B\x25\xB5\x70\xF2\x32\x04\x3E\x88\xBB\x39\x07\x41\x8A\x26\x8B\x7E\x0D\x39\x04\x1D\x88\xBF\x0F\x02\x1D", "\x8B\x70\x00\x01\xB7\x0C\x2F\x01\x84\xF6\x65\x7B\x03\x09\x0A\x0E\x8B\x89\x07\x05\x51\x8B\x44\x06\x00\x54\x8D\x1D\x81\x51\x57\x19\x05\x5B\x88\x44\x1F\x02\x5E\x88\x50\x21\x8A\x91\x8C\xA0\x2F\x15\x18\x06\x8B\x0C\x0F\x0C\x29\x8A\x86\x02\x01\x6B\x8A\x50\x83\x2B\xAF\x11\x0D\x30\x8A\x83\x0F\x06\x73\x8A\x41\x18\x00\x76\x8A\x29\x84\x80\xF2\x31\x07\x46\x88\xD5\x3E\x8B\x03\x0E\x03\x2F\x0B\x74\x57\x02\x10\x83\x19\x3A\x03\x1D\x8C\x02\xA2\x1B\x9D\x4C\x1D\x12\x77\x19\x3D\x03\x7B\x8B\x20\x03\x05\x8E\x8F\x01\x9D\x09\x63\x9A\x5D\xC7\x74\x10\x19\x8C\x81\x0A\x08\x1C\x8E\x95\x1F\x8C\x0C\x0B\x05\x9A\x31\x45\x03\x1A\x80\x01\x24\x06\x8D\xA6\x18\x35\xB3\x81\x63\x72\x09\x2D\x8C\x26\x10\x8D\x5A\x2A\x36\xBC\x81\x63\x79\x09\x2D\x8F\x27\x18\x8D\xEC\x32\x37\x85\x83\x63\x70\x0A\x2D\x8E\x29\x00\x8E\x9B\x40\x05\x0D\x82\xAC\x82\x10\x27\x05\x47\x91\x82\x20\x87\x39\x2F\x5C\x6C\x78\xF2\x4F\x8E\x95\x0A\x01\xD2\x88\x22\x0A\x8E\x70\x74\x5B\x2D\x8E\xB1\x0F\x01\x81\x8B\x20\x1B\x8E\x74\x78\x97\x37\x06\x77\x9C\x15\x35\x01\x3C\x82\x09\xF1\x80\xEF\x64\x3D", "\x2F\x07\x8F\x4A\x1B\x07\x2A\x8E\x00\x0C\x1E\xF9\x74\xF9\x23\x06\xF0\x8A\x78\x01\x03\xF9\x85\x1F\x82\x7A\x86\x29\x06\xD6\x8E\x74\x07\x03\xEC\x86\xFF\x09\x86\x86\x2E\x06\xF9\x8A\x6C\x0C\x02\xFE\x85\xD8\x78\x48\x35\x09\x90\x44\x22\x0A\x0C\x90\xC6\x6A\x61\x5A\x04\x84\x94\x1E\x58\x03\x42\x93\x6D\x33\x20\x0E\x17\x92\x3D\x3E\x02\x1A\x92\xB3\x67\x22\x73\x0E\x21\x9D\x08\x19\x01\x91\xA0\x6F\x8C\x2C\x07\x12\x93\x11\x6A\x00\x8A\x87\x6D\x67\x22\x1E\x06\x8D\x39\x50\x07\x0B\x8F\x74\x8B\x16\xAF\x11\x1F\x2C\x90\x88\x07\x07\x2F\x91\x6D\x67\x5E\x3B\x94\x21\x3D\x02\x1F\x9D\x0C\xCC\x8C\x5C\x1B\x02\xCA\x56\x74\x03\x04\x02\x96\x10\x7D\x8C\x00\x13\x7A\x4D\x6A\x01\x08\x93\xBA\x5C\x6E\x08\x04\x93\x82\x8F\xDC\x81\xCD\x4F\x01\x29\x94\x10\xDD\x4F\x5B\x05\x67\x4E\x95\x1C\x93\x7C\xAC\x3C\x25\xB2\x7C\xBB\x35\x04\x5F\x97\x46\x88\x27\x33\x2D\x01\x65\x91\x45\x8C\x37\x9D\x06\x47\xB7\x87\xEC\x73\x02\x6E\x92\xFB\x7A\x2A\xA3\x06\x47\x80\x89\xA1\x53\x11\x29\x02\x9D\x87\x89\xC2\x19\x15\x36\x90\xED\x84\xF8\x1A\x30\x0C\x16\x93\x59\x6A\x69\x30\x04\x1F", "\x91\x11\xC6\x92\x0D\x08\x94\x56\x16\x16\x3E\x91\x8C\x81\x10\x8C\x08\x0F\x1F\x93\x5A\x51\x4D\x84\x95\xCD\x7D\xD4\x43\x00\xA6\x86\x1D\xC4\x02\x53\x85\x91\x99\x8D\xDB\x4A\x03\xA7\x96\x88\xA2\x95\x49\xA4\x7D\x34\x71\x05\x27\x94\xBB\x34\x06\xA9\x90\x4B\x80\x45\x2B\x5E\x2A\x9B\x44\x37\x03\x94\xA3\x93\x28\xB8\x4B\x2F\x05\x2B\xF3\x53\x38\x18\x95\xAA\x90\x12\x64\x3E\x33\x00\x29\x90\x08\x1B\x16\x93\x83\x1E\x32\x32\x87\x5C\x9D\x18\x2F\x16\x1B\x05\x96\x0C\x0C\x0E\x08\x97\x89\x05\x1A\x4B\x95\xB0\x83\x8B\x67\x26\x0E\x10\x96\x83\x0C\x07\x53\x94\x44\x13\x0D\xD6\x92\x56\x98\x2A\x4B\x5B\x2D\x83\x08\x21\x1E\x96\x0C\x0A\x38\x21\x97\xF5\x89\xD2\x2F\x16\x21\x05\x97\x02\x0C\x11\x28\x96\xBC\x5F\x3E\x6C\x96\x4B\x0F\x15\x8E\x05\x57\x80\x01\x4A\x03\x2F\xC3\x67\x81\x09\x57\x29\x06\x31\x9A\x31\x4B\x06\x27\x92\x8C\x11\x26\x16\x01\x98\x03\xA7\x22\x4D\x00\x2F\x80\x00\x28\x16\x93\x9D\x8D\x4F\x9C\x0F\x4E\x77\x46\x21\x05\xC3\x87\x05\x10\x9E\x4A\x09\x99\xD4\x87\xEC\x28\x05\xC3\x8E\x05\x19\x9E\x74\x1B\x99\xD9\x87\x46\x2F\x05\xC3\x95\x05\x21\x9A", "\xAB\x23\x99\xDD\x87\x46\x36\x05\xC3\x9C\x05\x29\x9C\xDD\x2B\x99\xE1\x87\x46\x3D\x05\xC3\x83\x06\x31\x9B\x13\x6A\x01\xE5\x86\x0E\x86\x08\x31\x16\x93\xD0\x8D\x23\x01\x11\x24\x9C\x10\x3B\x9B\x15\x9D\x6D\xC9\x00\x68\x96\x12\x0A\x00\x36\x46\x98\x18\x8D\x6A\xCE\x05\x61\x86\x17\x0C\x05\x2F\x80\x02\xD3\x89\x83\x0E\x92\x6A\x89\x25\xAA\x97\x35\xF2\x81\x85\x9A\x9A\x4A\x1D\x04\x1C\x9A\xEE\x09\x7A\x64\x3C\x38\x00\x9B\xC2\x1B\x05\x23\x9A\x88\x07\x90\x4D\x6A\x39\x0A\x9A\xA6\x19\x06\x0D\x9A\x03\x94\x7E\x6B\x04\xDA\x82\x1B\x6D\x13\x5D\x96\x9B\x06\x9D\xD4\x71\x07\xDD\x84\x22\x3C\x03\x6D\x8C\x09\x4C\x8D\xD4\x77\x07\xDF\x94\x1E\x42\x02\x70\x86\x09\x50\x89\xE6\x7D\x07\xE1\x96\x27\x48\x02\x71\x83\x08\x9B\x4D\xD4\x03\x00\x17\x1A\x9B\xC3\x3A\x72\x82\x08\x58\x89\xE6\x09\x03\xE5\x9B\x87\xEC\x34\x0A\x1A\x9C\x00\x00\xAB\x46\x93\x03\x1F\x9C\x5D\x94\xDD\x0E\x16\xCB\x75\x34\xBE\x84\xF9\x36\x00\xA8\x9D\x21\xB3\x53\x30\x03\x3A\xC5\x85\x9A\x7C\x00\xB1\x9F\x4D\x9B\x45\x33\x03\x3A\xC5\x91\xCF\x9C\x6A\xB9\x9E\x71\x5B\x43\x81\x14\x34\x86\x09\xD7", "\x82\x08\x50\x91\xCD\x67\x01\xE0\x91\x34\x93\x0A\xC3\x05\x9E\x03\x0F\x78\xAC\x56\xE6\x71\x3C\x80\x96\xD8\x17\x03\x07\x15\x9C\x52\x9E\x31\x9A\x11\x8C\x0B\x0C\x15\x9E\xCA\x49\x7B\x93\x08\xE9\x90\xDE\x69\x72\x0E\x01\x9E\x89\x92\x78\x3A\x18\xBD\x92\x3D\xF3\x92\x91\x80\x02\xE8\x9C\x80\x63\x9D\x3D\x90\x1A\x46\x00\xF8\x8D\x60\xFF\x93\x7C\x85\x94\xF2\x3D\x04\x71\x9E\xE9\x1A\x04\xA3\x9D\x51\xBF\x9C\x81\x03\x05\x7E\x9E\x56\x35\x1B\xEC\x9D\x36\x67\x23\x2C\x07\x3F\xDA\x2A\x29\x02\x9F\x10\x0A\x7A\x94\x94\x3E\x9F\xA5\x0D\xA0\xBB\x2E\x05\x10\xA5\x75\xA4\x95\xEC\x77\x06\x16\xA3\x26\x56\x05\x19\xA6\x78\xAB\x95\xDE\x6E\x06\x1E\xA3\x9C\x5E\x05\x21\xA1\x7A\xBB\x88\xBC\x45\x07\x26\xA3\x16\x46\x06\xF9\x99\x82\xB0\x66\x1F\x8E\x42\xC6\x17\xF2\x0C\x9D\x22\xA2\x58\xB8\x4B\x41\x06\x40\x86\x09\x22\x01\x9E\x97\x43\x74\x97\x8B\x01\xA0\x00\x0B\x05\x0F\xB5\x41\x40\xA3\x22\x19\x1F\x04\xA3\xD1\x1A\x33\x24\x07\xA2\x02\x09\x13\x09\xA2\x88\x00\x0E\x23\x9C\x9A\x7D\x6D\x9B\x00\x8A\x80\x01\x50\x03\x45\x8C\x0A\x39\x03\x9D\xFB\x79\xFB\x63\x04\x2D\xA9", "\x0A\x5D\xA2\x41\x02\x20\x4C\xA3\x28\x2F\x15\x55\x0E\x42\xB2\x06\x19\xA3\x08\xF2\x01\x86\x8C\x09\x15\x02\x30\xE4\x3C\x2D\x01\x9E\x06\x99\x79\x7C\x14\x3A\xAA\x30\x9A\x33\x2D\x1A\xA2\xBD\x01\x78\x91\x98\xB1\x03\x31\xC7\x76\x2F\x1A\xA2\xC4\x02\x90\x96\x12\x3E\xAC\x31\xE7\x21\x31\x1A\xA2\xCB\x02\x91\xA6\x1C\x46\xA4\x32\x9A\x30\x33\x1A\xA2\xD2\x02\x92\x9A\x2A\x4A\xAC\x32\x9A\x33\x34\x1A\xA2\xD9\x02\x93\xAC\x36\x4E\xA4\x33\x95\x92\x16\xA0\x07\xA2\xA3\x13\x6C\x00\x9E\x93\x26\xE4\x1C\xF3\x96\x12\xF9\x00\x6C\x2B\xA5\xA3\x99\xFD\x66\x07\x2B\xA6\x1D\xFE\x02\x96\xB6\x5E\x0D\x3B\x0E\x5A\xA2\xB1\x03\x00\xA4\x2E\x20\x33\xA4\xF2\x8D\x37\xBE\xA4\xAF\x09\x00\xC1\xA3\x20\x03\xA7\xF6\x88\x97\x77\x06\x31\xAB\x2C\xC9\xA2\x20\x0B\xA6\xFB\x88\x97\x7D\x07\x33\xA1\x3A\xD1\xA0\x00\x13\xA6\xFF\x84\x7E\x03\x01\x17\x10\x9E\x73\x53\x03\x20\x29\x6D\xAB\xF0\x67\x20\x02\x1F\xA6\xA0\x9B\x13\x60\x01\x6C\xA4\x4E\x90\x84\x5E\x4E\x00\xE8\xA4\xC8\x4E\x58\x76\xAA\xF1\x1A\x30\x05\x11\xA7\xB2\x9B\x0B\x6C\x00\x7A\xA0\xF2\x05\x24\x3E\xBA\x9D\x73\x52\x98", "\x3A\x9A\x72\xA4\x39\xE9\x70\x08\x1F\xA7\x77\x94\xDD\x38\x00\x7E\xAC\x10\x1C\x9D\x6F\x66\x01\x08\xA9\x7D\xA2\x1A\x1F\x0C\x50\x86\x09\xE9\x84\xA2\x2C\x00\xA1\x96\x9E\x22\x29\x4E\x38\xA2\x32\xAE\x9D\x78\x4B\x06\x11\xA8\x2B\x1B\x04\x15\xAB\x40\x16\x9D\xBD\x69\x07\x23\xA8\xD3\x19\x50\x03\xA8\x77\x1E\x9D\xAD\xA3\x20\x3F\x00\x84\xAD\x3C\x90\x0B\x15\x03\xA7\xD4\x84\xFC\x04\x02\x9A\xA6\x25\x5C\x00\x4E\xA1\x57\x4C\x8A\xA3\x96\x13\x30\x0D\x47\x65\x64\x39\xBC\x9E\x95\x96\x39\x42\xAA\xD3\x19\x06\x45\xA8\x92\x77\x57\x0C\x3B\xA5\x9A\x2B\x38\x06\x52\xF6\x87\xAB\x1D\x02\x52\xAC\xDD\x37\x03\xAA\xAF\x0F\x9B\x63\x52\xAB\x5F\x7D\x21\x5D\x64\xA6\x55\x69\xE6\x6A\x01\x56\xBB\x44\x84\x04\xAB\x82\xA1\x98\xA2\x10\x70\x03\x59\xB3\x53\x8A\x04\xAB\x93\xA0\xD0\x06\x07\x5F\xA8\xBB\x30\x04\x4E\xAF\x62\x4A\xA0\x0D\x3D\x07\x76\xAB\x26\x48\x2C\xB5\x7C\x21\x24\xA7\xE7\x48\x97\x04\x06\x5F\xB3\x53\x9A\x29\xB0\x82\xA7\x11\xA9\xFD\x0B\x07\x61\xBB\x42\xA8\x01\xAF\x82\xAD\x15\xAD\xD4\x12\x07\x63\xA6\x16\xB0\x01\xAC\x8F\xAB\xE0\x7F\x58\x17\xAC\xAF\x17", "\x05\x9A\xAA\xAF\xBA\xA1\xA6\x60\x0A\x6F\xA8\x00\x06\x05\x08\xAB\x70\x3E\x04\xAE\xA3\x44\xEC\xA8\x00\x08\x05\xA6\xAE\x15\x29\xAD\xEE\x2C\x55\xE5\x7D\x6F\x70\x05\xA6\xAE\x16\x33\xAC\x88\x0A\x0C\x5C\xAB\x15\xB9\x7E\xB8\x06\xB4\xBE\x05\xDD\xAC\x10\x50\x04\x57\xA1\xA3\x46\x90\x18\x26\xAC\x63\x04\x5C\xDB\x08\x57\xA4\x46\x44\xA0\x19\x0F\xAD\x67\x0D\x5C\x83\x08\x37\x01\xAD\x0C\x0D\x05\x35\xA2\xBC\x41\x0D\x08\xA9\x1E\xB6\x27\xC6\x12\xBB\xBD\xA2\xF2\x34\x0D\x26\xAE\x36\x08\xA8\x83\xA1\xBB\x85\xA5\x33\x2B\x0D\x26\xAD\x38\x08\xAF\x56\x12\xBC\x8D\xA4\x0D\x32\x0E\x26\xAC\x3A\x10\xAF\xA6\x1A\xBE\x95\xA5\x5E\x66\x5A\xEF\x04\x7E\xBA\x2A\xFA\xAD\x93\xA4\x3E\x78\x06\x5A\xF6\x07\x7F\xAC\x37\x01\xB5\x94\xA4\x3F\x7B\x06\x5A\xFD\x07\x81\xBB\x44\x96\x8B\xCF\x78\x4A\xE4\x50\x5E\xBC\x14\xC5\x80\x7E\xC7\x58\x75\x55\x80\x5E\x1A\x1A\x82\x8F\x84\xBA\xB0\x93\x8C\x57\x34\x80\x66\x9F\x61\x8E\x76\x89\xA2\x1E\x3D\x82\x83\x99\xB1\x13\xB1\x62\xCA\x1A\x11\x93\xAC\x31\x38\xC4\x87\x98\x5E\x14\x03\x5B\xAD\x53\x7E\x07\x0F\xB3\x4E\x6C\x67\xCA\x87\xEC", "\x7F\x04\x42\xB4\x22\x03\x06\x0B\x10\x09\xF4\xA6\x10\x35\xB0\x68\x87\x23\x04\x02\xC8\x96\x56\x75\x6A\x64\x86\x08\x91\xAB\x80\x2A\x87\xD8\x49\x01\x26\xBE\x90\x45\x1C\x95\xA2\x08\x4F\xB2\x20\x06\xB3\x90\x57\xEC\x0E\x03\x95\xBE\x23\xEB\x0F\xCB\x99\xB2\xED\x7C\x1D\x29\xB0\xF9\x33\x00\x5F\xB4\x8A\x17\x00\x31\xB6\x25\x5B\xB2\x41\x0F\xB1\xE4\x38\x03\x29\xB3\xEF\x7C\x66\xA6\x1D\x0D\x0C\xA5\xDD\x9E\x20\x1D\x01\x2F\xBB\x51\xD4\x1F\x38\x19\xA6\x77\xB4\x96\x86\x92\x12\x0C\x67\xD6\x11\x3A\x00\xB4\xBB\xA4\xFC\x2B\x01\x2F\xB4\xCF\x4A\x1B\x3B\x18\xAE\x06\x09\xD0\x84\xA7\x34\x73\x03\x0C\xB6\x95\x16\x07\x90\xB3\x20\x12\xB4\x66\xAD\xD4\x3B\x02\xA5\xA6\x1D\xFD\x01\xD3\x82\x09\x4D\xB4\x4D\x9D\x97\xA7\xBA\x2A\x04\x00\x05\x47\x0C\x83\x4F\x2A\x4B\x01\xA1\xAC\x35\xAC\x3C\xD4\x91\x49\x57\x12\x05\x27\xB4\xBB\x24\x34\x1E\xAB\xD4\xBC\x9B\x34\x7A\x05\x36\xB4\x48\x4A\xB5\x91\xB5\x9E\xA4\x3E\x31\x0E\x6B\xF3\x53\x07\x00\xB6\x9A\xB5\x25\x67\x22\x35\x05\x6C\xDB\x42\x09\x08\xB6\xBA\xB5\x26\x4D\x19\x66\xB1\x5E\xD0\xB4\x00\x12\xB5\x00\x06\xA1\x99", "\x7E\x3D\x04\x6D\xB4\xB2\xB5\xB8\xB6\x17\xAE\xB5\x82\x05\x2F\xB9\x00\x56\x10\xB5\x2A\xAC\xC9\xB0\x47\xA7\x23\x45\x0D\x6D\xCA\x1B\x10\x1F\xB6\xDC\x08\xA5\x99\x7F\x49\x0D\x6E\xC2\x1E\x12\x10\xB7\xA0\x20\xB5\x6F\xB4\xAD\x21\x05\x31\xB5\x4E\xA4\x63\xFB\xB4\xDD\x0D\x38\xBD\x98\x6D\xC8\xA8\x05\xA8\x7A\xE4\xB6\x4A\x10\x38\x88\x05\x6E\xF6\x71\x96\x9D\x6D\xB2\x01\xE1\xA6\x1C\x33\x00\x69\x0D\xBB\xAA\xAE\x87\x1A\x33\x17\x35\xB6\xB1\x1F\x06\x78\xB4\x43\x0E\x9F\x44\xA3\x18\x1B\xB8\x22\x26\x07\x1E\xBA\x75\x10\x2F\x12\xBB\x7D\x50\x35\x72\x68\x6D\xE4\xA9\x6F\x74\x06\x23\xBC\x7A\x05\x04\x93\xB3\x10\x6B\xA9\x9E\xB6\xAE\x31\xBE\x9E\x0C\x04\x9A\xB2\x10\x73\xA9\x64\x04\x07\x29\xBC\xDD\x13\x05\x8A\xB3\x11\x58\xB6\xCF\xBE\x0B\xED\x01\xE8\x9B\x44\x4E\x04\x74\x8E\xBB\x06\xA6\x92\xF6\x02\xE9\xB3\x53\x52\x0D\x74\x97\xBA\x88\x73\xB0\x52\xBB\x0B\x6E\x05\xAA\xB1\x6C\xB3\x96\x8D\x7F\x02\x0C\xBE\x4A\x37\x05\x95\xB5\x74\xB3\xA2\x86\x31\x00\x60\xBC\x21\x16\xB8\x76\x3F\x0B\x64\xBA\xD3\xAB\x8A\xE4\x3A\x03\x29\xBB\x14\x70\xD4\x73\xBB\x91\x69\x2F", "\x3C\xBE\x61\xAF\x14\x12\x06\x77\xCF\x64\x92\x7D\xBB\x56\x70\x22\x0E\x07\xBC\xB6\x5B\xD9\x7E\x0B\x00\xBC\xE5\x66\x06\x00\xBD\xC1\x15\x0D\x79\xBB\x6F\xA6\x92\x38\x00\xF1\xA3\x3D\xC5\xB3\x11\x5C\x05\xDE\xA8\xAE\x44\xA2\x08\x12\xBD\xF8\x34\x79\x90\x0B\x38\x19\xBB\xD0\xAE\xB5\x8C\x02\xC0\xBB\x76\x83\x09\x15\x1D\xBC\x0C\x0A\x1D\x2E\xBA\x86\x07\x03\x78\xB1\x52\xAA\x75\x80\xBA\xA2\x84\x22\x79\x0C\x7A\x2D\xBE\xA0\xA4\xA2\x5D\x01\xF6\x96\x12\x7C\x05\x7B\x89\xB4\x5E\x43\x03\x80\xBD\xCF\xB6\x26\x18\x49\x6B\x80\x02\xED\xB3\xB4\xBD\x6A\x0D\x01\xBF\x50\x38\x8C\x03\x0B\xF1\xBC\xB4\x69\x71\x0E\x0B\xBE\xD3\x1C\x00\x4D\xBE\x40\x0F\xBE\xA5\xB1\xCD\x78\x03\xE9\xBA\x55\x13\x02\xF5\xA6\xBE\xAC\xB7\x8C\x3F\x02\xDD\xB6\x3A\x1A\x02\x61\x58\xBE\xB3\xB7\x8C\x05\x04\xEE\xB4\xBE\x5F\xBC\xFA\xAB\x61\xAF\x14\x11\x2C\xBF\x4D\x47\x02\x6E\xBE\xB0\xB8\x4B\x93\x03\xFE\xB3\x52\x17\x06\x7F\xFD\xA4\xC5\x7A\xBF\x5B\x45\x06\x3D\xBF\x93\x7A\x61\x21\x04\x00\xC6\x16\x3C\x03\x00\xEE\x78\xDB\x67\x80\xBC\x17\x10\x0A\xC0\x35\x7A\xC3\x2F\x05\xCD\xBA\x55\x4A", "\x00\x1A\x45\x67\xEF\xBA\x8B\x7D\x6D\x5B\x0D\x80\xCA\x1A\x14\x10\xC0\x44\x7F\x8C\x3E\x05\x0E\xC2\x3C\x59\x00\x08\xCB\x7A\x8E\xA4\xFC\x9A\x2A\x30\x07\x7E\xFF\xB5\x53\x6B\x06\x2A\xC4\xDD\x26\x03\x16\xC0\x54\xE4\x3D\x34\x14\xC0\xEC\x34\x0D\x28\x43\xD2\xB7\x7D\x8F\xB9\xF6\x79\x06\x38\xC3\x13\x75\x03\x1D\xC3\x11\x6F\xBD\xF9\x9D\x6D\xE1\x04\x04\xE2\x1A\x3F\x07\x82\xA0\xBA\x6B\xA8\x07\x4A\xC4\x88\x2C\x47\xE2\xBF\x7E\xF4\x9D\x64\x0F\x07\x41\xC3\x4E\x4C\x05\x0B\xC5\x84\xFB\x9D\x33\xB1\xC2\xD4\x1A\x21\x54\xC3\x59\x67\x46\x7E\x04\x18\xD6\x27\x9B\x07\x04\xC7\xBA\xB6\x05\x00\x60\x50\xDD\xBA\x2A\x27\x49\xEC\x90\x09\xF7\xBB\x86\xDA\x09\x03\x0E\xC3\xC3\x66\x4A\x2B\x04\x22\xC3\x87\x8C\xAE\x91\x95\x00\x78\xC6\xEF\xA6\x1C\x5A\x0C\x87\xAC\xBE\x1F\xC4\xA2\x1D\x01\x10\xD9\x66\x2B\x1D\x0B\x05\xC6\x41\x0F\xBF\xA7\x30\x2F\x65\x00\x45\xCD\x68\xC2\x1F\x59\x48\xB7\x3D\xC4\xB3\x9A\x31\x16\x04\x89\xD6\x12\x5E\x58\xC4\xE0\xBB\xB4\xA9\x73\x1A\x0A\x88\xE9\x54\x0F\x0A\xC4\x83\x1E\x1A\x27\xC1\xD6\xA7\x73\x82\x0A\x0F\x05\xC5\x13\x0D\x08\x28\xC5", "\x89\x0D\x0D\x27\xC1\xE1\xA6\x92\x47\x00\x16\xF1\x11\x59\xC0\x11\x1F\x4F\x18\xDE\x68\x1A\x30\x0A\x3A\xC4\x86\x07\x05\x3C\xC4\x43\x0B\x07\x27\xC0\xF3\xAE\xAD\x2C\x03\x8C\xBD\x6A\x31\xC6\x08\xF2\x07\x04\xE1\xBD\x56\xC0\x00\x62\x01\x27\xD0\x33\xCF\xC3\x20\x39\x06\x2E\xC0\x11\x38\x00\x77\x16\x01\xC7\x74\x0D\x0A\xC5\xEF\xA8\x73\x4A\x1A\x37\xD0\x08\x39\x07\xD8\x6F\x02\x45\xCC\x2F\x75\x02\x22\xC3\xB3\xE9\xC5\x0F\xF1\xB0\x16\xB3\x63\xCA\x1A\x0E\x1F\xC6\xC7\x76\x0E\x2F\xC7\x9F\x3C\x2B\x77\xC4\x3A\xC7\x76\x77\x02\x11\xD4\x23\x3D\x0B\x8F\xA6\x1F\x0E\x0E\xBD\x07\xBC\x5B\x97\xC6\x52\x60\x9F\x69\x57\x41\xD7\xBD\xAE\xAC\x10\x0B\xC8\x76\x38\x00\x0D\xCA\x48\x7E\xBD\x4D\x6C\x11\x0A\xC4\x1E\xCB\x85\x0F\x00\x7C\x45\x67\x0F\xC8\xF9\x99\x7F\x4A\x0B\x91\xF5\x23\x47\xD7\xC8\x10\x0E\xF3\x24\x3E\x4F\x05\x92\xA6\x1D\x7E\x40\xC5\x21\xCE\x20\x25\x9A\xBC\x47\x0A\x2D\xC9\x6E\x87\xC9\x10\x09\x26\xF0\x21\x57\x10\x0B\x13\xCB\x26\x4F\x01\x16\xC9\x27\xF4\x9A\xBC\x48\x0B\x36\xCA\xE3\x38\xC9\x0C\x0A\x27\xF1\x96\xAE\x46\x94\x9B\x46\x0F\x08\xCA\xE8", "\x5F\xFE\x8D\x6A\x65\x0D\x94\xF3\x52\x8E\x50\xC9\xCA\xB6\x93\x95\xCB\x2D\x4E\x04\x50\xC8\xE6\x28\x85\x3A\x5B\x2B\xC6\x16\x2B\x0E\x95\x82\x0A\x52\xD9\xB6\xAF\x15\x1C\x22\xCA\x5E\x1E\x05\x65\xC8\x00\x07\xCB\xE1\xB4\x1A\xEE\x06\x45\xCA\x00\x56\x11\x9C\x52\xC3\x49\xC8\xA4\x8D\x6A\x7C\x0B\x96\xCA\x1B\x1B\x0E\xCB\x67\xCA\xDE\x86\x93\x00\x01\x06\x78\xCA\x56\xA0\xCC\x2F\xA8\x08\x45\xCC\x10\x76\x3A\x7F\x01\x50\xD9\xCB\xC5\x6A\xC3\x12\x01\xC5\xCF\x86\xEC\x36\x21\x0F\xCC\x51\xCD\x06\xF8\x4A\x0D\x04\x99\x83\x09\x5D\xC6\x1D\xAB\x54\x25\x28\xC8\xBB\x40\xE1\x11\x0C\x09\x1D\xCC\x5A\x26\x4A\x17\x04\xF8\x4F\x99\x90\xCF\x9A\x9A\x30\x2E\x00\x35\xDD\x0E\x2B\x11\x0A\x08\xCC\x44\x0E\xC2\xD4\xC7\x06\x32\xCC\x8E\xC6\x2C\x29\x06\x6D\xDA\x26\x89\x42\x36\xED\xCC\x76\x31\x0B\x70\x4C\x47\xC7\xCB\x2E\xB9\xFB\x4A\x03\xDD\xC6\x25\x3A\x07\x6F\xC6\x08\x36\xBF\xF5\x84\xA0\xE6\xC6\x3A\x42\x07\x73\xC3\x08\x75\xC7\x28\x1C\x02\xE1\xC6\x25\x4A\x04\x6B\xC3\xCD\xFB\x35\x34\xFE\x0A\x33\x0C\x9D\x82\x57\x77\xC2\xCA\x4F\xBC\x88\xB0\x03\xF2\xCA\x55\x5E\x07", "\x79\xCE\xCD\x41\x5F\x31\xAC\xCE\x76\x38\x0E\x6F\xCD\x66\xD7\x7D\x67\x24\x10\x33\xCF\x4D\x42\x0F\x46\xCC\x78\xC8\x0B\xF8\x93\x3F\xF3\x52\xB4\x56\x98\xDF\xCA\x28\xDD\x6D\x98\x04\x3A\xEA\x36\xD9\xC3\x38\x04\x01\x35\x6F\xCB\x44\x2F\x55\x23\x04\x05\xD8\x93\x0C\xD2\x89\x0F\xD0\x67\xCF\x16\xC4\xA2\x57\x04\xA1\x83\x0B\x2D\x16\xD0\x10\x0C\x02\x18\xD1\x6E\x3F\x2A\x39\x05\x87\xC2\x08\xC2\x00\x44\xE0\x5D\x11\xD0\x11\x4A\xC4\x35\xC4\x06\x27\xD0\x00\x0D\x06\x15\xD6\xEE\x2C\xD2\x1A\xA7\x23\xCF\x02\x40\xC0\x01\x6C\x04\xA3\xCA\xA5\xE3\x5C\xC8\x3D\x00\x21\xE0\x0D\x6D\x02\x9B\xC2\xBD\x47\x18\x5E\xC5\xB9\x48\xD0\xC8\x6A\xC2\x0E\x45\xD2\x95\x1C\x01\x3E\x62\x49\xCF\x9B\xBA\x72\x9B\x95\xC6\xD8\x03\x02\x0F\xD2\x4A\xD8\x9B\xBE\x95\xA5\xA4\xA9\x96\xCF\x53\xD3\x65\x4B\xE6\x1D\x29\x0F\xA5\xF7\x52\x86\x21\x00\x13\x25\x32\xDB\x45\x2D\x05\xA6\xFE\x53\x19\x29\x00\x69\xD6\x4C\x9B\x44\x0E\x69\xA4\xC3\xC9\xE9\x71\xD3\x82\xC2\xAB\x2A\x03\x36\xDE\xA8\x1A\x30\x06\x18\xD3\x8B\xC6\x74\x32\x02\x3E\xD5\xA9\x1E\x34\xA0\xD6\xD2\x44\x22\x0F\x04\xD4\x4E", "\x57\x46\x28\x03\xA1\xD6\x12\x82\x03\x51\xE2\x55\xE6\x5F\xA8\xA6\x1E\x22\x12\xD4\xDA\xB0\xF2\x95\xD4\xAD\x22\x09\x12\xD5\x5C\xD2\xCE\x00\x00\x08\x00\xD4\xDE\xCC\x2B\x1A\x07\x8F\xD3\x08\x5A\xD2\x57\x6F\x15\x24\x0B\xA9\xEC\x37\x28\x12\xD4\x82\xCC\x88\x91\x03\x56\xDB\x89\x2B\x06\xA4\xD0\xA9\xD4\xC1\x0B\x00\xD4\x23\xD3\x11\x33\x05\x94\xCE\xC1\x69\x70\x0C\x3B\xD5\xE6\xCF\xAB\x9A\xCD\x53\x67\x03\xA3\xD4\x0F\x4D\x5D\xE1\xC3\x10\x29\xD6\x40\x06\xB8\xA0\x08\x0E\x09\xD6\xD3\x1B\x0C\x4B\xD4\xAA\xD0\xAA\x5B\x3C\x56\xF3\x53\x6A\x02\xA9\xB8\xCC\xA8\xC1\x04\xDA\xD3\x0B\x5D\x06\x49\xD6\x85\xFE\x09\x22\x13\xD6\x5A\x2D\x1C\x27\xD5\xD3\x0E\x85\x95\xAD\xB8\xC6\x16\xEE\x02\x52\xD1\xCF\x84\xC3\x10\x1A\x07\xBB\xDC\x15\xF6\x02\x52\xD9\xCE\x9A\x02\x0A\x68\xD4\xBB\x3E\x07\xD6\xD4\x5D\xDC\x95\x34\x7B\x0A\x7E\xD7\x26\x48\x00\x0A\x6C\x59\xC2\x08\x67\xD3\x15\xE2\xCC\x5B\x14\x05\x06\xDB\x4E\x52\x01\x84\xD7\xAD\xE9\xCE\x6B\xBD\x05\x11\xDB\x0B\x5C\x00\x8A\xD2\xB0\xF8\xCE\x86\x26\x06\x19\xDE\x58\x26\x00\x85\x60\xA4\xE6\xB8\xF9\x2F\x06\x21\xDE", "\xC2\xA4\xD9\x8A\xD0\x77\xF8\x48\x36\x01\xD7\xE0\x00\x50\xE3\x73\x9C\x6C\xB2\xCD\x97\x19\x22\x07\xE1\xD2\x1D\x32\xD9\xD1\x34\xB3\x9D\xD8\xF9\x61\x20\xE1\xD4\x1E\x3B\xD8\x88\x08\x04\x3D\xD9\xA1\x04\xD1\x85\x79\x5C\xFE\x07\xA1\xD3\x14\x46\xD8\x4B\x6D\x97\xEF\x83\x0C\x20\xC4\x04\x02\xB5\x8C\x0B\xE0\x18\x02\x4E\xDD\x59\xD6\x5C\x0D\x3A\x00\x55\xDA\x41\x1C\xC8\x13\x06\x6B\xF7\xBB\x38\x1B\xB2\x90\x0A\x0F\x1C\x0E\x3C\x07\xD8\x55\x00\xB1\xD1\x1D\x7C\xC6\xD2\x07\xDB\xD6\x37\xD8\x58\x00\xB6\xD9\x50\x89\x8C\xDD\xC3\xB3\x3F\x04\x3B\x0C\xD9\xDE\x64\x61\xE5\xC6\xF0\x00\x02\x68\xDF\xD8\x5F\x01\xBB\xDE\xB6\xFF\xD8\x77\x19\xDB\x9E\x34\x6E\xD4\x22\x12\x04\xB8\xA6\x1D\x10\x02\xD2\x91\x0D\x04\x34\xDA\x52\xDA\x34\x69\x01\xD6\xC2\x08\x8F\xDB\x49\xE0\xD4\x17\x03\xB9\xD6\x11\x1C\x17\xDC\x00\x01\x73\xD3\xD3\xDE\x67\x03\x74\xDA\xC2\xDB\x42\x79\x05\x6C\xF5\x0C\xEE\x00\xA8\xE9\x71\x10\x06\xDD\x90\xD2\x75\xD6\x0A\x30\xD4\x7E\x4B\x00\xEC\xC9\x41\xB2\xDB\x20\x22\xDC\x99\xC2\x2C\x37\xDE\x56\x34\x04\xB9\xD8\x73\xE1\xBE\x0D\x3F\x05\x1D\xDE\xE9", "\x1D\x04\xA0\xDB\x77\xE6\x2F\x57\x18\x06\x3E\xDC\xBB\x25\x05\xC1\xD9\x74\xFB\xB5\xDE\x62\x07\x4E\xDF\x26\x5F\x6D\x05\xD2\x78\xD4\x91\x6D\x46\xBD\xF3\x53\x2D\x11\xDE\xCA\xDC\x51\xDA\x30\x43\x0D\xBD\xDB\x40\x30\x00\xDF\x60\xCA\xC3\x10\x05\xF2\xD6\x2C\x49\x04\xFA\xCF\x85\xAF\x12\x13\x2C\xDE\x5E\x11\xDF\x59\xDE\xF4\xD1\x3F\xAF\x14\x14\x34\xDB\x05\x06\x25\x5B\x04\xC7\xCB\xDD\xEA\xB2\x02\xF3\xDE\xA5\x19\xE0\x76\xDD\xF8\xDF\x91\xE4\x39\x17\x03\xE1\xFD\x1F\xBE\x8C\x08\xAE\xC0\xD5\xC3\x06\x78\xDA\x2B\x7B\x09\xBC\xC0\xD5\x6F\x6C\x06\x12\xE5\xE9\x15\xE0\x63\xD9\xE6\x55\x07\xFE\xD6\x12\x07\x05\xCA\x7C\xDE\x93\x2E\x83\xC6\x90\x38\x1F\xE0\xA6\x1A\x02\x22\xE1\x89\x07\xC0\xC7\xC1\xF6\x6B\x07\x0B\xE2\x6C\x14\x72\x03\xE0\xB0\x1A\x31\x3D\x11\xE1\x44\x26\x04\x15\x72\x8E\xC7\xC0\xE5\xD4\x5B\x1F\x07\x28\xE2\xAB\x2F\x01\x2A\x77\xBA\x87\xE1\x72\xC6\x92\x0A\x04\x0C\x22\xCC\xD3\x19\x03\x3B\xE0\x0B\xE4\xC3\xF6\xA2\x89\xC1\x0A\x2B\x12\x04\x4E\xE0\x09\xE3\xD8\xBD\x6E\x03\x12\xE2\xFD\x04\x52\xAB\xE3\x15\xE3\x89\x1A\x31\x05\x1B\xE3\x0C\x1B", "\xED\x5E\xE0\x00\xF7\xBA\x4D\x6C\x06\x23\xE2\x81\x03\xC2\xDA\x29\x18\x06\xE3\xB3\xDE\x62\xD4\xC7\x1F\x0B\xC6\xDA\x0C\xFE\x30\xE3\xBA\xDC\xB2\xA9\x72\x25\x05\xC7\xED\xE2\x56\xA4\xE2\x4F\xE2\x13\xE4\x3F\x2A\x0D\xC7\xD6\x11\x20\x00\xE4\x5F\xE7\xC7\x6F\x14\x30\x05\xC7\xA7\xDE\x1A\x15\xE3\x83\x1B\x11\x16\xE3\x33\xE6\xB3\x9A\x30\x1B\x0D\xE4\x13\x0E\x0E\x10\xE5\x89\x0D\xF0\x34\xE1\x13\xB2\x46\x98\xE0\x22\x02\x05\x4D\xEC\x19\x13\xE5\x1C\xE3\x97\xF9\xC9\x94\xCC\x08\x47\x04\xCA\xA2\x1A\x29\xF9\xE3\x2D\xD7\x55\x10\x04\x55\xE6\x10\x1A\x05\x2B\xE0\x3E\xAF\xE2\x7B\xF7\xD0\x0D\x3C\x09\x05\xE4\x44\x07\x05\xB7\xE3\x20\x37\x79\x25\xEC\x10\x43\x00\xE4\xDE\x0B\xA9\x05\x8E\xC8\xD4\xEA\x12\x0C\x55\x71\x39\x66\xE6\x9A\xDC\x5E\xC2\x09\x58\x0A\xCC\xDD\xCE\x33\xF3\x08\xD0\xE3\x74\xD9\x7F\x5C\x05\xC7\x94\xDD\x92\x39\xE5\x00\x01\x9B\xDB\xD3\x34\x72\x0C\x5D\xE5\xFF\xC0\xE7\xE2\xE6\x6B\xA4\x3F\x65\x06\xCE\xA6\x1C\x39\x08\xE7\x64\x9F\x55\x14\x07\x76\xEA\x55\x6D\x04\x3C\xEC\x9B\xAF\x15\x1B\x15\xE6\xD3\x16\xF8\x20\xC5\x3A\xE9\xBF\x1A\x35\x1C", "\x34\xE7\x7F\xD7\xCF\x8C\x0A\x3B\xAD\x6A\xEE\x03\xA0\xDB\x45\x03\x04\xFC\x1C\xCB\x3F\xE0\x00\x84\x99\xCD\x77\x06\x85\xE3\xA7\x26\x7E\xFD\xCF\xE8\x8C\x9D\xB7\x40\x76\xFB\xD3\x35\x8D\xE8\x36\xE9\xDF\xE4\x39\x01\x25\x02\x8E\xEC\x2B\x22\x02\x47\xF4\x74\x3F\x4A\x32\xE3\xE8\xB5\xBB\x48\xA7\xE9\x31\xE6\x4A\xAF\x13\x03\x2B\xE8\xAA\x0D\x66\xC4\x7F\xE9\xCF\xE8\x1A\xC1\xFB\x65\x01\x99\xE3\x10\x5E\xE7\x44\xAE\xE9\x06\x0F\xA1\xF1\xD4\xD7\xAE\x02\x3C\xEA\x40\x1E\xE9\x44\x27\x08\x00\xEB\x81\x0F\xD0\x8F\xE2\x34\xE6\xBE\x46\xE9\x50\xDA\x2A\x28\x04\xFC\x4F\xE6\x05\xF9\x7E\x3F\x01\xAA\xCB\xE6\x7B\x28\x05\x55\xEB\x47\xFC\xE0\xBD\x6F\x08\x11\xEB\xD3\xD6\x2C\x1A\x80\x44\x1E\xE3\x4C\xED\x84\xF2\xD5\xB1\xE6\x25\x6B\x00\xF1\x68\xEB\x02\x0F\xA1\xEE\xE0\x23\x9B\x05\x51\xE8\x52\xF4\x1E\x76\x03\xA9\xF1\xEB\x1A\xE4\x7E\x64\x02\x5D\xEA\x4E\x7A\xE9\x9C\xDC\x0E\x1F\xE2\x30\x6C\xEA\xE9\x08\x04\x36\xEF\xAB\xCC\x09\x23\xE4\x44\xF7\x03\x5F\xE6\x1D\x92\x01\xB0\xCF\xE9\x79\xD0\x1A\x00\x07\x63\xFA\x2A\x9B\x02\xB2\xFB\xAA\xF2\x39\x08\x06\xEE\x56\x24", "\x05\x6F\xEA\xB1\xE1\xCF\x33\x23\x09\x1E\xEC\xBB\x2F\x05\xA1\xE8\xA5\xF2\xE2\x50\xDD\x09\x26\xEF\x26\x5A\x05\xA9\xEF\xA5\xEB\xED\xA7\xE7\x0A\x2E\xEF\x9C\x45\x06\xB1\xE9\xA8\xFA\xE3\xDE\x61\x0B\x36\xEF\x16\x50\x06\x89\xEA\xB5\xFA\x95\xA6\x6B\x0B\x3E\xEE\xB1\x1A\x06\xC1\xEA\xB6\xED\xD9\xA6\x65\x0C\x17\xEE\x41\x0E\x06\x51\xEB\x70\x24\x06\xCD\xE6\xB6\x67\x20\x34\x0E\xEE\x03\x09\x1B\x11\xEF\x89\x06\x0D\x97\xE9\xDC\x4C\xAF\xD8\xEA\x20\x24\x07\xED\xEF\x2D\xD4\xEC\x2A\xFA\x30\xE6\x01\xBC\xEA\x62\xF2\xE1\x13\x66\xEC\x5E\x87\x23\xF1\x02\xBD\xFA\x06\xF6\xE3\xCF\x1D\x8A\x43\xFB\xDA\xE4\x3C\x1F\x3E\xEC\x03\x06\x06\x6C\x58\x44\x11\x00\x1D\x8F\x74\xC4\x02\xEE\x02\x04\x47\x74\x02\x1D\xEF\xE4\x0D\x70\xE2\x1B\x01\xF0\x11\x45\x03\xB1\x6B\x00\x08\xF2\x9E\x80\x01\x08\x01\xE1\xF6\x0E\x95\x0E\xF0\xC2\xEC\xFC\x3D\xDA\x2B\x16\x04\x04\xF3\xB1\x72\x00\x15\xF0\xCB\x8A\xF0\x22\x2D\xE1\x8D\xF3\xB1\x73\x00\x21\xF0\xCC\xA6\x3D\x14\xF3\x66\xC7\x03\x31\xEC\x0B\x18\x01\xC5\xE4\xEA\x5E\x1B\x01\x76\xEF\x44\x0E\xF1\xD1\xE0\x34\x22\x00\x19\xF6\x25", "\x24\x02\x8D\xF0\x08\x38\xF2\x9B\xC6\x92\x16\x09\xE2\xF0\xEB\x16\x4E\x89\xC4\xE6\x20\x01\xF3\x71\xE4\xBA\xC5\xF2\x95\x17\x01\x01\xF7\xC6\xF4\xDC\xBC\x42\x04\x4E\xF2\xE3\xD1\xF2\x40\xF1\x9E\xE7\x23\x26\x06\xE5\xDA\x2B\x12\x18\xF2\x0C\x0B\xC9\xFB\xC9\x2B\x5C\xE3\xA6\x1D\x15\x1F\xF1\x61\xF6\x4E\xE9\x72\x31\x0D\xE5\xEC\x36\x17\x00\xF3\x4A\xF3\x7A\xD9\x7F\x36\x0D\xE6\x9B\x44\x1A\x10\xF3\x03\x0A\xCC\xD7\x23\x57\x18\x07\x75\xF3\x9C\x52\x03\x78\xF2\x20\x3A\xF3\x32\x20\x33\x7E\xF3\x16\x5C\x03\x81\xF0\x00\x03\xF5\x82\xAD\xDB\x0E\x06\xA1\xE6\x16\x86\x01\xD1\xC3\xF5\x4C\xD4\x44\x99\x07\xA3\xFC\x15\x90\x02\xD2\xF0\xE9\x33\x24\x0A\x29\xF0\x03\x16\x12\x9A\x05\x23\x86\xF3\x41\xF9\xD3\xC6\x90\x2C\x17\xF4\x4A\x1D\x14\x1A\xF4\x88\x03\xD4\xD4\xC7\x2E\x08\xF5\xC2\x1F\x15\x2B\xF4\x07\xEF\x2A\x46\x05\x99\xFC\x87\x68\xF1\xCE\xD1\xCC\xF2\x30\x0D\x37\xF4\xBB\x22\x06\xB9\xF1\xCF\xEA\xEA\xD7\xAA\x0D\x1E\xF6\x95\x0B\x06\x1D\x8F\xD3\xD9\xF2\xB0\xE5\x4B\xC6\xF6\xE9\x17\x06\xC9\xF2\xCA\xD8\xB8\xF2\x32\x0F\x30\xF6\xD8\x03\x07\xB3\xF6\x20\x1E", "\xD7\xA7\xED\x0F\x56\xF4\x11\x2D\x07\xD9\xF3\x20\x04\xED\xA3\x08\x00\x67\x00\xA0\x1E\x46\xA2\xF2\xDA\xCB\xED\x57\x14\x01\x66\xF5\x7A\x16\x12\x02\x06\x4E\xA7\xDD\x41\xF4\xD9\x91\x0F\x07\x0E\xF7\x5C\xE4\xFA\xB2\xF6\x75\xF3\xDA\x9A\x32\x0A\x18\xF7\x4E\x16\x4A\x16\x00\x3B\x9A\xEC\xE9\xF0\x16\xF9\x7E\x36\x00\xE0\xDA\x12\x2B\x12\x02\x04\xF8\xBF\xEE\x2B\x0E\xDA\x2B\x02\x02\x85\xF7\x26\x56\x12\x0B\x0E\xF8\xCB\xF0\x8D\xE9\x72\x27\x04\xF1\x85\xF8\xBB\x3A\x01\x18\xFE\xE0\xDE\xD8\xAB\x6D\xF1\x9C\xF2\x9D\x83\xF5\x26\xD8\x2F\x66\x03\x92\xFC\x52\xA7\xFB\xC3\xE2\x08\x40\x75\xA9\x72\x02\x8A\xF6\xE4\xFD\x00\xC5\xE3\x1C\x5C\x03\xDF\xD9\xF9\x4A\xE4\x7E\x7F\x00\xCD\xF3\x08\x8A\x07\xE6\xD3\x08\x62\x99\xE4\xC2\xF7\x27\xEA\x62\x3F\xF8\x22\x17\x04\xA1\xFB\xB1\x3A\xFA\xC8\xED\x8B\x8F\x29\xE9\xCC\x08\x52\x0C\xF4\x8C\x0A\x1E\x0E\xFA\xBA\xF2\xDD\x21\x78\xA9\xF6\x10\x31\x05\xD5\xE6\x08\xE7\x95\xE8\xC2\xF4\xFC\xE8\x97\x33\x04\xCB\xEC\x08\xBF\x07\xEB\xC3\x09\x7C\x97\xD6\x93\x09\x12\x0F\xF1\x5A\x09\x18\x14\xF9\xBB\xE6\x4F\x19\x06\x9D\x9C\xC8", "\x6F\xF9\xC7\xD1\x0C\x65\x03\xF7\xD6\x12\x28\x17\xFB\x6E\xF8\x23\xE9\x73\x69\x04\xF1\xB3\xF2\xD2\x0B\x05\x58\xFA\xDC\xEC\xDD\x7C\xE5\xF8\xD6\x10\xCA\x82\xFB\xFF\x83\xCA\xCD\x6B\x73\x0D\xF8\x85\x89\xE2\xE5\x15\x5A\xF2\xC3\x31\x07\xCA\xFA\x55\x49\x98\xE4\xF9\xFB\x6E\xD2\xC3\x3B\x07\xBE\xF6\x3A\x53\x04\xE0\xEA\x21\x6A\xF5\xB7\x44\x00\x34\x00\xF9\xC6\x14\x37\x17\xFC\x91\xF8\x22\x07\xE9\x34\x7E\x00\x2C\xFF\x14\xE6\x1D\x6F\x9F\xF3\xD2\xCB\x34\x78\x01\x36\xFC\x4D\xE0\x7D\xB0\xF8\xF4\xCB\x9D\x57\x12\x02\x3E\xFE\x67\xD6\x12\xFA\x01\xF8\xE0\xE8\xBC\x4C\x02\x46\xFD\x6A\xC6\x1D\x04\x01\x78\xA7\xDC\xE1\xF9\x22\x9A\x32\x0D\x0E\xFE\x14\x0E\x4A\x0E\x00\xE9\xF1\xF8\xF8\xDF\x19\x20\x02\xD8\xFE\xC8\xC6\x16\x0C\x01\x3C\xC6\xF0\xF5\xE2\x31\xAD\xB0\xFB\xC6\xFC\xE1\x13\x02\x5C\xFC\xEA\xEC\xF5\xC2\x12\xFD\xF1\xAE\xF7\xFA\x4D\x09\xCF\x19\x3F\x02\xD8\xFC\xEE\xDD\x09\x1B\x01\x3C\xF8\xFB\x55\xE6\x92\x68\x01\xFE\x7B\x05\x7D\x7F\xDD\x7C\x69\x67\x46\x31\x01\xE1\x7E\x95\x09\x04\x01\x4F\x1E\x7E\xE2\x7C\xEC\x46\x49\x7C\x01\x02\x86\xE6\x4C\x80", "\x05\x83\x62\x2F\x2A\x07\x02\xF2\x7E\xE9\x01\x06\x34\x7F\xD6\x04\x5F\x78\x97\x11\x02\x19\x82\x56\x1B\x06\x1C\x80\x0E\x80\x70\x67\x46\x1B\x02\x12\x82\x56\x1D\x42\x6D\x7D\xEF\x7F\xBA\x79\xAD\x21\x80\xEC\x18\x20\x04\x02\x98\x7E\x1B\x2C\x4F\x60\x03\x9B\x22\x8A\x03\x0C\x81\xFB\x60\x71\xE4\x1E\x2E\x09\x02\xAC\x1B\x94\x00\x05\x8D\x02\xBD\x7B\xE4\x1D\x31\x0F\x03\x9B\x22\xA0\x02\x10\x85\xFF\x73\x76\xA0\x04\x34\x07\x04\xB3\x29\xAC\x02\x12\x8D\x01\x8C\x81\x91\x07\x36\x0F\x04\x9B\x21\xB8\x02\x14\x85\x02\xAB\x38\x23\x4B\x15\x86\x2C\x09\x52\x2C\x83\x12\x83\xDC\x69\x39\xF1\x02\x17\x8C\x2B\x0F\x03\xE5\x7D\x05\x8B\xB5\x2F\x0A\xFC\x03\x0D\x83\x20\x29\x01\xFE\x74\xF6\x0A\x03\xA7\x7F\x7A\x5E\x39\x50\x07\xB7\x7E\x74\x47\x1D\x88\xB7\x03\x06\x73\x83\x77\x76\x4F\x7A\x81\xC7\x7C\x44\x0E\x01\x00\x82\x01\x34\x44\x0E\x0E\x3D\x81\xC0\x60\xF9\x10\x02\x04\x82\xD9\x7D\x04\x5C\x08\x83\x0E\xF8\x00\x22\x8A\xF5\x4C\x3F\x8C\x83\xE9\x66\x03\x0F\x82\x13\x06\x00\x08\x50\x53\x7F\x64\x7D\x53\x38\x03\x0C\x82\x46\x7B\x10\x08\x09\x80\x0A\x08\x56\x91\x7A", "\x04\x1C\x07\x48\x03\xB1\x35\x04\x0C\x82\xE4\x62\x95\x07\x0A\x90\x04\x4B\x03\xB1\x38\x04\x0C\x82\xFC\x0A\x13\x0C\x08\xA3\x59\xB1\x83\x10\x85\x62\x5B\x58\xF4\x60\xF5\x0C\x04\x28\x82\xC7\x3B\x13\x07\x0B\xA3\x78\xBE\x80\x77\x09\x0B\x81\x63\x8C\x80\x15\x14\x05\x03\x83\xA6\x0D\x13\x00\xF7\x47\x05\x55\x01\x25\x85\x47\x1B\x82\x13\x06\x33\x8A\xF7\x7E\x05\x5F\x02\x34\x86\x3A\x21\x00\xD4\x80\x44\x06\x0D\x82\x79\x44\x51\x1A\x00\x0A\x8B\x52\xA5\x81\x35\x8B\xF8\x67\x11\x74\x03\x38\x86\x3A\x36\x00\xE5\x82\x37\x82\xF9\x69\x39\x7F\x02\x3A\x89\x96\x2D\x83\x0C\x07\x37\x8C\xBB\x67\x11\x8A\x02\x3C\x8C\x6E\x0C\x01\xF4\x82\x41\x06\x0F\xA3\x79\x1A\x19\x25\x0A\x0D\x9A\x15\x57\x01\x37\x85\x0F\xA9\x7E\xD9\x3F\x27\x0A\x0F\x9B\x22\x61\x01\x3F\x83\x10\x3F\x83\x4B\x66\xB8\x2B\x10\xB3\x29\x6C\x02\x43\x82\x10\x10\x84\x10\x77\xAB\x05\x0B\x13\x84\x5B\x23\x1D\x06\x11\xB0\x0A\x59\x64\xF9\x10\x0C\x1C\x84\xC6\x0A\x20\x0F\x11\x98\x84\x8C\x79\xF6\x3B\x0C\x24\x84\xBC\x09\x23\x07\x12\xA9\x74\xE4\x1E\x35\x0C\x12\x8A\x0D\x98\x03\x4B\x8E\xFD\x5A\x18\xE1", "\x00\x23\x8D\x00\xB3\x29\xA3\x00\x42\x5B\x13\xA0\x84\x01\x70\xF9\x1D\x0E\x33\x84\xB1\x7A\x4D\x8B\x95\x27\x11\xF8\x00\x51\x82\x36\x3A\x02\x46\x84\x03\x2F\x2A\x03\x00\xAA\x33\xFA\x72\x36\x05\x03\x06\x86\x3F\x8F\xFF\x44\x51\x0D\x01\x54\x86\x25\x14\x57\x90\x7C\x46\x80\xAD\x51\x06\x17\x02\x2A\x3F\x13\x86\x0B\xD9\x00\x42\x5D\x00\x26\x83\x0F\x80\x11\x53\x02\x22\x85\x6C\x1A\x59\x88\x16\xAF\x66\xE4\x1F\x0B\x0A\xCA\x22\x7F\xBC\x0B\x3C\x0D\x14\xB5\x20\xAF\x0A\x0E\x03\x17\x96\x09\x38\x59\x18\x86\x15\xAA\x10\xAF\x09\x11\x0C\x16\xA6\x0E\x53\x5B\xB9\x7E\x0E\x89\x44\x1A\x19\x14\x0B\x17\xA6\x0E\x15\x03\x97\x56\xE4\x58\x84\xF5\x7A\x5F\x0C\x05\x0B\x86\x5A\x14\x08\x0E\x18\xAF\x85\x44\x80\x5E\x27\x06\x03\x86\x9B\x53\x97\x57\x16\x87\x86\x3C\x80\x5E\x23\x07\x1C\x86\x0A\x56\x67\x88\x19\x90\x7C\xE2\x5C\x69\x8B\x89\x05\x01\xA6\x84\x68\x81\x9F\x6B\x46\xAA\x87\x9C\x25\x6B\x50\x04\x9F\x87\x41\x8E\x75\x64\x1F\x97\x01\x6C\x8B\x85\x1F\x01\x5F\x5B\x4F\x88\x11\x93\x2D\x4D\x37\x28\x0A\x1B\xAC\x14\xBD\x87\x69\x80\xF3\x6F\x0A\xAF\x00\x65\x86\x10", "\x3A\x02\xAA\x33\xE0\x07\x07\x17\x86\xAE\x85\x93\x3D\x5C\x0A\x87\x03\x07\x31\x0D\x1C\x93\x04\xE3\x5A\x5F\x8F\x10\xBE\x81\xE4\x1D\x32\x04\x1D\x82\x04\xD4\x03\x75\x87\x29\x10\x87\xB6\x87\x79\x71\x13\x9F\x87\x00\x01\x38\x02\x1E\x94\x24\xE4\x87\x5F\x83\x09\x9A\x18\xE3\x00\x7A\x8E\x0E\x2B\x87\x06\x07\x28\x0D\x1E\x9B\x87\xF7\x49\x07\x2A\x1B\xBC\x03\xF4\x87\x40\x0E\x0A\x05\x87\x10\x07\x13\x0F\x0C\xB4\x04\xFE\x02\x56\x86\x3A\x3A\x02\xF7\x86\x40\x02\x20\x97\x83\xEF\x07\x1A\x0D\xFA\x7C\x0A\xC5\x01\x82\x87\x4F\x02\x7E\xBD\x36\x04\x0E\x20\xAF\x7B\xA6\x0C\x34\x00\x20\x8C\x04\x0B\x8A\x48\x66\x24\x5D\x00\x17\x89\xBE\x7A\x55\x1C\x03\x1B\x8A\x41\x0D\x21\x90\x5F\xBD\x34\x0A\x01\x22\xA4\x71\x97\x3D\x89\x83\x10\x27\x88\xD9\x5D\x6F\x33\x03\x2B\x88\x6C\x72\x95\x04\x0F\x2E\x88\x0A\x8B\xF0\x64\x7E\x3E\x00\x34\x89\x23\x85\x56\x00\x5E\x46\x78\x8C\x80\xD0\x64\x1F\x48\x01\x8F\x84\x17\x8A\x0D\x0B\x00\xE0\x5F\x13\x82\x89\xF0\x5F\x19\x13\x05\x06\x89\x75\x12\x92\x83\x11\x0C\x89\x11\x75\x6F\x3E\x05\x10\x89\xAD\x3A\x94\x81\x20\xA1\x84\x78\x25", "\x1A\x08\x25\x82\x71\x5A\x88\x87\x8B\xFC\x4D\x35\x74\x03\x97\x8C\x6E\x3B\x00\x61\x8A\x89\x80\x13\xB8\x25\x7F\x02\x99\x8B\x89\x07\x01\x69\x8B\x8B\x8B\xE9\x5A\x18\x8A\x01\x8F\x83\x16\x8B\x1F\x80\x5D\x6D\x8A\x26\x81\x85\x78\x26\x25\x0E\x26\xB3\x29\x60\x01\x9C\x89\x23\xB0\x7F\x15\x4F\x9F\x8B\x85\x2C\x01\x82\x8B\x84\x89\x6F\x68\x3C\x3D\x8A\x54\x84\x44\x1B\x5F\xDA\x87\xA0\x83\xC7\x38\x2B\x8D\x8A\x95\x03\x08\x00\x89\x53\x8B\xB0\x74\x8D\x40\x03\x76\x8A\x95\x0E\x08\x00\x5E\x0E\x01\xA6\x89\x16\xAE\x56\xCC\x01\xA7\x86\x3A\x1C\x02\xA0\x8A\xA8\x80\x17\xAE\x6C\x86\x8A\xB1\x0A\x0A\x09\x8A\x4C\x8B\xB6\x70\x1A\x23\x03\xAD\x88\xAF\x06\x0B\x30\x8A\x83\x77\xAB\x0E\x0E\x26\x8A\x5A\x16\x30\x09\x27\xAA\x8A\xE6\x13\xAB\x0A\x0F\x35\x8A\x5F\x30\xAE\x85\x03\xA7\x11\x05\x00\x1B\x01\x29\x9B\x21\xDB\x02\xB1\x81\x1A\xA5\x3E\xCA\x89\x8D\x06\x25\x27\x03\xA9\x8B\x96\x87\xF0\x46\x49\x1C\x01\xB4\x80\x2F\x16\x09\xF5\x01\xB5\x82\x26\x94\x81\x7E\x04\x0A\x0A\x2D\x81\x7C\xA6\x0F\x00\x0A\x88\x61\x8A\xD6\x8A\xC6\x7D\xDB\x34\x00\xE3\x8B\xC2\x79\x70\x27", "\x8B\xC0\x8A\xEE\x69\x88\x2D\x8B\x15\x7E\x4B\x6A\x88\x7A\x89\x72\x8A\x20\x78\x97\x0C\x01\xF4\x8B\x9D\x8A\x34\x2C\x00\xF7\x89\xBC\x87\x1C\x97\x29\xF4\x8A\x91\x73\x06\x34\x8B\x83\x0D\x0E\x0A\x88\x4B\x89\x11\x6B\x19\x15\x06\x05\x8C\x13\x04\x1C\x08\x30\xB1\x62\x0B\x8E\xC0\x80\x00\x1A\x68\xAE\x56\x1C\x00\x31\x95\x15\x13\x8C\x44\x01\x05\x15\x8C\xE9\x88\xD4\x7A\x61\x3F\x01\x1B\x8C\x43\x0A\x08\x1D\x8C\x0C\x05\x17\x00\x32\x9F\x8B\xEF\x84\xF9\x1C\x08\x25\x8C\x06\x07\x25\x08\x32\x86\x04\x69\x03\xCA\x8B\x27\xBB\x72\xE4\x1D\x26\x0D\x2F\x93\x04\xA5\x03\xCC\x83\x10\x2E\x63\xB4\x87\x44\x00\x05\x03\x88\x1E\x07\x29\x04\x2F\x8E\x8A\xD4\x0E\x20\x0A\x88\x46\x79\x43\x8C\x83\x8A\x15\x31\x02\x47\x8C\x01\x3B\x34\x82\x8D\x14\x89\xF6\x3B\x0B\x30\x8C\x7F\x56\xCD\x8E\x56\x27\x83\x1F\x6C\xD6\x83\xA7\x24\x02\x5A\x8D\x72\x0F\x0E\xBD\x36\xD1\x02\xD7\x8B\x85\x3D\x64\x86\x87\x50\x09\xF9\x64\x1F\xDC\x02\xD9\x85\xC4\x21\x8D\x53\x46\x8E\x88\x97\x27\x03\x51\x8C\x21\x23\x35\xAE\x04\x08\x86\x91\x41\x0F\x2E\x8D\xBC\x0B\x34\x00\x37\x8D\x8D\x06\x74\x1B", "\x8C\x37\x8A\x0D\xDF\x03\xDF\x8B\xFB\x7D\x36\x07\x01\x1B\x0B\x2C\x86\x0B\xEB\x02\xE1\x8E\x7F\x64\x1F\x12\x02\xE2\x88\x21\x93\x70\x8E\x8C\x01\x64\x7E\x1D\x00\x92\x8E\x88\x8C\x6E\x03\x00\xB2\x67\x4F\x80\x38\x8B\x60\x1A\x18\x0A\x09\x39\xAC\x88\xC6\x3D\xE7\x84\x35\xB7\x84\xE4\x1F\x0C\x03\x3A\xAE\x8B\x5A\x17\x06\x02\x9B\x78\x8B\x62\x8C\x9F\x8D\xD4\x3F\x00\xAB\x8E\x1D\x76\x3A\x28\x00\xA6\x8C\xDE\x84\x28\x9A\x18\x4A\x01\xED\x87\x24\x82\x0F\x34\x01\xEE\x8A\x36\x8B\x8A\x1A\x19\x15\x05\x3B\x88\x8D\xF6\x10\x10\x02\x9B\x4C\x8D\x57\x86\x6B\x5F\x05\x07\x8F\x24\x57\xF2\x87\x3A\x86\x80\x1A\x19\x1A\x05\x3B\xBE\x8B\xC2\x0E\x15\x02\x9B\x68\x8B\xC3\x8C\xF5\x84\x7E\x35\x01\xD7\x8E\x95\x04\x06\x1B\x8F\xD3\x8E\x05\x87\x46\x01\x02\xBE\x8E\x95\x02\x07\x02\x8F\xCE\x26\x07\x89\x91\x69\x8F\xA6\x0E\x1F\x0C\x3E\x9B\x8D\x80\x87\x19\x17\x09\x21\x8F\x96\x6B\xEB\x85\x3E\xA5\x26\x12\x68\xFC\x8A\x55\x17\x02\xF3\x8D\xEC\x8C\x10\x11\x86\x6C\x06\x2B\x0E\x3F\xAE\x6A\x01\x91\xDC\x87\x2D\x84\x51\xB9\x00\xFE\x8E\xF4\x24\x8F\xBA\x8F\xB3\x89\xE6\x05\x03", "\x0E\x90\xBB\x1D\x0B\x10\x90\xDD\x8F\x6B\x86\x83\x55\x90\x9B\x23\x32\x08\x41\xAD\x8F\xE0\x88\x5B\x0D\x0D\x1C\x90\x73\x28\x8F\x62\x48\x3B\x8F\x98\x6F\xFD\x04\x42\x9B\x21\xE7\x02\xFE\x81\x41\x92\x2D\xAF\x09\x3D\x0B\x42\x86\x0B\xF4\x02\x0B\x99\x41\xAB\x81\x67\x11\x00\x0E\x06\x0B\x8B\x0C\x03\x0E\x96\xB5\x53\x04\x68\x69\xDA\x80\x42\x97\x3F\xAF\x0A\x03\x0E\x43\x9A\x8E\x62\x27\x11\x93\xB6\x45\x0F\x80\x6A\xE7\x8C\x1D\xB8\x25\x1B\x02\x12\x95\x23\xA7\x41\x52\x91\xE0\x5F\x90\x0D\x91\x28\x90\x00\x0F\x78\x44\x51\x28\x01\x15\x96\xE4\x73\x00\x55\x93\xE0\x05\x02\x18\x91\x2F\x93\x9C\x3A\x61\x35\x00\x5E\x93\xE8\x11\x46\x93\x04\x31\x00\x19\x97\x43\xA1\x28\x67\x12\x10\x05\x45\xBF\x84\x4E\x03\x1A\x97\x1A\x00\x6A\xB0\x8C\x00\x01\x05\x3E\x0B\xC7\x38\x14\x05\x45\xA3\x59\xC6\x0A\x14\x0A\x35\x3D\x58\x32\x5A\x1E\x5A\x34\x13\x01\xDC\x04\x93\x8C\xB7\x45\x92\x15\x5A\xD2\x04\x05\x3C\x91\x67\x11\x14\x05\x45\xB5\x54\x5A\x17\x23\x97\xA4\x04\x92\x4A\x0E\x15\x05\x45\x8F\x29\x62\x0D\x15\x04\x34\x9D\x04\x5A\x01\x15\x98\x3C\x9D\x04\x4A\x00\xA0\x66", "\xE4\x5E\x92\x4E\x8F\x51\x04\x06\x22\x92\x56\x09\x15\x06\x4A\x9F\x22\x55\x8E\x91\x4E\x06\x29\x91\xA6\x0E\xB0\x62\x44\xA6\x5E\x5C\x8C\xF9\x19\x07\x34\x92\x5A\x14\x1B\x0E\x46\x86\x04\xA8\x90\x43\x0A\x92\x45\x56\xBC\x90\xBB\x18\x07\x3F\x92\xB8\x92\x99\x64\x7E\x0F\x02\xC5\x90\x5A\x58\x4C\x82\x04\xC1\x92\x41\x0D\x36\x69\x39\x9A\x00\x2B\x96\x3A\x10\x02\xAF\x90\x44\x01\x4D\x8B\x6F\x9C\x79\x33\x93\xA7\x1B\x02\xCF\x92\x53\x32\xE7\x46\x49\xAF\x02\x37\x9B\x85\x27\x02\xE1\x93\x36\x9B\xE7\x67\x11\xBA\x02\x39\x96\x2C\x33\x02\xE9\x90\x97\x8C\xDC\x6E\x93\xBC\x0B\x2F\x01\x4F\x92\x5B\xD6\x74\x3D\x9A\x34\x0B\x03\xF7\x91\x43\x5F\x2A\x1B\x03\xFA\x92\xF0\x07\x0D\x3D\x93\x16\x57\xAB\x06\x0E\x33\x91\x56\x0B\x38\x08\x47\xB0\x92\xB2\x8D\x9A\x32\x0F\x01\x94\x62\x0C\x3C\x04\x50\xA7\x54\xAF\x09\x3F\x00\x51\x84\x11\xFC\x03\x44\x9D\xAC\x2F\x0A\x08\x03\x1B\x0F\x20\x8A\x0D\x54\x6F\xB2\x8A\x4E\x8F\x49\xAF\x0A\x04\x0E\x51\xB8\x81\x17\x25\x10\x70\x4C\x9A\x8A\xA0\x68\x07\x07\x52\x9B\x8B\xA6\x0E\x07\x04\xB7\x5C\x8F\x2B\x97\xA8\x84\x8D\x68\x00\x2F", "\x94\xB9\x8A\x55\x2C\x00\x33\x94\x43\x9B\x2A\xA9\x71\x39\x97\x14\x9A\x55\x3A\x00\x74\x6F\x4F\x83\x52\xB2\x8A\x91\x07\x0F\x01\x54\xB6\x8E\x5A\x16\x11\x05\x54\xBE\x94\x27\x5F\x19\x1A\x04\x0B\x95\xD8\x8E\xD8\x02\x05\x34\x6D\x79\x93\x48\x9C\xD8\x6E\x56\x56\x03\x52\x9F\x3B\x97\x14\x4F\x96\x36\x90\xC5\x64\x1F\x61\x02\x57\x9D\xD6\x61\x95\x0C\x07\x48\x9B\xAF\x5E\x04\x6C\x00\x55\x92\xD6\x3D\x94\x62\x97\x02\x9E\x5A\x78\x01\x6E\x96\xE9\x05\x08\x30\x95\x69\x97\x21\x61\x91\x75\x95\xE5\x24\x5E\x95\x53\xAA\x8B\xD9\x3C\x24\x0C\x57\xAC\x1B\xA1\x02\x5F\x99\x4C\xA3\x7C\x78\x24\x27\x03\x58\x9B\x22\xAF\x00\x56\x90\x55\x80\x68\xB6\x37\x62\x93\xA7\x3C\x02\x8E\x95\x5C\x9B\xDC\x69\x39\xB4\x02\x59\x90\x11\x3F\x02\x4B\x97\xE0\x09\x0C\x28\x95\x7F\x94\xCF\x78\x97\x01\x03\x9A\x95\x4D\x0D\x59\x93\x04\x1E\x73\x2D\x90\x4D\x8F\x91\x50\x4D\x69\x96\x10\x19\x03\xA7\x94\x44\x01\x0E\x20\x96\x87\x96\xC8\x84\x7E\x1B\x03\xAE\x95\x9A\x01\x5B\x8C\x04\xED\x00\x6D\x9B\x5A\xB1\x72\x2B\x19\x6E\x95\x27\x3B\x96\x06\x05\x3E\x0E\x5B\xA2\x93\xF9\x86\x0D\x72\x59", "\x88\x08\x1C\x2F\xE0\x05\x00\x35\x71\x79\x93\x15\x0F\x49\x93\x04\x03\x00\xC7\x23\x4A\x93\x04\x12\x01\x1D\x7F\x13\x92\x97\xA9\x90\x4D\x0D\x00\x16\x97\x30\x3A\x76\x9C\x15\x71\x92\x44\x53\x05\x0C\xB1\x1F\x95\x44\x12\x0A\x00\x5D\xA3\x97\x10\x05\xEB\x6D\xDB\x22\x00\xE7\x97\x93\x7B\x5E\xB6\x54\x63\x8D\xF6\x3D\x02\x31\x97\xA6\x0C\x11\x03\x5F\x84\x63\x6B\x8C\x5E\x28\x03\x38\x97\xFC\x5B\x7E\x96\x10\x1C\x97\xA1\x7C\xF9\x13\x04\x20\x97\xA6\x0E\x17\x02\x5E\xB4\x97\x21\x30\xBE\x10\x60\xAC\x1B\x8F\x71\xD0\x8C\x60\x81\x8E\x57\x2B\x83\x9B\x89\x37\x01\x02\x9A\xAA\x37\x38\x99\x3F\x63\x02\x85\x93\xA7\x04\x02\x19\x9A\x40\x04\x60\x83\x7F\x2C\x42\x87\x9B\x85\x11\x02\x21\x98\x00\x03\x62\x93\x4E\xAF\x09\x1E\x06\x62\x86\x0B\x9E\x01\x8A\x9B\x62\x9B\x4E\xAF\x08\x21\x0F\x62\xBC\x0A\xAB\x02\x8C\x93\x27\x8B\x93\x1C\x2D\x55\x94\x44\x38\x02\x75\x70\x4D\x9A\x61\x8D\x94\x58\x53\x8D\x9A\x34\x06\x03\x3A\x9B\xEE\x84\x7E\x26\x02\x46\x9A\xF0\x03\x0D\x09\x99\xB4\x78\x6D\x18\x60\x9A\x15\xE0\x03\x82\x9C\x5F\xBB\x7A\x78\x27\x2E\x03\x65\xAC\x1B\xEC\x02", "\x95\x93\x60\xAC\x94\x4F\x75\x31\x0D\x63\xBB\x5E\x75\x73\x03\x0C\x5E\x9E\x8F\xDC\x57\x98\x96\x3A\x07\x00\x51\x76\x99\x93\x61\xA6\x8F\x1A\x19\x37\x0D\x64\xA2\x0D\x16\x01\x54\x71\x5D\xAE\x8F\x69\x38\x3A\x03\x67\x84\x11\x23\x02\x9D\x97\x66\x91\x95\x1A\x1B\x3C\x0A\x66\x9A\x15\x30\x01\x54\x72\x64\xA2\x98\xED\x69\x9A\x3F\x0F\x3B\x99\xD4\x0E\x0F\x0E\x67\xAF\x99\x35\x5C\x10\x21\x0A\x68\x97\xEC\x13\xA3\x97\x65\x92\x90\xBD\x35\x05\x01\x0A\x7E\x98\x18\x49\x9B\x9F\x67\x98\x67\x11\x7F\x51\x01\x02\x1B\x9A\x56\x0B\x19\x0E\x69\x90\x9A\xC9\x05\xA8\x9F\xA0\x24\x9A\xA6\x0E\x1D\x07\x6A\x97\x9A\x1A\x90\x5E\x29\x03\x2C\x9A\x5A\x15\x21\x0F\x6A\x9F\x99\xB7\x84\x5E\x25\x04\x34\x9A\x40\x82\xA1\x9F\x69\x82\x04\xC0\x84\xAB\x4C\x6B\x9B\x22\xA2\x02\xAF\x98\x6A\x80\x00\x31\x7D\x9A\x3D\x05\x13\x9A\x13\x04\x1A\x01\x0A\x43\x0E\xB0\x02\xA5\x98\x6B\x84\x91\xCB\x58\xB3\x90\x11\x35\x01\xCF\x9B\x44\x0D\x0B\x12\x9B\x43\x98\xB6\x4A\x61\x37\x01\xD6\x98\x43\x02\x08\x19\x9B\xBC\x54\xB7\x98\x68\x89\x82\x85\x55\xB8\x96\x10\x0F\x02\xE4\x98\x43\x07\x0D\x26", "\x9B\x2A\x98\xD4\x6A\x61\x11\x02\xEA\x9B\x40\x0C\x09\x2D\x9B\x06\x07\x78\x72\x61\xB0\x9A\x6E\x17\xAB\x0E\x09\x03\x9B\x02\x06\x2A\x08\x6F\x83\x04\xF1\x77\x09\x90\x11\x18\x01\xDC\x06\x15\x07\xEC\x2C\x02\xA1\x41\x2B\x86\x3A\x19\x01\xDC\x07\x8C\x9A\x68\x8C\x92\x7E\x6E\xD8\x0A\x05\x09\x9C\xC7\x3B\x2B\x01\x0A\x54\x92\xAA\x4C\x77\x00\x71\xB3\x63\xC2\x0C\x2D\x01\x0A\x5C\x92\x44\x13\x16\x03\x5D\x90\x04\xB8\x01\xBD\x9A\x63\x51\x75\x3F\x86\xC9\x9D\x5D\x9E\x04\xC3\x02\xCA\x9B\x85\x10\x78\xAA\x94\x00\x0E\x72\xA0\x83\xAE\x56\x33\x00\x70\x9B\x21\x17\x01\x8A\x79\x47\xB7\x9C\x4C\x79\xF6\x3A\x0D\x3B\x9C\xC6\x08\x09\x0E\x73\x93\x04\x40\x9E\x3A\x78\x97\x26\x03\x44\x9E\x88\x57\x74\x90\x04\x49\x9E\x1E\x4A\x61\x32\x03\x4D\x9F\xDB\x6F\x74\x8C\x04\x51\x9E\x20\x4F\x82\x32\x9C\xC6\x0B\x12\x0E\xEC\x58\x9D\x79\x8C\x11\x59\x00\x14\x4E\x9C\x9A\x3D\x17\x05\x17\x9D\x06\x05\xD6\x93\xFB\x59\x9A\x64\x9E\xF8\x88\x76\x83\x04\x59\x9D\x95\x89\xFD\x21\x00\x6D\x9E\xE9\x01\x07\x2F\x9D\x02\x05\xD6\x99\xD1\x76\x97\x75\x9E\x56\x1E\x07\x38\x9D\x36\x9F\x98", "\x89\xE6\x39\x00\x7D\x9C\xBB\x1B\x08\x00\x9E\x59\x9C\xA5\x7E\x5A\x45\x01\x85\x9F\x5F\x58\x78\xBB\x98\x78\x25\x14\x04\x39\x79\x91\xC6\x09\x29\x09\xE2\x47\x9A\x81\x9C\x91\x99\xFD\x1E\x01\x8D\x9F\x9C\x23\x0B\x0F\x9E\x4A\x98\x5E\x2A\x06\x1D\x9E\xE6\x6C\xE8\x91\x65\x9A\x18\x76\x00\xE5\x44\x69\xB6\x13\xCD\x03\xD7\x99\x76\x8D\x8F\xD4\x61\x20\x0A\x7A\x96\x09\xD9\x02\xEB\x90\x77\xA0\x99\xA0\x04\x23\x03\x79\x81\x32\x29\x7A\x9B\x90\x76\xB6\x94\xA0\x69\x26\x0B\x7B\xA6\x0E\xF4\x01\xEF\x98\x74\x98\x6B\x4B\x98\xE9\x9F\x4B\x54\x7C\x3F\x9C\x9E\x90\x71\x4A\x9F\xBC\x08\x04\x0C\x7C\x87\x9F\xF5\x8E\x86\x1E\x0B\x03\x9F\x5A\x15\x07\x04\xF1\x58\x9E\x59\x9F\x56\x94\x8D\x4B\x03\xD0\x9E\xD2\x0B\x02\x13\x9F\x50\x9F\x58\x98\x97\x17\x03\xE1\x9E\xF0\x08\x03\x24\x9F\xBF\x9C\xA6\x99\xFD\x23\x03\xD8\x9E\x5C\x24\xF1\x7E\x9E\xAF\x9E\x5C\x94\x8D\x70\x03\xF1\x9F\x26\x24\x05\x33\x9F\xD4\x9C\x60\x96\x24\x7D\x03\xF9\x9F\x9C\x23\x06\x3C\x9F\xE5\x9D\x08\x9A\x15\x0A\x00\x73\x03\xBE\x9C\x6E\x33\x7C\x10\x04\xFD\x97\x7B\xB9\x9A\x4D\x37\x05\x09\x80\x8C\x04", "\x94\x9C\xAF\x01\x08\x1B\x9F\xFD\x9C\x0C\x96\x86\x13\xA0\xC5\x0E\x95\x0F\x08\x18\xA0\x05\xA3\x65\x9D\xDB\x31\x00\x1C\xA2\x4E\x9C\xD2\x25\xA0\x85\x81\x80\x2C\x7E\xB5\x9F\xD4\x9A\x86\x1F\x03\x28\xA0\xF5\x88\x43\x0B\x04\x30\xA0\x83\x0E\x2A\x0B\x82\x8F\xA0\xDE\x98\xFF\x40\x83\xBF\x84\x59\x00\x0D\xA3\x11\x37\x02\x37\xA1\xDE\x98\xB4\x5A\x18\x5B\x03\x0E\xAB\x8B\x3E\xA0\x27\x19\x10\xA9\x79\xAD\x8C\x5D\x8A\x11\xA7\x6D\x88\xA1\x0C\x05\x34\x0A\x84\x99\x9D\xD3\x60\xA8\x67\x07\x30\xA0\x79\x90\x21\x00\x85\x9C\x19\x20\xA1\xCA\x8C\x1D\x1C\x01\xC7\x3A\x21\x0B\x85\x82\x2F\x6C\x66\x90\x07\xEC\x08\x02\x30\xA0\x20\x9C\x2B\x20\x01\x27\x9C\x43\x09\x08\x30\xA0\xAB\x9D\x47\x0C\x0E\x0A\xA1\x6C\xA3\xCB\x9D\x11\x14\x02\x70\xA0\x2C\x54\x87\xA4\x97\xAE\x57\x27\x0E\x84\x93\x2B\xD8\x7C\xE6\x95\x87\x9E\x88\x44\x53\x2A\x0F\x87\x80\x33\x81\xA3\x44\x03\x88\xA8\x88\xD9\x3F\x2D\x07\x88\x9B\x22\xC5\x7E\xC1\x91\x27\x3D\x97\xA2\x43\x23\xA3\xA7\x30\x00\x89\xA3\x97\x22\x37\xB1\x42\x79\xA0\x33\x18\xFD\x79\x91\x8B\xA0\x37\x95\x21\x56\xA2\x5B\x23\x12\x09", "\x89\x93\xA2\xB2\x7E\x41\x94\x8A\x86\x0B\x59\x03\x29\xAD\xD3\x1B\x98\x46\x4A\x3C\x0B\x8A\xBC\x0A\x67\x02\x2B\xA3\x10\x21\xA2\xE2\x6C\xF9\x1E\x0F\x33\xA2\x4A\x0D\x1D\x06\x8B\x82\x04\xB8\xA3\xA4\x6C\xB5\x74\x01\x35\x9E\xB1\x03\x08\x3F\xA2\x00\x01\x30\xAA\x78\x94\x63\x16\x00\x31\xA2\x2D\xA6\x0E\x20\x82\x24\xAF\x8A\xA8\x8E\x78\x26\x08\x0E\x8C\x9D\xA0\xA6\x0F\x27\x08\xFD\x4E\xA0\xC0\xA2\x5E\x69\xE6\x2F\x00\xD7\xA2\x09\xA7\xBD\x48\xA3\xC1\xA1\xAB\x70\xAA\x7B\x00\xE1\xA0\xEB\x8C\x6E\x3C\x02\xE4\xA2\xFD\x71\x89\x29\xA3\x4C\x95\x72\x3F\x89\x8A\xA2\xB0\x9C\xA8\x62\x05\x30\xA3\x71\xA3\x44\x07\x0D\x33\xA3\x9A\xA0\xF0\x9F\xD4\x5D\x01\xF0\xA1\x05\xAA\x34\x24\x03\xD8\x7C\x04\x04\x8F\xBE\xA3\xA0\x06\x1A\x01\x90\xB6\x88\x05\xA7\x41\xAF\x53\xA9\x39\x77\x00\x3C\xA5\x76\x9D\x04\x04\x00\x23\x82\x88\x8E\x9F\xD9\x3F\x20\x02\x91\x96\x09\x12\x02\x45\xAE\x90\x80\x9A\xCB\x93\x42\xA6\x3A\x0B\x82\x0D\xA3\x47\xAC\x3F\xA7\x11\x9C\x03\x46\xA6\x3A\x2F\x00\x1E\xA5\x3F\xA3\x40\xAF\x0A\xA8\x02\x4A\xAA\x55\x3D\x00\x2D\xA4\x2A\xAE\x7E\x86\x49\xB4", "\x02\x48\xAE\xE5\x4C\x82\x06\xA6\x4B\xA9\x19\x8D\x35\xC1\x02\x4E\xAC\x6E\x1B\x01\x3C\xA6\x49\xA9\x6A\xA7\x11\xCE\x02\x50\xAB\x89\x2B\x01\x45\xA6\x4F\xA8\x1A\x9A\x18\xDB\x02\x52\xA3\xA7\x3B\x01\x4D\xA6\x4D\xAC\x05\x9A\x18\xE8\x02\x54\xAB\x85\x0B\x02\x8C\x80\x37\xA9\x8C\xA9\x7C\x4D\x35\x3D\x0A\x95\x86\x0B\x9A\x01\x57\xA6\x94\x88\x9B\x72\x2D\x1D\x05\x73\x8E\x00\x6A\xA7\x0F\x90\x11\x29\x02\x35\xA7\x34\xAD\x82\xA4\x1F\x10\x01\x5B\xA0\x53\xA0\x2E\x76\xA7\x12\x9E\xA1\x71\xA5\xB7\xA0\x6B\x99\xE6\x1E\x00\x79\xA6\x3A\xA1\x3D\x41\xA6\x56\x92\x41\x05\x0C\x3C\xA5\xDD\xA0\xBA\x9D\xD4\x2C\x00\x84\xA7\x4F\x88\x03\x04\xA6\x83\x0F\x34\x08\x98\x9F\xA5\xC0\x96\x86\x1A\x03\x0D\xA6\x13\x06\x11\x00\x99\x93\x04\x39\x86\x34\xAD\x97\x89\x97\x44\x88\x61\xA9\x55\x9B\xA6\xA0\x12\x59\xA0\x11\x21\x01\xDC\x06\x19\x07\xEC\x17\x01\x84\xA7\x98\x5E\x0F\x0C\x83\x50\x08\x77\x0F\x05\x07\x3B\x58\x01\x6B\xA4\x0C\xB6\x13\x63\x00\x77\x08\x9A\xA0\x9C\x2D\x58\x2F\x82\x3C\x24\x01\xA9\xA7\xB1\x39\x05\x36\xA6\xD0\x2E\xF0\x0A\x9A\x90\x04\x29\x0B\x19\x1A\x05", "\x18\xA6\x80\x17\x64\xA7\x9C\x87\x63\x68\x34\x73\xAA\x55\x19\x85\x9E\xA6\x40\x0F\x9C\xBD\x34\x0D\x0E\x68\xAF\x47\x2A\x32\x5E\xA7\x75\xA3\x10\x2E\x97\xD9\x3F\x1F\x0A\x9D\xA6\x0E\x2A\x00\x77\xA3\xF4\x75\x97\x46\x48\x23\x03\x9E\x9A\x15\x39\x02\x79\xA0\x11\x1E\xA7\xD6\xA4\x6F\x44\x9A\x9A\x15\x48\x01\x7F\x81\x9F\x90\x04\x69\x00\x26\x9E\x9B\xBD\xA6\x62\x0C\x7C\xA2\x19\x28\x36\xEB\xA4\xBB\x1A\x04\x2E\xA7\x0C\x06\x7F\xA3\x4D\xBD\x36\xA8\x02\x74\xAC\x6E\x19\x01\xAA\x30\xE6\x9E\x9F\xA2\x30\x98\x95\x80\xAB\x3B\x44\xA8\x06\x06\x7F\xAB\x76\x99\x3F\xC1\x02\x84\xA3\xA7\x36\x01\x14\xA8\x07\x40\x8B\x84\x51\xCE\x02\x86\xAB\x85\x05\x02\x1D\xAB\x7D\xAB\x21\x50\xA5\x22\xA9\x70\x15\xA2\x88\x3B\x82\x9D\x6F\x38\x0E\x29\xA8\xBC\x0A\x70\x85\x92\xAF\xA7\x6B\x89\x58\xA0\xA3\x8A\x0D\xB2\x03\x8A\xAE\x9F\x9F\x6A\x4F\x76\x00\x06\x07\x15\xA7\x5B\x21\x30\x0A\xCA\x3D\xA4\x05\xAA\x37\xAD\xDB\x10\x00\x3F\xA8\x05\xA6\x25\x11\x03\x3A\xA9\xBC\x5F\x2A\x1D\x00\x49\xA8\x36\xA4\x65\x8D\xA9\xC4\x8C\xF9\x1A\x02\x11\xA9\xE2\xA3\x9C\x2F\x0E\x0D\xA8\xE7\xA4", "\x96\x9D\xD4\x36\x00\x58\xAA\x60\xA3\xA7\x3D\x03\x5C\xA8\x8D\xA8\x90\x91\x06\x42\x01\x98\xA5\x45\x10\x11\x3D\x89\x04\x0D\xA5\xA8\x99\x4D\x34\x14\x0A\xA6\x98\x9E\xC6\x08\x07\x0D\xA6\xAF\xA9\x70\x98\xF9\x1E\x05\x2A\xA9\x02\xA6\xF0\x0D\x02\x3D\x88\xDD\xA4\x46\xA6\x24\x6B\x01\x7C\xAB\x93\x60\xA8\xB8\xA9\xE2\x78\x9F\x73\xA7\xA4\x54\x3D\x88\x91\xA5\xA1\x89\x9A\xBD\x36\x21\x05\xA8\xA6\x0E\x5B\x03\xA1\xA6\xA6\xAF\xA4\xA4\x77\xA4\xAA\xA7\x56\xAA\x45\xA8\x72\xA4\x1C\x6A\xA9\x63\x59\x1E\x0D\x23\xB7\x07\xFE\xA7\x26\x07\xEC\x21\x02\x6A\xAB\xE0\x06\x2C\x3A\x01\x3D\x8B\xE0\x0E\x9F\x9C\x01\xAA\x9A\x47\x03\x0A\x29\xAA\x56\x08\x1F\x0D\xAA\x88\xAA\x02\x07\x38\x07\xEC\x25\x02\xA0\xAA\x95\x0E\x07\x23\xAA\xB8\xA8\x00\x05\x0E\x07\x3B\xA6\x01\xAF\xAD\x98\x40\xAB\x97\xA8\x03\x27\xEC\x27\x02\xC6\xAA\x56\x10\x08\x08\xAB\x9D\xAA\x17\x5D\x31\x4D\xAB\xEC\x19\x20\x00\xAD\x8F\xAA\x10\x04\x3B\x07\xEC\x29\x02\xD4\xAB\x26\x22\x08\x17\xAB\x1E\xA9\x55\x17\xEC\x2A\x02\xB4\xAA\x92\x47\xAB\x89\xAB\x03\x05\x25\x0B\x70\xA5\xAB\xB5\x9B\xB9\xA1\xAD\x87", "\x04\xC7\x3A\x2B\x0D\xAD\xB3\x29\x87\x00\xB8\xA6\xA2\x86\x04\x8B\x01\xC6\x9C\xAE\x95\x49\xEE\xA8\xB6\xAC\x10\x32\x03\xC7\x39\x2C\x03\xAF\x9B\x21\x75\x8B\x90\x51\xAC\xAB\x95\x1D\x06\x2C\x0B\xA8\xA9\x20\x77\xA8\xBA\xAD\x73\x71\xAA\x1D\x04\x30\x0B\xB0\x85\x21\x0D\xAF\xBB\xAF\x94\xA4\x1F\xCE\x03\xC4\xAC\x6E\x2D\x02\x15\xAE\xBF\xA1\x6B\x8D\x35\xDC\x02\xC6\xAB\x89\x3E\x02\x1D\xAD\xB8\xAC\x10\x39\x02\xC7\x3A\x3A\x0A\xA6\x8E\x9C\xF9\x15\x8F\x87\x70\x3E\xA7\xBA\x03\xB1\x3D\x0E\x2B\xAC\x56\x0A\x34\x0E\xB2\x81\xAB\xBB\x03\xB1\x30\x0F\x34\xAC\xA6\x0D\x35\x07\xB3\x8E\xAC\x00\x00\x2F\x07\xEC\x33\x03\x3C\xAE\x56\x18\x0D\x3F\xAC\x16\xAD\x22\x37\xEC\x36\x03\x45\xAC\xBB\x1B\x0D\x08\xAD\x1E\xAF\x40\x0E\x0C\x07\x3B\xF9\x03\xBE\xAB\x89\x1E\x03\xFD\xAA\xC9\xA6\x10\x15\x03\xC7\x3B\x3E\x06\xB5\xB3\x29\xE0\x01\xD6\xA7\xAF\xB2\x8B\x67\x11\x3F\x02\xB2\xB3\x29\xE2\x01\xA3\xA1\xAC\x9A\x02\x0F\x7B\x1D\x01\x07\xAC\x1B\xF2\x02\xD8\xAC\xA2\x9C\x06\xC7\x39\x03\x0E\xB6\xAE\xA5\x0C\x07\x03\x07\xB7\xBB\x81\x10\x04\x3D\x02\xB7\xBE\xA7\xC1\x99\x6F", "\x31\x01\x3B\xAD\xFE\x0F\xA5\x5A\xB6\x80\xAD\xC9\x99\x6F\x3F\x01\x04\xAE\xE9\x0C\x92\x3C\xB8\x85\xA6\x52\x04\xBD\x81\xA8\xA2\x1C\xFA\xA6\xD8\x0E\x02\x0F\xAE\xAA\xA8\xAF\x0E\x9F\xAC\x62\xA0\x68\x0C\x0F\xB8\xB9\x91\x3D\x00\xE6\xA3\x11\x15\x00\x92\xAD\xB0\xA8\x31\xB3\x71\x9F\xAC\x8F\x22\xBA\x89\x3C\xA5\xAC\xD0\xAB\x45\xAE\x56\x4E\x01\xEA\xA0\x75\xAB\xAE\xDE\x4D\xEB\xA9\xB4\x9B\x51\x57\x56\xEC\xAB\xD8\x74\xAE\x06\x06\x10\x06\xBB\x91\xAD\x70\x92\x25\x7F\xB8\x98\x9E\x7A\x00\xEF\xA9\x15\x74\x8B\x8E\xAB\x40\x07\x06\x2D\xA1\xDC\x4B\xE3\xA3\x91\x93\x04\x61\x00\xBD\x88\x79\x8B\xAF\x76\xA3\x44\x08\x08\x0E\xAF\x56\x0B\x1B\x02\xBD\xBB\x22\x7C\xA0\x35\x64\x09\x3A\xAE\xEC\x19\x1F\x0F\xBB\x8A\xAF\xB9\x90\x5E\x21\x0A\x20\xAF\x9B\x23\xCB\x83\xA3\xB1\x45\xE8\xA7\x86\x68\xBE\x9F\x93\xE3\xAE\x40\x04\xBD\xB7\xAE\xBD\x37\x2E\x06\xBC\xB3\x29\xAA\x02\xCF\x82\xBF\x9C\x07\xF9\xA4\x6F\xA5\x8F\x7B\xA7\xEE\x1C\x25\xA9\xE6\x3D\x02\xEF\xAF\x16\x2C\x0A\x31\xAF\x00\x03\xFC\xA2\x4D\xAF\x0A\xCA\x00\xF6\xA6\x3A\x17\x8D\x40\xAA\x02\xB2\x8A\xB1\x84", "\x05\xB1\xFB\x68\xC0\x92\xB0\x11\x84\x7C\x85\xC1\xBC\x0A\xD8\x03\x05\xBF\xA1\xAE\x56\xF0\x03\x06\xBA\x34\x34\x8D\xEB\xAE\xA2\x02\x4F\x8D\x4E\x22\xB2\xF0\x06\x0F\x1E\xB0\xF8\x90\xD7\x68\x07\x0A\xA0\x9B\x21\x01\x05\x3B\x9E\xA5\x18\xB0\x5A\x67\xB9\x2F\xB0\x4A\xAA\xE9\x04\x01\x33\xB0\xDC\xAC\x35\xAD\xD4\x24\x00\x38\xB2\x0B\x13\xEA\x35\x8E\xC9\xAF\xFE\xAA\x79\x86\x49\x32\x01\x10\xB9\x3B\x16\x09\xAA\x8D\x09\xB4\xBE\xA1\x9E\xB3\x8E\x12\xBD\xB8\xA6\x0E\x42\x00\x0F\xB0\x11\x35\xB0\x4E\x74\x68\x0C\x04\x12\xB1\x31\xA0\xBB\x11\x05\x35\x8E\xD3\xAD\x3D\xAF\xD4\x58\x01\x5C\xB3\xF3\xA7\x16\x60\xB1\x3D\xB0\x9C\xA9\xE6\x24\x01\x5C\xB0\x9D\xAC\x2B\x2D\x01\xB5\x8E\x9B\xA7\xC5\xB8\x9E\x91\x06\x1C\x0D\xC6\xBE\xAA\x71\xB1\x1A\xB9\xA7\xB8\x25\x80\x00\x17\xBD\xA7\xA2\x0D\x8F\x02\x15\xBC\xBE\xB7\x66\xAF\x09\x23\x0E\xC7\x96\x09\x9E\x02\x20\xB6\xC2\x95\x9F\x6A\x43\x1D\xB6\x3A\x2D\x02\x44\xB2\x1E\xB7\x92\x9A\x18\xA8\x03\x21\xB6\x3A\x3D\x02\x8A\xB3\x13\xB8\xA9\x9A\x18\xB5\x02\x25\xB6\x11\x59\xB2\x46\xB0\x43\x09\x0E\x07\x3B\xC2\x00\x17\xB3", "\x66\x5B\x03\xB5\x8F\x7D\x05\xC3\xA6\xAA\x67\x13\x30\x0C\xC5\x99\xAE\x4A\x0C\x37\x05\x3B\x83\x0E\x35\xB0\xAC\xAE\x48\x6F\xB2\x56\x0A\x37\x03\xCB\x92\xB2\xB9\xAB\xB1\x37\x0C\x26\xB2\x56\x08\x38\x09\xCA\xBC\xB2\xC2\xAB\xB1\x38\x0C\x00\xB3\xA6\x0D\x38\x03\xCC\xB3\xB1\xA0\x13\xB1\x39\x0C\x08\xB3\x5A\x16\x38\x0B\xCC\x83\xB2\xD2\xAB\x19\x1A\x0C\x10\xB3\xEC\x1B\x38\x03\xCD\x8B\xB2\x0C\x06\xB6\xA7\x46\x0B\x03\xD8\xB3\x26\x24\x0E\x1B\xB3\x9A\xB2\x41\x0D\x07\x07\x3B\xCC\x00\x2E\xB6\x3A\x25\x03\xBB\xB0\x33\xBB\x30\x07\x3B\xCE\x02\x3A\xBA\x55\x27\x03\xED\xB0\x35\xB0\xAF\x96\x77\xE1\xB3\x9C\x29\x0E\x24\xB3\xA1\xB0\xBE\xA7\xEC\x11\x03\xF2\xB0\xBB\x1A\x0E\x35\xB3\xDC\xB0\x34\x67\xEC\x13\x03\xF9\xB3\x16\x2C\x0E\x3C\xB3\x09\xB3\x66\x7E\x20\x4E\xB2\xF5\x71\x1E\xBE\xCE\xBF\xA4\x69\x3A\x38\x00\xD1\xBF\x6B\x12\xB6\x3D\xB7\xB1\xB8\x25\xF0\x03\x45\xBB\x89\x0F\x00\x55\x92\x1C\xBA\xD1\x87\xA5\x2F\x22\x47\xB3\xA7\x20\x00\x21\xB4\x31\xB8\xB2\xA7\x11\x0C\x01\x1E\x00\x11\x2C\xAC\x33\x41\x15\x97\x70\x35\xB0\x31\xAF\x19\x1F\x00\x2E\xB4\x09", "\x7A\xE9\x04\x03\x32\xB4\xC4\xB1\xCE\xA1\x47\x38\xB4\x38\x13\x93\x7C\xD3\x93\xB4\x54\x26\xDA\x60\xD4\x83\x04\x30\xB7\x40\x0A\x03\x03\xB5\x23\xB4\x00\x0D\x0B\x32\x6D\x47\xB5\xDB\x66\x3A\x3D\x00\x4C\xB5\x41\xB2\xB5\x87\x3B\x1B\x01\x54\xB0\xB9\xB3\x29\x40\x02\x1D\x9D\xD4\x9C\xAD\x6C\x4A\x56\xB0\xCB\x82\x0F\x72\x93\xDB\xA5\xCE\xA4\xAD\x1A\x1B\x07\x0A\xD5\xAE\xB1\x4A\x0C\x11\x05\x45\x85\xB1\x0D\xB4\x44\x0C\xB6\xA7\x11\x2D\x02\x58\xB6\x25\x14\x01\x5E\xB6\x55\xB2\x10\x1D\x02\xC7\x3B\x0B\x06\xD7\x90\x04\x31\x03\x5F\xBC\x10\x1A\x92\x66\xB5\x3F\xB0\x59\x9A\x18\x33\x03\x5A\xB6\x25\x18\x01\x6F\xB4\x31\xB9\xB8\x99\x3F\x41\x02\x56\xB9\x47\x8E\x01\x82\xB6\x41\x08\x06\x15\x91\x34\xB0\x77\x0B\x06\x15\xAE\x44\x10\x14\x05\xD9\xBB\x4E\x0D\x8E\x86\x12\x05\x12\xB6\x13\x07\x17\x0F\xD9\xB4\x0A\x98\xB4\x31\xB7\xBA\xA0\x6A\x61\x00\x69\xB0\x11\x2E\x01\xA7\xB5\xB6\x59\xDA\x84\xB5\x67\x3B\x9F\x2E\xDA\x82\x49\xB1\xB5\x25\x03\xDB\x8D\xB5\x2E\x68\xA8\x6F\x07\x37\xB6\xE2\x09\x6C\xB4\x0A\x3B\xB6\x7A\xB7\x54\x48\x2F\x4A\xB6\x10\x04\x27\x01\xDB", "\xB3\x02\x8D\xB4\x44\x08\x06\x3C\xAF\x9C\xB6\x21\x90\xC0\x94\x0F\xFD\xAF\x2C\x27\xEC\x1E\x02\x5A\xB6\x1A\xAA\x34\x2A\x01\xDC\x07\x73\xBE\xBF\x92\xB7\xFC\xA4\x11\x1B\xD9\xB0\x19\xD1\xB5\x23\x93\xDD\xB2\x26\xC1\xA7\x19\x1F\x09\x31\xB6\xC6\x0B\x30\x0F\x47\x93\x04\x6C\x00\x77\x07\xCE\x95\x4C\xEC\xB4\xAF\x04\x0C\x2F\xB7\xAF\xB4\x77\x0D\x06\x07\x3B\xA3\x01\x7D\xBD\x0B\xB6\x13\x6F\x02\x7E\xBB\xAB\xBE\xB7\xE7\xB5\x47\x00\x07\x32\xB7\xCB\xA9\x76\xB7\x9B\x9D\x04\x72\x00\xF3\xA3\x10\x28\x02\x5A\xB5\x3E\xA0\x11\x05\x03\x55\x91\x1E\x9D\xE0\x95\xAF\x10\x07\x2C\x01\xE1\xB5\xAC\x15\xBA\xF3\x4D\xBD\xA0\x6A\xBE\x02\x56\xB6\xC6\x8C\x04\xDF\x01\x15\x98\x79\x97\xB8\x84\xA2\x6B\x5A\x0C\x22\xB8\x56\x09\x3B\x06\xE2\x9E\xB8\x29\x67\xAB\x06\x0D\x2C\xB8\xA6\x0F\x3E\x0F\xE2\xB5\x24\x02\xB1\x6F\x32\x0E\x34\xB8\x5A\x15\x02\x0B\x54\xA7\xB8\x9B\xA1\x9A\x3E\x0E\x1B\xB8\xA6\x0F\x05\x0B\x54\x96\xB8\x61\x9E\x6B\x59\x0F\x3C\xB8\xEC\x18\x09\x0F\xE3\xB0\xB8\x14\x9A\x86\x15\x00\x3B\x2A\x23\xBA\x41\x02\x03\x0F\xB9\x38\xBB\xF6\x68\x97\x11\x00\x54\xBB", "\x16\x48\xE5\xAB\x1C\x27\xB1\x6F\x3D\x01\x1D\xB9\xA6\x0E\x13\x0F\xE5\xAD\x0A\x2D\xA9\xF6\x39\x02\x24\xB9\x5A\x14\x17\x07\xE6\x93\x4E\x35\xAB\x28\x6C\xE6\x90\x98\x6F\xBA\x40\x08\xE2\x85\x94\x67\x11\x10\x0B\xAB\x3F\xB1\x8F\x8B\x52\x9E\x95\xB7\xB9\xAA\x6B\x19\x1E\x04\x33\xB9\x9B\x23\x21\x05\xE7\x88\x18\x4E\xAA\x72\xA4\xE8\xB3\x29\x95\x03\xA1\xB0\xE8\x9B\x94\x70\x2B\xAE\x22\xE1\x8C\x04\xA3\x03\x91\xB0\xE5\x86\x04\xC9\x4D\x6F\x31\x07\x12\xBA\x56\x08\x2C\x06\xE9\x99\xB9\x6A\xB1\x6F\x3C\x07\x3B\xB9\x8C\x63\x52\x90\xD7\x8F\xBA\xD3\x4E\xBE\x34\xEA\xA6\x0E\xCD\x02\xA9\xB7\xE9\xA9\xAB\xAF\x0A\x25\x0B\xE8\xA2\x6B\x8E\xBA\xA0\xA4\x44\x62\x02\xB3\xB8\xE3\x85\xEB\x8C\xB2\x78\x26\x2B\x0B\xEA\x9A\x15\xF9\x02\x9F\xBF\xEA\x82\x04\xDE\x9C\xA8\x6B\x0B\x39\xBA\xBC\x08\x02\x0C\xB1\x00\xB9\xC7\x8A\x86\x17\x0C\x08\xBB\x26\x3B\xB2\xB3\xEC\x80\x00\x73\x01\x79\xB5\x71\xBF\xAF\x62\x0C\xAA\xB8\xB0\xA1\x32\xBF\xB9\x93\xBC\xB1\x27\xBA\x0E\xB5\x53\x30\x0E\x1D\xBB\x9B\x20\x0D\x0F\xED\x93\xBB\x84\x55\x53\x3D\x0E\x24\xBB\x73\x28\x11\x07\xEE\xA0", "\xBA\x1F\xAD\x9A\x3A\x0F\x2C\xBB\x5B\x20\x15\x0F\xEE\xA0\xB9\x10\xA1\x9A\x37\x00\x05\x43\x7C\xB8\xF5\x04\x06\x1C\x2C\x7F\xB8\x58\xA9\xE6\x14\x00\xFC\xBA\x95\x03\x07\x00\xBC\xD3\xBB\x63\xB6\x24\x61\x00\xC5\x43\x4F\x8D\x02\x05\x43\x83\x0E\x20\x02\xED\xB0\xBB\xD2\x84\xAF\x1D\xF0\xA2\x34\x10\xBF\x44\x00\x09\x13\xBC\xF8\xB9\x0E\xA8\x97\x3D\x00\x17\xBE\x0A\x19\xF1\xAB\x06\x1C\xBC\x9A\xBA\x98\xA9\x39\x4B\x01\xC8\xB4\x8C\x63\xBC\x0C\x04\x2B\x05\xF2\xB0\xB9\x95\xA4\xF9\x19\x05\x2A\xBC\x06\x05\x19\x0C\xF2\x8B\x87\x2F\xBE\x9D\xBD\x09\xA9\x39\x67\x01\xC1\xB0\x11\x34\x01\x37\xBF\x40\x08\x0C\x08\xBC\x10\x05\xB5\xB0\x11\x3C\x01\xD6\xB9\x26\x71\xF4\xB3\x29\x74\x00\x77\x03\xD6\xB3\x95\xC5\x43\x98\x57\x0D\x1C\x2C\xF7\x05\xD3\xB0\xD8\xAD\x98\x51\xBE\x95\x08\x0D\x14\xBD\x13\x06\xD5\xBC\x10\x1D\x00\x1D\x0D\xD6\xB6\x3A\x19\x03\x5C\xBF\xCF\xBC\x1D\x16\x00\xAF\x0B\x1E\x02\xF6\x9A\x15\xDA\x01\xD9\xB1\x2D\x66\x1C\xAF\x08\x1F\x0B\xF6\x8E\xAD\x6E\xBE\x41\x0E\xF5\x9D\x1C\xAF\x09\x1F\x03\xF7\xB6\x4A\x75\xBF\x40\x07\xF7\x83\x04\x1C\x02\xA5", "\x2B\xF7\xB3\x29\x72\x9A\xC1\xA6\xF6\x85\xA3\xE1\xA7\xE0\xBB\x85\x1E\x03\x7D\xBE\x40\x0F\xF7\x82\x95\xE4\x1C\x20\x0A\xF8\x86\x0B\xDF\x01\xE3\xBA\x54\x1C\x07\x1B\x03\xAB\x01\x08\x13\xBE\xBC\x08\x38\x06\xF9\x8F\xBE\xC2\x4D\x6F\x32\x08\x1C\xBE\x4A\x0D\x38\x0F\xF9\x9C\x07\x24\x9C\xA8\x63\x08\x24\xBE\xC2\x0E\x38\x07\xFA\x98\x4E\xD9\x3C\x21\x0C\xFA\x97\x7B\xAF\xBC\x7F\x0B\x8E\x33\xBE\x44\x10\x39\x05\xFB\xB0\x1E\xEE\x48\xEE\xB4\x3D\x25\x03\xBB\xBD\x62\x47\x01\x8A\xBE\x88\x03\xD2\xB2\x19\x16\xBE\x75\x02\x83\xB4\x1A\x45\x43\x93\xBA\x41\x07\x0E\x1C\x2C\x79\x91\xF2\xB8\xE1\x8B\x0C\xCC\xBE\x8D\x80\xFD\x93\x04\xD2\xBC\xCE\x94\x8D\x60\x02\x34\xBF\x26\x21\x00\x21\x42\x98\x9D\xF6\xB1\x74\x86\x49\xAC\x01\xF7\xB3\xA7\x0F\x00\xE0\xBC\xF6\xBD\xBE\xAE\x56\xB8\x02\xF9\xBB\x85\x1D\x00\xE9\xBF\xB5\x99\xE3\x99\x3F\xC4\x02\xFB\xB6\x2C\x2B\x00\xF1\xBC\x43\x02\xFE\x80\x84\xBC\x79\xF5\xBC\xC4\x61\x42\xD1\xBD\x92\xB4\x8D\x5B\x03\xF6\xBC\xAF\x06\x04\x39\xBF\x06\x07\xFE\xB9\xC1\xA4\x1F\xE7\x01\x01\xCE\x48\x88\xC0\x3F\x8F\x07\xB4\x8D\x73\x03", "\x0E\xC2\xF0\x02\x06\x10\xC0\x02\x06\x02\xC4\xE8\x71\x1C\x15\xC2\xD8\x00\x07\x18\xC0\x00\x02\x06\xC9\x12\x86\x49\x0B\x00\x1F\x08\xF8\x8A\x0D\x7E\x00\x08\xCA\x01\xCB\xA3\xA0\x6B\x05\x06\x02\xCF\xA3\x5A\x14\x23\x0A\x02\xD0\x9E\x4D\x37\x08\x0F\x02\xD2\xA9\xEC\x1A\x26\x01\x0A\x5E\xA5\x1A\xC1\xA9\x74\x44\x70\x00\x37\xC1\x96\xAB\x85\x29\x02\x33\xC0\x14\xB6\xFE\x01\xC1\x62\xAB\x16\x27\x0B\x05\xC1\xA7\x9C\x91\x88\x04\xF1\xA3\x6C\x28\x00\xCA\xFE\x9E\xA9\x69\x3B\x14\x0F\x04\xCD\xBF\x03\x06\x34\x02\x05\xF2\xBF\x67\xAA\x5F\x0E\x05\x0F\xC1\xFD\xBA\x3D\x1F\x0D\x21\x42\x70\xB6\x06\xCF\x15\xBE\x05\x6B\x00\x18\xC6\x25\x2F\x03\x64\xC3\x14\xCF\x90\xBD\x36\x78\x03\x13\xC5\xE5\xB2\x05\x4C\xC2\xB6\x75\x63\xB2\xC1\x56\x09\x03\x04\x39\x61\xBF\xB9\x8B\x19\x10\x09\x2A\xC1\xA6\x0F\x06\x04\x39\x7C\xC0\x90\xA9\xF6\x3D\x09\x38\xC1\xE4\xA7\x1E\xCE\x06\xD0\x67\xAF\x09\x2A\x08\x08\xDA\x15\x38\x02\x22\xCC\x05\xF7\xA4\x44\x51\x2D\x00\x08\xCD\x95\x94\x4D\x19\xC1\xEE\xA4\x73\x97\xC0\xBB\x16\x05\x19\xC2\x8B\xC3\x46\xB1\x0B\x5D\xC2\x9B\x22\x19\x00", "\x0A\xD3\xC2\xF1\xB9\x6F\x3C\x0D\x24\xC2\x1B\xAB\x29\xCA\xFF\xBB\x76\xD9\x3D\x3A\x0C\x0A\xDB\x21\x86\x03\x20\xC1\x0A\xC0\x9B\xAF\x0A\x3D\x03\x0B\xC6\x0B\x95\x02\x2D\xC8\x0A\xF8\x90\x1A\x1B\x00\x0D\x07\x35\x9C\x0F\x03\x30\xC8\xB7\x86\x04\xA4\x02\x24\xCF\x0A\xD5\x77\x67\x5E\x31\xC7\x97\xBA\x59\xCE\xC2\x5E\xA2\x10\x32\x02\xCA\xC1\x02\xCE\x97\x8A\xAE\xD1\xC1\x12\xCB\x02\x19\xC3\x5B\xB4\x00\x00\x0C\x15\xC3\x11\xC3\xC9\xBD\xDB\x2D\x00\xDC\xC3\x4F\x89\x03\x1C\xC3\x83\x0E\x33\x00\x0E\xD9\xC0\xF2\x98\x4F\x45\x0E\xF7\x78\xE8\xC1\xE5\x5B\x0E\xE1\xC0\x3B\xBD\x6F\x39\x04\x1C\xC3\x79\x92\x15\x01\x0F\xD0\x04\xEA\x02\x2F\xCC\x10\x36\x01\xE9\xB6\x86\x18\x05\x1C\xC3\x63\x59\x3E\x04\x39\x77\x07\x77\x01\x40\xC2\xF3\xBB\xC3\x5A\x16\x3E\x04\x39\x4E\x87\x08\xBB\x19\x1B\x05\x0C\xC4\xEC\x18\x3F\x0F\x10\xD3\x04\x78\x01\xF6\x11\x01\x44\xC4\x0B\xB9\x53\x1A\x11\xE6\x0E\x83\x0E\x17\x0C\x11\xC5\xA7\x62\x0D\x1E\x0C\x1D\x09\xC4\xA6\x0E\x76\xB5\xE0\x93\x04\x7A\x00\x77\x00\x10\xDF\xB7\xE6\xB5\x78\xB4\x3D\x3B\x01\xDC\x06\x06\xCB\x48\xBF\xB7\xD7", "\xB8\xF5\x08\xF4\x87\xBE\x2B\x5B\x4A\xCB\xD6\x2F\x11\x49\xBC\x49\xC7\xF1\x1C\x07\x81\x01\x50\xCA\x55\x06\x0B\x7E\x00\x77\x02\x08\x06\xC5\x4D\x1D\x06\x2C\x1D\x3F\x01\xC7\x3B\x17\x04\x11\xE4\xA1\x4A\x0D\x51\xC0\x11\x10\xC5\x69\x2B\x54\xCA\x63\x7C\x0A\x4B\xC4\x44\x00\x08\x0C\xC5\x54\xC6\xF0\x03\x08\x2D\x20\xC7\x3B\x18\x03\x12\xC7\xC5\xBC\x0B\x58\xC0\x11\x39\xAB\x67\x10\x19\x07\x16\xCD\xC5\x4A\x0D\x21\x09\x47\x20\xC5\x02\x05\x19\x0A\x15\xF4\xC2\x44\xC4\x5D\xCB\xE0\x07\xC4\x13\x06\x21\x0A\x14\xFA\xC5\x32\x1C\x5F\xC0\x11\x07\x02\xCA\xBD\x02\xBC\x0D\xD8\xC1\xAA\x08\x0C\xB2\x10\x04\xC6\xD3\xBD\xAB\x07\x18\xF9\xC1\x58\xA3\x44\x0C\x18\xDA\xBF\xA0\x69\x1F\x0F\x0E\xE5\x5F\x30\xA0\xE6\x93\x19\xE3\xBF\x44\x51\x22\x07\x19\xDA\x15\x28\x01\x66\xC2\x19\xEB\xBF\xD4\x61\x25\x0F\x19\xCE\x1E\xA2\xC7\x60\xC3\xFF\x86\x49\xA1\x03\x69\xCB\x89\x04\x01\xA9\xC4\x43\x0B\x19\xFC\xBF\x78\x25\x2B\x0F\x18\xE6\x0E\x52\x01\x64\xCA\x1A\xCD\x98\x36\x3E\x6B\xC3\xA7\x1F\x01\xB1\xC6\x41\x03\x1B\xCB\xC0\x78\x24\x31\x0E\x1B\xC3\x4F\xC1\xC7\x40\x03\x1C", "\xD9\x84\xD6\x77\x71\xC6\x2C\x3B\x01\xC9\xC7\x62\xC1\xE6\x99\x3F\xDC\x02\x73\xCC\x2B\x2F\xA1\x40\xAB\x72\xC3\x02\xC4\x51\xE8\x02\x75\xCA\x34\x17\x02\xD1\xC4\x00\x0B\x1C\xEC\xC0\x4F\x74\x3D\x0E\x1D\xC2\x0F\xA5\x01\x78\xCB\x1C\xFC\xA8\xA0\x04\x00\x0E\x07\x0A\xC6\x5B\x23\x2C\x00\x83\x9E\xA5\xCB\xC6\x0F\xCE\x5A\x4D\x00\xEF\xC4\x0C\xCF\xEB\x6A\xC7\x89\xBA\x86\x19\x01\x39\xC7\xCF\xC3\x26\x20\x0D\x3C\xC7\x55\xAA\x24\x60\x20\xE4\x8E\xEC\x1A\x37\x0A\x1B\xF2\xC6\x62\xB0\x68\x00\x03\x07\xC8\x90\xBF\x26\x2B\x0E\x0B\xC8\xC2\xC4\x1D\xBE\x17\x3B\x00\x10\xC8\x00\x01\x06\xDD\x04\xF8\x00\x0C\xA0\xD7\x8B\xC7\x67\xC0\x5B\x08\x04\x19\xC8\x1B\xCB\x44\x08\x00\x30\xA3\x1F\xC8\xF2\x98\x97\x15\x01\x19\xCB\x1C\xC2\x10\x18\x00\xF0\xA2\x66\xC6\xEB\xAE\x56\x61\x01\x8B\xC6\x25\x26\x00\x31\xCB\x68\xCC\xEB\x8D\x35\x6D\x00\x89\xCD\x66\x70\xA3\xF4\xC5\x21\xC6\x24\x7A\x01\x36\xCA\xE9\x03\x04\x39\xC8\xBB\xC7\x26\xB4\x7E\x06\x02\x45\xC8\xBF\x58\x24\xCC\xC8\xF6\x9C\xA8\x62\x09\x3E\xC8\xA6\x0F\x17\x08\x22\xFA\xC8\x94\xC1\x1F\xA4\x25\xDA\x15\x6F\x03", "\x95\xC9\x24\xE9\xC2\xD9\x3C\x2B\x0B\x25\xEC\x1B\x7F\x02\x97\xC0\x25\xFE\x9F\x0C\x93\x98\xCB\x89\x0F\x02\x66\xC9\x85\xC9\xEF\xBD\x36\xC6\x02\x9A\xC3\xA7\x1F\x02\x40\xC8\x96\xCA\x81\x9E\x52\x72\xCA\xD6\x55\x27\xDF\xC9\xC0\xC2\xD9\x4D\x24\xE7\x51\x19\xCB\xE0\x0D\x0B\x0F\xC9\x6E\xCB\x5C\xA4\xB5\x3F\xC9\x03\x06\x3E\x01\x28\xD3\x04\xCB\x00\xA1\xCA\x1C\xD7\xC3\xD9\x3C\x3F\x08\x28\xCF\x33\x7F\x01\x61\xBB\xA3\x4E\xCA\xD2\xC6\x38\xC9\xFD\x0A\x00\x95\xCA\x7E\xC3\x10\x16\x00\x9D\xC8\xDF\xAC\x10\x27\x03\x98\xCA\x78\xCD\x0E\xF8\x25\x18\x01\xA8\xC2\x04\xE4\x00\xAA\xC9\x0A\xA6\x10\x22\xA5\xD9\xC5\x3D\xC9\xFD\x26\x00\xAD\xCA\x86\xC3\x11\x33\x00\xB5\xCB\xE0\x03\x00\x04\xA6\x5E\xA4\x22\x0A\x10\xF8\x25\x35\x01\xAD\xC3\x66\x52\x00\xC4\xA6\x1B\xAC\x1D\x04\x02\xC7\x3A\x0D\x02\x2C\xDD\xC4\x10\x06\x22\x0C\x1D\x3E\xCA\x30\xC5\x4E\xC1\x13\xC4\x11\x6C\xC4\x43\x02\x17\xD1\xCB\xCC\xCA\x41\x75\x18\xF7\x00\xB5\xC8\x62\xC0\x00\x13\x00\x22\xA8\x23\x04\x1D\x5A\x18\x42\x01\xB7\xC6\x25\x20\x00\xE1\xCB\x87\xBF\xD4\x4D\x01\xB5\xCA\x8B\xC0\x00\x2D", "\x00\x84\xA4\xE6\x92\x2E\xED\x97\x64\x45\xBB\xC6\x6E\x71\xCB\x13\x07\xBC\xC2\x4C\xA8\x0B\xF6\xCA\xE9\x09\x04\x38\xCB\xB2\x7F\x6A\xC4\x44\x71\x01\xFD\xC8\x41\x80\x30\xDA\xCB\xF8\x73\x65\x46\x2E\xE6\x0E\x65\x01\xBA\xCC\x1B\xF8\x1D\x05\xCF\x02\xA7\x30\xE2\x0B\xE3\x90\x11\x54\x09\x11\xCC\x9B\x20\x20\x03\x31\xC3\x04\xFA\xCA\x41\x02\x77\x86\x49\xA0\x00\xC6\xC3\xA7\x0E\x02\x1B\xCD\xBC\x43\x1D\xE4\xBF\x22\xCF\x16\x2C\x09\x25\xCC\x2B\x31\x9A\xB6\x24\x78\x02\x29\xCE\xAB\x8C\x32\xDD\xCC\xD5\x7C\xF9\x14\x0C\x31\xCC\xBC\x08\x2E\x03\x33\xF4\xC0\x69\x38\x34\x05\x2B\xE5\xC8\x10\x06\x31\x0C\x2B\xF9\xCB\x46\xA9\xF6\x3D\x0D\x38\xCC\x4A\x0D\x35\x0B\x33\xC6\xC1\xBD\x35\x3A\x08\x34\xC2\x0F\xE3\x03\xD2\xCD\x04\xF8\x25\xF5\x03\xC2\xCA\x55\x31\x03\x0E\xCF\xA4\x8F\x0E\x40\x02\x8B\x8C\xAF\x0E\x0F\x19\xCD\x7B\x30\xC4\xA3\x11\x0B\x00\x5C\xCD\x0E\xBA\x55\x0B\x00\x6A\xA8\x5C\xB4\x33\xCF\x6B\x62\xCC\x44\x08\x01\x25\xCD\x38\xC3\x26\x2B\x01\x29\xCD\x44\xCF\xB4\x72\x89\x70\xCD\x42\xC3\xFD\xB7\xB6\xAD\xCC\x84\xB3\x19\x11\x03\x38\xCD\x49\xC2\xB1", "\x09\x03\x3B\xCD\x6B\xCD\x57\x57\x46\x3D\x00\x80\xCE\xAD\xC2\x20\x6A\xA9\x5E\xA5\xE1\xC5\xEC\x8F\x75\x4A\x01\xE2\xCE\x2E\xD6\x01\x84\xCE\xF9\x9D\xD4\x16\x01\x92\xCE\xF8\x85\x39\xD1\xC9\x4F\x76\x18\x09\x38\xC0\xCD\x2B\x1C\xDD\xC1\x30\xDC\xCE\xA0\x07\x1B\x0F\x39\xD0\x6A\xA2\xCC\xC2\xC8\x26\xEE\x56\x7C\x03\xE9\xC0\xD9\x69\xCE\x14\xCE\x01\xA7\x14\x09\x02\xAE\xCC\x1C\x60\x3B\xDC\xCC\xB0\xC2\x91\x46\x09\x35\xCE\xEC\x1A\xC2\xAE\xC4\xA6\xCC\xFA\x89\x70\x8C\x3B\xDB\x22\xC1\x00\xE3\xC5\x37\xE2\xA0\xD9\x3C\x2C\x09\x39\xD0\x04\xBC\x01\xE2\xC3\x38\x10\x03\x9B\xCE\xA1\xCD\xD4\x3E\x02\xCB\xCC\x43\x0A\x0C\x0E\xCF\x13\x06\x37\x01\x3D\xFF\x6C\x67\x10\x33\x05\x3D\xC6\x04\xD8\x00\xF6\xC9\xAD\x9B\xCF\xF0\x3F\x19\x1A\x0D\x1F\xCF\x69\x0A\xF8\xCC\x10\x3A\x03\xE4\xCE\x40\x0D\xDB\x8F\x75\xE8\x00\xFA\xC2\x10\x34\x03\xEA\xCF\x3C\x33\xBC\x87\xCF\x83\x44\x5E\x26\x0F\x03\xCF\xD1\x05\x20\x06\x29\xD6\x00\x8F\xAE\x57\xAD\x08\x10\x13\x80\xC4\xC5\x93\x11\x03\xD0\x4E\xA5\x53\x35\x00\x3E\xCF\x0C\x07\x98\x55\x02\x0F\xAE\xF7\x04\x02\xDC\x10\x12\x02", "\x05\xD0\x4E\xC3\x11\x0E\x02\x04\xD0\xB6\xC2\x14\xD4\x0F\x18\xD1\x02\xD9\xE6\x06\x00\x0C\xD2\x93\x57\x23\xD0\xD0\x17\xD0\x77\x04\x41\xDA\xD0\x68\xC6\xD2\x0F\x08\x3F\xCA\x4D\x37\x01\x01\x42\xD6\x78\xB1\x44\x09\xD0\x11\x10\x02\x19\xD1\x4F\xC2\x13\xD3\xCB\xD4\x0D\x24\x07\x2C\xC6\x78\x2F\xD2\x88\x7B\x41\xF6\x13\x27\xD0\x43\x0B\x42\xE8\xD0\x70\xC6\xF0\x03\x09\x0F\x1F\x15\xD2\x4F\xCC\x10\x14\x02\xDC\x07\x11\xD4\x44\xE1\xC5\x62\x0E\xBA\xA3\x3A\xF6\xD0\xD8\xB9\x15\xD4\x3D\x16\x02\xDC\x04\x2B\xB2\x67\x3D\xD0\x08\x09\xB6\xCC\x25\x1C\x07\x73\xB4\xD7\x6C\x45\xEA\xC4\x62\x0C\x16\xD4\xB7\xA7\x11\x0B\x03\x18\xD6\x22\x1C\xD1\x4F\xBC\x11\x18\x09\x1C\x07\x97\x01\x97\x5A\x46\xFF\xD0\x1D\x05\x26\x00\x47\xC7\x3B\x0F\x03\x1C\xD9\x42\xC2\x0F\x61\xD2\x41\x0F\x46\xCF\xD1\x5B\xC6\xD2\x0D\x47\xDA\xAD\x78\x24\x04\x0A\x47\xEC\x1B\x28\x02\x0C\xDC\x10\x1A\xD1\x63\x16\x5E\xC1\x01\x2C\xD1\x39\x3D\xB4\x1A\x17\xD3\x00\x90\xD3\xF1\x65\x18\xD5\x00\x5C\xD2\xB7\xC9\x02\x05\xB0\x7C\xB5\x63\xC7\xC0\x19\xD2\x56\x0A\x0D\x0C\x49\xEA\xCB\xA0\x07\x0A\x0C", "\x45\xEE\xCB\x43\x03\xFD\xC7\x46\xFA\x05\x49\xD3\x0D\xDD\x11\x1D\xD2\x29\xB9\x6E\x67\x4A\xD6\x09\x51\x02\x2A\xD1\xA0\x24\xC6\xA0\x6B\x10\x03\x4B\xD5\xC9\xB6\xD0\xF9\x32\x30\xEE\x56\x4F\x03\x2E\xDA\x55\x2D\x01\xBD\xD3\x40\x00\x4B\xCB\xB0\x12\xC4\x28\xD6\x3A\x3B\x01\xA3\xD3\xC3\xC3\x2C\x42\xD3\x55\x49\x31\xDB\xD7\x95\xCC\x19\x8C\x34\xDB\x89\x16\x02\xD2\xD3\xC5\x82\x01\xE0\x6A\x7E\x02\x35\xDF\x35\x99\xD3\xC7\xD3\x40\x0B\x77\x86\x49\x8A\x02\x37\xDB\x85\x32\x02\xE0\xD2\xCB\xC4\x44\x56\x02\xE6\xD2\xB1\x00\x0C\x29\xD3\xF0\x6F\x19\x12\x0A\x2D\xD3\xBC\x0A\x33\x00\x4F\xF7\x42\xAB\x14\x17\xD0\x3A\xE6\x3D\x01\xD3\x44\x01\x4E\xE8\x7F\x01\x2C\x3D\xDA\x34\x2B\x03\xF7\xD0\x31\x4F\x2A\x07\x03\x02\xD6\xF0\x09\x0F\x05\xD4\xCC\x43\xAB\x03\x0D\x0A\xD3\x5A\x17\x01\x0E\xC9\xBE\xD2\x54\xC1\x6F\x3E\x0D\x10\xD4\xC0\x33\x44\xD6\x4C\xD6\xC8\x6C\x05\x3A\x0A\x4F\xD6\x09\x21\x00\x17\xB0\xD7\xBF\xD3\xA9\xB8\xF9\x16\x0F\x1F\xD4\x71\x4E\x48\xDE\x4F\xEA\xC8\x95\x4E\x20\x07\x02\xFA\x47\x26\xB6\x36\xDD\x37\xDA\x18\x0F\x02\x4B\xDE\x29\xF3\x29\x4F", "\x01\x4C\xD4\x52\xE3\x7B\x34\x07\x06\x06\x53\xF1\xCD\x73\x29\x17\x0C\xC5\x9E\xA5\x24\xD7\xE3\xC0\x1A\x28\x00\x3F\xD5\xDE\xCC\x2B\x2C\x01\x3A\xD6\xE5\xC4\x13\x49\xD5\x81\xCC\xAF\x0A\x07\x0D\xD5\xA4\xCD\x64\x00\x04\x10\xD5\x8A\xCE\x56\x18\x08\x2A\xD4\xAB\xD0\x45\xBD\xDB\x0D\x01\x58\xD7\x3E\xD3\x10\x18\x02\x5C\xD7\x2D\xD2\x3B\xF4\x04\x5A\x01\x58\xD6\x25\x15\xB2\xB1\x17\x4A\xD7\x56\xDE\x04\x67\x02\x5A\xD6\x3A\x38\x02\x65\xD4\x45\xD8\x58\xA4\x89\x72\xD6\x56\x17\xCC\xBF\xCE\x32\xD7\x18\x8D\xDB\x01\x02\x79\xD4\xBB\x17\x0D\x03\xD5\x6E\xD4\xF2\xC6\x24\x4E\x02\x58\xD7\x4F\x8A\x09\x18\xD5\x83\x0E\x39\x04\x55\xD2\xCF\x69\x38\x27\x09\x58\xD3\x04\xA8\x00\x63\xD3\x11\x34\x03\x8F\xD4\xF7\xCA\x61\x2A\x02\x93\xD4\x44\x06\x0B\x16\xD6\xD4\x04\x72\xB6\x56\xE6\x87\x44\x65\x67\xDC\x10\x04\x03\xA0\xD7\x6E\x12\x5A\xF6\xD5\xEF\x77\xC7\x66\x5A\xC6\x04\xD2\x01\x6A\xD6\x10\x1E\x00\xAB\xD7\x46\xD0\x9A\x8E\x48\x81\xD7\x40\x01\x0E\x32\xD6\xCA\x52\x56\xBE\x95\x9E\x02\x85\xC7\x38\x08\x55\xDE\xCB\x3B\x00\x70\xB1\x31\x23\xCB\xE4\x1E\x3B\x03\x5C", "\xD6\x09\x48\x02\x71\xD7\xE6\x24\xD2\x91\x05\x3E\x0F\x5A\xDB\x22\x55\x01\x6D\xDF\x5C\xF4\xCB\xC8\x8B\x20\x0F\x52\xE2\x0D\x63\x02\x75\xDA\x45\xB8\xD2\x4F\x75\x04\x0A\x5D\xF7\xD4\x5B\x21\x1C\x0E\x5D\xC0\xD7\xCA\x90\x5E\x2D\x01\x23\xD7\x01\xCB\x9C\x2F\xDB\x80\xA9\xE8\xD5\x81\x98\x97\x29\x00\xEC\xD4\x82\xCB\x89\x0D\x02\xCE\xD7\x77\xDE\x4C\xF8\x25\x34\x01\x7D\xD1\x55\xC2\xD2\xE7\xD4\x35\xD4\x8D\x40\x01\xFE\xD5\x17\xBB\x89\x10\xB8\xF0\xD7\x36\xDF\xD4\x4C\x01\x05\xDA\xBB\xC6\x0B\x01\xD8\x8F\x8C\x5E\x28\x05\x0D\xD8\x56\x08\x31\x00\x61\xD6\x8E\x78\x24\x19\x04\x61\xE6\x0E\xD2\x03\x85\xD0\x3A\xA4\x1F\x70\x03\x86\xD4\x65\x9E\xD8\x11\x63\x36\x25\x60\xE2\xD5\x02\x07\x90\xBC\x57\xF1\xD7\x06\x06\x7D\xC4\x8D\x49\x02\x22\xD8\xBB\x1D\x0F\x24\xD8\x21\x61\x40\x81\x63\xDB\x22\x0B\x03\xAE\x28\x79\xAC\xD8\x0D\xD5\xC5\x45\x60\xDE\xCB\x19\x00\xBD\xBC\x63\xC8\x4F\xAF\x08\x2B\x0F\x63\xF7\xC8\x42\xD8\x47\xDA\x15\x37\x02\x27\xD8\x13\xBB\xAB\x30\xB5\x43\xD9\x49\xD5\x1C\xCD\xD9\x46\xCB\x93\xD3\x11\x11\xD9\x73\x74\x11\x51\x0D\x37\xD8\x73\x2B", "\x14\x0A\x63\xD7\xD9\x33\xC8\x35\x6D\x0D\x1C\xD9\x5B\x21\x18\x0F\x65\xEB\x06\x7D\xC2\x86\x19\x0E\x14\xD9\x5C\xCB\xAE\x2F\x5B\xC2\xC9\x44\x52\x3D\x04\x66\xC8\xC5\x67\xD8\x56\x1E\x54\xFD\x36\x02\x00\x21\x0B\x5D\xC4\x11\x8C\x01\x9D\xDC\xA0\x1B\xC2\xBD\x36\x03\x0A\x67\xE6\xCD\x39\xC2\x95\xD8\x66\xD5\xD5\x7E\x07\x06\x03\x68\xC0\xD5\x5B\x22\x2A\x06\x68\xF6\xD9\x6F\xD5\x47\x08\x02\x0B\xDA\x4B\xB3\x81\x8F\x68\xFF\xD9\x91\xD9\xD1\x54\x69\xD3\xB1\x5A\x16\x32\x07\x69\xC7\xD7\x6F\xC9\xF6\x32\x04\x1B\xDA\x59\xD4\xBB\x1A\x0D\x2E\xD9\x60\xD9\xF0\xC9\xE6\x0F\x01\xA4\xD8\x8A\xD0\x00\x29\x03\xA8\xDB\xA1\xD6\x58\xC4\x51\x5C\x00\xA9\xDF\x13\xA8\x01\xA4\xD8\x24\x8E\x67\xE0\xDA\x90\xD5\xF2\x56\x6B\xD9\x72\xB9\xDB\x57\x45\x0C\x7B\xD8\x90\xCA\x91\x48\x07\x3F\xDA\x10\x04\x21\x01\x6C\xE1\x68\xC3\xD9\xAA\xD4\x5A\xCD\x35\x86\x00\xB2\xD3\x41\xCB\xDB\x08\x35\xB3\xD2\x6B\xED\xD6\xE4\x1C\x25\x02\x6D\xCD\x06\xD4\xD9\xA9\x36\x6D\xD0\xDA\x38\x8C\x19\x3D\x6A\xD3\x04\xAF\x01\xB7\xD3\x10\x3E\x00\xC5\x42\x57\xAF\x09\x37\xD1\xB4\x14\xA9\xD4\x46\xC4", "\x11\xA0\x01\x3E\x3D\x4A\xD6\xD1\xF6\x11\xBC\xD7\x6D\xFB\x82\xAE\xD0\x6D\x6C\x1D\x1C\x02\xF3\xD8\x78\xB4\x44\x22\x02\xDC\x06\x29\x07\xEC\x32\x02\xEE\xD9\xAF\x66\x6E\xF3\x29\x00\xDC\x44\x04\x0A\x07\x3B\xB5\x01\xC1\xD4\x47\xE1\x17\x2C\xD1\x9A\x36\x0B\x0E\xDC\x5A\x15\x13\x0A\xF8\xA5\x02\xDC\x07\x28\x07\xEC\x37\x02\x14\xDD\x11\xD2\x36\x02\xDC\x40\xAD\x6F\x38\x0B\x1D\xDC\x9B\x22\x13\x0A\xF8\xA7\x02\xDC\x07\x4A\xBA\x61\x39\x02\x24\xDD\x20\xD2\x3C\x28\xDC\x10\x05\x4D\xBA\x61\x3A\x02\x2D\xDF\x16\x26\x2C\x30\xDC\x0C\x06\x4F\xB9\x71\x75\xDC\x1B\x7B\x2F\x7C\x1D\x02\xAD\x67\x10\x2F\x0C\x73\xC6\xD0\x3E\xDC\x44\x0F\xD4\xB5\x4C\x43\xDE\x05\xDF\x96\x9C\x07\xA8\x02\x21\x54\x6A\xC9\xB5\xF8\xAC\xD3\xD7\xEC\x01\x03\x4F\xDE\x17\xDC\x32\x12\xDD\x67\x10\x31\x05\x75\xCF\xDC\x10\x04\x2B\x0C\x1D\x2B\x02\xFD\xD8\x0E\xD6\x4F\x2D\x02\xDC\x06\xD7\xD0\x48\xF6\xDC\xBC\x0A\x2B\x0C\x1D\x2A\x02\x61\xDE\xB4\xCD\x11\x2F\x02\xDC\x04\xD9\xD7\x76\xFD\xDC\x0C\x04\x2C\x08\x75\xCE\xBB\x5B\xDF\x1E\xD2\x36\x31\x02\xDC\x06\xDD\xD3\x77\xC4\xDD\x0C\x06\x2C", "\x07\x77\xE4\x1F\xCA\x01\xDE\xDE\x71\xC4\x11\xB3\x00\x77\x02\x78\xFF\xDD\x4A\xDC\x43\x04\x0B\x1C\x07\xA9\x01\xDB\xDE\xF8\x5C\x07\x6A\xDC\xE3\xDA\x44\xC6\x04\xB6\x00\x77\x00\x77\xD6\xDE\xF9\xD8\x44\x07\x0B\x1C\x07\x7C\xDC\xE7\xD4\x6F\xDD\x04\xB8\x00\x77\x09\x78\xE2\xDE\xFE\xD8\xF5\x0A\x72\xC6\x04\x8F\xDC\xEA\xD2\x76\xDD\x04\x32\xDE\x41\x05\x0B\x12\xDE\x0F\xB0\x77\x09\x79\xEE\xDE\x6E\xDF\x44\x00\x74\xCC\x04\x9F\xDC\xEE\xDC\x88\x5C\x07\xA5\xDE\xEF\xD6\x3A\x3E\x02\xDC\x04\x30\x07\xEC\x0D\x03\x35\xDE\x33\x07\x70\xE6\x6F\xDC\x07\x2F\x07\xEC\x10\x03\x49\xDF\xE5\xD3\x10\x01\x03\xDC\x07\x30\x0F\xCF\x91\xDF\x9D\xDC\x43\x06\x7D\xDE\x2C\x7A\xC6\x34\x0B\x7C\xDF\x81\xDC\x06\x32\x04\x7B\xDA\x15\xC4\x01\xF1\xD7\xEC\x14\x03\x35\xDD\x35\x0B\x7C\xCF\x01\x8A\xBD\x31\x0C\x1D\x06\x03\xE3\xDC\xBB\x1E\x7E\xFC\x56\xF1\xDE\x43\x46\x7E\xE7\x11\xD7\x01\xCD\xD8\x0D\x0B\xDF\x50\x02\xE2\xB7\x0C\x2F\xDF\xF5\xDF\x9C\x2F\x7F\xF4\xDF\xC2\xDE\x5E\xD1\x71\xFD\x36\xDA\x00\xF6\xD4\xED\x0A\xBE\xC9\x00\x77\x02\x0C\x07\x3B\xDB\x02\x02\xE9\x7A\xF6\x13", "\xE2\xDC\x44\x08\x0C\x01\xE0\x5B\x23\x32\x0C\x1D\x25\xDF\x05\xE0\xBB\x1C\x0C\x29\xDC\xC7\x38\x37\x0F\x7D\xFC\x0A\x52\x02\xE2\xBF\x81\xF1\xDC\xC7\x3A\x37\x03\x82\xC7\x92\x26\xE0\x77\x0A\x73\xE6\x4D\x2B\xE2\xF0\x04\x05\x2D\xE0\xCC\xCF\xB1\x32\x0E\x31\xE0\x9D\x90\x0D\xEC\x10\x07\xDD\x24\x18\x0E\xE4\x44\x16\x01\x3A\xE3\x73\x77\xEC\x26\x03\x12\xE3\xEB\xD3\x11\x27\xE0\x0C\x04\x58\xBA\x61\x27\x03\x45\xE1\xEE\xD2\x78\x5C\x07\xD4\x02\x5E\xC8\x0E\x3E\xE0\xD4\x0F\x33\x05\x18\xEA\x03\xA4\xDA\xB7\xC7\x05\x3E\xBC\xF9\x14\x72\xD4\x35\xD9\xE1\xE2\x8C\x17\xE6\x10\x16\xE1\xDC\x44\x98\x12\xC2\x2E\xCB\x71\x03\xB7\xD3\x86\xE5\xAF\x4D\x34\x03\x07\x86\xCA\x27\x6A\xE0\xDE\x30\x5E\xE0\x06\x18\x03\x1B\xE0\x9A\x71\xE1\x02\x04\x19\xEE\x45\x7B\x5D\x76\xE0\x66\x78\x87\xC0\x00\x7A\xE0\x6C\xD8\x81\xC6\x0B\x81\xE0\x6D\xCD\xD4\x30\x00\x22\x32\xB7\xC9\x0A\x22\xE1\x72\xE3\x7E\xDD\x69\x7D\xE1\xEC\x1A\x2D\x0F\x87\xC5\xE2\xC4\xC5\x53\x37\x04\x10\xE2\x9B\x21\xFD\xB0\xA4\x94\xE2\xCC\xC6\x86\x13\x05\x18\xE2\x73\x2A\x34\x03\x89\xE7\xCC\x44\x53\x17\x00", "\x8A\xF8\x31\xA3\xE1\x0B\xB4\x7E\x2B\x01\xA7\xE0\xBC\x69\x8A\xFE\x93\x67\x13\x1D\x0D\x8A\xFC\x0A\xFC\x03\x2B\xE8\xE7\xB1\x3B\x22\x32\xAB\xDA\x00\x0F\xC1\x5E\xA4\x27\xEE\x62\xE0\x6A\x90\x03\x2C\xEA\x34\x19\x00\x4F\xC0\xE6\x9C\x89\xE6\xA3\x4F\x74\x27\x02\x8C\xC2\x0F\x27\x01\x31\xEE\x63\x2E\xA3\xE4\x1C\x2A\x09\x88\xD6\x09\x35\x03\x2C\xCC\x89\xD9\xBA\xD9\x3F\x2C\x03\x8D\xD4\xB1\xD6\xE2\x92\xD7\x14\x3E\x02\xB9\xE2\x95\x0F\x04\x0F\xC1\x70\xB4\x27\xE1\x22\xDA\x05\xCB\x01\x38\xE5\x25\xE4\xE3\xCF\xE2\xDD\xCD\xD4\x18\x03\xCB\xE0\xC7\x5E\x8C\xD0\x04\x9C\xE0\x52\x9E\x17\x24\x03\xF1\xE0\x11\x1D\x07\x33\xE3\x5D\xE3\x8E\xC9\xE6\x30\x03\xEA\xE2\x56\x1B\x08\x3C\xE2\xED\xE2\x0B\x8A\x61\x3D\x03\xF9\xE0\xF5\x0A\x09\x3C\xE3\x6B\xE1\xB3\xB1\xD2\x70\x42\xEE\xC8\x2A\x0C\x90\xCD\xE2\x59\xC8\x35\x65\x01\x30\x42\xAE\xDA\x2D\x0C\x8E\xF4\xE3\x80\xD9\xF6\x32\x02\x18\xE4\x56\x0A\x31\x0B\x91\xFD\xE3\xAB\xCC\x35\x6F\x02\x20\xE4\xA6\x0E\x35\x03\x92\xCD\xE4\x25\xE4\xA8\x6C\x03\x28\xE4\x5A\x16\x39\x0B\x92\xD4\xE4\x57\xA4\xF9\x19\x04\x30\xE4\xEC", "\x1A\x2E\xCC\x57\xDC\xE2\x81\xAD\xF6\x36\x05\x38\xE4\x31\xB0\x37\xCD\x8B\xF9\x33\x1B\x30\x44\xE6\x8C\x30\x42\x83\x0C\x05\x0C\x0D\xC6\xE3\xA1\xB4\x61\x46\x94\xD5\x15\x48\xE7\x54\x3B\x94\xC5\xE4\x9A\xD5\xCF\x7F\x94\xCC\x04\x8B\x01\x54\xE0\x11\x30\x00\x53\xE4\x47\xEA\x29\xC6\x49\x8D\x03\x55\xE6\x10\x19\x02\x5A\xE4\x43\x0E\x03\x1D\xE5\x24\xE4\xB6\xD8\x97\x1B\x02\x62\xE7\x40\x07\x0A\x25\xE5\x06\x04\x13\x08\x96\xEC\xE4\xF9\xCD\x53\x39\x0A\x00\xE5\x02\x06\x2D\x00\x97\xC3\x04\x5A\x02\x50\xE3\x11\x10\x03\x85\xC4\x2E\x00\x0B\x5E\xCB\x69\x00\x3E\xCF\x97\xDE\xE1\xA2\x43\x60\xE6\x25\x36\x01\x86\xE4\x44\x00\x98\xE5\xE1\x18\xAD\x5B\xE3\xA7\x03\x02\x73\xE7\x40\x0F\x98\xF1\xD2\xA0\x6A\x36\x02\x99\xE7\x98\x95\xE6\x40\x07\x99\xCC\xA2\x46\x4A\x39\x0B\x99\xC6\x0B\x9F\x01\x67\xE0\x00\x1F\xE6\x31\x89\xF6\x32\x0F\x23\xE6\xBC\x0A\x6D\xC0\xA4\xA8\xE6\xDC\x50\x5E\x2E\x0F\x0A\xE6\x0F\xB1\x63\xE5\x5C\x42\xC0\xA0\x69\x02\x07\x08\x3B\xD9\xD4\x0C\x32\x06\x9A\xF0\xE6\x4D\x8A\x86\x15\x01\x3B\xE6\xE4\xD6\xB1\x06\x0D\x3F\xE6\x0A\xD8\x68\x01\x02", "\x04\xE7\xED\xD7\x16\x24\x0E\x08\xE7\x11\xD9\x4B\x4C\x9C\xCA\xD5\x4A\x0E\x3C\x00\x9D\xD8\xD8\x4D\x35\x0E\x03\x9D\xFF\xD7\x1D\x15\x86\xC8\x79\x80\xE7\xE4\xC4\x68\x05\x04\x1B\xE7\x06\xDB\x9C\x2E\x00\x1E\xE7\x87\xE6\x0F\xBC\x2A\x64\xE7\xAE\xD8\x07\x09\x21\xDE\xA5\xC0\xE7\x2F\xEF\xD4\x5E\x01\xE4\xE6\xBB\xCB\x02\x28\xE7\x8E\xE5\x7F\xC4\x7E\x2A\x01\xF5\xE6\x95\x09\x03\x38\xE7\xB7\xE5\x81\xCD\xD4\x36\x01\xE4\xE6\xB7\xC7\x04\x39\xC9\xC0\xE4\x36\xE6\x24\x41\x02\x05\xEB\x5D\xB8\xA0\xDE\xE3\x46\x0C\x7B\xE3\x54\x59\xC8\x70\xB4\x70\xE7\x8E\xC7\x05\x99\x02\x84\xE6\x77\x94\xE8\xE9\xE7\x1B\xC9\xFD\x26\x02\xFD\xE6\xE9\x01\x08\x00\xE8\x28\x2D\x98\xD0\xAA\x72\x02\x21\xEA\x56\x1F\x08\x24\xE8\x96\xE5\x9A\xD4\x7E\x3E\x02\x1A\xEA\x56\x1D\x09\x2F\xE7\x1D\xE9\xB0\x8F\xCD\xA9\xE8\x61\x20\x8B\xEE\x99\xF7\xD9\xD9\x3F\x35\x08\xA3\xEF\x76\x3A\xEB\x69\xED\x91\xC6\x49\xE3\x01\x8C\xEC\x6E\x08\x03\x1C\xE9\x7E\xE8\x68\xEC\x05\xF0\x02\x91\xEB\x89\x18\x03\x49\xE9\x80\xED\x92\xDC\x7B\x4E\xEB\x9C\x28\x0E\x11\xE9\x25\xE9\xA6\xDC\x12\x08\x02\xF0\xC6", "\xB1\x08\x0F\x18\xE9\x2D\xE9\xA8\xD6\x24\x57\x00\x5C\xE8\xA1\xD7\xB0\x75\xCA\xF0\xE6\xC0\xBD\xDB\x24\x00\x65\xE8\xA3\xD5\x77\x28\xE9\x35\xE9\x9F\xC8\x97\x31\x00\x6D\xEA\x10\xCD\x03\x35\xE9\xAE\xC8\x20\x45\x2B\xDF\xE7\x4D\xE4\x5E\x2F\x03\x38\xE9\xE5\xE4\x00\x0B\x04\x00\xEA\x83\x0C\x0D\x0B\xA7\xF1\xE9\x7B\xB4\xBE\x10\xA8\xFC\xA0\x84\xEA\x35\x17\xA8\xCA\xE9\xCF\xD9\x9A\x3B\x05\x0B\xEA\xBB\x21\xA3\xEE\x12\x0F\xEA\x52\xEA\x5A\xED\xD4\x29\x01\x94\xEB\xB5\x96\xA9\xCC\x04\x5E\x00\xA6\xE9\xA5\xE1\xDB\x4D\x37\x1D\x00\xA8\xD9\xA1\x9F\xEA\x41\x0C\x06\x30\xE9\x48\x04\x77\x0D\x0C\x21\xA1\x80\xE8\xD4\xDB\x85\x12\x03\xDC\x05\x34\x03\x88\xFD\x8D\xDC\x04\x70\xE7\x13\xD2\xDF\x73\x2B\x34\x0C\x1D\x34\xEA\x1D\xE3\x26\x21\x85\xDE\xE5\x54\xD3\x04\xEE\x84\xC9\xE1\xDC\x07\x36\x0A\x17\xC9\x02\xA9\xEB\x26\x26\x0D\x05\xC6\x8B\x00\xA0\xEE\x2D\xFB\x01\x3F\xCF\x44\x0F\xAC\xDE\xD2\x02\x06\x25\x02\xAD\xD6\x09\x88\x01\xB5\xE0\x11\x17\xEB\x94\xC7\x53\x71\x0A\x1D\xEA\x5A\x15\x25\x02\xAA\xF2\x2C\x6C\xE1\x9A\x3D\x0A\x24\xEB\xAE\x6B\xB9\xE2\x10\x20", "\xEB\xA0\xE4\x03\x9C\xAE\xDB\x22\xB1\x02\xBB\xE0\x00\x30\xEB\xA9\xE6\x91\x45\x0C\x33\xEB\x73\x2B\x2F\x06\xAF\xF8\xEB\x02\x05\x36\x07\xAB\xCA\x0D\x00\xEE\xD6\x96\x83\x5B\xEB\xAC\xBA\xB7\xEC\x10\x05\xEC\x10\xAA\x2A\xCC\xAF\xDB\x21\xDA\x03\xBF\xE2\x60\xE0\x6A\xE8\x03\xC3\xE6\x2C\x28\x03\x12\xEE\x96\xBD\xD4\x34\x03\x16\xEC\xBE\x69\xB1\xE7\xA8\xE4\x1C\x00\x09\x08\x3C\xE6\xF6\x10\x01\x09\x38\xD8\x9E\x05\xEF\x76\xCE\x5A\x4C\x00\x23\xED\x71\xEC\x2B\x12\x00\x27\xEE\xB5\xE1\xE7\xBD\x36\x18\x01\xCB\xED\x9C\xC6\x0B\x20\x01\xCC\xEF\xAD\xFC\xCC\x6B\xEA\xCD\xE5\x69\xDA\x15\x2E\x01\xE2\xCE\x95\x85\xEC\xF2\xE4\x68\x01\x03\x3E\xEC\xDC\xE6\xD8\x08\x38\xC0\xA9\x05\xEC\x32\xE0\x1A\x3D\x00\x48\xED\xA0\xED\x75\xBA\xEC\x0B\xEC\x34\xE8\x97\x09\x01\x51\xEE\xB7\xC9\x05\x3C\xCF\xF7\xE9\x83\xC1\x19\x14\x01\x59\xEE\x5D\x6C\xB5\xC5\xEC\x17\xE8\x4D\x0F\x05\x11\xED\xAE\xDB\x1C\x09\x38\xF0\xB5\x64\xED\xDB\xCC\x10\x2C\x01\x68\xEE\xA5\x8B\xB6\xF2\xEC\xEE\xE1\x9A\x39\x07\x11\xED\xEE\xCB\x24\x04\xB5\xDB\x05\x26\xEB\x53\x75\x08\x38\xED\xB4\x67\xDE", "\xE8\xAE\xFE\xE3\xBD\x35\x24\x01\xB7\xE6\x0E\xAF\x02\xD0\xE4\xB7\xC6\xE4\x2B\x64\xE0\xE3\x7C\xC2\xEE\xEF\xE8\x8F\xE6\x24\x6A\x02\x8E\xEE\x45\x40\xB9\xDD\xED\x4B\xEA\x56\x06\x0B\x07\xEE\x6C\xBF\xDC\xEB\xB3\xD9\xEE\x47\x07\x30\x0C\xB9\xC2\xB4\x9E\xED\xD5\xEA\xA5\xC5\x57\xA3\xEF\x26\x2A\x0F\x25\xEE\x7C\xEF\xE9\xE6\x10\x1D\x03\xA9\xEF\x9C\x2A\x00\x1C\xD1\x6C\xED\xEE\xC4\x44\x6A\x03\xB1\xEF\x16\x2A\x01\x1C\xD1\x43\xEE\x9A\xE9\xFD\x37\x03\xB9\xEC\xC2\x4C\xBB\xCB\xEE\x8A\x70\x92\x5A\x08\x35\x9C\x10\x03\xF1\xE7\x0C\xC3\x04\x38\x00\x17\xD8\xB2\xFD\xE9\x4D\x36\x04\x0A\xBC\xCD\xE7\x1E\x03\xF4\xE2\x0D\xC0\x00\x46\x02\xF3\xE4\xBC\xC6\xD3\xAF\x08\x08\x06\xBD\xC9\xC1\x2C\x03\xF7\xED\x0D\xD4\x01\xDA\xEF\xE7\xE1\xA9\xFD\x36\x2E\x02\xF8\xEF\x13\xBA\x00\xE2\xEF\xE0\x02\x06\x25\xEF\xA6\xEC\x13\xAD\xD4\x3C\x00\xEA\xEF\x44\x08\x04\x2D\xEF\x11\x8C\xFC\xED\xBA\xE4\xEA\x7B\x72\xF8\xE1\x5D\xB8\xEF\x10\x05\x37\xDC\x57\xD7\x03\x85\xC5\x16\x02\xBE\xDE\xCB\x8D\x00\x4A\xDE\x6E\x88\xE6\x6B\xB3\x01\xF0\xEA\x4A\xF0\x06\x04\x01\xF0\x99\xF8\x25", "\x6F\x01\xFD\xE7\x85\x3A\xEF\x0B\x19\xBA\xED\xDB\x3B\x01\x16\xF2\x56\x15\x0B\x18\xF0\x02\x06\x04\xFB\x2F\xE7\x11\x87\x01\x07\xFC\x6E\x03\x03\x20\xF0\x00\x02\xC2\xF7\x83\x4E\x52\x09\xFB\x89\x11\x03\x29\xF3\x0A\xF6\x88\xE9\x39\x9F\x02\x03\xF6\x3A\x1F\x03\x10\xF1\x06\xFE\x88\xE9\x39\xAA\x02\x0B\xF3\xA7\x2C\x03\x31\xF3\xC4\xEF\xD4\x76\x02\x3E\xF3\x16\x2A\x0F\x01\xF1\x1A\xEC\x39\x75\xC4\xC6\x0B\x08\x00\x56\xD8\x79\xB2\xF0\xB9\xA0\x5E\x2E\x0C\x0B\xF1\x47\x1E\x13\xFA\x8F\xAA\xD3\xC4\x78\x15\xFA\x34\x24\x00\x56\xF0\x44\x00\xC5\xF6\xB0\xE8\x76\x16\xF8\x62\x5D\xF1\x0B\xF2\x7A\xED\xDB\x32\x03\xFE\xEF\x16\x48\x55\xDE\xA5\x5F\xF1\xD1\xE1\x19\x3F\x03\x62\xF2\xD8\x0F\x04\x24\xF1\x11\xF2\x7E\xE8\x97\x0B\x00\x8B\x00\xC9\xED\x11\x1D\x01\x74\xF2\x0E\xF3\x35\xD1\xA0\x79\xF3\xE4\x8C\x6E\x2B\x01\xB9\xD5\x08\xFE\xB5\xFE\x05\x22\x01\x20\xF8\x44\xB3\x29\x78\x01\x21\xFA\xC2\xD0\xE8\x1E\x05\x0B\x0A\xC8\xFF\xEC\xEC\x19\x21\x08\x55\xF0\xB5\x5F\xF1\xD9\xEE\x11\x3A\x00\x93\xF0\xA7\xD7\x26\x57\xF2\x57\xF1\xDD\xE1\xD6\x5D\xF2\x52\xEC\xAF\x05", "\x0A\x3D\xF1\x86\xF3\x4C\xD4\x7E\x13\x01\xA4\xF2\xBB\xC3\x0B\x28\xF2\x8F\xF0\xE1\xE9\xFD\x1F\x01\xA4\xF2\xAB\xD1\x0C\x2B\xF1\xA1\xF0\xE3\xE8\x97\x2C\x01\xAD\xF2\x95\x00\x0D\x30\xF2\x5F\xF0\x01\x9A\x15\x38\x01\xBD\xF2\xE9\x0E\x0D\x00\xF3\x43\xE8\x11\x54\x08\x35\xF2\x56\x08\x3B\x00\xCA\xDE\xF1\xC9\xF2\x6B\x51\x09\x0C\xF3\xA6\x0C\x3F\x0F\xCC\xE5\xF1\x53\xE8\x68\x0E\x09\x14\xF3\x5A\x14\x03\x05\x60\xD8\xF2\x7A\x94\x35\x6B\x0A\x1C\xF3\xEC\x18\x07\x0F\xCD\xF9\xF2\x35\xE4\x51\x64\xCE\xEA\x52\x05\xD8\x1B\xFE\xBB\xFA\xEB\xEB\xF3\x9C\x2B\x03\x2D\xF3\xE8\xF2\x9C\xED\xD4\x12\x03\xC5\xF0\x43\x0E\x0D\x24\xF2\x83\x0E\x12\x05\x60\xCF\xF1\xD0\xED\x9A\x30\x0E\x39\xF3\x67\x50\x3F\xF3\x11\x13\xD8\x40\xAB\x17\xFB\xDA\x8F\x75\xEE\x00\x41\xF9\x28\xC6\xF4\xEF\xA7\x3F\xF5\xCF\xF5\xB6\x59\x1A\x43\xFF\xCC\x07\x74\x83\x0C\x1D\x02\xD1\xD0\xF3\x31\xBC\x5E\x2A\x00\x07\x74\x3F\x86\x05\x08\xD1\xD8\x87\x1B\xF4\x36\xF5\x97\xFC\x7E\x07\x75\x1E\x95\x02\x23\xF4\x33\xD0\x3D\xF0\x11\x18\x03\xAE\xEB\xB1\x37\x02\x07\x74\xB2\xE8\x59\x8C\x1D\x30\xF4\xC1", "\xEB\x9C\x2A\x0D\x1C\x07\x5F\xF3\xAE\xE9\x7D\xE6\xDA\xDC\x06\xC0\xE9\xD3\xCC\x8B\xDC\x05\xC1\xEE\xD3\xE3\xDE\x56\x08\x37\x0C\x1D\x1E\x03\x03\xEE\xF0\x0A\xD4\xD0\x04\xDB\xDE\xBF\x77\xD0\x63\x59\x9F\x01\x81\xD7\x1F\x1D\x03\x4B\xF5\x53\xF2\x36\x18\xF5\x50\xF7\xB1\x3B\x02\x13\xF5\x56\x08\x28\x06\xD5\xD9\xCF\x31\xF4\xF3\x30\xD6\xDC\xDD\x24\xB8\x77\x0F\xD4\xC5\xEB\x46\xE2\xE9\x00\x0E\x05\xC6\x2D\x00\x48\xF4\x9B\x6C\xD9\x06\x07\x5B\xF8\xAD\xC0\x00\x39\x02\x5C\xF6\x3A\x2E\x02\x74\xF7\x5F\x00\x5D\xFE\x05\x45\x01\x4A\xF6\x25\x3B\x02\x25\xF5\x5D\xFA\xC1\xD9\x3F\x52\x02\x60\xF6\x3A\x09\x03\x85\xF6\x5F\xF1\xE3\xB7\x7F\x8A\xF6\x56\x17\x0D\x0D\xF6\x02\x06\x5D\xF4\xBF\x99\x3F\x6C\x00\x4B\xF9\xAE\x63\xF5\x54\x53\x2F\xD4\x8D\x6E\x01\x91\xF4\xBB\x16\x0E\x14\xF6\x00\x02\x65\xF8\x4C\xDA\x18\x7B\x02\x5E\xFA\x55\x34\x03\x7D\xF5\x65\xF8\x9B\xCF\x75\x87\x01\x68\xFE\xFD\xA4\xDA\x98\x9E\x69\xFC\x31\xCC\x3C\xB2\xF7\xF9\xB4\xDB\xD3\x04\xB6\xF7\x3A\x95\x80\x79\xF6\xEF\xBF\x6E\xFD\xD9\xD1\xE7\x69\x3A\x2B\x00\xDC\xF7\xBF\xC2\xF4\x43\x0D\xDB", "\xC2\xA3\xE4\x1F\x2E\x07\xDC\xFC\x0A\x39\x01\x72\xF6\xD8\xF1\xD3\x1A\x18\x32\x0F\xDC\xCA\x0D\x47\x02\x74\xFE\xD8\xF8\xD3\x1A\x19\x35\x07\xD0\x6C\xB5\xC2\x0D\x15\x04\x6A\xDE\xA5\xCB\xF6\x1B\xFE\x17\x23\x03\xD7\xF7\x6F\xAA\xDD\xEE\xF6\x4C\xCD\xF6\x30\x0F\x29\xF7\xD9\xBB\x7A\xF5\xDA\xD6\xED\x4D\x35\x3F\x0A\xDA\xF1\x80\xE3\xDB\x70\xFA\x35\xF2\x19\x84\x4E\xBB\xCD\x08\x39\xF7\xCA\xF4\x24\xFD\x11\x15\x00\x84\x4C\x78\xF2\x36\x1A\x02\xA4\xD8\x5C\xBB\xDC\xDA\xF2\x1D\x07\x08\x05\xE0\xD6\x09\xAA\x01\x82\xFC\xDB\xEC\xD4\x69\x39\x0C\x04\x38\x6E\xDA\x34\xDC\x90\xAB\xDC\xF6\xE3\x6C\x06\x0F\x07\xE1\xD5\x31\xF2\xF7\x72\xFC\x53\xDE\x04\x4B\x03\x83\xF9\x92\xE3\xF7\x13\xF8\x62\x82\xF3\x9F\xF8\xEB\xB1\x88\xF2\xB9\xC4\x51\x66\x00\x8B\xFA\x55\x33\x03\x2E\xFA\xA7\xA7\x46\x33\x01\x84\x4F\xBB\xD4\x3D\x0B\xF7\x8C\xD0\x5E\x24\x07\x04\x4E\x6D\xD0\xF5\x01\x00\x22\x30\xF7\x07\x72\xF6\xCB\xA8\x9E\x40\xF8\xBC\x74\xE4\xE9\xF8\xB6\x23\xB1\x38\x07\x39\xF8\x56\xDC\x7B\xFC\x10\x03\xAB\x8F\x28\x94\xF8\xD6\xD3\xF7\x0E\x73\xB1\x3A\x07\x16\xF9\x7A\xDC", "\x11\x1B\xDC\xE6\x03\xC7\x3B\x1E\x0C\xE5\xC7\xDE\x3B\xF8\x77\x0E\xCD\x9A\x18\x7C\x03\x98\xF0\x45\xDE\xF9\x11\xC4\x5F\x59\xE4\xE5\x8B\x4B\xFA\x7E\xFB\x98\x07\x3B\x7F\x03\x9B\xF8\x6A\x71\xF9\x01\xFA\x46\x07\xEC\x01\x02\x6A\xFA\xCB\xD2\x36\x0B\xF7\xD5\xC8\xF9\x12\x08\x36\xF9\xEC\x19\x01\x08\xE7\xD8\xF9\x06\xB5\x7E\x6D\xE7\xE8\xDD\x4A\x0F\x72\xFB\xED\xA1\x30\x26\xFB\xB4\x22\xC2\x0A\xF8\xD1\xF0\x35\x63\x09\x11\xFA\xEC\x1A\x05\x03\xE9\xCC\xF9\x60\xC8\x6B\xC8\xE9\xCB\x41\x9B\xFA\x9C\xF2\x0A\xE9\x39\xAF\x03\xA7\xF3\xA7\x36\x00\xA1\xF9\x9E\xF7\xB2\x87\x3B\xBD\x00\xE1\x42\xAB\xC6\x01\x22\x33\xE0\x0B\xDC\xF1\xDE\x78\x24\x30\x0E\xEA\xCC\xD7\xB1\xF8\xA7\xF2\x7D\x07\x3B\xC3\x03\xAD\xF6\x3A\x0A\x01\xB9\xFA\xA8\xF2\x10\x3B\xDE\xE4\x1E\x31\x0E\xEB\xDA\x15\x4C\x01\xB0\xFA\xEA\xC6\x04\x3C\xE1\x77\x87\xEC\xEC\x1B\x4E\x02\xB2\xF8\xE8\xD7\xB5\xDD\xCC\xA1\xFB\x89\x10\x01\x87\xFB\x76\xFB\xB5\xB0\xB3\xD6\xFB\x9C\x21\x05\x19\xFB\x52\xF9\x3A\xFD\xD4\x10\x03\xA6\xFB\x16\x22\x05\x22\x30\xE4\xF4\x18\xD9\x82\xDD\xFB\x65\xD8\xB8\xF3\xDF\xDD", "\xD5\x78\x24\x38\x0C\xEE\xE2\x03\xEC\xFA\x18\x0E\xEE\xCB\xF7\x3D\xE6\x91\x44\x0E\x25\xFB\xC6\x0B\x18\x08\xEE\xFA\xFA\x03\x8F\xD4\x92\xE3\xC7\x04\xEC\xFA\x1C\x02\xC2\x35\xF6\x01\xF5\x6F\x31\x00\x0E\x02\xF0\xC6\x03\x0C\xF0\xCB\xEF\x02\x04\x20\x07\xF0\xC0\xFC\x17\x8F\xAB\x00\x01\x0F\xFC\x8C\xD9\x07\x08\xF1\xD7\xEF\x8E\x03\xC4\xF2\xEC\xDA\x91\xAF\x0B\x07\x0B\xF1\xDE\xF2\xCA\x53\xC8\xFD\x0D\xCA\xE3\x1A\xFB\xA9\xCD\xD4\x2E\x00\x26\xFD\x1E\x9B\x03\x26\xFC\x35\xA2\xC7\xFB\xEC\xFD\x9B\x87\xCE\xC9\xF8\x79\x8B\x01\x30\xFF\x44\x08\x0B\x3F\xFB\x10\x06\x38\x0C\x1D\x21\x03\xC7\x39\x13\x06\xF2\xFA\xF8\xF6\x12\xAE\xAD\xF3\xDA\xF5\xB9\xBF\xCF\xF7\xEC\x0E\x01\x43\xFD\x94\xF5\xCC\xBD\x62\x48\xFC\xF5\x00\xE6\xC8\xA7\xAF\x0B\x13\x06\xF2\xDE\xCB\xC7\x01\x40\xE2\x93\x4C\xF0\xBD\x36\x16\x07\xF5\xD6\x09\xD4\x02\xD6\xF9\x26\x3F\xF5\x6C\x05\x19\x06\xF2\xEE\xCB\xE1\x02\xCC\xFB\xF5\xD8\xD7\x1A\x19\x1C\x07\xF6\xEB\xC1\x6A\xFF\xD8\xFF\xD8\xFC\x55\x6F\xFC\xA8\x51\xF7\xE8\x1E\x9E\xF4\xA8\x69\x08\x35\xFD\x67\xCC\x2C\x48\x79\x93\xFD\xF2\xD5\x53", "\x35\x09\x1F\xFD\xA6\x0D\x06\x08\x97\xD2\x06\xAF\xF4\x68\x00\x0A\x3C\xFD\xEC\x1A\x09\x0E\xF7\xD3\x04\x80\xFD\x9F\x64\x7E\x2C\x02\x8C\xFD\xB9\xBF\xF8\xE4\x10\xC9\xE5\x64\x08\x0B\x15\xFE\x73\x2A\x10\x07\xF9\xD5\xB3\x20\xED\x71\xCC\xF9\xC7\x26\x9F\xFF\xDA\xF8\x9D\xFD\xCC\xA3\xFE\xB1\x0E\x05\x25\xFE\x72\xFC\x2C\xEF\x0B\x69\xFE\x4B\xD4\xEB\xF8\xF7\xE6\xF1\xCE\x41\xCB\xF6\x25\x3A\x01\xB0\x42\x57\xA1\xF9\xC1\xBA\x36\x70\xEC\xFA\x34\x09\x02\xB2\xFC\xE2\xFD\xDE\xC3\x66\x8F\x02\x1E\xF3\x11\x17\x02\xC1\xFF\xEE\xF0\xE9\xBA\x19\xC5\xFE\x20\xFB\x89\x25\x02\x87\xFE\xF2\xF4\x52\xA7\x11\x18\x01\xF3\xFB\xC8\xE7\xD3\xD1\xFE\x80\xF2\x22\x16\xFF\x94\xF3\x26\x2F\x0B\x30\x42\x70\xB6\xF4\xFC\xE0\xD3\x04\x30\x00\xF7\xF4\xF2\xF3\x29\xCF\x00\xF8\xF0\xF9\xD4\xF8\xBD\x35\x0F\x06\xFE\xE5\xF2\x84\x8D\xF2\xFD\xB7\xE0\x06\x49\x03\xFB\xFE\x2E\xED\x03\xF2\xFE\x2C\xF6\x24\x55\x01\xEF\xFE\xAB\xDB\x0F\x39\xFE\xEB\x7E\x15\x7C\x5E\x12\x0C\x06\xFF\x76\x12\x0A\x00\x64\x73\x7F\x7F\x17\x7E\x6B\x2E\x0D\x05\x00\x86\x1D\x18\x00\x08\x80\x01\x81\x8A\x70\xA8", "\x32\x0F\x0D\xFF\x77\x91\x64\xE7\x61\x7F\x95\x7C\x50\x37\x21\x05\x02\x8B\x0E\x57\x00\x91\x00\x9D\x7D\x16\x66\x0E\x81\x53\x4E\x03\x88\xF9\x6E\xDD\x7A\x06\x22\x80\x9E\x60\x12\x80\xE8\x7A\xDC\x75\xDC\x68\x01\xA5\xC2\x64\x73\xBA\x7F\x77\x78\x11\x2B\x17\x0E\x02\x93\x53\x35\x01\x30\x80\x1F\x80\x7B\x79\x9A\x18\x19\x0D\x00\x8C\x08\x14\x03\x6F\x7F\x83\x06\x42\x00\x04\x85\x04\x8D\x6B\x79\x7E\x16\x03\x3D\x80\x06\x02\x71\x00\x10\x83\x22\x02\x09\x03\x02\xAB\x00\xDC\x77\x67\x08\x72\x00\x12\x83\x20\x00\x0F\x0B\x02\xB5\x27\x4E\x80\xA6\x7E\xDB\x48\x5E\x12\x1E\x03\x05\x82\x08\x3E\x03\x56\x80\x0C\x02\x57\x00\x16\x85\xF5\x7A\xA9\x69\x73\x00\x00\x10\x01\x35\x4E\x06\x00\x1A\x80\xE2\x71\xB4\x43\x03\xB3\xFE\x7C\x77\x81\x6D\x35\x80\xA3\x6B\x03\x02\x07\x97\xDE\x4A\x03\x38\x80\x10\x03\x73\x02\xD2\x7C\x4D\x25\x07\x9E\xA1\x5D\xF9\x54\x07\xE8\x00\xEE\x02\x1E\x83\xA8\x76\x2C\x03\x65\x77\x08\x7A\x62\x1E\x01\x3E\x81\x37\x66\x58\x0A\x0E\x1B\x03\x9A\x18\x20\x00\x8A\x80\xA2\x7D\x47\x03\x1D\x0C\x1D\x0D\x04\x84\x02\xBC\x05\x67\x7C\x83\x01\x72\x52", "\xC3\x01\x02\x0A\x04\x9E\xCB\x59\x01\x55\x75\xD0\x00\xD7\x79\xFB\x1C\x02\x1E\x04\xAC\x19\x21\x81\x99\x81\x5B\x51\x32\x0A\x11\x8E\x2E\x73\x07\x2E\x01\xA2\x81\x86\x41\xA8\x7E\x3D\x09\x15\x82\x10\x00\x4F\x46\x49\x43\x00\xAC\x80\x2B\x05\x00\x00\x50\x78\x79\x54\x05\x80\x00\x43\x49\x4D\x1B\x27\x01\x2E\x87\xB3\x0C\x0B\x93\x08\x3E\x02\xB3\x32\x4D\x1B\x2D\x03\x30\x81\xFB\x45\x0C\x99\x56\x41\xB9\x3D\x1B\x67\x00\x53\x83\x24\x2F\x54\x76\x0C\x89\xFC\x75\xB1\x4B\x81\x0A\x2B\x66\x81\x37\x5A\x88\x70\x1A\x1E\x03\x18\x03\x9B\x11\x46\x00\x6D\x83\x19\x29\xF3\x7E\x17\x0A\x04\x1F\x03\xF3\x14\x54\x00\x71\x83\x40\x06\x17\x83\x4E\x6B\xA7\x67\x03\xDB\x10\x62\x00\x75\x82\x40\x06\x17\x8A\xB2\x74\xC6\x22\x02\x6F\x81\xC6\x04\x38\x02\x3C\x80\x16\x8E\xFA\x64\x3F\x2E\x02\x78\x81\xBC\x04\x3F\x03\x3E\x86\x17\x8C\x1E\x71\x0C\x3A\x02\x0A\x81\xAE\x6C\x46\x00\xA0\x76\x2B\x5E\x0B\x86\xEF\x6C\x05\x47\x01\x00\x82\xA5\x07\x26\x03\x20\x86\xC7\x6D\x6A\x13\x03\x11\x82\x81\x24\x8A\x82\x80\x71\xCD\x1F\x0D\x12\x06\x9A\x15\x37\x01\xD4\x80\x67\x81\x45\x69\xFB", "\x1A\x0E\x1E\x08\xAC\x1B\x44\x01\x21\x83\x6D\x81\x17\x64\x2D\x05\x0F\x08\x08\x8B\xA9\x00\x75\x70\x5A\x5F\x83\xF8\x7C\x3A\x07\xDE\x0E\xB5\x61\x03\x30\x82\xD5\x80\x51\x79\xF6\x1F\x01\x07\xDE\x0E\x97\x71\x03\x1A\x82\x1F\x2F\x98\x39\x4F\x87\xE7\x00\x14\x80\x49\x78\x25\x27\x00\x35\x83\x3C\x61\xD4\x74\x21\x80\x67\x6E\xAD\x34\x00\x43\x82\xA6\x06\x0E\x01\xD4\x75\x17\x8A\x00\x83\xB0\x50\x05\xDA\x0A\x2A\x01\xA9\x81\x4E\x82\x02\x8B\x60\x69\x0A\x84\x13\x51\x76\x31\x83\x0C\x83\x53\x39\x0B\x0E\x15\x94\x4F\x60\x05\xDB\x82\x20\x80\xD7\x2A\x19\x05\x2C\x8C\x6E\x18\x02\x27\x05\xA2\x82\xD9\x79\xC8\x03\x1C\x04\x2D\x86\xE7\x2F\x0B\xAA\x04\xF7\x6A\x69\x1C\x40\x00\x5D\x84\x91\x7B\x14\x88\x0B\x87\xB6\x2A\x15\x7B\x83\x2D\x13\x21\x05\x2F\x80\x17\x85\xDE\x54\x3C\x57\x82\x06\x02\x53\x03\x79\x1B\x70\x06\x09\x1A\x0A\x85\x06\x95\x5E\x94\x58\xC4\x83\x40\x04\x16\x0B\x18\x81\x2F\x0E\x06\xF7\x82\x55\x72\xBC\x12\x2D\x02\x32\x88\xA2\x35\x0C\x90\x04\x32\x01\x97\x83\x71\x83\x57\x74\x88\x24\x0C\x1C\x0C\xA7\xE6\x1E\x83\x0C\x02\x60\x01\x68\x83\x1D\x8A", "\xF2\x69\x73\x12\x03\x26\x83\xDE\x00\xD4\x83\x73\x3B\x35\x83\x0F\x92\x95\x66\x70\x01\x83\xED\x00\xD9\x82\x75\x2C\x30\x8C\x5B\x5C\x0E\x2E\x03\x32\x81\x1D\x03\xDF\x82\x6C\x4F\xD8\x1F\x0E\x07\x6F\x12\x02\xFD\x1E\x85\x62\x78\x03\x79\x1E\x5B\x6B\x0E\x19\xDD\x6F\x03\x23\x81\x46\x25\x7D\x03\x72\x83\xF7\x2E\x1C\x84\xFB\x5A\x05\x06\x00\x92\x00\xE3\x7C\x3C\x12\x7C\x78\x79\x4F\x0E\x90\x04\x71\x01\xC0\x82\xE4\x80\xDB\x78\x72\x49\x1D\x8E\xD9\x4A\x0D\x13\x00\xDC\x82\xF1\x83\x08\x7A\xC3\x0E\x01\x05\x0F\xB7\xEC\x3C\x05\x21\x01\xF4\x81\x33\x59\xBD\x6D\xD4\x0A\x01\x2E\x07\xD4\x73\xC2\x07\x17\x02\x7C\x81\xCB\x79\x30\x76\xFE\x37\x07\x91\x64\x73\x15\x1E\x01\x1A\x7B\x3E\x86\x2D\x6F\x15\x01\x01\x7F\x83\xF0\x7E\x7B\x2F\x7E\x82\x59\x59\x8A\x5B\xF2\x08\x08\xEE\x65\x58\x01\x05\x84\x33\x24\x1C\x8C\x16\x19\x02\x0F\x08\xF6\x32\x12\x85\x66\x14\x29\x76\xB5\x25\x06\x17\x10\xA6\x0E\x74\x00\x19\x84\x35\x18\x16\x7C\x1A\x31\x07\x1E\x10\x9A\x15\x02\x01\x21\x84\xEF\x81\x3F\x80\x2F\x1D\x07\x06\x11\xB7\x55\x29\x84\x3C\x77\xEC\x1D\x22\x00\x41\x8E\x6A", "\x7E\x04\x22\xEF\x5E\x52\x2A\x85\x16\x6D\xAC\x5E\x45\x8B\x89\x0D\x05\x30\x08\xC3\x7F\xB7\x5C\x1E\x87\x9C\x13\x17\x0F\x23\x9F\xE3\x45\xF7\x08\x84\xDE\x65\x64\x03\x80\x84\x3F\x8B\xDF\x69\xE0\x08\x09\xD6\x04\xD6\x01\x25\x84\x83\x81\xD4\x54\xFF\x54\x11\x89\x94\x62\x77\x70\x5B\x1C\x87\x40\x03\x26\x81\x85\x56\x12\x87\x1A\x58\x84\xEA\x83\x3D\x59\x53\x1E\x1B\x02\x24\x9B\x42\x03\x00\x24\x79\xDD\x83\xF9\x7D\x64\x02\x1D\x05\x26\x86\x16\x11\x00\x68\x84\x61\x85\x44\x55\xE1\x1E\x4B\x8A\xBD\x04\xE5\x78\x08\xCD\x82\xD4\x31\x01\x03\x24\x02\x3B\x8C\x10\x0E\x01\x30\x09\x84\x84\x8C\x60\x9B\x5B\x9E\x86\x3C\x8F\x95\x1F\x13\x8C\x09\xDE\x6A\xD9\x1F\x0D\x03\xA0\x86\x4D\x7C\x2B\x0A\x02\x24\xF2\x59\x84\x62\x83\xA3\x6B\xA2\x85\xFB\x73\xA7\x1A\x02\x0F\x0A\xF1\x84\x24\x5A\xF2\x0D\x0D\x03\x52\x87\xFE\x7B\x42\x2A\x01\x17\x85\x80\x85\x51\x7D\x6F\x1A\x08\x0C\x29\x85\xB5\x5B\x22\x7A\x00\xA0\x85\x43\x84\x5A\x5C\xFC\x0F\x04\x05\x15\xAE\xDA\x0A\x01\x76\x84\x4C\x85\xA8\x37\x55\x0C\x05\x0E\x15\x96\x09\x19\x01\xB1\x85\x50\x85\xC0\x7C\xFC\x09\x06\x05", "\x15\xBF\x84\x75\x00\xA5\x85\xC1\x04\x2A\x06\x50\x83\x25\x82\x2D\x65\xEA\x3E\x85\x13\x03\x41\x01\xB0\x83\x22\x06\x0B\x04\x16\x93\x08\xC7\x3E\x4D\x1B\x42\x00\xB2\x87\x36\x3B\x2C\x87\x31\x0E\x0B\x9A\x84\xA3\x82\xD7\x2B\x24\x03\x5A\x8A\x17\x15\x16\x8C\x04\x78\x79\x40\x54\x2D\x86\xFB\x67\x55\x01\x0A\x1C\x16\x86\x04\x2D\x01\xDE\x85\xBA\x7B\xB5\x82\x44\x87\x5B\x6D\x6A\x2F\x02\x36\x85\xCC\x67\x74\x87\x40\x05\xA1\x7C\x57\x70\x07\x1C\x07\x60\x83\x97\x80\xA5\x04\xBE\x82\x74\x06\x48\x25\x15\x87\x07\x90\x02\x00\x57\x90\x6D\xF6\x1F\x17\x0E\x2F\x96\x12\x3D\x03\x24\x79\xF7\x03\x79\x02\x23\x82\x24\x45\x30\x97\xF2\x70\x10\x5C\x03\xFA\x01\xF0\x80\xDB\x24\x3B\x07\x0F\x12\x18\x8C\x04\x74\x01\xDC\x03\x7C\x02\x5E\x61\x18\x02\x2F\x93\x53\x35\x03\x07\x70\xD9\x1F\x61\x01\xC3\x82\xAB\x0E\x0F\x08\x18\x93\x04\x76\x01\x0B\x87\xE2\x63\xC8\x84\xCC\x76\x4F\x08\x19\x9E\x10\x16\x86\x06\x03\x8A\x86\xC0\x82\x5F\x7B\x32\x82\x5E\x26\x0C\x90\x02\xF8\x01\x94\x85\x78\x1D\x66\x8E\xE7\x64\x22\x1A\x0C\x90\x02\x1F\x87\x7C\x86\xF0\x01\x62\x8D\xB7\x50\x19", "\x83\x04\x7B\x01\x85\x63\x63\x01\xA9\x86\x5B\x61\x9C\x74\x14\x80\x00\x48\x86\x77\x7A\x69\x03\xD2\x81\x0F\x60\xDC\x70\x1A\xA1\xEB\x20\x03\xDD\x00\x73\x87\x26\x12\x03\x0F\xDD\x73\x08\x16\x0D\x9C\x63\xAE\x2B\x74\x02\xD6\x83\x4E\x18\x02\x1D\x1A\x90\x04\x5F\x86\x4A\x4F\xB0\x53\xD8\x83\x65\x16\x36\x87\x21\x39\xFD\x4F\x3A\x01\x00\x4A\x00\x9F\x86\x20\x04\x04\x0D\x1B\x86\x04\x68\x86\xB1\x73\xA6\x19\x03\x02\x6E\x8E\xFC\x72\x0D\x55\x0D\xD6\x81\x7E\x02\x0C\x00\xDF\x87\x3D\x8A\x34\x1F\x02\x36\x0D\xC7\x86\xDC\x80\xD3\x33\xE0\x80\x3F\x82\x36\x0D\x03\x07\x0E\x82\x02\x78\x87\x4E\x70\xF9\x08\x06\x0B\x38\x89\xDA\x44\x11\x29\x7B\x40\x55\xC8\x85\x3B\x86\xB5\x2C\x03\x15\x1C\x89\x08\xE2\x06\x89\x01\xC7\x87\xD3\x83\x44\x80\xAA\x28\x02\x1E\x0E\xEE\x65\x97\x00\xD1\x85\xE4\x81\x3C\x7F\xB5\x67\x1D\x96\x09\x25\x01\xAA\x87\x18\x86\x91\x20\x0C\x0E\x39\x8E\xB5\x73\x02\x07\x3A\x5E\x53\xC8\x86\x43\x82\x60\x0E\x3A\x95\xCE\x31\x0E\xC0\x84\xAE\x2B\x3C\x01\xEF\x82\xAB\x00\x0D\x1F\x1D\x86\x09\xBD\x1B\x85\x00\xCF\x86\xB7\x66\x1B\x0F\x37\x83\x09\x86", "\x49\x10\x01\xCA\x86\x3B\x0D\xF3\x84\x4A\x86\x24\x3B\x04\x35\x0E\xBB\x2F\x07\x3A\xB8\x59\xE4\x84\x4B\x86\x10\x08\x05\x17\x0F\xA6\x07\x08\x00\xC2\x26\xF6\x84\xFD\x79\xFD\x15\x05\x03\x0F\xEC\x0D\x18\x01\x72\x7D\xE4\x84\xC3\x71\xF7\x27\x1F\x8B\x41\x6A\x87\x2E\x74\xBC\x11\x33\x07\x7B\x8A\x55\x14\x01\x04\x4E\x39\x87\x78\x85\xCC\x72\xFB\x83\x4E\x13\x04\x10\x1F\x8E\xE4\x4B\x4E\xFB\x87\x2D\x11\x14\x06\x7F\x8C\x15\x80\x0D\x32\x03\x74\x87\xEC\x0D\x2F\x02\xF8\x86\x6B\x81\x29\x8F\xE3\x48\x10\x9B\x11\x6F\x01\x05\x8B\xD9\x81\x9C\x70\xAA\x2C\x00\x20\x37\x2E\x6D\x75\x7D\xB6\x6B\x04\x8E\x04\x80\x98\x17\x20\x9E\xA0\x12\x88\x6E\x86\x31\x74\x11\x2E\x04\x0E\x41\x99\x46\x77\x0F\x8C\x88\xAA\x6C\x19\x45\x09\x8A\xAB\x0E\x0A\x07\x21\x9B\x10\xB3\x6D\xAE\x2A\x20\x00\x78\x1F\x27\x4C\x04\x00\x6F\x02\xCA\x04\x88\xC6\x85\x8D\x3F\x0C\x8B\x22\x0A\x05\x16\x21\x8C\xCA\x38\x88\x50\x80\x0D\x0C\x17\x03\x87\x8E\xDC\x5E\x21\x90\x04\x59\x01\x40\x88\x8A\x7A\x86\x0A\x0D\x04\x44\x9F\x87\x46\x11\xA3\x65\x49\x88\xDC\x57\x19\x08\x0F\x0D\x44\x80\xFB\x0F\x11", "\xAF\x65\x51\x89\x2A\x53\x53\x3E\x10\x0B\x42\x86\x08\x13\x02\x57\x88\x48\x5A\x93\x7E\x57\x54\x1F\x00\x32\x86\x92\x15\x02\x60\x1B\xC3\x65\xA6\x7C\x44\x05\x1F\x0A\x33\x89\x73\x16\x02\x68\x88\x4E\x7E\x7F\x00\x77\x04\x8C\x82\x34\x93\x8C\x1C\x07\x11\x87\x47\x7A\x63\x76\x97\x03\x68\x00\xF4\x76\x1F\x70\x11\x8E\x86\x58\x2D\xC1\x06\xDB\x74\x65\x87\xAC\x78\x5B\x3C\x11\xC7\x1D\x98\x00\x30\x89\xCF\x84\x7A\x03\x00\x07\x24\x8B\x4C\x0A\x89\x8C\x7C\xE1\x04\x01\x06\x91\x8C\xCB\x30\x24\xB4\xDD\x38\x02\x94\x89\x95\x32\x25\x88\xF0\x6F\x13\x19\x24\xB8\x25\x20\x01\x9B\x89\xC6\x6C\xEA\x1E\x93\x8D\xD4\x02\x05\x21\x12\xBC\x75\xD9\x19\xA1\x06\x02\x03\x90\x83\x10\x04\x05\x3F\x11\xFF\x80\xF6\x09\x55\x89\x6C\x0C\x95\x83\x75\x27\x25\xA2\x0D\x0B\x00\x43\x06\x07\x00\x2D\x89\x92\x8F\xD3\x79\x10\x03\x0D\x24\x00\xBB\x89\x53\x02\x2D\x8C\x88\x03\x01\x19\xF9\x67\x75\x43\x06\x37\x01\x5D\x89\x2A\x07\x95\x86\x10\x0A\x05\x10\x12\x95\x00\x6A\x89\x1A\x07\x2F\x8B\x97\x8C\x0A\x03\x26\x94\x0F\x16\x00\xC6\x88\x69\x8B\x1C\x33\x97\x8E\x0A\x0C\x26\x83\x04\x2F", "\x01\x90\x88\x0C\x01\x34\x8D\x78\x03\x34\x09\x00\x3B\x12\xB1\x01\xDE\x89\x45\x8B\x2D\x1B\x68\x0D\x00\x1B\x25\x97\x12\x9F\x5A\x43\x06\x06\x02\x3B\x8C\x93\x80\x4F\x82\x24\x33\x13\xA2\x89\x9B\x10\x08\x03\xD0\x00\x97\x85\x47\x84\x22\x11\x00\x43\x06\x1A\x01\x5D\x8A\x2C\x01\x9D\x8C\x4B\x84\x26\x83\x0D\x14\x00\xF7\x88\x54\x8A\xB1\x00\xA1\x80\x11\x16\x00\x09\x14\xBD\x89\x73\x14\x86\x89\xD4\x1B\x97\x83\x0B\x16\x26\xB6\x13\x19\x00\xD9\x89\x8E\x0C\x32\x8B\x97\x85\x0B\x04\x28\xB6\x02\x10\x89\x1B\x01\x71\x89\x81\x03\x9A\x86\xF3\x16\x28\xBB\x2B\x19\x8A\x23\x8B\x6D\x88\x3B\x4C\xA0\x8B\x0B\x10\x24\x9E\x00\x22\x8A\x02\x02\x87\x8B\xCC\x84\x88\x2D\x0B\x04\x28\x8A\x2F\x30\x8A\xBC\x0F\xA1\x06\x04\x03\x97\x8E\x0B\x16\x29\xB4\x13\xAF\x64\x43\x07\x0A\x03\x43\x88\xA9\x7E\x00\x83\x1A\x32\x14\xEC\x7A\x85\x89\x4D\x11\x06\x07\xA0\x83\x54\x9A\x23\xA5\x5F\x43\x06\x13\x01\xA6\x89\x5B\x7A\xAB\x01\x50\x9B\x47\x12\x15\x9D\x02\xBF\x00\x93\x8B\xB2\x13\x68\x01\x02\x1B\x25\x81\x03\x3E\x8A\xF8\x88\x81\x01\x07\x03\x68\x0F\x01\x17\x2A\x8E\xFD\x63\x8A", "\x2C\x03\x5D\x8A\x30\x00\xAC\x82\x3C\x00\x01\x38\x14\xE8\x8A\x0C\x03\xAA\x8A\x86\x0B\x18\x0C\x56\x82\x1B\x21\x00\x38\x8A\x1E\x00\xB2\x8A\x59\x88\x90\x80\x00\x19\x2B\xA9\x15\xD9\x6E\x75\x8A\x22\x0A\x08\x00\xAF\x80\x50\x9B\x25\x85\x03\x01\x8B\x9A\x1C\x9C\x89\x59\x88\x22\x0C\x01\x1B\x25\x86\x03\x08\x8B\x53\x8A\xFF\x16\x5E\x8D\x9F\x84\x3D\x00\x01\x2A\x12\xBB\x89\xC7\x00\xC8\x89\x47\x04\x04\x08\x53\x96\x2C\x90\x04\x72\x8A\xE4\x0E\x64\x02\x66\x8B\x22\x05\x02\x18\x29\x9D\x15\xD9\x0D\x7B\x8A\x58\x89\x47\x02\x04\x04\x52\x9F\x8F\x23\x16\xA6\x07\xC0\x89\x08\x29\x6A\x8E\x20\x0A\x0C\x1A\x2A\x90\x04\x25\x00\x43\x06\x13\x03\x6C\x8B\x20\x0C\x0C\x16\x2D\xB0\x41\x43\x06\x23\x01\x5D\x8A\x33\x07\xB5\x8A\x55\x1A\x2D\x90\x04\x27\x00\xBB\x8A\x75\x8A\x67\x23\x68\x0B\x09\x87\xD9\x20\x37\x5E\x65\x26\x00\xDB\x7F\x71\x8B\x68\x06\xA5\x15\x90\x0F\x17\xCC\x58\xD2\x8A\x86\x00\x72\x8B\x82\x7D\xD4\x05\x07\x15\x11\x9B\x11\x40\x00\x9B\x7F\x44\x03\xBB\x88\x99\x6F\xEA\x31\x03\x5F\x8B\x73\x14\xA6\x7C\x90\x54\xBC\x81\xAF\x6E\xAD\x3D\x03\x68\x8B\x5B", "\x10\x2E\x02\x78\x8B\xBA\x84\x1F\x9D\x9C\x00\x03\xEE\x65\x6A\x01\xF9\x8A\x76\x8B\x68\x07\xA0\x59\x7E\x15\x00\x40\x81\xDE\x64\x3C\x01\x76\x8E\x20\x0C\x5E\x93\x60\x78\x25\x20\x00\xF7\x8A\x2B\x05\x21\x02\xBF\x84\x60\x83\x1A\x17\xA8\x43\x3C\x09\x8D\x06\x18\x83\x8B\x20\x05\x60\x9E\xED\x64\x1F\x38\x00\x11\x8C\xAD\x09\x28\x03\xC2\x82\x10\x15\x30\x9B\xC0\x1A\x0C\x44\x01\x0C\x8F\x69\x3C\xC3\x8A\xE6\x03\x1A\x35\x03\xA0\x35\x50\x00\x11\x8F\x26\x15\x17\x04\x62\x9E\x30\xAC\x0E\x92\x43\x2A\x8D\x39\x17\x32\x05\xC5\x83\x34\x05\x08\xBE\x05\x68\x00\xC0\x80\x57\x6D\x36\x02\x8C\x83\x5E\x83\x1A\x3B\x0E\xC7\x02\x75\x01\x18\x8F\x16\x10\x1D\x04\x63\x80\x1E\xB1\x9E\x42\x8C\xC6\x04\x7B\x01\x91\x8F\x78\x89\xFD\x0D\x04\x00\x18\xD6\x04\x04\x01\x1A\x81\x89\x8E\x79\x84\x44\x38\x04\x0F\x19\x89\x0E\x52\x8C\x0F\x8C\xF7\x83\x20\x03\x0A\x19\x31\xB0\x38\x6F\x7F\x70\x5A\x2D\x8F\x2E\x88\x16\x0E\x65\x86\x1D\x2E\x00\x60\x8C\x3D\x8C\x9D\x82\x91\x25\x17\x08\x64\x9C\x15\x3E\x00\x6F\x7F\x98\x4E\x0F\x8C\xFB\x87\x28\x09\x0C\x0D\x33\x8A\x0D\x4C\x00\x70\x8D", "\x34\x8E\x09\x45\xBB\x75\x66\x9A\x2A\x1A\x01\x6F\x7F\x5E\x52\x0F\x8E\x51\x69\x32\x02\x0E\x16\x33\x82\x0F\x69\x00\x79\x8C\xFA\x8A\x92\x64\x6A\x16\x68\x97\x9E\x09\x1A\xFB\x8B\xA0\x76\x9A\x02\x3E\x05\xCF\x85\xC9\x68\x33\x8A\x1A\x88\x85\x46\x25\x03\x03\x25\x05\x4B\x7C\x2B\x15\x04\x16\x1A\x90\x8D\x71\x82\xBF\x00\x05\x03\xD3\x86\xA6\x73\xBA\x1F\x1A\x8D\x8C\x1C\x88\x00\x01\x08\x04\xD4\x8C\x28\x8A\x1A\x35\x02\x27\x8D\x14\x8D\xA1\x05\x24\x33\xE5\x7C\x6A\x8E\x1A\x86\x0B\x45\x01\x80\x8C\x3D\x8F\x9D\x64\x27\x25\x6B\x9D\x14\x86\x0B\x3F\x80\x7C\x6A\x0F\x8E\xC2\x5C\x88\x28\x04\x1D\x35\x81\xEA\x54\x00\xC6\x8D\xC1\x07\x38\x07\xD1\x88\x6A\x85\x02\x86\x49\x56\x00\xC6\x8D\x9F\x42\x18\x01\xD9\x83\x11\x11\x07\x0C\x1B\xB1\x8D\xD0\x85\x35\x59\xB4\x89\x62\x44\x6D\x9A\x08\x17\x1B\x9D\x8C\x43\x07\xD7\x54\x35\x32\x0E\x0B\x6D\x81\xE0\x5D\x1B\x94\x50\x8A\x81\x38\x8F\xD0\x07\x7D\x65\xD9\x25\x37\x86\x74\x67\x8D\x85\x15\x74\x8E\xAE\x8C\xE6\x7A\x61\x0E\x04\x06\x1B\xF9\x48\x9B\x00\x78\x8E\xBF\x0A\x11\x8E\x95\x48\x01\x00\x17\xBB\x89\x9D\x00\x63", "\x8F\xBF\x84\x21\x09\x02\x03\x1A\x3E\x1B\x94\x8B\xF6\x08\x15\x03\xD0\x00\xB7\x88\x70\x9D\x08\x2B\x00\x43\x06\x2D\x01\x5D\x8A\x27\x02\xE0\x8E\xF4\x71\x38\x80\xB6\x49\x8B\xC8\x4C\x7D\x8F\xFE\x2B\x68\x00\x03\x18\x38\xAF\x13\x82\x02\x2E\x01\xD6\x88\xF9\x09\x14\x0A\x71\x9B\x42\x38\x00\x0A\x81\x83\x07\x90\x8F\x2F\x3B\x97\x83\x0A\x06\x36\xB2\xEA\x3A\x00\x8A\x81\x83\x0E\xCA\x8C\x21\x08\x0A\x1B\x25\xA6\x02\x2E\x8E\x56\x05\x1E\x01\xCC\x8B\x22\x03\x73\x99\x16\x0A\x13\xB8\x8E\xA6\x06\x20\x02\x22\x84\x8A\x0D\x73\x96\x2B\x14\x13\xC0\x8E\x5A\x0A\x22\x03\xD0\x8C\xE7\x83\x34\x1B\x32\x82\x04\x2F\x01\x48\x8E\x76\x0C\x12\x03\xE9\x81\xE9\x0D\x3A\x82\x14\xD1\x8E\x9B\x10\x26\x00\xD5\x8D\x4F\x83\x34\x07\xF2\x64\x1F\x35\x01\x58\x8F\x39\x14\x14\x03\xE7\x85\x75\x8A\xFA\x3B\x12\xB8\x01\x61\x8F\x2D\x13\x14\x04\xEC\x8C\x75\x8A\xB8\x7B\x12\xBB\x01\x69\x8F\xB1\x30\xDB\x8C\xEF\x03\x34\x03\x06\x3C\x14\xF1\x8E\xBC\x05\x2C\x03\xDC\x8B\x20\x05\x74\x82\x08\x09\x03\x5E\x8A\x78\x8E\xA5\x04\x17\x03\xEF\x80\x72\x83\x1A\x19\x03\x3B\x89\xC4\x01\xC0\x8E", "\xF0\x07\x0B\x04\x78\x80\x00\x3D\x1D\x80\x00\x6E\x00\xCC\x8A\xE2\x8F\xFC\x0D\x78\x8F\x3C\xB3\x03\x3B\x89\xCA\x01\xC9\x8C\x11\x0D\x0C\x0B\x75\x94\x3B\x90\x04\x65\x00\xBB\x89\x66\x02\xE6\x8C\xBA\x55\x79\x83\x1A\x0F\xFA\x45\x2B\xA3\x8E\xD9\x11\xE7\x8C\xEF\x86\x7A\x9B\x25\x93\x03\x29\x8F\x06\x5D\xD5\x8D\xE1\x8C\xD5\x3B\x4B\x96\x06\x30\x1E\xDD\x5E\xA5\x8E\xA0\x87\x2E\x89\x1B\x07\x7B\x9C\x91\x32\x1E\x8E\x8F\x43\x07\x74\x5D\x9A\x1C\x1B\x0D\x7B\x84\x40\x3F\x1E\x8F\x8F\xC2\x8F\xDE\x1B\x37\x05\xF8\x86\x10\x1F\x03\x07\x1F\xC3\x06\xF2\x01\x5D\x8A\x38\x04\xF9\x8A\x19\x2F\x3E\x90\x04\x16\x8E\x01\x3A\xEA\x8F\x62\x61\xF7\x8D\x40\x6A\x25\x2E\xA8\x5A\x8F\x00\x00\x73\x83\x4B\x5B\x22\x0F\x02\x1C\x38\x9E\x1C\xBF\x8A\x00\x01\xF2\x8D\xC2\x1B\x97\x8B\x0E\x05\x39\x86\x0B\x0D\x01\x28\x8E\xF2\x8F\xD0\x07\x14\x0B\x4B\x8D\x07\x20\x1F\x8F\x01\x8D\x8E\xF5\x8C\xCD\x8B\x97\x80\x0F\x00\x3F\x92\x02\x79\x8F\x43\x06\x44\x03\x2E\x8B\x1E\x00\x7E\x95\x04\x3F\x1E\xFA\x8F\x3E\x29\x5D\x8A\x3D\x00\xFC\x89\x09\x07\x40\x96\x1D\xE7\x08\xF9\x00\xF0\x8D\x27", "\x06\x01\x9B\x12\x9A\x0A\x3C\x03\x60\x8F\xA1\x00\x0A\x90\x99\x06\x9D\x80\x7E\x85\x05\x00\x20\xE6\x8E\x67\x08\x01\x00\x26\x03\xFC\x86\x3A\x08\x05\x1F\x20\xD3\x3E\xBB\x89\x02\x03\x08\x91\xA7\x5A\x0E\x27\x41\x86\x04\x76\x8E\xE6\x29\x15\x91\x50\x5B\xAF\x7E\x82\x83\x08\x3F\x1D\xE8\x68\x32\x90\xA4\x5A\x95\x01\x16\x05\x83\x81\xD8\x7B\x12\x8E\x00\x39\x90\xA9\x5A\x56\x0C\x16\x0D\x83\x90\x3C\xBB\x12\x91\x00\x41\x90\x00\x02\xAC\x77\x16\x05\x84\x97\x3C\xA7\x11\x14\x00\x49\x90\x59\x77\x41\x83\xCC\x0A\xBB\x03\x1A\x20\x1E\x97\x17\x51\x90\x2B\x06\x2F\x05\x08\x97\x7A\x8B\x51\x19\x21\xA6\x07\xC1\x00\x0D\x90\xA6\x88\x11\x3F\x85\x81\x6E\x22\x21\xA7\x2A\xBB\x88\x10\x01\x19\x94\xDD\x09\x0C\x05\x42\xB5\x03\x3B\x89\x23\x01\x35\x93\x26\x14\x19\x07\x86\x99\x14\x83\x28\x72\x90\x73\x14\x68\x01\x1D\x95\x61\x37\xBB\x18\x43\x9B\x21\x54\x01\x7B\x91\xE8\x8C\xF3\x1E\x0F\x9B\xA8\x1B\x43\x98\x1F\xF1\x42\x84\x90\x5E\x04\x37\x05\x08\x91\x00\x1E\x3E\x99\x3F\x32\x00\x89\x90\xC2\x45\xE3\x8D\xE3\x87\xB1\x1B\x25\xB5\x00\x49\x90\x03\x8F\x19\x23\xD0\x07", "\xF1\x89\x47\x91\x2C\x9B\x22\x32\x00\x22\x8E\xBC\x12\x0D\x01\x09\x91\xE4\x76\x27\x22\x03\x11\x81\x57\x1D\x8D\x8B\x19\x08\x07\x08\x89\x98\x0C\x24\x22\xED\x2C\xA1\x91\x4E\x2D\x2B\x96\x74\x03\x0E\x08\x45\x90\x04\x34\x00\xAA\x90\xA4\x8B\x44\x04\x07\x0F\x8A\x96\xB3\x03\x0D\x25\x91\xA0\x02\x1F\x03\x2C\x92\xAB\x04\x0E\x16\x45\x87\x06\x43\x06\x31\x01\x57\x07\x0F\x03\x18\x9C\x6E\x05\x07\x06\x23\x91\x2D\x43\x06\xB0\x5F\xF7\x3C\x19\x9B\x89\x06\x07\x0F\x23\x9A\x2D\x46\x8A\x03\x84\x35\x93\x4E\x17\x0E\x17\x46\xA3\x5A\x41\x8A\xAF\x04\x21\x03\x36\x93\xC8\x8E\x8D\x97\xB6\x07\x14\xAF\x05\x43\x01\x71\x91\x21\x85\x1C\x95\x03\x03\x1A\x01\xBE\x68\x09\xEA\x90\x5E\x05\x49\x86\xF0\x57\x8C\x93\x1B\x87\x05\x45\x00\xF1\x91\x81\x68\x3B\x93\x9F\x87\xD3\x19\x47\x82\x0F\x6C\x01\xFB\x91\x29\x17\xAB\x07\x08\x0E\x8F\x82\x1B\x2D\x03\x01\x92\x54\x24\xBC\x10\x12\x05\x20\x94\x44\x0E\x07\x08\x24\xDF\x15\x4C\x22\x86\x90\xF5\x07\x1D\x0F\x90\x99\xA7\x25\x4A\x12\x92\xF6\x08\x78\x01\x45\x92\x20\x03\x01\x0D\xB5\x18\x24\x9D\x02\xF1\x01\x8D\x90\xEF\x0F\x55", "\x0C\x04\x1F\x48\x93\x04\x72\x01\x22\x92\x0F\x00\xBE\x0B\x1C\x9E\x04\x1D\x45\x9A\x17\x65\x91\x36\x01\xA1\x07\x0C\x03\x97\x80\x05\x06\x49\xA6\x0E\x49\x89\x76\x1D\xF3\x8D\x58\x88\x00\x08\x03\x03\x1A\x3A\x00\x3A\x92\xA8\x89\x9F\x90\x44\x04\x07\x00\x94\x90\x28\x80\x00\x42\x92\x13\x8B\x48\x4A\x4B\x94\xDD\x04\x0F\x11\x3F\xB8\x09\x39\x91\xAB\x79\x71\x90\x15\x03\x29\x93\x10\x16\x07\x25\x23\xBB\x00\xB1\x91\x34\x1E\x15\x04\x2A\x93\xA7\x17\x07\x0E\x25\xC9\x32\x50\x92\x09\x6F\x38\x91\x0B\x0C\x95\x80\x00\x39\x03\x65\x91\x44\x92\x74\x31\x51\x94\xA8\x85\x28\x03\x1A\x18\x25\x8D\x8E\xA8\x35\xA1\x05\x5A\x92\x17\x9C\x57\x9E\x01\x03\x0D\x7E\x53\xBD\x1B\x2D\x01\x59\x96\x58\x0A\x0F\x05\x47\xB6\x25\x9C\x0B\x11\x21\xB2\x93\x17\x05\x2C\x9B\x0F\x1E\x4B\x83\x0D\x0B\x6E\x69\x15\xBD\x90\x2D\x75\x1C\x90\x04\x03\x1A\x3F\x00\x3B\x89\x63\x00\xC5\x93\x4E\x91\x08\x0E\x98\x9B\x25\xA5\x01\x12\x93\xA8\x88\x21\x03\xD0\x04\x08\x0B\x96\x8E\x2A\x8C\x04\x1C\x93\xF1\x0F\xCE\x92\x27\x92\x20\x00\x9A\x89\x4A\x9A\x18\x67\x00\x98\x92\xB1\x05\x3F\x07\x2B\x94", "\x37\x81\x4B\x9B\xEA\x63\x91\x6A\x01\xBD\x91\x39\x95\x08\x09\x95\x9D\x6D\x2C\x01\x29\x93\xB7\x12\xDD\x82\x40\x04\x36\x9A\x52\x9A\x30\x2E\x01\x63\x91\x6F\x01\xB2\x92\x00\x06\x38\x89\x99\x5F\x45\xAF\x0A\x71\x00\x36\x92\xF2\x00\x71\x92\x9C\x08\x8C\x8D\x18\x09\x27\xDD\x08\xCB\x92\x86\x02\x11\x01\x1A\x9F\x2A\x13\x03\x0F\x27\x84\x02\xD1\x92\x83\x03\x74\x95\xA1\x88\xA8\x17\x4E\x83\x08\x59\x93\x03\x03\xED\x90\x43\x05\x02\x0F\x2A\x15\x03\x1E\x27\xC5\x08\xE0\x92\x81\x02\x78\x90\xEF\x59\x2D\x27\x4F\x88\x00\x69\x93\xD8\x76\x77\x90\x0D\x1F\x3C\x99\x00\x10\x4F\xAB\x27\x8C\x87\xD4\x30\x3C\x03\x79\x92\x01\x06\x9F\x9C\x47\x8F\x2A\x67\x93\x0B\x01\xFE\x92\x40\x97\x31\x27\x9E\x8C\x00\x02\x28\x89\x92\x4D\x1B\x3D\x03\x79\x95\x01\x07\xA0\x90\x48\x9B\x23\x67\x93\x0E\x01\x06\x96\x45\x91\xFB\x1D\x07\x07\x4F\xBC\x04\xF4\x91\xDA\x92\xA8\x8A\xA5\x17\x3C\x90\x01\x12\x50\x88\x1E\x28\x06\xE7\x93\x08\x02\x87\x95\xAF\x82\x8E\x03\x47\x81\x02\x65\x92\x12\x00\xF8\x93\x11\x03\x68\x03\x04\x02\x4D\x89\x15\x82\x02\x48\x00\x16\x96\x8B\x92\x01\x43\x34", "\x11\x51\xB0\x25\xAA\x08\x77\x93\x63\x1F\x20\x00\x37\x94\x3D\x13\x00\x3A\x26\xFF\x21\x43\x06\x90\x6E\x86\x0D\x10\x05\x96\x87\x04\x25\x25\x95\x00\x3F\x95\x24\x03\x61\x97\xD8\x19\x08\x1C\x51\xB6\x13\x17\x00\x3F\x94\x25\x03\xD0\x07\x3E\x9D\xD4\x1F\x38\xA5\xA2\x43\x06\xBC\x92\xBA\x92\x6A\x8B\x22\x0B\x04\x15\x31\xB3\x28\xA6\x07\x4C\x01\x07\x92\x96\x94\x90\x8C\xA3\x0D\x3D\xB7\x28\x8C\x02\x61\x95\x54\x8E\x95\x93\xF8\x03\x34\x0D\x02\x3B\x12\x8B\x01\x4E\x95\x17\x97\x3D\x0D\x4D\x9B\x4B\x8D\x04\x31\x29\xD6\x04\xC2\x8F\x27\x03\x97\x94\xDF\x24\xA7\x83\x78\x37\x29\xB8\x63\x43\x07\x28\x03\x9E\x94\xDD\x03\x05\x02\x53\xA4\x1F\x11\x01\xE7\x93\x0C\x00\x7C\x95\x50\x95\x81\x87\x0A\x12\x02\x67\x93\x1A\x01\x45\x96\x99\x96\x89\x27\x9E\x9B\x00\x12\x2A\x91\x8D\x1E\x02\x4A\x03\x79\x94\x03\x07\xA9\x81\x35\xAC\x05\x15\x01\xE7\x93\x0E\x01\xA7\x91\x2D\x84\x8D\x36\x04\x27\x27\x9E\x00\xF0\x93\x2A\x03\xD0\x07\x0A\x08\x71\x97\x04\x3F\x29\x83\x5B\x9B\x93\x41\x97\x40\x07\x03\x00\x9F\x8C\x55\xAF\x34\x32\x95\x10\x18\xF8\x90\x16\x03\x68\x04\x05\x1B", "\x25\x99\x02\x11\x91\xA8\x89\x2C\x00\xAF\x93\x97\x8C\x09\x00\x56\x86\x25\xDA\x00\x5D\x8F\x5D\x8B\x27\x07\x3C\x96\x2C\x1E\x3A\x83\x04\x5D\x00\x18\x8E\x50\x03\xAB\x96\x20\x00\xAD\x9F\x52\x38\x2A\xDB\x10\xD5\x94\x50\x77\xB5\x92\xF5\x76\x9C\x92\xA7\x67\x27\xA1\x00\xF0\x92\x2F\x01\x73\x97\x8C\x03\x0A\x07\x4F\xA2\x00\x61\x95\xD4\x92\x4E\x3F\x79\x93\x04\x08\xAE\x9C\x4E\xA7\x11\x25\x01\xE7\x92\x12\x01\xBB\x93\x3C\x91\xF2\x07\x4F\xA5\x00\x73\x95\xEC\x92\x0D\x0F\x29\x07\x3C\x96\x02\x18\x57\x80\xBE\x30\x52\xE7\x92\xA4\x80\x86\x92\x6C\x11\x4F\x8D\x84\x67\x27\xA8\x00\xFE\x94\x00\x84\x0F\x7F\x3C\x99\x02\x09\x58\xAA\x2B\x6B\x28\xE7\x92\x15\x02\xC3\x94\xE3\x47\x14\x0C\x05\x27\x27\xAB\x00\x0E\x97\xD4\x5F\x53\x3D\x15\x07\x9E\x8C\x01\x0E\x2C\xB2\x2F\xA0\x34\x57\x03\x79\x95\x05\x0E\xB0\x9D\x48\xA5\x4C\x67\x93\x2E\x00\x87\x97\x05\x04\x27\x37\x9E\x8F\x01\x0E\x2C\xAA\x92\xB4\x0B\x71\x92\x2C\x05\x2C\x90\x03\x10\x4F\x9F\x01\x43\x06\x60\x01\x6D\x97\x1A\x54\xB9\x8F\x2A\x14\x05\x09\x21\xDE\x65\x31\x01\xC0\x81\xCE\x97\xAE\x7F\x0B\x1F\x59", "\x96\x09\x3E\x00\x42\x96\x9C\x94\x03\x59\x09\x9E\x2E\x6B\x02\x27\x37\x02\x51\x43\x06\x5B\x80\x11\x2E\x1A\x0C\xB4\x96\x12\x24\x05\xC0\x54\x43\x97\xF5\x80\xF9\x0A\x1C\x05\xB5\x86\x1D\x27\x01\x4F\x96\x8A\x51\xA1\x04\x32\x82\xC8\x5D\xB5\x8A\x01\x60\x2D\xD6\x95\xFD\x83\x11\x1E\xD1\x92\x49\x29\xB4\x9B\xE1\x7D\x36\x05\x00\x99\x00\x7B\x92\x40\x00\x12\x07\xB6\x91\x13\x0E\x18\xCA\x10\x71\x96\x42\x86\xD8\x06\x13\x05\xB7\x9D\x69\x03\x0D\x1F\x66\x88\x31\xBC\x94\xE1\x82\x78\x0C\x0A\x1D\x5B\xB7\xA2\x43\x06\x9B\x86\x6A\x31\x0A\x02\x70\x98\x9F\x94\x1E\x3A\x02\x06\x97\xC0\x50\x13\x8F\xAB\x05\x06\x0C\xB8\x96\x1C\xBD\xE6\x10\x97\xC9\x51\xA1\x07\x8B\x8C\x2D\x01\x04\x15\x5C\x9F\x0E\xC4\x08\xD6\x00\xCC\x95\xD6\x97\x16\x7C\x3F\x3E\x5C\xAE\xDA\x64\x01\xE7\x1A\xAF\x53\xE8\x94\xF7\x76\xD5\x1E\x5C\xAD\x02\xA2\x97\x43\x06\xA7\x75\x64\x06\x0C\x0E\xBA\x9A\x05\x88\x08\xD0\x96\x1B\x82\xEA\x36\xE7\x96\x5B\x6F\x00\x14\x13\xBE\x2D\xD4\x8C\xAE\x2B\x3E\x03\xEE\x96\x4A\x0C\x01\x1E\x5D\x87\x2E\x8D\x95\x34\x02\x44\x02\xE9\x92\x63\x28\x20\x90\x6B\x6B", "\x2E\xEC\x66\x67\x09\x4A\x03\xF2\x94\x89\x3D\xBC\x81\x5B\xAA\x19\xB7\x5D\xB5\x96\x7F\x67\xED\x96\x7A\x91\x14\x8B\x2D\x19\x2F\x84\x42\xDB\x96\xB4\x97\x9E\x8D\x07\x43\xBD\x9A\x2A\x1D\x08\xFC\x6A\xCF\x96\x00\x03\xA0\x8E\x2F\x07\x0C\x1F\x5E\xAC\x1B\x74\x00\xE1\x96\xBB\x97\xFF\x86\x22\x8E\xBE\x9E\x56\x71\x2F\xBF\x97\x05\x89\xC8\x03\x37\x05\x7C\x97\x57\x35\x5E\xA2\x2F\xE3\x90\xAE\x2A\x76\x00\xFF\x90\x09\x4E\xBF\x92\x5F\x9E\x2A\xDA\x02\xF9\x01\x01\x9B\x0D\x1D\x80\x98\xBF\x84\x55\xA0\x6A\x06\x00\x9A\x00\x4E\x8E\xD2\x00\x18\x0C\xC0\x87\x5E\xB8\x05\xBD\x1B\x13\x01\x08\x99\xA9\x8F\xB7\x38\x20\x8A\x5D\x83\x0D\x79\x7D\x44\x28\x10\x02\x06\x9D\xD5\x82\x3C\x1F\x06\x1D\x30\xDC\x97\x86\x82\xF2\x0D\x0B\x03\x84\x92\x04\x79\x01\x2C\x30\xF9\x74\x29\x6D\xFB\x96\x05\x99\x87\x8D\xDB\x1B\x01\x2F\x30\x81\x75\x47\x01\x1B\x9B\xE0\x04\x1F\x02\xC3\x91\x5C\x99\x1B\xF6\x61\x37\x98\xA3\x4A\x0E\x9E\x2C\x05\x2A\x98\x5D\xA7\xEF\x59\x1F\x57\x01\x20\x99\xDB\x13\x88\x9E\x36\x65\x62\xA8\x30\xE6\x48\xE4\x0F\x32\x02\x12\x9A\x87\x1C\xC4\x90\x83\x0E\x31", "\xFF\x97\xF4\x8C\xF2\x0F\x1C\x07\x86\x99\x47\x40\x04\x15\x31\xC5\x2C\xA5\x84\xAF\x51\x18\x03\x68\x0B\x05\x1B\x25\x82\x02\x37\x98\x99\x91\xEF\x53\xD0\x03\x8C\x97\xA6\x86\x08\x23\x01\x56\x90\xBB\x89\x41\x00\x1A\x9E\xE9\x77\x85\x8C\x08\x2B\x01\x18\x8E\x84\x01\x2F\x99\x29\x65\x5B\x93\xBE\x33\x63\x86\xC9\x3C\x86\xC8\x1D\x71\x96\x86\x0F\x10\x0E\xC7\x89\x3A\x80\x32\xE6\x00\x43\x07\x34\x02\xCE\x92\x69\x08\xC8\x99\x36\x23\x2A\x05\x99\x72\x13\x43\x99\x36\x97\x8C\x09\x08\x10\x64\xA0\x03\x92\x99\x10\x02\xF2\x90\x3E\x46\x92\x93\xA7\x07\x02\x18\x32\x97\x0B\xAF\x05\x45\x00\x27\x9B\x0B\x18\x04\x1F\x64\x86\x04\x6F\x91\x1A\x0C\x46\x03\x28\x9E\x58\x09\x04\x06\x65\x8D\x2E\xCF\x3A\x8D\x01\x55\x99\xA3\x86\x95\x9A\xB0\x8D\xF4\x32\x32\xC7\x16\xB4\x99\x87\x97\xC0\x1F\x96\x92\x3C\x0C\x02\x39\x32\x94\x96\x34\x02\x48\x00\x2F\x9A\x6C\x0D\x04\x19\x65\x9A\x2C\xA0\x03\x91\x01\x61\x98\x11\x0E\x09\x09\xCB\x80\x59\x8F\x75\x12\x01\xCA\x98\xEA\x05\xAB\x83\x60\x96\x9D\x5A\x50\xA4\x76\x51\x99\xF6\x08\x28\x01\x2E\x9B\x65\x97\x46\x14\x04\x18\x33\x9D", "\x02\x51\x01\x5C\x98\xCC\x91\x20\x43\xCA\x96\x04\x3A\x31\xBD\x2E\x80\x99\x33\x00\x1F\x9C\xFC\x08\x09\x1F\x66\x93\x04\x53\x00\xE9\x98\x41\x99\xCE\x46\x9D\x95\xD2\x11\x67\x8E\x32\x8B\x26\xF4\x99\xB4\x4A\x3D\x98\xEB\x08\xDA\x19\x67\x86\x04\x56\x00\xFB\x99\x0D\x07\xAB\x04\x13\x0E\xCF\x8A\x75\x01\x34\x83\x02\x14\x01\x57\x05\x27\x05\xA0\x92\x10\x18\x02\x07\x34\x94\x04\xFE\x4C\x86\x98\x00\x01\x0B\x0F\xD0\x9F\x5C\xA0\x6A\x1F\x01\x12\x9A\x2D\x01\x45\x9C\x69\x83\x11\x00\x05\x12\x34\xDB\x00\x15\x9B\xCC\x5D\xC5\x22\xA2\x95\x2B\x94\x66\x89\xB0\x43\x06\xC0\x98\x8F\x02\x28\x02\xA2\x9D\x05\x15\x68\x87\x33\x91\x03\xA3\x00\x89\x9A\x17\x05\xA2\x9E\xCC\x80\x0D\x24\x02\x12\x9A\x5F\x01\x8A\x9A\xC9\x92\xC3\x05\x0A\x12\x68\xA0\x01\x15\x9A\xDC\x98\x0D\x0E\x29\x02\xA2\x91\x06\x15\x68\xA3\x33\xE4\x0F\xA7\x01\x51\x98\x2A\x07\x9C\x95\x8D\x20\x64\xA8\x01\x43\x06\x64\x01\x5D\x8A\x2A\x02\xA2\x96\x2C\x0A\x64\x8E\xB7\x0B\x99\xC2\x06\x35\x03\xD0\x02\x9D\x9D\xC6\x85\x4D\x09\x32\xD8\x9A\x62\x07\x3B\x9B\x7B\x50\xAC\x94\x44\x0C\x03\x03\x0D\x11\x8F", "\x67\x09\x55\x00\x55\x9C\x57\x08\xD6\x8C\x08\x38\x01\x18\x8E\xAC\x00\xA6\x9A\xB1\x07\x0D\x0B\xCE\x9D\x75\x52\x34\xE3\x00\x80\x98\xBA\x9B\xD5\x5D\x64\x22\xD1\x84\x03\x39\x35\xE9\x95\x1A\x0C\x58\x02\x44\x9D\x0C\x0F\xD7\x8E\x57\x9A\x18\x31\x01\x12\x9A\x33\x01\x61\x9C\x5E\x97\x46\x12\x05\x12\x34\xE7\x00\x8B\x9B\x7C\x94\xF9\x0B\x16\x02\xD1\x88\x03\x11\x36\xFF\x95\xBE\x0A\x89\x99\xAF\x86\xA4\x9A\xD7\x9A\x5B\x94\x63\x35\x01\x12\x9A\x35\x03\x65\x9D\x96\x99\xFD\x16\x05\x12\x34\xEB\x00\xA3\x9A\x5D\x9A\x1F\x2A\xA2\x9C\x06\x09\x6D\xA9\x34\xA4\x6F\x12\x9B\x36\x01\x6A\x9F\xA5\x9E\x17\x19\x05\x12\x34\xEE\x00\xA9\x9B\x9A\x9A\x41\x82\xA2\x9F\x06\x09\x6D\xBB\x34\xCD\x7B\x12\x9A\x38\x01\x6A\x99\xA8\x94\x7E\x1C\x05\x12\x34\xF1\x00\xA9\x9B\xA3\x9A\x26\x23\x94\x9E\x0B\x0C\x6A\xB2\x01\x00\x99\x70\x00\xC4\x94\xC6\x88\x18\x02\xD7\x9A\x4D\x03\x0D\x74\x00\x64\x9A\xEA\x05\x1C\x06\xC4\x89\xDD\x96\x27\x1B\x37\x90\x02\x76\x01\xEE\x98\x83\x5B\x68\x03\x07\x18\x38\x82\x03\x55\x9B\x4A\x07\xF2\x9B\xCF\x5A\xBC\x93\x11\x0A\x6F\xBF\xC3\x6C\x9B\xEB", "\x9B\x6B\x4C\xC6\x8C\x18\x08\xDE\x82\x1E\x35\x01\x43\x06\xE1\x9B\xAE\x9A\x40\x01\xBF\x9C\x10\x0D\x03\x0E\x16\xEB\x9A\x4A\x07\x3B\x03\xD0\x01\xBA\x9A\xDF\x80\x00\x2F\x35\x90\x02\x9D\x9A\x0D\x3C\xFA\x8E\x58\x09\x07\x11\x5D\x98\x16\x80\x9C\xC2\x07\x3D\x01\x8E\x97\x8C\x08\x0C\x12\x68\xB3\x01\x00\x99\x7C\x00\x1F\x8F\x2E\x89\x19\x00\xE1\x82\x1B\x3D\x01\x75\x9A\x53\x33\xFA\x9A\xD8\x04\x0E\x00\xC8\x9F\x70\xBB\x35\x96\x29\x22\x9C\x22\x08\xB0\x86\xA4\x96\xE2\x9F\x7A\x6F\x0A\x4E\x01\x29\x9C\xBC\x39\x89\x9B\x92\x9A\x61\x10\x06\x31\x38\x89\x10\x33\x9D\x4C\x9B\xAB\x02\x1A\x07\xE3\x9D\x08\x38\x01\x39\x9C\xA0\x99\x33\x08\x35\x05\xC7\x9D\x54\x00\x72\xA7\x32\xB2\x5C\x44\x9D\x65\x06\x91\x9F\x95\x90\x1A\x18\x06\x09\x39\x84\x10\x4B\x9C\xD2\x9A\x91\x22\x1B\x0F\xE4\x9C\x96\x11\x39\xAA\x9B\x6C\x47\x2A\x9F\x40\x05\x0F\x07\xE5\x8F\x6D\x99\xCF\x5A\x9C\x02\x02\x3F\x03\x95\x9C\xB6\x9C\x16\x00\x07\x20\x39\xC7\x05\x57\x9C\xDD\x9A\x5F\x02\x1C\x07\xE6\x80\x04\x17\x39\xBF\x9B\x78\x12\x72\x03\x99\x99\x10\x07\xE5\x84\x6E\x8B\x9D\x67\x9C\x82\x01", "\x2B\x9E\x72\x9D\xA9\x18\x0E\x0C\x6A\xAA\x03\x4C\x9A\xCA\x84\x93\x9B\x1F\x04\x67\x9A\x22\x37\x61\x9E\xCB\x04\x01\xF0\x84\x86\x03\xA0\x9F\xAE\x77\x0F\x06\x74\x96\x09\x11\x01\x89\x9D\xE6\x8E\xD2\x91\x04\x9B\x09\x12\x5B\x9A\x91\x57\x98\x8A\x9D\xA8\x95\x11\x4D\xD2\x9E\xD9\x94\x1E\x2C\x02\x18\x9D\x92\x9D\xB9\x7D\xDC\x2C\xD3\x93\xB8\x8B\x0A\x60\x3A\x83\x02\x8B\x9D\x3D\x70\x49\x24\xD4\x9C\xE4\x93\x08\x08\x03\x27\x9D\x02\x03\x54\x9E\x41\x03\x10\x00\xDF\x99\x74\xA9\x2D\xF8\x12\x32\x00\x56\x9E\x94\x9A\x78\x06\x0D\x11\x74\xA8\x3A\xC3\x06\x0D\x77\xEC\x1D\x0F\x02\xD7\x96\xD1\x85\xFA\x70\x3A\xC7\x05\x77\x97\x33\x09\x12\x04\xD8\x9E\x13\x87\x76\xB2\x3A\x85\x35\xC5\x46\x66\x9F\xCF\x0E\xD9\x98\xB8\x8E\x8B\x12\x3B\xD0\x07\x9E\x86\xCC\x4F\xB3\x9E\xCE\x5F\x2A\x0D\x03\x17\x3B\xAD\x47\xD9\x9D\x89\x03\xB6\x98\x8C\x7A\x4B\x5F\x76\xB2\x4C\x61\x9D\x57\x63\x1A\x8F\x3A\x14\xD8\x9E\x6A\x77\x01\x1E\x0E\xDE\x52\xE3\x9D\x1F\x8C\x4D\x02\x12\x06\xEE\x80\x07\xA8\x3B\xB6\x9D\x47\x43\xCF\x0D\xBD\x98\x1D\x87\xEF\x81\x75\x8C\x19\x93\x77\xC4\x9C\x6F", "\x66\x18\x07\x81\x81\xEB\x83\x1A\x0A\xE8\x15\x61\x01\x9F\xEC\x54\xC1\x98\xD9\x98\xBC\x9E\x08\x00\x03\x6C\x9D\xB5\x54\xCF\x84\x5C\x5B\xDC\x9E\x74\x92\xD1\x10\x3C\xA6\x07\x8C\x00\x89\x9E\xB8\x9B\x68\x09\x65\x64\xF6\x3B\x3B\xAA\x66\xFD\x9D\x5F\x9E\x2A\x7B\xE9\x4F\xF1\x8E\x15\x61\x3C\x85\x9E\xFA\x7E\x22\x2A\x3C\x07\xE2\x9A\x55\x18\x05\x2F\x3B\x9B\x9E\x02\x81\x2A\x95\xC9\x9C\x57\x07\x0C\x07\x79\x8C\x3C\x8B\x8D\x4D\x1B\x05\x00\x27\x06\xD2\x95\x0D\x16\x79\xA3\x3B\xDD\x90\x7F\x0F\x9D\x9F\x06\x9E\x58\x03\x0E\x1A\x78\xA9\x3B\x98\x95\x9B\x8A\xA1\x9C\x09\x9A\x6C\x03\x0F\x06\x7A\xB8\x3B\x8E\x98\x4F\x3B\x18\x02\xD2\x9E\xD6\x8C\x2B\x03\x00\x20\x37\x13\x9E\xC1\x8F\x5D\x8A\x0F\x03\xEA\x9E\x6B\x94\x39\x17\x3D\xB0\x9E\x17\x99\xEC\x1F\x12\x04\xEB\x96\x2A\x93\x53\x23\x00\x60\x1B\xF0\x9D\x0F\x9B\xAB\x00\x0B\x04\xF6\x8E\xB5\x72\x00\x68\x9E\x60\x9F\x14\x98\x5E\x15\x0C\x04\xF6\x9F\x09\x71\x01\x64\x9E\x83\x07\x20\x00\x78\x1A\xDB\x93\x34\x1C\x5C\x4F\x75\x73\x00\x75\x9E\x71\x9C\xDE\x9B\x4A\x4B\xF7\x91\x7B\x81\x11\xE4\x0F\x81\x01\xC0\x9F", "\xA5\x03\xF0\x98\x8A\x05\x7C\x87\x3D\xC7\x98\x46\x25\x47\x02\xE2\x9B\x91\x6C\xF8\x96\x63\x8E\x3E\xCF\x9E\x50\x98\xBC\x11\x27\x03\xF2\x96\x10\x09\x05\x15\x3E\x86\x02\x79\x01\xCB\x9E\xBF\x9F\xA4\x7D\xDB\x0B\x05\x2D\x3D\xBA\x7E\x9F\x9E\xE5\x60\xDC\x9E\x2B\x63\x34\x01\x04\x35\x3A\x86\x02\x80\x01\xA1\x04\xAD\x9D\xC0\x9E\xFA\x94\xFA\x6C\x93\x64\x9E\xDE\x65\x37\x88\x7C\x65\xF6\x90\x9D\x4E\xA4\x38\x3E\xD6\x04\xA3\x01\x2E\x8B\x40\x04\xF7\x98\x9D\x56\xEE\x1C\x3E\x9B\x11\xB0\x00\xD1\x9F\xF0\x9A\xD3\x9A\xB3\x07\x7E\xA7\x50\x4A\x9F\x02\x02\xE2\x9D\xDA\x81\xCF\x4E\xFC\x9B\x42\x3D\x16\xC0\x54\xD2\x9E\xA9\x4C\xF9\x0C\x1E\x05\xFD\x87\xEE\x10\x3F\x80\x00\xD9\x9E\x83\x74\x5E\x15\xE2\x7D\x37\x83\x32\x82\x3F\xD1\x9F\xC0\x9D\x57\x07\x02\x04\xCB\x1E\x2E\x75\x07\x1F\x3F\xE1\x9F\x0F\x8D\xF2\x48\xFB\x9E\x4A\x03\x00\x00\x06\x98\x9E\x61\x9F\x80\x96\xD7\x2B\x08\x03\xFE\x99\x70\x16\x7F\x93\x04\x61\x9F\x89\x96\x50\x37\x0B\x04\xFF\x9A\xBD\x1E\x7F\x90\x04\x61\x9F\x27\x8D\xA7\x3B\x0E\x04\x00\xA8\x60\x26\x80\xA0\x15\x1A\x97\x03\x92\x06\xA3\x26", "\x13\x07\x0E\x00\xA6\x08\x21\x3F\xB6\x8C\x6C\x03\x29\x00\x97\x1E\xD5\x69\x04\x00\x06\x9E\xA5\x61\x9F\xF2\x9C\x8F\x00\x18\x02\x02\xA3\xA7\x18\x02\x15\x40\xCB\x9F\x46\x8C\x50\x34\x1B\x04\x04\xAB\x85\x06\x03\x27\x40\xE8\x9F\xB9\x97\xEC\x1C\x1E\x04\xCB\x1E\x2D\x74\x03\x14\x1A\xA8\xA0\x4D\x85\x1D\x28\x0D\xA6\x90\x37\x03\xB0\x81\x94\x0F\xC4\x28\x8E\x01\x0D\xA2\xA7\x40\x18\x80\xD7\x41\x7F\x95\x3C\x9B\x01\x42\xA0\xD3\x06\x27\x04\x08\xAF\xFF\x9C\x78\xB0\xA4\x2C\xA0\xC6\x04\x57\x03\x0B\xA0\xFC\x93\x34\x13\x33\xB4\x04\x34\x01\x50\xA0\x5E\x04\x2F\x03\x0A\xA1\xFE\x83\xF1\x51\xAC\x49\xA0\x9D\x6C\x0F\xA1\x13\xA1\xE6\x99\xE6\x0D\x06\x19\x41\xCA\x06\xD9\x00\x2E\xA3\x80\x98\xBF\x17\x06\xBF\x54\x2A\x41\xC8\x9E\x13\x03\x72\x00\x18\xA4\xDD\x05\x0F\x0C\x82\x87\x40\x93\x95\xD4\x3D\x39\xA1\x0C\x5E\xD8\x85\x04\xB9\x7A\xB1\x1C\x7A\xA0\x73\x15\x0A\x00\x1F\xA3\x0C\xA7\xC0\x87\x0A\x0C\x00\x0D\x14\xAE\x6D\x12\x03\x20\xA7\x0E\xA2\x42\x8E\xAD\x19\x00\x08\xA1\xD4\x70\x63\x8F\x07\xA2\xED\x94\x12\x30\x84\xB9\x97\x12\xA1\x84\xA0\xB9\x9D\x53\x1B", "\x06\x0D\xA0\x1F\x09\x7F\x00\x0D\x14\x83\x07\x29\x02\xB1\x8F\xFE\x9D\xF7\x86\x10\x9D\x42\xD5\x41\xA0\xA0\xE8\x57\x28\xA1\x13\xA7\xF8\x98\x4B\x0F\x01\x27\xA1\x50\x4F\x54\xA0\x82\x9B\x15\xAC\x08\xB0\x7C\xB8\x5E\x30\xA1\x0C\x03\x34\x02\x2C\xA2\x48\x24\x0B\xAF\x80\x9D\xF4\x4D\x1A\x6B\x00\x5C\xA2\x41\x07\x0E\x0B\x0B\xB8\x57\x7D\x42\x96\xA0\xC1\x8F\x16\x4E\x25\xA5\xA1\x25\x0C\xA3\x08\x19\x02\x18\xA1\xA2\x39\xD6\x9F\xEB\x9B\x20\x02\x08\x12\x7D\x93\x43\x82\x02\xB3\x9E\x86\x02\x1F\x03\x97\x88\x08\x0D\x50\x29\x31\xD1\x05\x43\x07\x71\x9D\x27\x92\x4E\x96\x2C\x05\x04\x01\x20\xD7\xA1\x82\x05\xA1\x05\x22\x00\x1D\xA7\x08\x1A\x5C\xBB\x12\x89\x01\xCD\xA0\xE5\x8A\xF5\x56\x1D\xAB\x6E\x31\x87\x85\x14\xD4\x07\xEB\xA1\xC1\x60\x3A\xA2\x11\x07\x0E\xA7\x23\x0D\x02\x5E\xA1\x6B\x6A\x8A\x8D\xB3\x62\x1D\xAB\x4B\x8E\x04\x00\x44\xA6\x07\xA9\x00\x81\xA2\x41\x3B\x68\x0E\x08\x08\x87\x8C\x02\x35\x93\xD9\x1F\x47\x02\x3D\xA6\x55\x45\x72\x8F\x88\xBD\x26\x87\x95\x07\xA3\x09\x6A\x3D\xA4\x15\x0A\x10\xBE\x98\x50\x44\xC6\x24\x94\x01\x89\xA1\x6B\x75\xE4", "\x8D\x08\x0E\x4D\xAE\x11\x99\xA2\x31\x46\x7B\xA0\xD4\x8E\xA4\x9D\x10\xB0\x08\x0F\x02\x68\xA1\x2D\xA3\xCB\x7A\x91\x21\x13\x08\x12\xA8\x7E\x9D\x44\xED\x05\x20\x9C\x6A\x4A\x48\xA2\x69\x01\x0B\x05\x39\xAF\x44\xB3\x8A\xAE\x2A\x4E\x01\x4D\xA6\xF3\x47\x13\xA2\x08\x3F\x44\xA1\x16\x0A\x9B\x9D\xA1\xC8\x4E\x27\xA0\xD8\x84\x3F\x1F\x02\x4A\xA2\x62\x06\x5B\x00\x53\xA6\xB0\x93\x72\x90\x8A\xBF\x98\x53\xA2\x8C\x9A\x0D\x0F\x28\x06\x2A\xAE\xB8\x98\x8A\x92\x36\xF8\x12\xA5\x00\xAE\xA2\x3D\x0C\x17\x0E\x15\xB8\x6C\xBA\x2B\xE2\xA2\x1D\x02\x5F\x01\x59\xA6\x72\x9F\xD4\x29\x05\x28\x45\x93\x02\xC0\x01\xB5\xA0\x14\x65\xA9\x1B\x0A\x0F\x8B\x90\x04\x42\x01\x72\xA2\x91\x9A\x86\x0D\x15\x06\x17\xA7\xAD\x72\x45\xDE\x9C\x10\x03\x57\x01\x5F\xA6\x20\x06\x0C\x12\x8B\xA4\x39\xCF\x46\x83\xA2\xA1\x5E\x5C\xA2\xCD\x9C\x16\x13\x05\x09\x46\x82\x02\x99\x8E\x4B\x67\x51\xA5\x21\x0A\x11\x4F\x8C\x80\x00\x4C\x01\x72\xA2\x3B\x9D\x53\x1F\x16\x06\x19\xAE\x06\x32\x45\xFB\x9C\x69\x1D\x5C\x02\x3D\xA3\x17\x06\x0F\xB0\x06\x25\x1C\x90\x01\x39\xA3\xDE\x19\x2F\x06\x32\xA2", "\x0D\x07\x8D\xB2\x33\xF8\x12\xBF\x00\xCB\xA0\x35\x06\x35\xA7\xCF\x9A\x30\x01\x03\x16\xA3\xB6\x8E\x4B\x64\x6A\xA4\x2A\xA8\x97\x03\x06\x16\x46\xD8\x01\xB4\xA3\xAC\xA1\x11\x46\x32\xAA\x0D\x01\x8E\x9F\x45\xCD\x1A\xC7\x00\xCB\xA0\xF1\x8A\x37\xA2\x9F\x87\x23\x09\x03\x16\xA3\xDE\x00\xE3\xA1\xAB\x9E\x2F\x0B\x0C\x16\x8C\xA0\x03\x52\xA3\xBB\x9C\xD7\x29\x33\x06\x32\xA3\x7D\x8C\x8E\x83\x28\x9A\x0C\xCF\x00\xCB\xA0\x39\x00\x3B\xA1\xFA\x59\x7E\x11\x03\x16\xA3\xE6\x00\xF2\xA3\x61\xA7\x28\x03\x0D\x16\x8C\xA8\x03\x64\xA3\x8C\xA2\xAD\x01\x35\x06\x32\xAA\x0E\x04\x8F\xB0\x39\xCD\x1A\xD7\x00\xCB\xA0\x3B\x04\x3C\xAA\x19\xA9\x73\x19\x03\x16\xA3\xEE\x00\xF2\xA0\x68\xA5\xB7\x1B\x0D\x16\x87\x9D\x03\x76\xA1\xFD\x8E\x4B\x65\x24\x03\x68\x0B\x08\x1B\x25\x9F\x03\x43\xA2\xF7\xA0\x20\x6B\xD0\x03\x37\xA3\xA6\x8B\xF3\x54\x0F\x12\x01\x13\x9C\x03\x10\x84\xA6\x58\x02\x0F\x05\x8A\x80\x00\x13\x01\x7F\x96\x74\xA0\x88\xA0\x22\x01\x13\xAA\x70\xBB\x24\xC1\x0B\x0E\x8C\x74\xA1\x25\x03\x68\x07\x09\x1B\x25\xA1\x03\x1B\xA4\xE8\x8F\x16\xA4\x50\xA4\x49\x30\x23", "\xB6\x46\x1E\x48\x98\x01\x43\x06\x4B\x03\x2E\x8B\x1C\x05\x23\xA8\x25\x99\x02\x43\x06\x9B\x00\x74\xA3\x8F\xA4\x33\x08\x0E\xA1\x92\x96\xCA\x3D\x1B\xE4\x01\x1E\xA6\xD8\x04\x1E\x0E\x21\xA6\x92\x81\x28\x45\xA4\xAF\xA3\xEE\x8A\x92\xA4\x88\x05\x0F\x0D\x92\x8D\x45\xCB\x4E\x53\xA4\xEA\x07\x02\x96\xA4\x9E\x24\xA6\x08\x28\xBD\x67\x08\xE7\x01\x2C\xA6\x3D\x0F\x1E\x06\x25\xBA\x71\xAB\x18\x62\xA4\x1C\x65\x32\xA5\x90\x9A\xCD\x68\x26\xB3\x08\x11\x20\xDC\xA4\xCD\xA2\x0D\x0E\x3A\x05\x4D\xA0\x11\x1A\x07\x2A\x49\xA5\x9D\xD4\x31\x75\x00\x9D\xA7\x84\x07\x27\xB6\xAF\x4D\x35\x6C\x01\x7B\xA5\xE0\x01\x9F\xA0\x71\x1F\x2A\x0D\x07\x01\x4A\x83\x02\xFD\x01\x41\xA5\x79\xA6\x48\x2E\x0E\x07\x94\x9E\x01\x8A\xA5\xEB\xA2\x9A\x03\x3B\x06\x51\xAB\x1C\x0A\x94\xB1\x47\xC7\x02\xF0\x00\x4A\xA4\x00\x03\x1C\x9D\x25\xA3\x08\x37\x47\xE4\x40\x94\xA5\x00\x00\xA7\xA3\x68\x0D\x1F\xA7\xE3\x54\x4A\xA2\x90\x70\xA4\x41\x43\xAB\x03\x1E\x00\x21\xB4\x07\x36\x43\x83\x00\xE3\x90\x4E\x01\x6A\xA1\xFB\x16\x0F\x14\x94\x84\x00\x31\xA5\x51\xA4\x89\x38\xA5\xA2\x05\x96\xD2\x92", "\x95\xB5\x46\xE4\x0F\xF8\x00\x4A\xA6\x01\x00\x57\xAC\x1B\xAD\x6A\x39\x03\x14\xA5\x07\x00\x62\xA6\x70\xA0\x2F\x1A\x0F\x14\x94\x88\x00\x4A\xA5\xC7\xA3\x34\x1F\x3E\x04\x52\xA9\x00\x10\x96\xA6\x45\xF9\x3B\x94\xA4\x05\x02\xB5\xA4\x2D\xA0\x1A\x1D\x07\x14\x4A\x8B\x00\xDB\xA5\xB9\xA1\x9A\x1E\x1F\x04\x29\xAC\x00\x21\x4B\xFA\xA2\x1A\x3C\x4A\xA5\x03\x01\x5C\xA0\x18\xA3\xAD\x23\x59\x40\x90\xBD\xA5\xA1\x05\xA4\xA6\x23\x01\x00\x11\xF9\x23\x59\x0F\x00\xE1\xA5\x4B\xA4\x4D\x02\x00\x06\x2F\xB6\x12\x10\x00\x61\xA5\x9F\xA5\xDE\x1B\x00\x05\x5F\xA9\x70\x01\x97\xA5\x4A\xD9\x1F\x04\x00\x82\xA6\xCB\x09\x5C\xA3\x20\xB9\x7E\x05\x00\x0A\xA6\x3F\x03\x98\x3F\xE0\x03\x02\x03\x8E\x9D\x04\x3D\x3D\xE8\xA1\x16\xA7\xF5\x8E\x39\x2A\x62\xAB\x34\x25\x4B\x99\x4C\x8C\x02\xF4\x8F\x33\x0A\x02\x01\xE6\x32\xAB\x76\x00\x3E\x21\x9F\xA6\xDD\x87\x5D\x89\x03\x04\x64\xA6\x25\x19\x00\x27\x4C\xFD\xA1\x1A\x0C\x08\x00\xCB\xA1\x2A\x89\x84\x94\x22\x28\x4C\xC6\x8E\x0A\x23\x99\xA5\x65\x45\x66\xAE\x4F\x66\x54\xB8\x25\x16\x00\x3A\xA7\x26\x5C\xCF\xA4\x48\xAD\xF0\x9D\x08", "\x19\x00\x41\xA6\xC9\x23\xA1\xA7\x93\xA0\x22\x0E\xAC\x8D\x6A\x1C\x00\x48\xA6\xE2\x19\x97\xA4\x08\x91\xAD\x50\x35\xBB\x42\x2F\x00\x52\xA6\x28\x90\xD6\x15\xD5\xA6\x58\x00\x89\x84\x41\x8B\x4D\xDA\x6F\xBB\x89\x12\x03\xD6\xA0\x3D\x28\x35\xB1\x7B\x3B\x12\xA8\x00\x63\xA6\x73\x31\xD9\xA1\xBB\x3B\x4B\x8B\x01\x29\x4D\xC2\x07\x3B\x01\xB5\xA6\x4F\x0B\x97\x8E\x02\x0F\x9B\x93\x54\x72\xA6\xB2\x0F\x5D\x89\x0C\x06\x6E\xA4\x44\x01\x02\x0A\x4D\xE4\x1F\x70\x99\x8F\x18\xDF\xA4\x7A\x08\x8F\x9E\x9A\x80\x4E\xF0\xA0\x73\x31\xC1\xA4\xE4\x27\x6F\xA6\x4C\x78\x83\xB8\x25\x3A\x00\x8A\xA7\x8E\x01\x49\x94\x0A\x9F\x35\xA4\x86\x3B\x12\xBD\x00\x91\xA6\xA1\x44\xDE\xA7\x0D\x9F\xFD\x39\x9C\x87\x29\x0C\xA7\x7B\x5A\x3F\xA2\x86\x0B\x08\x0E\x39\xA4\xC6\x20\x4E\x97\x46\xA2\xA6\xF2\x0E\x11\x05\x74\xA9\x76\x47\x9D\xB7\x4C\x82\x02\x82\x90\xA6\x20\xEB\xA3\x20\x03\x98\x94\x9C\x87\x4E\xD9\x2B\xBB\x88\x26\x03\xEC\xA2\x20\x01\x99\x86\x9C\x8D\x4E\x90\x02\xA7\x8A\x0D\x0F\x13\x00\x62\xA5\x0A\x75\x98\x83\x0D\x0D\x91\x67\x08\x28\x03\xEE\xA1\x81\x5E\x87\x9E\x04\x17", "\x4C\x85\x9C\xCE\xA6\x8D\xA6\x27\x74\x63\xA6\x3A\x11\x4D\x96\xCA\x51\xA7\x20\xA7\x5D\x89\x15\x03\x79\xA7\x9B\x9E\x9D\xA7\x39\x43\x06\x35\x8F\x2B\x17\xF2\xA1\x38\x9E\x3D\xBA\x22\x70\x4C\xE4\x0F\x5B\x01\xE5\xA6\x1C\x07\x74\xA8\x3D\xA9\x40\x96\x1C\x4B\xA7\x76\x00\xF6\xA6\xCF\xA5\xA9\x11\x06\x0B\x9E\xBA\x01\x72\xA7\x45\xA7\x3E\x07\xF2\xA6\x0F\x08\x3F\xBB\x40\xA7\x11\x67\x00\xCB\xA6\x41\x01\xF3\xA4\x45\xAB\x4B\x8A\x03\x0B\x4F\xC4\x94\xE5\xA7\xF6\xA5\x2B\x8B\x97\x8D\x06\x0B\x9E\x88\x02\x03\xA8\x50\x7B\x5D\x88\x1C\x03\x79\xA0\xA7\x89\xA0\x83\x0D\x37\x90\x4A\x0F\xE5\xA6\x23\x00\x82\xAC\x10\x07\x3C\x99\x4B\x4B\xA7\x88\x94\x0B\xAB\x6B\x5B\x97\x89\x07\x0B\x9E\x9A\x2A\xA2\xA8\xDA\x0B\x5D\x88\x1F\x03\x79\xAE\xAA\x96\x9D\x91\x0C\x01\xA7\x23\x47\xE5\xA7\x26\x04\x83\xA0\xC0\x94\xC6\x02\x02\x4B\xA7\x9E\x01\xFE\xA5\x0D\xA8\x54\x35\x08\x0B\x9E\xA2\x02\x3A\xA8\x68\x91\x33\x08\x22\x03\x79\xA6\x0A\x14\xA1\x83\x04\x1C\xA7\xAB\x23\xE5\xA5\x2A\x00\x88\xA6\x87\x8D\x6A\x0E\x02\x4B\xA7\x1C\x96\x17\xAB\xF7\xA1\xD5\x81\x09\x0B\x9E\xB1\x02", "\x4C\xA8\x00\x01\xD8\xA5\xB6\x6B\x79\xA5\x0B\x18\xA2\x87\x22\xF8\x12\x97\x01\xE5\xA5\x2E\x06\x88\xA2\x10\x01\x9E\xAA\x41\x44\xA7\x93\x4B\x71\x92\x02\xA8\xCB\x2E\x88\x95\x1E\x8B\x4F\xBD\x01\x7E\x91\x4F\x03\xF3\xA5\x42\xA2\x0F\xB5\x4F\x03\x0D\x1A\x01\xE8\xA1\x50\x03\xD0\x06\x57\xA4\x47\xB1\x90\x9D\x04\x7A\xA8\x44\xA7\x3E\xAA\x95\x92\x14\x03\x7F\x92\x38\xA8\x51\xFE\xA8\xD0\x14\xF0\xA6\xB2\x97\x90\xA3\x48\xA7\x4C\xBB\x12\xA0\x01\x8C\xA8\xF4\x8C\x29\x03\x68\x05\x0A\x18\x38\xA1\x02\x54\xA7\x5A\x0B\x4A\xA8\x44\x05\x53\xA5\xA5\x88\x3F\x80\x03\x63\x91\x9A\xA9\xCA\xA4\xBE\x6C\x2D\x96\x10\x01\x06\x23\x23\xA6\x01\x43\x07\x51\x00\xCB\x89\xE6\x39\xD2\x97\xB9\x43\x0D\x2B\x01\x18\x8E\x54\x00\x26\xAC\xDD\x01\x3E\xAD\x79\x58\x1C\xAA\x01\xB3\xA9\x4D\x11\x2A\x00\x48\xA7\xAD\x82\x06\x23\x23\xBB\xA9\x81\xA8\x13\xA4\x2A\x8B\x18\x03\x8E\x8A\x05\x29\x52\xD4\x89\xAC\xA8\xA7\x7C\x2C\xAF\x2D\x58\x0E\xAC\x05\x3C\x52\xC3\x7A\xC4\x01\x71\x92\x33\xA9\x98\xA3\x4A\xBE\x4C\x86\xA6\x63\x91\xAD\x01\x63\xA8\x6D\x09\x99\xAC\x57\x8E\x05\x03\x0D\x30", "\x01\xBB\x88\x5B\x03\x21\xAF\x16\x09\x4B\xB7\x61\x03\x0D\x2F\x01\xBB\x89\x5C\x01\x24\xAB\x27\x91\x0B\x1F\x88\x84\x51\x3A\x01\xE5\xA9\x17\x2B\x38\x95\x9D\xAE\x79\x7B\x25\xBC\x02\x07\xA9\xBD\x01\x78\xAB\x3B\x4E\x9D\xAE\x5A\x3F\x05\x2B\x53\xC2\x07\xC7\x01\x71\x93\x2C\x03\x68\x07\x0B\x13\x6E\xBA\x53\xBC\x05\xB4\x01\xA1\x06\x2D\x06\xBC\x97\x50\xAE\x35\x83\x0D\x32\x01\x88\x8F\xE5\xA6\xB1\x03\xA1\xAE\xC7\x08\x87\x85\x54\x90\x02\x09\xAB\x02\x9C\x2E\x04\x9F\xA4\x8D\x27\x06\x0D\x54\xC2\x07\xC8\x01\x71\x93\x46\xAB\x61\x1B\xE1\x87\xA4\x8A\x03\x1F\xAA\x4B\x42\x8E\xA8\xA8\x34\x19\x0F\x4F\xA2\x1B\x09\x03\x63\x91\xBA\x01\xA1\x04\x30\x00\xE3\x8D\x0C\x08\xA9\x84\x11\x3B\x01\xDF\xA9\x5D\x8B\x33\x07\x90\xA0\x0D\x11\xA7\x8A\x03\x63\x91\xBC\x01\xA1\x05\x2F\x00\x1D\xA1\x54\xBB\x2C\x68\x43\xC3\xAA\x10\x02\x70\xAB\x19\x0A\x1A\x07\x48\xB3\x06\x31\x53\xCB\x01\xE3\x90\x5F\x02\x50\xA8\x1D\xA2\x55\xA6\xAA\x85\x38\xBF\x01\x43\x07\x5C\x03\x2E\x8D\x1A\x02\x51\xBC\x15\x33\x54\x90\x02\x38\xAB\x02\x9D\x30\x05\xEE\x8B\x4B\x98\x06\x2D\x54\xA4\xA9", "\xD3\x6F\x0B\xAB\xEE\x8F\xAC\xA6\x4D\xA3\x08\x30\x20\xAE\x0C\x18\x8E\x6D\x02\x4D\xAC\x7A\x04\x0C\x0A\xA9\x8F\x75\x5C\x01\x73\xAA\x7B\x08\x33\x05\x2C\x95\x57\xB5\xA7\xA7\x11\x5E\x01\x87\xA9\x6F\x01\x3C\xAE\x19\x03\x8E\x85\x06\x03\x0D\x47\x01\xE8\xA0\xC3\xAA\xF4\xA4\xFC\x01\x0E\x19\xAB\x9D\x04\x4F\x01\x65\x92\xC5\xA8\xEF\x6B\x47\xA7\x48\xA4\x07\x31\x53\xD1\x01\xE3\x90\x63\x03\x61\xA8\x1D\xAA\x59\xAB\xAC\x8B\x9D\x0E\xAB\xF0\x1B\xB2\x91\x67\xAB\xB2\xAB\x62\x07\xA4\xA9\x03\x71\xA9\xD4\x01\x71\x90\x62\xAF\x2E\xAC\x7E\x9D\xAA\x8A\x0D\x48\x01\x43\x07\xBE\xAA\x20\xA8\xFD\x88\x41\xA3\xC3\x58\x1C\xEE\x01\xA0\xAA\xDE\x2A\x5D\xA8\x34\x00\x0F\x19\xAD\x89\xE1\x65\x92\xCA\x00\x82\xAB\x2E\x8A\x1E\x07\x48\xB3\x07\x31\x53\xD7\x01\xE3\x91\x65\x03\xD0\x06\x19\x08\x0E\xAA\xAE\x9E\x56\xE1\x52\xBE\xAA\xF0\x65\x59\x96\xB9\xA6\x9A\x8B\xB0\x11\x57\x83\x02\xDA\x01\xE9\xAA\x70\xA8\x02\x97\x48\xBA\x07\x31\x53\xDC\x01\xC9\xAA\x99\xAB\x2E\x8C\x1F\x07\x48\xBD\x07\x31\x53\xDD\x01\xE3\x90\x66\x03\x72\xA8\x1D\xAA\x5E\xAF\xAE\x8A\x9A\x57\xAB\x02", "\x02\x6F\x01\x59\x95\xBD\xA5\x5D\xBD\x66\x36\x27\x40\x91\xBC\x7B\xF9\xAB\x76\xA9\x18\x66\x9F\x17\x0F\x04\x00\x77\xAB\x13\x02\xAE\x96\x49\x9C\xBE\xA6\x10\x1F\xAA\x9A\x18\x06\x00\xFD\xAB\x89\x03\x01\x00\xC0\xAE\x79\x23\x47\x8D\x03\x6B\xAB\x05\x9D\x07\xAE\x7B\xAD\xB7\x19\x00\x0C\xB0\x84\x23\xE5\x92\x12\xAD\xD4\x83\x2E\x8B\x01\x09\x60\xA0\x14\x16\x58\xB2\x32\xE3\x90\xE6\xA8\x6B\xAF\x8C\x0E\x00\x16\x4F\x35\xF4\x67\x40\x43\x07\xE0\xA9\x81\x98\x1A\x0B\x5B\xB1\x0C\x11\x00\x1F\xAC\x9B\x11\x73\x03\x38\x94\xC5\xAF\xAD\x7B\x25\x93\x00\x1D\xAC\x97\x0A\x18\xAD\x28\x75\xC5\xAE\x17\x16\x00\x38\x58\xF4\x33\xE3\x90\x69\x03\xD0\x06\x1A\x08\x71\x97\x00\x3A\x58\xDB\x10\xD3\x01\x59\xA6\x91\x21\x03\x0F\x63\xBB\x44\x29\x03\x63\x91\x49\xAD\x13\x9D\xDC\x2D\xC9\xA3\xA7\x0A\x07\x10\x59\xD7\xA4\x4D\x1B\x0D\x00\x95\xAB\x0B\x1B\x0E\x17\xB2\x85\x4B\xB7\x27\x5B\xAC\x63\x04\x3B\x06\xCB\xAB\x2C\xAD\x6A\x1D\x00\x61\xAC\xBC\x05\x76\x00\x99\xA9\x5A\xA9\xC5\x28\xB3\x8A\x0D\x6E\x01\x6B\xAD\x6B\xA4\x5E\x17\x03\x0E\x66\xA2\x1E\x2F\x03\x71\xAC\xDC\xA5", "\xC8\x00\x08\x05\xCE\xA1\x51\x58\xB3\xA2\x4B\xBD\x1B\x21\x00\x3E\xAD\xAB\x16\xCF\xA8\x2E\xB5\x46\x42\x5A\xFB\x1B\x7E\xAD\x76\xA6\x41\x03\x04\x07\x68\xB6\x27\x33\x03\x7E\xAC\xF3\xA5\xCD\x89\xA3\xAE\x81\x0E\x67\xBA\x97\x9E\x04\x25\x00\x93\xAD\x89\x01\x3D\x06\xCF\xA1\x30\xB3\x95\x59\x5A\xDF\x25\x7E\xAD\x83\xA6\x91\x27\x04\x0F\x69\xAC\x08\x37\x03\x7E\xAC\x0D\xA6\x23\x24\x0A\x03\xCB\xA9\x02\x07\xB2\xB8\x03\x63\x91\xD4\x01\xA1\x05\x34\x05\x6D\xA5\x6A\xA0\x7C\x03\x0D\x31\xAD\x05\x9C\x22\xAD\xF3\x00\x1D\xA7\x0D\x06\x3C\xBB\x12\xAC\x00\xB5\xAD\x4D\x12\x07\xAC\x21\x0D\x0D\x18\x38\xAD\x00\x47\xAC\xC7\x3B\xA1\x04\x37\x00\x1D\xAA\x0D\x1C\xB1\xAC\x05\x2F\x00\xC8\xAC\x5E\x05\x3E\x05\x2C\x9D\x6C\xB5\xB1\xBE\xCD\x5B\xAC\x32\x01\x23\xAF\x3E\x03\x1C\x9B\x0D\x0A\xB6\xA8\x43\xDD\xAD\x13\xAD\xEC\x1C\x0D\x01\xDA\xAA\x34\x1C\x07\x25\x25\xE0\xAD\x0B\x77\x5D\x8A\x0D\x03\xCB\xA7\x03\x07\xB2\xBE\x03\x63\x91\xCB\xAD\x97\x7B\x2E\x89\x07\x01\x6C\xA4\x7C\x43\x0D\x55\xAD\xB3\xAB\x9D\x92\x37\x04\xBA\x88\x0E\xBB\xB7\x99\xAB\x7D\xAD\x43\x07\x76", "\x00\xC0\xAE\x10\x48\x0E\xA0\x07\x03\x0D\x5F\x01\xBB\x88\x1D\x02\x7D\x13\x5E\xA6\x2C\x01\x07\x03\x0D\x06\xAE\x05\x9C\x71\x00\x1F\x88\x1D\xA3\x0E\x03\x1A\x12\x5C\x85\x9C\xE4\x01\x83\xAE\xD6\x9B\xE1\xAE\xF4\x65\x07\x03\x0D\x15\xAE\x05\x9C\x73\x03\xD0\x01\xE3\xA5\xE0\x87\x07\x1A\x5C\xF1\x48\x1C\xAE\xBE\x88\x3A\x03\x68\x06\x72\xA5\x70\xA9\x03\x43\x06\x2B\xAF\x02\x9E\x3A\x07\xE4\xAA\x61\x06\x02\x29\x5C\xDB\x94\x37\x05\xA1\x06\xC7\xAD\xC0\x9C\x0E\x02\x5B\xA8\x43\x82\xAE\xC8\x52\x74\xA2\x3B\x03\x68\x03\x73\xA5\x70\xAF\x03\x7C\x8B\xE8\xA1\xA3\xAE\xEE\x8E\xE8\xA0\x7D\x88\x87\xB1\x03\x06\x9E\xBB\x88\x25\x00\xB9\xA8\x95\x8A\x45\xA4\x38\x68\x43\xCE\x90\x73\x19\xDC\xA7\xD4\xAE\x28\x94\x0F\x10\xBA\x82\xBA\x5B\xAE\x68\xAA\x81\x00\x12\xAE\x20\x0D\x75\xA5\x70\xB6\x03\x48\xAE\xC9\xA7\x7A\xAF\x72\x03\x1C\x97\x76\xAB\xBA\x89\x86\x6A\xAE\x00\x00\xCF\x97\x7D\x05\xED\xAF\xAF\x5B\x25\x92\x01\x6A\xAE\x01\x00\xB9\xAC\x06\x0B\x68\x0E\x0F\x18\x38\x93\x01\x60\xAE\xD4\x07\x7C\x02\x92\xAC\x88\x25\x05\x0A\xBB\x82\x00\x7A\xAE\x10\x02\xC1\xAE", "\x94\xA8\x2F\x16\x05\x0A\xBB\x83\x00\x08\xAF\xE7\x20\x2C\xAD\x9A\x1F\x0A\x0A\x76\xA4\x00\x10\x5E\xC5\x4B\x34\x9C\xF2\x0C\x16\x02\xED\xA0\xB7\x86\x69\x8A\x5E\xE5\xAC\x69\x1D\x2C\x02\xDA\xAE\x00\x07\x79\xBA\xC6\x27\x23\xCA\x53\x6A\xAF\x03\x01\xE9\xAA\x20\x0F\x79\xA7\x72\x92\xC4\x6A\xAE\x08\x01\xD5\xAE\x59\x95\x60\x91\xA6\x0A\xBB\x89\x00\x32\xAF\xAD\xAE\x3F\xA6\xB2\x4A\xED\xAA\x00\x18\xBD\x83\x0D\x05\xAD\x4D\x1A\x2F\x02\xDA\xAB\x01\x0E\x7B\xA0\xA7\x29\x39\x5F\x00\x6A\xAE\x06\x01\xF1\xAB\xC9\x24\x7E\x00\x03\x2A\x5D\x8D\x00\xCB\xAE\x09\x3D\x6F\x19\x0C\x0A\x76\xAE\x00\x11\x5F\x9E\xA5\xDD\x04\xB5\xAF\x03\x07\xFA\xAF\xA1\x87\x23\x23\x01\x6A\xAE\x10\x00\xEE\xAC\x89\x95\x2D\x6B\x65\xA5\x03\x07\x59\x91\x00\xB2\xAE\x7D\x03\xD0\x03\x1F\x08\x0E\xAA\xBF\xB9\x5C\xC3\x7A\x12\x01\xF4\xAF\xD0\x05\xE7\xA3\xD4\x73\x00\x32\x5F\x90\x02\x40\xAF\x7C\xAE\xF0\x04\x02\x07\x7F\xAC\x08\x03\x5D\xC3\x7A\x15\x00\xD9\xAC\xFB\xAE\xF6\x97\x9A\x96\x4F\x1E\xCB\x16\x00\x0A\x99\xA7\x84\x75\x8D\x61\x06\x80\xA3\x75\x09\x60\x83\xB0\x57\x87\xC8\x01\x1F", "\x06\x3E\x1E\x2E\x70\x01\x1E\x2E\x98\x4F\x10\xB0\xB0\x87\x8B\x6C\x02\xB7\xB4\x97\xC0\x9E\x0D\xB9\xA4\xA1\x1A\x0E\xB0\x98\x96\x03\xB7\x36\x82\x5B\xA4\x0B\xA2\xB0\x7E\x8C\x12\xB3\x09\x0C\xBF\x8F\x2A\x0D\x05\x0D\x60\xA6\x07\x68\x01\x07\xB1\xFA\x9E\xE6\x18\x82\xAC\x37\x35\x01\x2A\xB0\x77\x87\x64\x9E\x86\x0C\x18\x05\x83\xBB\x44\x03\x02\x38\xB0\x47\x87\xBF\x97\xAB\x00\x1A\x0D\x83\xB3\x53\x11\x02\x40\xB0\x90\x87\x6A\x9E\xCE\x15\x08\xBB\x85\x1F\x04\x08\x61\x8A\xB0\xAA\x70\xBC\x10\x3A\x04\x09\xB6\x2C\x0D\x05\x0F\x61\x99\xB0\x35\x66\xBC\x10\x3D\x04\x0A\xBC\x2B\x1B\x05\x17\x61\xEA\x9D\xEF\x20\xC5\x16\xAB\x69\x19\x0E\xB9\x99\x1D\xBE\x18\xAF\x05\x0D\x00\xC5\x16\xBB\x60\x1B\x0F\x85\xA9\x81\x8F\x75\x19\x00\x6A\xB0\x36\x0D\x1B\xB7\xDF\x94\x44\x25\x01\x0A\x2E\x5E\x65\xF4\x00\x19\xB0\xF0\x94\x1A\x30\x03\x17\xC3\xBA\x02\xDC\x98\x1F\xB1\xFC\xA5\x4E\x32\x0C\xBA\xFD\x37\x61\x9A\x0F\xF3\xA7\x69\x1C\x24\x00\x21\xB1\xA6\x46\x88\xA1\xC4\x9E\xE8\x7B\x7F\x71\xB0\x33\x8F\x0D\x98\x03\xB5\x05\xAE\x8B\x11\x62\xDA\x0A\x3C\x01\x49\xB2\x23\xB6", "\x28\x8C\x23\x6B\xC4\x95\x60\x37\x98\x66\xB0\x32\xA1\x6F\x1A\x0F\x07\x89\xAB\x50\x5A\x62\xA5\xB0\xF3\x97\x34\x1E\x21\x05\x14\xBB\x3B\x27\xC5\xAB\x60\x88\xA7\x13\x68\x4F\xB2\x0D\xB5\x11\xB8\x8A\xB9\x5F\xBE\x05\x1F\x01\xB2\xB1\x4D\x11\x21\x04\x16\xBF\x8A\xA5\x84\xB4\x04\x2C\x01\xB9\xB0\x46\x5C\x2F\xB1\x07\xB9\x6A\x99\x05\x01\x63\xDB\x10\x3D\x9A\x0D\x89\x2F\xB4\x05\x80\x27\x67\xC6\x86\x0B\x20\x9B\x7C\x6A\x2C\xB0\x2E\x67\x8C\x03\x0D\x0E\xC6\xB6\xB7\x20\xB1\x9B\xB0\x1D\x81\x6F\x18\x1C\x0C\x8A\xB3\x07\x8A\x2E\x11\x53\xAE\xB0\x62\xB2\xB3\x8C\x88\x2E\x0E\x1D\xC6\x80\x00\x7A\x01\xDF\xB0\xCE\x51\x38\xB1\x08\xBF\xC3\x91\x94\x66\x63\x88\x00\xA2\x00\x4B\x67\x3B\x03\x1D\xB9\x84\xB9\x16\x94\x63\x0A\x00\xF1\xB0\xF2\x6A\x05\x01\x1F\xB2\x2A\x66\x08\x3D\x03\x74\xB1\x50\xB0\xF9\x74\xEF\x3C\x1F\xBB\x2A\x64\xC8\xB0\x30\xDA\x03\xC4\x9C\x4A\xB1\xBB\x81\xCD\x16\x02\x06\xC8\xA5\x3D\xC5\x1D\x0E\xB3\xC1\x05\x06\x04\xD8\x93\x46\x9C\xB7\x83\xF5\x28\x00\xC4\x9D\xFB\x00\x3F\x03\xFE\xA7\xAD\x89\x01\x19\x64\x93\x02\x1B\xB2\xFC\xAF\xB5\x92\x05", "\x0F\x91\xA1\x21\x03\x0D\x7F\xAF\xFA\xAE\xB1\x07\x0A\x05\x24\xBC\x10\x1D\x07\x03\x0D\x77\x01\x96\x90\x87\xB3\x37\xA0\x00\x0D\x77\xA9\xBC\xA8\x43\xFF\x01\xC7\xA7\x36\xA8\x11\x2E\x06\x02\x93\xAE\xFA\x48\x4F\xEA\x19\x3A\xB2\xD7\x2A\xB1\x07\x06\x01\x91\xB0\xF7\x2A\x12\x78\xAB\x7E\x03\x1C\x01\x4F\xB6\x74\x0C\x02\x0C\xC9\xB8\x2D\x2A\x09\xC9\x91\x33\x0A\x0E\x03\x29\xB0\x60\x2E\xCA\xBE\x10\x2A\x09\xD2\x91\x69\x0C\x55\xB4\xDD\x0E\x02\x16\xCA\x84\x2E\x2A\x09\x5F\xA4\x0D\x0C\x0F\x03\x2B\xBF\x93\x3E\xCA\xB1\x27\x2A\x09\x9A\x98\x0D\x0D\x0F\x04\x2C\xB7\x89\x46\xCB\x82\x00\x2A\x09\x09\x9B\x33\x0A\x0F\x04\x2D\xBB\x85\x11\x01\x2E\x65\xAA\x09\xA8\x98\xF2\x0F\x0F\x04\x2E\xBC\x35\xB7\xCB\x96\x3A\x9D\x02\x40\x00\xBE\xB0\xAF\x03\x06\x0E\x97\xA5\x7F\xBD\x36\x41\x00\x82\xB2\xA5\x04\x0D\x05\x30\xB5\xA8\x01\x47\x89\x66\xC2\x07\x35\x00\xC6\xB1\xE0\x13\x74\xAF\x98\xB8\x9B\x12\x66\xF4\x08\xE8\x09\xCA\xB0\x11\x0F\x06\x07\x99\xB5\xDB\x0D\x35\x45\x00\x9A\xB2\xEA\x04\x0E\x05\x33\xBD\x69\xA6\x92\x06\x01\x21\xB3\xF6\x09\x1C\x01\x67\xB2\xD4\xA4", "\x44\x27\x02\x28\x66\x9D\x02\x3A\x01\xCE\xB1\xAA\xAC\xD8\x84\x97\xA9\x02\x05\x65\xB9\x32\x66\xB3\x01\x03\x51\xB5\xD5\x2F\x9A\xBB\x45\xB9\x66\xD0\xB2\x24\x93\xDE\xB3\x69\x07\x37\xBF\x2B\xB8\x4B\x0D\x01\x42\xB3\x66\x72\xE2\xB0\x3F\x9A\xD0\x58\x9C\xA6\x08\x3F\x00\x4A\xB3\x02\x9B\x33\x0B\x13\x05\x39\xB8\x16\x10\xCE\x88\x34\xAF\x05\x50\x00\xEA\xB0\xE6\x36\x3A\xB0\xD1\x91\x24\x5A\x67\x80\x00\x42\x00\xEE\xB1\xB1\x98\x34\x02\x05\x1F\xCE\x83\x01\x62\xB3\x1C\x9B\x23\x17\x77\xB4\x08\x02\x9E\xA0\xBE\xA9\x39\x54\x00\xDF\xB3\x22\x02\x78\xB2\xD1\xA6\x7A\x3F\xCE\x86\x01\x62\xB3\x91\xAD\x89\x02\x15\x07\x3B\xB7\x04\x02\xCF\x96\x5A\x9D\x02\x57\x01\xEF\xB0\x12\x02\x3C\xB5\x9A\xA4\xA2\x18\x01\x5F\xB3\xCB\x9C\x93\x9A\x6E\xB3\xF3\x04\x16\x3F\xCE\x8A\x01\x62\xB3\xB3\xB2\xD7\x2A\x16\x04\x2E\xBB\x05\x17\xCD\xB2\xA0\x66\xB2\x04\x01\x83\x0D\x50\xB4\x1A\x3D\x05\x1F\xCE\x86\x0B\x05\x00\xAA\x09\x0C\xB5\x81\x9E\x00\x0A\x4A\x00\xD1\x85\x38\x87\x00\xAA\x09\x05\xB5\x4A\xB1\xEC\xA9\xCD\x07\xCA\x9B\x68\xA0\x35\x6B\x95\x63\x2A\x2A\x09\x64\xAA\x61", "\x1E\x02\x16\x68\xFB\x41\x66\xB3\x04\x02\x2A\x0D\x96\xAD\x7C\xB7\xD1\x9B\x22\x4D\x00\x39\xB4\x55\x0A\x00\x97\x8C\x02\x06\x1E\xD1\xA9\x17\xC4\x9D\x83\x06\x1D\xB4\x44\x01\x1F\xAA\x61\x04\x03\x06\x69\x87\x13\x48\xB5\x89\x02\x92\xB7\x07\xAA\x16\x8F\xD2\x81\x92\x51\xB4\x0C\x2E\x55\x09\xC5\x98\x0D\x06\xA5\xBC\x15\x14\x01\x58\xB4\x6A\x2E\x55\x09\xD3\xA5\xAC\x2D\xA5\xB9\x24\x41\x69\xD3\xA6\xE4\x0E\x36\x01\x99\xB5\x0F\x27\xA6\xB9\x9A\xBE\x26\xEB\xB4\x57\x17\x36\xB7\x0B\x92\x82\xA0\xA7\xA4\x22\x19\x01\x72\xB4\x36\x91\x5D\x8A\x1C\x05\x4E\xB4\x3D\x1A\x02\x38\x69\xBE\x90\xE8\x40\x3E\xB6\x3D\x0B\x0B\x0F\xA7\xA6\x42\x99\x4B\x02\xB5\x1D\x02\x2E\x01\xA1\xB0\xEB\xA2\x8D\x08\xD4\x93\x04\x5D\x00\x60\xB5\xAF\x36\x2A\x0D\x8E\x94\x7E\x1A\x03\x0E\x6A\xE7\x22\x85\xB4\xA0\x9E\x40\x04\x0F\x07\xA9\xB1\x13\x11\x6A\xBD\x3A\xAA\x08\x4D\xB6\x7B\x65\x53\xB2\x41\x1F\xD4\x87\x75\x2A\x09\x12\x9D\x33\x08\x20\x04\x54\xB3\x10\x04\x03\x05\x6A\xE3\xAE\x78\x12\x41\x00\xAB\xB5\x2E\x66\xAA\xBD\x0E\x2A\x12\x49\x8F\xB1\x5F\x59\xB5\x02\x5D\x56\xB3\xA5\xB0", "\x7A\xA0\x06\x06\x01\xBA\xB5\x34\x00\xAF\xB2\x95\x05\x75\xAD\x6A\x08\x02\x3A\xB5\x6B\x01\x61\xB7\xF5\x8B\x97\x8A\x08\x1A\xD5\x9E\x3B\xA6\x9A\xBD\xB4\xFB\x03\x8B\xB7\xA9\x3C\x08\x1A\xD5\xAE\x01\x66\xB2\x0B\x00\x55\x0A\x02\x03\x5A\xB0\x1A\x0E\x04\x3A\x6A\xC6\x05\x0C\x00\x6D\xB4\xB7\xB1\x32\x00\x09\x1F\xD6\xBC\x0A\x0D\x00\xE2\xB4\xC2\x0A\xB9\xB2\x69\x0E\x00\x09\xD7\x9A\x18\x14\x01\xEB\xB4\xE1\x07\x03\x06\x5D\xB4\x7E\x16\x04\x31\x6B\xE2\x06\x10\x00\x7A\xB4\x5E\x10\x13\x07\xAF\xBE\x27\xBA\x6B\xCD\x1A\x9A\x01\x7E\xB4\xF5\x02\x02\x0F\xAF\xB1\xAC\x42\x6C\xF6\x09\x13\x01\x82\xB5\x6F\x1E\x13\x07\xB0\xBD\x08\x14\x00\x0A\xB6\xD9\x1E\x50\x01\xC3\xB3\x74\x50\xB1\xA6\x92\x22\x02\x13\xB6\x0D\x8B\x8A\xB4\x11\x2C\x14\x08\xB1\xA6\x3D\x1A\x6C\xAE\x2B\xA6\x01\x8E\xB7\x5F\x22\x95\x01\x5B\x94\x64\x7A\x6A\xEF\x00\x66\xB2\x0C\x03\x8C\xB2\xAA\x9E\x90\xB2\xD5\x70\x01\x35\xB5\x2A\xB7\x0A\x17\x2E\x8D\x15\x0D\xB2\xAA\x1F\x70\x6C\xC2\xB4\x63\x8D\x9A\xB7\x87\x84\xD8\x97\x70\x11\xD9\xAE\xA1\x14\x8A\x3A\xB6\xAD\x0B\x1D\x04\x67\xB3\x11\x1E\xD9", "\xA1\xCD\x2D\x26\x41\xB6\x76\x0E\x1E\x04\x68\xBE\x36\x7A\xD2\xA9\x53\xC9\xB6\x9B\x11\x3E\x00\xD3\xB4\x21\x06\xB4\xA3\x08\x23\x69\xBD\x1B\xBC\x00\xA8\xB7\x9C\x10\x10\x07\xB3\xA8\xD3\xB0\x46\xDA\xB6\x5B\x10\x41\x01\xD7\xB6\x4D\xB4\x7E\x02\x06\x20\x6D\xC6\x05\x84\x01\xB1\xB7\x9C\xB6\x91\x27\xB6\xBC\x15\x06\x02\x6A\xB6\x79\xB4\x0A\x9D\xDB\xB2\x69\x08\x08\x10\xDB\x80\x6A\x9A\x0C\xCB\x01\xB9\xB6\xF0\x02\x11\x06\xB7\xA6\xD4\x87\x48\x7A\xB6\x62\x06\x46\x01\xDF\xB4\x51\xBC\x5D\x20\xDC\x84\x11\x0E\x01\x53\xB7\x91\xB7\xE7\x8B\x97\x84\x0D\x06\xDC\xB9\xD0\x7D\xB6\xA2\xB5\x6B\x02\xE3\xB6\x9E\x03\x09\x09\xDC\x83\x04\x55\xB6\x0F\x56\xF3\x67\xE4\xB5\x23\x06\x09\x16\xDC\xAF\xC8\x28\xB5\xBB\x89\x6E\x03\xE6\xB3\x22\x09\x09\x1D\xDB\xB0\x6A\xE2\x5D\xA3\xB7\x4D\xAA\xE7\xB0\x00\x08\xB9\xBC\x43\xB0\x87\x29\xB7\x58\x0B\xD5\xB5\xEB\xB0\x57\xB1\x9A\x70\xDD\xA3\x15\x32\xB7\xC4\xB5\x5D\x89\x3A\x06\x76\xBD\x4A\x98\xDD\x8B\x6B\xAA\x24\xBC\xB7\xE6\x21\xDF\xB7\x27\xB4\x7E\x0F\x07\x01\x6F\x80\x00\xA9\x01\x5A\xB6\x06\x04\x64\xB3\x5C\xBF\xCE\xAB", "\x02\x66\xB2\xCB\xB7\x95\x8F\x19\x0B\x1E\x0A\xAB\xAC\x05\x0A\x6F\xBB\xB4\xBB\x89\x7A\x02\xAE\xB6\x15\x07\xBD\xB1\x2B\x3B\x12\xF7\x01\xBA\xB4\x58\x03\xEA\xB1\x7A\xBF\xB3\xB0\x40\xBA\x6A\xB3\x01\xE3\xB6\xA7\xB7\x19\x0B\x1F\x0A\xAB\xB6\x05\x29\x6F\x82\xB1\x2D\xB2\x5D\xB5\x2E\x07\x7D\xBE\x3F\xA7\x5E\x3A\x6A\xBC\x01\xDD\xB6\x86\x02\x8C\xA7\x4C\x33\x0A\x07\x92\xBC\x0A\x3E\x01\xF9\xB6\x64\x63\x2E\x8B\x00\x0D\xBF\xAC\x03\xAE\xD3\x01\xB8\x6E\xAB\x14\x91\x01\xBD\x1F\xBB\x89\x02\x06\x08\x70\xFE\x8E\xBB\x89\x03\x03\x02\xBF\x7A\x7F\x05\x4F\xE0\xBB\x68\x3B\x89\x09\x01\x09\xBB\x41\xB6\x58\x06\x0C\x16\xE0\xAD\x35\xE4\x0F\x0B\x00\x0D\xBB\x22\x84\x57\x08\x0C\x16\xE0\x84\x6E\xFA\x86\x22\xB8\xA4\xB2\xF5\x64\x7E\xB5\xF3\x5B\x25\x8F\x00\x29\xB8\x56\x05\x66\x02\x05\xBA\x54\xB1\x01\x10\xE1\xA6\x0E\x4F\x01\x2C\xB8\x50\x4E\x42\x26\x86\xBA\x55\x12\x06\x39\x70\xE2\x18\xBB\x89\x0A\x00\x0F\xB8\xF0\x16\xC1\xA7\xDD\xA9\x39\x17\x00\x43\xB9\xED\x1B\x0F\xBE\x75\xBB\xCF\x09\xE2\xBA\xF4\x4B\xB8\xB4\xB6\x22\x2B\x06\x06\x89\xB2\xAE\x2B\xE2\x85\x6B", "\xE9\x1C\x1D\x00\x2A\xBA\xB1\x00\x1C\x0B\xC4\xBF\xA2\x9D\x39\x5A\xB8\xBC\x05\x71\x02\x05\xBC\x78\xB8\x97\x01\x01\x20\x71\x84\x38\xB5\xB5\x0D\x02\x2A\x09\x03\x03\xAE\xBE\x0B\x23\x00\x22\xB8\x33\xB2\x0E\x02\x2A\x0E\x03\x0D\xC6\xAC\x0B\x24\x00\x70\xB8\x4E\x7E\x39\xBB\x46\x25\x8E\xBA\x15\x05\x01\x38\x71\xE7\x20\x67\xB8\xE1\x04\x1D\xB9\xDB\x0C\xC7\xA7\x0A\x28\x00\x7F\xB8\x38\xAE\x86\x03\x07\x00\x2B\xB5\xC8\xB4\x09\x29\x00\x08\xB9\x64\x95\x42\x1B\x1C\xBD\x91\xBE\x11\x0A\x01\x01\x72\xE2\x06\xE7\x00\xB3\xB0\x08\x02\x95\x0B\xC8\xAC\x7E\x14\x71\xAE\x00\x54\xB8\x74\x02\x59\xB2\x04\x0A\x4A\x01\x01\x14\x72\xF4\x02\x90\xB8\x0B\xA6\x3D\x0C\x94\xB2\x08\x47\xE5\xAC\x91\x29\xB9\xFA\x59\x51\xB8\x27\xBE\x95\xB2\xA1\x10\xE5\x85\x3B\x54\xB8\xEA\x00\xB3\xB3\x08\x05\x94\xB4\xCB\xA7\x0C\x36\x72\xD6\x94\xBB\xB9\x56\xBB\x19\x0E\x06\x0F\xCB\xBC\x15\x2B\x03\x3A\xB9\xB3\xB9\x3E\x1E\x2D\xB8\x07\x04\xC5\xAC\x07\x26\x65\xA4\x00\xAA\x08\x13\x01\x2F\xBE\x20\x0A\x03\x05\xE6\xBB\x24\xD2\xB9\xC2\xB9\x69\x0F\x25\xBF\xDB\x35\xAB\xB8\xE6\x8A\x72\xD3", "\xB9\xCD\x34\x2A\xBB\x0F\x04\x8A\xBF\x0E\x15\xD5\xA7\x00\x2A\x09\x28\x00\x70\xB9\x1D\xA9\x37\x2A\x4A\x0A\x01\x2A\x73\x88\xA9\xB7\x47\x49\xB9\x9E\x5B\x9B\xB5\x40\x15\xD5\xA9\x73\xFB\xB8\x67\x09\x21\x00\x15\xBD\x08\x04\xC5\xB3\x07\x35\x6A\xA9\x00\xE8\xB9\x77\xB9\x8C\xB2\x69\x00\xD0\xB1\xA0\x02\x74\x8B\x9C\xBC\x04\x77\xBB\x6D\x8F\x9D\xB7\x04\x16\xE6\xA8\x12\xAB\x00\xAA\x08\x18\x03\x41\xBA\x69\x08\x04\x14\xE7\xB6\x13\x2D\x00\xAA\x08\x16\x03\x44\xBA\xA1\x8C\x2B\x18\xE8\xA1\x5B\xC6\x24\x4A\x00\x8B\xB9\x47\x05\x1E\x05\xAB\xBE\xE8\x99\x4F\xE7\x08\x4C\x00\x11\xBA\xAC\x77\x1E\x0B\xBA\xA6\xE9\xA9\x4C\xD2\xB3\x2A\xBA\xE4\x3D\x4B\xB8\x67\xB7\x46\x12\x02\x31\x74\xA0\x2D\xC4\x9C\x2A\x0A\x4B\xB8\x67\xA5\x3C\x57\xE9\xA4\x32\x64\x9E\x3A\xBA\xF5\xB6\x40\x66\xA7\xB5\xE8\x60\xEA\xB7\x12\x42\xBA\xE8\xA6\xA2\xBB\x26\x11\x01\x06\xD4\xB7\x3E\xA2\x69\xBB\x89\x5E\x00\xA5\xBB\x9C\x15\x01\x04\xF6\x87\x38\x3B\x74\x82\x02\xFB\xB6\xB2\x4A\x54\xBB\x0B\x10\x01\x15\xEA\x87\x75\xEE\x8E\x6D\x63\xAD\xBA\xB1\x03\x02\x0E\xD5\xAE\xEA\x91\x50\xFF\xA7", "\x62\xBB\xA3\x0D\x59\xB9\xBB\x2A\x4A\x15\xAD\xA2\x9E\x69\xBA\xC3\x71\xB5\xBA\x41\x07\xAA\xB7\xC1\xA7\x23\x2D\x01\x70\xBA\xC2\x06\x0E\x02\x5C\xBB\x20\x04\xD7\xBF\xE0\xB8\x25\x70\x00\x78\xBA\xB1\x07\x07\x03\xAF\xB2\x10\x14\xEB\xA7\x70\xE9\x1C\x73\x01\xC0\xBA\x60\x8D\xA9\xBC\xD6\xAB\xDC\x99\x4B\x0A\xBB\xD4\x06\x13\x00\x61\xBF\x5D\x61\xAA\xA4\xA1\x90\x76\xF6\x09\x29\x00\xC6\xBB\x5C\xBD\xB2\xBE\x03\x37\xEC\x9D\x04\x2D\x00\x9A\xBA\xBE\xB8\xE8\xB2\xFC\x2E\xD9\xAC\x23\x53\x76\xF4\xBA\x46\xB8\xD1\x5D\x69\xBF\x16\x91\xDA\xA5\xEC\xB7\x6A\xBB\x89\x85\x01\xD5\xB8\x43\x00\x07\x0D\xDA\xB4\xEC\xA9\x1A\x88\x01\xB2\xBA\x83\x00\x0F\x05\xB6\xB4\xD7\xB7\xE2\xBD\x36\x0B\x01\xB9\xBA\xB4\x00\x6F\xB9\x9A\xBF\xCE\xAE\x04\x0E\x74\x8B\x3C\x64\x9F\xFB\x00\x5D\xBE\x8B\xB8\x05\x21\xEE\xBB\x26\xA7\xBB\xAA\x08\x32\xB9\x65\x2E\xB9\xB0\x00\x08\x02\x13\x76\xAE\x00\x19\xBB\x8D\xBA\x51\x96\x58\x08\xDD\xBF\xE8\x84\x51\x15\x01\x22\xBA\x2E\x95\xEA\x98\xE4\x8B\xB2\xB6\x1F\x54\x77\xCD\x00\xD7\xBA\xEC\xB7\xC2\x24\xBA\xB0\x05\x09\xEF\x9E\x6F\xE7\x08\x9D", "\x00\xEA\xBB\x14\x05\xB6\xBD\xDD\xA5\xDF\x9A\x18\x20\x01\xD4\xBB\x2B\x00\x7D\xB8\xA9\xB8\x97\x03\x05\x14\x77\xDB\x00\xFB\xBA\xF8\xB5\x62\x84\xBA\xBF\x05\x01\xF0\xB5\x6F\xE4\x0F\xA9\x00\xEA\xBB\x18\x06\xBD\xBA\xBF\xB4\x26\x94\x77\xE6\x00\x0C\xBC\x01\xB9\xC9\x24\xBA\xB9\x06\x11\xF0\x89\x70\x8D\x9B\xD4\xBA\x36\x02\x85\xB8\x82\xB8\x7C\x14\xEE\xAF\x01\x1B\xBC\x75\xBA\x0D\x0C\x2E\x04\xBA\xB2\x07\x00\xF1\xBE\x75\xC4\x3B\xD4\xBB\x3A\x00\x88\xBF\xB0\xBD\xDB\x1E\x05\x14\x77\xF8\x00\x06\xBD\x16\xBB\x19\x09\x18\x04\xDD\xBC\x03\x20\x78\xA2\xB5\xC4\x00\xEA\xBB\x1F\x01\xC6\xBA\xC3\xAE\x76\x54\x77\x83\x01\x3C\xBC\x20\xBA\x35\x5C\xBA\xB7\x08\x00\xF1\xA9\x76\xD9\x1F\xCD\x00\xEA\xBA\x22\x01\xC8\xBC\xC4\xB4\x7A\x14\x77\x8E\x01\x4C\xBD\x28\xBA\x6B\x2B\x1A\x04\xDD\xB2\x04\x0C\x79\xBE\xBB\x46\x80\xEA\xBA\x25\x04\xC9\xBE\xCD\xA4\x3F\x19\x03\x47\xBB\x44\x08\x4D\x01\x72\xBC\xE7\x8A\x4A\x0C\xEE\x88\xE0\x54\xBB\x9B\x00\x10\xBE\x74\xB9\xCD\x1D\x0D\x14\xEE\x9E\x02\x13\xBB\x2F\x01\xEC\xB9\x81\x99\xCE\xBE\xDD\xAE\xAD\x20\x03\x61\xBB\x2D\x35", "\xF1\xB9\xFA\x8D\xBC\xB4\x5F\x34\xEE\xA3\x02\x70\xBC\xEA\xBB\x80\x38\x75\xBE\x14\x00\xE8\xAF\xEF\x98\xA5\x54\xBB\x9E\x9E\x29\xAB\x9E\xBB\x49\xBC\x7E\x94\xEE\xAD\x02\x35\xBB\x74\xBC\x2A\xB6\x5C\x34\xBA\xB1\x0B\x10\xF4\xBC\x77\xFD\x26\xD4\xBB\x5A\x02\xA5\xBC\x69\xAB\x4B\x94\x07\x14\x77\xB9\x01\x85\xBD\x06\xBF\x19\x0F\x1E\x04\xDD\xBC\x05\x21\x7A\x92\xBC\xBF\x12\xEA\xBB\x2F\x07\xD4\xB7\xE1\xA7\xC8\x54\x77\xC2\x01\xAC\xBC\x0E\xBC\x98\x0C\x14\x05\x3E\xB7\x35\xB1\x7A\xA1\xBC\xDD\x28\x5A\xBC\x0B\x97\x48\x77\xEB\xA7\xF1\x9F\xD0\x3A\xBD\x33\x90\xAD\x0B\x32\x07\xD6\xBC\xE2\xB9\x7E\x09\x00\x40\xBD\x3A\x90\xD3\x06\x33\x03\xD3\xB3\x8B\x1B\x25\x8C\x00\x48\xBD\x42\x91\x8F\x23\xAD\xBA\x54\xBF\x00\x10\xF6\x8A\x21\xD6\x04\xD5\x00\x66\xBF\x0E\xAF\xA9\x32\x01\x16\xF6\xB2\xEA\x59\x01\xDA\xBD\x20\xAA\x70\x76\xDB\xB6\x25\x1D\x06\x37\x7A\xC7\xBC\x46\x24\x0C\x00\xB9\xBE\xAD\x71\xEE\xAD\xA2\xA9\x39\x1B\x00\xEB\xBC\x62\x91\xBB\xBD\xC9\xBD\xD4\x1E\x00\x31\x7B\xF4\x33\xF3\xBC\x2C\xBF\xC2\x5F\xDE\xBB\x89\x0C\x07\x33\x7B\xE6\xBC\xD9\x1E\x12", "\x00\xBF\xBB\x4E\x10\x0F\x17\xF5\xAB\x79\xBD\x1B\x27\x01\x81\xBF\x16\x13\x1E\x03\xD9\xB2\xE8\xA6\x75\xAB\xB4\x6D\xAA\x81\x01\x0C\x02\x95\x03\x03\x0F\xE7\xAA\x00\x56\xBD\x33\xB3\x89\xBE\x9D\x1F\x9D\xBB\x02\x18\xF8\x8E\xFD\x15\xBE\x5B\x72\xED\xB8\x11\x0C\x05\x06\xED\xA3\x1C\x36\x03\x63\xBC\xB7\x90\x55\x0A\x0C\x07\x9D\xBE\x02\x0A\xF8\x96\x29\xB5\x00\x11\xBA\x91\xBC\xF5\x01\x06\x05\xF2\xB3\x08\x37\x03\x28\xBE\x0C\x02\x1B\x02\xCA\xBF\x9D\xB3\x03\x0E\xF9\xA8\x1F\xB7\x00\x07\x0E\x2F\x05\x53\x06\x9E\x01\x97\xA2\x35\xA0\x06\x1C\x32\x1E\x03\x72\x1A\x47\x02\x02\x00\x1A\x0C\xFA\x91\x06\x4E\xBE\x7E\x02\xA8\xBC\x5B\x02\xEA\xB7\x1D\x80\x0D\x19\x07\x1E\x02\x46\x3C\xAC\xBC\x68\x01\xEB\xBD\x11\x1C\xFA\xA3\xCD\x5B\xBE\x60\xBF\xC8\x01\xD0\xBD\x23\x02\x15\x3D\x08\x37\x07\x1E\x02\x22\x5A\xB6\x01\xDA\xBA\x2B\x0B\xF6\xA7\x0A\x2D\x7D\xB4\x02\xE9\x14\x8F\x00\x15\x0D\x3D\x6E\x11\x07\xDD\x1E\x04\x3F\x42\x1E\x03\x4F\xA5\xDE\xB8\x34\x08\x79\x5E\x08\x30\xB5\x7E\xBE\xA0\x03\xBF\xBD\x47\x01\x8F\x4E\x11\x1E\x4A\x45\x7E\xA0\x03\x78\xBF\x8E\x02", "\xDE\xBD\x23\x0D\xF7\xBD\x08\x02\x7E\x93\x02\x84\xBE\xA1\x24\x68\x01\x2D\xBC\x16\x14\xFC\x9A\x05\x16\xBF\x30\x68\x60\x0B\x07\x27\x1F\x07\xF6\xA6\xFB\xA0\x06\x1D\xBF\x99\x40\xF3\x01\x29\x90\x27\xB0\x1A\x05\xFB\xA1\x7E\xE2\xBE\xE6\x03\xEF\x2B\x3F\x07\xE0\x03\xF7\xAC\xFD\x9D\x04\x2E\xBF\xD4\x4B\xD3\xBD\xF9\xA2\x2A\x27\x70\x14\xFD\xB2\x7E\xBB\xBD\xD7\x77\x6B\xBE\x49\x9A\xF7\xBD\x40\x6F\xFD\x80\x91\x3E\xBF\xBB\xBE\x0D\xB4\xF0\xB8\xF7\xB9\xEC\xA4\xFE\x91\x7B\xC5\xBF\xC6\xBF\xA0\xBE\xF0\xB9\xF6\xB1\x19\x07\x66\x9A\x2C\xFF\x01\x73\xBE\x8A\x53\xEF\xBB\x22\x01\x34\x30\x8E\x3F\x03\x57\xBE\x1D\x03\xEC\x03\xD9\xBD\xA6\x9E\xCC\x9F\x07\x3C\x0B\x1E\x02\xFC\x05\xED\xBF\xF4\xBD\xF8\x23\x17\x02\xBE\x3F\x03\x06\x1D\x1D\x02\xF4\xBE\x82\xAE\x2C\x09\xFE\xAC\xFF\xAB\x7F\x90\x3F\x1E\x23\x81\x01\x08\x05\xFD\xB0\x3C\xB4\xFF\xA6\x1B\x76\xBF\x06\x03\xF9\xBF\xFB\xBF\xFE\xBB\xFF\xB9\xFF\xB8\x7F\xDC\x1A\xFF\xBF\xB2\x19\x00\xC6\xAD\x13\x00\xC2\x01\x05\x80\x87\xC0\xFD\xBF\xDC\xBD\xBA\x10\xEF\xBB\x00\xC3\x00\xCC\x80\xA6\x04\x0E\xC1\x08\xC1\x02", "\xC1\x09\x61\xFF\xB4\x00\xE9\x2B\x06\xBF\xE9\x15\xBF\xBF\x05\xC3\x00\xC8\x01\xD3\x08\x1D\x80\xFC\x6A\x15\xC0\x2B\x0F\x00\xC2\x03\xC5\x6A\x1C\x00\xE3\x80\x83\xC0\x1E\x03\x74\x14\xE1\xBA\x05\xC3\x00\xCB\x01\xD0\x7E\xAD\xC0\x30\xC1\x09\xC2\x67\xB3\xF7\x12\x42\x72\x01\xE0\x00\x03\xC0\x37\xC0\x1B\xC0\x0E\xC3\x00\xCF\x01\x1C\x01\xFE\x80\xB2\xC0\x3D\xC0\x19\xC1\xDF\xB9\x5D\x13\x04\xD3\x0F\x03\x80\xC5\xC0\x40\x55\x10\xC0\x12\xC6\x92\x03\x00\xD3\xFB\xA9\x2B\x41\xBE\xE9\x15\xB8\xBD\xBA\x12\xE9\xB9\xAE\x17\xFA\xA9\x2B\x7A\xBE\x57\xC1\x01\xC0\x16\xC3\x22\x0B\x05\xCD\x2C\x03\x80\xEF\xBE\x21\xC0\x30\xC1\xBA\x12\x0C\xC3\x11\x04\x03\xFF\x77\x5F\xC0\x68\xC0\x19\xC0\xD5\xBA\x4E\x32\x10\x0B\x03\xF4\x80\x83\x02\x6E\xC1\x10\xC1\x1C\xC1\x5D\x13\x07\xD8\x2E\x43\x80\xF5\xC0\xEB\x03\x3B\xC1\x1A\xC5\xF8\x28\x07\xCC\x08\x26\x81\xF4\x22\x03\xC1\xA2\xBF\xEF\x19\x5A\xA1\x02\xD8\xFC\xAF\x81\x8F\x17\x03\xC1\xB0\xB3\x20\xC7\x53\x69\x08\xC3\x00\xE0\x46\xA1\xC0\x8F\xC1\x74\x15\x56\xB3\x11\xC2\x56\x83\x00\xF9\x65\xA9\x27\x72\xAC\x36\xC0\x00\x02", "\x03\x03\x00\xDC\x04\xF2\x80\xEE\xB3\x21\xC1\x4B\xC2\x26\xC6\x13\xC5\x7C\x20\x05\xE9\x2B\x19\x00\x03\xC0\x54\xC2\x0C\xC0\x03\x03\x00\xCC\x05\xF2\x80\xDD\xC0\x7E\xC0\x3D\xC2\x0C\xC2\x10\xC8\x09\xC8\x04\xF2\x80\x8A\xC1\xB5\xC1\xF1\xAD\xF1\x2B\x12\xC9\x0B\xC2\x05\xC7\x82\x9B\xC1\x03\xC0\x53\xC3\x49\x05\x15\xC3\x00\xDD\x8F\xA1\x80\xC6\xC1\xE9\x14\x64\xC3\xD7\xBA\x06\xC4\x02\x03\x00\xC8\x7D\xE9\x15\xCF\xC0\x29\xB5\x47\x03\xAB\x32\xD5\x20\x28\x3F\x03\x65\x19\x67\xBE\x6C\xC3\x34\xC7\xF6\xBA\xA6\x27\xC8\x95\x83\x93\xB3\x8C\x32\x04\x95\x9E\x34\x20\x16\x22\x73\x08\x33\x7D\xE5\x19\xE7\xC0\x73\xC3\x36\xC5\x7C\xAF\x0D\xC7\xFE\xB9\x61\x11\x03\xFA\x3E\xBA\x3F\x3F\x04\x23\x37\xF6\xB4\x07\xDD\x04\x76\xC1\xD2\xC1\xC8\x03\x28\x48\x79\x4F\x0F\x07\xDD\x01\x7D\xFE\xC1\x1D\x03\xD3\x37\xD9\xBA\x20\xC1\x10\xDC\x06\xC1\x82\x6C\x80\x3E\x45\x60\xBC\x4A\x49\xF3\xBB\x10\xDE\x06\xF6\x7D\xDD\xBE\xE6\x03\xD5\x4F\x3F\x06\xC8\x31\xF4\xB4\x08\xD0\x84\xBB\xBF\x46\x3D\xB3\xBE\x91\x3A\x2A\x2B\x11\xD7\x08\xCC\x5F\xD7\x7F\x73\xBE\x8B\xC3\x32\xC5\xF7", "\xB3\x12\xCC\xE0\xBA\x5E\xA1\xC2\x88\xBE\xF3\x01\xD9\x4F\x1F\x0F\x13\x47\xFB\xAD\x84\x9D\x02\x3F\x42\xA9\x21\x4C\xC0\x26\xC3\xFE\xA4\xAF\x72\x84\xA0\x03\x1B\x65\x30\x63\x3F\x01\x8F\x4F\xFD\xBC\x09\xC3\x7E\xB5\xC2\x8C\x6D\xB3\xBD\x1E\x49\xE8\xB3\x14\xDF\x09\xC6\x5F\x8F\xB2\x57\xBF\x3C\x4A\x54\x22\x29\xC6\x14\xDF\x08\xCE\x0D\xF3\xBE\x3E\xC3\x17\xC3\xEE\xBD\x28\xC2\x15\xC2\x07\xCF\x64\xCB\xC2\xEA\xC1\xAA\xC0\x5B\x06\xC0\x7F\x19\x1C\x0A\xC9\x04\x18\x4F\x67\xBE\xB0\xC0\xE3\xB8\x28\xC5\xB8\x51\x0C\x1E\xA5\x73\x02\x67\xC3\xA6\x02\x57\x57\xEC\xBB\x16\xD2\xFC\xBB\x7E\x86\xBF\x8E\xBE\xF3\x00\x5C\x5B\xE8\xB0\xD7\x47\xFB\xB5\x85\xF1\xC2\xBB\xBF\xC7\xBF\x19\xC0\x67\x0F\xF6\xA3\xFA\xAF\x7D\xE7\xBE\x7F\xC3\x8E\x01\x60\xC5\x0C\xCD\xF4\xA6\x0F\x2E\x81\xC3\xBE\x6E\xC1\xB3\xBD\x62\xC5\x23\x0B\x18\xD6\x03\xFB\x7E\x8D\xC3\x79\xC1\xC8\x01\x81\xB4\x23\x03\x19\xCA\x08\x1F\x4A\xE7\xBE\x97\xC2\xC5\xBC\x59\xC4\x23\x90\x1A\x14\x05\xC5\x1E\x1E\xC3\xDC\x09\x7F\x00\x68\xC6\x23\x06\x08\xD3\x0B\x25\x86\xCD\x02\x86\xC0\xD2\xC3\xE4\xBB\x35\xC0", "\x21\x06\x0F\x38\x82\xE1\x0E\xFF\x01\xD7\xC0\x4D\x02\x36\xCE\x11\x14\x0D\xCE\x1A\x20\x03\xB6\xC3\x89\x01\x6E\xC4\x41\xB8\x33\x0C\xCD\x9B\x04\x46\xC1\x1D\x03\xFE\xA3\xD9\xBE\x15\xC0\x4C\x04\x0E\xD6\x83\xC6\xC3\x5A\x02\xE4\xC3\x51\x02\x39\xC4\x13\x0C\x0E\xDE\x04\x4E\xC3\x1D\x02\xE8\xC1\xD1\xB4\x0E\x74\x1D\xD1\x0C\x12\x87\xEE\x66\xD5\xC2\xBF\x02\x2A\xC0\x98\x0B\x1D\xD6\x06\xDD\x87\x8C\xC2\xCF\x10\xD0\x03\x77\xC6\x0F\x81\x57\x86\x0F\x24\x82\xD6\xC1\xE7\xC2\xF0\xC3\x40\x01\x3D\xC4\x1E\xCB\x51\x1B\x86\xC0\xC1\xBB\xBE\xF6\xC1\x17\x6B\x22\x02\x1F\xC7\xFB\xB5\x87\x9D\x02\xF2\xC2\x8F\x01\x7E\xC0\x3F\xC0\x1A\x1B\x0F\xF4\x87\xFD\xC3\x00\xC5\xC8\x02\x7F\xC7\xB3\x81\x20\xC9\xB4\x66\x07\x6E\xB3\x43\xBE\x50\xC1\x47\x02\x41\xCB\xAC\x00\x0D\x2E\x67\xE7\xBE\x0F\xC5\x05\xC7\x7B\xC1\x42\xCD\x20\xDB\xFD\x94\x88\xDF\xA3\x35\xC0\xC6\x8A\x79\x06\x17\xC3\xF4\xBE\x05\xDE\x04\x1E\xC4\xFB\x14\xD0\x00\x2F\xC5\xF0\x03\x22\xC1\x0D\xE5\x88\xC1\xBE\x25\xC5\xB3\xBD\x89\xC2\x2A\x2B\x22\xDD\x08\x2D\x88\xD3\x1C\xEF\xC3\x17\xC5\x71\xB7\x28\x05\x22", "\xDC\x42\x19\x85\xB3\xC4\x2A\x3C\x17\x9C\x3B\xC1\x45\xCE\x22\xC6\x08\xD5\x82\x91\x03\x25\xC5\xB9\xBF\x89\xC5\x47\xCB\xFB\xB2\x11\xFA\x88\x9F\x04\x37\xC5\xDA\x16\x79\x01\x42\xBA\x10\x0F\x04\xFC\x04\x66\x03\x41\xC1\xED\x07\x3F\x01\x4A\xCC\x16\x14\x12\xDA\x05\x56\xC4\xF8\x12\xD0\x00\x96\xC4\x26\x0B\x25\xC4\x5D\x1A\x89\xDF\xC4\x7A\xAC\xF3\x01\x0E\xC2\x4A\xC3\x26\xD9\x10\xC5\x33\x6F\xC3\x65\xC4\xF5\xC0\x04\x18\x4D\xCC\x26\xDB\xFD\xA9\x89\xED\xC3\x07\x18\x1F\xC4\x06\x1A\x4E\xCF\x26\xDD\x86\x73\x89\x96\x65\x77\xC4\x84\xC1\x9D\xC2\x2A\x2B\x27\xDD\x08\x35\x89\x9E\x02\x7F\xC4\x3F\xC4\x68\x01\x50\xC4\xB0\x06\x0F\x3A\x7F\xD2\xC4\x87\xC4\x85\xC2\xFF\xBC\x1D\xC9\x28\xD5\xB2\x0B\x8A\xCE\xC2\x65\xA9\xAF\x21\x47\x05\x51\xC0\x50\x31\x14\xFA\x4D\x2A\x8D\xEF\xC2\x4A\xC7\x7C\xC5\xFE\xBB\xFB\xBA\x14\xF1\x7D\x9E\xC5\x93\xC4\x19\xC0\xA6\xC7\x28\xCA\x29\xD7\xFA\xA5\x8A\xA1\xC5\xF0\xBE\x4D\xC6\xDD\xBA\x55\xC8\x2A\xCD\x08\xD6\x8A\xAE\xC5\xA3\xC4\x58\xC4\xAB\xC5\x50\xC9\x2A\xCE\xFF\x9C\x8A\xAC\x3A\xB4\xC4\x5C\xC7\xAD\xC7\x6B\x3D\x2A\xDC", "\x15\xF9\x8A\xBE\xC5\xBB\xC4\xDD\xAD\xAC\xC7\xFA\x73\x2C\xD9\xFD\x9A\x8A\x9E\x02\x9A\xC4\xC2\xBE\xA6\xC2\xE9\xBA\x29\xDD\xFB\x9A\x8A\xF8\xBE\x06\xC0\x9C\x05\xB4\xC2\x4A\xC3\x2D\xCC\x0B\x15\x8B\xDA\x02\xD7\xC5\xA3\x01\xB6\xC4\x26\x0B\x2D\xDE\x08\x1D\x8B\xAB\x8B\xA0\x03\x11\x02\x79\x02\x5C\xC5\x30\x1F\x07\x24\x8B\xEE\xB8\xE1\xC5\x74\xC5\x64\x07\x5C\xCC\x16\x0C\x17\xDA\x05\x6E\xC5\x47\x02\x78\xC4\x4D\x05\x19\xC8\x33\x14\x17\xD2\x89\xF6\xC5\x76\xB8\xD0\x00\xBE\xC2\x2B\x0B\x2F\xC7\x0A\x3D\x8B\xB4\x02\x25\x00\xF3\x01\xC0\xC5\x5C\xC3\x30\xDE\x0B\x05\x8C\xA9\x0D\xA0\x03\x83\xC5\x1F\xB9\x61\xCC\x30\xD1\x0C\x26\x00\x66\x03\x0F\xC7\x72\xC5\xC4\xC6\x2F\x03\x31\xCC\x0B\x15\x8C\xDA\x02\x17\xC7\xA3\x01\xC6\xC4\x26\x07\x02\x06\x0F\x1D\x8C\xE5\xC5\x1F\xC6\xBF\x01\xC8\xC2\x47\x00\x1A\x03\x19\xDA\x05\x28\x00\xE6\x02\x94\xC5\xB9\xC2\x65\xC1\x2E\x47\xAA\x6E\x8C\x91\x03\x29\x00\xF3\x01\xCC\xC5\x5C\xC3\x33\xDE\x0B\x35\x8C\xE6\xC4\xC6\x26\xF3\x02\x0A\x04\x37\x0F\x0F\x1B\x19\xD1\x06\x3E\xC6\x7E\x02\xA0\xC4\x5B\x02\x68\xC4\x6B\x00\x0D", "\x04\x8D\xC5\x04\x46\xC7\x52\x6A\x79\x03\x05\x0C\x33\xCC\x1A\xF8\x89\xCE\xC6\x24\xC2\xB1\x03\x7B\xC0\x6A\xCC\x16\x14\x1A\xDA\x05\x2C\x00\xE6\x02\xAC\xC5\xB9\xC2\x6B\xCE\x17\x1C\x1A\xF8\x8C\xCA\x29\xA0\x02\xAF\xC7\xD5\xC7\x3D\xCD\x02\x06\x0F\x25\x8D\xE5\xC5\x67\xC6\xBF\x01\xDA\xC4\x2D\x0B\x36\xDA\x0A\x2D\x8D\xC7\x02\x6F\xC7\x07\x14\x68\x01\x6E\xCE\x11\x0E\x01\x26\x07\x76\xC6\xE5\xC4\xBC\xC6\x5F\x02\x6F\xCC\x16\x1C\x1B\xDA\x05\x7E\xC6\x47\x02\xC0\xC7\x94\x00\x34\x02\x38\xDE\x08\x2F\x00\x66\x03\x87\xC7\x72\xC5\xE2\xC6\x2F\x0B\x38\xCF\xB6\xA0\x06\x0D\xC7\x5A\x02\xC8\xC7\x51\x02\x72\xC4\x13\x14\x1C\xC6\x8E\x8F\xC7\x98\xC7\xC8\x02\xE5\xC4\x2E\x06\x1E\x10\x01\x3C\x8C\x9E\xC7\x91\x02\xD0\xC6\x5F\x01\x2A\xB0\x4C\x04\x1D\xD6\x83\xA6\xC7\x5A\x02\xD4\xC7\x51\x02\x75\xC4\x13\x0C\x1D\xDE\x04\x2E\xC7\x1D\x02\xD8\xC7\x95\x1E\x3C\x02\x03\x1C\x19\xF5\x8E\xBB\xBF\xB7\xC6\xBF\x01\xEE\xC7\x6B\xC5\x04\x26\x0F\x33\x00\x3C\xC6\xBF\xC7\xC8\x01\xF0\xC6\x2F\x03\x3C\xCC\x0B\x05\x8F\xDA\x02\xC7\xC7\xA3\x01\xF2\xC4\x26\x0B\x3C\xDE\x08\x0D", "\x8F\x9D\x02\xCF\xC7\x89\x00\x0D\x06\x3C\x03\x3D\xC5\x17\xD5\x8F\xFE\x02\xD7\xC6\xB6\x01\x0D\x06\x3C\x0B\x3D\xC5\x17\xDD\x8F\xFE\x02\xDF\xC6\xED\xC4\x68\x01\x7C\xCA\x15\x04\x1F\xC9\x1B\x63\xC7\xA0\x02\x1B\x02\x79\x02\x7D\xC5\x2E\xCC\x1F\xFE\x05\x6E\xC7\x6C\x02\xF8\xC6\x56\x02\x7E\xCE\x0D\xD4\x1F\xDB\x8A\xB9\xBE\x72\xC4\xFB\xC6\x54\x22\x7F\xCE\xBD\x0F\x0F\xF6\x8F\xE7\xBE\x37\x00\xF3\x01\x00\xCD\x5C\xC3\x40\xDE\x0B\x38\x00\x66\x03\x07\xC9\x72\xC5\x02\xCE\x80\xC0\x1A\x0B\x20\xEC\x05\x0E\xC8\x5A\x02\x08\xCB\x51\x01\x07\x06\x1E\x14\x20\xE5\x8B\x96\xC8\x49\xB2\xD0\x00\x06\xCC\x2D\x0B\x41\xDA\x0A\x1D\x90\x93\xC8\x1A\xC8\xD0\x02\x0E\x06\x3C\x03\x42\xC5\x17\xE5\x90\xFE\x02\x27\xC8\xB6\x01\x0A\xCA\x2B\x0B\x42\xC7\x0A\x2D\x90\xB4\x02\x2F\xC9\x4D\x7B\x7B\xC7\x85\xC7\xF6\xB4\x21\xF0\x66\xB3\xC8\x38\xC9\xDD\xBE\x0D\xCA\xA4\x16\x1E\x1B\x01\x3C\x8C\xBE\xC8\x91\x02\x20\xCB\x85\x60\x34\x02\x44\xCC\x0B\x05\x91\xDA\x02\x3C\x00\xF3\x01\x12\xCD\x5C\xCB\x44\xDE\x0B\x0D\x91\xEC\x02\x4F\xC8\x24\xC8\x68\x01\x8A\xC7\x14\x1D\x01\x26\x07", "\x56\xC8\xE5\xC4\x2C\xCA\xF1\xB8\x00\x0A\x45\xCA\x14\xCD\x6B\x4C\xBF\xA7\x02\x30\xC9\xA1\x07\x3D\xCD\x45\xC8\xFE\xAC\x34\x64\xC8\x72\xC5\x32\xCA\x37\xC2\x8D\xC6\x27\xCC\x23\xDE\x04\x6C\xC8\x41\xBE\x36\xCB\xD9\xBC\x8D\xC2\x15\x2E\x23\xDD\x04\x3E\x00\xE6\x02\x3C\xC9\xB9\xC2\x8F\xC1\x35\xC6\xCB\x6F\x87\xFC\xC8\x26\xC2\x57\x31\x30\x90\x34\x0F\x03\x06\x0F\x05\x92\xE5\xC5\x87\xC8\xBF\x01\x22\xCC\x2D\x0B\x48\xDA\x0A\x0D\x92\xC7\x02\x8F\xC8\x6F\x08\x21\xC8\x34\x00\xC2\x9C\x08\x15\x92\x8A\x02\xC1\x4C\x8F\x01\x26\xC8\x30\xB4\x49\xDD\x24\xD6\xD5\x1E\xC9\x7E\x03\x4D\xC8\x0B\x3E\x3C\x03\x6B\x81\x0D\xE5\x92\xF8\xBE\xA5\xC8\xBB\xBD\x29\xC9\xEE\xB5\x4A\xD7\xFA\xA5\x92\xDF\xBF\xA5\xC8\xA5\xBD\x29\xCA\x2A\x25\x4A\xD9\xFA\xA5\x92\x9E\x02\xA5\xC9\xA0\xBD\x29\xCB\xEE\xB5\x4A\xC8\xFA\xA5\x92\xE7\xBE\x42\x00\xF3\x01\x30\xCD\x5C\xC3\x4C\xDE\x0B\x05\x93\xEC\x02\x43\x00\xF3\x01\x32\xCD\x5C\xCB\x4C\xDD\x23\xC1\x75\x20\x03\x44\x00\xF3\x01\x34\xCD\x5C\xC3\x4D\xDE\x0B\x15\x93\xEC\x02\x45\x00\xF3\x01\x36\xCD\x5C\xCB\x4D\xC0\xEC\x62\xE7\x5F", "\xC9\x91\x03\x6E\xC8\x5B\x06\x08\x06\x1E\x04\x27\xE5\x8B\xE6\xC9\x7E\x02\x74\xCB\x38\xCD\x7E\x20\x1A\x07\x02\x26\x07\x6E\xC9\xE5\xC4\x78\xCA\x5F\x02\x9E\xCC\x16\x14\x27\xEA\x89\x8A\x3D\xEF\xC3\x8E\x00", }; vl::glr::DecompressSerializedData(compressed, true, dataSolidRows, dataRows, dataBlock, dataRemain, outputStream); } const wchar_t* ParserRuleName(vl::vint index) { static const wchar_t* results[] = { L"_Type", L"_CtorFragment", L"_LetVariable", L"_VirtualExpression", L"_BeginBoundary", L"_EndBoundary", L"_SetTestingOperator", L"_ExpPrimitive", L"_Exp0", L"_Exp1", L"_Exp2", L"_Exp3", L"_Exp4", L"_Exp5", L"_Exp6", L"_Exp7", L"_Exp8", L"_Exp9", L"_Exp10", L"_Exp11", L"_Expression", L"_SwitchCase", L"_Block", L"_ElseStat", L"_If", L"_ForOperator", L"_VirtualStatement", L"_CoStatement", L"_CoProvider", L"_StateSwitchHead", L"_StateSwitchArgument", L"_StateSwitchCase", L"_StateStatement", L"_Statement", L"_StateInput", L"_StateDecl", L"_StateMachine", L"_Attribute", L"_Namespace", L"_FunctionArgument", L"_FunctionArgumentList", L"_FunctionStat", L"_FunctionBody", L"_FunctionKind", L"_Function", L"_Variable", L"_Event", L"_Property", L"_StaticInit", L"_BaseConstructorCall", L"_ConstructorType", L"_Constructor", L"_Destructor", L"_ClassBody", L"_Class", L"_EnumItemInt", L"_EnumItemA", L"_EnumItemB", L"_Enum", L"_StructMember", L"_Struct", L"_APConfig", L"_AutoPropertyKind", L"_AutoProperty", L"_CastResultInterface", L"_DeclarationCandidates", L"_Declaration", L"_UsingFragment", L"_UsingItem", L"_UsingPath", L"_ModuleBody", L"_Module", }; return results[index]; } const wchar_t* ParserStateLabel(vl::vint index) { static const wchar_t* results[] = { L"[0][_Type] BEGIN ", L"[1][_Type] END [ENDING]", L"[2][_Type]< \"::\" @ NAME >", L"[3][_Type]< \"::\" NAME @ >", L"[4][_Type]< \"bool\" @ >", L"[5][_Type]< \"char\" @ >", L"[6][_Type]< \"const\" @ _Type \"[\" [ _Type ] \"]\" >", L"[7][_Type]< \"const\" _Type \"[\" @ [ _Type ] \"]\" >", L"[8][_Type]< \"const\" _Type \"[\" [ _Type @ ] \"]\" >", L"[9][_Type]< \"const\" _Type \"[\" [ _Type ] \"]\" @ >", L"[10][_Type]< \"const\" _Type @ \"[\" [ _Type ] \"]\" >", L"[11][_Type]< \"double\" @ >", L"[12][_Type]< \"float\" @ >", L"[13][_Type]< \"func\" \"(\" @ { _Type ; \",\" } \")\" \":\" _Type >", L"[14][_Type]< \"func\" \"(\" { _Type ; \",\" @ } \")\" \":\" _Type >", L"[15][_Type]< \"func\" \"(\" { _Type ; \",\" } \")\" \":\" @ _Type >", L"[16][_Type]< \"func\" \"(\" { _Type ; \",\" } \")\" \":\" _Type @ >", L"[17][_Type]< \"func\" \"(\" { _Type ; \",\" } \")\" @ \":\" _Type >", L"[18][_Type]< \"func\" \"(\" { _Type @ ; \",\" } \")\" \":\" _Type >", L"[19][_Type]< \"func\" @ \"(\" { _Type ; \",\" } \")\" \":\" _Type >", L"[20][_Type]< \"int\" @ >", L"[21][_Type]< \"interface\" @ >", L"[22][_Type]< \"object\" @ >", L"[23][_Type]< \"observe\" @ _Type \"[\" \"]\" >", L"[24][_Type]< \"observe\" _Type \"[\" \"]\" @ >", L"[25][_Type]< \"observe\" _Type \"[\" @ \"]\" >", L"[26][_Type]< \"observe\" _Type @ \"[\" \"]\" >", L"[27][_Type]< \"string\" @ >", L"[28][_Type]< \"uint\" @ >", L"[29][_Type]< \"void\" @ >", L"[30][_Type]< NAME @ >", L"[31][_Type]< _Type \"*\" @ >", L"[32][_Type]< _Type \"::\" @ NAME >", L"[33][_Type]< _Type \"::\" NAME @ >", L"[34][_Type]< _Type \"?\" @ >", L"[35][_Type]< _Type \"[\" @ [ _Type ] \"]\" >", L"[36][_Type]< _Type \"[\" [ _Type @ ] \"]\" >", L"[37][_Type]< _Type \"[\" [ _Type ] \"]\" @ >", L"[38][_Type]< _Type \"^\" @ >", L"[39][_Type]< _Type \"{\" \"}\" @ >", L"[40][_Type]< _Type \"{\" @ \"}\" >", L"[41][_Type]< _Type @ \"*\" >", L"[42][_Type]< _Type @ \"::\" NAME >", L"[43][_Type]< _Type @ \"?\" >", L"[44][_Type]< _Type @ \"[\" [ _Type ] \"]\" >", L"[45][_Type]< _Type @ \"^\" >", L"[46][_Type]< _Type @ \"{\" \"}\" >", L"[47][_Type]<< \"(\" !_Type \")\" @ >>", L"[48][_Type]<< \"(\" !_Type @ \")\" >>", L"[49][_Type]<< \"(\" @ !_Type \")\" >>", L"[50][_CtorFragment] BEGIN ", L"[51][_CtorFragment] END [ENDING]", L"[52][_CtorFragment]< _Expression @ [ \":\" _Expression ] >", L"[53][_CtorFragment]< _Expression [ \":\" @ _Expression ] >", L"[54][_CtorFragment]< _Expression [ \":\" _Expression @ ] >", L"[55][_LetVariable] BEGIN ", L"[56][_LetVariable] END [ENDING]", L"[57][_LetVariable]< NAME \"=\" @ _Expression >", L"[58][_LetVariable]< NAME \"=\" _Expression @ >", L"[59][_LetVariable]< NAME @ \"=\" _Expression >", L"[60][_VirtualExpression] BEGIN ", L"[61][_VirtualExpression] END [ENDING]", L"[62][_VirtualExpression]< \"$\" \".\" @ NAME >", L"[63][_VirtualExpression]< \"$\" \".\" NAME @ >", L"[64][_VirtualExpression]< \"$\" @ \".\" NAME >", L"[65][_VirtualExpression]< \"$coroutine\" @ [ \"(\" NAME \")\" ] _Block >", L"[66][_VirtualExpression]< \"$coroutine\" [ \"(\" @ NAME \")\" ] _Block >", L"[67][_VirtualExpression]< \"$coroutine\" [ \"(\" NAME \")\" @ ] _Block >", L"[68][_VirtualExpression]< \"$coroutine\" [ \"(\" NAME \")\" ] _Block @ >", L"[69][_VirtualExpression]< \"$coroutine\" [ \"(\" NAME @ \")\" ] _Block >", L"[70][_VirtualExpression]< \"bind\" \"(\" @ _Expression \")\" >", L"[71][_VirtualExpression]< \"bind\" \"(\" _Expression \")\" @ >", L"[72][_VirtualExpression]< \"bind\" \"(\" _Expression @ \")\" >", L"[73][_VirtualExpression]< \"bind\" @ \"(\" _Expression \")\" >", L"[74][_VirtualExpression]< \"new\" @ _Type \"(\" \"using\" _Expression \")\" >", L"[75][_VirtualExpression]< \"new\" _Type \"(\" \"using\" @ _Expression \")\" >", L"[76][_VirtualExpression]< \"new\" _Type \"(\" \"using\" _Expression \")\" @ >", L"[77][_VirtualExpression]< \"new\" _Type \"(\" \"using\" _Expression @ \")\" >", L"[78][_VirtualExpression]< \"new\" _Type \"(\" @ \"using\" _Expression \")\" >", L"[79][_VirtualExpression]< \"new\" _Type @ \"(\" \"using\" _Expression \")\" >", L"[80][_VirtualExpression]< FORMATSTRING @ >", L"[81][_BeginBoundary] BEGIN ", L"[82][_BeginBoundary] END [ENDING]", L"[83][_BeginBoundary]\"(\" @", L"[84][_BeginBoundary]\"[\" @", L"[85][_EndBoundary] BEGIN ", L"[86][_EndBoundary] END [ENDING]", L"[87][_EndBoundary]\")\" @", L"[88][_EndBoundary]\"]\" @", L"[89][_SetTestingOperator] BEGIN ", L"[90][_SetTestingOperator] END [ENDING]", L"[91][_SetTestingOperator]\"in\" @", L"[92][_SetTestingOperator]\"not\" \"in\" @", L"[93][_SetTestingOperator]\"not\" @ \"in\"", L"[94][_ExpPrimitive] BEGIN ", L"[95][_ExpPrimitive] END [ENDING]", L"[96][_ExpPrimitive]< \"::\" @ NAME >", L"[97][_ExpPrimitive]< \"::\" NAME @ >", L"[98][_ExpPrimitive]< \"[\" @ _Expression \"]\" >", L"[99][_ExpPrimitive]< \"[\" _Expression \"]\" @ >", L"[100][_ExpPrimitive]< \"[\" _Expression @ \"]\" >", L"[101][_ExpPrimitive]< \"attach\" \"(\" @ _Expression \",\" _Expression \")\" >", L"[102][_ExpPrimitive]< \"attach\" \"(\" _Expression \",\" @ _Expression \")\" >", L"[103][_ExpPrimitive]< \"attach\" \"(\" _Expression \",\" _Expression \")\" @ >", L"[104][_ExpPrimitive]< \"attach\" \"(\" _Expression \",\" _Expression @ \")\" >", L"[105][_ExpPrimitive]< \"attach\" \"(\" _Expression @ \",\" _Expression \")\" >", L"[106][_ExpPrimitive]< \"attach\" @ \"(\" _Expression \",\" _Expression \")\" >", L"[107][_ExpPrimitive]< \"detach\" \"(\" @ _Expression \",\" _Expression \")\" >", L"[108][_ExpPrimitive]< \"detach\" \"(\" _Expression \",\" @ _Expression \")\" >", L"[109][_ExpPrimitive]< \"detach\" \"(\" _Expression \",\" _Expression \")\" @ >", L"[110][_ExpPrimitive]< \"detach\" \"(\" _Expression \",\" _Expression @ \")\" >", L"[111][_ExpPrimitive]< \"detach\" \"(\" _Expression @ \",\" _Expression \")\" >", L"[112][_ExpPrimitive]< \"detach\" @ \"(\" _Expression \",\" _Expression \")\" >", L"[113][_ExpPrimitive]< \"false\" @ >", L"[114][_ExpPrimitive]< \"let\" @ _LetVariable { \",\" _LetVariable } \"in\" \"(\" _Expression \")\" >", L"[115][_ExpPrimitive]< \"let\" _LetVariable @ { \",\" _LetVariable } \"in\" \"(\" _Expression \")\" >", L"[116][_ExpPrimitive]< \"let\" _LetVariable { \",\" @ _LetVariable } \"in\" \"(\" _Expression \")\" >", L"[117][_ExpPrimitive]< \"let\" _LetVariable { \",\" _LetVariable @ } \"in\" \"(\" _Expression \")\" >", L"[118][_ExpPrimitive]< \"let\" _LetVariable { \",\" _LetVariable } \"in\" \"(\" @ _Expression \")\" >", L"[119][_ExpPrimitive]< \"let\" _LetVariable { \",\" _LetVariable } \"in\" \"(\" _Expression \")\" @ >", L"[120][_ExpPrimitive]< \"let\" _LetVariable { \",\" _LetVariable } \"in\" \"(\" _Expression @ \")\" >", L"[121][_ExpPrimitive]< \"let\" _LetVariable { \",\" _LetVariable } \"in\" @ \"(\" _Expression \")\" >", L"[122][_ExpPrimitive]< \"new\" @ _Type \"(\" { _Expression ; \",\" } \")\" >", L"[123][_ExpPrimitive]< \"new\" @ _Type \"{\" { _Declaration } \"}\" >", L"[124][_ExpPrimitive]< \"new\" _Type \"(\" @ { _Expression ; \",\" } \")\" >", L"[125][_ExpPrimitive]< \"new\" _Type \"(\" { _Expression ; \",\" @ } \")\" >", L"[126][_ExpPrimitive]< \"new\" _Type \"(\" { _Expression ; \",\" } \")\" @ >", L"[127][_ExpPrimitive]< \"new\" _Type \"(\" { _Expression @ ; \",\" } \")\" >", L"[128][_ExpPrimitive]< \"new\" _Type \"{\" @ { _Declaration } \"}\" >", L"[129][_ExpPrimitive]< \"new\" _Type \"{\" { _Declaration @ } \"}\" >", L"[130][_ExpPrimitive]< \"new\" _Type \"{\" { _Declaration } \"}\" @ >", L"[131][_ExpPrimitive]< \"new\" _Type @ \"(\" { _Expression ; \",\" } \")\" >", L"[132][_ExpPrimitive]< \"new\" _Type @ \"{\" { _Declaration } \"}\" >", L"[133][_ExpPrimitive]< \"null\" @ >", L"[134][_ExpPrimitive]< \"range\" @ _BeginBoundary _Expression \",\" _Expression _EndBoundary >", L"[135][_ExpPrimitive]< \"range\" _BeginBoundary @ _Expression \",\" _Expression _EndBoundary >", L"[136][_ExpPrimitive]< \"range\" _BeginBoundary _Expression \",\" @ _Expression _EndBoundary >", L"[137][_ExpPrimitive]< \"range\" _BeginBoundary _Expression \",\" _Expression @ _EndBoundary >", L"[138][_ExpPrimitive]< \"range\" _BeginBoundary _Expression \",\" _Expression _EndBoundary @ >", L"[139][_ExpPrimitive]< \"range\" _BeginBoundary _Expression @ \",\" _Expression _EndBoundary >", L"[140][_ExpPrimitive]< \"this\" @ >", L"[141][_ExpPrimitive]< \"true\" @ >", L"[142][_ExpPrimitive]< \"type\" \"(\" @ _Expression \")\" >", L"[143][_ExpPrimitive]< \"type\" \"(\" _Expression \")\" @ >", L"[144][_ExpPrimitive]< \"type\" \"(\" _Expression @ \")\" >", L"[145][_ExpPrimitive]< \"type\" @ \"(\" _Expression \")\" >", L"[146][_ExpPrimitive]< \"typeof\" \"(\" @ _Type \")\" >", L"[147][_ExpPrimitive]< \"typeof\" \"(\" _Type \")\" @ >", L"[148][_ExpPrimitive]< \"typeof\" \"(\" _Type @ \")\" >", L"[149][_ExpPrimitive]< \"typeof\" @ \"(\" _Type \")\" >", L"[150][_ExpPrimitive]< \"{\" @ [ _CtorFragment ( { _CtorFragment } | { \";\" _CtorFragment } \";\" ) ] \"}\" >", L"[151][_ExpPrimitive]< \"{\" [ _CtorFragment ( { _CtorFragment @ } | { \";\" _CtorFragment } \";\" ) ] \"}\" >", L"[152][_ExpPrimitive]< \"{\" [ _CtorFragment ( { _CtorFragment } | { \";\" @ _CtorFragment } \";\" ) ] \"}\" >", L"[153][_ExpPrimitive]< \"{\" [ _CtorFragment ( { _CtorFragment } | { \";\" _CtorFragment @ } \";\" ) ] \"}\" >", L"[154][_ExpPrimitive]< \"{\" [ _CtorFragment ( { _CtorFragment } | { \";\" _CtorFragment } \";\" ) ] \"}\" @ >", L"[155][_ExpPrimitive]< \"{\" [ _CtorFragment ( { _CtorFragment } | { \";\" _CtorFragment } \";\" @ ) ] \"}\" >", L"[156][_ExpPrimitive]< \"{\" [ _CtorFragment @ ( { _CtorFragment } | { \";\" _CtorFragment } \";\" ) ] \"}\" >", L"[157][_ExpPrimitive]< FLOAT @ >", L"[158][_ExpPrimitive]< INTEGER @ >", L"[159][_ExpPrimitive]< NAME @ >", L"[160][_ExpPrimitive]< ORDERED_NAME @ >", L"[161][_ExpPrimitive]< STRING @ >", L"[162][_ExpPrimitive]< _ExpPrimitive \"(\" @ [ _Expression { \",\" _Expression } ] \")\" >", L"[163][_ExpPrimitive]< _ExpPrimitive \"(\" [ _Expression @ { \",\" _Expression } ] \")\" >", L"[164][_ExpPrimitive]< _ExpPrimitive \"(\" [ _Expression { \",\" @ _Expression } ] \")\" >", L"[165][_ExpPrimitive]< _ExpPrimitive \"(\" [ _Expression { \",\" _Expression @ } ] \")\" >", L"[166][_ExpPrimitive]< _ExpPrimitive \"(\" [ _Expression { \",\" _Expression } ] \")\" @ >", L"[167][_ExpPrimitive]< _ExpPrimitive \".\" \"observe\" \"(\" @ _Expression [ \"on\" _Expression { \",\" _Expression } ] \")\" >", L"[168][_ExpPrimitive]< _ExpPrimitive \".\" \"observe\" \"(\" _Expression @ [ \"on\" _Expression { \",\" _Expression } ] \")\" >", L"[169][_ExpPrimitive]< _ExpPrimitive \".\" \"observe\" \"(\" _Expression [ \"on\" @ _Expression { \",\" _Expression } ] \")\" >", L"[170][_ExpPrimitive]< _ExpPrimitive \".\" \"observe\" \"(\" _Expression [ \"on\" _Expression @ { \",\" _Expression } ] \")\" >", L"[171][_ExpPrimitive]< _ExpPrimitive \".\" \"observe\" \"(\" _Expression [ \"on\" _Expression { \",\" @ _Expression } ] \")\" >", L"[172][_ExpPrimitive]< _ExpPrimitive \".\" \"observe\" \"(\" _Expression [ \"on\" _Expression { \",\" _Expression @ } ] \")\" >", L"[173][_ExpPrimitive]< _ExpPrimitive \".\" \"observe\" \"(\" _Expression [ \"on\" _Expression { \",\" _Expression } ] \")\" @ >", L"[174][_ExpPrimitive]< _ExpPrimitive \".\" \"observe\" \"as\" @ NAME \"(\" _Expression [ \"on\" _Expression { \",\" _Expression } ] \")\" >", L"[175][_ExpPrimitive]< _ExpPrimitive \".\" \"observe\" \"as\" NAME \"(\" @ _Expression [ \"on\" _Expression { \",\" _Expression } ] \")\" >", L"[176][_ExpPrimitive]< _ExpPrimitive \".\" \"observe\" \"as\" NAME \"(\" _Expression @ [ \"on\" _Expression { \",\" _Expression } ] \")\" >", L"[177][_ExpPrimitive]< _ExpPrimitive \".\" \"observe\" \"as\" NAME \"(\" _Expression [ \"on\" @ _Expression { \",\" _Expression } ] \")\" >", L"[178][_ExpPrimitive]< _ExpPrimitive \".\" \"observe\" \"as\" NAME \"(\" _Expression [ \"on\" _Expression @ { \",\" _Expression } ] \")\" >", L"[179][_ExpPrimitive]< _ExpPrimitive \".\" \"observe\" \"as\" NAME \"(\" _Expression [ \"on\" _Expression { \",\" @ _Expression } ] \")\" >", L"[180][_ExpPrimitive]< _ExpPrimitive \".\" \"observe\" \"as\" NAME \"(\" _Expression [ \"on\" _Expression { \",\" _Expression @ } ] \")\" >", L"[181][_ExpPrimitive]< _ExpPrimitive \".\" \"observe\" \"as\" NAME \"(\" _Expression [ \"on\" _Expression { \",\" _Expression } ] \")\" @ >", L"[182][_ExpPrimitive]< _ExpPrimitive \".\" \"observe\" \"as\" NAME @ \"(\" _Expression [ \"on\" _Expression { \",\" _Expression } ] \")\" >", L"[183][_ExpPrimitive]< _ExpPrimitive \".\" \"observe\" @ \"(\" _Expression [ \"on\" _Expression { \",\" _Expression } ] \")\" >", L"[184][_ExpPrimitive]< _ExpPrimitive \".\" \"observe\" @ \"as\" NAME \"(\" _Expression [ \"on\" _Expression { \",\" _Expression } ] \")\" >", L"[185][_ExpPrimitive]< _ExpPrimitive \".\" @ \"observe\" \"(\" _Expression [ \"on\" _Expression { \",\" _Expression } ] \")\" >", L"[186][_ExpPrimitive]< _ExpPrimitive \".\" @ \"observe\" \"as\" NAME \"(\" _Expression [ \"on\" _Expression { \",\" _Expression } ] \")\" >", L"[187][_ExpPrimitive]< _ExpPrimitive \".\" @ NAME >", L"[188][_ExpPrimitive]< _ExpPrimitive \".\" NAME @ >", L"[189][_ExpPrimitive]< _ExpPrimitive \"::\" @ NAME >", L"[190][_ExpPrimitive]< _ExpPrimitive \"::\" NAME @ >", L"[191][_ExpPrimitive]< _ExpPrimitive \"[\" @ _Expression \"]\" >", L"[192][_ExpPrimitive]< _ExpPrimitive \"[\" _Expression \"]\" @ >", L"[193][_ExpPrimitive]< _ExpPrimitive \"[\" _Expression @ \"]\" >", L"[194][_ExpPrimitive]< _ExpPrimitive \"as\" \"*\" @ >", L"[195][_ExpPrimitive]< _ExpPrimitive \"as\" @ \"*\" >", L"[196][_ExpPrimitive]< _ExpPrimitive \"as\" @ _Type >", L"[197][_ExpPrimitive]< _ExpPrimitive \"as\" _Type @ >", L"[198][_ExpPrimitive]< _ExpPrimitive \"is\" \"not\" \"null\" @ >", L"[199][_ExpPrimitive]< _ExpPrimitive \"is\" \"not\" @ \"null\" >", L"[200][_ExpPrimitive]< _ExpPrimitive \"is\" \"not\" @ _Type >", L"[201][_ExpPrimitive]< _ExpPrimitive \"is\" \"not\" _Type @ >", L"[202][_ExpPrimitive]< _ExpPrimitive \"is\" \"null\" @ >", L"[203][_ExpPrimitive]< _ExpPrimitive \"is\" @ \"not\" \"null\" >", L"[204][_ExpPrimitive]< _ExpPrimitive \"is\" @ \"not\" _Type >", L"[205][_ExpPrimitive]< _ExpPrimitive \"is\" @ \"null\" >", L"[206][_ExpPrimitive]< _ExpPrimitive \"is\" @ _Type >", L"[207][_ExpPrimitive]< _ExpPrimitive \"is\" _Type @ >", L"[208][_ExpPrimitive]< _ExpPrimitive \"of\" @ _Type >", L"[209][_ExpPrimitive]< _ExpPrimitive \"of\" _Type @ >", L"[210][_ExpPrimitive]< _ExpPrimitive @ \"(\" [ _Expression { \",\" _Expression } ] \")\" >", L"[211][_ExpPrimitive]< _ExpPrimitive @ \".\" \"observe\" \"(\" _Expression [ \"on\" _Expression { \",\" _Expression } ] \")\" >", L"[212][_ExpPrimitive]< _ExpPrimitive @ \".\" \"observe\" \"as\" NAME \"(\" _Expression [ \"on\" _Expression { \",\" _Expression } ] \")\" >", L"[213][_ExpPrimitive]< _ExpPrimitive @ \".\" NAME >", L"[214][_ExpPrimitive]< _ExpPrimitive @ \"::\" NAME >", L"[215][_ExpPrimitive]< _ExpPrimitive @ \"[\" _Expression \"]\" >", L"[216][_ExpPrimitive]< _ExpPrimitive @ \"as\" \"*\" >", L"[217][_ExpPrimitive]< _ExpPrimitive @ \"as\" _Type >", L"[218][_ExpPrimitive]< _ExpPrimitive @ \"is\" \"not\" \"null\" >", L"[219][_ExpPrimitive]< _ExpPrimitive @ \"is\" \"not\" _Type >", L"[220][_ExpPrimitive]< _ExpPrimitive @ \"is\" \"null\" >", L"[221][_ExpPrimitive]< _ExpPrimitive @ \"is\" _Type >", L"[222][_ExpPrimitive]< _ExpPrimitive @ \"of\" _Type >", L"[223][_ExpPrimitive]< _ExpPrimitive @ _SetTestingOperator _Expression >", L"[224][_ExpPrimitive]< _ExpPrimitive _SetTestingOperator @ _Expression >", L"[225][_ExpPrimitive]< _ExpPrimitive _SetTestingOperator _Expression @ >", L"[226][_ExpPrimitive]< _Function @ >", L"[227][_ExpPrimitive]<< !_VirtualExpression @ >>", L"[228][_ExpPrimitive]<< \"(\" !_Expression \")\" @ >>", L"[229][_ExpPrimitive]<< \"(\" !_Expression @ \")\" >>", L"[230][_ExpPrimitive]<< \"(\" @ !_Expression \")\" >>", L"[231][_Exp0] BEGIN ", L"[232][_Exp0] END [ENDING]", L"[233][_Exp0]< \"+\" @ _Exp0 >", L"[234][_Exp0]< \"+\" _Exp0 @ >", L"[235][_Exp0]< \"-\" @ _Exp0 >", L"[236][_Exp0]< \"-\" _Exp0 @ >", L"[237][_Exp0]< \"cast\" \"*\" @ _Exp0 >", L"[238][_Exp0]< \"cast\" \"*\" _Exp0 @ >", L"[239][_Exp0]< \"cast\" @ \"*\" _Exp0 >", L"[240][_Exp0]< \"cast\" @ _Type _Exp0 >", L"[241][_Exp0]< \"cast\" _Type @ _Exp0 >", L"[242][_Exp0]< \"cast\" _Type _Exp0 @ >", L"[243][_Exp0]< \"not\" @ _Exp0 >", L"[244][_Exp0]< \"not\" _Exp0 @ >", L"[245][_Exp0]<< !_ExpPrimitive @ >>", L"[246][_Exp1] BEGIN ", L"[247][_Exp1] END [ENDING]", L"[248][_Exp1]< _Exp1 \"^\" @ _Exp0 >", L"[249][_Exp1]< _Exp1 \"^\" _Exp0 @ >", L"[250][_Exp1]< _Exp1 @ \"^\" _Exp0 >", L"[251][_Exp1]<< !_Exp0 @ >>", L"[252][_Exp2] BEGIN ", L"[253][_Exp2] END [ENDING]", L"[254][_Exp2]< _Exp2 \"%\" @ _Exp1 >", L"[255][_Exp2]< _Exp2 \"%\" _Exp1 @ >", L"[256][_Exp2]< _Exp2 \"*\" @ _Exp1 >", L"[257][_Exp2]< _Exp2 \"*\" _Exp1 @ >", L"[258][_Exp2]< _Exp2 \"/\" @ _Exp1 >", L"[259][_Exp2]< _Exp2 \"/\" _Exp1 @ >", L"[260][_Exp2]< _Exp2 @ \"%\" _Exp1 >", L"[261][_Exp2]< _Exp2 @ \"*\" _Exp1 >", L"[262][_Exp2]< _Exp2 @ \"/\" _Exp1 >", L"[263][_Exp2]<< !_Exp1 @ >>", L"[264][_Exp3] BEGIN ", L"[265][_Exp3] END [ENDING]", L"[266][_Exp3]< _Exp3 \"&\" @ _Exp2 >", L"[267][_Exp3]< _Exp3 \"&\" _Exp2 @ >", L"[268][_Exp3]< _Exp3 \"+\" @ _Exp2 >", L"[269][_Exp3]< _Exp3 \"+\" _Exp2 @ >", L"[270][_Exp3]< _Exp3 \"-\" @ _Exp2 >", L"[271][_Exp3]< _Exp3 \"-\" _Exp2 @ >", L"[272][_Exp3]< _Exp3 \"|\" @ _Exp2 >", L"[273][_Exp3]< _Exp3 \"|\" _Exp2 @ >", L"[274][_Exp3]< _Exp3 @ \"&\" _Exp2 >", L"[275][_Exp3]< _Exp3 @ \"+\" _Exp2 >", L"[276][_Exp3]< _Exp3 @ \"-\" _Exp2 >", L"[277][_Exp3]< _Exp3 @ \"|\" _Exp2 >", L"[278][_Exp3]<< !_Exp2 @ >>", L"[279][_Exp4] BEGIN ", L"[280][_Exp4] END [ENDING]", L"[281][_Exp4]< _Exp4 \"shl\" @ _Exp3 >", L"[282][_Exp4]< _Exp4 \"shl\" _Exp3 @ >", L"[283][_Exp4]< _Exp4 \"shr\" @ _Exp3 >", L"[284][_Exp4]< _Exp4 \"shr\" _Exp3 @ >", L"[285][_Exp4]< _Exp4 @ \"shl\" _Exp3 >", L"[286][_Exp4]< _Exp4 @ \"shr\" _Exp3 >", L"[287][_Exp4]<< !_Exp3 @ >>", L"[288][_Exp5] BEGIN ", L"[289][_Exp5] END [ENDING]", L"[290][_Exp5]< _Exp5 \"!=\" @ _Exp4 >", L"[291][_Exp5]< _Exp5 \"!=\" _Exp4 @ >", L"[292][_Exp5]< _Exp5 \"<\" @ _Exp4 >", L"[293][_Exp5]< _Exp5 \"<\" _Exp4 @ >", L"[294][_Exp5]< _Exp5 \"<=\" @ _Exp4 >", L"[295][_Exp5]< _Exp5 \"<=\" _Exp4 @ >", L"[296][_Exp5]< _Exp5 \"==\" @ _Exp4 >", L"[297][_Exp5]< _Exp5 \"==\" _Exp4 @ >", L"[298][_Exp5]< _Exp5 \">\" @ _Exp4 >", L"[299][_Exp5]< _Exp5 \">\" _Exp4 @ >", L"[300][_Exp5]< _Exp5 \">=\" @ _Exp4 >", L"[301][_Exp5]< _Exp5 \">=\" _Exp4 @ >", L"[302][_Exp5]< _Exp5 @ \"!=\" _Exp4 >", L"[303][_Exp5]< _Exp5 @ \"<\" _Exp4 >", L"[304][_Exp5]< _Exp5 @ \"<=\" _Exp4 >", L"[305][_Exp5]< _Exp5 @ \"==\" _Exp4 >", L"[306][_Exp5]< _Exp5 @ \">\" _Exp4 >", L"[307][_Exp5]< _Exp5 @ \">=\" _Exp4 >", L"[308][_Exp5]<< !_Exp4 @ >>", L"[309][_Exp6] BEGIN ", L"[310][_Exp6] END [ENDING]", L"[311][_Exp6]< _Exp6 \"xor\" @ _Exp5 >", L"[312][_Exp6]< _Exp6 \"xor\" _Exp5 @ >", L"[313][_Exp6]< _Exp6 @ \"xor\" _Exp5 >", L"[314][_Exp6]<< !_Exp5 @ >>", L"[315][_Exp7] BEGIN ", L"[316][_Exp7] END [ENDING]", L"[317][_Exp7]< _Exp7 \"and\" @ _Exp6 >", L"[318][_Exp7]< _Exp7 \"and\" _Exp6 @ >", L"[319][_Exp7]< _Exp7 @ \"and\" _Exp6 >", L"[320][_Exp7]<< !_Exp6 @ >>", L"[321][_Exp8] BEGIN ", L"[322][_Exp8] END [ENDING]", L"[323][_Exp8]< _Exp8 \"or\" @ _Exp7 >", L"[324][_Exp8]< _Exp8 \"or\" _Exp7 @ >", L"[325][_Exp8]< _Exp8 @ \"or\" _Exp7 >", L"[326][_Exp8]<< !_Exp7 @ >>", L"[327][_Exp9] BEGIN ", L"[328][_Exp9] END [ENDING]", L"[329][_Exp9]< _Exp9 \"??\" @ _Exp8 >", L"[330][_Exp9]< _Exp9 \"??\" _Exp8 @ >", L"[331][_Exp9]< _Exp9 @ \"??\" _Exp8 >", L"[332][_Exp9]<< !_Exp8 @ >>", L"[333][_Exp10] BEGIN ", L"[334][_Exp10] END [ENDING]", L"[335][_Exp10]< _Exp9 \"?\" @ _Exp10 \":\" _Exp10 >", L"[336][_Exp10]< _Exp9 \"?\" _Exp10 \":\" @ _Exp10 >", L"[337][_Exp10]< _Exp9 \"?\" _Exp10 \":\" _Exp10 @ >", L"[338][_Exp10]< _Exp9 \"?\" _Exp10 @ \":\" _Exp10 >", L"[339][_Exp10]< _Exp9 @ \"?\" _Exp10 \":\" _Exp10 >", L"[340][_Exp10]<< !_Exp9 @ >>", L"[341][_Exp11] BEGIN ", L"[342][_Exp11] END [ENDING]", L"[343][_Exp11]< _Exp10 \"=\" @ _Exp11 >", L"[344][_Exp11]< _Exp10 \"=\" _Exp11 @ >", L"[345][_Exp11]< _Exp10 @ \"=\" _Exp11 >", L"[346][_Exp11]<< !_Exp10 @ >>", L"[347][_Expression] BEGIN ", L"[348][_Expression] END [ENDING]", L"[349][_Expression]<< !_Exp11 @ >>", L"[350][_SwitchCase] BEGIN ", L"[351][_SwitchCase] END [ENDING]", L"[352][_SwitchCase]< \"case\" @ _Expression \":\" _Block >", L"[353][_SwitchCase]< \"case\" _Expression \":\" @ _Block >", L"[354][_SwitchCase]< \"case\" _Expression \":\" _Block @ >", L"[355][_SwitchCase]< \"case\" _Expression @ \":\" _Block >", L"[356][_Block] BEGIN ", L"[357][_Block] END [ENDING]", L"[358][_Block]< \"{\" @ { _Statement } [ NAME \":\" \";\" ] \"}\" >", L"[359][_Block]< \"{\" { _Statement @ } [ NAME \":\" \";\" ] \"}\" >", L"[360][_Block]< \"{\" { _Statement } [ NAME \":\" \";\" @ ] \"}\" >", L"[361][_Block]< \"{\" { _Statement } [ NAME \":\" \";\" ] \"}\" @ >", L"[362][_Block]< \"{\" { _Statement } [ NAME \":\" @ \";\" ] \"}\" >", L"[363][_Block]< \"{\" { _Statement } [ NAME @ \":\" \";\" ] \"}\" >", L"[364][_ElseStat] BEGIN ", L"[365][_ElseStat] END [ENDING]", L"[366][_ElseStat]<< !_Block @ >>", L"[367][_ElseStat]<< !_If @ >>", L"[368][_If] BEGIN ", L"[369][_If] END [ENDING]", L"[370][_If]< \"if\" \"(\" @ [ \"var\" NAME \":\" _Type \"=\" ] _Expression \")\" _Block +[ \"else\" _ElseStat ] >", L"[371][_If]< \"if\" \"(\" [ \"var\" @ NAME \":\" _Type \"=\" ] _Expression \")\" _Block +[ \"else\" _ElseStat ] >", L"[372][_If]< \"if\" \"(\" [ \"var\" NAME \":\" @ _Type \"=\" ] _Expression \")\" _Block +[ \"else\" _ElseStat ] >", L"[373][_If]< \"if\" \"(\" [ \"var\" NAME \":\" _Type \"=\" @ ] _Expression \")\" _Block +[ \"else\" _ElseStat ] >", L"[374][_If]< \"if\" \"(\" [ \"var\" NAME \":\" _Type \"=\" ] _Expression \")\" @ _Block +[ \"else\" _ElseStat ] >", L"[375][_If]< \"if\" \"(\" [ \"var\" NAME \":\" _Type \"=\" ] _Expression \")\" _Block +[ \"else\" @ _ElseStat ] >", L"[376][_If]< \"if\" \"(\" [ \"var\" NAME \":\" _Type \"=\" ] _Expression \")\" _Block +[ \"else\" _ElseStat @ ] >", L"[377][_If]< \"if\" \"(\" [ \"var\" NAME \":\" _Type \"=\" ] _Expression \")\" _Block @ +[ \"else\" _ElseStat ] >", L"[378][_If]< \"if\" \"(\" [ \"var\" NAME \":\" _Type \"=\" ] _Expression @ \")\" _Block +[ \"else\" _ElseStat ] >", L"[379][_If]< \"if\" \"(\" [ \"var\" NAME \":\" _Type @ \"=\" ] _Expression \")\" _Block +[ \"else\" _ElseStat ] >", L"[380][_If]< \"if\" \"(\" [ \"var\" NAME @ \":\" _Type \"=\" ] _Expression \")\" _Block +[ \"else\" _ElseStat ] >", L"[381][_If]< \"if\" @ \"(\" [ \"var\" NAME \":\" _Type \"=\" ] _Expression \")\" _Block +[ \"else\" _ElseStat ] >", L"[382][_ForOperator] BEGIN ", L"[383][_ForOperator] END [ENDING]", L"[384][_ForOperator]\"in\" \"reversed\" @", L"[385][_ForOperator]\"in\" @", L"[386][_ForOperator]\"in\" @ \"reversed\"", L"[387][_VirtualStatement] BEGIN ", L"[388][_VirtualStatement] END [ENDING]", L"[389][_VirtualStatement]< \"for\" \"(\" @ NAME _ForOperator _Expression \")\" _Block >", L"[390][_VirtualStatement]< \"for\" \"(\" NAME @ _ForOperator _Expression \")\" _Block >", L"[391][_VirtualStatement]< \"for\" \"(\" NAME _ForOperator @ _Expression \")\" _Block >", L"[392][_VirtualStatement]< \"for\" \"(\" NAME _ForOperator _Expression \")\" @ _Block >", L"[393][_VirtualStatement]< \"for\" \"(\" NAME _ForOperator _Expression \")\" _Block @ >", L"[394][_VirtualStatement]< \"for\" \"(\" NAME _ForOperator _Expression @ \")\" _Block >", L"[395][_VirtualStatement]< \"for\" @ \"(\" NAME _ForOperator _Expression \")\" _Block >", L"[396][_VirtualStatement]< \"switch\" \"(\" @ _Expression \")\" \"{\" { _SwitchCase } [ \"default\" \":\" _Block ] \"}\" >", L"[397][_VirtualStatement]< \"switch\" \"(\" _Expression \")\" \"{\" @ { _SwitchCase } [ \"default\" \":\" _Block ] \"}\" >", L"[398][_VirtualStatement]< \"switch\" \"(\" _Expression \")\" \"{\" { _SwitchCase @ } [ \"default\" \":\" _Block ] \"}\" >", L"[399][_VirtualStatement]< \"switch\" \"(\" _Expression \")\" \"{\" { _SwitchCase } [ \"default\" \":\" @ _Block ] \"}\" >", L"[400][_VirtualStatement]< \"switch\" \"(\" _Expression \")\" \"{\" { _SwitchCase } [ \"default\" \":\" _Block @ ] \"}\" >", L"[401][_VirtualStatement]< \"switch\" \"(\" _Expression \")\" \"{\" { _SwitchCase } [ \"default\" \":\" _Block ] \"}\" @ >", L"[402][_VirtualStatement]< \"switch\" \"(\" _Expression \")\" \"{\" { _SwitchCase } [ \"default\" @ \":\" _Block ] \"}\" >", L"[403][_VirtualStatement]< \"switch\" \"(\" _Expression \")\" @ \"{\" { _SwitchCase } [ \"default\" \":\" _Block ] \"}\" >", L"[404][_VirtualStatement]< \"switch\" \"(\" _Expression @ \")\" \"{\" { _SwitchCase } [ \"default\" \":\" _Block ] \"}\" >", L"[405][_VirtualStatement]< \"switch\" @ \"(\" _Expression \")\" \"{\" { _SwitchCase } [ \"default\" \":\" _Block ] \"}\" >", L"[406][_CoStatement] BEGIN ", L"[407][_CoStatement] END [ENDING]", L"[408][_CoStatement]< \"$pause\" ( \";\" @ | _Block ) >", L"[409][_CoStatement]< \"$pause\" ( \";\" | _Block @ ) >", L"[410][_CoStatement]< \"$pause\" @ ( \";\" | _Block ) >", L"[411][_CoStatement]< [ \"var\" @ NAME \"=\" ] COROUTINE_OPERATOR { _Expression ; \",\" } \";\" >", L"[412][_CoStatement]< [ \"var\" NAME \"=\" @ ] COROUTINE_OPERATOR { _Expression ; \",\" } \";\" >", L"[413][_CoStatement]< [ \"var\" NAME \"=\" ] COROUTINE_OPERATOR @ { _Expression ; \",\" } \";\" >", L"[414][_CoStatement]< [ \"var\" NAME \"=\" ] COROUTINE_OPERATOR { _Expression ; \",\" @ } \";\" >", L"[415][_CoStatement]< [ \"var\" NAME \"=\" ] COROUTINE_OPERATOR { _Expression ; \",\" } \";\" @ >", L"[416][_CoStatement]< [ \"var\" NAME \"=\" ] COROUTINE_OPERATOR { _Expression @ ; \",\" } \";\" >", L"[417][_CoStatement]< [ \"var\" NAME @ \"=\" ] COROUTINE_OPERATOR { _Expression ; \",\" } \";\" >", L"[418][_CoProvider] BEGIN ", L"[419][_CoProvider] END [ENDING]", L"[420][_CoProvider]< ( \"$\" @ | COROUTINE_OPERATOR ) _Block >", L"[421][_CoProvider]< ( \"$\" | COROUTINE_OPERATOR ) _Block @ >", L"[422][_CoProvider]< ( \"$\" | COROUTINE_OPERATOR @ ) _Block >", L"[423][_StateSwitchHead] BEGIN ", L"[424][_StateSwitchHead] END [ENDING]", L"[425][_StateSwitchHead]< \"$switch\" \"(\" \")\" @ >", L"[426][_StateSwitchHead]< \"$switch\" \"(\" \"continue\" \")\" @ >", L"[427][_StateSwitchHead]< \"$switch\" \"(\" \"continue\" \",\" \"return\" \")\" @ >", L"[428][_StateSwitchHead]< \"$switch\" \"(\" \"continue\" \",\" \"return\" @ \")\" >", L"[429][_StateSwitchHead]< \"$switch\" \"(\" \"continue\" \",\" @ \"return\" \")\" >", L"[430][_StateSwitchHead]< \"$switch\" \"(\" \"continue\" @ \")\" >", L"[431][_StateSwitchHead]< \"$switch\" \"(\" \"continue\" @ \",\" \"return\" \")\" >", L"[432][_StateSwitchHead]< \"$switch\" \"(\" \"raise\" \")\" @ >", L"[433][_StateSwitchHead]< \"$switch\" \"(\" \"raise\" @ \")\" >", L"[434][_StateSwitchHead]< \"$switch\" \"(\" \"return\" \")\" @ >", L"[435][_StateSwitchHead]< \"$switch\" \"(\" \"return\" @ \")\" >", L"[436][_StateSwitchHead]< \"$switch\" \"(\" @ \")\" >", L"[437][_StateSwitchHead]< \"$switch\" \"(\" @ \"continue\" \")\" >", L"[438][_StateSwitchHead]< \"$switch\" \"(\" @ \"continue\" \",\" \"return\" \")\" >", L"[439][_StateSwitchHead]< \"$switch\" \"(\" @ \"raise\" \")\" >", L"[440][_StateSwitchHead]< \"$switch\" \"(\" @ \"return\" \")\" >", L"[441][_StateSwitchHead]< \"$switch\" @ \"(\" \")\" >", L"[442][_StateSwitchHead]< \"$switch\" @ \"(\" \"continue\" \")\" >", L"[443][_StateSwitchHead]< \"$switch\" @ \"(\" \"continue\" \",\" \"return\" \")\" >", L"[444][_StateSwitchHead]< \"$switch\" @ \"(\" \"raise\" \")\" >", L"[445][_StateSwitchHead]< \"$switch\" @ \"(\" \"return\" \")\" >", L"[446][_StateSwitchArgument] BEGIN ", L"[447][_StateSwitchArgument] END [ENDING]", L"[448][_StateSwitchArgument]< NAME @ >", L"[449][_StateSwitchCase] BEGIN ", L"[450][_StateSwitchCase] END [ENDING]", L"[451][_StateSwitchCase]< \"case\" @ NAME \"(\" [ _StateSwitchArgument { \",\" _StateSwitchArgument } ] \")\" \":\" _Block >", L"[452][_StateSwitchCase]< \"case\" NAME \"(\" @ [ _StateSwitchArgument { \",\" _StateSwitchArgument } ] \")\" \":\" _Block >", L"[453][_StateSwitchCase]< \"case\" NAME \"(\" [ _StateSwitchArgument @ { \",\" _StateSwitchArgument } ] \")\" \":\" _Block >", L"[454][_StateSwitchCase]< \"case\" NAME \"(\" [ _StateSwitchArgument { \",\" @ _StateSwitchArgument } ] \")\" \":\" _Block >", L"[455][_StateSwitchCase]< \"case\" NAME \"(\" [ _StateSwitchArgument { \",\" _StateSwitchArgument @ } ] \")\" \":\" _Block >", L"[456][_StateSwitchCase]< \"case\" NAME \"(\" [ _StateSwitchArgument { \",\" _StateSwitchArgument } ] \")\" \":\" @ _Block >", L"[457][_StateSwitchCase]< \"case\" NAME \"(\" [ _StateSwitchArgument { \",\" _StateSwitchArgument } ] \")\" \":\" _Block @ >", L"[458][_StateSwitchCase]< \"case\" NAME \"(\" [ _StateSwitchArgument { \",\" _StateSwitchArgument } ] \")\" @ \":\" _Block >", L"[459][_StateSwitchCase]< \"case\" NAME @ \"(\" [ _StateSwitchArgument { \",\" _StateSwitchArgument } ] \")\" \":\" _Block >", L"[460][_StateStatement] BEGIN ", L"[461][_StateStatement] END [ENDING]", L"[462][_StateStatement]< \"$goto_state\" @ NAME \"(\" { _Expression ; \",\" } \")\" \";\" >", L"[463][_StateStatement]< \"$goto_state\" NAME \"(\" @ { _Expression ; \",\" } \")\" \";\" >", L"[464][_StateStatement]< \"$goto_state\" NAME \"(\" { _Expression ; \",\" @ } \")\" \";\" >", L"[465][_StateStatement]< \"$goto_state\" NAME \"(\" { _Expression ; \",\" } \")\" \";\" @ >", L"[466][_StateStatement]< \"$goto_state\" NAME \"(\" { _Expression ; \",\" } \")\" @ \";\" >", L"[467][_StateStatement]< \"$goto_state\" NAME \"(\" { _Expression @ ; \",\" } \")\" \";\" >", L"[468][_StateStatement]< \"$goto_state\" NAME @ \"(\" { _Expression ; \",\" } \")\" \";\" >", L"[469][_StateStatement]< \"$push_state\" @ NAME \"(\" { _Expression ; \",\" } \")\" \";\" >", L"[470][_StateStatement]< \"$push_state\" NAME \"(\" @ { _Expression ; \",\" } \")\" \";\" >", L"[471][_StateStatement]< \"$push_state\" NAME \"(\" { _Expression ; \",\" @ } \")\" \";\" >", L"[472][_StateStatement]< \"$push_state\" NAME \"(\" { _Expression ; \",\" } \")\" \";\" @ >", L"[473][_StateStatement]< \"$push_state\" NAME \"(\" { _Expression ; \",\" } \")\" @ \";\" >", L"[474][_StateStatement]< \"$push_state\" NAME \"(\" { _Expression @ ; \",\" } \")\" \";\" >", L"[475][_StateStatement]< \"$push_state\" NAME @ \"(\" { _Expression ; \",\" } \")\" \";\" >", L"[476][_StateStatement]<< !_StateSwitchHead \"{\" @ { _StateSwitchCase } \"}\" >>", L"[477][_StateStatement]<< !_StateSwitchHead \"{\" { _StateSwitchCase @ } \"}\" >>", L"[478][_StateStatement]<< !_StateSwitchHead \"{\" { _StateSwitchCase } \"}\" @ >>", L"[479][_StateStatement]<< !_StateSwitchHead @ \"{\" { _StateSwitchCase } \"}\" >>", L"[480][_Statement] BEGIN ", L"[481][_Statement] END [ENDING]", L"[482][_Statement]< \"break\" \";\" @ >", L"[483][_Statement]< \"break\" @ \";\" >", L"[484][_Statement]< \"continue\" \";\" @ >", L"[485][_Statement]< \"continue\" @ \";\" >", L"[486][_Statement]< \"delete\" @ _Expression \";\" >", L"[487][_Statement]< \"delete\" _Expression \";\" @ >", L"[488][_Statement]< \"delete\" _Expression @ \";\" >", L"[489][_Statement]< \"goto\" @ NAME \";\" >", L"[490][_Statement]< \"goto\" NAME \";\" @ >", L"[491][_Statement]< \"goto\" NAME @ \";\" >", L"[492][_Statement]< \"raise\" @ [ _Expression ] \";\" >", L"[493][_Statement]< \"raise\" [ _Expression @ ] \";\" >", L"[494][_Statement]< \"raise\" [ _Expression ] \";\" @ >", L"[495][_Statement]< \"return\" @ [ _Expression ] \";\" >", L"[496][_Statement]< \"return\" [ _Expression @ ] \";\" >", L"[497][_Statement]< \"return\" [ _Expression ] \";\" @ >", L"[498][_Statement]< \"try\" @ _Block [ \"catch\" \"(\" NAME \")\" _Block ] [ \"finally\" _Block ] >", L"[499][_Statement]< \"try\" _Block @ [ \"catch\" \"(\" NAME \")\" _Block ] [ \"finally\" _Block ] >", L"[500][_Statement]< \"try\" _Block [ \"catch\" \"(\" @ NAME \")\" _Block ] [ \"finally\" _Block ] >", L"[501][_Statement]< \"try\" _Block [ \"catch\" \"(\" NAME \")\" @ _Block ] [ \"finally\" _Block ] >", L"[502][_Statement]< \"try\" _Block [ \"catch\" \"(\" NAME \")\" _Block @ ] [ \"finally\" _Block ] >", L"[503][_Statement]< \"try\" _Block [ \"catch\" \"(\" NAME \")\" _Block ] [ \"finally\" @ _Block ] >", L"[504][_Statement]< \"try\" _Block [ \"catch\" \"(\" NAME \")\" _Block ] [ \"finally\" _Block @ ] >", L"[505][_Statement]< \"try\" _Block [ \"catch\" \"(\" NAME @ \")\" _Block ] [ \"finally\" _Block ] >", L"[506][_Statement]< \"try\" _Block [ \"catch\" @ \"(\" NAME \")\" _Block ] [ \"finally\" _Block ] >", L"[507][_Statement]< \"while\" \"(\" @ _Expression \")\" _Block >", L"[508][_Statement]< \"while\" \"(\" _Expression \")\" @ _Block >", L"[509][_Statement]< \"while\" \"(\" _Expression \")\" _Block @ >", L"[510][_Statement]< \"while\" \"(\" _Expression @ \")\" _Block >", L"[511][_Statement]< \"while\" @ \"(\" _Expression \")\" _Block >", L"[512][_Statement]< _Expression \";\" @ >", L"[513][_Statement]< _Expression @ \";\" >", L"[514][_Statement]< _Variable @ >", L"[515][_Statement]<< !_Block @ >>", L"[516][_Statement]<< !_CoStatement @ >>", L"[517][_Statement]<< !_If @ >>", L"[518][_Statement]<< !_StateStatement @ >>", L"[519][_Statement]<< !_VirtualStatement @ >>", L"[520][_StateInput] BEGIN ", L"[521][_StateInput] END [ENDING]", L"[522][_StateInput]< \"$state_input\" @ NAME \"(\" { _FunctionArgument ; \",\" } \")\" \";\" >", L"[523][_StateInput]< \"$state_input\" NAME \"(\" @ { _FunctionArgument ; \",\" } \")\" \";\" >", L"[524][_StateInput]< \"$state_input\" NAME \"(\" { _FunctionArgument ; \",\" @ } \")\" \";\" >", L"[525][_StateInput]< \"$state_input\" NAME \"(\" { _FunctionArgument ; \",\" } \")\" \";\" @ >", L"[526][_StateInput]< \"$state_input\" NAME \"(\" { _FunctionArgument ; \",\" } \")\" @ \";\" >", L"[527][_StateInput]< \"$state_input\" NAME \"(\" { _FunctionArgument @ ; \",\" } \")\" \";\" >", L"[528][_StateInput]< \"$state_input\" NAME @ \"(\" { _FunctionArgument ; \",\" } \")\" \";\" >", L"[529][_StateDecl] BEGIN ", L"[530][_StateDecl] END [ENDING]", L"[531][_StateDecl]< \"$state\" ( \"default\" @ | NAME ) \"(\" { _FunctionArgument ; \",\" } \")\" _Block >", L"[532][_StateDecl]< \"$state\" ( \"default\" | NAME ) \"(\" @ { _FunctionArgument ; \",\" } \")\" _Block >", L"[533][_StateDecl]< \"$state\" ( \"default\" | NAME ) \"(\" { _FunctionArgument ; \",\" @ } \")\" _Block >", L"[534][_StateDecl]< \"$state\" ( \"default\" | NAME ) \"(\" { _FunctionArgument ; \",\" } \")\" @ _Block >", L"[535][_StateDecl]< \"$state\" ( \"default\" | NAME ) \"(\" { _FunctionArgument ; \",\" } \")\" _Block @ >", L"[536][_StateDecl]< \"$state\" ( \"default\" | NAME ) \"(\" { _FunctionArgument @ ; \",\" } \")\" _Block >", L"[537][_StateDecl]< \"$state\" ( \"default\" | NAME @ ) \"(\" { _FunctionArgument ; \",\" } \")\" _Block >", L"[538][_StateDecl]< \"$state\" @ ( \"default\" | NAME ) \"(\" { _FunctionArgument ; \",\" } \")\" _Block >", L"[539][_StateMachine] BEGIN ", L"[540][_StateMachine] END [ENDING]", L"[541][_StateMachine]< \"$state_machine\" \"{\" @ { ( _StateInput | _StateDecl ) } \"}\" >", L"[542][_StateMachine]< \"$state_machine\" \"{\" { ( _StateInput @ | _StateDecl ) } \"}\" >", L"[543][_StateMachine]< \"$state_machine\" \"{\" { ( _StateInput | _StateDecl ) } \"}\" @ >", L"[544][_StateMachine]< \"$state_machine\" \"{\" { ( _StateInput | _StateDecl @ ) } \"}\" >", L"[545][_StateMachine]< \"$state_machine\" @ \"{\" { ( _StateInput | _StateDecl ) } \"}\" >", L"[546][_Attribute] BEGIN ", L"[547][_Attribute] END [ENDING]", L"[548][_Attribute]< \"@\" @ NAME \":\" NAME [ \"(\" _Expression \")\" ] >", L"[549][_Attribute]< \"@\" NAME \":\" @ NAME [ \"(\" _Expression \")\" ] >", L"[550][_Attribute]< \"@\" NAME \":\" NAME @ [ \"(\" _Expression \")\" ] >", L"[551][_Attribute]< \"@\" NAME \":\" NAME [ \"(\" @ _Expression \")\" ] >", L"[552][_Attribute]< \"@\" NAME \":\" NAME [ \"(\" _Expression \")\" @ ] >", L"[553][_Attribute]< \"@\" NAME \":\" NAME [ \"(\" _Expression @ \")\" ] >", L"[554][_Attribute]< \"@\" NAME @ \":\" NAME [ \"(\" _Expression \")\" ] >", L"[555][_Namespace] BEGIN ", L"[556][_Namespace] END [ENDING]", L"[557][_Namespace]< \"namespace\" @ NAME \"{\" { _Declaration } \"}\" >", L"[558][_Namespace]< \"namespace\" NAME \"{\" @ { _Declaration } \"}\" >", L"[559][_Namespace]< \"namespace\" NAME \"{\" { _Declaration @ } \"}\" >", L"[560][_Namespace]< \"namespace\" NAME \"{\" { _Declaration } \"}\" @ >", L"[561][_Namespace]< \"namespace\" NAME @ \"{\" { _Declaration } \"}\" >", L"[562][_FunctionArgument] BEGIN ", L"[563][_FunctionArgument] END [ENDING]", L"[564][_FunctionArgument]< { _Attribute @ } NAME \":\" _Type >", L"[565][_FunctionArgument]< { _Attribute } NAME \":\" @ _Type >", L"[566][_FunctionArgument]< { _Attribute } NAME \":\" _Type @ >", L"[567][_FunctionArgument]< { _Attribute } NAME @ \":\" _Type >", L"[568][_FunctionArgumentList] BEGIN ", L"[569][_FunctionArgumentList] END [ENDING]", L"[570][_FunctionArgumentList]\"(\" @ { _FunctionArgument ; \",\" } \")\"", L"[571][_FunctionArgumentList]\"(\" { _FunctionArgument ; \",\" @ } \")\"", L"[572][_FunctionArgumentList]\"(\" { _FunctionArgument ; \",\" } \")\" @", L"[573][_FunctionArgumentList]\"(\" { _FunctionArgument @ ; \",\" } \")\"", L"[574][_FunctionStat] BEGIN ", L"[575][_FunctionStat] END [ENDING]", L"[576][_FunctionStat]<< !_Block @ >>", L"[577][_FunctionStat]<< !_CoProvider @ >>", L"[578][_FunctionBody] BEGIN ", L"[579][_FunctionBody] END [ENDING]", L"[580][_FunctionBody]\"(\" @ { _FunctionArgument ; \",\" } \")\" \":\" _Type ( _FunctionStat | \";\" )", L"[581][_FunctionBody]\"(\" { _FunctionArgument ; \",\" @ } \")\" \":\" _Type ( _FunctionStat | \";\" )", L"[582][_FunctionBody]\"(\" { _FunctionArgument ; \",\" } \")\" \":\" @ _Type ( _FunctionStat | \";\" )", L"[583][_FunctionBody]\"(\" { _FunctionArgument ; \",\" } \")\" \":\" _Type ( _FunctionStat @ | \";\" )", L"[584][_FunctionBody]\"(\" { _FunctionArgument ; \",\" } \")\" \":\" _Type ( _FunctionStat | \";\" @ )", L"[585][_FunctionBody]\"(\" { _FunctionArgument ; \",\" } \")\" \":\" _Type @ ( _FunctionStat | \";\" )", L"[586][_FunctionBody]\"(\" { _FunctionArgument ; \",\" } \")\" @ \":\" _Type ( _FunctionStat | \";\" )", L"[587][_FunctionBody]\"(\" { _FunctionArgument @ ; \",\" } \")\" \":\" _Type ( _FunctionStat | \";\" )", L"[588][_FunctionKind] BEGIN ", L"[589][_FunctionKind] END [ENDING]", L"[590][_FunctionKind]\"func\" @", L"[591][_FunctionKind]\"override\" \"func\" @", L"[592][_FunctionKind]\"override\" @ \"func\"", L"[593][_FunctionKind]\"static\" \"func\" @", L"[594][_FunctionKind]\"static\" @ \"func\"", L"[595][_Function] BEGIN ", L"[596][_Function] END [ENDING]", L"[597][_Function]< _FunctionKind @ NAME _FunctionBody >", L"[598][_Function]< _FunctionKind @ _FunctionBody >", L"[599][_Function]< _FunctionKind NAME @ _FunctionBody >", L"[600][_Function]< _FunctionKind NAME _FunctionBody @ >", L"[601][_Function]< _FunctionKind _FunctionBody @ >", L"[602][_Variable] BEGIN ", L"[603][_Variable] END [ENDING]", L"[604][_Variable]< \"var\" @ NAME [ \":\" _Type ] \"=\" _Expression \";\" >", L"[605][_Variable]< \"var\" NAME @ [ \":\" _Type ] \"=\" _Expression \";\" >", L"[606][_Variable]< \"var\" NAME [ \":\" @ _Type ] \"=\" _Expression \";\" >", L"[607][_Variable]< \"var\" NAME [ \":\" _Type @ ] \"=\" _Expression \";\" >", L"[608][_Variable]< \"var\" NAME [ \":\" _Type ] \"=\" @ _Expression \";\" >", L"[609][_Variable]< \"var\" NAME [ \":\" _Type ] \"=\" _Expression \";\" @ >", L"[610][_Variable]< \"var\" NAME [ \":\" _Type ] \"=\" _Expression @ \";\" >", L"[611][_Event] BEGIN ", L"[612][_Event] END [ENDING]", L"[613][_Event]< \"event\" @ NAME \"(\" { _Type ; \",\" } \")\" \";\" >", L"[614][_Event]< \"event\" NAME \"(\" @ { _Type ; \",\" } \")\" \";\" >", L"[615][_Event]< \"event\" NAME \"(\" { _Type ; \",\" @ } \")\" \";\" >", L"[616][_Event]< \"event\" NAME \"(\" { _Type ; \",\" } \")\" \";\" @ >", L"[617][_Event]< \"event\" NAME \"(\" { _Type ; \",\" } \")\" @ \";\" >", L"[618][_Event]< \"event\" NAME \"(\" { _Type @ ; \",\" } \")\" \";\" >", L"[619][_Event]< \"event\" NAME @ \"(\" { _Type ; \",\" } \")\" \";\" >", L"[620][_Property] BEGIN ", L"[621][_Property] END [ENDING]", L"[622][_Property]< \"prop\" @ NAME \":\" _Type \"{\" NAME [ \",\" NAME ] [ \":\" NAME ] \"}\" >", L"[623][_Property]< \"prop\" NAME \":\" @ _Type \"{\" NAME [ \",\" NAME ] [ \":\" NAME ] \"}\" >", L"[624][_Property]< \"prop\" NAME \":\" _Type \"{\" @ NAME [ \",\" NAME ] [ \":\" NAME ] \"}\" >", L"[625][_Property]< \"prop\" NAME \":\" _Type \"{\" NAME @ [ \",\" NAME ] [ \":\" NAME ] \"}\" >", L"[626][_Property]< \"prop\" NAME \":\" _Type \"{\" NAME [ \",\" @ NAME ] [ \":\" NAME ] \"}\" >", L"[627][_Property]< \"prop\" NAME \":\" _Type \"{\" NAME [ \",\" NAME @ ] [ \":\" NAME ] \"}\" >", L"[628][_Property]< \"prop\" NAME \":\" _Type \"{\" NAME [ \",\" NAME ] [ \":\" @ NAME ] \"}\" >", L"[629][_Property]< \"prop\" NAME \":\" _Type \"{\" NAME [ \",\" NAME ] [ \":\" NAME @ ] \"}\" >", L"[630][_Property]< \"prop\" NAME \":\" _Type \"{\" NAME [ \",\" NAME ] [ \":\" NAME ] \"}\" @ >", L"[631][_Property]< \"prop\" NAME \":\" _Type @ \"{\" NAME [ \",\" NAME ] [ \":\" NAME ] \"}\" >", L"[632][_Property]< \"prop\" NAME @ \":\" _Type \"{\" NAME [ \",\" NAME ] [ \":\" NAME ] \"}\" >", L"[633][_StaticInit] BEGIN ", L"[634][_StaticInit] END [ENDING]", L"[635][_StaticInit]< \"static\" @ _Block >", L"[636][_StaticInit]< \"static\" _Block @ >", L"[637][_BaseConstructorCall] BEGIN ", L"[638][_BaseConstructorCall] END [ENDING]", L"[639][_BaseConstructorCall]< _Type \"(\" @ [ _Expression { \",\" _Expression } ] \")\" >", L"[640][_BaseConstructorCall]< _Type \"(\" [ _Expression @ { \",\" _Expression } ] \")\" >", L"[641][_BaseConstructorCall]< _Type \"(\" [ _Expression { \",\" @ _Expression } ] \")\" >", L"[642][_BaseConstructorCall]< _Type \"(\" [ _Expression { \",\" _Expression @ } ] \")\" >", L"[643][_BaseConstructorCall]< _Type \"(\" [ _Expression { \",\" _Expression } ] \")\" @ >", L"[644][_BaseConstructorCall]< _Type @ \"(\" [ _Expression { \",\" _Expression } ] \")\" >", L"[645][_ConstructorType] BEGIN ", L"[646][_ConstructorType] END [ENDING]", L"[647][_ConstructorType]\"new\" \"*\" @", L"[648][_ConstructorType]\"new\" @", L"[649][_ConstructorType]\"new\" @ \"*\"", L"[650][_Constructor] BEGIN ", L"[651][_Constructor] END [ENDING]", L"[652][_Constructor]< _ConstructorType \"(\" @ { _FunctionArgument ; \",\" } \")\" [ \":\" { _BaseConstructorCall ; \",\" } ] _Block >", L"[653][_Constructor]< _ConstructorType \"(\" { _FunctionArgument ; \",\" @ } \")\" [ \":\" { _BaseConstructorCall ; \",\" } ] _Block >", L"[654][_Constructor]< _ConstructorType \"(\" { _FunctionArgument ; \",\" } \")\" @ [ \":\" { _BaseConstructorCall ; \",\" } ] _Block >", L"[655][_Constructor]< _ConstructorType \"(\" { _FunctionArgument ; \",\" } \")\" [ \":\" @ { _BaseConstructorCall ; \",\" } ] _Block >", L"[656][_Constructor]< _ConstructorType \"(\" { _FunctionArgument ; \",\" } \")\" [ \":\" { _BaseConstructorCall ; \",\" @ } ] _Block >", L"[657][_Constructor]< _ConstructorType \"(\" { _FunctionArgument ; \",\" } \")\" [ \":\" { _BaseConstructorCall ; \",\" } ] _Block @ >", L"[658][_Constructor]< _ConstructorType \"(\" { _FunctionArgument ; \",\" } \")\" [ \":\" { _BaseConstructorCall @ ; \",\" } ] _Block >", L"[659][_Constructor]< _ConstructorType \"(\" { _FunctionArgument @ ; \",\" } \")\" [ \":\" { _BaseConstructorCall ; \",\" } ] _Block >", L"[660][_Constructor]< _ConstructorType @ \"(\" { _FunctionArgument ; \",\" } \")\" [ \":\" { _BaseConstructorCall ; \",\" } ] _Block >", L"[661][_Destructor] BEGIN ", L"[662][_Destructor] END [ENDING]", L"[663][_Destructor]< \"delete\" @ _Block >", L"[664][_Destructor]< \"delete\" _Block @ >", L"[665][_ClassBody] BEGIN ", L"[666][_ClassBody] END [ENDING]", L"[667][_ClassBody][ \":\" @ { _Type ; \",\" } ] \"{\" { _Declaration } [ _StateMachine ] \"}\"", L"[668][_ClassBody][ \":\" { _Type ; \",\" @ } ] \"{\" { _Declaration } [ _StateMachine ] \"}\"", L"[669][_ClassBody][ \":\" { _Type ; \",\" } ] \"{\" @ { _Declaration } [ _StateMachine ] \"}\"", L"[670][_ClassBody][ \":\" { _Type ; \",\" } ] \"{\" { _Declaration @ } [ _StateMachine ] \"}\"", L"[671][_ClassBody][ \":\" { _Type ; \",\" } ] \"{\" { _Declaration } [ _StateMachine @ ] \"}\"", L"[672][_ClassBody][ \":\" { _Type ; \",\" } ] \"{\" { _Declaration } [ _StateMachine ] \"}\" @", L"[673][_ClassBody][ \":\" { _Type @ ; \",\" } ] \"{\" { _Declaration } [ _StateMachine ] \"}\"", L"[674][_Class] BEGIN ", L"[675][_Class] END [ENDING]", L"[676][_Class]< \"class\" @ NAME _ClassBody >", L"[677][_Class]< \"class\" NAME @ _ClassBody >", L"[678][_Class]< \"class\" NAME _ClassBody @ >", L"[679][_Class]< \"interface\" @ NAME \"*\" _ClassBody >", L"[680][_Class]< \"interface\" @ NAME _ClassBody >", L"[681][_Class]< \"interface\" NAME \"*\" @ _ClassBody >", L"[682][_Class]< \"interface\" NAME \"*\" _ClassBody @ >", L"[683][_Class]< \"interface\" NAME @ \"*\" _ClassBody >", L"[684][_Class]< \"interface\" NAME @ _ClassBody >", L"[685][_Class]< \"interface\" NAME _ClassBody @ >", L"[686][_EnumItemInt] BEGIN ", L"[687][_EnumItemInt] END [ENDING]", L"[688][_EnumItemInt]< NAME @ >", L"[689][_EnumItemA] BEGIN ", L"[690][_EnumItemA] END [ENDING]", L"[691][_EnumItemA]< { _Attribute @ } NAME \"=\" INTEGER \",\" >", L"[692][_EnumItemA]< { _Attribute } NAME \"=\" @ INTEGER \",\" >", L"[693][_EnumItemA]< { _Attribute } NAME \"=\" INTEGER \",\" @ >", L"[694][_EnumItemA]< { _Attribute } NAME \"=\" INTEGER @ \",\" >", L"[695][_EnumItemA]< { _Attribute } NAME @ \"=\" INTEGER \",\" >", L"[696][_EnumItemB] BEGIN ", L"[697][_EnumItemB] END [ENDING]", L"[698][_EnumItemB]< { _Attribute @ } NAME \"=\" _EnumItemInt { \"|\" _EnumItemInt } \",\" >", L"[699][_EnumItemB]< { _Attribute } NAME \"=\" @ _EnumItemInt { \"|\" _EnumItemInt } \",\" >", L"[700][_EnumItemB]< { _Attribute } NAME \"=\" _EnumItemInt @ { \"|\" _EnumItemInt } \",\" >", L"[701][_EnumItemB]< { _Attribute } NAME \"=\" _EnumItemInt { \"|\" @ _EnumItemInt } \",\" >", L"[702][_EnumItemB]< { _Attribute } NAME \"=\" _EnumItemInt { \"|\" _EnumItemInt @ } \",\" >", L"[703][_EnumItemB]< { _Attribute } NAME \"=\" _EnumItemInt { \"|\" _EnumItemInt } \",\" @ >", L"[704][_EnumItemB]< { _Attribute } NAME @ \"=\" _EnumItemInt { \"|\" _EnumItemInt } \",\" >", L"[705][_Enum] BEGIN ", L"[706][_Enum] END [ENDING]", L"[707][_Enum]< \"enum\" @ NAME \"{\" _EnumItemA { _EnumItemA } \"}\" >", L"[708][_Enum]< \"enum\" NAME \"{\" @ _EnumItemA { _EnumItemA } \"}\" >", L"[709][_Enum]< \"enum\" NAME \"{\" _EnumItemA @ { _EnumItemA } \"}\" >", L"[710][_Enum]< \"enum\" NAME \"{\" _EnumItemA { _EnumItemA @ } \"}\" >", L"[711][_Enum]< \"enum\" NAME \"{\" _EnumItemA { _EnumItemA } \"}\" @ >", L"[712][_Enum]< \"enum\" NAME @ \"{\" _EnumItemA { _EnumItemA } \"}\" >", L"[713][_Enum]< \"flagenum\" @ NAME \"{\" _EnumItemA { _EnumItemA } { _EnumItemB } \"}\" >", L"[714][_Enum]< \"flagenum\" NAME \"{\" @ _EnumItemA { _EnumItemA } { _EnumItemB } \"}\" >", L"[715][_Enum]< \"flagenum\" NAME \"{\" _EnumItemA @ { _EnumItemA } { _EnumItemB } \"}\" >", L"[716][_Enum]< \"flagenum\" NAME \"{\" _EnumItemA { _EnumItemA @ } { _EnumItemB } \"}\" >", L"[717][_Enum]< \"flagenum\" NAME \"{\" _EnumItemA { _EnumItemA } { _EnumItemB @ } \"}\" >", L"[718][_Enum]< \"flagenum\" NAME \"{\" _EnumItemA { _EnumItemA } { _EnumItemB } \"}\" @ >", L"[719][_Enum]< \"flagenum\" NAME @ \"{\" _EnumItemA { _EnumItemA } { _EnumItemB } \"}\" >", L"[720][_StructMember] BEGIN ", L"[721][_StructMember] END [ENDING]", L"[722][_StructMember]< { _Attribute @ } NAME \":\" _Type \";\" >", L"[723][_StructMember]< { _Attribute } NAME \":\" @ _Type \";\" >", L"[724][_StructMember]< { _Attribute } NAME \":\" _Type \";\" @ >", L"[725][_StructMember]< { _Attribute } NAME \":\" _Type @ \";\" >", L"[726][_StructMember]< { _Attribute } NAME @ \":\" _Type \";\" >", L"[727][_Struct] BEGIN ", L"[728][_Struct] END [ENDING]", L"[729][_Struct]< \"struct\" @ NAME \"{\" { _StructMember } \"}\" >", L"[730][_Struct]< \"struct\" NAME \"{\" @ { _StructMember } \"}\" >", L"[731][_Struct]< \"struct\" NAME \"{\" { _StructMember @ } \"}\" >", L"[732][_Struct]< \"struct\" NAME \"{\" { _StructMember } \"}\" @ >", L"[733][_Struct]< \"struct\" NAME @ \"{\" { _StructMember } \"}\" >", L"[734][_APConfig] BEGIN ", L"[735][_APConfig] END [ENDING]", L"[736][_APConfig]\"{\" \"const\" \",\" \"not\" \"observe\" \"}\" @", L"[737][_APConfig]\"{\" \"const\" \",\" \"not\" \"observe\" @ \"}\"", L"[738][_APConfig]\"{\" \"const\" \",\" \"not\" @ \"observe\" \"}\"", L"[739][_APConfig]\"{\" \"const\" \",\" @ \"not\" \"observe\" \"}\"", L"[740][_APConfig]\"{\" \"const\" \"}\" @", L"[741][_APConfig]\"{\" \"const\" @ \",\" \"not\" \"observe\" \"}\"", L"[742][_APConfig]\"{\" \"const\" @ \"}\"", L"[743][_APConfig]\"{\" \"not\" \"observe\" \"}\" @", L"[744][_APConfig]\"{\" \"not\" \"observe\" @ \"}\"", L"[745][_APConfig]\"{\" \"not\" @ \"observe\" \"}\"", L"[746][_APConfig]\"{\" \"}\" @", L"[747][_APConfig]\"{\" @ \"const\" \",\" \"not\" \"observe\" \"}\"", L"[748][_APConfig]\"{\" @ \"const\" \"}\"", L"[749][_APConfig]\"{\" @ \"not\" \"observe\" \"}\"", L"[750][_APConfig]\"{\" @ \"}\"", L"[751][_AutoPropertyKind] BEGIN ", L"[752][_AutoPropertyKind] END [ENDING]", L"[753][_AutoPropertyKind]\"override\" \"prop\" @", L"[754][_AutoPropertyKind]\"override\" @ \"prop\"", L"[755][_AutoPropertyKind]\"prop\" @", L"[756][_AutoPropertyKind]\"static\" \"prop\" @", L"[757][_AutoPropertyKind]\"static\" @ \"prop\"", L"[758][_AutoProperty] BEGIN ", L"[759][_AutoProperty] END [ENDING]", L"[760][_AutoProperty]< _AutoPropertyKind @ NAME \":\" _Type [ \"=\" _Expression ] _APConfig >", L"[761][_AutoProperty]< _AutoPropertyKind NAME \":\" @ _Type [ \"=\" _Expression ] _APConfig >", L"[762][_AutoProperty]< _AutoPropertyKind NAME \":\" _Type @ [ \"=\" _Expression ] _APConfig >", L"[763][_AutoProperty]< _AutoPropertyKind NAME \":\" _Type [ \"=\" @ _Expression ] _APConfig >", L"[764][_AutoProperty]< _AutoPropertyKind NAME \":\" _Type [ \"=\" _Expression @ ] _APConfig >", L"[765][_AutoProperty]< _AutoPropertyKind NAME \":\" _Type [ \"=\" _Expression ] _APConfig @ >", L"[766][_AutoProperty]< _AutoPropertyKind NAME @ \":\" _Type [ \"=\" _Expression ] _APConfig >", L"[767][_CastResultInterface] BEGIN ", L"[768][_CastResultInterface] END [ENDING]", L"[769][_CastResultInterface]< \"$interface\" @ NAME \":\" _Type \"<\" _Type \">\" \";\" >", L"[770][_CastResultInterface]< \"$interface\" NAME \":\" @ _Type \"<\" _Type \">\" \";\" >", L"[771][_CastResultInterface]< \"$interface\" NAME \":\" _Type \"<\" @ _Type \">\" \";\" >", L"[772][_CastResultInterface]< \"$interface\" NAME \":\" _Type \"<\" _Type \">\" \";\" @ >", L"[773][_CastResultInterface]< \"$interface\" NAME \":\" _Type \"<\" _Type \">\" @ \";\" >", L"[774][_CastResultInterface]< \"$interface\" NAME \":\" _Type \"<\" _Type @ \">\" \";\" >", L"[775][_CastResultInterface]< \"$interface\" NAME \":\" _Type @ \"<\" _Type \">\" \";\" >", L"[776][_CastResultInterface]< \"$interface\" NAME @ \":\" _Type \"<\" _Type \">\" \";\" >", L"[777][_DeclarationCandidates] BEGIN ", L"[778][_DeclarationCandidates] END [ENDING]", L"[779][_DeclarationCandidates]<< !_AutoProperty @ >>", L"[780][_DeclarationCandidates]<< !_CastResultInterface @ >>", L"[781][_DeclarationCandidates]<< !_Class @ >>", L"[782][_DeclarationCandidates]<< !_Constructor @ >>", L"[783][_DeclarationCandidates]<< !_Destructor @ >>", L"[784][_DeclarationCandidates]<< !_Enum @ >>", L"[785][_DeclarationCandidates]<< !_Event @ >>", L"[786][_DeclarationCandidates]<< !_Function @ >>", L"[787][_DeclarationCandidates]<< !_Namespace @ >>", L"[788][_DeclarationCandidates]<< !_Property @ >>", L"[789][_DeclarationCandidates]<< !_StaticInit @ >>", L"[790][_DeclarationCandidates]<< !_Struct @ >>", L"[791][_DeclarationCandidates]<< !_Variable @ >>", L"[792][_Declaration] BEGIN ", L"[793][_Declaration] END [ENDING]", L"[794][_Declaration]<< { _Attribute @ } !_DeclarationCandidates >>", L"[795][_Declaration]<< { _Attribute } !_DeclarationCandidates @ >>", L"[796][_UsingFragment] BEGIN ", L"[797][_UsingFragment] END [ENDING]", L"[798][_UsingFragment]< \"*\" @ >", L"[799][_UsingFragment]< NAME @ >", L"[800][_UsingItem] BEGIN ", L"[801][_UsingItem] END [ENDING]", L"[802][_UsingItem]< _UsingFragment @ { _UsingFragment } >", L"[803][_UsingItem]< _UsingFragment { _UsingFragment @ } >", L"[804][_UsingPath] BEGIN ", L"[805][_UsingPath] END [ENDING]", L"[806][_UsingPath]< \"using\" @ _UsingItem { \"::\" _UsingItem } \";\" >", L"[807][_UsingPath]< \"using\" _UsingItem @ { \"::\" _UsingItem } \";\" >", L"[808][_UsingPath]< \"using\" _UsingItem { \"::\" @ _UsingItem } \";\" >", L"[809][_UsingPath]< \"using\" _UsingItem { \"::\" _UsingItem @ } \";\" >", L"[810][_UsingPath]< \"using\" _UsingItem { \"::\" _UsingItem } \";\" @ >", L"[811][_ModuleBody] BEGIN ", L"[812][_ModuleBody] END [ENDING]", L"[813][_ModuleBody]NAME \";\" @ { _UsingPath } { _Declaration }", L"[814][_ModuleBody]NAME \";\" { _UsingPath @ } { _Declaration }", L"[815][_ModuleBody]NAME \";\" { _UsingPath } { _Declaration @ }", L"[816][_ModuleBody]NAME @ \";\" { _UsingPath } { _Declaration }", L"[817][_Module] BEGIN ", L"[818][_Module] END [ENDING]", L"[819][_Module]< \"module\" @ _ModuleBody >", L"[820][_Module]< \"module\" _ModuleBody @ >", L"[821][_Module]< \"unit\" @ _ModuleBody >", L"[822][_Module]< \"unit\" _ModuleBody @ >", }; return results[index]; } Parser::Parser() : vl::glr::ParserBase(&WorkflowTokenDeleter, &WorkflowLexerData, &WorkflowParserData) { } vl::WString Parser::GetClassName(vl::vint32_t classIndex) const { return vl::WString::Unmanaged(WorkflowTypeName((WorkflowClasses)classIndex)); } vl::vint32_t Parser::FindCommonBaseClass(vl::vint32_t class1, vl::vint32_t class2) const { return -1; } vl::Ptr Parser::Parse_Type(const vl::WString& input, vl::vint codeIndex) const { return ParseWithString(input, this, codeIndex); } vl::Ptr Parser::Parse_Type(vl::collections::List& tokens, vl::vint codeIndex) const { return ParseWithTokens(tokens, this, codeIndex); } vl::Ptr Parser::Parse_Expression(const vl::WString& input, vl::vint codeIndex) const { return ParseWithString(input, this, codeIndex); } vl::Ptr Parser::Parse_Expression(vl::collections::List& tokens, vl::vint codeIndex) const { return ParseWithTokens(tokens, this, codeIndex); } vl::Ptr Parser::Parse_CoProvider(const vl::WString& input, vl::vint codeIndex) const { return ParseWithString(input, this, codeIndex); } vl::Ptr Parser::Parse_CoProvider(vl::collections::List& tokens, vl::vint codeIndex) const { return ParseWithTokens(tokens, this, codeIndex); } vl::Ptr Parser::Parse_Statement(const vl::WString& input, vl::vint codeIndex) const { return ParseWithString(input, this, codeIndex); } vl::Ptr Parser::Parse_Statement(vl::collections::List& tokens, vl::vint codeIndex) const { return ParseWithTokens(tokens, this, codeIndex); } vl::Ptr Parser::Parse_Declaration(const vl::WString& input, vl::vint codeIndex) const { return ParseWithString(input, this, codeIndex); } vl::Ptr Parser::Parse_Declaration(vl::collections::List& tokens, vl::vint codeIndex) const { return ParseWithTokens(tokens, this, codeIndex); } vl::Ptr Parser::Parse_Module(const vl::WString& input, vl::vint codeIndex) const { return ParseWithString(input, this, codeIndex); } vl::Ptr Parser::Parse_Module(vl::collections::List& tokens, vl::vint codeIndex) const { return ParseWithTokens(tokens, this, codeIndex); } } /*********************************************************************** .\PARSER\GENERATED\WORKFLOW_ASSEMBLER.CPP ***********************************************************************/ /*********************************************************************** This file is generated by: Vczh Parser Generator From parser definition:Workflow Licensed under https://github.com/vczh-libraries/License ***********************************************************************/ namespace vl::workflow { /*********************************************************************** WorkflowAstInsReceiver : public vl::glr::AstInsReceiverBase ***********************************************************************/ vl::Ptr WorkflowAstInsReceiver::CreateAstNode(vl::vint32_t type) { auto cppTypeName = WorkflowCppTypeName((WorkflowClasses)type); switch((WorkflowClasses)type) { case WorkflowClasses::AttachEventExpression: return vl::Ptr(new vl::workflow::WfAttachEventExpression); case WorkflowClasses::Attribute: return vl::Ptr(new vl::workflow::WfAttribute); case WorkflowClasses::AutoPropertyDeclaration: return vl::Ptr(new vl::workflow::WfAutoPropertyDeclaration); case WorkflowClasses::BaseConstructorCall: return vl::Ptr(new vl::workflow::WfBaseConstructorCall); case WorkflowClasses::BinaryExpression: return vl::Ptr(new vl::workflow::WfBinaryExpression); case WorkflowClasses::BindExpression: return vl::Ptr(new vl::workflow::WfBindExpression); case WorkflowClasses::BlockStatement: return vl::Ptr(new vl::workflow::WfBlockStatement); case WorkflowClasses::BreakStatement: return vl::Ptr(new vl::workflow::WfBreakStatement); case WorkflowClasses::CallExpression: return vl::Ptr(new vl::workflow::WfCallExpression); case WorkflowClasses::CastResultInterfaceDeclaration: return vl::Ptr(new vl::workflow::WfCastResultInterfaceDeclaration); case WorkflowClasses::ChildExpression: return vl::Ptr(new vl::workflow::WfChildExpression); case WorkflowClasses::ChildType: return vl::Ptr(new vl::workflow::WfChildType); case WorkflowClasses::ClassDeclaration: return vl::Ptr(new vl::workflow::WfClassDeclaration); case WorkflowClasses::CoOperatorExpression: return vl::Ptr(new vl::workflow::WfCoOperatorExpression); case WorkflowClasses::CoOperatorStatement: return vl::Ptr(new vl::workflow::WfCoOperatorStatement); case WorkflowClasses::CoPauseStatement: return vl::Ptr(new vl::workflow::WfCoPauseStatement); case WorkflowClasses::CoProviderStatement: return vl::Ptr(new vl::workflow::WfCoProviderStatement); case WorkflowClasses::ConstructorArgument: return vl::Ptr(new vl::workflow::WfConstructorArgument); case WorkflowClasses::ConstructorDeclaration: return vl::Ptr(new vl::workflow::WfConstructorDeclaration); case WorkflowClasses::ConstructorExpression: return vl::Ptr(new vl::workflow::WfConstructorExpression); case WorkflowClasses::ContinueStatement: return vl::Ptr(new vl::workflow::WfContinueStatement); case WorkflowClasses::DeleteStatement: return vl::Ptr(new vl::workflow::WfDeleteStatement); case WorkflowClasses::DestructorDeclaration: return vl::Ptr(new vl::workflow::WfDestructorDeclaration); case WorkflowClasses::DetachEventExpression: return vl::Ptr(new vl::workflow::WfDetachEventExpression); case WorkflowClasses::EnumDeclaration: return vl::Ptr(new vl::workflow::WfEnumDeclaration); case WorkflowClasses::EnumItem: return vl::Ptr(new vl::workflow::WfEnumItem); case WorkflowClasses::EnumItemIntersection: return vl::Ptr(new vl::workflow::WfEnumItemIntersection); case WorkflowClasses::EnumerableType: return vl::Ptr(new vl::workflow::WfEnumerableType); case WorkflowClasses::EventDeclaration: return vl::Ptr(new vl::workflow::WfEventDeclaration); case WorkflowClasses::ExpectedTypeCastExpression: return vl::Ptr(new vl::workflow::WfExpectedTypeCastExpression); case WorkflowClasses::ExpressionStatement: return vl::Ptr(new vl::workflow::WfExpressionStatement); case WorkflowClasses::FloatingExpression: return vl::Ptr(new vl::workflow::WfFloatingExpression); case WorkflowClasses::ForEachStatement: return vl::Ptr(new vl::workflow::WfForEachStatement); case WorkflowClasses::FormatExpression: return vl::Ptr(new vl::workflow::WfFormatExpression); case WorkflowClasses::FunctionArgument: return vl::Ptr(new vl::workflow::WfFunctionArgument); case WorkflowClasses::FunctionDeclaration: return vl::Ptr(new vl::workflow::WfFunctionDeclaration); case WorkflowClasses::FunctionExpression: return vl::Ptr(new vl::workflow::WfFunctionExpression); case WorkflowClasses::FunctionType: return vl::Ptr(new vl::workflow::WfFunctionType); case WorkflowClasses::GotoStatement: return vl::Ptr(new vl::workflow::WfGotoStatement); case WorkflowClasses::IfExpression: return vl::Ptr(new vl::workflow::WfIfExpression); case WorkflowClasses::IfStatement: return vl::Ptr(new vl::workflow::WfIfStatement); case WorkflowClasses::InferExpression: return vl::Ptr(new vl::workflow::WfInferExpression); case WorkflowClasses::IntegerExpression: return vl::Ptr(new vl::workflow::WfIntegerExpression); case WorkflowClasses::LetExpression: return vl::Ptr(new vl::workflow::WfLetExpression); case WorkflowClasses::LetVariable: return vl::Ptr(new vl::workflow::WfLetVariable); case WorkflowClasses::LiteralExpression: return vl::Ptr(new vl::workflow::WfLiteralExpression); case WorkflowClasses::MapType: return vl::Ptr(new vl::workflow::WfMapType); case WorkflowClasses::MemberExpression: return vl::Ptr(new vl::workflow::WfMemberExpression); case WorkflowClasses::MixinCastExpression: return vl::Ptr(new vl::workflow::WfMixinCastExpression); case WorkflowClasses::Module: return vl::Ptr(new vl::workflow::WfModule); case WorkflowClasses::ModuleUsingItem: return vl::Ptr(new vl::workflow::WfModuleUsingItem); case WorkflowClasses::ModuleUsingNameFragment: return vl::Ptr(new vl::workflow::WfModuleUsingNameFragment); case WorkflowClasses::ModuleUsingPath: return vl::Ptr(new vl::workflow::WfModuleUsingPath); case WorkflowClasses::ModuleUsingWildCardFragment: return vl::Ptr(new vl::workflow::WfModuleUsingWildCardFragment); case WorkflowClasses::NamespaceDeclaration: return vl::Ptr(new vl::workflow::WfNamespaceDeclaration); case WorkflowClasses::NewClassExpression: return vl::Ptr(new vl::workflow::WfNewClassExpression); case WorkflowClasses::NewCoroutineExpression: return vl::Ptr(new vl::workflow::WfNewCoroutineExpression); case WorkflowClasses::NewInterfaceExpression: return vl::Ptr(new vl::workflow::WfNewInterfaceExpression); case WorkflowClasses::NullableType: return vl::Ptr(new vl::workflow::WfNullableType); case WorkflowClasses::ObservableListType: return vl::Ptr(new vl::workflow::WfObservableListType); case WorkflowClasses::ObserveExpression: return vl::Ptr(new vl::workflow::WfObserveExpression); case WorkflowClasses::OrderedLambdaExpression: return vl::Ptr(new vl::workflow::WfOrderedLambdaExpression); case WorkflowClasses::OrderedNameExpression: return vl::Ptr(new vl::workflow::WfOrderedNameExpression); case WorkflowClasses::PredefinedType: return vl::Ptr(new vl::workflow::WfPredefinedType); case WorkflowClasses::PropertyDeclaration: return vl::Ptr(new vl::workflow::WfPropertyDeclaration); case WorkflowClasses::RaiseExceptionStatement: return vl::Ptr(new vl::workflow::WfRaiseExceptionStatement); case WorkflowClasses::RangeExpression: return vl::Ptr(new vl::workflow::WfRangeExpression); case WorkflowClasses::RawPointerType: return vl::Ptr(new vl::workflow::WfRawPointerType); case WorkflowClasses::ReferenceExpression: return vl::Ptr(new vl::workflow::WfReferenceExpression); case WorkflowClasses::ReferenceType: return vl::Ptr(new vl::workflow::WfReferenceType); case WorkflowClasses::ReturnStatement: return vl::Ptr(new vl::workflow::WfReturnStatement); case WorkflowClasses::SetTestingExpression: return vl::Ptr(new vl::workflow::WfSetTestingExpression); case WorkflowClasses::SharedPointerType: return vl::Ptr(new vl::workflow::WfSharedPointerType); case WorkflowClasses::StateDeclaration: return vl::Ptr(new vl::workflow::WfStateDeclaration); case WorkflowClasses::StateInput: return vl::Ptr(new vl::workflow::WfStateInput); case WorkflowClasses::StateInvokeStatement: return vl::Ptr(new vl::workflow::WfStateInvokeStatement); case WorkflowClasses::StateMachineDeclaration: return vl::Ptr(new vl::workflow::WfStateMachineDeclaration); case WorkflowClasses::StateSwitchArgument: return vl::Ptr(new vl::workflow::WfStateSwitchArgument); case WorkflowClasses::StateSwitchCase: return vl::Ptr(new vl::workflow::WfStateSwitchCase); case WorkflowClasses::StateSwitchStatement: return vl::Ptr(new vl::workflow::WfStateSwitchStatement); case WorkflowClasses::StaticInitDeclaration: return vl::Ptr(new vl::workflow::WfStaticInitDeclaration); case WorkflowClasses::StringExpression: return vl::Ptr(new vl::workflow::WfStringExpression); case WorkflowClasses::StructDeclaration: return vl::Ptr(new vl::workflow::WfStructDeclaration); case WorkflowClasses::StructMember: return vl::Ptr(new vl::workflow::WfStructMember); case WorkflowClasses::SwitchCase: return vl::Ptr(new vl::workflow::WfSwitchCase); case WorkflowClasses::SwitchStatement: return vl::Ptr(new vl::workflow::WfSwitchStatement); case WorkflowClasses::ThisExpression: return vl::Ptr(new vl::workflow::WfThisExpression); case WorkflowClasses::TopQualifiedExpression: return vl::Ptr(new vl::workflow::WfTopQualifiedExpression); case WorkflowClasses::TopQualifiedType: return vl::Ptr(new vl::workflow::WfTopQualifiedType); case WorkflowClasses::TryStatement: return vl::Ptr(new vl::workflow::WfTryStatement); case WorkflowClasses::TypeCastingExpression: return vl::Ptr(new vl::workflow::WfTypeCastingExpression); case WorkflowClasses::TypeOfExpressionExpression: return vl::Ptr(new vl::workflow::WfTypeOfExpressionExpression); case WorkflowClasses::TypeOfTypeExpression: return vl::Ptr(new vl::workflow::WfTypeOfTypeExpression); case WorkflowClasses::TypeTestingExpression: return vl::Ptr(new vl::workflow::WfTypeTestingExpression); case WorkflowClasses::UnaryExpression: return vl::Ptr(new vl::workflow::WfUnaryExpression); case WorkflowClasses::VariableDeclaration: return vl::Ptr(new vl::workflow::WfVariableDeclaration); case WorkflowClasses::VariableStatement: return vl::Ptr(new vl::workflow::WfVariableStatement); case WorkflowClasses::WhileStatement: return vl::Ptr(new vl::workflow::WfWhileStatement); default: return vl::glr::AssemblyThrowCannotCreateAbstractType(type, cppTypeName); } } void WorkflowAstInsReceiver::SetField(vl::glr::ParsingAstBase* object, vl::vint32_t field, vl::Ptr value) { auto cppFieldName = WorkflowCppFieldName((WorkflowFields)field); switch((WorkflowFields)field) { case WorkflowFields::AttachEventExpression_event: return vl::glr::AssemblerSetObjectField(&vl::workflow::WfAttachEventExpression::event, object, field, value, cppFieldName); case WorkflowFields::AttachEventExpression_function: return vl::glr::AssemblerSetObjectField(&vl::workflow::WfAttachEventExpression::function, object, field, value, cppFieldName); case WorkflowFields::Attribute_value: return vl::glr::AssemblerSetObjectField(&vl::workflow::WfAttribute::value, object, field, value, cppFieldName); case WorkflowFields::AutoPropertyDeclaration_expression: return vl::glr::AssemblerSetObjectField(&vl::workflow::WfAutoPropertyDeclaration::expression, object, field, value, cppFieldName); case WorkflowFields::AutoPropertyDeclaration_type: return vl::glr::AssemblerSetObjectField(&vl::workflow::WfAutoPropertyDeclaration::type, object, field, value, cppFieldName); case WorkflowFields::BaseConstructorCall_arguments: return vl::glr::AssemblerSetObjectField(&vl::workflow::WfBaseConstructorCall::arguments, object, field, value, cppFieldName); case WorkflowFields::BaseConstructorCall_type: return vl::glr::AssemblerSetObjectField(&vl::workflow::WfBaseConstructorCall::type, object, field, value, cppFieldName); case WorkflowFields::BinaryExpression_first: return vl::glr::AssemblerSetObjectField(&vl::workflow::WfBinaryExpression::first, object, field, value, cppFieldName); case WorkflowFields::BinaryExpression_second: return vl::glr::AssemblerSetObjectField(&vl::workflow::WfBinaryExpression::second, object, field, value, cppFieldName); case WorkflowFields::BindExpression_expression: return vl::glr::AssemblerSetObjectField(&vl::workflow::WfBindExpression::expression, object, field, value, cppFieldName); case WorkflowFields::BlockStatement_statements: return vl::glr::AssemblerSetObjectField(&vl::workflow::WfBlockStatement::statements, object, field, value, cppFieldName); case WorkflowFields::CallExpression_arguments: return vl::glr::AssemblerSetObjectField(&vl::workflow::WfCallExpression::arguments, object, field, value, cppFieldName); case WorkflowFields::CallExpression_function: return vl::glr::AssemblerSetObjectField(&vl::workflow::WfCallExpression::function, object, field, value, cppFieldName); case WorkflowFields::CastResultInterfaceDeclaration_baseType: return vl::glr::AssemblerSetObjectField(&vl::workflow::WfCastResultInterfaceDeclaration::baseType, object, field, value, cppFieldName); case WorkflowFields::CastResultInterfaceDeclaration_elementType: return vl::glr::AssemblerSetObjectField(&vl::workflow::WfCastResultInterfaceDeclaration::elementType, object, field, value, cppFieldName); case WorkflowFields::ChildExpression_parent: return vl::glr::AssemblerSetObjectField(&vl::workflow::WfChildExpression::parent, object, field, value, cppFieldName); case WorkflowFields::ChildType_parent: return vl::glr::AssemblerSetObjectField(&vl::workflow::WfChildType::parent, object, field, value, cppFieldName); case WorkflowFields::ClassDeclaration_baseTypes: return vl::glr::AssemblerSetObjectField(&vl::workflow::WfClassDeclaration::baseTypes, object, field, value, cppFieldName); case WorkflowFields::ClassDeclaration_declarations: return vl::glr::AssemblerSetObjectField(&vl::workflow::WfClassDeclaration::declarations, object, field, value, cppFieldName); case WorkflowFields::CoOperatorStatement_arguments: return vl::glr::AssemblerSetObjectField(&vl::workflow::WfCoOperatorStatement::arguments, object, field, value, cppFieldName); case WorkflowFields::CoPauseStatement_statement: return vl::glr::AssemblerSetObjectField(&vl::workflow::WfCoPauseStatement::statement, object, field, value, cppFieldName); case WorkflowFields::CoProviderStatement_statement: return vl::glr::AssemblerSetObjectField(&vl::workflow::WfCoProviderStatement::statement, object, field, value, cppFieldName); case WorkflowFields::ConstructorArgument_key: return vl::glr::AssemblerSetObjectField(&vl::workflow::WfConstructorArgument::key, object, field, value, cppFieldName); case WorkflowFields::ConstructorArgument_value: return vl::glr::AssemblerSetObjectField(&vl::workflow::WfConstructorArgument::value, object, field, value, cppFieldName); case WorkflowFields::ConstructorDeclaration_arguments: return vl::glr::AssemblerSetObjectField(&vl::workflow::WfConstructorDeclaration::arguments, object, field, value, cppFieldName); case WorkflowFields::ConstructorDeclaration_baseConstructorCalls: return vl::glr::AssemblerSetObjectField(&vl::workflow::WfConstructorDeclaration::baseConstructorCalls, object, field, value, cppFieldName); case WorkflowFields::ConstructorDeclaration_statement: return vl::glr::AssemblerSetObjectField(&vl::workflow::WfConstructorDeclaration::statement, object, field, value, cppFieldName); case WorkflowFields::ConstructorExpression_arguments: return vl::glr::AssemblerSetObjectField(&vl::workflow::WfConstructorExpression::arguments, object, field, value, cppFieldName); case WorkflowFields::Declaration_attributes: return vl::glr::AssemblerSetObjectField(&vl::workflow::WfDeclaration::attributes, object, field, value, cppFieldName); case WorkflowFields::DeleteStatement_expression: return vl::glr::AssemblerSetObjectField(&vl::workflow::WfDeleteStatement::expression, object, field, value, cppFieldName); case WorkflowFields::DestructorDeclaration_statement: return vl::glr::AssemblerSetObjectField(&vl::workflow::WfDestructorDeclaration::statement, object, field, value, cppFieldName); case WorkflowFields::DetachEventExpression_event: return vl::glr::AssemblerSetObjectField(&vl::workflow::WfDetachEventExpression::event, object, field, value, cppFieldName); case WorkflowFields::DetachEventExpression_handler: return vl::glr::AssemblerSetObjectField(&vl::workflow::WfDetachEventExpression::handler, object, field, value, cppFieldName); case WorkflowFields::EnumDeclaration_items: return vl::glr::AssemblerSetObjectField(&vl::workflow::WfEnumDeclaration::items, object, field, value, cppFieldName); case WorkflowFields::EnumItem_attributes: return vl::glr::AssemblerSetObjectField(&vl::workflow::WfEnumItem::attributes, object, field, value, cppFieldName); case WorkflowFields::EnumItem_intersections: return vl::glr::AssemblerSetObjectField(&vl::workflow::WfEnumItem::intersections, object, field, value, cppFieldName); case WorkflowFields::EnumerableType_element: return vl::glr::AssemblerSetObjectField(&vl::workflow::WfEnumerableType::element, object, field, value, cppFieldName); case WorkflowFields::EventDeclaration_arguments: return vl::glr::AssemblerSetObjectField(&vl::workflow::WfEventDeclaration::arguments, object, field, value, cppFieldName); case WorkflowFields::ExpectedTypeCastExpression_expression: return vl::glr::AssemblerSetObjectField(&vl::workflow::WfExpectedTypeCastExpression::expression, object, field, value, cppFieldName); case WorkflowFields::ExpressionStatement_expression: return vl::glr::AssemblerSetObjectField(&vl::workflow::WfExpressionStatement::expression, object, field, value, cppFieldName); case WorkflowFields::ForEachStatement_collection: return vl::glr::AssemblerSetObjectField(&vl::workflow::WfForEachStatement::collection, object, field, value, cppFieldName); case WorkflowFields::ForEachStatement_statement: return vl::glr::AssemblerSetObjectField(&vl::workflow::WfForEachStatement::statement, object, field, value, cppFieldName); case WorkflowFields::FunctionArgument_attributes: return vl::glr::AssemblerSetObjectField(&vl::workflow::WfFunctionArgument::attributes, object, field, value, cppFieldName); case WorkflowFields::FunctionArgument_type: return vl::glr::AssemblerSetObjectField(&vl::workflow::WfFunctionArgument::type, object, field, value, cppFieldName); case WorkflowFields::FunctionDeclaration_arguments: return vl::glr::AssemblerSetObjectField(&vl::workflow::WfFunctionDeclaration::arguments, object, field, value, cppFieldName); case WorkflowFields::FunctionDeclaration_returnType: return vl::glr::AssemblerSetObjectField(&vl::workflow::WfFunctionDeclaration::returnType, object, field, value, cppFieldName); case WorkflowFields::FunctionDeclaration_statement: return vl::glr::AssemblerSetObjectField(&vl::workflow::WfFunctionDeclaration::statement, object, field, value, cppFieldName); case WorkflowFields::FunctionExpression_function: return vl::glr::AssemblerSetObjectField(&vl::workflow::WfFunctionExpression::function, object, field, value, cppFieldName); case WorkflowFields::FunctionType_arguments: return vl::glr::AssemblerSetObjectField(&vl::workflow::WfFunctionType::arguments, object, field, value, cppFieldName); case WorkflowFields::FunctionType_result: return vl::glr::AssemblerSetObjectField(&vl::workflow::WfFunctionType::result, object, field, value, cppFieldName); case WorkflowFields::IfExpression_condition: return vl::glr::AssemblerSetObjectField(&vl::workflow::WfIfExpression::condition, object, field, value, cppFieldName); case WorkflowFields::IfExpression_falseBranch: return vl::glr::AssemblerSetObjectField(&vl::workflow::WfIfExpression::falseBranch, object, field, value, cppFieldName); case WorkflowFields::IfExpression_trueBranch: return vl::glr::AssemblerSetObjectField(&vl::workflow::WfIfExpression::trueBranch, object, field, value, cppFieldName); case WorkflowFields::IfStatement_expression: return vl::glr::AssemblerSetObjectField(&vl::workflow::WfIfStatement::expression, object, field, value, cppFieldName); case WorkflowFields::IfStatement_falseBranch: return vl::glr::AssemblerSetObjectField(&vl::workflow::WfIfStatement::falseBranch, object, field, value, cppFieldName); case WorkflowFields::IfStatement_trueBranch: return vl::glr::AssemblerSetObjectField(&vl::workflow::WfIfStatement::trueBranch, object, field, value, cppFieldName); case WorkflowFields::IfStatement_type: return vl::glr::AssemblerSetObjectField(&vl::workflow::WfIfStatement::type, object, field, value, cppFieldName); case WorkflowFields::InferExpression_expression: return vl::glr::AssemblerSetObjectField(&vl::workflow::WfInferExpression::expression, object, field, value, cppFieldName); case WorkflowFields::InferExpression_type: return vl::glr::AssemblerSetObjectField(&vl::workflow::WfInferExpression::type, object, field, value, cppFieldName); case WorkflowFields::LetExpression_expression: return vl::glr::AssemblerSetObjectField(&vl::workflow::WfLetExpression::expression, object, field, value, cppFieldName); case WorkflowFields::LetExpression_variables: return vl::glr::AssemblerSetObjectField(&vl::workflow::WfLetExpression::variables, object, field, value, cppFieldName); case WorkflowFields::LetVariable_value: return vl::glr::AssemblerSetObjectField(&vl::workflow::WfLetVariable::value, object, field, value, cppFieldName); case WorkflowFields::MapType_key: return vl::glr::AssemblerSetObjectField(&vl::workflow::WfMapType::key, object, field, value, cppFieldName); case WorkflowFields::MapType_value: return vl::glr::AssemblerSetObjectField(&vl::workflow::WfMapType::value, object, field, value, cppFieldName); case WorkflowFields::MemberExpression_parent: return vl::glr::AssemblerSetObjectField(&vl::workflow::WfMemberExpression::parent, object, field, value, cppFieldName); case WorkflowFields::MixinCastExpression_expression: return vl::glr::AssemblerSetObjectField(&vl::workflow::WfMixinCastExpression::expression, object, field, value, cppFieldName); case WorkflowFields::MixinCastExpression_type: return vl::glr::AssemblerSetObjectField(&vl::workflow::WfMixinCastExpression::type, object, field, value, cppFieldName); case WorkflowFields::Module_declarations: return vl::glr::AssemblerSetObjectField(&vl::workflow::WfModule::declarations, object, field, value, cppFieldName); case WorkflowFields::Module_paths: return vl::glr::AssemblerSetObjectField(&vl::workflow::WfModule::paths, object, field, value, cppFieldName); case WorkflowFields::ModuleUsingItem_fragments: return vl::glr::AssemblerSetObjectField(&vl::workflow::WfModuleUsingItem::fragments, object, field, value, cppFieldName); case WorkflowFields::ModuleUsingPath_items: return vl::glr::AssemblerSetObjectField(&vl::workflow::WfModuleUsingPath::items, object, field, value, cppFieldName); case WorkflowFields::NamespaceDeclaration_declarations: return vl::glr::AssemblerSetObjectField(&vl::workflow::WfNamespaceDeclaration::declarations, object, field, value, cppFieldName); case WorkflowFields::NewClassExpression_arguments: return vl::glr::AssemblerSetObjectField(&vl::workflow::WfNewClassExpression::arguments, object, field, value, cppFieldName); case WorkflowFields::NewClassExpression_type: return vl::glr::AssemblerSetObjectField(&vl::workflow::WfNewClassExpression::type, object, field, value, cppFieldName); case WorkflowFields::NewCoroutineExpression_statement: return vl::glr::AssemblerSetObjectField(&vl::workflow::WfNewCoroutineExpression::statement, object, field, value, cppFieldName); case WorkflowFields::NewInterfaceExpression_declarations: return vl::glr::AssemblerSetObjectField(&vl::workflow::WfNewInterfaceExpression::declarations, object, field, value, cppFieldName); case WorkflowFields::NewInterfaceExpression_type: return vl::glr::AssemblerSetObjectField(&vl::workflow::WfNewInterfaceExpression::type, object, field, value, cppFieldName); case WorkflowFields::NullableType_element: return vl::glr::AssemblerSetObjectField(&vl::workflow::WfNullableType::element, object, field, value, cppFieldName); case WorkflowFields::ObservableListType_element: return vl::glr::AssemblerSetObjectField(&vl::workflow::WfObservableListType::element, object, field, value, cppFieldName); case WorkflowFields::ObserveExpression_events: return vl::glr::AssemblerSetObjectField(&vl::workflow::WfObserveExpression::events, object, field, value, cppFieldName); case WorkflowFields::ObserveExpression_expression: return vl::glr::AssemblerSetObjectField(&vl::workflow::WfObserveExpression::expression, object, field, value, cppFieldName); case WorkflowFields::ObserveExpression_parent: return vl::glr::AssemblerSetObjectField(&vl::workflow::WfObserveExpression::parent, object, field, value, cppFieldName); case WorkflowFields::OrderedLambdaExpression_body: return vl::glr::AssemblerSetObjectField(&vl::workflow::WfOrderedLambdaExpression::body, object, field, value, cppFieldName); case WorkflowFields::PropertyDeclaration_type: return vl::glr::AssemblerSetObjectField(&vl::workflow::WfPropertyDeclaration::type, object, field, value, cppFieldName); case WorkflowFields::RaiseExceptionStatement_expression: return vl::glr::AssemblerSetObjectField(&vl::workflow::WfRaiseExceptionStatement::expression, object, field, value, cppFieldName); case WorkflowFields::RangeExpression_begin: return vl::glr::AssemblerSetObjectField(&vl::workflow::WfRangeExpression::begin, object, field, value, cppFieldName); case WorkflowFields::RangeExpression_end: return vl::glr::AssemblerSetObjectField(&vl::workflow::WfRangeExpression::end, object, field, value, cppFieldName); case WorkflowFields::RawPointerType_element: return vl::glr::AssemblerSetObjectField(&vl::workflow::WfRawPointerType::element, object, field, value, cppFieldName); case WorkflowFields::ReturnStatement_expression: return vl::glr::AssemblerSetObjectField(&vl::workflow::WfReturnStatement::expression, object, field, value, cppFieldName); case WorkflowFields::SetTestingExpression_collection: return vl::glr::AssemblerSetObjectField(&vl::workflow::WfSetTestingExpression::collection, object, field, value, cppFieldName); case WorkflowFields::SetTestingExpression_element: return vl::glr::AssemblerSetObjectField(&vl::workflow::WfSetTestingExpression::element, object, field, value, cppFieldName); case WorkflowFields::SharedPointerType_element: return vl::glr::AssemblerSetObjectField(&vl::workflow::WfSharedPointerType::element, object, field, value, cppFieldName); case WorkflowFields::StateDeclaration_arguments: return vl::glr::AssemblerSetObjectField(&vl::workflow::WfStateDeclaration::arguments, object, field, value, cppFieldName); case WorkflowFields::StateDeclaration_statement: return vl::glr::AssemblerSetObjectField(&vl::workflow::WfStateDeclaration::statement, object, field, value, cppFieldName); case WorkflowFields::StateInput_arguments: return vl::glr::AssemblerSetObjectField(&vl::workflow::WfStateInput::arguments, object, field, value, cppFieldName); case WorkflowFields::StateInvokeStatement_arguments: return vl::glr::AssemblerSetObjectField(&vl::workflow::WfStateInvokeStatement::arguments, object, field, value, cppFieldName); case WorkflowFields::StateMachineDeclaration_inputs: return vl::glr::AssemblerSetObjectField(&vl::workflow::WfStateMachineDeclaration::inputs, object, field, value, cppFieldName); case WorkflowFields::StateMachineDeclaration_states: return vl::glr::AssemblerSetObjectField(&vl::workflow::WfStateMachineDeclaration::states, object, field, value, cppFieldName); case WorkflowFields::StateSwitchCase_arguments: return vl::glr::AssemblerSetObjectField(&vl::workflow::WfStateSwitchCase::arguments, object, field, value, cppFieldName); case WorkflowFields::StateSwitchCase_statement: return vl::glr::AssemblerSetObjectField(&vl::workflow::WfStateSwitchCase::statement, object, field, value, cppFieldName); case WorkflowFields::StateSwitchStatement_caseBranches: return vl::glr::AssemblerSetObjectField(&vl::workflow::WfStateSwitchStatement::caseBranches, object, field, value, cppFieldName); case WorkflowFields::StaticInitDeclaration_statement: return vl::glr::AssemblerSetObjectField(&vl::workflow::WfStaticInitDeclaration::statement, object, field, value, cppFieldName); case WorkflowFields::StructDeclaration_members: return vl::glr::AssemblerSetObjectField(&vl::workflow::WfStructDeclaration::members, object, field, value, cppFieldName); case WorkflowFields::StructMember_attributes: return vl::glr::AssemblerSetObjectField(&vl::workflow::WfStructMember::attributes, object, field, value, cppFieldName); case WorkflowFields::StructMember_type: return vl::glr::AssemblerSetObjectField(&vl::workflow::WfStructMember::type, object, field, value, cppFieldName); case WorkflowFields::SwitchCase_expression: return vl::glr::AssemblerSetObjectField(&vl::workflow::WfSwitchCase::expression, object, field, value, cppFieldName); case WorkflowFields::SwitchCase_statement: return vl::glr::AssemblerSetObjectField(&vl::workflow::WfSwitchCase::statement, object, field, value, cppFieldName); case WorkflowFields::SwitchStatement_caseBranches: return vl::glr::AssemblerSetObjectField(&vl::workflow::WfSwitchStatement::caseBranches, object, field, value, cppFieldName); case WorkflowFields::SwitchStatement_defaultBranch: return vl::glr::AssemblerSetObjectField(&vl::workflow::WfSwitchStatement::defaultBranch, object, field, value, cppFieldName); case WorkflowFields::SwitchStatement_expression: return vl::glr::AssemblerSetObjectField(&vl::workflow::WfSwitchStatement::expression, object, field, value, cppFieldName); case WorkflowFields::TryStatement_catchStatement: return vl::glr::AssemblerSetObjectField(&vl::workflow::WfTryStatement::catchStatement, object, field, value, cppFieldName); case WorkflowFields::TryStatement_finallyStatement: return vl::glr::AssemblerSetObjectField(&vl::workflow::WfTryStatement::finallyStatement, object, field, value, cppFieldName); case WorkflowFields::TryStatement_protectedStatement: return vl::glr::AssemblerSetObjectField(&vl::workflow::WfTryStatement::protectedStatement, object, field, value, cppFieldName); case WorkflowFields::TypeCastingExpression_expression: return vl::glr::AssemblerSetObjectField(&vl::workflow::WfTypeCastingExpression::expression, object, field, value, cppFieldName); case WorkflowFields::TypeCastingExpression_type: return vl::glr::AssemblerSetObjectField(&vl::workflow::WfTypeCastingExpression::type, object, field, value, cppFieldName); case WorkflowFields::TypeOfExpressionExpression_expression: return vl::glr::AssemblerSetObjectField(&vl::workflow::WfTypeOfExpressionExpression::expression, object, field, value, cppFieldName); case WorkflowFields::TypeOfTypeExpression_type: return vl::glr::AssemblerSetObjectField(&vl::workflow::WfTypeOfTypeExpression::type, object, field, value, cppFieldName); case WorkflowFields::TypeTestingExpression_expression: return vl::glr::AssemblerSetObjectField(&vl::workflow::WfTypeTestingExpression::expression, object, field, value, cppFieldName); case WorkflowFields::TypeTestingExpression_type: return vl::glr::AssemblerSetObjectField(&vl::workflow::WfTypeTestingExpression::type, object, field, value, cppFieldName); case WorkflowFields::UnaryExpression_operand: return vl::glr::AssemblerSetObjectField(&vl::workflow::WfUnaryExpression::operand, object, field, value, cppFieldName); case WorkflowFields::VariableDeclaration_expression: return vl::glr::AssemblerSetObjectField(&vl::workflow::WfVariableDeclaration::expression, object, field, value, cppFieldName); case WorkflowFields::VariableDeclaration_type: return vl::glr::AssemblerSetObjectField(&vl::workflow::WfVariableDeclaration::type, object, field, value, cppFieldName); case WorkflowFields::VariableStatement_variable: return vl::glr::AssemblerSetObjectField(&vl::workflow::WfVariableStatement::variable, object, field, value, cppFieldName); case WorkflowFields::VirtualCfeDeclaration_expandedDeclarations: return vl::glr::AssemblerSetObjectField(&vl::workflow::WfVirtualCfeDeclaration::expandedDeclarations, object, field, value, cppFieldName); case WorkflowFields::VirtualCfeExpression_expandedExpression: return vl::glr::AssemblerSetObjectField(&vl::workflow::WfVirtualCfeExpression::expandedExpression, object, field, value, cppFieldName); case WorkflowFields::VirtualCseDeclaration_expandedDeclarations: return vl::glr::AssemblerSetObjectField(&vl::workflow::WfVirtualCseDeclaration::expandedDeclarations, object, field, value, cppFieldName); case WorkflowFields::VirtualCseExpression_expandedExpression: return vl::glr::AssemblerSetObjectField(&vl::workflow::WfVirtualCseExpression::expandedExpression, object, field, value, cppFieldName); case WorkflowFields::VirtualCseStatement_expandedStatement: return vl::glr::AssemblerSetObjectField(&vl::workflow::WfVirtualCseStatement::expandedStatement, object, field, value, cppFieldName); case WorkflowFields::WhileStatement_condition: return vl::glr::AssemblerSetObjectField(&vl::workflow::WfWhileStatement::condition, object, field, value, cppFieldName); case WorkflowFields::WhileStatement_statement: return vl::glr::AssemblerSetObjectField(&vl::workflow::WfWhileStatement::statement, object, field, value, cppFieldName); default: return vl::glr::AssemblyThrowFieldNotObject(field, cppFieldName); } } void WorkflowAstInsReceiver::SetField(vl::glr::ParsingAstBase* object, vl::vint32_t field, const vl::regex::RegexToken& token, vl::vint32_t tokenIndex) { auto cppFieldName = WorkflowCppFieldName((WorkflowFields)field); switch((WorkflowFields)field) { case WorkflowFields::Attribute_category: return vl::glr::AssemblerSetTokenField(&vl::workflow::WfAttribute::category, object, field, token, tokenIndex, cppFieldName); case WorkflowFields::Attribute_name: return vl::glr::AssemblerSetTokenField(&vl::workflow::WfAttribute::name, object, field, token, tokenIndex, cppFieldName); case WorkflowFields::BlockStatement_endLabel: return vl::glr::AssemblerSetTokenField(&vl::workflow::WfBlockStatement::endLabel, object, field, token, tokenIndex, cppFieldName); case WorkflowFields::ChildExpression_name: return vl::glr::AssemblerSetTokenField(&vl::workflow::WfChildExpression::name, object, field, token, tokenIndex, cppFieldName); case WorkflowFields::ChildType_name: return vl::glr::AssemblerSetTokenField(&vl::workflow::WfChildType::name, object, field, token, tokenIndex, cppFieldName); case WorkflowFields::CoOperatorExpression_name: return vl::glr::AssemblerSetTokenField(&vl::workflow::WfCoOperatorExpression::name, object, field, token, tokenIndex, cppFieldName); case WorkflowFields::CoOperatorStatement_opName: return vl::glr::AssemblerSetTokenField(&vl::workflow::WfCoOperatorStatement::opName, object, field, token, tokenIndex, cppFieldName); case WorkflowFields::CoOperatorStatement_varName: return vl::glr::AssemblerSetTokenField(&vl::workflow::WfCoOperatorStatement::varName, object, field, token, tokenIndex, cppFieldName); case WorkflowFields::CoProviderStatement_name: return vl::glr::AssemblerSetTokenField(&vl::workflow::WfCoProviderStatement::name, object, field, token, tokenIndex, cppFieldName); case WorkflowFields::Declaration_name: return vl::glr::AssemblerSetTokenField(&vl::workflow::WfDeclaration::name, object, field, token, tokenIndex, cppFieldName); case WorkflowFields::EnumItem_name: return vl::glr::AssemblerSetTokenField(&vl::workflow::WfEnumItem::name, object, field, token, tokenIndex, cppFieldName); case WorkflowFields::EnumItem_number: return vl::glr::AssemblerSetTokenField(&vl::workflow::WfEnumItem::number, object, field, token, tokenIndex, cppFieldName); case WorkflowFields::EnumItemIntersection_name: return vl::glr::AssemblerSetTokenField(&vl::workflow::WfEnumItemIntersection::name, object, field, token, tokenIndex, cppFieldName); case WorkflowFields::FloatingExpression_value: return vl::glr::AssemblerSetTokenField(&vl::workflow::WfFloatingExpression::value, object, field, token, tokenIndex, cppFieldName); case WorkflowFields::ForEachStatement_name: return vl::glr::AssemblerSetTokenField(&vl::workflow::WfForEachStatement::name, object, field, token, tokenIndex, cppFieldName); case WorkflowFields::FormatExpression_value: return vl::glr::AssemblerSetTokenField(&vl::workflow::WfFormatExpression::value, object, field, token, tokenIndex, cppFieldName); case WorkflowFields::FunctionArgument_name: return vl::glr::AssemblerSetTokenField(&vl::workflow::WfFunctionArgument::name, object, field, token, tokenIndex, cppFieldName); case WorkflowFields::GotoStatement_label: return vl::glr::AssemblerSetTokenField(&vl::workflow::WfGotoStatement::label, object, field, token, tokenIndex, cppFieldName); case WorkflowFields::IfStatement_name: return vl::glr::AssemblerSetTokenField(&vl::workflow::WfIfStatement::name, object, field, token, tokenIndex, cppFieldName); case WorkflowFields::IntegerExpression_value: return vl::glr::AssemblerSetTokenField(&vl::workflow::WfIntegerExpression::value, object, field, token, tokenIndex, cppFieldName); case WorkflowFields::LetVariable_name: return vl::glr::AssemblerSetTokenField(&vl::workflow::WfLetVariable::name, object, field, token, tokenIndex, cppFieldName); case WorkflowFields::MemberExpression_name: return vl::glr::AssemblerSetTokenField(&vl::workflow::WfMemberExpression::name, object, field, token, tokenIndex, cppFieldName); case WorkflowFields::Module_name: return vl::glr::AssemblerSetTokenField(&vl::workflow::WfModule::name, object, field, token, tokenIndex, cppFieldName); case WorkflowFields::ModuleUsingNameFragment_name: return vl::glr::AssemblerSetTokenField(&vl::workflow::WfModuleUsingNameFragment::name, object, field, token, tokenIndex, cppFieldName); case WorkflowFields::NewCoroutineExpression_name: return vl::glr::AssemblerSetTokenField(&vl::workflow::WfNewCoroutineExpression::name, object, field, token, tokenIndex, cppFieldName); case WorkflowFields::ObserveExpression_name: return vl::glr::AssemblerSetTokenField(&vl::workflow::WfObserveExpression::name, object, field, token, tokenIndex, cppFieldName); case WorkflowFields::OrderedNameExpression_name: return vl::glr::AssemblerSetTokenField(&vl::workflow::WfOrderedNameExpression::name, object, field, token, tokenIndex, cppFieldName); case WorkflowFields::PropertyDeclaration_getter: return vl::glr::AssemblerSetTokenField(&vl::workflow::WfPropertyDeclaration::getter, object, field, token, tokenIndex, cppFieldName); case WorkflowFields::PropertyDeclaration_setter: return vl::glr::AssemblerSetTokenField(&vl::workflow::WfPropertyDeclaration::setter, object, field, token, tokenIndex, cppFieldName); case WorkflowFields::PropertyDeclaration_valueChangedEvent: return vl::glr::AssemblerSetTokenField(&vl::workflow::WfPropertyDeclaration::valueChangedEvent, object, field, token, tokenIndex, cppFieldName); case WorkflowFields::ReferenceExpression_name: return vl::glr::AssemblerSetTokenField(&vl::workflow::WfReferenceExpression::name, object, field, token, tokenIndex, cppFieldName); case WorkflowFields::ReferenceType_name: return vl::glr::AssemblerSetTokenField(&vl::workflow::WfReferenceType::name, object, field, token, tokenIndex, cppFieldName); case WorkflowFields::StateDeclaration_name: return vl::glr::AssemblerSetTokenField(&vl::workflow::WfStateDeclaration::name, object, field, token, tokenIndex, cppFieldName); case WorkflowFields::StateInput_name: return vl::glr::AssemblerSetTokenField(&vl::workflow::WfStateInput::name, object, field, token, tokenIndex, cppFieldName); case WorkflowFields::StateInvokeStatement_name: return vl::glr::AssemblerSetTokenField(&vl::workflow::WfStateInvokeStatement::name, object, field, token, tokenIndex, cppFieldName); case WorkflowFields::StateSwitchArgument_name: return vl::glr::AssemblerSetTokenField(&vl::workflow::WfStateSwitchArgument::name, object, field, token, tokenIndex, cppFieldName); case WorkflowFields::StateSwitchCase_name: return vl::glr::AssemblerSetTokenField(&vl::workflow::WfStateSwitchCase::name, object, field, token, tokenIndex, cppFieldName); case WorkflowFields::StringExpression_value: return vl::glr::AssemblerSetTokenField(&vl::workflow::WfStringExpression::value, object, field, token, tokenIndex, cppFieldName); case WorkflowFields::StructMember_name: return vl::glr::AssemblerSetTokenField(&vl::workflow::WfStructMember::name, object, field, token, tokenIndex, cppFieldName); case WorkflowFields::TopQualifiedExpression_name: return vl::glr::AssemblerSetTokenField(&vl::workflow::WfTopQualifiedExpression::name, object, field, token, tokenIndex, cppFieldName); case WorkflowFields::TopQualifiedType_name: return vl::glr::AssemblerSetTokenField(&vl::workflow::WfTopQualifiedType::name, object, field, token, tokenIndex, cppFieldName); case WorkflowFields::TryStatement_name: return vl::glr::AssemblerSetTokenField(&vl::workflow::WfTryStatement::name, object, field, token, tokenIndex, cppFieldName); default: return vl::glr::AssemblyThrowFieldNotToken(field, cppFieldName); } } void WorkflowAstInsReceiver::SetField(vl::glr::ParsingAstBase* object, vl::vint32_t field, vl::vint32_t enumItem, bool weakAssignment) { auto cppFieldName = WorkflowCppFieldName((WorkflowFields)field); switch((WorkflowFields)field) { case WorkflowFields::AutoPropertyDeclaration_configConst: return vl::glr::AssemblerSetEnumField(&vl::workflow::WfAutoPropertyDeclaration::configConst, object, field, enumItem, weakAssignment, cppFieldName); case WorkflowFields::AutoPropertyDeclaration_configObserve: return vl::glr::AssemblerSetEnumField(&vl::workflow::WfAutoPropertyDeclaration::configObserve, object, field, enumItem, weakAssignment, cppFieldName); case WorkflowFields::AutoPropertyDeclaration_functionKind: return vl::glr::AssemblerSetEnumField(&vl::workflow::WfAutoPropertyDeclaration::functionKind, object, field, enumItem, weakAssignment, cppFieldName); case WorkflowFields::BinaryExpression_op: return vl::glr::AssemblerSetEnumField(&vl::workflow::WfBinaryExpression::op, object, field, enumItem, weakAssignment, cppFieldName); case WorkflowFields::ClassDeclaration_constructorType: return vl::glr::AssemblerSetEnumField(&vl::workflow::WfClassDeclaration::constructorType, object, field, enumItem, weakAssignment, cppFieldName); case WorkflowFields::ClassDeclaration_kind: return vl::glr::AssemblerSetEnumField(&vl::workflow::WfClassDeclaration::kind, object, field, enumItem, weakAssignment, cppFieldName); case WorkflowFields::ConstructorDeclaration_constructorType: return vl::glr::AssemblerSetEnumField(&vl::workflow::WfConstructorDeclaration::constructorType, object, field, enumItem, weakAssignment, cppFieldName); case WorkflowFields::EnumDeclaration_kind: return vl::glr::AssemblerSetEnumField(&vl::workflow::WfEnumDeclaration::kind, object, field, enumItem, weakAssignment, cppFieldName); case WorkflowFields::EnumItem_kind: return vl::glr::AssemblerSetEnumField(&vl::workflow::WfEnumItem::kind, object, field, enumItem, weakAssignment, cppFieldName); case WorkflowFields::ExpectedTypeCastExpression_strategy: return vl::glr::AssemblerSetEnumField(&vl::workflow::WfExpectedTypeCastExpression::strategy, object, field, enumItem, weakAssignment, cppFieldName); case WorkflowFields::ForEachStatement_direction: return vl::glr::AssemblerSetEnumField(&vl::workflow::WfForEachStatement::direction, object, field, enumItem, weakAssignment, cppFieldName); case WorkflowFields::FunctionDeclaration_anonymity: return vl::glr::AssemblerSetEnumField(&vl::workflow::WfFunctionDeclaration::anonymity, object, field, enumItem, weakAssignment, cppFieldName); case WorkflowFields::FunctionDeclaration_functionKind: return vl::glr::AssemblerSetEnumField(&vl::workflow::WfFunctionDeclaration::functionKind, object, field, enumItem, weakAssignment, cppFieldName); case WorkflowFields::LiteralExpression_value: return vl::glr::AssemblerSetEnumField(&vl::workflow::WfLiteralExpression::value, object, field, enumItem, weakAssignment, cppFieldName); case WorkflowFields::MapType_writability: return vl::glr::AssemblerSetEnumField(&vl::workflow::WfMapType::writability, object, field, enumItem, weakAssignment, cppFieldName); case WorkflowFields::Module_moduleType: return vl::glr::AssemblerSetEnumField(&vl::workflow::WfModule::moduleType, object, field, enumItem, weakAssignment, cppFieldName); case WorkflowFields::ObserveExpression_observeType: return vl::glr::AssemblerSetEnumField(&vl::workflow::WfObserveExpression::observeType, object, field, enumItem, weakAssignment, cppFieldName); case WorkflowFields::PredefinedType_name: return vl::glr::AssemblerSetEnumField(&vl::workflow::WfPredefinedType::name, object, field, enumItem, weakAssignment, cppFieldName); case WorkflowFields::RangeExpression_beginBoundary: return vl::glr::AssemblerSetEnumField(&vl::workflow::WfRangeExpression::beginBoundary, object, field, enumItem, weakAssignment, cppFieldName); case WorkflowFields::RangeExpression_endBoundary: return vl::glr::AssemblerSetEnumField(&vl::workflow::WfRangeExpression::endBoundary, object, field, enumItem, weakAssignment, cppFieldName); case WorkflowFields::SetTestingExpression_test: return vl::glr::AssemblerSetEnumField(&vl::workflow::WfSetTestingExpression::test, object, field, enumItem, weakAssignment, cppFieldName); case WorkflowFields::StateInvokeStatement_type: return vl::glr::AssemblerSetEnumField(&vl::workflow::WfStateInvokeStatement::type, object, field, enumItem, weakAssignment, cppFieldName); case WorkflowFields::StateSwitchStatement_type: return vl::glr::AssemblerSetEnumField(&vl::workflow::WfStateSwitchStatement::type, object, field, enumItem, weakAssignment, cppFieldName); case WorkflowFields::TypeCastingExpression_strategy: return vl::glr::AssemblerSetEnumField(&vl::workflow::WfTypeCastingExpression::strategy, object, field, enumItem, weakAssignment, cppFieldName); case WorkflowFields::TypeTestingExpression_test: return vl::glr::AssemblerSetEnumField(&vl::workflow::WfTypeTestingExpression::test, object, field, enumItem, weakAssignment, cppFieldName); case WorkflowFields::UnaryExpression_op: return vl::glr::AssemblerSetEnumField(&vl::workflow::WfUnaryExpression::op, object, field, enumItem, weakAssignment, cppFieldName); default: return vl::glr::AssemblyThrowFieldNotEnum(field, cppFieldName); } } const wchar_t* WorkflowTypeName(WorkflowClasses type) { const wchar_t* results[] = { L"AttachEventExpression", L"Attribute", L"AutoPropertyDeclaration", L"BaseConstructorCall", L"BinaryExpression", L"BindExpression", L"BlockStatement", L"BreakStatement", L"CallExpression", L"CastResultInterfaceDeclaration", L"ChildExpression", L"ChildType", L"ClassDeclaration", L"CoOperatorExpression", L"CoOperatorStatement", L"CoPauseStatement", L"CoProviderStatement", L"ConstructorArgument", L"ConstructorDeclaration", L"ConstructorExpression", L"ContinueStatement", L"CoroutineStatement", L"Declaration", L"DeleteStatement", L"DestructorDeclaration", L"DetachEventExpression", L"EnumDeclaration", L"EnumItem", L"EnumItemIntersection", L"EnumerableType", L"EventDeclaration", L"ExpectedTypeCastExpression", L"Expression", L"ExpressionStatement", L"FloatingExpression", L"ForEachStatement", L"FormatExpression", L"FunctionArgument", L"FunctionDeclaration", L"FunctionExpression", L"FunctionType", L"GotoStatement", L"IfExpression", L"IfStatement", L"InferExpression", L"IntegerExpression", L"LetExpression", L"LetVariable", L"LiteralExpression", L"MapType", L"MemberExpression", L"MixinCastExpression", L"Module", L"ModuleUsingFragment", L"ModuleUsingItem", L"ModuleUsingNameFragment", L"ModuleUsingPath", L"ModuleUsingWildCardFragment", L"NamespaceDeclaration", L"NewClassExpression", L"NewCoroutineExpression", L"NewInterfaceExpression", L"NullableType", L"ObservableListType", L"ObserveExpression", L"OrderedLambdaExpression", L"OrderedNameExpression", L"PredefinedType", L"PropertyDeclaration", L"RaiseExceptionStatement", L"RangeExpression", L"RawPointerType", L"ReferenceExpression", L"ReferenceType", L"ReturnStatement", L"SetTestingExpression", L"SharedPointerType", L"StateDeclaration", L"StateInput", L"StateInvokeStatement", L"StateMachineDeclaration", L"StateMachineStatement", L"StateSwitchArgument", L"StateSwitchCase", L"StateSwitchStatement", L"Statement", L"StaticInitDeclaration", L"StringExpression", L"StructDeclaration", L"StructMember", L"SwitchCase", L"SwitchStatement", L"ThisExpression", L"TopQualifiedExpression", L"TopQualifiedType", L"TryStatement", L"Type", L"TypeCastingExpression", L"TypeOfExpressionExpression", L"TypeOfTypeExpression", L"TypeTestingExpression", L"UnaryExpression", L"VariableDeclaration", L"VariableStatement", L"VirtualCfeDeclaration", L"VirtualCfeExpression", L"VirtualCseDeclaration", L"VirtualCseExpression", L"VirtualCseStatement", L"WhileStatement", }; vl::vint index = (vl::vint)type; return 0 <= index && index < 110 ? results[index] : nullptr; } const wchar_t* WorkflowCppTypeName(WorkflowClasses type) { const wchar_t* results[] = { L"vl::workflow::WfAttachEventExpression", L"vl::workflow::WfAttribute", L"vl::workflow::WfAutoPropertyDeclaration", L"vl::workflow::WfBaseConstructorCall", L"vl::workflow::WfBinaryExpression", L"vl::workflow::WfBindExpression", L"vl::workflow::WfBlockStatement", L"vl::workflow::WfBreakStatement", L"vl::workflow::WfCallExpression", L"vl::workflow::WfCastResultInterfaceDeclaration", L"vl::workflow::WfChildExpression", L"vl::workflow::WfChildType", L"vl::workflow::WfClassDeclaration", L"vl::workflow::WfCoOperatorExpression", L"vl::workflow::WfCoOperatorStatement", L"vl::workflow::WfCoPauseStatement", L"vl::workflow::WfCoProviderStatement", L"vl::workflow::WfConstructorArgument", L"vl::workflow::WfConstructorDeclaration", L"vl::workflow::WfConstructorExpression", L"vl::workflow::WfContinueStatement", L"vl::workflow::WfCoroutineStatement", L"vl::workflow::WfDeclaration", L"vl::workflow::WfDeleteStatement", L"vl::workflow::WfDestructorDeclaration", L"vl::workflow::WfDetachEventExpression", L"vl::workflow::WfEnumDeclaration", L"vl::workflow::WfEnumItem", L"vl::workflow::WfEnumItemIntersection", L"vl::workflow::WfEnumerableType", L"vl::workflow::WfEventDeclaration", L"vl::workflow::WfExpectedTypeCastExpression", L"vl::workflow::WfExpression", L"vl::workflow::WfExpressionStatement", L"vl::workflow::WfFloatingExpression", L"vl::workflow::WfForEachStatement", L"vl::workflow::WfFormatExpression", L"vl::workflow::WfFunctionArgument", L"vl::workflow::WfFunctionDeclaration", L"vl::workflow::WfFunctionExpression", L"vl::workflow::WfFunctionType", L"vl::workflow::WfGotoStatement", L"vl::workflow::WfIfExpression", L"vl::workflow::WfIfStatement", L"vl::workflow::WfInferExpression", L"vl::workflow::WfIntegerExpression", L"vl::workflow::WfLetExpression", L"vl::workflow::WfLetVariable", L"vl::workflow::WfLiteralExpression", L"vl::workflow::WfMapType", L"vl::workflow::WfMemberExpression", L"vl::workflow::WfMixinCastExpression", L"vl::workflow::WfModule", L"vl::workflow::WfModuleUsingFragment", L"vl::workflow::WfModuleUsingItem", L"vl::workflow::WfModuleUsingNameFragment", L"vl::workflow::WfModuleUsingPath", L"vl::workflow::WfModuleUsingWildCardFragment", L"vl::workflow::WfNamespaceDeclaration", L"vl::workflow::WfNewClassExpression", L"vl::workflow::WfNewCoroutineExpression", L"vl::workflow::WfNewInterfaceExpression", L"vl::workflow::WfNullableType", L"vl::workflow::WfObservableListType", L"vl::workflow::WfObserveExpression", L"vl::workflow::WfOrderedLambdaExpression", L"vl::workflow::WfOrderedNameExpression", L"vl::workflow::WfPredefinedType", L"vl::workflow::WfPropertyDeclaration", L"vl::workflow::WfRaiseExceptionStatement", L"vl::workflow::WfRangeExpression", L"vl::workflow::WfRawPointerType", L"vl::workflow::WfReferenceExpression", L"vl::workflow::WfReferenceType", L"vl::workflow::WfReturnStatement", L"vl::workflow::WfSetTestingExpression", L"vl::workflow::WfSharedPointerType", L"vl::workflow::WfStateDeclaration", L"vl::workflow::WfStateInput", L"vl::workflow::WfStateInvokeStatement", L"vl::workflow::WfStateMachineDeclaration", L"vl::workflow::WfStateMachineStatement", L"vl::workflow::WfStateSwitchArgument", L"vl::workflow::WfStateSwitchCase", L"vl::workflow::WfStateSwitchStatement", L"vl::workflow::WfStatement", L"vl::workflow::WfStaticInitDeclaration", L"vl::workflow::WfStringExpression", L"vl::workflow::WfStructDeclaration", L"vl::workflow::WfStructMember", L"vl::workflow::WfSwitchCase", L"vl::workflow::WfSwitchStatement", L"vl::workflow::WfThisExpression", L"vl::workflow::WfTopQualifiedExpression", L"vl::workflow::WfTopQualifiedType", L"vl::workflow::WfTryStatement", L"vl::workflow::WfType", L"vl::workflow::WfTypeCastingExpression", L"vl::workflow::WfTypeOfExpressionExpression", L"vl::workflow::WfTypeOfTypeExpression", L"vl::workflow::WfTypeTestingExpression", L"vl::workflow::WfUnaryExpression", L"vl::workflow::WfVariableDeclaration", L"vl::workflow::WfVariableStatement", L"vl::workflow::WfVirtualCfeDeclaration", L"vl::workflow::WfVirtualCfeExpression", L"vl::workflow::WfVirtualCseDeclaration", L"vl::workflow::WfVirtualCseExpression", L"vl::workflow::WfVirtualCseStatement", L"vl::workflow::WfWhileStatement", }; vl::vint index = (vl::vint)type; return 0 <= index && index < 110 ? results[index] : nullptr; } const wchar_t* WorkflowFieldName(WorkflowFields field) { const wchar_t* results[] = { L"AttachEventExpression::event", L"AttachEventExpression::function", L"Attribute::category", L"Attribute::name", L"Attribute::value", L"AutoPropertyDeclaration::configConst", L"AutoPropertyDeclaration::configObserve", L"AutoPropertyDeclaration::expression", L"AutoPropertyDeclaration::functionKind", L"AutoPropertyDeclaration::type", L"BaseConstructorCall::arguments", L"BaseConstructorCall::type", L"BinaryExpression::first", L"BinaryExpression::op", L"BinaryExpression::second", L"BindExpression::expression", L"BlockStatement::endLabel", L"BlockStatement::statements", L"CallExpression::arguments", L"CallExpression::function", L"CastResultInterfaceDeclaration::baseType", L"CastResultInterfaceDeclaration::elementType", L"ChildExpression::name", L"ChildExpression::parent", L"ChildType::name", L"ChildType::parent", L"ClassDeclaration::baseTypes", L"ClassDeclaration::constructorType", L"ClassDeclaration::declarations", L"ClassDeclaration::kind", L"CoOperatorExpression::name", L"CoOperatorStatement::arguments", L"CoOperatorStatement::opName", L"CoOperatorStatement::varName", L"CoPauseStatement::statement", L"CoProviderStatement::name", L"CoProviderStatement::statement", L"ConstructorArgument::key", L"ConstructorArgument::value", L"ConstructorDeclaration::arguments", L"ConstructorDeclaration::baseConstructorCalls", L"ConstructorDeclaration::constructorType", L"ConstructorDeclaration::statement", L"ConstructorExpression::arguments", L"Declaration::attributes", L"Declaration::name", L"DeleteStatement::expression", L"DestructorDeclaration::statement", L"DetachEventExpression::event", L"DetachEventExpression::handler", L"EnumDeclaration::items", L"EnumDeclaration::kind", L"EnumItem::attributes", L"EnumItem::intersections", L"EnumItem::kind", L"EnumItem::name", L"EnumItem::number", L"EnumItemIntersection::name", L"EnumerableType::element", L"EventDeclaration::arguments", L"ExpectedTypeCastExpression::expression", L"ExpectedTypeCastExpression::strategy", L"ExpressionStatement::expression", L"FloatingExpression::value", L"ForEachStatement::collection", L"ForEachStatement::direction", L"ForEachStatement::name", L"ForEachStatement::statement", L"FormatExpression::value", L"FunctionArgument::attributes", L"FunctionArgument::name", L"FunctionArgument::type", L"FunctionDeclaration::anonymity", L"FunctionDeclaration::arguments", L"FunctionDeclaration::functionKind", L"FunctionDeclaration::returnType", L"FunctionDeclaration::statement", L"FunctionExpression::function", L"FunctionType::arguments", L"FunctionType::result", L"GotoStatement::label", L"IfExpression::condition", L"IfExpression::falseBranch", L"IfExpression::trueBranch", L"IfStatement::expression", L"IfStatement::falseBranch", L"IfStatement::name", L"IfStatement::trueBranch", L"IfStatement::type", L"InferExpression::expression", L"InferExpression::type", L"IntegerExpression::value", L"LetExpression::expression", L"LetExpression::variables", L"LetVariable::name", L"LetVariable::value", L"LiteralExpression::value", L"MapType::key", L"MapType::value", L"MapType::writability", L"MemberExpression::name", L"MemberExpression::parent", L"MixinCastExpression::expression", L"MixinCastExpression::type", L"Module::declarations", L"Module::moduleType", L"Module::name", L"Module::paths", L"ModuleUsingItem::fragments", L"ModuleUsingNameFragment::name", L"ModuleUsingPath::items", L"NamespaceDeclaration::declarations", L"NewClassExpression::arguments", L"NewClassExpression::type", L"NewCoroutineExpression::name", L"NewCoroutineExpression::statement", L"NewInterfaceExpression::declarations", L"NewInterfaceExpression::type", L"NullableType::element", L"ObservableListType::element", L"ObserveExpression::events", L"ObserveExpression::expression", L"ObserveExpression::name", L"ObserveExpression::observeType", L"ObserveExpression::parent", L"OrderedLambdaExpression::body", L"OrderedNameExpression::name", L"PredefinedType::name", L"PropertyDeclaration::getter", L"PropertyDeclaration::setter", L"PropertyDeclaration::type", L"PropertyDeclaration::valueChangedEvent", L"RaiseExceptionStatement::expression", L"RangeExpression::begin", L"RangeExpression::beginBoundary", L"RangeExpression::end", L"RangeExpression::endBoundary", L"RawPointerType::element", L"ReferenceExpression::name", L"ReferenceType::name", L"ReturnStatement::expression", L"SetTestingExpression::collection", L"SetTestingExpression::element", L"SetTestingExpression::test", L"SharedPointerType::element", L"StateDeclaration::arguments", L"StateDeclaration::name", L"StateDeclaration::statement", L"StateInput::arguments", L"StateInput::name", L"StateInvokeStatement::arguments", L"StateInvokeStatement::name", L"StateInvokeStatement::type", L"StateMachineDeclaration::inputs", L"StateMachineDeclaration::states", L"StateSwitchArgument::name", L"StateSwitchCase::arguments", L"StateSwitchCase::name", L"StateSwitchCase::statement", L"StateSwitchStatement::caseBranches", L"StateSwitchStatement::type", L"StaticInitDeclaration::statement", L"StringExpression::value", L"StructDeclaration::members", L"StructMember::attributes", L"StructMember::name", L"StructMember::type", L"SwitchCase::expression", L"SwitchCase::statement", L"SwitchStatement::caseBranches", L"SwitchStatement::defaultBranch", L"SwitchStatement::expression", L"TopQualifiedExpression::name", L"TopQualifiedType::name", L"TryStatement::catchStatement", L"TryStatement::finallyStatement", L"TryStatement::name", L"TryStatement::protectedStatement", L"TypeCastingExpression::expression", L"TypeCastingExpression::strategy", L"TypeCastingExpression::type", L"TypeOfExpressionExpression::expression", L"TypeOfTypeExpression::type", L"TypeTestingExpression::expression", L"TypeTestingExpression::test", L"TypeTestingExpression::type", L"UnaryExpression::op", L"UnaryExpression::operand", L"VariableDeclaration::expression", L"VariableDeclaration::type", L"VariableStatement::variable", L"VirtualCfeDeclaration::expandedDeclarations", L"VirtualCfeExpression::expandedExpression", L"VirtualCseDeclaration::expandedDeclarations", L"VirtualCseExpression::expandedExpression", L"VirtualCseStatement::expandedStatement", L"WhileStatement::condition", L"WhileStatement::statement", }; vl::vint index = (vl::vint)field; return 0 <= index && index < 198 ? results[index] : nullptr; } const wchar_t* WorkflowCppFieldName(WorkflowFields field) { const wchar_t* results[] = { L"vl::workflow::WfAttachEventExpression::event", L"vl::workflow::WfAttachEventExpression::function", L"vl::workflow::WfAttribute::category", L"vl::workflow::WfAttribute::name", L"vl::workflow::WfAttribute::value", L"vl::workflow::WfAutoPropertyDeclaration::configConst", L"vl::workflow::WfAutoPropertyDeclaration::configObserve", L"vl::workflow::WfAutoPropertyDeclaration::expression", L"vl::workflow::WfAutoPropertyDeclaration::functionKind", L"vl::workflow::WfAutoPropertyDeclaration::type", L"vl::workflow::WfBaseConstructorCall::arguments", L"vl::workflow::WfBaseConstructorCall::type", L"vl::workflow::WfBinaryExpression::first", L"vl::workflow::WfBinaryExpression::op", L"vl::workflow::WfBinaryExpression::second", L"vl::workflow::WfBindExpression::expression", L"vl::workflow::WfBlockStatement::endLabel", L"vl::workflow::WfBlockStatement::statements", L"vl::workflow::WfCallExpression::arguments", L"vl::workflow::WfCallExpression::function", L"vl::workflow::WfCastResultInterfaceDeclaration::baseType", L"vl::workflow::WfCastResultInterfaceDeclaration::elementType", L"vl::workflow::WfChildExpression::name", L"vl::workflow::WfChildExpression::parent", L"vl::workflow::WfChildType::name", L"vl::workflow::WfChildType::parent", L"vl::workflow::WfClassDeclaration::baseTypes", L"vl::workflow::WfClassDeclaration::constructorType", L"vl::workflow::WfClassDeclaration::declarations", L"vl::workflow::WfClassDeclaration::kind", L"vl::workflow::WfCoOperatorExpression::name", L"vl::workflow::WfCoOperatorStatement::arguments", L"vl::workflow::WfCoOperatorStatement::opName", L"vl::workflow::WfCoOperatorStatement::varName", L"vl::workflow::WfCoPauseStatement::statement", L"vl::workflow::WfCoProviderStatement::name", L"vl::workflow::WfCoProviderStatement::statement", L"vl::workflow::WfConstructorArgument::key", L"vl::workflow::WfConstructorArgument::value", L"vl::workflow::WfConstructorDeclaration::arguments", L"vl::workflow::WfConstructorDeclaration::baseConstructorCalls", L"vl::workflow::WfConstructorDeclaration::constructorType", L"vl::workflow::WfConstructorDeclaration::statement", L"vl::workflow::WfConstructorExpression::arguments", L"vl::workflow::WfDeclaration::attributes", L"vl::workflow::WfDeclaration::name", L"vl::workflow::WfDeleteStatement::expression", L"vl::workflow::WfDestructorDeclaration::statement", L"vl::workflow::WfDetachEventExpression::event", L"vl::workflow::WfDetachEventExpression::handler", L"vl::workflow::WfEnumDeclaration::items", L"vl::workflow::WfEnumDeclaration::kind", L"vl::workflow::WfEnumItem::attributes", L"vl::workflow::WfEnumItem::intersections", L"vl::workflow::WfEnumItem::kind", L"vl::workflow::WfEnumItem::name", L"vl::workflow::WfEnumItem::number", L"vl::workflow::WfEnumItemIntersection::name", L"vl::workflow::WfEnumerableType::element", L"vl::workflow::WfEventDeclaration::arguments", L"vl::workflow::WfExpectedTypeCastExpression::expression", L"vl::workflow::WfExpectedTypeCastExpression::strategy", L"vl::workflow::WfExpressionStatement::expression", L"vl::workflow::WfFloatingExpression::value", L"vl::workflow::WfForEachStatement::collection", L"vl::workflow::WfForEachStatement::direction", L"vl::workflow::WfForEachStatement::name", L"vl::workflow::WfForEachStatement::statement", L"vl::workflow::WfFormatExpression::value", L"vl::workflow::WfFunctionArgument::attributes", L"vl::workflow::WfFunctionArgument::name", L"vl::workflow::WfFunctionArgument::type", L"vl::workflow::WfFunctionDeclaration::anonymity", L"vl::workflow::WfFunctionDeclaration::arguments", L"vl::workflow::WfFunctionDeclaration::functionKind", L"vl::workflow::WfFunctionDeclaration::returnType", L"vl::workflow::WfFunctionDeclaration::statement", L"vl::workflow::WfFunctionExpression::function", L"vl::workflow::WfFunctionType::arguments", L"vl::workflow::WfFunctionType::result", L"vl::workflow::WfGotoStatement::label", L"vl::workflow::WfIfExpression::condition", L"vl::workflow::WfIfExpression::falseBranch", L"vl::workflow::WfIfExpression::trueBranch", L"vl::workflow::WfIfStatement::expression", L"vl::workflow::WfIfStatement::falseBranch", L"vl::workflow::WfIfStatement::name", L"vl::workflow::WfIfStatement::trueBranch", L"vl::workflow::WfIfStatement::type", L"vl::workflow::WfInferExpression::expression", L"vl::workflow::WfInferExpression::type", L"vl::workflow::WfIntegerExpression::value", L"vl::workflow::WfLetExpression::expression", L"vl::workflow::WfLetExpression::variables", L"vl::workflow::WfLetVariable::name", L"vl::workflow::WfLetVariable::value", L"vl::workflow::WfLiteralExpression::value", L"vl::workflow::WfMapType::key", L"vl::workflow::WfMapType::value", L"vl::workflow::WfMapType::writability", L"vl::workflow::WfMemberExpression::name", L"vl::workflow::WfMemberExpression::parent", L"vl::workflow::WfMixinCastExpression::expression", L"vl::workflow::WfMixinCastExpression::type", L"vl::workflow::WfModule::declarations", L"vl::workflow::WfModule::moduleType", L"vl::workflow::WfModule::name", L"vl::workflow::WfModule::paths", L"vl::workflow::WfModuleUsingItem::fragments", L"vl::workflow::WfModuleUsingNameFragment::name", L"vl::workflow::WfModuleUsingPath::items", L"vl::workflow::WfNamespaceDeclaration::declarations", L"vl::workflow::WfNewClassExpression::arguments", L"vl::workflow::WfNewClassExpression::type", L"vl::workflow::WfNewCoroutineExpression::name", L"vl::workflow::WfNewCoroutineExpression::statement", L"vl::workflow::WfNewInterfaceExpression::declarations", L"vl::workflow::WfNewInterfaceExpression::type", L"vl::workflow::WfNullableType::element", L"vl::workflow::WfObservableListType::element", L"vl::workflow::WfObserveExpression::events", L"vl::workflow::WfObserveExpression::expression", L"vl::workflow::WfObserveExpression::name", L"vl::workflow::WfObserveExpression::observeType", L"vl::workflow::WfObserveExpression::parent", L"vl::workflow::WfOrderedLambdaExpression::body", L"vl::workflow::WfOrderedNameExpression::name", L"vl::workflow::WfPredefinedType::name", L"vl::workflow::WfPropertyDeclaration::getter", L"vl::workflow::WfPropertyDeclaration::setter", L"vl::workflow::WfPropertyDeclaration::type", L"vl::workflow::WfPropertyDeclaration::valueChangedEvent", L"vl::workflow::WfRaiseExceptionStatement::expression", L"vl::workflow::WfRangeExpression::begin", L"vl::workflow::WfRangeExpression::beginBoundary", L"vl::workflow::WfRangeExpression::end", L"vl::workflow::WfRangeExpression::endBoundary", L"vl::workflow::WfRawPointerType::element", L"vl::workflow::WfReferenceExpression::name", L"vl::workflow::WfReferenceType::name", L"vl::workflow::WfReturnStatement::expression", L"vl::workflow::WfSetTestingExpression::collection", L"vl::workflow::WfSetTestingExpression::element", L"vl::workflow::WfSetTestingExpression::test", L"vl::workflow::WfSharedPointerType::element", L"vl::workflow::WfStateDeclaration::arguments", L"vl::workflow::WfStateDeclaration::name", L"vl::workflow::WfStateDeclaration::statement", L"vl::workflow::WfStateInput::arguments", L"vl::workflow::WfStateInput::name", L"vl::workflow::WfStateInvokeStatement::arguments", L"vl::workflow::WfStateInvokeStatement::name", L"vl::workflow::WfStateInvokeStatement::type", L"vl::workflow::WfStateMachineDeclaration::inputs", L"vl::workflow::WfStateMachineDeclaration::states", L"vl::workflow::WfStateSwitchArgument::name", L"vl::workflow::WfStateSwitchCase::arguments", L"vl::workflow::WfStateSwitchCase::name", L"vl::workflow::WfStateSwitchCase::statement", L"vl::workflow::WfStateSwitchStatement::caseBranches", L"vl::workflow::WfStateSwitchStatement::type", L"vl::workflow::WfStaticInitDeclaration::statement", L"vl::workflow::WfStringExpression::value", L"vl::workflow::WfStructDeclaration::members", L"vl::workflow::WfStructMember::attributes", L"vl::workflow::WfStructMember::name", L"vl::workflow::WfStructMember::type", L"vl::workflow::WfSwitchCase::expression", L"vl::workflow::WfSwitchCase::statement", L"vl::workflow::WfSwitchStatement::caseBranches", L"vl::workflow::WfSwitchStatement::defaultBranch", L"vl::workflow::WfSwitchStatement::expression", L"vl::workflow::WfTopQualifiedExpression::name", L"vl::workflow::WfTopQualifiedType::name", L"vl::workflow::WfTryStatement::catchStatement", L"vl::workflow::WfTryStatement::finallyStatement", L"vl::workflow::WfTryStatement::name", L"vl::workflow::WfTryStatement::protectedStatement", L"vl::workflow::WfTypeCastingExpression::expression", L"vl::workflow::WfTypeCastingExpression::strategy", L"vl::workflow::WfTypeCastingExpression::type", L"vl::workflow::WfTypeOfExpressionExpression::expression", L"vl::workflow::WfTypeOfTypeExpression::type", L"vl::workflow::WfTypeTestingExpression::expression", L"vl::workflow::WfTypeTestingExpression::test", L"vl::workflow::WfTypeTestingExpression::type", L"vl::workflow::WfUnaryExpression::op", L"vl::workflow::WfUnaryExpression::operand", L"vl::workflow::WfVariableDeclaration::expression", L"vl::workflow::WfVariableDeclaration::type", L"vl::workflow::WfVariableStatement::variable", L"vl::workflow::WfVirtualCfeDeclaration::expandedDeclarations", L"vl::workflow::WfVirtualCfeExpression::expandedExpression", L"vl::workflow::WfVirtualCseDeclaration::expandedDeclarations", L"vl::workflow::WfVirtualCseExpression::expandedExpression", L"vl::workflow::WfVirtualCseStatement::expandedStatement", L"vl::workflow::WfWhileStatement::condition", L"vl::workflow::WfWhileStatement::statement", }; vl::vint index = (vl::vint)field; return 0 <= index && index < 198 ? results[index] : nullptr; } vl::Ptr WorkflowAstInsReceiver::ResolveAmbiguity(vl::vint32_t type, vl::collections::Array>& candidates) { auto cppTypeName = WorkflowCppTypeName((WorkflowClasses)type); return vl::glr::AssemblyThrowTypeNotAllowAmbiguity(type, cppTypeName); } } /*********************************************************************** .\PARSER\GENERATED\WORKFLOW_LEXER.CPP ***********************************************************************/ /*********************************************************************** This file is generated by: Vczh Parser Generator From parser definition:Workflow Licensed under https://github.com/vczh-libraries/License ***********************************************************************/ namespace vl::workflow { bool WorkflowTokenDeleter(vl::vint token) { switch((WorkflowTokens)token) { case WorkflowTokens::COMMENT: case WorkflowTokens::SPACE: return true; default: return false; } } const wchar_t* WorkflowTokenId(WorkflowTokens token) { static const wchar_t* results[] = { L"EXP", L"ADD", L"SUB", L"MUL", L"DIV", L"MOD", L"JOIN", L"INTERSECTION", L"LE", L"GE", L"LT", L"GT", L"EQ", L"NE", L"ASSIGN", L"FAILED_THEN", L"QUESTION_MARK", L"SCOPE_DELIMITER", L"COLON", L"SEMICOLON", L"COMMA", L"DOT", L"OPEN_ARRAY", L"CLOSE_ARRAY", L"OPEN_BRACE", L"CLOSE_BRACE", L"OPEN_BRACKET", L"CLOSE_BRACKET", L"AT", L"TYPE_VOID", L"TYPE_OBJECT", L"TYPE_INTERFACE", L"TYPE_INT", L"TYPE_UINT", L"TYPE_FLOAT", L"TYPE_DOUBLE", L"TYPE_STRING", L"TYPE_CHAR", L"TYPE_BOOL", L"KEYWORD_CONST", L"KEYWORD_SHL", L"KEYWORD_SHR", L"KEYWORD_XOR", L"KEYWORD_AND", L"KEYWORD_OR", L"KEYWORD_NOT", L"KEYWORD_NULL", L"KEYWORD_THIS", L"KEYWORD_TRUE", L"KEYWORD_FALSE", L"KEYWORD_LET", L"KEYWORD_IN", L"KEYWORD_RANGE", L"KEYWORD_NEW", L"KEYWORD_OF", L"KEYWORD_AS", L"KEYWORD_IS", L"KEYWORD_CAST", L"KEYWORD_FUNC", L"KEYWORD_TYPEOF", L"KEYWORD_TYPE", L"KEYWORD_BIND", L"KEYWORD_OBSERVE", L"KEYWORD_ON", L"KEYWORD_ATTACH", L"KEYWORD_DETACH", L"KEYWORD_GOTO", L"KEYWORD_VAR", L"KEYWORD_BREAK", L"KEYWORD_CONTINUE", L"KEYWORD_RETURN", L"KEYWORD_DELETE", L"KEYWORD_RAISE", L"KEYWORD_IF", L"KEYWORD_ELSE", L"KEYWORD_SWITCH", L"KEYWORD_CASE", L"KEYWORD_DEFAULT", L"KEYWORD_WHILE", L"KEYWORD_FOR", L"KEYWORD_REVERSED", L"KEYWORD_TRY", L"KEYWORD_CATCH", L"KEYWORD_FINALLY", L"KEYWORD_CLASS", L"KEYWORD_ENUM", L"KEYWORD_FLAGENUM", L"KEYWORD_STRUCT", L"KEYWORD_PROP", L"KEYWORD_EVENT", L"KEYWORD_STATIC", L"KEYWORD_OVERRIDE", L"KEYWORD_USING", L"KEYWORD_NAMESPACE", L"KEYWORD_MODULE", L"KEYWORD_UNIT", L"STATE_MACHINE", L"STATE_INPUT", L"STATE_SWITCH", L"STATE_GOTO", L"STATE_PUSH", L"STATE_DECL", L"COROUTINE_COROUTINE", L"COROUTINE_PAUSE", L"COROUTINE_INTERFACE", L"COROUTINE_OPERATOR", L"COROUTINE_SIGN", L"NAME", L"ORDERED_NAME", L"FLOAT", L"INTEGER", L"STRING", L"FORMATSTRING", L"SPACE", L"COMMENT", }; vl::vint index = (vl::vint)token; return 0 <= index && index < WorkflowTokenCount ? results[index] : nullptr; } const wchar_t* WorkflowTokenDisplayText(WorkflowTokens token) { static const wchar_t* results[] = { L"^", L"+", L"-", L"*", L"/", L"%", L"&", L"|", L"<=", L">=", L"<", L">", L"==", L"!=", L"=", L"??", L"?", L"::", L":", L";", L",", L".", L"[", L"]", L"{", L"}", L"(", L")", L"@", L"void", L"object", L"interface", L"int", L"uint", L"float", L"double", L"string", L"char", L"bool", L"const", L"shl", L"shr", L"xor", L"and", L"or", L"not", L"null", L"this", L"true", L"false", L"let", L"in", L"range", L"new", L"of", L"as", L"is", L"cast", L"func", L"typeof", L"type", L"bind", L"observe", L"on", L"attach", L"detach", L"goto", L"var", L"break", L"continue", L"return", L"delete", L"raise", L"if", L"else", L"switch", L"case", L"default", L"while", L"for", L"reversed", L"try", L"catch", L"finally", L"class", L"enum", L"flagenum", L"struct", L"prop", L"event", L"static", L"override", L"using", L"namespace", L"module", L"unit", L"$state_machine", L"$state_input", L"$switch", L"$goto_state", L"$push_state", L"$state", L"$coroutine", L"$pause", L"$interface", nullptr, L"$", nullptr, nullptr, nullptr, nullptr, nullptr, nullptr, nullptr, nullptr, }; vl::vint index = (vl::vint)token; return 0 <= index && index < WorkflowTokenCount ? results[index] : nullptr; } const wchar_t* WorkflowTokenRegex(WorkflowTokens token) { static const wchar_t* results[] = { L"/^", L"/+", L"-", L"/*", L"//", L"%", L"&", L"/|", L"//=", L"/<", L"/>", L"/=/=", L"/!/=", L"/=", L"/?/?", L"/?", L"::", L":", L";", L",", L".", L"/[", L"/]", L"/{", L"/}", L"/(", L"/)", L"@", L"void", L"object", L"interface", L"int", L"uint", L"float", L"double", L"string", L"char", L"bool", L"const", L"shl", L"shr", L"xor", L"and", L"or", L"not", L"null", L"this", L"true", L"false", L"let", L"in", L"range", L"new", L"of", L"as", L"is", L"cast", L"func", L"typeof", L"type", L"bind", L"observe", L"on", L"attach", L"detach", L"goto", L"var", L"break", L"continue", L"return", L"delete", L"raise", L"if", L"else", L"switch", L"case", L"default", L"while", L"for", L"reversed", L"try", L"catch", L"finally", L"class", L"enum", L"flagenum", L"struct", L"prop", L"event", L"static", L"override", L"using", L"namespace", L"module", L"unit", L"/$state_machine", L"/$state_input", L"/$switch", L"/$goto_state", L"/$push_state", L"/$state", L"/$coroutine", L"/$pause", L"/$interface", L"/$[A-Z]/w*", L"/$", L"[a-zA-Z_]/w*", L"/$[0-9]*", L"/d+./d+", L"/d+", L"\'([^\'\\\\]|\\\\\\.)*\'|\"([^\"\\\\]|\\\\\\.)*\"", L"/$(\'([^\'\\\\]|\\\\\\.)*\'|\"([^\"\\\\]|\\\\\\.)*\")", L"/s+", L"///*([^*]|/*+[^//])*/*+//", }; vl::vint index = (vl::vint)token; return 0 <= index && index < WorkflowTokenCount ? results[index] : nullptr; } void WorkflowLexerData(vl::stream::IStream& outputStream) { static const vl::vint dataLength = 5338; // 106036 bytes before compressing static const vl::vint dataBlock = 256; static const vl::vint dataRemain = 218; static const vl::vint dataSolidRows = 20; static const vl::vint dataRows = 21; static const char* compressed[] = { "\x34\x9E\x01\x00\xD2\x14\x00\x00\x7E\x01\x00\x00\x04\x22\x85\x82\x81\x21\x05\x81\x82\x88\x05\x81\x05\x87\x82\x0A\x10\x85\x8B\x05\x84\x05\x83\x06\x17\x85\x8E\x05\x8F\x0D\x80\x10\x8F\x05\xA1\x21\x85\x82\x14\x91\x83\x11\x27\x85\xA4\x0A\x95\x85\x11\x97\x82\x26\x30\x85\x87\x13\x9D\x80\x14\x9B\x05\xA9\x39\x85\x8A\x14\x9D\x83\x15\x3F\x85\xAC\x02\xA5\x85\x15\xA3\x82\x2E\x48\x85\x8F\x1B\xA5\x80\x19\x82\x39\x05\xBA\x12\xA5\x83\x1D\xAB\x82\x3C\x58\x85\x9D\x1B\xAD\x82\x1E\xAF\x05\xBF\x21\xA5\x80\x24\xB1\x83\x20\x05\xDA\x05\x9B\x2B\xB5\x80\x2E\xB7\x05\xDD\x31\xA5\x8E\x2C\xB9\x83\x2F\x77\x85\xA0\x3A\xB5\x81\x31\xBF\x82\x62\x00\xC5\x83\x33\xC5\x80\x32\xC3\x05\xE5\x09\xC5\x86\x34\xC5\x83\x33\x8F\x85\xA8\x32\xC5\x81\x35\xCB\x82\x6A\x18\xC5\x8B\x3B\xCD\x80\x36\xCF\x05\xED\x21\xC5\x8E\x34\xD1\x83\x37\xA7\x85\xB0\x2A\xD5\x81\x39\xD7\x82\x72\x30\xC5\x93\x33\xDD\x80\x3A\xDB\x05\xF5\x39\xC5\x86\x3C\xDD\x83\x3B\xBF\x85\xB8\x22\xE5\x81\x3D\xE3\x82\x7A\x48\xC5\x9B\x3B\xE5\x80\x3E\xE7\x05\xFD\x11\xE5\x8E\x3D\x83\x7F\x7F\x10\x00\x17\xF7", "\xE2\x1D\x81\xEE\x81\xDB\xFF\x5F\xFA\xEB\xEB\xF2\x8A\x81\x31\x56\xDB\xE6\xA2\x86\x01\x83\x03\x4E\x85\x96\x05\x87\x0D\x80\x03\x82\x02\x05\x99\xE2\x83\x05\x81\x09\x82\x05\x0D\x52\x43\x46\x02\x4F\x0F\x42\x40\x14\x42\x41\x46\x40\x18\x42\x48\x06\x52\x02\x52\x0A\x7B\x75\x13\x09\x40\x84\x79\xD7\x68\x42\x42\x48\x02\x5F\x42\x42\x07\x3B\x42\x4D\x04\x4E\x02\x49\x52\x43\x06\x17\xA6\x80\x01\x4C\x02\x43\x52\x43\x4A\x02\x5A\x01\x51\x89\x35\x42\x4D\x46\x40\x2E\x42\x4C\x05\x41\x19\x3E\x42\x41\x49\x34\x81\x90\x00\x05\x05\x4C\x42\x41\x05\x13\xA1\x7A\x93\x92\x4C\x8D\x9E\x93\x93\x50\x91\x92\x97\x94\x54\x95\x96\x97\x95\x58\x99\x9A\x97\x96\x5C\x9D\x9E\x97\x97\x60\xA1\x92\x9B\x98\x64\xA5\x96\x9B\x99\x68\xA9\x9A\x9B\x9A\x6C\xAD\x9E\x9B\x9B\x70\xB1\x92\x9F\x9C\x74\xA8\x93\x0D\x92\x75\xB9\x9A\x9F\x9E\x7C\xBD\x9E\x9F\x9F\x80\x81\xA2\xA3\xA0\x84\x85\xA6\xA3\xA1\x88\x89\xAA\xA2\x9A\x34\x38\x9B\xA3\xA3\x90\x83\xA5\x0E\xA3\x91\x95\xA6\xA5\x9E\x36\x14\xA7\xA7\xA6\x9C\xAC\x97\x0E\xA6\x9D\xA1\xA2\xAA\x9A\x38\x20\xA3\xAB\xA9\xA7\x91\x50\x78\xAA", "\xAC\xAD\xAE\xAB\xAB\xB0\xB1\xA2\xAF\xAC\xB4\xB5\xA6\xAF\xAD\xB8\xB9\xAA\xAF\xAE\xBC\xBD\xAE\xAF\xAF\xC0\x81\xB2\xB3\xB0\xC4\x85\xB6\xB3\xB1\xC8\x89\xBC\x91\x56\xAB\x9F\x9C\xB0\x86\x52\x8F\xB1\x7A\x55\x02\x4F\xB6\xB6\x56\xD5\x98\xB0\x03\xB5\xD9\x9D\xBB\xB6\xB6\xCF\x93\x5E\xB4\xB7\xDF\xA3\xB0\xBB\xB9\xDE\x86\xB2\xB4\x98\xEB\x93\x9D\xBB\x3F\xCF\x9C\x56\xBA\xB7\x62\x73\xB5\xBB\xBD\xE4\x8F\xB5\x5A\xBD\xCF\x9F\x5C\xBF\x59\xE8\xB8\xB6\xA8\xAF\xEF\x9D\x95\xC0\x94\xEF\xB9\xB1\xC0\x41\xFF\x8D\xC7\xBE\x10\x01\xE4\xB8\x42\xC3\x0A\xE9\xB5\xB3\xC1\x5B\x98\xCE\x91\xC2\x11\xDD\xCE\xB5\x11\x1E\xF7\xB7\x11\xC8\xCF\x86\x14\xC9\xC8\xEA\x83\xC6\x96\xC6\x4D\xAF\xB9\x13\xC9\x0E\xCC\x11\xC0\x12\x01\xCB\x10\xCF\xBD\x4A\x37\xCC\xC9\xAF\x3B\xD7\x9D\xCE\x92\x1C\xCE\xCE\x12\xCE\x37\xCD\x14\xD0\xC5\x01\xE9\xCD\xB2\x97\x3F\xE1\x71\xD2\xC0\x48\xC2\x40\x17\xD1\x50\xD5\xD4\xBB\x13\x01\xD1\x18\xCB\xC5\x2A\xD5\x9D\xD3\x76\xEF\x94\x14\xD7\xB3\x52\x21\xC5\x15\xC0\x53\x23\xD4\xD6\xD2\xD0\x86\xCD\xD4\xD8\x49\x95\xC6\xD5\xC0\x57\x14\xD6\x15\xC0\x58", "\x2A\xD6\xBC\xDB\x61\x9F\xD7\x77\xD3\x72\xC1\xEA\xDC\x00\x59\x03\xE2\xE2\xC5\xC4\xBE\xD1\xB7\xDB\x7F\xF1\xD6\xE0\xD5\x6A\x51\xD0\x00\x5B\x02\x6F\x52\xE4\xB9\x7C\xEC\xBC\xE0\xBC\x49\xBB\x5E\xC0\x5E\x97\xF7\xC2\x5D\xE8\x02\x75\x54\xE9\xDB\xC1\x8A\xE1\x96\xE2\x80\xD4\xDE\x5F\xE9\x87\xC0\x01\x60\xEC\x85\x48\xE3\xB2\xEA\x08\xDB\xED\xEA\xBD\x87\x74\xEE\xEF\xDC\xBF\xD9\xEE\xB2\xEE\x49\x8A\x6E\xC1\x63\xBF\xF1\xEA\xF3\xE0\xC2\xCC\xD4\xF3\xD2\xCB\xC9\xF1\xC0\x64\xD2\xD2\xED\xF2\xDB\x4B\xEB\xEE\xE1\xF5\xC0\xC0\x03\x66\xB7\x96\x5C\xF9\x66\xF5\x5C\xD9\xFC\x94\xEB\xDB\xDD\xF2\xDC\x67\xDC\xD1\xFA\xF9\xD2\xE5\xE8\xE9\xC7\xF3\xD0\xAE\xF6\xFF\xE0\x9F\x6D\xFB\xE6\xAD\xB8\xCF\x98\xF8\xF4\x8F\x7F\x76\x68\x7A\x7E\x60\x3E\x7D\x36\x7C\x4F\x5A\x34\x02\xDE\x47\x37\x05\x99\x4C\x36\x0E\x9C\x4A\x6B\x11\x87\x3A\xD4\x0B\x69\x36\x14\x92\x4B\x6A\x0B\x85\x35\x0C\x8A\x5A\x7B\x1E\x94\x4B\xFF\x75\x71\x81\xF7\x44\x86\x84\x55\x7E\x57\x70\x4B\x60\x39\x10\x9F\x85\x4F\xC6\x22\x21\x0C\x80\x03\x87\x1A\x87\x3A\x86\x37\x94\x85\x0E\xB6\x88\x86\x81\x0C\x3D", "\x87\x3A\x80\x88\x0F\xC1\x84\x89\x21\x86\x8B\x87\x48\x82\x8A\x72\x4A\x8C\x89\x22\x89\x8E\x89\x4D\x87\x89\x14\xCF\x82\x8A\x28\x96\x8D\x8A\x58\x89\x4B\x73\x02\x2B\x8A\x00\x1D\x8F\x8B\xD0\x3C\x89\x18\x80\x05\x3A\x31\xA6\x8E\x8B\x63\x80\x8F\x19\xEA\x88\x8D\x35\xA9\x8F\x8D\x6E\x91\x8D\x1B\xF3\x8D\x8A\xE9\x32\x8C\x8D\x78\x90\x8C\x1D\xFA\x89\x8F\x3B\xBC\x8F\x8F\x7E\x81\x93\x1E\xE7\x8D\x49\x3F\x05\x26\x90\x4B\x68\x90\xB4\x0A\x9F\x85\x46\x94\x48\x10\x05\x30\x92\x40\x12\x90\x00\x4A\x96\x91\x92\x98\x93\x91\x26\x95\x9B\x93\x4B\x9A\x97\x93\x00\x01\x11\x27\xA3\x90\x94\x4F\x9C\x95\x94\xA4\x87\x96\x2A\xA6\x9C\x95\x54\xAD\x90\x95\xB0\x8B\x96\x2B\xB3\x91\x97\x57\xB2\x95\x96\xB4\x8A\x96\x23\xBB\x9C\x97\x5E\xBE\x97\x97\xC0\x81\x9A\x30\xC3\x94\x99\x62\x86\x9F\x98\x1B\x7B\x7D\xEE\x2E\x8C\x72\x00\x9C\x7A\x10\x25\x97\x7C\xF9\x09\x7A\x98\xFF\x74\x7E\x69\xD1\x99\x9A\x40\x03\x1A\x9A\xF9\x7F\x55\x7F\xC9\x8C\x9B\xEE\x28\x82\x9A\x72\x9D\x98\x9C\xB2\x48\x9F\xB2\x57\x90\x6F\x13\x84\x15\x9B\x85\x05\x87\xF5\x67\x7C\x9D\xC6\x67\x85\x9C\xF8\x97", "\x67\x3C\xF3\x72\x9D\xF4\x79\x9F\x9E\xE7\x95\x9B\xAC\x6A\x9B\x49\x11\x98\x98\xA0\x08\xA6\x9F\xDE\x71\x7D\x6F\x7A\x8D\x9D\x7B\x86\x01\xA1\x42\xF2\x6B\x9E\x2D\x46\xA5\x9D\x0A\xB9\xA3\x3F\xF7\x57\x10\xE6\x4C\xA2\x73\xFD\x8E\x9A\x46\x92\xA3\xA5\x69\xB7\x72\xA0\x2D\x6E\xA3\x46\xAB\xA4\xA4\xCC\x5F\xA3\x78\x21\xA4\x87\x44\x81\x68\x11\x96\xB0\x7C\x9A\xCC\x80\x86\x37\xA9\xA2\xA5\x8D\x89\x16\xA6\xDC\x75\xA1\x96\x17\xA6\x9F\x92\xB7\x5A\x11\x40\xA6\xA8\x41\xAF\x5B\xA9\x83\xBB\xA3\x9D\x4B\x6C\x11\x52\xF2\x6B\x11\xA9\xA8\xA1\x56\x4D\xB8\xA2\xD7\x7E\x94\xA5\x46\x16\xAD\x80\x2F\xAE\x79\x4C\xCE\xAC\xA4\xC9\x4E\x17\xAB\xF7\x42\xA8\x96\x44\xAF\xA1\xB2\x8A\xAA\x5B\x8F\x1D\x9A\x5A\xBE\x6A\xA4\xB4\x8F\x58\x12\x76\xB7\xA8\xAC\x59\xA5\xA9\xAD\xBD\xA1\xAF\xBF\x71\x13\xDA\x61\xA8\x7B\xA7\x85\xA4\xAB\x0E\x74\x10\xD5\x13\x15\x84\x49\x1E\xA0\xA7\x86\xAB\x66\x43\x96\x10\xB0\x14\x95\x12\xAE\x84\xB4\x9F\x58\x98\xAE\xAC\x72\x57\x14\x6A\x98\x18\xB0\x64\x8D\xAB\xB3\xA2\x9B\xA1\x13\x95\xAE\x7F\x5C\x92\xB5\xB5\x7F\x1A\x11\xB5\x95\xAB\xB6\x5F\x91", "\xBE\xA8\xB2\xA8\xAB\x13\xB1\xB9\xB0\x3F\xB4\xBA\xAA\xCE\xB0\xB6\x61\x9C\x05\x21\x27\x0F\xB7\xA5\x9C\x8B\x9C\xB7\x7D\xBB\x3A\x27\x3F\xBF\xAD\xD3\x72\xB2\x84\x75\xB3\xA6\xC3\x1F\x18\xAD\xE7\xAE\x59\xBA\xCD\xB9\xA0\x28\x39\xB3\xB4\x90\x88\xBF\xA1\xB6\xB6\x5D\x28\x4C\xBE\xAC\xEB\x8B\x75\xB5\x9D\xBD\x9A\x28\x22\xB5\xB9\xEF\xBA\xA3\xB6\xE1\xB7\x5F\x28\x64\xBC\xBC\x61\x7C\xA8\xBC\xD0\xBF\xAE\x74\xD9\xBB\xA2\xF3\xAF\xB9\xBF\x32\xBC\xBD\x52\xA4\x14\xB8\xFB\xBA\xA8\x68\xD8\xA9\xBD\x42\xA5\x15\xC1\xD4\x47\xC5\xB6\x00\xD1\xBE\x82\x80\x06\x14\xFA\x86\xBC\x56\xF7\xAC\xAF\x84\x9B\xC1\x65\x53\x1B\x6D\xBB\x30\xBF\xBB\x38\x9C\xC2\x20\x54\x0C\xBE\xBF\xC7\xB0\xBE\x6F\xBF\x79\x14\x0B\xDD\x78\xC5\xD6\x88\xBE\x8B\xEE\x7A\x15\x90\x6B\x12\x5B\x30\xC1\x9E\x88\x88\xB2\xC1\xD3\x6C\x11\xA9\x39\xDC\xA7\x8E\xFA\xBD\xC7\x22\xCF\x5D\x15\x0D\xC0\x59\x86\x89\xC3\x71\x57\x37\x66\x15\xDC\xAD\xBC\x69\xC3\xC1\xC0\x12\xC5\xC8\x16\xDA\x51\x16\x3E\xBA\xB6\xA2\x26\xFB\xBB\xA3\xB2\x09\xCB\x37\x8F\xCD\xB7\xEB\x84\xCE\xCA\xE5\x93\x16\x3C\xDC\xC3\xA8\x2F", "\xC6\xCC\xA4\xB4\x03\xB0\x88\xE2\xA4\xCA\x09\xDA\x5D\x16\x33\xC2\xCE\xAF\x4B\xC2\xC6\xEE\x76\x11\xCF\x0B\xB3\xCD\x61\xAA\xC6\xB5\xCA\xB7\x15\xBA\x6C\xCB\xAE\x9B\xCF\x58\x16\x40\xD9\xB8\x99\x2F\x99\x16\xA6\x3A\x14\xCC\x48\xE3\x53\x17\x95\xD6\xD1\x9F\x3D\x19\xD3\x3A\x7C\x15\xD3\x9A\xCC\x56\x2F\x20\xD1\xD4\x5F\x7F\x14\xD4\xC3\x80\x19\xA6\xAA\xDC\x98\x56\xD0\x5E\xD5\xB0\xC5\x21\xAC\x82\x23\xD6\x00\x35\xD7\xD6\xB2\xD9\xD4\xAD\xBA\xD6\xD6\x5E\xF8\xD3\xD7\xC0\xDD\xD5\xB0\xAE\xD6\x59\x06\xAE\xBD\xD4\x61\x41\x19\x41\x4A\xD2\x20\x66\xC0\x06\xD9\xD0\xCB\xDA\xB4\xCD\xD3\xDB\x67\xD5\xDE\xD9\xC3\x17\xDA\xB6\xD4\xDC\xDA\x6B\xDD\xD9\xDA\xDF\xDB\xDA\xB7\xE3\xD0\xDC\x00\x02\x1A\xDC\xE5\xC9\xDC\xBA\xEB\xD1\xDD\x76\xE4\xDC\xDD\xEF\xCE\xDE\xBA\xF2\xD2\xDD\xF0\x04\x1D\x20\xF7\xC2\x21\xBE\x80\x0B\xDF\x7E\xF8\xDF\xDF\x02\x26\x18\xC0\xFC\xD3\xE0\x7F\xFA\xDD\xE0\x08\xE7\xE2\xC2\x84\xEB\xE0\x83\xCC\xE7\xE1\x0E\xF1\xE1\x41\x45\x19\xE0\x88\xD5\xE2\xE2\x0D\xF7\xE2\xC6\x99\xEC\xE2\x8B\xDD\xE0\xE3\x1E\xE1\xE6\xC3\xAE\x5B\x84\x68\x6D\x87\xD8", "\xC8\xCF\x87\x31\x28\xD9\xE4\x28\x59\x8B\x8A\x30\xF7\x89\x73\x31\xEF\xE4\x99\xF4\xE4\x8A\x39\x89\x3B\xCD\xBB\xE6\xE7\x9E\xF5\xE7\xE7\x38\xFC\xE5\xCD\xE1\x38\x19\x82\x05\xEA\x20\x47\xE0\x01\xD2\xCB\xE6\xE9\xA6\xC8\xEE\xE9\x4A\xF0\xE8\xD3\xCF\xE4\xEB\xA8\xD5\xEB\xEA\x56\xF9\xE8\xD6\xDB\xE2\xEB\xAE\xD7\xEE\xEB\x5A\xE0\xEC\xD7\xDF\xE4\xED\xB0\xE5\xEB\xEC\x66\xE9\xEC\xDA\xEB\xE2\xEC\x96\xED\xE3\x58\x7D\x83\x92\xDC\xDD\x85\x8D\xB9\xC0\x96\xEE\x82\x91\xEE\xDE\xF7\xE5\x8E\xBE\xFE\xE9\xEF\x7F\xF8\xEE\xE0\xFB\xE0\xF1\xC2\xD0\x59\x19\x05\x28\xF2\x40\x0A\xF0\x00\xC6\xCE\xF1\xF1\x90\xEB\xF1\xE4\x8D\xF3\xF3\xC7\xD2\xF7\xF2\x94\xF8\xF2\xE5\x99\xFC\xF3\xCD\xDE\xF5\xF2\xA0\xFA\xF1\xE8\x9D\xF3\xF5\xCF\xE2\xF7\xF4\xA4\xE8\xF6\xE9\xA9\xFC\xF5\xD5\xEE\xF5\xF4\x6E\xEF\xED\xB1\x0A\x9C\x91\xED\x35\xF7\x3A\xB7\xF2\xF7\xAF\x36\x9C\xF7\x5C\xBD\xF1\x96\xA2\x98\x96\xF0\xB7\x94\xF9\xDF\xC5\xFE\xF7\xC8\xE3\xFA\xF1\xCB\xF9\xF9\xE3\xCA\xF9\x95\xE1\x2B\x19\x41\x52\xF2\x20\xEA\xC0\x06\xFA\xD8\xF3\xFA\xF6\xD5\xFB\xFB\xEB\xDD\xF9\xFB\xDC\xE1\xFC", "\x00\x4A\x1F\xFB\xF2\xC2\x24\x19\xE6\xFE\xFA\xF8\xE0\xFA\xFD\xF6\xEC\xFF\xFD\xE9\xF0\xFF\xFA\xF1\xF4\xFF\xF9\xF6\xFE\xFD\xF5\xF8\xFF\xFD\xF2\xFA\xFF\xF6\xFC\x79\xD3\x1A\x61\x30\xCD\x0E\x68\xFD\x59\x68\x74\x5D\x67\x6F\x6F\x65\x72\x62\x65\xDE\x54\x68\x6D\x51\x30\xCE\x04\x80\x0B\x86\x60\x17\x6A\x63\x0E\x81\x3B\xCF\x02\x81\xCE\x56\x80\xAC\x55\x67\x2B\x69\x80\x46\x50\x0D\xF5\x5E\x60\x15\x82\x64\x17\x81\x32\xD1\x0A\x81\x19\x51\x64\x50\x5E\x81\x85\x6A\x80\xBF\x32\x0D\x7A\x6C\x33\x00\x8B\x68\x49\x53\x0D\x51\x64\x81\x28\x76\x81\x11\x6F\x81\x68\x63\x38\xD4\x03\x83\x04\x35\x83\xAD\x55\x0D\x2A\x83\x61\x2C\x87\x58\x08\x8E\x3E\xD6\x07\x84\x37\x5C\x80\x21\x67\x82\x30\x86\x54\xD7\x0B\x66\x82\x6A\x59\x2E\x8F\x80\x02\x18\x0D\x4E\x81\x3C\x1C\x8E\x80\xFF\x5F\x82\x20\x8F\x83\x26\x5A\x83\x53\x6E\x80\xD9\x0D\x85\x45\x69\x84\x08\x68\x80\xDA\x0A\x86\x05\x87\x85\xBB\x5E\x80\xDB\x00\x87\x56\x80\x85\x74\x62\x85\xDD\x3C\x0D\x76\x80\x56\x72\x8D\x65\xAD\x5D\x0D\x7D\x8F\x68\x5F\x8D\x83\x66\x65\x65\x83\x3E\x0D\x68\x5F\x0D\x13\x84\x82\x3B\x86", "\x82\x86\x8A\x85\x63\x85\x42\xE0\x02\x84\xBB\x2C\x67\x59\x84\x86\x93\x8B\x81\x7F\x8D\x66\x4B\x83\x88\xE5\x4C\x86\x10\x67\x88\x76\x63\x85\xEE\x31\x0E\x96\x8A\x2B\x98\x8A\x87\x9A\x8E\x3E\xE2\x03\x82\x4A\x64\x84\x99\x8A\x86\xE3\x05\x10\xE4\x09\x8A\xB9\x2B\x8A\x91\x81\x3B\xE6\x0E\x62\xE5\x08\x8B\xB8\x2A\x8B\xA4\x8F\x81\xE7\x00\x8A\x5B\x6D\x89\x8A\x6F\x89\xA6\x87\x33\xE8\x07\x87\x66\x8D\x80\xBB\x89\x54\xE9\x0E\x62\xA2\x85\x66\xE7\x58\x88\xDE\x2A\x0E\xC6\x8E\x87\x78\x83\x68\x91\x8B\x0E\xDB\x86\x54\xD5\x89\x5C\xC3\x82\x86\xAD\x89\x83\x8E\x87\x86\xD1\x8B\x8C\xEC\x89\x56\x85\x85\x8E\xD7\x81\x1E\xEC\x01\x8E\xA1\x8F\x8E\xF1\x8B\x8E\x9B\x89\x8F\xAA\x56\x8F\x61\x87\x8F\xE6\x8D\x4D\xED\x04\x8D\xFC\x89\x62\xF8\x87\x8E\xED\x87\x5F\xA7\x22\x8C\xFE\x82\x89\xE4\x2E\x0E\xF4\x88\x63\x03\x91\x63\xB3\x87\x90\x37\x3F\x0E\xCE\x89\x8E\xD0\x80\x8F\xB1\x30\x0F\x0F\x96\x3B\xCF\x81\x85\x05\x9D\x91\x28\x43\x8E\xF8\x5A\x91\x21\x31\x0F\x22\x98\x90\xA3\x2A\x90\xFD\x86\x90\xFA\x8F\x61\xDD\x88\x85\xAC\x87\x33\xF2\x01\x8E\x24\x91\x80\x14\x92\x39", "\xF3\x07\x91\xB1\x85\x82\x2D\x83\x93\x39\x99\x51\xF4\x0D\x88\x3D\x9F\x88\x3F\x91\x92\xF6\x25\x0F\x29\x91\x7B\x97\x2C\x92\x04\x9F\x8F\x53\x86\x0F\x88\x68\x8C\x07\x83\x91\xDD\x37\x0F\x4B\x9E\x93\x7B\x52\x8B\x40\x99\x8F\xF8\x07\x62\x11\x9C\x83\x26\x9D\x8E\xF9\x08\x8E\x45\x9A\x8E\x63\x99\x8F\xFA\x02\x90\x54\x9D\x81\x5D\x9E\x92\xCF\x2B\x0F\x40\x61\x96\x90\x89\x96\x70\x93\x38\xFC\x04\x94\xBA\x79\x25\xFD\x0C\x94\x7B\x90\x4C\xFE\x0E\x97\x7F\x9A\x69\x82\x93\x98\xAC\x20\x00\x0A\x16\x98\x90\x61\x00\x89\x9A\x98\xC7\x22\x00\x8D\x9E\x98\xC5\x43\x00\x91\x97\x4C\xC4\x60\x26\x97\x93\x25\x99\x9F\x0F\xBF\x62\x6C\x9E\x9D\x99\xA0\x9E\x6B\xA2\x93\x6C\xA3\x9F\x99\xA5\x95\x6B\x59\x23\x6F\xF1\x6B\x9A\xAA\x9A\x9A\xD9\x64\x6F\xB0\x9C\x9A\xF0\x6D\x9A\xE2\x67\x6E\xB1\x94\x9B\xB7\x93\x9B\xBA\x99\x9B\xBC\x92\x9B\xBD\x91\x1E\x04\x0A\x10\xC1\x92\x10\xC3\x90\x00\xC5\x97\x9C\xC2\x99\x9C\xC4\x9A\x9C\xC6\x9C\x9C\xC8\x9B\x9C\xD0\x9D\x9C\xD1\x9F\x9C\xD2\x95\x9D\xD4\x97\x9D\xCE\x99\x9D\xD3\x9A\x9D\xD6\x9C\x9D\xD8\x9B\x9D\xE0\x9D\x9D\xE1\x9F\x9D\xE2", "\x95\x9E\xE4\x97\x9E\xDE\x95\x99\x92\x92\x4C\x20\x7D\x9E\x03\x72\x70\x1F\x7B\x71\x22\x72\x9F\xEE\x91\x9F\xF6\x9F\x70\x14\x77\x9F\xF5\x93\x9F\xFA\x94\x9F\xFE\x9D\x9F\x00\xAC\x9F\x0F\x71\x1E\x05\x0A\x10\x05\xA2\x10\x07\xA0\x00\x09\xAB\xA0\x06\xAD\xA0\x08\xAE\xA0\x0A\xA0\xA1\x0C\xAF\xA0\x14\xA1\xA1\x15\xA3\xA1\x16\xA9\xA1\x18\xAB\xA1\x12\xAD\xA1\x17\xAE\xA1\x1A\xA0\xA2\x1C\xAF\xA1\x24\xA1\xA2\x25\xA3\xA2\x26\xA9\xA2\x28\xAB\xA2\x22\xAA\x9E\xEB\x9F\xA2\x84\x26\x00\x2E\xA0\xA3\x5C\x20\x74\x42\x71\x74\x00\x0F\x43\x3E\x78\xA3\x36\xAB\xA3\x4D\x4A\x73\x3E\xA1\xA4\x3D\xA3\xA4\x3C\xA5\xA4\x37\xAD\x44\xE1\x14\x78\x83\x74\x1D\x81\x7A\xA4\x4E\xAD\xA4\x50\xA2\x10\x76\x4B\xA4\x86\x7F\xA4\x55\xA1\xA5\x54\xA9\xA5\x71\x71\x1E\x08\x0A\x10\x5D\xAB\x10\x5E\xA1\xA6\x60\xA3\xA6\x00\x0F\xA5\x65\xA2\xA6\x67\xA4\xA6\x66\xAB\xA6\x68\xA7\x00\x68\xAC\xA6\x64\xA9\x00\x6F\xA3\xA7\x6A\xA4\xA7\x69\xA7\xA7\x70\xA8\xA7\x76\xA9\xA7\x7C\xAB\xA7\x7E\xA5\xA7\x80\xAA\xA7\x81\xAD\xA7\x83\xAF\xA7\x77\xA1\x1E\xCC\x7F\x7C\x8A\xAE\x7C\xA1\x4D\x7C\x89\xAC", "\xA8\x8F\xA1\xA9\x8E\xA3\xA9\x8B\xA2\xA9\x95\xA0\x7D\x34\xA9\xA9\x82\x2E\x94\x12\x95\x8A\x2F\x9D\x8E\x37\x9E\x66\x0A\x0A\x10\x77\x9B\x5F\xA1\xAA\x8C\x9F\xA8\x42\x0B\x04\xAA\x3C\x93\x66\x5A\x9D\x86\x56\x95\xAA\xDD\x3C\x00\xAC\xA1\x54\x74\x97\x94\x76\x9E\x68\x0D\x05\xAB\x84\x8D\x96\x60\x8F\x94\x0C\x99\x95\x29\x47\xAB\x4A\x81\xAB\x37\x3E\x00\xBC\xA2\xAB\xFB\x8E\xAB\x91\x8D\x92\xC2\xA1\x3B\xA7\xA6\xAC\x41\x91\x3B\x0F\x09\xAC\xC7\x81\x93\x73\x88\x94\x55\x30\x01\xD6\xA3\xAD\x7A\x9B\x67\x5C\x9A\xAD\xE4\x21\x01\xDD\xA9\xAA\xE5\x54\xAC\xB0\xAF\x96\xCF\xA0\x91\xCC\xA0\x8F\xCE\xAB\x5F\x12\x05\xAE\x2E\x91\xAD\xEA\xA7\x42\x13\x02\xAF\x53\x98\xAD\x80\x82\xAD\x43\x28\xAF\xDE\xAE\x85\xED\xAB\x90\xEF\xA6\xAE\x83\x35\x01\xFE\xAF\x62\xE8\xA3\x8A\x0B\x9A\xAC\x83\x36\x01\x07\xBE\x52\x01\xBD\x8F\x03\xBE\x92\x17\x0F\xB0\xB0\x8E\xAA\x46\x95\xAC\x5D\x98\x01\x16\xBF\xAF\x2B\x89\xB0\xD6\x83\xB1\x83\x39\x01\x1D\xB4\xB0\x1E\x98\x91\x20\x99\xAB\x31\x25\xB2\x0C\xBC\x89\xFA\xAE\x89\xFC\xAD\xB2\xF9\x84\xAF\xE2\xAA\x82\x1B\x0C\xB2\xEC\xAF\xB2", "\xC9\x81\xB3\x54\x3C\x01\x38\xB0\xAA\x20\xB4\x8E\x0B\xBB\xAE\xDC\x8F\x91\x79\x85\xB3\x1E\xB8\x84\x41\xB5\x92\x43\xBF\x3B\x1D\x0F\xB3\x26\xBE\x8E\x11\xB0\xAC\x22\xB9\xB4\xDA\x2E\x01\x50\xB0\xB1\x3A\xB5\x95\xF5\xA1\xB5\x9A\x84\xB3\x2A\xBE\xB5\xF9\xA6\xB4\xDE\x81\xB6\x6E\x5F\x01\x59\xB4\x52\x60\xBD\xB4\xF7\x20\x02\x69\xB6\xB5\x81\x6B\xB5\x6E\x98\xB4\x62\xB6\xAA\x4B\xB8\x93\x75\xB8\x42\x21\x0F\xB6\x52\xB2\xB7\xBF\xAD\xA9\x3E\x84\xB4\x7D\xB4\xB6\x32\x94\xB7\x32\xBA\xB4\x53\xB0\xB8\x66\xB8\x56\x22\x0C\xB7\xCB\xAE\xB7\xCD\xA0\xAC\xB1\x33\x02\x8E\xBC\x96\x90\xBE\xAE\x92\xB1\x32\x24\x05\xB9\x1E\xBB\xB6\x55\xB9\xB7\xE4\x25\x02\x9C\xB3\xB8\x28\xB7\xB4\x8B\xBE\xB1\x26\x03\xBA\x2A\x92\x2A\x9C\xA2\x96\xC1\xA0\xB7\x6B\x87\xB7\x36\x80\xBB\xE7\xA9\xB8\xAE\xBF\xB9\x87\xBA\xB6\xB2\xB8\xAA\xB9\xB6\x2F\x27\x0C\xB7\x9E\xB9\xB9\x0E\x38\x02\xAA\xB0\x96\xB6\xB5\x97\x6C\xBD\xBB\x33\xBB\xBB\x3C\xB7\x42\x29\x05\xBC\x00\xBA\xA9\xB1\x2A\x02\x33\xA2\xBD\xC4\x2B\x02\xD5\xB6\xBD\xAE\x2C\x02\xD9\xBA\xBD\x9B\x2D\x02\xDD\xBE\xBD\x83\x9E\x02\xE1", "\xB2\xBE\xAC\x2F\x02\xE5\xB6\xBE\x80\x20\x03\xE9\xB5\x2B\xB8\x9E\x9B\xF0\xBE\x9A\xBB\x91\xBF\xF3\xBF\xBE\xE5\x66\x9B\xF4\xBD\x9B\xF6\xB5\xBF\xFC\xBA\xBF\xFD\xB3\x6E\xF6\x6F\x9F\x02\xA0\x9F\x02\xAB\x9F\x06\xC2\xC0\x07\xCD\x71\xF9\x95\xC0\x08\xCD\xC0\x01\xA9\xC0\x0C\xCF\xC0\x15\x76\x2B\x32\xAF\xAA\xD6\xB4\xA8\x82\xA9\xC1\x18\xCB\xC1\x76\xAE\xA6\x85\xA1\xA7\x86\xAC\xC1\x1F\xCA\xC1\x21\xC5\xC2\x23\xC2\xC2\x24\xC7\xC2\x26\xC9\xC2\x2C\xC8\xA8\x94\xA0\xA9\x2F\xC4\x49\xC1\x70\xC3\x97\xA5\xC3\x34\xC7\xC3\x96\xA8\xC3\x31\xCB\xC3\x36\xCE\xC2\x36\xC9\xC3\xC6\x73\xC3\x40\xCC\xC3\x3A\xCF\xC3\x44\xC3\xC4\x46\xC9\xC4\xBA\x45\x2B\xAD\xB8\xBC\xCA\xB1\x3B\x31\x00\xBC\xCC\xBD\xB5\x4F\xC1\x30\x32\x05\xB2\xC1\xBA\xB8\xAF\xB9\x51\x33\x00\xBD\x20\x89\xC5\xAE\xBE\x3E\x34\x0E\xC5\xF3\xA3\xC5\x86\xB2\xB8\x60\xCE\xC4\x82\xB4\x51\x66\xC7\xBA\xF9\x85\x03\x64\xC0\x93\x84\xB9\xAD\x6E\xC5\xC5\xB6\xA7\xBC\xB8\xA9\xBC\x24\x56\x03\x71\xCE\xB2\x73\xCB\xAF\x54\xC5\x10\x37\x0D\xC7\x51\xB9\xC6\x79\xCB\x51\x38\x04\xC8\x88\xB7\xB9\x02\xB2\xBC\xDD\x39", "\x03\x8A\xC3\xB6\xA5\xB5\xB6\x7A\xC9\x50\x3A\x01\xC9\x65\x83\xC9\x85\xB5\xC7\x01\x3B\x03\x98\xCF\xC5\x6D\xC5\xC9\xA0\xB4\x32\x52\xC8\xC7\x1A\xBA\xAD\x3D\x0F\xC9\xB2\xA6\xC8\xA7\xC0\x95\x28\x4E\x03\xAA\xCD\xAA\xE0\xA6\xC1\x21\xBE\xC8\x76\xC0\xCA\xA6\xC9\xAE\x67\xC9\x50\x3F\x01\xCB\x27\xB7\x96\x19\x92\xCA\xB7\xC5\xBB\x8C\xC2\xB1\xB6\xCB\xC6\x39\xBF\xC7\x30\xB1\xC8\xB4\xB0\x8C\xB7\x2D\xC4\x87\xC3\x38\x40\x0E\xCB\xBD\xA5\xCC\x54\xB7\xCC\x41\x91\x04\x9F\xCC\xCA\xBA\xCE\xCA\xE4\x22\x04\xD4\xCB\xC8\xCA\xCB\xB3\xCC\xC3\xCA\x27\x4C\xCD\x0A\xB3\xCC\xBA\xB9\xCB\x0A\xB8\xBB\x49\x53\x04\xE1\xC5\x98\x90\x20\xCD\xAD\xCB\xC5\xCA\xB4\x04\xA3\xB8\xCE\xD6\x8A\xCE\x09\x5A\xCF\x42\xBC\xCF\xB8\xC6\xCD\x5A\xCE\xCE\x1F\x31\xCF\xFD\xCA\xBE\x5B\x26\x04\xED\xB8\xD0\xAE\x27\x04\x0B\xDC\xD0\x9B\x28\x04\x0F\xD0\xD1\xB2\x29\x04\x13\xD4\xD1\xC8\x2A\x04\x17\xD8\xD1\x92\x9B\x04\x1B\xDC\xD1\x91\x2C\x04\x1F\xDE\x4B\xF4\xCD\xCD\xF6\xC8\xC6\xA1\xC4\xD0\xF7\x2D\x04\x06\xD1\xD0\xE3\xCC\xB5\x74\xBE\x04\x2D\xD6\x65\xFE\xCC\xB4\x4F\x03\xD3\x66\x98\xB1", "\x68\x92\xCC\x6A\x80\x05\x50\xB5\xD3\x23\x62\xAC\x51\x0C\xAB\x40\xDC\x63\x00\xD1\x87\x02\xD7\xBB\xD8\xC6\xCE\xCB\xBC\xCE\xB5\xCA\xC5\x47\xD7\xB1\xB3\xC9\xB1\x26\xDA\xD2\xB7\xC2\x05\xA5\xC9\xD4\xC8\xB6\xD5\x28\xDE\xD4\x42\xBC\xD5\xCD\xC1\xBD\x2F\xD3\xB7\x9C\xC1\xD6\xE2\x89\xD2\x4B\xD1\xD5\x62\xDA\xC9\x74\xCC\xD3\x66\xDF\x2C\x53\x0F\xD3\x68\xD0\xD5\xC8\xC1\xB7\x63\xDF\xB7\xAE\xB4\x05\x38\xD0\xB4\x5E\xDC\xB4\x60\xDC\xD4\xC4\xC7\xD7\x91\xB4\xD7\x6F\xD2\xD5\x34\x84\xCB\x5F\xD9\xD6\xDA\x25\x05\x7B\xD1\xBB\x7D\xD8\xB7\x6A\xD5\xCD\xD6\xB6\x05\x23\xD0\xD2\x8D\x47\x05\x95\xD6\xD9\xBF\x48\x05\x99\xDA\xD9\x9C\x29\x05\x9D\xDE\xD9\xA2\xD3\xDA\xE1\x1A\x05\xA1\xD4\xDA\x52\x2B\x05\xA7\xD8\xD0\x25\xD9\xCE\x75\xD3\xAC\x8F\xD3\xBB\xF7\x2C\x05\x8D\xD1\xD8\x6C\xD0\xC8\xDA\xAD\x05\xB5\xDB\xCE\x5A\xD9\xC7\x7F\xDE\x56\x5E\x0D\xD8\x45\xD7\x66\xAF\xD3\xDC\xD8\x80\xD8\xBC\xD2\xD8\x98\xB4\xD8\xDD\x3F\x05\xBB\xD7\xC7\xBD\xD5\xCF\x9F\xB0\x06\xCF\xDE\xD2\xB7\xDB\xCC\x74\xB1\x06\xD5\xD6\xDB\xA8\xD8\x25\x63\x05\xBE\x62\x0B\xDA\xDD\xD3\xDE\xE4", "\xDF\x24\x64\x02\xDE\xE5\xD5\x28\x65\x08\xDE\xE9\xD4\x25\x66\x0C\xDE\xED\xDE\x25\x67\x00\xDF\xE3\xDD\xDA\xFB\xCF\xDA\x5A\xBA\xDC\x8D\xCC\xDC\x72\x38\x06\xDB\xDE\xCC\xFF\x78\xD8\x7E\xDA\xD8\x85\xDB\xD6\xC0\xC9\xB2\x6E\xD8\xDC\xE7\xC3\xD7\x61\xC1\x32\x69\x0F\xDF\x06\xEA\xD3\xC1\xCF\xDB\xC2\xA0\xD2\x6A\x04\xDF\xF1\xD4\x2C\x6B\x08\xE1\x19\xEC\x06\x1C\xE9\xE1\x7B\x2D\x06\x1F\xE0\xE2\xBF\x2E\x06\x23\xE4\xE2\xDB\x1F\x06\x27\xEC\xD0\xF6\xDF\xCF\xF8\xD9\xCC\xD7\xD4\xCE\xBB\xCA\xE0\x92\xDE\xD9\x70\x0B\xE2\x28\xEA\x2B\x71\x08\xE3\x39\xE2\x28\x72\x0C\xE3\x3D\xED\x26\x73\x00\xE4\x1C\xD4\x07\x44\xE1\xE4\x6A\x25\x07\x47\xE8\xE4\x74\x26\x07\x4B\xEC\xE4\xAF\x27\x07\x4F\xE2\xBE\x78\x03\xE5\x50\xE3\x26\x79\x06\xE5\x57\xEB\xE5\x5C\xED\xE5\xDB\x1A\x07\x5A\xEE\xE5\x8B\x2B\x07\x61\xE2\xE6\x66\xE7\xE6\x7B\x9C\x07\x65\xE8\xE6\x6C\xEB\x27\x7D\x0B\xE6\x6D\xE0\x98\xEF\x01\x1E\xF4\x0B\x24\x3F\x08\x09\xC8\x0C\x0F\x4B\x21\x00\xC9\x00\x0F\x4A\x2F\x01\x40\x0E\x0F\xDB\x13\x00\x82\xEF\x07\xE4\x0F\x0B\xF0\x03\x00\x03\x00\x03\x2B\x00\x10\x06\x1F", "\xE8\x88\x98\x1F\x05\x1D\x1F\xC4\x90\x20\x05\x1E\x1E\x02\x10\x1F\x0A\x23\x11\x1A\x15\x1B\x02\x1B\x1F\x00\x02\x21\x02\x15\x21\x02\x14\x24\x47\x22\x1F\xF4\x15\x10\x0F\x22\x10\x3D\x21\x23\x05\x18\x22\x3A\x2D\x19\x02\x1C\x3E\x00\x04\xEB\xB6\xE2\xEB\xB5\xE8\xEB\xB7\xE3\xEB\xBA\xED\xEB\xBC\xEF\xEB\xB9\xE0\xEC\xB4\xE3\x3E\xC1\xE0\x00\x1D\x40\x00\x10\x48\xEC\xAF\x12\x10\xC9\xE6\x24\x00\x0E\x10\x02\x17\x1E\x00\x0D\x20\x00\x06\x20\x02\x1F\x1F\xC2\xEE\xEB\x00\x0E\x22\x00\x09\x29\x02\x15\x2F\xC5\xE7\x27\x02\x15\x2A\x02\x1F\x32\xD9\xE7\xEE\xC5\xEB\xEB\xE9\xEA\xED\xEA\xED\xEE\xEC\xEF\xEE\x02\x1F\x29\xE8\xEE\xEE\xF3\xE0\xEF\xEB\xE5\xEF\xE8\xE9\xEC\xFA\xEE\xE9\xCA\xE2\x10\xE1\x30\x00\xF9\x3D\xEF\x02\xF7\xEC\xFB\xEC\xEC\xA9\x16\xF0\x08\xF0\x00\x16\x40\x00\x13\x42\xF0\xC9\xE4\xEB\x13\x37\xEF\xC5\xEE\x21\x12\xF4\xEF\x12\xF8\x35\xF8\xE5\xF1\xB8\xE7\x13\x02\x1A\x13\x19\xF6\xF1\x16\xFD\x13\x02\x10\x14\xC0\xEC\x1E\xC5\xE3\x29\x19\xFA\x35\xC0\xE3\x1E\x20\xF6\xEF\x2D\xF9\xF0\x05\xFE\xF0\xFC\xE9\xEC\xFF\xE1\xF3\x1B\x42\xF3\x02\x17\xF3", "\x03\x48\xF3\x3C\xF8\x41\x00\x03\x22\x1F\xF3\x12\xC0\xE0\x3A\x1A\xF2\x10\xE2\x25\xF4\x48\xF6\xF1\x39\x22\xF1\xAA\x20\x00\x32\x38\xEE\x2C\x20\x00\xF2\x22\xF1\x2A\x24\xEB\x4C\x12\x10\x4F\x1E\x2D\x2F\xF0\x00\x10\x32\x10\x39\x32\x10\x67\x38\xEE\x79\x30\xEC\x31\xF5\xF6\x33\xF7\xF6\x02\x1B\xF3\x31\xFE\xF3\x5B\xF6\x39\x00\x00\x24\xC5\xE9\x1E\x41\xF3\xF7\xC5\xE4\x13\xC0\xE5\x36\x02\x12\x36\x02\x1C\x30\x48\xFD\x28\x02\x14\x33\xE8\xE5\x38\x02\x13\x34\x64\xF8\xF6\x3C\xF1\xF3\x20\x24\xF7\xB4\xEA\x21\x00\x08\x16\x02\x13\x32\xC0\xE0\x23\x00\x05\x37\x02\x11\x39\x00\x06\x33\xC0\xEB\x2F\xC5\xE4\x2D\x00\x06\x32\xC0\xE6\x3A\x00\x06\x3C\x87\xF1\x19\x30\xF0\x16\x19\xF9\x36\x02\x16\x34\x19\xF9\xEC\xB3\x33\xFA\x09\xF4\x39\xC5\xE7\x37\x02\x10\x32\xC0\xE3\x35\xA5\xF7\xFB\x3C\xF7\x23\x00\x03\x3A\xAE\xFD\xFB\x66\xF9\xF0\xC8\x3E\x3D\x86\xF4\x18\x02\x1D\x3B\x02\xFF\x3A\x02\xFE\x39\x00\x00", }; vl::glr::DecompressSerializedData(compressed, true, dataSolidRows, dataRows, dataBlock, dataRemain, outputStream); } }