735 lines
17 KiB
Plaintext
735 lines
17 KiB
Plaintext
///////////////////////////////////////////////////////
|
|
//
|
|
// SaherElm IT Center MQL5 Library
|
|
// -------------------------------------------------
|
|
// Name: XCXFIMAEALib ...
|
|
// Description: XFIMAEA Library ...
|
|
//
|
|
//
|
|
// Maintainer:
|
|
// ------------
|
|
// Hadi Khazaee Asl (hadi_khazaee_asl@yahoo.com)
|
|
//
|
|
//////////////////////////////////////////////////////
|
|
//
|
|
// Global Properties ...
|
|
#property library
|
|
#property copyright "Copyright 2023, SaherElm IT Center"
|
|
#property link "https://saherelm.ir"
|
|
#property version "1.00"
|
|
#property description "SaherElm XFIMAEA Library"
|
|
#property strict
|
|
|
|
//
|
|
// Imports ...
|
|
#include "../../Classes/x-saherelm.x-cobject.class.mq5"
|
|
#include "../../Helpers/x-saherelm.xfima.helper.mq5"
|
|
#include "../../Libraries/x-saherelm.x-pivot.analysis.lib.mq5"
|
|
|
|
//
|
|
// Definitions ...
|
|
|
|
/**
|
|
* Configure Market Structure Detection ...
|
|
**/
|
|
struct XFIMAPatternDetectorConfig
|
|
{
|
|
//
|
|
// Props ...
|
|
|
|
//
|
|
// Flags ...
|
|
|
|
//
|
|
bool detectSupport;
|
|
bool detectResistance;
|
|
|
|
//
|
|
bool detectSwingTrend;
|
|
|
|
//
|
|
bool detectOB;
|
|
bool detectFVG;
|
|
|
|
//
|
|
bool detectStarPattern;
|
|
bool detectFlagPattern;
|
|
bool detectRisingPattern;
|
|
bool detectPiercingPattern;
|
|
bool detectSignalKeyBarPattern;
|
|
|
|
//
|
|
bool detectPinned;
|
|
bool detectMomentum;
|
|
bool detectEngulfed;
|
|
bool detectTrueGaped;
|
|
|
|
//
|
|
bool analyseFIMAPVPivots;
|
|
bool analyseFIMASARPivots;
|
|
bool analyseFIMAZigZagPivots;
|
|
|
|
//
|
|
// Configs ...
|
|
|
|
//
|
|
// OB / FVG ...
|
|
int obLoopback;
|
|
int fvgLoopback;
|
|
|
|
//
|
|
// Trending ...
|
|
int trendingNumberOfSwings;
|
|
int trendingSwingShoulders;
|
|
|
|
//
|
|
int recentlyPatternsMaxLookupLength;
|
|
int recentlyPatternsMaxAllowedCollecting;
|
|
|
|
//
|
|
// Support and Resistance ...
|
|
int recentlyZonesMaxLookupLength;
|
|
int supportAndResistanceValidationLength;
|
|
int minAllowdSupportAndResistanceStrength;
|
|
int supportAndResistanceMaxAllowedLoopback;
|
|
int supportAndResistanceBreakeValidationLength;
|
|
|
|
//
|
|
// TrueGap ...
|
|
double truwGapApprovedPointMultiplier;
|
|
|
|
//
|
|
// Flag Pattern ...
|
|
int flagPatternMinimumPullbackBars;
|
|
|
|
//
|
|
// Momentum Bar ...
|
|
int momentumBarRangeLength;
|
|
double momentumBarApprovedMultiplier;
|
|
|
|
//
|
|
// Pinned Bar ...
|
|
double pinnedBaarShadowApprovedMultiplier;
|
|
double pinnedBarMinimumPinBarRangeMultiplier;
|
|
bool pinnedBarForceDirection;
|
|
|
|
//
|
|
// SignalKey Bar ...
|
|
double signalKeyBarShadowApprovedMultiplier;
|
|
double signalKeyBarMinimumPinBarRangeMultiplier;
|
|
bool signalKeyBarForceDirection;
|
|
|
|
//
|
|
// Analyser ...
|
|
int pvPivotsValidationLength;
|
|
int numberOfRequiredPivotsForAnalysis;
|
|
int maxAllowedLoopbackLengthForAnalysis;
|
|
|
|
//
|
|
// Constructor ...
|
|
XFIMAPatternDetectorConfig()
|
|
{
|
|
Clean();
|
|
}
|
|
|
|
//
|
|
// Tools ...
|
|
|
|
/**
|
|
* Cleanup Model ...
|
|
*/
|
|
void Clean()
|
|
{
|
|
//
|
|
detectOB = false;
|
|
detectFVG = false;
|
|
detectSupport = false;
|
|
detectResistance = false;
|
|
detectSwingTrend = false;
|
|
detectStarPattern = false;
|
|
detectFlagPattern = false;
|
|
detectRisingPattern = false;
|
|
detectPiercingPattern = false;
|
|
detectSignalKeyBarPattern = false;
|
|
detectPinned = false;
|
|
detectMomentum = false;
|
|
detectEngulfed = false;
|
|
detectTrueGaped = false;
|
|
analyseFIMAPVPivots = false;
|
|
analyseFIMASARPivots = false;
|
|
analyseFIMAZigZagPivots = false;
|
|
|
|
//
|
|
obLoopback = 0;
|
|
fvgLoopback = 0;
|
|
trendingNumberOfSwings = 0;
|
|
trendingSwingShoulders = 0;
|
|
recentlyZonesMaxLookupLength = 0;
|
|
recentlyPatternsMaxLookupLength = 0;
|
|
recentlyPatternsMaxAllowedCollecting = 0;
|
|
supportAndResistanceValidationLength = 0;
|
|
minAllowdSupportAndResistanceStrength = 0;
|
|
supportAndResistanceMaxAllowedLoopback = 0;
|
|
supportAndResistanceBreakeValidationLength = 0;
|
|
truwGapApprovedPointMultiplier = 0;
|
|
flagPatternMinimumPullbackBars = 0;
|
|
momentumBarRangeLength = 0;
|
|
momentumBarApprovedMultiplier = 0;
|
|
pinnedBaarShadowApprovedMultiplier = 0;
|
|
pinnedBarMinimumPinBarRangeMultiplier = 0;
|
|
pinnedBarForceDirection = false;
|
|
signalKeyBarShadowApprovedMultiplier = 0;
|
|
signalKeyBarMinimumPinBarRangeMultiplier = 0;
|
|
signalKeyBarForceDirection = false;
|
|
pvPivotsValidationLength = 0;
|
|
numberOfRequiredPivotsForAnalysis = 0;
|
|
maxAllowedLoopbackLengthForAnalysis = 0;
|
|
|
|
//
|
|
ZeroMemory(this);
|
|
}
|
|
|
|
/**
|
|
* Default Model ...
|
|
*/
|
|
void Default()
|
|
{
|
|
//
|
|
// OB / FVG ...
|
|
detectOB = false;
|
|
detectFVG = false;
|
|
|
|
//
|
|
// Support and Resistances ...
|
|
detectSupport = false;
|
|
detectResistance = false;
|
|
detectSwingTrend = false;
|
|
|
|
//
|
|
// Patterns ...
|
|
detectStarPattern = false;
|
|
detectFlagPattern = false;
|
|
detectRisingPattern = false;
|
|
detectPiercingPattern = false;
|
|
detectSignalKeyBarPattern = false;
|
|
|
|
//
|
|
// Bars ...
|
|
detectPinned = false;
|
|
detectMomentum = false;
|
|
detectEngulfed = false;
|
|
detectTrueGaped = false;
|
|
|
|
//
|
|
// Analysers ...
|
|
analyseFIMAPVPivots = false;
|
|
analyseFIMASARPivots = false;
|
|
analyseFIMAZigZagPivots = false;
|
|
|
|
//
|
|
// OB / FVg ...
|
|
obLoopback = 5;
|
|
fvgLoopback = 5;
|
|
|
|
//
|
|
// Trending ...
|
|
trendingNumberOfSwings = 3;
|
|
trendingSwingShoulders = 11;
|
|
|
|
//
|
|
// Support and Resistance ...
|
|
recentlyZonesMaxLookupLength = 100;
|
|
recentlyPatternsMaxLookupLength = 50;
|
|
recentlyPatternsMaxAllowedCollecting = 20;
|
|
supportAndResistanceValidationLength = 100;
|
|
minAllowdSupportAndResistanceStrength = 1;
|
|
supportAndResistanceMaxAllowedLoopback = 1500;
|
|
supportAndResistanceBreakeValidationLength = 4;
|
|
|
|
//
|
|
// TrueGap ...
|
|
truwGapApprovedPointMultiplier = 1;
|
|
|
|
//
|
|
// Flag Pattern ...
|
|
flagPatternMinimumPullbackBars = 3;
|
|
|
|
//
|
|
// Momentum Bar ...
|
|
momentumBarRangeLength = 3;
|
|
momentumBarApprovedMultiplier = 2;
|
|
|
|
//
|
|
// Pinned Bar ...
|
|
pinnedBaarShadowApprovedMultiplier = 3;
|
|
pinnedBarMinimumPinBarRangeMultiplier = 4;
|
|
pinnedBarForceDirection = false;
|
|
|
|
//
|
|
// SignalKey Bar ...
|
|
signalKeyBarShadowApprovedMultiplier = 3;
|
|
signalKeyBarMinimumPinBarRangeMultiplier = 4;
|
|
signalKeyBarForceDirection = false;
|
|
|
|
//
|
|
// Length ...
|
|
pvPivotsValidationLength = 10;
|
|
numberOfRequiredPivotsForAnalysis = 50;
|
|
maxAllowedLoopbackLengthForAnalysis = 1500;
|
|
}
|
|
|
|
/**
|
|
* Full Detection Model ...
|
|
*/
|
|
void FullDetect()
|
|
{
|
|
//
|
|
// OB / FVG ...
|
|
detectOB = true;
|
|
detectFVG = true;
|
|
|
|
//
|
|
// Support and Resistances ...
|
|
detectSupport = true;
|
|
detectResistance = true;
|
|
detectSwingTrend = true;
|
|
|
|
//
|
|
// Patterns ...
|
|
detectStarPattern = true;
|
|
detectFlagPattern = true;
|
|
detectRisingPattern = true;
|
|
detectPiercingPattern = true;
|
|
detectSignalKeyBarPattern = true;
|
|
|
|
//
|
|
// Bars ...
|
|
detectPinned = true;
|
|
detectMomentum = true;
|
|
detectEngulfed = true;
|
|
detectTrueGaped = true;
|
|
|
|
//
|
|
// Analysers ...
|
|
analyseFIMAPVPivots = true;
|
|
analyseFIMASARPivots = true;
|
|
analyseFIMAZigZagPivots = true;
|
|
}
|
|
|
|
/**
|
|
* Default Config, by turn off all detecting flags ...
|
|
*/
|
|
void OffDetectors()
|
|
{
|
|
//
|
|
// OB / FVG ...
|
|
detectOB = false;
|
|
detectFVG = false;
|
|
|
|
//
|
|
// Support and Resistances ...
|
|
detectSupport = false;
|
|
detectResistance = false;
|
|
detectSwingTrend = false;
|
|
|
|
//
|
|
// Patterns ...
|
|
detectStarPattern = false;
|
|
detectFlagPattern = false;
|
|
detectRisingPattern = false;
|
|
detectPiercingPattern = false;
|
|
detectSignalKeyBarPattern = false;
|
|
|
|
//
|
|
// Bars ...
|
|
detectPinned = false;
|
|
detectMomentum = false;
|
|
detectEngulfed = false;
|
|
detectTrueGaped = false;
|
|
|
|
//
|
|
// Analysers ...
|
|
analyseFIMAPVPivots = false;
|
|
analyseFIMASARPivots = false;
|
|
analyseFIMAZigZagPivots = false;
|
|
}
|
|
|
|
//
|
|
};
|
|
|
|
/**
|
|
* XFIMA Base Market Structure ...
|
|
* AnalyseMarket result ...
|
|
**/
|
|
struct XFIMAMarketStructure
|
|
{
|
|
//
|
|
XOHCL bar;
|
|
|
|
//
|
|
XBoxZone ob;
|
|
XBoxZone fvg;
|
|
XBoxZone support;
|
|
XBoxZone resistance;
|
|
|
|
//
|
|
XBoxZone obs[];
|
|
XBoxZone fvgs[];
|
|
XBoxZone supports[];
|
|
XBoxZone resistances[];
|
|
|
|
//
|
|
XPivot pinBars[];
|
|
XPivot engulfBars[];
|
|
XPivot trueGapBars[];
|
|
XPivot momentumBars[];
|
|
|
|
//
|
|
XBoxZone flagPatterns[];
|
|
XBoxZone starPatterns[];
|
|
XBoxZone risingPatterns[];
|
|
XBoxZone piercingPatterns[];
|
|
XBoxZone signalKeyBarPatterns[];
|
|
|
|
//
|
|
// Previous Support or Resistance based on current ...
|
|
//
|
|
// Current Support is Touched => Prev Support;
|
|
// Current Resistance is Touched => Prev Resistance;
|
|
XBoxZone fakeBreakedZone;
|
|
|
|
//
|
|
XBoxZone recentlyTestedZones[];
|
|
XBoxZone recentlyBreakedZones[];
|
|
|
|
//
|
|
// Analysis ...
|
|
XPivotAnalysis pvAnalysis;
|
|
XPivotAnalysis sarAnalysis;
|
|
XPivotAnalysis zigzagAnalysis;
|
|
|
|
//
|
|
ENUM_X_DIRECTION pinnedDir;
|
|
ENUM_X_DIRECTION momentumDir;
|
|
ENUM_X_DIRECTION engulfedDir;
|
|
ENUM_X_DIRECTION trueGapedDir;
|
|
|
|
//
|
|
XOHCL flagSwing;
|
|
ENUM_X_DIRECTION flagPatternDir;
|
|
|
|
//
|
|
XOHCL trendSwings[];
|
|
ENUM_X_DIRECTION trendDir;
|
|
|
|
//
|
|
ENUM_X_DIRECTION starPatternDir;
|
|
ENUM_X_DIRECTION risingPatternDir;
|
|
ENUM_X_DIRECTION piercingPatternDir;
|
|
ENUM_X_DIRECTION signalKeyBarPatternDir;
|
|
|
|
//
|
|
// Constructor ...
|
|
XFIMAMarketStructure()
|
|
{
|
|
Clean();
|
|
}
|
|
|
|
//
|
|
// Tools ...
|
|
|
|
/**
|
|
* Cleanup Model ...
|
|
*/
|
|
void Clean()
|
|
{
|
|
//
|
|
ob.Clean();
|
|
fvg.Clean();
|
|
support.Clean();
|
|
resistance.Clean();
|
|
|
|
//
|
|
fakeBreakedZone.Clean();
|
|
|
|
//
|
|
bar.Clean();
|
|
flagSwing.Clean();
|
|
|
|
//
|
|
pvAnalysis.Clean();
|
|
sarAnalysis.Clean();
|
|
zigzagAnalysis.Clean();
|
|
|
|
//
|
|
trendDir = X_DIRECTION_NONE;
|
|
pinnedDir = X_DIRECTION_NONE;
|
|
momentumDir = X_DIRECTION_NONE;
|
|
engulfedDir = X_DIRECTION_NONE;
|
|
trueGapedDir = X_DIRECTION_NONE;
|
|
flagPatternDir = X_DIRECTION_NONE;
|
|
starPatternDir = X_DIRECTION_NONE;
|
|
risingPatternDir = X_DIRECTION_NONE;
|
|
piercingPatternDir = X_DIRECTION_NONE;
|
|
signalKeyBarPatternDir = X_DIRECTION_NONE;
|
|
|
|
//
|
|
SpecifiedClean(obs);
|
|
SpecifiedClean(fvgs);
|
|
SpecifiedClean(pinBars);
|
|
SpecifiedClean(supports);
|
|
SpecifiedClean(engulfBars);
|
|
SpecifiedClean(resistances);
|
|
SpecifiedClean(trueGapBars);
|
|
SpecifiedClean(momentumBars);
|
|
SpecifiedClean(flagPatterns);
|
|
SpecifiedClean(starPatterns);
|
|
SpecifiedClean(risingPatterns);
|
|
SpecifiedClean(piercingPatterns);
|
|
SpecifiedClean(signalKeyBarPatterns);
|
|
|
|
//
|
|
SpecifiedClean(trendSwings);
|
|
SpecifiedClean(recentlyTestedZones);
|
|
SpecifiedClean(recentlyBreakedZones);
|
|
|
|
//
|
|
ZeroMemory(this);
|
|
}
|
|
|
|
//
|
|
// Checker Functions ...
|
|
|
|
//
|
|
};
|
|
|
|
/**
|
|
* Configure Market Structure Drawer ...
|
|
**/
|
|
struct XFIMAMarketStructureDrawerConfig
|
|
{
|
|
//
|
|
// Props ...
|
|
|
|
//
|
|
bool drawOB; // Current Order Block ...
|
|
bool drawFVG; // Current Fair Value Gap ...
|
|
|
|
//
|
|
bool drawSupport; // Detected Supports ...
|
|
bool drawResistance; // Detected Resistances ...
|
|
|
|
//
|
|
bool drawSwingTrend; // Swing Trend ...
|
|
bool swingTrendRayLeft; // Ray Left Swing Trend ...
|
|
bool swingTrendRayRight; // Ray Right Swing Trend ...
|
|
|
|
//
|
|
// Draw Current Detected Patterns ...
|
|
|
|
//
|
|
bool drawPinned;
|
|
bool drawMomentum;
|
|
bool drawEngulfed;
|
|
bool drawTrueGaped;
|
|
|
|
//
|
|
bool drawStarPattern;
|
|
bool drawFlagPattern;
|
|
bool drawRisingPattern;
|
|
bool drawPiercingPattern;
|
|
bool drawSignalKeyBarPattern;
|
|
|
|
//
|
|
// Draw Recently Zones ...
|
|
bool drawRecentPatterns;
|
|
bool drawFakeBreakedZone;
|
|
bool drawRecentlyTestedZones;
|
|
bool drawRecentlyBreakedZones;
|
|
|
|
//
|
|
// Draw Analysis Pivots ...
|
|
|
|
//
|
|
// XPV ...
|
|
bool drawFIMAPVPivotsAnalysis;
|
|
bool drawFIMAPVPivotsAnalysisZones;
|
|
bool drawFIMAPVPivotsAnalysisTrends;
|
|
bool drawFIMAPVPivotsAnalysisPivots;
|
|
|
|
//
|
|
// XSAR ...
|
|
bool drawFIMASARPivotsAnalysis;
|
|
bool drawFIMASARPivotsAnalysisZones;
|
|
bool drawFIMASARPivotsAnalysisTrends;
|
|
bool drawFIMASARPivotsAnalysisPivots;
|
|
|
|
//
|
|
// XZIGZAG ...
|
|
bool drawFIMAZigZagPivotsAnalysis;
|
|
bool drawFIMAZigZagPivotsAnalysisZones;
|
|
bool drawFIMAZigZagPivotsAnalysisTrends;
|
|
bool drawFIMAZigZagPivotsAnalysisPivots;
|
|
|
|
//
|
|
// Constructor ...
|
|
XFIMAMarketStructureDrawerConfig()
|
|
{
|
|
Clean();
|
|
}
|
|
|
|
//
|
|
// Tools ...
|
|
|
|
/**
|
|
* Cleanup Model ...
|
|
*/
|
|
void Clean()
|
|
{
|
|
//
|
|
drawOB = false;
|
|
drawFVG = false;
|
|
drawPinned = false;
|
|
drawMomentum = false;
|
|
drawSupport = false;
|
|
drawEngulfed = false;
|
|
drawTrueGaped = false;
|
|
drawResistance = false;
|
|
drawSwingTrend = false;
|
|
drawStarPattern = false;
|
|
drawFlagPattern = false;
|
|
swingTrendRayLeft = false;
|
|
drawRisingPattern = false;
|
|
swingTrendRayRight = false;
|
|
drawPiercingPattern = false;
|
|
drawSignalKeyBarPattern = false;
|
|
|
|
//
|
|
drawRecentPatterns = false;
|
|
drawFakeBreakedZone = false;
|
|
drawRecentlyTestedZones = false;
|
|
drawRecentlyBreakedZones = false;
|
|
|
|
//
|
|
drawFIMAPVPivotsAnalysis = false;
|
|
drawFIMAPVPivotsAnalysisZones = false;
|
|
drawFIMAPVPivotsAnalysisTrends = false;
|
|
drawFIMAPVPivotsAnalysisPivots = false;
|
|
|
|
//
|
|
drawFIMASARPivotsAnalysis = false;
|
|
drawFIMASARPivotsAnalysisZones = false;
|
|
drawFIMASARPivotsAnalysisTrends = false;
|
|
drawFIMASARPivotsAnalysisPivots = false;
|
|
|
|
//
|
|
drawFIMAZigZagPivotsAnalysis = false;
|
|
drawFIMAZigZagPivotsAnalysisZones = false;
|
|
drawFIMAZigZagPivotsAnalysisTrends = false;
|
|
drawFIMAZigZagPivotsAnalysisPivots = false;
|
|
|
|
//
|
|
ZeroMemory(this);
|
|
}
|
|
|
|
/**
|
|
* Default Model ...
|
|
*/
|
|
void Default()
|
|
{
|
|
drawOB = true;
|
|
drawFVG = true;
|
|
drawPinned = true;
|
|
drawMomentum = true;
|
|
drawSupport = true;
|
|
drawEngulfed = true;
|
|
drawTrueGaped = true;
|
|
drawResistance = true;
|
|
drawSwingTrend = true;
|
|
drawStarPattern = true;
|
|
drawFlagPattern = true;
|
|
drawRisingPattern = true;
|
|
drawPiercingPattern = true;
|
|
swingTrendRayLeft = false;
|
|
swingTrendRayRight = true;
|
|
drawSignalKeyBarPattern = true;
|
|
|
|
//
|
|
drawRecentPatterns = true;
|
|
drawFakeBreakedZone = true;
|
|
drawRecentlyTestedZones = true;
|
|
drawRecentlyBreakedZones = true;
|
|
|
|
//
|
|
drawFIMAPVPivotsAnalysis = true;
|
|
drawFIMAPVPivotsAnalysisZones = true;
|
|
drawFIMAPVPivotsAnalysisTrends = true;
|
|
drawFIMAPVPivotsAnalysisPivots = true;
|
|
|
|
//
|
|
drawFIMASARPivotsAnalysis = true;
|
|
drawFIMASARPivotsAnalysisZones = true;
|
|
drawFIMASARPivotsAnalysisTrends = true;
|
|
drawFIMASARPivotsAnalysisPivots = true;
|
|
|
|
//
|
|
drawFIMAZigZagPivotsAnalysis = true;
|
|
drawFIMAZigZagPivotsAnalysisZones = true;
|
|
drawFIMAZigZagPivotsAnalysisTrends = true;
|
|
drawFIMAZigZagPivotsAnalysisPivots = true;
|
|
}
|
|
|
|
/**
|
|
* Configure for Full Drawing ...
|
|
*/
|
|
void FullDraw()
|
|
{
|
|
//
|
|
Default();
|
|
|
|
//
|
|
drawOB = true;
|
|
drawFVG = true;
|
|
drawPinned = true;
|
|
drawMomentum = true;
|
|
drawSupport = true;
|
|
drawEngulfed = true;
|
|
drawTrueGaped = true;
|
|
drawResistance = true;
|
|
drawSwingTrend = true;
|
|
drawStarPattern = true;
|
|
drawFlagPattern = true;
|
|
drawRisingPattern = true;
|
|
swingTrendRayLeft = true;
|
|
swingTrendRayRight = true;
|
|
drawPiercingPattern = true;
|
|
drawSignalKeyBarPattern = true;
|
|
|
|
//
|
|
drawRecentPatterns = true;
|
|
drawFakeBreakedZone = true;
|
|
drawRecentlyTestedZones = true;
|
|
drawRecentlyBreakedZones = true;
|
|
|
|
//
|
|
drawFIMAPVPivotsAnalysis = true;
|
|
drawFIMAPVPivotsAnalysisZones = true;
|
|
drawFIMAPVPivotsAnalysisTrends = true;
|
|
drawFIMAPVPivotsAnalysisPivots = true;
|
|
|
|
//
|
|
drawFIMASARPivotsAnalysis = true;
|
|
drawFIMASARPivotsAnalysisZones = true;
|
|
drawFIMASARPivotsAnalysisTrends = true;
|
|
drawFIMASARPivotsAnalysisPivots = true;
|
|
|
|
//
|
|
drawFIMAZigZagPivotsAnalysis = true;
|
|
drawFIMAZigZagPivotsAnalysisZones = true;
|
|
drawFIMAZigZagPivotsAnalysisTrends = true;
|
|
drawFIMAZigZagPivotsAnalysisPivots = true;
|
|
}
|
|
|
|
//
|
|
};
|